1#ifndef ZONOOPT_CHOLESKY_UTILITIES_HPP_
2#define ZONOOPT_CHOLESKY_UTILITIES_HPP_
15#include "Eigen/Sparse"
18namespace ZonoOpt::detail {
22 Eigen::SparseMatrix<zono_float> L;
24 Eigen::PermutationMatrix<-1, -1,
int> P, Pinv;
25 bool factorized =
false;
28 inline void get_LDLT_data(
const Eigen::SimplicialLDLT<Eigen::SparseMatrix<zono_float>>& solver, LDLT_data& data)
30 data.L = solver.matrixL();
31 data.Dinv = solver.vectorD().cwiseInverse().asDiagonal();
32 data.P = solver.permutationP();
33 data.Pinv = solver.permutationPinv();
34 data.factorized =
true;
37 inline Eigen::Vector<
zono_float, -1> solve_LDLT(
const LDLT_data& data,
const Eigen::Vector<zono_float, -1>& b)
39 const Eigen::Vector<
zono_float, -1> bbar = data.P*b;
40 const Eigen::Vector<
zono_float, -1> y = data.Dinv*data.L.template triangularView<Eigen::Lower>().solve(bbar);
41 const Eigen::Vector<
zono_float, -1> xbar = data.L.transpose().template triangularView<Eigen::Upper>().solve(y);
42 return data.Pinv*xbar;
45 inline void affine_set_projection(Eigen::Ref<Eigen::Vector<zono_float, -1>> z,
const Eigen::SparseMatrix<zono_float>& A,
46 const Eigen::SparseMatrix<zono_float>& AT,
const Eigen::Vector<zono_float, -1>& b,
const LDLT_data& AAT_ldlt)
48 const Eigen::Vector<
zono_float, -1> bmAz = b - A*z;
49 const Eigen::Vector<
zono_float, -1> bmAz_sol = solve_LDLT(AAT_ldlt, bmAz);
#define zono_float
Defines the floating-point type used in ZonoOpt.
Definition ZonoOpt.hpp:43