Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef __IPBACKTRACKINGLINESEARCH_HPP__
00012 #define __IPBACKTRACKINGLINESEARCH_HPP__
00013
00014 #include "IpLineSearch.hpp"
00015 #include "IpBacktrackingLSAcceptor.hpp"
00016 #include "IpRestoPhase.hpp"
00017 #include "IpConvCheck.hpp"
00018
00019 namespace Ipopt
00020 {
00021
00036 class BacktrackingLineSearch : public LineSearch
00037 {
00038 public:
00048 BacktrackingLineSearch(const SmartPtr<BacktrackingLSAcceptor>& acceptor,
00049 const SmartPtr<RestorationPhase>& resto_phase,
00050 const SmartPtr<ConvergenceCheck>& conv_check
00051 );
00052
00054 virtual ~BacktrackingLineSearch();
00056
00058 virtual bool InitializeImpl(const OptionsList& options,
00059 const std::string& prefix);
00060
00064 virtual void FindAcceptableTrialPoint();
00065
00072 virtual void Reset();
00073
00085 virtual void SetRigorousLineSearch(bool rigorous)
00086 {
00087 rigorous_ = rigorous;
00088 }
00089
00094 virtual bool CheckSkippedLineSearch()
00095 {
00096 return skipped_line_search_;
00097 }
00098
00101 virtual bool ActivateFallbackMechanism();
00102
00105 static void RegisterOptions(SmartPtr<RegisteredOptions> roptions);
00107
00108 private:
00118 BacktrackingLineSearch(const BacktrackingLineSearch&);
00119
00121 void operator=(const BacktrackingLineSearch&);
00123
00128 bool DoBacktrackingLineSearch(bool skip_first_trial_point,
00129 Number& alpha_primal,
00130 bool& corr_taken,
00131 bool& soc_taken,
00132 Index& n_steps,
00133 bool& evaluation_error,
00134 SmartPtr<IteratesVector>& actual_delta);
00135
00138 void StartWatchDog();
00139
00142 void StopWatchDog(SmartPtr<IteratesVector>& actual_delta);
00143
00149 bool CheckAcceptabilityOfTrialPoint(Number alpha_primal);
00150
00156 void PerformDualStep(Number alpha_primal,
00157 Number alpha_dual,
00158 SmartPtr<IteratesVector>& delta);
00159
00169 bool TrySoftRestoStep(SmartPtr<IteratesVector>& actual_delta,
00170 bool &satisfies_original_criterion);
00171
00183 bool TrySecondOrderCorrection(Number alpha_primal_test,
00184 Number& alpha_primal,
00185 SmartPtr<IteratesVector>& actual_delta);
00186
00193 bool TryCorrector(Number alpha_primal_test,
00194 Number& alpha_primal,
00195 SmartPtr<IteratesVector>& actual_delta);
00196
00201 void PerformMagicStep();
00202
00206 bool DetectTinyStep();
00207
00209 void StoreAcceptablePoint();
00210
00213 bool RestoreAcceptablePoint();
00214
00219 bool CurrentIsAcceptable();
00220
00225 Number alpha_red_factor_;
00226
00228 enum AlphaForYEnum
00229 {
00230 PRIMAL_ALPHA_FOR_Y=0,
00231 DUAL_ALPHA_FOR_Y,
00232 MIN_ALPHA_FOR_Y,
00233 MAX_ALPHA_FOR_Y,
00234 FULL_STEP_FOR_Y,
00235 MIN_DUAL_INFEAS_ALPHA_FOR_Y,
00236 SAFE_MIN_DUAL_INFEAS_ALPHA_FOR_Y,
00237 PRIMAL_AND_FULL_ALPHA_FOR_Y,
00238 DUAL_AND_FULL_ALPHA_FOR_Y,
00239 LSACCEPTOR_ALPHA_FOR_Y
00240 };
00245 AlphaForYEnum alpha_for_y_;
00246
00249 Number alpha_for_y_tol_;
00250
00254 Number soft_resto_pderror_reduction_factor_;
00258 Index max_soft_resto_iters_;
00259
00261 bool magic_steps_;
00264 bool accept_every_trial_step_;
00268 Index accept_after_max_steps_;
00273 bool expect_infeasible_problem_;
00278 Number expect_infeasible_problem_ctol_;
00283 Number expect_infeasible_problem_ytol_;
00284
00286 Number tiny_step_tol_;
00287
00292 Number tiny_step_y_tol_;
00293
00295 Index watchdog_trial_iter_max_;
00297 Index watchdog_shortened_iter_trigger_;
00298
00301 bool start_with_resto_;
00303
00307 bool in_watchdog_;
00309 Index watchdog_shortened_iter_;
00311 Index watchdog_trial_iter_;
00313 Number watchdog_alpha_primal_test_;
00315 SmartPtr<const IteratesVector> watchdog_iterate_;
00317 SmartPtr<const IteratesVector> watchdog_delta_;
00319 Number last_mu_;
00321
00325 SmartPtr<const IteratesVector> acceptable_iterate_;
00326 Index acceptable_iteration_number_;
00328
00331 bool fallback_activated_;
00332
00337 bool rigorous_;
00338
00341 bool skipped_line_search_;
00342
00347 bool in_soft_resto_phase_;
00348
00351 Index soft_resto_counter_;
00352
00355 Index count_successive_shortened_steps_;
00356
00359 bool tiny_step_last_iteration_;
00360
00363 SmartPtr<BacktrackingLSAcceptor> acceptor_;
00364 SmartPtr<RestorationPhase> resto_phase_;
00365 SmartPtr<ConvergenceCheck> conv_check_;
00367 };
00368
00369 }
00370
00371 #endif