/* * Fatrop - A fast trajectory optimization solver * Copyright (C) 2022 - 2024 Lander Vanroye, KU Leuven. All rights reserved. * * This file is part of Fatrop. * * Fatrop is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fatrop is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Fatrop. If not, see . */ #ifndef LINESEARCHINCLUDED #define LINESEARCHINCLUDED #include "AlgStrategy.hpp" #include "IterationData.hpp" #include "fatrop/templates/NLPAlg.hpp" #include "fatrop/solver/FatropData.hpp" #include "fatrop/solver/Filter.hpp" #include "fatrop/solver/FatropPrinter.hpp" #include "fatrop/auxiliary/Common.hpp" #include #include namespace fatrop { struct LineSearchInfo { fatrop_int ls = 0; bool first_rejected_by_filter = false; bool last_rejected_by_filter = false; }; class LineSearch : public AlgStrategy { public: LineSearch( const std::shared_ptr &fatropparams, const std::shared_ptr &nlp, const std::shared_ptr &fatropdata, const std::shared_ptr &printer); virtual LineSearchInfo find_acceptable_trial_point(double mu, bool small_sd, bool from_backup) = 0; fatrop_int eval_constr_viol_trial(); double eval_obj_trial(); void reset(); virtual fatrop_int update_trial_step(double alpha_pr, double alpha_du) const; virtual fatrop_int initialize_second_order_correction() const; virtual fatrop_int exit_second_order_correction() const; virtual fatrop_int compute_second_order_correction(double alpha) const; std::shared_ptr fatropnlp_; std::shared_ptr fatropdata_; std::shared_ptr printer_; fatrop_int eval_cv_count; fatrop_int eval_obj_count; double eval_cv_time; double eval_obj_time; }; class BackTrackingLineSearch : public LineSearch { public: BackTrackingLineSearch( const std::shared_ptr &fatropparams, const std::shared_ptr &nlp, const std::shared_ptr &fatropdata, const std::shared_ptr &filter, const std::shared_ptr &journaller, const std::shared_ptr &printer); void initialize(); LineSearchInfo find_acceptable_trial_point(double mu, bool small_sd, bool from_backup); std::shared_ptr filter_; std::shared_ptr journaller_; double s_phi; double delta; double s_theta; double gamma_theta; double gamma_phi; double eta_phi; double gamma_alpha; bool accept_every_trial_step = false; fatrop_int max_soc; }; } // namespace fatrop #endif // LINESEARCHINCLUDED