1 #ifndef HOPS_DIKINELLIPSOIDCALCULATOR_HPP
2 #define HOPS_DIKINELLIPSOIDCALCULATOR_HPP
4 #include <Eigen/Cholesky>
7 #include "../../FileWriter/CsvWriter.hpp"
10 template<
typename MatrixType,
typename VectorType>
15 std::pair<bool, Eigen::Matrix<typename MatrixType::Scalar, Eigen::Dynamic, Eigen::Dynamic>>
18 Eigen::Matrix<typename MatrixType::Scalar, Eigen::Dynamic, Eigen::Dynamic>
26 template<
typename MatrixType,
typename VectorType>
28 A(std::move(A)), b(std::move(b)) {}
30 template<
typename MatrixType,
typename VectorType>
31 std::pair<bool, Eigen::Matrix<typename MatrixType::Scalar, Eigen::Dynamic, Eigen::Dynamic>>
33 Eigen::Matrix<typename MatrixType::Scalar, Eigen::Dynamic, Eigen::Dynamic> dikinEllipsoid =
34 computeDikinEllipsoid(x);
36 Eigen::LLT<Eigen::Matrix<typename MatrixType::Scalar, Eigen::Dynamic, Eigen::Dynamic>> solver(dikinEllipsoid);
37 bool successful = solver.info() == Eigen::Success;
38 return std::make_pair(successful, solver.matrixL());
41 template<
typename MatrixType,
typename VectorType>
42 Eigen::Matrix<typename MatrixType::Scalar, Eigen::Dynamic, Eigen::Dynamic>
44 Eigen::Matrix<typename MatrixType::Scalar, Eigen::Dynamic, 1> inv_slack = (this->b -
45 this->A * x).cwiseInverse();
47 Eigen::Matrix<typename MatrixType::Scalar, Eigen::Dynamic, Eigen::Dynamic> halfDikin =
48 inv_slack.asDiagonal() * this->A;
49 Eigen::Matrix<typename MatrixType::Scalar, Eigen::Dynamic, Eigen::Dynamic> dikin =
50 halfDikin.transpose() * halfDikin;
55 #endif //HOPS_DIKINELLIPSOIDCALCULATOR_HPP