20#include <gtsam/config.h>
22#ifdef GTSAM_ALLOW_DEPRECATED_SINCE_V43
24#include <gtsam/constrained/ActiveSetSolver.h>
25#include <gtsam/constrained/LinearConstraint.h>
26#include <gtsam/constrained/LpProblem.h>
27#include <gtsam/constrained/QpProblem.h>
36namespace unstable_solver_adapter {
41inline void AddOrCheckDim(KeyDimMap* keyDims, Key key,
size_t dim) {
42 const auto [it, inserted] = keyDims->emplace(key, dim);
43 if (!inserted && it->second != dim) {
44 throw std::invalid_argument(
45 "ConstrainedSolverAdapter: inconsistent key dimensions.");
50inline void AddFactorDims(KeyDimMap* keyDims,
const GaussianFactor& factor) {
51 for (
auto it = factor.begin(); it != factor.end(); ++it) {
52 AddOrCheckDim(keyDims, *it,
static_cast<size_t>(factor.getDim(it)));
57template <
typename GRAPH>
58inline void AddGraphDims(KeyDimMap* keyDims,
const GRAPH& graph) {
59 for (
const auto& factor : graph) {
61 AddFactorDims(keyDims, *factor);
67inline KeyDimMap CollectKeyDims(
const QP& qp) {
69 AddGraphDims(&keyDims, qp.cost);
70 AddGraphDims(&keyDims, qp.equalities);
71 AddGraphDims(&keyDims, qp.inequalities);
76inline KeyDimMap CollectKeyDims(
const LP& lp) {
78 AddFactorDims(&keyDims, lp.cost);
79 AddGraphDims(&keyDims, lp.equalities);
80 AddGraphDims(&keyDims, lp.inequalities);
85inline Values ToValues(
const VectorValues& vectorValues) {
87 for (
const auto& [key, vector] : vectorValues) {
88 values.insert(key, vector);
94inline VectorValues ToVectorValues(
const Values& values,
95 const KeyDimMap& keyDims) {
96 VectorValues vectorValues;
97 for (
const auto& [key, _] : keyDims) {
98 if (values.exists(key)) {
99 vectorValues.insert(key, values.at<Vector>(key));
106inline QpProblem ToConstrainedProblem(
const QP& qp) {
108 for (
const auto& factor : qp.cost) {
110 problem.addCost(*factor);
113 for (
const auto& factor : qp.equalities) {
115 problem.addConstraint(
116 LinearConstraint::Equal(
static_cast<const JacobianFactor&
>(*factor)));
119 for (
const auto& factor : qp.inequalities) {
121 problem.addConstraint(LinearConstraint::LessEqual(
122 static_cast<const JacobianFactor&
>(*factor)));
129inline LpProblem ToConstrainedProblem(
const LP& lp) {
131 problem.addCost(
static_cast<const JacobianFactor&
>(lp.cost));
132 for (
const auto& factor : lp.equalities) {
134 problem.addConstraint(
135 LinearConstraint::Equal(
static_cast<const JacobianFactor&
>(*factor)));
138 for (
const auto& factor : lp.inequalities) {
140 problem.addConstraint(LinearConstraint::LessEqual(
141 static_cast<const JacobianFactor&
>(*factor)));
148inline ActiveSetSolver::State WarmStartState(
149 const InequalityFactorGraph& inequalities,
const VectorValues& duals) {
150 ActiveSetSolver::State state;
151 state.activeInequalityRows.reserve(inequalities.size());
152 for (
const auto& factor : inequalities) {
153 state.activeInequalityRows.push_back(factor &&
154 duals.exists(factor->dualKey()));
160inline void AddEqualityDuals(VectorValues* duals,
161 const EqualityFactorGraph& equalities,
162 const std::vector<Vector>& multipliers) {
163 for (
size_t index = 0;
164 index < equalities.size() && index < multipliers.size(); ++index) {
165 const auto& factor = equalities.at(index);
167 duals->insert_or_assign(factor->dualKey(), multipliers[index]);
173inline void AddInequalityDuals(VectorValues* duals,
174 const InequalityFactorGraph& inequalities,
175 const std::vector<Vector>& multipliers,
176 const std::vector<bool>& activeRows) {
177 for (
size_t index = 0;
178 index < inequalities.size() && index < multipliers.size() &&
179 index < activeRows.size();
181 const auto& factor = inequalities.at(index);
182 if (factor && activeRows[index]) {
183 duals->insert_or_assign(factor->dualKey(), multipliers[index]);
189inline VectorValues ToLegacyDuals(
const QP& qp,
190 const ActiveSetSolver::State& state) {
192 AddEqualityDuals(&duals, qp.equalities, state.equalityMultipliers);
193 AddInequalityDuals(&duals, qp.inequalities, state.inequalityMultipliers,
194 state.activeInequalityRows);
199inline VectorValues ToLegacyDuals(
const LP& lp,
200 const ActiveSetSolver::State& state) {
202 AddEqualityDuals(&duals, lp.equalities, state.equalityMultipliers);
203 AddInequalityDuals(&duals, lp.inequalities, state.inequalityMultipliers,
204 state.activeInequalityRows);
A non-templated config holding any types of Manifold-group elements.
Factor graphs of a Quadratic Programming problem.
Struct used to hold a Linear Programming Problem.
Global functions in a separate testing namespace.
Definition chartTesting.h:28
std::map< Key, size_t > KeyDimMap
Map from variable key to dimension.
Definition MultifrontalClique.h:51