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
00152
00153
00154 static bool Compare_le(Number lhs, Number rhs, Number BasVal);
00155
00161 void PerformDualStep(Number alpha_primal,
00162 Number alpha_dual,
00163 SmartPtr<IteratesVector>& delta);
00164
00174 bool TrySoftRestoStep(SmartPtr<IteratesVector>& actual_delta,
00175 bool &satisfies_original_criterion);
00176
00188 bool TrySecondOrderCorrection(Number alpha_primal_test,
00189 Number& alpha_primal,
00190 SmartPtr<IteratesVector>& actual_delta);
00191
00198 bool TryCorrector(Number alpha_primal_test,
00199 Number& alpha_primal,
00200 SmartPtr<IteratesVector>& actual_delta);
00201
00206 void PerformMagicStep();
00207
00211 bool DetectTinyStep();
00212
00214 void StoreAcceptablePoint();
00215
00218 bool RestoreAcceptablePoint();
00219
00224 bool CurrentIsAcceptable();
00225
00230 Number alpha_red_factor_;
00231
00233 enum AlphaForYEnum
00234 {
00235 PRIMAL_ALPHA_FOR_Y=0,
00236 DUAL_ALPHA_FOR_Y,
00237 MIN_ALPHA_FOR_Y,
00238 MAX_ALPHA_FOR_Y,
00239 FULL_STEP_FOR_Y,
00240 MIN_DUAL_INFEAS_ALPHA_FOR_Y,
00241 SAFE_MIN_DUAL_INFEAS_ALPHA_FOR_Y,
00242 PRIMAL_AND_FULL_ALPHA_FOR_Y,
00243 DUAL_AND_FULL_ALPHA_FOR_Y,
00244 LSACCEPTOR_ALPHA_FOR_Y
00245 };
00250 AlphaForYEnum alpha_for_y_;
00251
00254 Number alpha_for_y_tol_;
00255
00259 Number soft_resto_pderror_reduction_factor_;
00263 Index max_soft_resto_iters_;
00264
00266 bool magic_steps_;
00269 bool accept_every_trial_step_;
00274 bool expect_infeasible_problem_;
00279 Number expect_infeasible_problem_ctol_;
00280
00282 Number tiny_step_tol_;
00283
00288 Number tiny_step_y_tol_;
00289
00291 Index watchdog_trial_iter_max_;
00293 Index watchdog_shortened_iter_trigger_;
00294
00297 bool start_with_resto_;
00299
00303 bool in_watchdog_;
00305 Index watchdog_shortened_iter_;
00307 Index watchdog_trial_iter_;
00309 Number watchdog_alpha_primal_test_;
00311 SmartPtr<const IteratesVector> watchdog_iterate_;
00313 SmartPtr<const IteratesVector> watchdog_delta_;
00315 Number last_mu_;
00317
00321 SmartPtr<const IteratesVector> acceptable_iterate_;
00322 Index acceptable_iteration_number_;
00324
00327 bool fallback_activated_;
00328
00333 bool rigorous_;
00334
00337 bool skipped_line_search_;
00338
00343 bool in_soft_resto_phase_;
00344
00347 Index soft_resto_counter_;
00348
00351 Index count_successive_shortened_steps_;
00352
00355 bool tiny_step_last_iteration_;
00356
00359 SmartPtr<BacktrackingLSAcceptor> acceptor_;
00360 SmartPtr<RestorationPhase> resto_phase_;
00361 SmartPtr<ConvergenceCheck> conv_check_;
00363 };
00364
00365 }
00366
00367 #endif