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
00023 class LowRankAugSystemSolver : public AugSystemSolver
00024 {
00025 public:
00029 LowRankAugSystemSolver(AugSystemSolver& aug_system_solver);
00030
00032 virtual ~LowRankAugSystemSolver();
00034
00036 bool InitializeImpl(const OptionsList& options,
00037 const std::string& prefix);
00038
00042 virtual ESymSolverStatus Solve(
00043 const SymMatrix* W,
00044 double W_factor,
00045 const Vector* D_x,
00046 double delta_x,
00047 const Vector* D_s,
00048 double delta_s,
00049 const Matrix* J_c,
00050 const Vector* D_c,
00051 double delta_c,
00052 const Matrix* J_d,
00053 const Vector* D_d,
00054 double delta_d,
00055 const Vector& rhs_x,
00056 const Vector& rhs_s,
00057 const Vector& rhs_c,
00058 const Vector& rhs_d,
00059 Vector& sol_x,
00060 Vector& sol_s,
00061 Vector& sol_c,
00062 Vector& sol_d,
00063 bool check_NegEVals,
00064 Index numberOfNegEVals);
00065
00072 virtual Index NumberOfNegEVals() const;
00073
00077 virtual bool ProvidesInertia() const;
00078
00085 virtual bool IncreaseQuality();
00086
00087 private:
00097 LowRankAugSystemSolver();
00099 LowRankAugSystemSolver(const LowRankAugSystemSolver&);
00100
00102 void operator=(const LowRankAugSystemSolver&);
00104
00109 SmartPtr<AugSystemSolver> aug_system_solver_;
00110
00119 TaggedObject::Tag w_tag_;
00121 double w_factor_;
00125 TaggedObject::Tag d_x_tag_;
00127 double delta_x_;
00131 TaggedObject::Tag d_s_tag_;
00133 double delta_s_;
00137 TaggedObject::Tag j_c_tag_;
00141 TaggedObject::Tag d_c_tag_;
00143 double delta_c_;
00147 TaggedObject::Tag j_d_tag_;
00151 TaggedObject::Tag d_d_tag_;
00153 double delta_d_;
00155
00159 bool first_call_;
00160 SmartPtr<DenseGenMatrix> J1_;
00161 SmartPtr<DenseGenMatrix> J2_;
00162 SmartPtr<MultiVectorMatrix> Vtilde1_;
00163 SmartPtr<MultiVectorMatrix> Utilde2_;
00166 SmartPtr<DiagMatrix> Wdiag_;
00169 SmartPtr<const CompoundVectorSpace> compound_sol_vecspace_;
00171
00179 Index num_neg_evals_;
00180
00185 ESymSolverStatus UpdateFactorization(
00186 const SymMatrix* W,
00187 double W_factor,
00188 const Vector* D_x,
00189 double delta_x,
00190 const Vector* D_s,
00191 double delta_s,
00192 const Matrix& J_c,
00193 const Vector* D_c,
00194 double delta_c,
00195 const Matrix& J_d,
00196 const Vector* D_d,
00197 double delta_d,
00198 const Vector& proto_rhs_x,
00199 const Vector& proto_rhs_s,
00200 const Vector& proto_rhs_c,
00201 const Vector& proto_rhs_d,
00202 bool check_NegEVals,
00203 Index numberOfNegEVals);
00204
00210 ESymSolverStatus SolveMultiVector(
00211 const Vector* D_x,
00212 double delta_x,
00213 const Vector* D_s,
00214 double delta_s,
00215 const Matrix& J_c,
00216 const Vector* D_c,
00217 double delta_c,
00218 const Matrix& J_d,
00219 const Vector* D_d,
00220 double delta_d,
00221 const Vector& proto_rhs_x,
00222 const Vector& proto_rhs_s,
00223 const Vector& proto_rhs_c,
00224 const Vector& proto_rhs_d,
00225 const MultiVectorMatrix& V,
00226 const SmartPtr<const Matrix>& P_LM,
00227 SmartPtr<MultiVectorMatrix>& V_x,
00228 SmartPtr<MultiVectorMatrix>& Vtilde1,
00229 SmartPtr<MultiVectorMatrix>& Vtilde1_x,
00230 bool check_NegEVals,
00231 Index numberOfNegEVals);
00232
00236 bool AugmentedSystemRequiresChange(
00237 const SymMatrix* W,
00238 double W_factor,
00239 const Vector* D_x,
00240 double delta_x,
00241 const Vector* D_s,
00242 double delta_s,
00243 const Matrix& J_c,
00244 const Vector* D_c,
00245 double delta_c,
00246 const Matrix& J_d,
00247 const Vector* D_d,
00248 double delta_d);
00250
00251 };
00252
00253 }
00254
00255 #endif