/* * 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 OCPLSRICCATIINCLUDED #define OCPLSRICCATIINCLUDED #include "OCPKKT.hpp" #include "OCPLinearSolver.hpp" #include "fatrop/solver/FatropPrinter.hpp" #include #include #include "fatrop/solver/FatropOptions.hpp" #include "fatrop/auxiliary/Common.hpp" #define SUMMATION_ALG kahan_sum namespace fatrop { bool check_reg(const fatrop_int m, MAT *sA, const fatrop_int ai, const fatrop_int aj); class OCPLSRiccati : public OCPLinearSolver { public: OCPLSRiccati(const OCPDims &dims, const std::shared_ptr &options, const std::shared_ptr &printer); // solve a KKT system fatrop_int solve_pd_sys( OCPKKTMemory *OCP, const double inertia_correction_w, const double inertia_correction_c, const FatropVecBF &ux, const FatropVecBF &lam, const FatropVecBF &delta_s, const FatropVecBF &sigma_total, const FatropVecBF &gradb_total) override; // solve a KKT system fatrop_int solve_pd_sys_degenerate( OCPKKTMemory *OCP, const double inertia_correction_w, const double inertia_correction_c, const FatropVecBF &ux, const FatropVecBF &lam, const FatropVecBF &delta_s, const FatropVecBF &sigma_total, const FatropVecBF &gradb_total); // solve a KKT system int solve_pd_sys_normal( OCPKKTMemory *OCP, const double inertia_correction, const FatropVecBF &ux, const FatropVecBF &lam, const FatropVecBF &delta_s, const FatropVecBF &sigma_total, const FatropVecBF &gradb_total); fatrop_int get_rhs( OCPKKTMemory *OCP, const FatropVecBF &gradb_total, const FatropVecBF &rhs_rq, const FatropVecBF &rhs_b, const FatropVecBF &rhs_g, const FatropVecBF &rhs_g_ineq, const FatropVecBF &rhs_gradb) override; fatrop_int compute_pd_sys_times_vec( OCPKKTMemory *OCP, const double inertia_correction_w, const double inertia_correction_c, const FatropVecBF &ux, const FatropVecBF &lam, const FatropVecBF &delta_s, const FatropVecBF &sigma_total, const FatropVecBF &rhs_rq, const FatropVecBF &rhs_b, const FatropVecBF &rhs_g, const FatropVecBF &rhs_g_ineq, const FatropVecBF &rhs_gradb) override; fatrop_int solve_rhs( OCPKKTMemory *OCP, const double inertia_correction_w, const double inertia_correction_c, const FatropVecBF &ux, const FatropVecBF &lam, const FatropVecBF &delta_s, const FatropVecBF &sigma_total, const FatropVecBF &rhs_rq, const FatropVecBF &rhs_b, const FatropVecBF &rhs_g, const FatropVecBF &rhs_g_ineq, const FatropVecBF &rhs_gradb) override; fatrop_int solve_rhs_normal( OCPKKTMemory *OCP, const double inertia_correction_w, const double inertia_correction_c, const FatropVecBF &ux, const FatropVecBF &lam, const FatropVecBF &delta_s, const FatropVecBF &sigma_total, const FatropVecBF &rhs_rq, const FatropVecBF &rhs_b, const FatropVecBF &rhs_g, const FatropVecBF &rhs_g_ineq, const FatropVecBF &rhs_gradb) ; fatrop_int solve_rhs_degenerate( OCPKKTMemory *OCP, const double inertia_correction_w, const double inertia_correction_c, const FatropVecBF &ux, const FatropVecBF &lam, const FatropVecBF &delta_s, const FatropVecBF &sigma_total, const FatropVecBF &rhs_rq, const FatropVecBF &rhs_b, const FatropVecBF &rhs_g, const FatropVecBF &rhs_g_ineq, const FatropVecBF &rhs_gradb); FatropMemoryMatBF Ppt; FatropMemoryMatBF Hh; FatropMemoryMatBF AL; FatropMemoryMatBF RSQrqt_tilde; FatropMemoryMatBF Ggt_stripe; FatropMemoryMatBF Ggt_tilde; FatropMemoryMatBF GgLt; FatropMemoryMatBF RSQrqt_hat; FatropMemoryMatBF Llt; FatropMemoryMatBF Llt_shift; // needed because feature not implemented yet FatropMemoryMatBF GgIt_tilde; FatropMemoryMatBF GgLIt; FatropMemoryMatBF HhIt; FatropMemoryMatBF PpIt_hat; FatropMemoryMatBF LlIt; FatropMemoryMatBF Ggt_ineq_temp; FatropMemoryVecBF rhs_rq; FatropMemoryVecBF rhs_b; FatropMemoryVecBF rhs_g; FatropMemoryVecBF rhs_g_ineq; FatropMemoryVecBF rhs_gradb; FatropMemoryVecBF rhs_rq2; FatropMemoryVecBF rhs_b2; FatropMemoryVecBF rhs_g2; FatropMemoryVecBF rhs_g_ineq2; FatropMemoryVecBF rhs_gradb2; FatropMemoryVecBF ux_test; FatropMemoryVecBF lam_test; FatropMemoryVecBF delta_s_test; FatropMemoryVecBF v_Ppt; FatropMemoryVecBF v_Hh; FatropMemoryVecBF v_AL; FatropMemoryVecBF v_RSQrqt_tilde; FatropMemoryVecBF v_Ggt_stripe; FatropMemoryVecBF v_Ggt_tilde; FatropMemoryVecBF v_GgLt; FatropMemoryVecBF v_RSQrqt_hat; FatropMemoryVecBF v_Llt; FatropMemoryVecBF v_Llt_shift; FatropMemoryVecBF v_GgIt_tilde; FatropMemoryVecBF v_GgLIt; FatropMemoryVecBF v_HhIt; FatropMemoryVecBF v_PpIt_hat; FatropMemoryVecBF v_LlIt; FatropMemoryVecBF v_Ggt_ineq_temp; MemoryPermMat Pl; MemoryPermMat Pr; MemoryPermMat PlI; MemoryPermMat PrI; FatropVector gamma; FatropVector rho; fatrop_int rankI = 0; // struct LastUsed // { // fatrop_int rankI = 0; // double inertia_correction_w = 0; // double inertia_correction_c = 0; // double kappa_d = 0; // double mu = 0; // } lastused_; std::shared_ptr options_; std::shared_ptr printer_; bool it_ref = true; bool perturbed_mode = false; double perturbed_mode_param = 1e-6; int min_it_ref = 0; int max_it_ref = 5; double it_ref_acc = 1e-8; double lu_fact_tol = 1e-5; bool diagnostic = false; }; }; // namespace #endif // OCPLSRICCATIINCLUDED