@@ -31,6 +31,9 @@ namespace cddp
3131 *
3232 * Inherits from CDDPSolverBase and overrides virtual hooks
3333 * for primal-dual interior point method with logarithmic barrier.
34+ * Supports path constraints, terminal equality constraints, and
35+ * terminal inequality constraints via a single-shooting formulation
36+ * with explicit costate variables.
3437 */
3538 class IPDDPSolver : public CDDPSolverBase
3639 {
@@ -44,11 +47,15 @@ namespace cddp
4447 // === CDDPSolverBase virtual hook overrides ===
4548 void preIterationSetup (CDDP &context) override ;
4649 bool backwardPass (CDDP &context) override ;
50+ bool checkEarlyConvergence (CDDP &context, int iter,
51+ std::string &reason) override ;
4752 ForwardPassResult forwardPass (CDDP &context, double alpha) override ;
4853 void applyForwardPassResult (CDDP &context, const ForwardPassResult &result) override ;
4954 bool checkConvergence (CDDP &context, double dJ, double dL, int iter,
5055 std::string &reason) override ;
5156 void postIterationUpdate (CDDP &context, bool forward_pass_success) override ;
57+ bool handleForwardPassFailure (CDDP &context,
58+ std::string &termination_reason) override ;
5259 void recordIterationHistory (const CDDP &context) override ;
5360 void populateSolverSpecificSolution (CDDPSolution &solution,
5461 const CDDP &context) override ;
@@ -67,6 +74,7 @@ namespace cddp
6774 G_ux_; // /< Constraint mixed hessians
6875
6976 // Interior point variables
77+ std::map<std::string, std::vector<Eigen::VectorXd>> G_raw_; // /< Raw constraint values
7078 std::map<std::string, std::vector<Eigen::VectorXd>> G_ ; // /< Constraint values
7179 std::map<std::string, std::vector<Eigen::VectorXd>> Y_ ; // /< Dual variables
7280 std::map<std::string, std::vector<Eigen::VectorXd>> S_ ; // /< Slack variables
@@ -77,42 +85,40 @@ namespace cddp
7785 std::map<std::string, std::vector<Eigen::VectorXd>> k_s_; // /< Slack feedforward
7886 std::map<std::string, std::vector<Eigen::MatrixXd>> K_s_; // /< Slack feedback
7987
88+ // Single-shooting costate variables and gains
89+ std::vector<Eigen::VectorXd>
90+ Lambda_; // /< Costate variables (Lagrange multipliers for dynamics)
91+ std::vector<Eigen::VectorXd>
92+ k_lambda_; // /< Feedforward gains for costate variables
93+ std::vector<Eigen::MatrixXd>
94+ K_lambda_; // /< Feedback gains for costate variables
95+
96+ // Terminal equality constraint variables
97+ Eigen::VectorXd Lambda_T_eq_; // /< Terminal equality multipliers
98+ Eigen::VectorXd dLambda_T_eq_; // /< Terminal equality multiplier direction
99+
100+ // Terminal inequality constraint variables
101+ std::map<std::string, Eigen::VectorXd> G_T_ ; // /< Terminal inequality values
102+ std::map<std::string, Eigen::VectorXd> Y_T_ ; // /< Terminal inequality duals
103+ std::map<std::string, Eigen::VectorXd> S_T_ ; // /< Terminal inequality slacks
104+ std::map<std::string, Eigen::VectorXd> dY_T_; // /< Terminal inequality dual directions
105+ std::map<std::string, Eigen::VectorXd> dS_T_; // /< Terminal inequality slack directions
106+
107+ // Search directions
108+ std::vector<Eigen::VectorXd> dX_; // /< State search directions
109+ std::vector<Eigen::VectorXd> dU_; // /< Control search directions
110+ std::map<std::string, std::vector<Eigen::VectorXd>>
111+ dY_; // /< Dual search directions
112+ std::map<std::string, std::vector<Eigen::VectorXd>>
113+ dS_; // /< Slack search directions
114+
80115 // Barrier method parameters
81116 double mu_; // /< Barrier parameter
82117 std::vector<FilterPoint> filter_; // /< Filter for line search
83-
84- // Pre-allocated workspace for performance optimization
85- struct Workspace {
86- // Backward pass workspace
87- std::vector<Eigen::MatrixXd> A_matrices;
88- std::vector<Eigen::MatrixXd> B_matrices;
89- std::vector<Eigen::MatrixXd> Q_xx_matrices;
90- std::vector<Eigen::MatrixXd> Q_ux_matrices;
91- std::vector<Eigen::MatrixXd> Q_uu_matrices;
92- std::vector<Eigen::VectorXd> Q_x_vectors;
93- std::vector<Eigen::VectorXd> Q_u_vectors;
94-
95- // LDLT solver cache
96- std::vector<Eigen::LDLT <Eigen::MatrixXd>> ldlt_solvers;
97- std::vector<bool > ldlt_valid;
98-
99- // Constraint workspace
100- Eigen::VectorXd y_combined;
101- Eigen::VectorXd s_combined;
102- Eigen::VectorXd g_combined;
103- Eigen::MatrixXd Q_yu_combined;
104- Eigen::MatrixXd Q_yx_combined;
105- Eigen::MatrixXd YSinv;
106- Eigen::MatrixXd bigRHS;
107-
108- // Forward pass workspace
109- std::vector<Eigen::VectorXd> delta_x_vectors;
110-
111- bool initialized = false ;
112- } workspace_;
118+ double phi_ = 0.0 ; // /< Current filter merit value
119+ double theta_ = 0.0 ; // /< Current filter violation metric
113120
114121 // === Private helper methods ===
115- void precomputeDynamicsDerivatives (CDDP &context);
116122 void precomputeConstraintGradients (CDDP &context);
117123 void evaluateTrajectory (CDDP &context);
118124 void evaluateTrajectoryWarmStart (CDDP &context);
@@ -126,6 +132,40 @@ namespace cddp
126132 double computeMaxConstraintViolation (const CDDP &context) const ;
127133 double computeScaledDualInfeasibility (const CDDP &context) const ;
128134
135+ // Filter and merit function methods
136+ bool acceptFilterEntry (double merit_function, double constraint_violation);
137+ bool isFilterAcceptable (double merit_function,
138+ double constraint_violation) const ;
139+
140+ double computeTheta (
141+ const CDDPOptions &options,
142+ const std::map<std::string, std::vector<Eigen::VectorXd>> &constraints,
143+ const std::map<std::string, std::vector<Eigen::VectorXd>> &slacks,
144+ const std::map<std::string, Eigen::VectorXd> *terminal_constraints = nullptr ,
145+ const std::map<std::string, Eigen::VectorXd> *terminal_slacks = nullptr ,
146+ const Eigen::VectorXd *terminal_equality_residual = nullptr ) const ;
147+
148+ double computeBarrierMerit (
149+ const CDDP &context,
150+ const std::map<std::string, std::vector<Eigen::VectorXd>> &slacks,
151+ double cost,
152+ const std::map<std::string, Eigen::VectorXd> *terminal_slacks = nullptr ,
153+ const Eigen::VectorXd *terminal_equality_multipliers = nullptr ,
154+ const Eigen::VectorXd *terminal_equality_residual = nullptr ) const ;
155+
156+ std::pair<double , double > computePrimalAndComplementarity (
157+ const CDDP &context,
158+ const std::map<std::string, std::vector<Eigen::VectorXd>> &constraints,
159+ const std::map<std::string, std::vector<Eigen::VectorXd>> &slacks,
160+ const std::map<std::string, std::vector<Eigen::VectorXd>> &duals,
161+ double mu,
162+ const std::map<std::string, Eigen::VectorXd> *terminal_constraints = nullptr ,
163+ const std::map<std::string, Eigen::VectorXd> *terminal_slacks = nullptr ,
164+ const std::map<std::string, Eigen::VectorXd> *terminal_duals = nullptr ,
165+ const Eigen::VectorXd *terminal_equality_residual = nullptr ) const ;
166+
167+ std::pair<double , double > computeMaxStepSizes (const CDDP &context) const ;
168+
129169 // Legacy print helper (used by printIteration override)
130170 void printIterationLegacy (int iter, double objective, double inf_pr,
131171 double inf_du, double inf_comp, double mu,
0 commit comments