00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __IPCGPERTURBATIONHANDLER_HPP__
00010 #define __IPCGPERTURBATIONHANDLER_HPP__
00011
00012 #include "IpPDPerturbationHandler.hpp"
00013 #include "IpCGPenaltyCq.hpp"
00014
00015 namespace Ipopt
00016 {
00017
00025 class CGPerturbationHandler: public PDPerturbationHandler
00026 {
00027 public:
00031 CGPerturbationHandler();
00033 virtual ~CGPerturbationHandler()
00034 {}
00036
00037
00038 virtual bool InitializeImpl(const OptionsList& options,
00039 const std::string& prefix);
00040
00047 bool ConsiderNewSystem(Number& delta_x, Number& delta_s,
00048 Number& delta_c, Number& delta_d);
00049
00054 bool PerturbForSingularity(Number& delta_x, Number& delta_s,
00055 Number& delta_c, Number& delta_d);
00056
00061 bool PerturbForWrongInertia(Number& delta_x, Number& delta_s,
00062 Number& delta_c, Number& delta_d);
00063
00066 void CurrentPerturbation(Number& delta_x, Number& delta_s,
00067 Number& delta_c, Number& delta_d);
00068
00071 static void RegisterOptions(SmartPtr<RegisteredOptions> roptions);
00073
00074 private:
00084 CGPerturbationHandler(const CGPerturbationHandler&);
00085
00087 void operator=(const CGPerturbationHandler&);
00089
00091 CGPenaltyData& CGPenData()
00092 {
00093 CGPenaltyData& cg_pen_data =
00094 static_cast<CGPenaltyData&>(IpData().AdditionalData());
00095 DBG_ASSERT(dynamic_cast<CGPenaltyData*>(&IpData().AdditionalData()));
00096 return cg_pen_data;
00097 }
00098
00100 CGPenaltyCq& CGPenCq()
00101 {
00102 CGPenaltyCq& cg_pen_cq =
00103 static_cast<CGPenaltyCq&>(IpCq().AdditionalCq());
00104 DBG_ASSERT(dynamic_cast<CGPenaltyCq*>(&IpCq().AdditionalCq()));
00105 return cg_pen_cq;
00106 }
00107
00111 Number delta_x_last_;
00113 Number delta_s_last_;
00115 Number delta_c_last_;
00117 Number delta_d_last_;
00119
00124 Number delta_x_curr_;
00126 Number delta_s_curr_;
00128 Number delta_c_curr_;
00130 Number delta_d_curr_;
00132
00135 bool get_deltas_for_wrong_inertia_called_;
00136
00140 enum DegenType
00141 {
00142 NOT_YET_DETERMINED,
00143 NOT_DEGENERATE,
00144 DEGENERATE
00145 };
00146
00149 DegenType hess_degenerate_;
00150
00153 DegenType jac_degenerate_;
00154
00158 Index degen_iters_;
00159
00161 enum TrialStatus
00162 {
00163 NO_TEST,
00164 TEST_DELTA_C_EQ_0_DELTA_X_EQ_0,
00165 TEST_DELTA_C_GT_0_DELTA_X_EQ_0,
00166 TEST_DELTA_C_EQ_0_DELTA_X_GT_0,
00167 TEST_DELTA_C_GT_0_DELTA_X_GT_0
00168 };
00169
00171 TrialStatus test_status_;
00173
00177 Number delta_xs_max_;
00179 Number delta_xs_min_;
00181 Number delta_xs_first_inc_fact_;
00183 Number delta_xs_inc_fact_;
00185 Number delta_xs_dec_fact_;
00187 Number delta_xs_init_;
00189 Number delta_cd_val_;
00191 Number delta_cd_exp_;
00195 bool reset_last_;
00197 Index degen_iters_max_;
00200 bool perturb_always_cd_;
00202
00204 Number penalty_max_;
00206 Number mult_diverg_feasibility_tol_;
00207
00213 bool get_deltas_for_wrong_inertia(Number& delta_x, Number& delta_s,
00214 Number& delta_c, Number& delta_d);
00215
00219 void finalize_test();
00221 Number delta_cd();
00223
00224 };
00225
00226 }
00227
00228 #endif