ZonoOpt v1.0.0
Loading...
Searching...
No Matches
CholeskyUtilities.hpp
Go to the documentation of this file.
1#ifndef ZONOOPT_CHOLESKY_UTILITIES_HPP_
2#define ZONOOPT_CHOLESKY_UTILITIES_HPP_
3
15#include "Eigen/Sparse"
16#include "Eigen/Dense"
17
18namespace ZonoOpt::detail {
19
20 struct LDLT_data
21 {
22 Eigen::SparseMatrix<zono_float> L;
23 Eigen::DiagonalMatrix<zono_float, -1> Dinv;
24 Eigen::PermutationMatrix<-1, -1, int> P, Pinv;
25 bool factorized = false;
26 };
27
28 inline void get_LDLT_data(const Eigen::SimplicialLDLT<Eigen::SparseMatrix<zono_float>>& solver, LDLT_data& data)
29 {
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;
35 }
36
37 inline Eigen::Vector<zono_float, -1> solve_LDLT(const LDLT_data& data, const Eigen::Vector<zono_float, -1>& b)
38 {
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;
43 }
44
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)
47 {
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);
50 z += AT*bmAz_sol;
51 }
52
53} // end namespace detail
54// end namespace ZonoOpt
55
56#endif
#define zono_float
Defines the floating-point type used in ZonoOpt.
Definition ZonoOpt.hpp:43