Implementation of the HessianUpdater for limit-memory quasi-Newton approximation of the Lagrangian Hessian. More...
#include <IpLimMemQuasiNewtonUpdater.hpp>
Static Public Member Functions | |
static void | RegisterOptions (SmartPtr< RegisteredOptions > roptions) |
Methods for OptionsList. | |
Private Member Functions | |
Default Compiler Generated Methods | |
(Hidden to avoid implicit creation/calling). These methods are not implemented and we do not want the compiler to implement them for us, so we declare them private and do not define them. This ensures that they will not be implicitly created/called. | |
LimMemQuasiNewtonUpdater (const LimMemQuasiNewtonUpdater &) | |
Copy Constructor. | |
void | operator= (const LimMemQuasiNewtonUpdater &) |
Default Assignment Operator. | |
Auxiliary function | |
bool | CheckSkippingBFGS (const Vector &s_new, const Vector &y_new) |
Method deciding whether the BFGS update should be skipped. | |
bool | UpdateInternalData (const Vector &s_new, const Vector &y_new, SmartPtr< Vector > ypart_new) |
Update the internal data, such as the S, Y, L, D etc matrices and vectors that are required for computing the compact representation. | |
void | AugmentMultiVector (SmartPtr< MultiVectorMatrix > &V, const Vector &v_new) |
Given a MutliVector V, create a new MultiVectorSpace with one more column, and return V as a member of that space, consisting of all previous vectors, and in addition v_new in the last column. | |
void | AugmentDenseVector (SmartPtr< DenseVector > &V, Number v_new) |
Given a DenseVector V, create a new DenseVectorSpace with one more row, and return V as a member of that space, consisting of all previous elements, and in addition v_new in the last row. | |
void | AugmentLMatrix (SmartPtr< DenseGenMatrix > &V, const MultiVectorMatrix &S, const MultiVectorMatrix &Y) |
Given a strictly-lower triangular square DenseGenMatrix V, create a new DenseGenMatrixSpace with one more dimension, and return V as a member of that space, consisting of all previous elements, and in addition elements s_i^Ty_j for (i<j), where s and y are the vectors in the MultiVectors S and Y. | |
void | AugmentSdotSMatrix (SmartPtr< DenseSymMatrix > &V, const MultiVectorMatrix &S) |
Given a DenseSymMatrix V, create a new DenseGenMatrixSpace with one more dimension, and return V as a member of that space, consisting of all previous elements, and in addition elements s_i^Ts_j for the new entries, where s are the vectors in the MultiVector S. | |
void | AugmentSTDRSMatrix (SmartPtr< DenseSymMatrix > &V, const MultiVectorMatrix &S, const MultiVectorMatrix &DRS) |
Given a DenseSymMatrix V, create a new DenseGenMatrixSpace with one more dimension, and return V as a member of that space, consisting of all previous elements, and in addition elements s_i^TDRs_j for the new entries, where s are the vectors in the MultiVector S, and DRs are the vectors in DRS. | |
void | ShiftMultiVector (SmartPtr< MultiVectorMatrix > &V, const Vector &v_new) |
Given a MutliVector V, get rid of the first column, shift all other columns to the left, and make v_new the last column. | |
void | ShiftDenseVector (SmartPtr< DenseVector > &V, Number v_new) |
Given a DenseVector V, get rid of the first element, shift all other elements one position to the top, and make v_new the last entry. | |
void | ShiftLMatrix (SmartPtr< DenseGenMatrix > &V, const MultiVectorMatrix &S, const MultiVectorMatrix &Y) |
Given a strictly-lower triangular square DenseGenMatrix V, shift everything one row and column up, and fill the new strictly lower triangular entries as s_i^Ty_j for (i<j), where s and y are the vectors in the MultiVectors S and Y. | |
void | ShiftSdotSMatrix (SmartPtr< DenseSymMatrix > &V, const MultiVectorMatrix &S) |
Given a DenseSymMatrix V, shift everything up one row and column, and fill the new entries as s_i^Ts_j, where s are the vectors in the MultiVector S. | |
void | ShiftSTDRSMatrix (SmartPtr< DenseSymMatrix > &V, const MultiVectorMatrix &S, const MultiVectorMatrix &DRS) |
Given a DenseSymMatrix V, shift everything up one row and column, and fill the new entries as s_i^TDRs_j, where s are the vectors in the MultiVector S, and DRs are the vectors in DRS. | |
void | RecalcY (Number eta, const Vector &DR_x, MultiVectorMatrix &S, MultiVectorMatrix &Ypart, SmartPtr< MultiVectorMatrix > &Y) |
Method for recomputing Y from scratch, using Ypart (only for restoration phase) | |
void | RecalcD (const MultiVectorMatrix &S, const MultiVectorMatrix &Y, SmartPtr< DenseVector > &D) |
Method for recomputing D from S and Y. | |
void | RecalcL (const MultiVectorMatrix &S, const MultiVectorMatrix &Y, SmartPtr< DenseGenMatrix > &L) |
Method for recomputing L from S and Y. | |
bool | SplitEigenvalues (DenseGenMatrix &Q, const DenseVector &E, SmartPtr< DenseGenMatrix > &Qminus, SmartPtr< DenseGenMatrix > &Qplus) |
Split the eigenvectors into negative and positive ones. | |
void | StoreInternalDataBackup () |
Store a copy of the pointers to the internal data (S, Y, D, L, SdotS, curr_lm_memory). | |
void | RestoreInternalDataBackup () |
Restore the copy of the pointers to the internal data most recently stored with StoreInternalDataBackup(). | |
void | SetW () |
Release anything that we allocated for StoreInternalDataBackup and is no longer needed. | |
Private Attributes | |
SmartPtr< const LowRankUpdateSymMatrixSpace > | h_space_ |
Matrix space for the low-rank Hessian approximation. | |
const bool | update_for_resto_ |
Flag indicating if the update is to be done for the original NLP or for the restoration phase NLP. | |
Number | last_eta_ |
Most recent value for eta in the restoration phase objective function (only for update_for_resto_ = true) | |
SmartPtr< const Vector > | curr_DR_x_ |
Current DR_x scaling factors in the restoration phase objective function (only for update_for_resto_ = true). | |
TaggedObject::Tag | curr_DR_x_tag_ |
Tag for curr_DR_x_. | |
SmartPtr< const Vector > | curr_red_DR_x_ |
Current DR_x scaling factors in the restoration phase objective function in the smaller space for the approximation. | |
Number | curr_eta_ |
Current value of weighing factor eta in the restoration phase objective function (only for update_for_resto_ = true) | |
Index | lm_skipped_iter_ |
Counter for successive iterations in which the update was skipped. | |
Information for the limited memory update | |
Index | curr_lm_memory_ |
current size of limited memory | |
SmartPtr< MultiVectorMatrix > | S_ |
s pairs for the recent iterations | |
SmartPtr< MultiVectorMatrix > | Y_ |
y pairs for the recent iterations. | |
SmartPtr< MultiVectorMatrix > | Ypart_ |
For restoration phase update: Y without the quadratic objective function part. | |
SmartPtr< DenseVector > | D_ |
Diagonal elements D_k for compact formulation from last update. | |
SmartPtr< DenseGenMatrix > | L_ |
Matrix L_k for compact formulation from last update. | |
SmartPtr< Vector > | B0_ |
First term (starting matrix) for the approximation. | |
Number | sigma_ |
First term (starting matrix) for the approximation. | |
SmartPtr< MultiVectorMatrix > | V_ |
V in LowRankUpdateMatrix from last update. | |
SmartPtr< MultiVectorMatrix > | U_ |
U in LowRankUpdateMatrix from last update. | |
SmartPtr< DenseSymMatrix > | SdotS_ |
For efficient implementation, we store the pairwise products for s's. | |
bool | SdotS_uptodate_ |
Flag indicating whether SdotS_ is update to date from most recent update. | |
SmartPtr< MultiVectorMatrix > | DRS_ |
DR * S (only for restoration phase) | |
SmartPtr< DenseSymMatrix > | STDRS_ |
For efficient implementation, we store the S^T S DR * S. | |
SmartPtr< const Vector > | last_x_ |
Primal variables x from most recent update. | |
SmartPtr< const Vector > | last_grad_f_ |
Gradient of objective function w.r.t. | |
SmartPtr< const Matrix > | last_jac_c_ |
Jacobian for equality constraints w.r.t x at x_last. | |
SmartPtr< const Matrix > | last_jac_d_ |
Jacobian for inequality constraints w.r.t x at x_last. | |
Index | curr_lm_memory_old_ |
current size of limited memory | |
SmartPtr< MultiVectorMatrix > | S_old_ |
s pairs for the recent iterations (backup) | |
SmartPtr< MultiVectorMatrix > | Y_old_ |
y pairs for the recent iterations. | |
SmartPtr< MultiVectorMatrix > | Ypart_old_ |
For restoration phase update: Y without the quadratic objective function part (backup) | |
SmartPtr< DenseVector > | D_old_ |
Diagonal elements D_k for compact formulation from last update (backup). | |
SmartPtr< DenseGenMatrix > | L_old_ |
Matrix L_k for compact formulation from last update (backup). | |
SmartPtr< Vector > | B0_old_ |
First term (starting matrix) for the approximation (backup). | |
Number | sigma_old_ |
First term (starting matrix) for the approximation. | |
SmartPtr< MultiVectorMatrix > | V_old_ |
V in LowRankUpdateMatrix from last update (backup) | |
SmartPtr< MultiVectorMatrix > | U_old_ |
U in LowRankUpdateMatrix from last update (backup) | |
SmartPtr< DenseSymMatrix > | SdotS_old_ |
For efficient implementation, we store the pairwise products for s's (backup). | |
bool | SdotS_uptodate_old_ |
Flag indicating whether SdotS_ is update to date from most recent update (backup). | |
SmartPtr< MultiVectorMatrix > | DRS_old_ |
DR * S (only for restoration phase) (backup) | |
SmartPtr< DenseSymMatrix > | STDRS_old_ |
For efficient implementation, we store the S^T S DR * S. | |
Algorithmic parameters | |
enum | LMUpdateType { BFGS = 0 , SR1 } |
enumeration for the Hessian update type. More... | |
enum | LMInitialization { SCALAR1 = 0 , SCALAR2 , SCALAR3 , SCALAR4 , CONSTANT } |
enumeration for the Hessian initialization. More... | |
Index | limited_memory_max_history_ |
Size of memory for limited memory update. | |
LMUpdateType | limited_memory_update_type_ |
Type of Hessian update. | |
LMInitialization | limited_memory_initialization_ |
How to choose B0 in the low-rank update. | |
Number | limited_memory_init_val_ |
Value of B0 (as this multiple of the identity in certain situations). | |
Index | limited_memory_max_skipping_ |
Number of successive iterations of skipped updates after which the approximation is reset. | |
Number | sigma_safe_min_ |
Minimal safeguard value for sigma. | |
Number | sigma_safe_max_ |
Maximal safeguard value for sigma. | |
bool | limited_memory_special_for_resto_ |
Flag indicating if Hessian approximation should be done in a special manner for the restoration phase. | |
Additional Inherited Members | |
Protected Member Functions inherited from Ipopt::AlgorithmStrategyObject | |
const Journalist & | Jnlst () const |
IpoptNLP & | IpNLP () const |
IpoptData & | IpData () const |
IpoptCalculatedQuantities & | IpCq () const |
bool | HaveIpData () const |
Implementation of the HessianUpdater for limit-memory quasi-Newton approximation of the Lagrangian Hessian.
Definition at line 23 of file IpLimMemQuasiNewtonUpdater.hpp.
enumeration for the Hessian update type.
Enumerator | |
---|---|
BFGS | |
SR1 |
Definition at line 84 of file IpLimMemQuasiNewtonUpdater.hpp.
enumeration for the Hessian initialization.
Enumerator | |
---|---|
SCALAR1 | |
SCALAR2 | |
SCALAR3 | |
SCALAR4 | |
CONSTANT |
Definition at line 94 of file IpLimMemQuasiNewtonUpdater.hpp.
Ipopt::LimMemQuasiNewtonUpdater::LimMemQuasiNewtonUpdater | ( | bool | update_for_resto | ) |
Default Constructor.
|
inlinevirtual |
Destructor.
Definition at line 34 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
Copy Constructor.
|
virtual |
overloaded from AlgorithmStrategyObject
Implements Ipopt::HessianUpdater.
Update the Hessian based on the current information in IpData.
Implements Ipopt::HessianUpdater.
|
static |
Methods for OptionsList.
|
private |
Default Assignment Operator.
|
private |
Method deciding whether the BFGS update should be skipped.
If Powell-damping is performed, the Vectors s_new and y_new might be adapted.
|
private |
Update the internal data, such as the S, Y, L, D etc matrices and vectors that are required for computing the compact representation.
|
private |
Given a MutliVector V, create a new MultiVectorSpace with one more column, and return V as a member of that space, consisting of all previous vectors, and in addition v_new in the last column.
If V is NULL, then a new MatrixSpace with one column is created.
|
private |
Given a DenseVector V, create a new DenseVectorSpace with one more row, and return V as a member of that space, consisting of all previous elements, and in addition v_new in the last row.
If V is NULL, then a new DenseVectorSpace with dimension one is created.
|
private |
Given a strictly-lower triangular square DenseGenMatrix V, create a new DenseGenMatrixSpace with one more dimension, and return V as a member of that space, consisting of all previous elements, and in addition elements s_i^Ty_j for (i<j), where s and y are the vectors in the MultiVectors S and Y.
If V is NULL, then a new DenseGenMatrixSpace with dimension one is created.
|
private |
Given a DenseSymMatrix V, create a new DenseGenMatrixSpace with one more dimension, and return V as a member of that space, consisting of all previous elements, and in addition elements s_i^Ts_j for the new entries, where s are the vectors in the MultiVector S.
If V is NULL, then a new DenseGenMatrixSpace with dimension one is created.
|
private |
Given a DenseSymMatrix V, create a new DenseGenMatrixSpace with one more dimension, and return V as a member of that space, consisting of all previous elements, and in addition elements s_i^TDRs_j for the new entries, where s are the vectors in the MultiVector S, and DRs are the vectors in DRS.
If V is NULL, then a new DenseGenMatrixSpace with dimension one is created.
|
private |
Given a MutliVector V, get rid of the first column, shift all other columns to the left, and make v_new the last column.
The entity that V points to at the call, is not changed - a new entity is created in the method and returned as V.
|
private |
Given a DenseVector V, get rid of the first element, shift all other elements one position to the top, and make v_new the last entry.
The entity that V points to at the call, is not changed - a new entity is created in the method and returned as V.
|
private |
Given a strictly-lower triangular square DenseGenMatrix V, shift everything one row and column up, and fill the new strictly lower triangular entries as s_i^Ty_j for (i<j), where s and y are the vectors in the MultiVectors S and Y.
The entity that V points to at the call, is not changed - a new entity is created in the method and returned as V.
|
private |
Given a DenseSymMatrix V, shift everything up one row and column, and fill the new entries as s_i^Ts_j, where s are the vectors in the MultiVector S.
The entity that V points to at the call, is not changed - a new entity is created in the method and returned as V.
|
private |
Given a DenseSymMatrix V, shift everything up one row and column, and fill the new entries as s_i^TDRs_j, where s are the vectors in the MultiVector S, and DRs are the vectors in DRS.
The entity that V points to at the call, is not changed - a new entity is created in the method and returned as V.
|
private |
Method for recomputing Y from scratch, using Ypart (only for restoration phase)
|
private |
Method for recomputing D from S and Y.
|
private |
Method for recomputing L from S and Y.
|
private |
Split the eigenvectors into negative and positive ones.
Given the eigenvectors in Q and the eigenvalues (in ascending order) in, this returns Qminus as the negative eigenvectors times sqrt(-eval), and Qplus as the positive eigenvectors times sqrt(eval). If Qminus or Qplus is NULL, it means that there are no negative or positive eigenvalues, resp. Q might be changed during this call.
|
private |
Store a copy of the pointers to the internal data (S, Y, D, L, SdotS, curr_lm_memory).
This is called in case the update is started but skipped during the process.
|
private |
Restore the copy of the pointers to the internal data most recently stored with StoreInternalDataBackup().
|
private |
Release anything that we allocated for StoreInternalDataBackup and is no longer needed.
Set the W field in IpData based on the current values of B0_, V_, and U_.
|
private |
Matrix space for the low-rank Hessian approximation.
Definition at line 76 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
Size of memory for limited memory update.
Definition at line 81 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
Type of Hessian update.
Definition at line 91 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
How to choose B0 in the low-rank update.
Definition at line 104 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
Value of B0 (as this multiple of the identity in certain situations).
Definition at line 107 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
Number of successive iterations of skipped updates after which the approximation is reset.
Definition at line 112 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
Minimal safeguard value for sigma.
Definition at line 115 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
Maximal safeguard value for sigma.
Definition at line 118 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
Flag indicating if Hessian approximation should be done in a special manner for the restoration phase.
Definition at line 123 of file IpLimMemQuasiNewtonUpdater.hpp.
Flag indicating if the update is to be done for the original NLP or for the restoration phase NLP.
In the latter case, we are performing a "structured" update, taking into account the first explicit term in the objective function of the form eta*D_r*x_k.
Definition at line 133 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
Most recent value for eta in the restoration phase objective function (only for update_for_resto_ = true)
Definition at line 138 of file IpLimMemQuasiNewtonUpdater.hpp.
Current DR_x scaling factors in the restoration phase objective function (only for update_for_resto_ = true).
This should not change throughout one restoration phase.
Definition at line 145 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
Tag for curr_DR_x_.
Definition at line 148 of file IpLimMemQuasiNewtonUpdater.hpp.
Current DR_x scaling factors in the restoration phase objective function in the smaller space for the approximation.
This is only computed if the space is indeed smaller than the x space (only for update_for_resto_ = true)
Definition at line 156 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
Current value of weighing factor eta in the restoration phase objective function (only for update_for_resto_ = true)
Definition at line 161 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
Counter for successive iterations in which the update was skipped.
Definition at line 164 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
current size of limited memory
Definition at line 169 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
s pairs for the recent iterations
Definition at line 172 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
y pairs for the recent iterations.
If update_for_resto is true, then this includes only the information for the constraints.
Definition at line 179 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
For restoration phase update: Y without the quadratic objective function part.
Definition at line 184 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
Diagonal elements D_k for compact formulation from last update.
Definition at line 189 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
Matrix L_k for compact formulation from last update.
Definition at line 192 of file IpLimMemQuasiNewtonUpdater.hpp.
First term (starting matrix) for the approximation.
Definition at line 195 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
First term (starting matrix) for the approximation.
If that first terms is a multiple of the identy, sigma give that factor. Otherwise sigma = -1.
Definition at line 202 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
V in LowRankUpdateMatrix from last update.
Definition at line 205 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
U in LowRankUpdateMatrix from last update.
Definition at line 208 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
For efficient implementation, we store the pairwise products for s's.
Definition at line 213 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
Flag indicating whether SdotS_ is update to date from most recent update.
Definition at line 218 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
DR * S (only for restoration phase)
Definition at line 221 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
For efficient implementation, we store the S^T S DR * S.
Only for restoration phase.
Definition at line 227 of file IpLimMemQuasiNewtonUpdater.hpp.
Primal variables x from most recent update.
Definition at line 230 of file IpLimMemQuasiNewtonUpdater.hpp.
Gradient of objective function w.r.t.
x at x_last_
Definition at line 233 of file IpLimMemQuasiNewtonUpdater.hpp.
Jacobian for equality constraints w.r.t x at x_last.
Definition at line 236 of file IpLimMemQuasiNewtonUpdater.hpp.
Jacobian for inequality constraints w.r.t x at x_last.
Definition at line 239 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
current size of limited memory
Definition at line 242 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
s pairs for the recent iterations (backup)
Definition at line 245 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
y pairs for the recent iterations.
If update_for_resto is true, then this includes only the information for the constraints. (backup)
Definition at line 252 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
For restoration phase update: Y without the quadratic objective function part (backup)
Definition at line 256 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
Diagonal elements D_k for compact formulation from last update (backup).
Definition at line 260 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
Matrix L_k for compact formulation from last update (backup).
Definition at line 263 of file IpLimMemQuasiNewtonUpdater.hpp.
First term (starting matrix) for the approximation (backup).
Definition at line 266 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
First term (starting matrix) for the approximation.
If that first terms is a multiple of the identy, sigma give that factor. Otherwise sigma = -1. (backup)
Definition at line 273 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
V in LowRankUpdateMatrix from last update (backup)
Definition at line 276 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
U in LowRankUpdateMatrix from last update (backup)
Definition at line 279 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
For efficient implementation, we store the pairwise products for s's (backup).
Definition at line 284 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
Flag indicating whether SdotS_ is update to date from most recent update (backup).
Definition at line 289 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
DR * S (only for restoration phase) (backup)
Definition at line 292 of file IpLimMemQuasiNewtonUpdater.hpp.
|
private |
For efficient implementation, we store the S^T S DR * S.
Only for restoration phase. (backup)
Definition at line 298 of file IpLimMemQuasiNewtonUpdater.hpp.