Ipopt
trunk
|
00001 // Copyright (C) 2004, 2006 International Business Machines and others. 00002 // All Rights Reserved. 00003 // This code is published under the Eclipse Public License. 00004 // 00005 // $Id$ 00006 // 00007 // Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 00008 00009 #ifndef __IP_STDAUGSYSTEMSOLVER_HPP__ 00010 #define __IP_STDAUGSYSTEMSOLVER_HPP__ 00011 00012 #include "IpAugSystemSolver.hpp" 00013 #include "IpCompoundMatrix.hpp" 00014 #include "IpCompoundSymMatrix.hpp" 00015 #include "IpCompoundVector.hpp" 00016 #include "IpSumSymMatrix.hpp" 00017 #include "IpDiagMatrix.hpp" 00018 #include "IpIdentityMatrix.hpp" 00019 00020 namespace Ipopt 00021 { 00027 class StdAugSystemSolver : public AugSystemSolver 00028 { 00029 public: 00033 StdAugSystemSolver(SymLinearSolver& LinSolver); 00034 00036 virtual ~StdAugSystemSolver(); 00038 00040 bool InitializeImpl(const OptionsList& options, 00041 const std::string& prefix); 00042 00047 virtual ESymSolverStatus MultiSolve( 00048 const SymMatrix* W, 00049 double W_factor, 00050 const Vector* D_x, 00051 double delta_x, 00052 const Vector* D_s, 00053 double delta_s, 00054 const Matrix* J_c, 00055 const Vector* D_c, 00056 double delta_c, 00057 const Matrix* J_d, 00058 const Vector* D_d, 00059 double delta_d, 00060 std::vector<SmartPtr<const Vector> >& rhs_xV, 00061 std::vector<SmartPtr<const Vector> >& rhs_sV, 00062 std::vector<SmartPtr<const Vector> >& rhs_cV, 00063 std::vector<SmartPtr<const Vector> >& rhs_dV, 00064 std::vector<SmartPtr<Vector> >& sol_xV, 00065 std::vector<SmartPtr<Vector> >& sol_sV, 00066 std::vector<SmartPtr<Vector> >& sol_cV, 00067 std::vector<SmartPtr<Vector> >& sol_dV, 00068 bool check_NegEVals, 00069 Index numberOfNegEVals); 00070 00077 virtual Index NumberOfNegEVals() const; 00078 00082 virtual bool ProvidesInertia() const; 00083 00090 virtual bool IncreaseQuality(); 00091 00092 private: 00102 StdAugSystemSolver(); 00104 StdAugSystemSolver(const StdAugSystemSolver&); 00105 00107 void operator=(const StdAugSystemSolver&); 00109 00110 00114 void CreateAugmentedSpace(const SymMatrix& W, 00115 const Matrix& J_c, 00116 const Matrix& J_d, 00117 const Vector& proto_x, 00118 const Vector& proto_s, 00119 const Vector& proto_c, 00120 const Vector& proto_d); 00121 00122 00126 void CreateAugmentedSystem(const SymMatrix* W, 00127 double W_factor, 00128 const Vector* D_x, 00129 double delta_x, 00130 const Vector* D_s, 00131 double delta_s, 00132 const Matrix& J_c, 00133 const Vector* D_c, 00134 double delta_c, 00135 const Matrix& J_d, 00136 const Vector* D_d, 00137 double delta_d, 00138 const Vector& proto_x, 00139 const Vector& proto_s, 00140 const Vector& proto_c, 00141 const Vector& proto_d); 00142 00145 bool AugmentedSystemRequiresChange(const SymMatrix* W, 00146 double W_factor, 00147 const Vector* D_x, 00148 double delta_x, 00149 const Vector* D_s, 00150 double delta_s, 00151 const Matrix& J_c, 00152 const Vector* D_c, 00153 double delta_c, 00154 const Matrix& J_d, 00155 const Vector* D_d, 00156 double delta_d); 00157 00161 SmartPtr<SymLinearSolver> linsolver_; 00162 00164 SmartPtr<CompoundSymMatrixSpace> augmented_system_space_; 00165 SmartPtr<SumSymMatrixSpace> sumsym_space_x_; 00166 SmartPtr<DiagMatrixSpace> diag_space_x_; 00167 SmartPtr<DiagMatrixSpace> diag_space_s_; 00168 SmartPtr<DiagMatrixSpace> diag_space_c_; 00169 SmartPtr<IdentityMatrixSpace> ident_space_ds_; 00170 SmartPtr<DiagMatrixSpace> diag_space_d_; 00171 00172 SmartPtr<CompoundVectorSpace> augmented_vector_space_; 00173 00182 TaggedObject::Tag w_tag_; 00184 double w_factor_; 00188 TaggedObject::Tag d_x_tag_; 00190 double delta_x_; 00194 TaggedObject::Tag d_s_tag_; 00196 double delta_s_; 00200 TaggedObject::Tag j_c_tag_; 00204 TaggedObject::Tag d_c_tag_; 00206 double delta_c_; 00210 TaggedObject::Tag j_d_tag_; 00214 TaggedObject::Tag d_d_tag_; 00216 double delta_d_; 00217 00224 TaggedObject::Tag augsys_tag_; 00226 00233 SmartPtr<CompoundSymMatrix> augmented_system_; 00234 00238 SmartPtr<const SymMatrix> old_w_; 00239 00244 bool warm_start_same_structure_; 00246 }; 00247 00248 } // namespace Ipopt 00249 00250 #endif