Solver entry points live under copp::solver. The namespace layout follows the Rust and Python APIs: each solver family owns its Problem, Options, Result, and solve names when that is natural for C++.
| Namespace | Order | Objective | Backend | Typical use |
|---|---|---|---|---|
| topp2_ra | 2 | time | reachability analysis | fast TOPP2 baseline |
| reach_set2 | 2 | none | reachable set | feasibility diagnostics |
| copp2_socp | 2 | convex | Clarabel SOCP | conic formulation and diagnostics |
| topp3_lp | 3 | time | Clarabel LP | linearized TOPP3 baseline |
| topp3_socp | 3 | time | Clarabel SOCP | iterative convex refinement |
| copp3_socp | 3 | convex | Clarabel SOCP | third-order convex optimization |
Input: a ConstraintsRef, closed station interval, endpoint values for a = dot{s}^2, and optional RA tolerances.
Output: optimized std::vector<double> node profile a(s).
Input: a Robot, objective list, closed station interval, endpoint values, and Clarabel options.
Output: accepted a(s) profile or expert Clarabel diagnostics.
TOPP3-LP, TOPP3-SOCP, and COPP3-SOCP use the shared third-order problem descriptor. The solver namespaces provide aliases, so user code can write topp3_socp::Problem even though the underlying type is shared.
Constructing a third-order problem immediately refreshes Rust's linearized third-order constraint cache in the borrowed Robot or Constraints storage. Do not construct or solve third-order problems concurrently against the same constraint owner.
By default every jerk row is linearized directly at a_linearization[k]. The optional trailing b_linearization argument of topp3::Problem and copp3_socp::Problem selects adaptive anchoring: each row is anchored where it is nearly active at the feasible state (a_linearization, b_linearization). Both profiles must be the a and b of the same previously solved third-order profile (never a TOPP2 profile, whose b is discretized differently). Prefer it when a spans a wide range, and especially when a can approach zero (around 1e-10): direct linearization anchors the upper and lower row of one axis at the same small a_linearization[k], which cancels b and c and leaves a[k] <= 3 * a_linearization[k]. On profiles well away from zero the default is cheaper and nearly identical.
LP is the lighter linearized formulation. SOCP is usually used as a sequential convex refinement: solve once, rebuild the problem with the returned profile.a, then solve again.
Third-order profiles whose a comes close to zero can have an interpolated a(s) that dips below zero between stations. Call Profile3rd::force_positive_a before s_to_t_topp3 and then check the delivered profile with ConstraintsRef::exceed_topp3:
COPP3-SOCP has its own problem class because it needs a Robot and objective list in addition to the third-order linearization profile.