16#include <Eigen/Cholesky>
17#include <Eigen/Eigenvalues>
18#include <Eigen/src/Cholesky/LDLT.h>
46template <Config Conf = DefaultConfig>
67 [[maybe_unused]]
crvec Σ, [[maybe_unused]]
real_t γ_0,
68 [[maybe_unused]]
crvec x_0, [[maybe_unused]]
crvec x̂_0,
69 [[maybe_unused]]
crvec p_0,
70 [[maybe_unused]]
crvec grad_ψx_0) {
71 if (
problem.get_num_constraints() != 0)
72 throw std::invalid_argument(
"Convex Newton direction does not "
73 "support general constraints");
74 if (!
problem.provides_eval_inactive_indices_res_lna())
75 throw std::invalid_argument(
"Convex Newton direction requires "
76 "eval_inactive_indices_res_lna");
77 if (!
problem.provides_eval_lagrangian_hessian())
78 throw std::invalid_argument(
"Structured Newton requires "
79 "eval_lagrangian_hessian");
83 const auto n =
problem.get_num_variables();
91 std::cerr <<
"Sparse hessians not yet implemented, converting to "
92 "dense matrix (may be very slow)\n";
102 [[maybe_unused]]
crvec xₖ, [[maybe_unused]]
crvec xₙₑₓₜ,
103 [[maybe_unused]]
crvec pₖ, [[maybe_unused]]
crvec pₙₑₓₜ,
104 [[maybe_unused]]
crvec grad_ψxₖ,
105 [[maybe_unused]]
crvec grad_ψxₙₑₓₜ) {
109 template <
class Solver>
113 if (ll.info() != Eigen::Success)
114 throw std::runtime_error(
"Cholesky factorization failed. "
115 "Is the problem convex?");
128 problem->eval_lagrangian_hessian(xₖ, y, 1, v);
134 auto nJ =
problem->eval_inactive_indices_res_lna(γₖ, xₖ, grad_ψxₖ,
JK);
135 auto J =
JK.topRows(nJ);
136 auto HJ =
HJ_storage.topRows(nJ * nJ).reshaped(nJ, nJ);
139 real_t res_sq = pₖ.squaredNorm() / (γₖ * γₖ);
141 HJ += reg * mat::Identity(nJ, nJ);
148 w = (
real_t(1) / γₖ) * pₖ(J) -
151 w = (
real_t(1) / γₖ) * pₖ(J);
154 auto symmetry =
H_eval->converter.converter.get_sparsity().symmetry;
155 if (symmetry == sparsity::Symmetry::Upper)
174 return "ConvexNewtonDirection<" + std::string(config_t::get_name()) +
185 mutable std::optional<rmat>
H;
186 mutable std::optional<sparsity::DenseEvaluator<config_t>>
H_eval;
The main polymorphic minimization problem interface.
#define USING_ALPAQA_CONFIG(Conf)
#define ALPAQA_IF_QUADF(...)
#define ALPAQA_IF_LONGD(...)
#define ALPAQA_IF_FLOAT(...)
#define ALPAQA_EXPORT_EXTERN_TEMPLATE(...)
real_t hessian_vec_factor
Parameters for the ConvexNewtonDirection class.
Parameters for the ConvexNewtonDirection class.
typename Conf::indexvec indexvec
typename Conf::real_t real_t
const rvec< Conf > null_vec
Global empty vector for convenience.
typename Conf::rindexvec rindexvec
typename Conf::index_t index_t
typename Conf::length_t length_t
typename Conf::crvec crvec
std::string get_name() const
void changed_γ(real_t γₖ, real_t old_γₖ)
ConvexNewtonRegularizationParams< config_t > AcceleratorParams
ConvexNewtonDirection(const Params ¶ms)
const auto & get_params() const
DirectionParams direction_params
DirectionParams direction
std::optional< sparsity::DenseEvaluator< config_t > > H_eval
bool update(real_t γₖ, real_t γₙₑₓₜ, crvec xₖ, crvec xₙₑₓₜ, crvec pₖ, crvec pₙₑₓₜ, crvec grad_ψxₖ, crvec grad_ψxₙₑₓₜ)
AcceleratorParams reg_params
ConvexNewtonDirection(const AcceleratorParams ¶ms, const DirectionParams &directionparams={})
void initialize(const Problem &problem, crvec y, crvec Σ, real_t γ_0, crvec x_0, crvec x̂_0, crvec p_0, crvec grad_ψx_0)
ConvexNewtonDirection()=default
bool apply(real_t γₖ, crvec xₖ, crvec x̂ₖ, crvec pₖ, crvec grad_ψxₖ, rvec qₖ) const
bool has_initial_direction() const
AcceleratorParams accelerator
void solve(rmat H, rvec q) const
TypeErasedProblem< config_t > Problem
ConvexNewtonDirectionParams< config_t > DirectionParams
Double-precision double configuration.
Single-precision float configuration.
long double configuration.
static void compute_complement(std::span< const index_t > in, std::span< index_t > out)