/* * 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 . */ // solver data #ifndef FATROPDATAINCLUDED #define FATROPDATAINCLUDED #include "fatrop/blasfeo_wrapper/LinearAlgebraBlasfeo.hpp" #include "fatrop/templates/NLPAlg.hpp" #include "fatrop/auxiliary/Common.hpp" #include "FatropOptions.hpp" #include "fatrop/solver/FatropPrinter.hpp" #include #include namespace fatrop { #define CACHEMACRO(instance, val) instance.evaluated ? instance.value : instance.SetValue(val) struct FatropData { FatropData(const NLPDims &nlpdims, const std::shared_ptr ¶ms, const std::shared_ptr &printer); void initialize(); fatrop_int reset(); fatrop_int reset_caches(); double e_mu_curr(double mu); fatrop_int eval_dual_inf_slack_eqs(); double eval_compl_slack(double mu); double eval_barrier_func(double mu, VEC *s_p); double eval_barrier_func_curr(double mu); double eval_barrier_func_trial(double mu); double eval_barrier_func_backup(double mu); double eval_barrier_fo_decr(double mu, VEC *s_p, VEC *delta_s_p); double eval_barrier_fo_decr_curr(double mu); double eval_barrier_fo_decr_backup(double mu); fatrop_int bound_slacks(); fatrop_int bound_z(); fatrop_int warmstart_dual(); fatrop_int modify_dual_bounds(double mu); fatrop_int accept_dual_initializiaton(); fatrop_int update_trial_step(double alpha_primal, double alpha_dual); fatrop_int accept_trial_step(); fatrop_int backup_curr(); fatrop_int backup_delta(); fatrop_int restore_backup(); double constr_viol_max_curr(); double constr_viol_max_next(); double constr_viol_sum_curr(); double constr_viol_sum_backup(); double constr_viol_sum_next(); double dual_sum_curr(); double dual_max_curr(); double dual_mean_curr(); double z_sum_curr(); fatrop_int number_of_bounds(); double delta_dual_max(); double dual_inf_max_curr(); double fo_decr_obj_curr(); double fo_decr_obj_backup(); void maximum_step_size(double &alpha_max_pr, double &alpha_max_du, double tau); void set_bounds(const std::vector &lowerin, const std::vector &upperin); void relax_bounds(); void relax_bounds_var(double mu); void evaluate_barrier_quantities(double mu); void compute_delta_z(); void compute_primal_dual_residu(); void init_bounds(); bool small_step_size(); const NLPDims nlpdims; double obj_scale = 1.0; fatrop_int n_eqs; fatrop_int n_ineqs; fatrop_int n_ineqs_r = 0; FatropMemoryVecBF memvars; FatropMemoryVecBF memeqs; FatropMemoryVecBF memineqs; FatropVecBF x_curr; FatropVecBF x_next; FatropVecBF x_backup; FatropVecBF x_initial; FatropVecBF delta_x; FatropVecBF delta_x_backup; FatropVecBF delta_x_backup_ls; FatropVecBF x_scales; FatropVecBF lam_curr; FatropVecBF lam_next; FatropVecBF lam_backup; FatropVecBF lam_calc; FatropVecBF lam_calc_backup; FatropVecBF lam_calc_backup_ls; FatropVecBF lam_scales; FatropVecBF lam_init; FatropVecBF g_curr; FatropVecBF g_next; FatropVecBF g_backup; FatropVecBF g_soc; FatropVecBF grad_curr_x; FatropVecBF grad_next_x; FatropVecBF grad_backup_x; FatropVecBF du_inf_curr; FatropVecBF du_inf_curr_s; // vectors neccessary for inequality constraints FatropVecBF s_curr; FatropVecBF s_next; FatropVecBF s_backup; FatropVecBF delta_s; FatropVecBF delta_s_backup; FatropVecBF delta_s_backup_ls; FatropVecBF zL_curr; FatropVecBF zL_next; FatropVecBF zL_backup; FatropVecBF zL_init; FatropVecBF zU_curr; FatropVecBF zU_next; FatropVecBF zU_backup; FatropVecBF zU_init; FatropVecBF delta_zL; FatropVecBF delta_zU; FatropVecBF s_lower_orig; FatropVecBF s_upper_orig; FatropVecBF s_lower; FatropVecBF s_upper; FatropVecBF sigma_L; FatropVecBF sigma_U; FatropVecBF sigma_total; FatropVecBF gradb_L; FatropVecBF gradb_U; FatropVecBF gradb_plus; FatropVecBF gradb_total; FatropVecBF grad_curr_s; FatropVecBF grad_next_s; FatropVecBF grad_backup_s; FatropVecBF du_inf_curr_s_wo_z; // vector lower_bounded_v; // vector upper_bounded_v; struct EvalCache { struct Instance { bool evaluated = false; double value = 0.0; double SetValue(const double value_) { value = value_; evaluated = true; return value; } }; Instance cv_linf; Instance cv_l1; Instance lam_linf; Instance lam_l1; Instance du_inf_linf; }; EvalCache cache_curr; EvalCache cache_next; double obj_curr = 0.0; double obj_backup = 0.0; double theta_min = 1e-4; const std::shared_ptr params; const std::shared_ptr printer_; // algorithm parameters double smax; double kappa1; double kappa2; double kappa_d; double kappa_sigma; double bound_relax_factor; double constr_viol_tol; double warm_start_mult_bound_push; }; } #endif // FATROPDATAINCLUDED