00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef __IPFILTERLSACCEPTOR_HPP__
00011 #define __IPFILTERLSACCEPTOR_HPP__
00012
00013 #include "IpFilter.hpp"
00014 #include "IpBacktrackingLSAcceptor.hpp"
00015 #include "IpPDSystemSolver.hpp"
00016
00017 namespace Ipopt
00018 {
00019
00023 class FilterLSAcceptor : public BacktrackingLSAcceptor
00024 {
00025 public:
00031 FilterLSAcceptor(const SmartPtr<PDSystemSolver>& pd_solver);
00032
00034 virtual ~FilterLSAcceptor();
00036
00038 virtual bool InitializeImpl(const OptionsList& options,
00039 const std::string& prefix);
00040
00047 virtual void Reset();
00048
00052 virtual void InitThisLineSearch(bool in_watchdog);
00053
00058 virtual void PrepareRestoPhaseStart();
00059
00061 virtual Number CalculateAlphaMin();
00062
00068 virtual bool CheckAcceptabilityOfTrialPoint(Number alpha_primal);
00069
00081 virtual bool TrySecondOrderCorrection(Number alpha_primal_test,
00082 Number& alpha_primal,
00083 SmartPtr<IteratesVector>& actual_delta);
00084
00091 virtual bool TryCorrector(Number alpha_primal_test,
00092 Number& alpha_primal,
00093 SmartPtr<IteratesVector>& actual_delta);
00094
00099 virtual char UpdateForNextIteration(Number alpha_primal_test);
00100
00103 virtual void StartWatchDog();
00104
00107 virtual void StopWatchDog();
00108
00115 bool IsAcceptableToCurrentIterate(Number trial_barr, Number trial_theta,
00116 bool called_from_restoration=false) const;
00117
00119 bool IsAcceptableToCurrentFilter(Number trial_barr, Number trial_theta) const;
00121
00124 static void RegisterOptions(SmartPtr<RegisteredOptions> roptions);
00126
00127 private:
00137 FilterLSAcceptor(const FilterLSAcceptor&);
00138
00140 void operator=(const FilterLSAcceptor&);
00142
00146 Number theta_max_;
00147 Number theta_max_fact_;
00148
00150 Number theta_min_;
00151 Number theta_min_fact_;
00153
00158 bool IsFtype(Number alpha_primal_test);
00159
00164 bool ArmijoHolds(Number alpha_primal_test);
00165
00168 void AugmentFilter();
00169
00171
00172
00173 static bool Compare_le(Number lhs, Number rhs, Number BasVal);
00174
00178 Number eta_phi_;
00180 Number delta_;
00182 Number s_phi_;
00184 Number s_theta_;
00186 Number gamma_phi_;
00188 Number gamma_theta_;
00190 Number alpha_min_frac_;
00192 Index max_soc_;
00196 Number kappa_soc_;
00201 Number obj_max_inc_;
00202
00204 enum CorrectorTypeEnum
00205 {
00206 NO_CORRECTOR=0,
00207 AFFINE_CORRECTOR,
00208 PRIMAL_DUAL_CORRECTOR
00209 };
00211 CorrectorTypeEnum corrector_type_;
00214 Number corrector_compl_avrg_red_fact_;
00217 bool skip_corr_if_neg_curv_;
00220 bool skip_corr_in_monotone_mode_;
00222 Index max_filter_resets_;
00227 Index filter_reset_trigger_;
00229
00234 Number reference_theta_;
00237 Number reference_barr_;
00240 Number reference_gradBarrTDelta_;
00242 Number watchdog_theta_;
00244 Number watchdog_barr_;
00246 Number watchdog_gradBarrTDelta_;
00248
00250 Filter filter_;
00251
00255 Number last_rejection_due_to_filter_;
00258 Index count_successive_filter_rejections_;
00260 Index n_filter_resets_;
00262
00265 SmartPtr<PDSystemSolver> pd_solver_;
00267 };
00268
00269 }
00270
00271 #endif