00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __IPPDPERTURBATIONHANDLER_HPP__
00010 #define __IPPDPERTURBATIONHANDLER_HPP__
00011
00012 #include "IpAlgStrategy.hpp"
00013
00014 namespace Ipopt
00015 {
00016
00024 class PDPerturbationHandler: public AlgorithmStrategyObject
00025 {
00026 public:
00030 PDPerturbationHandler();
00032 virtual ~PDPerturbationHandler()
00033 {}
00035
00036
00037 virtual bool InitializeImpl(const OptionsList& options,
00038 const std::string& prefix);
00039
00046 virtual bool ConsiderNewSystem(Number& delta_x, Number& delta_s,
00047 Number& delta_c, Number& delta_d);
00048
00053 virtual bool PerturbForSingularity(Number& delta_x, Number& delta_s,
00054 Number& delta_c, Number& delta_d);
00055
00060 virtual bool PerturbForWrongInertia(Number& delta_x, Number& delta_s,
00061 Number& delta_c, Number& delta_d);
00062
00065 virtual void CurrentPerturbation(Number& delta_x, Number& delta_s,
00066 Number& delta_c, Number& delta_d);
00067
00070 static void RegisterOptions(SmartPtr<RegisteredOptions> roptions);
00072
00073 protected:
00083 PDPerturbationHandler(const PDPerturbationHandler&);
00084
00086 void operator=(const PDPerturbationHandler&);
00088
00092 Number delta_x_last_;
00094 Number delta_s_last_;
00096 Number delta_c_last_;
00098 Number delta_d_last_;
00100
00105 Number delta_x_curr_;
00107 Number delta_s_curr_;
00109 Number delta_c_curr_;
00111 Number delta_d_curr_;
00113
00116 bool get_deltas_for_wrong_inertia_called_;
00117
00121 enum DegenType
00122 {
00123 NOT_YET_DETERMINED,
00124 NOT_DEGENERATE,
00125 DEGENERATE
00126 };
00127
00130 DegenType hess_degenerate_;
00131
00134 DegenType jac_degenerate_;
00135
00139 Index degen_iters_;
00140
00142 enum TrialStatus
00143 {
00144 NO_TEST,
00145 TEST_DELTA_C_EQ_0_DELTA_X_EQ_0,
00146 TEST_DELTA_C_GT_0_DELTA_X_EQ_0,
00147 TEST_DELTA_C_EQ_0_DELTA_X_GT_0,
00148 TEST_DELTA_C_GT_0_DELTA_X_GT_0
00149 };
00150
00152 TrialStatus test_status_;
00154
00158 Number delta_xs_max_;
00160 Number delta_xs_min_;
00162 Number delta_xs_first_inc_fact_;
00164 Number delta_xs_inc_fact_;
00166 Number delta_xs_dec_fact_;
00168 Number delta_xs_init_;
00170 Number delta_cd_val_;
00172 Number delta_cd_exp_;
00176 bool reset_last_;
00178 Index degen_iters_max_;
00181 bool perturb_always_cd_;
00183
00189 bool get_deltas_for_wrong_inertia(Number& delta_x, Number& delta_s,
00190 Number& delta_c, Number& delta_d);
00191
00195 void finalize_test();
00197 Number delta_cd();
00199
00200 };
00201
00202 }
00203
00204 #endif