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 {
00022
00023 DECLARE_STD_EXCEPTION(FATAL_ERROR_IN_LINEAR_SOLVER);
00024
00030 class StdAugSystemSolver : public AugSystemSolver
00031 {
00032 public:
00036 StdAugSystemSolver(SymLinearSolver& LinSolver);
00037
00039 virtual ~StdAugSystemSolver();
00041
00043 bool InitializeImpl(const OptionsList& options,
00044 const std::string& prefix);
00045
00050 virtual ESymSolverStatus MultiSolve(
00051 const SymMatrix* W,
00052 double W_factor,
00053 const Vector* D_x,
00054 double delta_x,
00055 const Vector* D_s,
00056 double delta_s,
00057 const Matrix* J_c,
00058 const Vector* D_c,
00059 double delta_c,
00060 const Matrix* J_d,
00061 const Vector* D_d,
00062 double delta_d,
00063 std::vector<SmartPtr<const Vector> >& rhs_xV,
00064 std::vector<SmartPtr<const Vector> >& rhs_sV,
00065 std::vector<SmartPtr<const Vector> >& rhs_cV,
00066 std::vector<SmartPtr<const Vector> >& rhs_dV,
00067 std::vector<SmartPtr<Vector> >& sol_xV,
00068 std::vector<SmartPtr<Vector> >& sol_sV,
00069 std::vector<SmartPtr<Vector> >& sol_cV,
00070 std::vector<SmartPtr<Vector> >& sol_dV,
00071 bool check_NegEVals,
00072 Index numberOfNegEVals);
00073
00080 virtual Index NumberOfNegEVals() const;
00081
00085 virtual bool ProvidesInertia() const;
00086
00093 virtual bool IncreaseQuality();
00094
00095 private:
00105 StdAugSystemSolver();
00107 StdAugSystemSolver(const StdAugSystemSolver&);
00108
00110 void operator=(const StdAugSystemSolver&);
00112
00113
00117 void CreateAugmentedSpace(const SymMatrix& W,
00118 const Matrix& J_c,
00119 const Matrix& J_d,
00120 const Vector& proto_x,
00121 const Vector& proto_s,
00122 const Vector& proto_c,
00123 const Vector& proto_d);
00124
00125
00129 void CreateAugmentedSystem(const SymMatrix* W,
00130 double W_factor,
00131 const Vector* D_x,
00132 double delta_x,
00133 const Vector* D_s,
00134 double delta_s,
00135 const Matrix& J_c,
00136 const Vector* D_c,
00137 double delta_c,
00138 const Matrix& J_d,
00139 const Vector* D_d,
00140 double delta_d,
00141 const Vector& proto_x,
00142 const Vector& proto_s,
00143 const Vector& proto_c,
00144 const Vector& proto_d);
00145
00148 bool AugmentedSystemRequiresChange(const SymMatrix* W,
00149 double W_factor,
00150 const Vector* D_x,
00151 double delta_x,
00152 const Vector* D_s,
00153 double delta_s,
00154 const Matrix& J_c,
00155 const Vector* D_c,
00156 double delta_c,
00157 const Matrix& J_d,
00158 const Vector* D_d,
00159 double delta_d);
00160
00164 SmartPtr<SymLinearSolver> linsolver_;
00165
00167 SmartPtr<CompoundSymMatrixSpace> augmented_system_space_;
00168 SmartPtr<SumSymMatrixSpace> sumsym_space_x_;
00169 SmartPtr<DiagMatrixSpace> diag_space_x_;
00170 SmartPtr<DiagMatrixSpace> diag_space_s_;
00171 SmartPtr<DiagMatrixSpace> diag_space_c_;
00172 SmartPtr<IdentityMatrixSpace> ident_space_ds_;
00173 SmartPtr<DiagMatrixSpace> diag_space_d_;
00174
00175 SmartPtr<CompoundVectorSpace> augmented_vector_space_;
00176
00185 TaggedObject::Tag w_tag_;
00187 double w_factor_;
00191 TaggedObject::Tag d_x_tag_;
00193 double delta_x_;
00197 TaggedObject::Tag d_s_tag_;
00199 double delta_s_;
00203 TaggedObject::Tag j_c_tag_;
00207 TaggedObject::Tag d_c_tag_;
00209 double delta_c_;
00213 TaggedObject::Tag j_d_tag_;
00217 TaggedObject::Tag d_d_tag_;
00219 double delta_d_;
00220
00227 TaggedObject::Tag augsys_tag_;
00229
00236 SmartPtr<CompoundSymMatrix> augmented_system_;
00237
00241 SmartPtr<const SymMatrix> old_w_;
00242
00247 bool warm_start_same_structure_;
00249 };
00250
00251 }
00252
00253 #endif