/home/coin/SVN-release/Ipopt-3.5.2/Ipopt/src/Algorithm/IpBacktrackingLineSearch.hpp

Go to the documentation of this file.
00001 // Copyright (C) 2004, 2008 International Business Machines and others.
00002 // All Rights Reserved.
00003 // This code is published under the Common Public License.
00004 //
00005 // $Id: IpBacktrackingLineSearch.hpp 1327 2008-09-18 19:01:17Z andreasw $
00006 //
00007 // Authors:  Carl Laird, Andreas Waechter     IBM    2004-08-13
00008 //           Andreas Waechter                 IBM    2005-10-13
00009 //               derived file from IpFilterLineSearch.hpp
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     //ToDo This should probably not be a static member function if we want to
00153     //     allow for different relaxation parameters values
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 } // namespace Ipopt
00366 
00367 #endif

Generated on Fri Sep 19 03:00:26 2008 by  doxygen 1.4.7