Ipopt
trunk
|
00001 // Copyright (C) 2004, 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: Carl Laird, Andreas Waechter IBM 2004-08-13 00008 00009 #ifndef __IP_AUGRESTOSYSTEMSOLVER_HPP__ 00010 #define __IP_AUGRESTOSYSTEMSOLVER_HPP__ 00011 00012 #include "IpAugSystemSolver.hpp" 00013 00014 namespace Ipopt 00015 { 00016 00023 class AugRestoSystemSolver: public AugSystemSolver 00024 { 00025 public: 00034 AugRestoSystemSolver(AugSystemSolver& orig_aug_solver, 00035 bool skip_orig_aug_solver_init=true); 00036 00038 virtual ~AugRestoSystemSolver(); 00040 00042 bool InitializeImpl(const OptionsList& options, 00043 const std::string& prefix); 00044 00049 virtual ESymSolverStatus Solve( 00050 const SymMatrix* W, 00051 double W_factor, 00052 const Vector* D_x, 00053 double delta_x, 00054 const Vector* D_s, 00055 double delta_s, 00056 const Matrix* J_c, 00057 const Vector* D_c, 00058 double delta_c, 00059 const Matrix* J_d, 00060 const Vector* D_d, 00061 double delta_d, 00062 const Vector& rhs_x, 00063 const Vector& rhs_s, 00064 const Vector& rhs_c, 00065 const Vector& rhs_d, 00066 Vector& sol_x, 00067 Vector& sol_s, 00068 Vector& sol_c, 00069 Vector& sol_d, 00070 bool check_NegEVals, 00071 Index numberOfNegEVals); 00072 00076 virtual Index NumberOfNegEVals() const 00077 { 00078 return orig_aug_solver_->NumberOfNegEVals(); 00079 } 00080 00084 virtual bool ProvidesInertia() const 00085 { 00086 return orig_aug_solver_->ProvidesInertia(); 00087 } 00088 00095 virtual bool IncreaseQuality() 00096 { 00097 return orig_aug_solver_->IncreaseQuality(); 00098 } 00099 00100 private: 00110 AugRestoSystemSolver(); 00111 00113 AugRestoSystemSolver(const AugRestoSystemSolver&); 00114 00116 void operator=(const AugRestoSystemSolver&); 00118 00121 CachedResults< SmartPtr<Vector> > neg_omega_c_plus_D_c_cache_; 00122 CachedResults< SmartPtr<Vector> > neg_omega_d_plus_D_d_cache_; 00123 CachedResults< SmartPtr<Vector> > sigma_tilde_n_c_inv_cache_; 00124 CachedResults< SmartPtr<Vector> > sigma_tilde_p_c_inv_cache_; 00125 CachedResults< SmartPtr<Vector> > sigma_tilde_n_d_inv_cache_; 00126 CachedResults< SmartPtr<Vector> > sigma_tilde_p_d_inv_cache_; 00127 CachedResults< SmartPtr<Vector> > d_x_plus_wr_d_cache_; 00128 CachedResults< SmartPtr<Vector> > rhs_cR_cache_; 00129 CachedResults< SmartPtr<Vector> > rhs_dR_cache_; 00131 00134 SmartPtr<const Vector> Neg_Omega_c_plus_D_c( 00135 const SmartPtr<const Vector>& sigma_tilde_n_c_inv, 00136 const SmartPtr<const Vector>& sigma_tilde_p_c_inv, 00137 const Vector* D_c, 00138 const Vector& any_vec_in_c); 00139 00140 SmartPtr<const Vector> Neg_Omega_d_plus_D_d( 00141 const Matrix& Pd_L, 00142 const SmartPtr<const Vector>& sigma_tilde_n_d_inv, 00143 const Matrix& neg_Pd_U, 00144 const SmartPtr<const Vector>& sigma_tilde_p_d_inv, 00145 const Vector* D_d, 00146 const Vector& any_vec_in_d); 00147 00149 SmartPtr<const Vector> Sigma_tilde_n_c_inv( 00150 const SmartPtr<const Vector>& sigma_tilde_n_c, 00151 Number delta_x, 00152 const Vector& any_vec_in_n_c); 00153 00154 SmartPtr<const Vector> Sigma_tilde_p_c_inv( 00155 const SmartPtr<const Vector>& sigma_tilde_p_c, 00156 Number delta_x, 00157 const Vector& any_vec_in_p_c); 00158 00159 SmartPtr<const Vector> Sigma_tilde_n_d_inv( 00160 const SmartPtr<const Vector>& sigma_tilde_n_d, 00161 Number delta_x, 00162 const Vector& any_vec_in_n_d); 00163 00164 SmartPtr<const Vector> Sigma_tilde_p_d_inv( 00165 const SmartPtr<const Vector>& sigma_tilde_p_d, 00166 Number delta_x, 00167 const Vector& any_vec_in_p_d); 00168 00169 SmartPtr<const Vector> D_x_plus_wr_d( 00170 const SmartPtr<const Vector>& CD_x0, 00171 Number factor, 00172 const Vector& wr_d); 00173 00174 SmartPtr<const Vector> Rhs_cR( 00175 const Vector& rhs_c, 00176 const SmartPtr<const Vector>& sigma_tilde_n_c_inv, 00177 const Vector& rhs_n_c, 00178 const SmartPtr<const Vector>& sigma_tilde_p_c_inv, 00179 const Vector& rhs_p_c); 00180 00181 SmartPtr<const Vector> Rhs_dR( 00182 const Vector& rhs_d, 00183 const SmartPtr<const Vector>& sigma_tilde_n_d_inv, 00184 const Vector& rhs_n_d, 00185 const Matrix& pd_L, 00186 const SmartPtr<const Vector>& sigma_tilde_p_d_inv, 00187 const Vector& rhs_p_d, 00188 const Matrix& pd_U); 00190 00191 SmartPtr<AugSystemSolver> orig_aug_solver_; 00192 bool skip_orig_aug_solver_init_; 00193 }; 00194 00195 } // namespace Ipopt 00196 00197 #endif