|
| 1 | +# Constrained |
| 2 | + |
| 3 | +The `constrained` module in GTSAM provides constrained nonlinear optimization on top of factor graphs. |
| 4 | +It includes classes for representing constraints, building constrained problems, and solving them with penalty and augmented Lagrangian methods. |
| 5 | + |
| 6 | +## Core Problem Model |
| 7 | + |
| 8 | +- [`ConstrainedOptProblem`](doc/ConstrainedOptProblem.ipynb): Holds objective costs, equality constraints, and inequality constraints. |
| 9 | +- [`ConstrainedOptProblem::AuxiliaryKeyGenerator`](doc/ConstrainedOptProblem.ipynb): Generates keys for auxiliary variables used when transforming inequality constraints. |
| 10 | +- [`NonlinearConstraint`](doc/NonlinearConstraint.ipynb): Base class for nonlinear constraints represented as constrained `NoiseModelFactor` objects. |
| 11 | + |
| 12 | +## Equality Constraints |
| 13 | + |
| 14 | +- [`NonlinearEqualityConstraint`](doc/NonlinearEqualityConstraint.ipynb): Base class for constraints of the form `h(x) = 0`. |
| 15 | +- [`ExpressionEqualityConstraint<T>`](doc/NonlinearEqualityConstraint.ipynb): Equality constraint from an expression and right-hand side. |
| 16 | +- [`ZeroCostConstraint`](doc/NonlinearEqualityConstraint.ipynb): Equality constraint that enforces zero residual on a cost factor. |
| 17 | +- [`NonlinearEqualityConstraints`](doc/NonlinearEqualityConstraint.ipynb): Container graph for equality constraints. |
| 18 | + |
| 19 | +## Inequality Constraints |
| 20 | + |
| 21 | +- [`NonlinearInequalityConstraint`](doc/NonlinearInequalityConstraint.ipynb): Base class for constraints of the form `g(x) <= 0`. |
| 22 | +- [`ScalarExpressionInequalityConstraint`](doc/NonlinearInequalityConstraint.ipynb): Scalar expression-based inequality constraint. |
| 23 | +- [`NonlinearInequalityConstraints`](doc/NonlinearInequalityConstraint.ipynb): Container graph for inequality constraints. |
| 24 | +- [`InequalityPenaltyFunction`](doc/InequalityPenaltyFunction.ipynb): Interface for ramp-like penalty mappings used with inequality constraints. |
| 25 | + Derived classes: |
| 26 | + - [`RampFunction`](doc/InequalityPenaltyFunction.ipynb) |
| 27 | + - [`SmoothRampPoly2`](doc/InequalityPenaltyFunction.ipynb) |
| 28 | + - [`SmoothRampPoly3`](doc/InequalityPenaltyFunction.ipynb) |
| 29 | + - [`SoftPlusFunction`](doc/InequalityPenaltyFunction.ipynb) |
| 30 | + |
| 31 | +## Optimizers |
| 32 | + |
| 33 | +- [`ConstrainedOptimizerParams`](doc/ConstrainedOptimizer.ipynb), [`ConstrainedOptimizerState`](doc/ConstrainedOptimizer.ipynb), [`ConstrainedOptimizer`](doc/ConstrainedOptimizer.ipynb): Shared base interfaces and iteration state for constrained solvers. |
| 34 | +- [`PenaltyOptimizerParams`](doc/PenaltyOptimizer.ipynb), [`PenaltyOptimizerState`](doc/PenaltyOptimizer.ipynb), [`PenaltyOptimizer`](doc/PenaltyOptimizer.ipynb): Penalty method solver and its parameters/state. |
| 35 | +- [`AugmentedLagrangianParams`](doc/AugmentedLagrangianOptimizer.ipynb), [`AugmentedLagrangianState`](doc/AugmentedLagrangianOptimizer.ipynb), [`AugmentedLagrangianOptimizer`](doc/AugmentedLagrangianOptimizer.ipynb): Augmented Lagrangian solver and its parameters/state. |
| 36 | + |
| 37 | +## How the Pieces Fit Together |
| 38 | + |
| 39 | +For a new user, it helps to think in two phases: |
| 40 | + |
| 41 | +1. Build a constrained problem. |
| 42 | +2. Run a constrained solver on that problem. |
| 43 | + |
| 44 | +Inequality constraints can use different smooth penalty shapes via |
| 45 | +`InequalityPenaltyFunction` (ramp, smooth polynomial ramps, or softplus), |
| 46 | +which controls behavior near the active constraint boundary. |
| 47 | + |
| 48 | +### 1) Build the Problem |
| 49 | + |
| 50 | +This stage is about modeling: you separate what you want to minimize |
| 51 | +(objective terms) from what must hold (constraints), then combine them into a |
| 52 | +single `ConstrainedOptProblem` object that the solvers can consume. |
| 53 | + |
| 54 | +```mermaid |
| 55 | +flowchart TB |
| 56 | + User["User-defined model"] |
| 57 | + Costs["Objective terms<br/>NonlinearFactorGraph"] |
| 58 | + Eq["Equality constraints<br/>NonlinearEqualityConstraint(s)<br/>h(x)=0"] |
| 59 | + Ineq["Inequality constraints<br/>NonlinearInequalityConstraint(s)<br/>g(x)<=0"] |
| 60 | + Problem["ConstrainedOptProblem"] |
| 61 | +
|
| 62 | + User --> Costs |
| 63 | + User --> Eq |
| 64 | + User --> Ineq |
| 65 | + Costs --> Problem |
| 66 | + Eq --> Problem |
| 67 | + Ineq --> Problem |
| 68 | +``` |
| 69 | + |
| 70 | +### 2) Solve the Problem |
| 71 | + |
| 72 | +This stage is algorithmic: pick a constrained solver, form iterative |
| 73 | +unconstrained subproblems internally, and solve those subproblems with a |
| 74 | +standard nonlinear optimizer until constraint violation and cost are reduced. |
| 75 | + |
| 76 | +```mermaid |
| 77 | +flowchart TB |
| 78 | + Problem["ConstrainedOptProblem"] |
| 79 | + Choose{"Choose constrained solver"} |
| 80 | + Penalty["PenaltyOptimizer"] |
| 81 | + AL["AugmentedLagrangianOptimizer"] |
| 82 | + PenFunc["InequalityPenaltyFunction<br/>(ramp / smooth ramp / softplus)"] |
| 83 | + Sub["Iterative unconstrained subproblems"] |
| 84 | + LM["Nonlinear optimizer<br/>(Levenberg-Marquardt by default)"] |
| 85 | + Result["Optimized Values<br/>+ cost and violation metrics"] |
| 86 | +
|
| 87 | + Problem --> Choose |
| 88 | + Choose --> Penalty |
| 89 | + Choose --> AL |
| 90 | + PenFunc --> Penalty |
| 91 | + PenFunc --> AL |
| 92 | + Penalty --> Sub |
| 93 | + AL --> Sub |
| 94 | + Sub --> LM |
| 95 | + LM --> Result |
| 96 | +``` |
0 commit comments