def least_squares_multipliers(self, x):
"""Compute least-squares multipliers estimates."""
al_model = self.model
slack_model = self.model.model
m = slack_model.m
n = slack_model.n
lim = max(2 * m, 2 * n)
J = slack_model.jop(x)
# Determine which bounds are active to remove appropriate columns of J
on_bound = self.get_active_bounds(x,
slack_model.Lvar,
slack_model.Uvar)
free_vars = np.setdiff1d(np.arange(n, dtype=np.int), on_bound)
Jred = ReducedJacobian(J, np.arange(m, dtype=np.int),
free_vars)
g = slack_model.grad(x) - J.T * al_model.pi
lsqr = LSQRSolver(Jred.T)
lsqr.solve(g[free_vars], itnlim=lim)
if lsqr.optimal:
al_model.pi += lsqr.x.copy()
else:
self.log.debug("lsqr failed to converge")
return
评论列表
文章目录