Ipopt
trunk
|
00001 // Copyright (C) 2005, 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: Andreas Waechter IBM 2005-12-27 00008 00009 #ifndef __IP_LOWRANKAUGSYSTEMSOLVER_HPP__ 00010 #define __IP_LOWRANKAUGSYSTEMSOLVER_HPP__ 00011 00012 #include "IpAugSystemSolver.hpp" 00013 #include "IpDenseGenMatrix.hpp" 00014 #include "IpMultiVectorMatrix.hpp" 00015 #include "IpDiagMatrix.hpp" 00016 00017 namespace Ipopt 00018 { 00019 00024 class LowRankAugSystemSolver : public AugSystemSolver 00025 { 00026 public: 00030 LowRankAugSystemSolver(AugSystemSolver& aug_system_solver); 00031 00033 virtual ~LowRankAugSystemSolver(); 00035 00037 bool InitializeImpl(const OptionsList& options, 00038 const std::string& prefix); 00039 00043 virtual ESymSolverStatus Solve( 00044 const SymMatrix* W, 00045 double W_factor, 00046 const Vector* D_x, 00047 double delta_x, 00048 const Vector* D_s, 00049 double delta_s, 00050 const Matrix* J_c, 00051 const Vector* D_c, 00052 double delta_c, 00053 const Matrix* J_d, 00054 const Vector* D_d, 00055 double delta_d, 00056 const Vector& rhs_x, 00057 const Vector& rhs_s, 00058 const Vector& rhs_c, 00059 const Vector& rhs_d, 00060 Vector& sol_x, 00061 Vector& sol_s, 00062 Vector& sol_c, 00063 Vector& sol_d, 00064 bool check_NegEVals, 00065 Index numberOfNegEVals); 00066 00073 virtual Index NumberOfNegEVals() const; 00074 00078 virtual bool ProvidesInertia() const; 00079 00086 virtual bool IncreaseQuality(); 00087 00088 private: 00098 LowRankAugSystemSolver(); 00100 LowRankAugSystemSolver(const LowRankAugSystemSolver&); 00101 00103 void operator=(const LowRankAugSystemSolver&); 00105 00110 SmartPtr<AugSystemSolver> aug_system_solver_; 00111 00120 TaggedObject::Tag w_tag_; 00122 double w_factor_; 00126 TaggedObject::Tag d_x_tag_; 00128 double delta_x_; 00132 TaggedObject::Tag d_s_tag_; 00134 double delta_s_; 00138 TaggedObject::Tag j_c_tag_; 00142 TaggedObject::Tag d_c_tag_; 00144 double delta_c_; 00148 TaggedObject::Tag j_d_tag_; 00152 TaggedObject::Tag d_d_tag_; 00154 double delta_d_; 00156 00160 bool first_call_; 00161 SmartPtr<DenseGenMatrix> J1_; 00162 SmartPtr<DenseGenMatrix> J2_; 00163 SmartPtr<MultiVectorMatrix> Vtilde1_; 00164 SmartPtr<MultiVectorMatrix> Utilde2_; 00167 SmartPtr<DiagMatrix> Wdiag_; 00170 SmartPtr<const CompoundVectorSpace> compound_sol_vecspace_; 00172 00180 Index num_neg_evals_; 00181 00186 ESymSolverStatus UpdateFactorization( 00187 const SymMatrix* W, 00188 double W_factor, 00189 const Vector* D_x, 00190 double delta_x, 00191 const Vector* D_s, 00192 double delta_s, 00193 const Matrix& J_c, 00194 const Vector* D_c, 00195 double delta_c, 00196 const Matrix& J_d, 00197 const Vector* D_d, 00198 double delta_d, 00199 const Vector& proto_rhs_x, 00200 const Vector& proto_rhs_s, 00201 const Vector& proto_rhs_c, 00202 const Vector& proto_rhs_d, 00203 bool check_NegEVals, 00204 Index numberOfNegEVals); 00205 00211 ESymSolverStatus SolveMultiVector( 00212 const Vector* D_x, 00213 double delta_x, 00214 const Vector* D_s, 00215 double delta_s, 00216 const Matrix& J_c, 00217 const Vector* D_c, 00218 double delta_c, 00219 const Matrix& J_d, 00220 const Vector* D_d, 00221 double delta_d, 00222 const Vector& proto_rhs_x, 00223 const Vector& proto_rhs_s, 00224 const Vector& proto_rhs_c, 00225 const Vector& proto_rhs_d, 00226 const MultiVectorMatrix& V, 00227 const SmartPtr<const Matrix>& P_LM, 00228 SmartPtr<MultiVectorMatrix>& V_x, 00229 SmartPtr<MultiVectorMatrix>& Vtilde1, 00230 SmartPtr<MultiVectorMatrix>& Vtilde1_x, 00231 bool check_NegEVals, 00232 Index numberOfNegEVals); 00233 00237 bool AugmentedSystemRequiresChange( 00238 const SymMatrix* W, 00239 double W_factor, 00240 const Vector* D_x, 00241 double delta_x, 00242 const Vector* D_s, 00243 double delta_s, 00244 const Matrix& J_c, 00245 const Vector* D_c, 00246 double delta_c, 00247 const Matrix& J_d, 00248 const Vector* D_d, 00249 double delta_d); 00251 00252 }; 00253 00254 } // namespace Ipopt 00255 00256 #endif