00001
00002
00003
00004
00005
00006
00007
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 }
00255
00256 #endif