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