Sleipnir C++ API
Loading...
Searching...
No Matches
kkt_solver.hpp
1// Copyright (c) Sleipnir contributors
2
3#pragma once
4
5#include <Eigen/Core>
6#include <Eigen/SparseCore>
7
8#include "sleipnir/optimization/solver/util/dense_kkt_solver.hpp"
9#include "sleipnir/optimization/solver/util/sparse_kkt_solver.hpp"
10
11namespace slp {
12
18template <typename Scalar>
19class KKTSolver {
20 public:
22 using DenseVector = Eigen::Vector<Scalar, Eigen::Dynamic>;
24 using SparseMatrix = Eigen::SparseMatrix<Scalar>;
25
33 KKTSolver(bool use_sparse_solver, int num_decision_variables,
34 int num_equality_constraints)
35 : m_use_sparse_solver{use_sparse_solver},
36 m_sparse_solver{num_decision_variables, num_equality_constraints},
37 m_dense_solver{num_decision_variables, num_equality_constraints} {}
38
47 KKTSolver(bool use_sparse_solver, int num_decision_variables,
48 int num_equality_constraints, Scalar γ_min)
49 : m_use_sparse_solver{use_sparse_solver},
50 m_sparse_solver{num_decision_variables, num_equality_constraints,
51 γ_min},
52 m_dense_solver{num_decision_variables, num_equality_constraints,
53 γ_min} {}
54
58 Eigen::ComputationInfo info() const {
59 if (m_use_sparse_solver) {
60 return m_sparse_solver.info();
61 } else {
62 return m_dense_solver.info();
63 }
64 }
65
75 if (m_use_sparse_solver) {
76 m_sparse_solver.compute(lhs);
77 } else {
78 m_dense_solver.compute(lhs);
79 }
80
81 return *this;
82 }
83
88 template <typename Rhs>
89 DenseVector solve(const Eigen::MatrixBase<Rhs>& rhs) const {
90 if (m_use_sparse_solver) {
91 return m_sparse_solver.solve(rhs);
92 } else {
93 return m_dense_solver.solve(rhs);
94 }
95 }
96
101 template <typename Rhs>
102 DenseVector solve(const Eigen::SparseMatrixBase<Rhs>& rhs) const {
103 if (m_use_sparse_solver) {
104 return m_sparse_solver.solve(rhs);
105 } else {
106 return m_dense_solver.solve(rhs);
107 }
108 }
109
113 Scalar hessian_regularization() const {
114 if (m_use_sparse_solver) {
115 return m_sparse_solver.hessian_regularization();
116 } else {
117 return m_dense_solver.hessian_regularization();
118 }
119 }
120
125 if (m_use_sparse_solver) {
126 return m_sparse_solver.constraint_jacobian_regularization();
127 } else {
128 return m_dense_solver.constraint_jacobian_regularization();
129 }
130 }
131
132 private:
133 bool m_use_sparse_solver;
134 SparseKKTSolver<Scalar> m_sparse_solver;
135 DenseKKTSolver<Scalar> m_dense_solver;
136};
137
138} // namespace slp
Definition intrusive_shared_ptr.hpp:27
Definition kkt_solver.hpp:19
KKTSolver & compute(const SparseMatrix &lhs)
Definition kkt_solver.hpp:74
DenseVector solve(const Eigen::MatrixBase< Rhs > &rhs) const
Definition kkt_solver.hpp:89
Eigen::Vector< Scalar, Eigen::Dynamic > DenseVector
Type alias for dense vector.
Definition kkt_solver.hpp:22
KKTSolver(bool use_sparse_solver, int num_decision_variables, int num_equality_constraints, Scalar γ_min)
Definition kkt_solver.hpp:47
KKTSolver(bool use_sparse_solver, int num_decision_variables, int num_equality_constraints)
Definition kkt_solver.hpp:33
Eigen::SparseMatrix< Scalar > SparseMatrix
Type alias for sparse matrix.
Definition kkt_solver.hpp:24
Eigen::ComputationInfo info() const
Definition kkt_solver.hpp:58
Scalar hessian_regularization() const
Definition kkt_solver.hpp:113
Scalar constraint_jacobian_regularization() const
Definition kkt_solver.hpp:124
DenseVector solve(const Eigen::SparseMatrixBase< Rhs > &rhs) const
Definition kkt_solver.hpp:102