59 using context::ConstVectorRef;
62 using context::VectorRef;
67 bp::enum_<LQSolverChoice>(
"LQSolverChoice")
73 bp::class_<Workspace, bp::bases<WorkspaceBaseTpl<Scalar>>,
75 "Workspace",
"Workspace for ProxDDP.",
76 bp::init<const TrajOptProblem &>((
"self"_a,
"problem")))
77 .def_readonly(
"lqr_problem", &Workspace::lqr_problem,
78 "Buffers for the LQ subproblem.")
79 .def_readonly(
"Lxs", &Workspace::Lxs)
80 .def_readonly(
"Lus", &Workspace::Lus)
81 .def_readonly(
"Lds", &Workspace::Lds)
82 .def_readonly(
"Lvs", &Workspace::Lvs)
83 .def_readonly(
"dxs", &Workspace::dxs)
84 .def_readonly(
"dus", &Workspace::dus)
85 .def_readonly(
"dvs", &Workspace::dvs)
86 .def_readonly(
"dlams", &Workspace::dlams)
87 .def_readonly(
"trial_vs", &Workspace::trial_vs)
88 .def_readonly(
"trial_lams", &Workspace::trial_lams)
89 .def_readonly(
"lams_plus", &Workspace::lams_plus)
90 .def_readonly(
"lams_pdal", &Workspace::lams_pdal)
91 .def_readonly(
"vs_plus", &Workspace::vs_plus)
92 .def_readonly(
"vs_pdal", &Workspace::vs_pdal)
93 .def_readonly(
"shifted_constraints", &Workspace::shifted_constraints)
94 .def_readonly(
"cstr_proj_jacs", &Workspace::cstr_proj_jacs)
95 .def_readonly(
"inner_crit", &Workspace::inner_criterion)
96 .def_readonly(
"active_constraints", &Workspace::active_constraints)
97 .def_readonly(
"prev_xs", &Workspace::prev_xs)
98 .def_readonly(
"prev_us", &Workspace::prev_us)
99 .def_readonly(
"prev_lams", &Workspace::prev_lams)
100 .def_readonly(
"prev_vs", &Workspace::prev_vs)
101 .def_readonly(
"stage_infeasibilities", &Workspace::stage_infeasibilities)
102 .def_readonly(
"state_dual_infeas", &Workspace::state_dual_infeas)
103 .def_readonly(
"control_dual_infeas", &Workspace::control_dual_infeas)
106 bp::class_<Results, bp::bases<ResultsBaseTpl<Scalar>>, boost::noncopyable>(
107 "Results",
"Results struct for proxDDP.",
108 bp::init<const TrajOptProblem &>((
"self"_a,
"problem")))
109 .def(
"cycleAppend", &Results::cycleAppend, (
"self"_a,
"problem",
"x0"),
110 "Cycle the results.")
111 .def_readonly(
"al_iter", &Results::al_iter)
112 .def_readonly(
"lams", &Results::lams)
116 using ls_variant_t = SolverType::LinesearchVariant::variant_t;
119 bp::class_<SolverType, boost::noncopyable>(
121 "A proximal, augmented Lagrangian solver, using a DDP-type scheme to "
123 "search directions and feedforward, feedback gains."
124 " The solver instance initializes both a Workspace and a Results "
128 (
"self"_a,
"tol",
"mu_init"_a = 1e-2,
"max_iters"_a = 1000,
132 .def(
"cycleProblem", &SolverType::cycleProblem,
133 (
"self"_a,
"problem",
"data"),
134 "Cycle the problem data (for MPC applications).")
135 .def_readwrite(
"bcl_params", &SolverType::bcl_params,
137 .def_readwrite(
"max_refinement_steps",
138 &SolverType::max_refinement_steps_)
139 .def_readwrite(
"refinement_threshold",
140 &SolverType::refinement_threshold_)
141 .def_readwrite(
"linear_solver_choice",
142 &SolverType::linear_solver_choice)
143 .def_readwrite(
"multiplier_update_mode",
144 &SolverType::multiplier_update_mode)
145 .def_readwrite(
"mu_init", &SolverType::mu_init,
146 "Initial AL penalty parameter.")
147 .add_property(
"mu", &SolverType::mu)
149 "rollout_max_iters", &SolverType::rollout_max_iters,
150 "Maximum number of iterations when solving the forward dynamics.")
151 .def_readwrite(
"max_al_iters", &SolverType::max_al_iters,
152 "Maximum number of AL iterations.")
153 .def_readwrite(
"ls_mode", &SolverType::ls_mode,
"Linesearch mode.")
154 .def_readwrite(
"sa_strategy", &SolverType::sa_strategy_,
155 "StepAcceptance strategy.")
156 .def_readwrite(
"rollout_type", &SolverType::rollout_type_,
158 .def_readwrite(
"dual_weight", &SolverType::dual_weight,
159 "Dual penalty weight.")
160 .def_readwrite(
"reg_min", &SolverType::reg_min,
161 "Minimum regularization value.")
162 .def_readwrite(
"reg_max", &SolverType::reg_max,
163 "Maximum regularization value.")
164 .def(
"updateLQSubproblem", &SolverType::updateLQSubproblem,
"self"_a)
165 .def(
"computeCriterion", &SolverType::computeCriterion,
"self"_a,
166 "Compute problem stationarity.")
167 .add_property(
"linearSolver",
168 bp::make_getter(&SolverType::linearSolver_,
169 eigenpy::ReturnInternalStdUniquePtr{}),
170 "Linear solver for the semismooth Newton method.")
171 .def_readwrite(
"filter", &SolverType::filter_,
172 "Pair filter used to accept a step.")
173 .def(
"computeInfeasibilities", &SolverType::computeInfeasibilities,
174 (
"self"_a,
"problem"),
"Compute problem infeasibilities.")
175 .add_property(
"num_threads", &SolverType::getNumThreads)
176 .def(
"setNumThreads", &SolverType::setNumThreads,
177 (
"self"_a,
"num_threads"))
178 .add_property(
"target_dual_tol", &SolverType::getDualTolerance)
179 .def(
"setDualTolerance", &SolverType::setDualTolerance,
181 "Manually set the solver's dual infeasibility tolerance. Once "
182 "this method is called, the dual tolerance and primal tolerance "
183 "(target_tol) will not be synced when the latter changes and "
184 "`solver.run()` is called.")
186 .add_property(
"linesearch",
188 +[](
const SolverType &s) ->
const ls_variant_t & {
189 return s.linesearch_;
191 eigenpy::ReturnInternalVariant<ls_variant_t>{}))
192 .def(
"run", &SolverType::run,
193 (
"self"_a,
"problem",
"xs_init"_a = bp::list(),
194 "us_init"_a = bp::list(),
"vs_init"_a = bp::list(),
195 "lams_init"_a = bp::list()),
196 "Run the algorithm. Can receive initial guess for "
197 "multiplier trajectory.");
200 using AlmParams = SolverType::AlmParams;
201 bp::scope scope{cls};
202#define _c(name) def_readwrite(#name, &AlmParams::name)
203 bp::class_<AlmParams>(
"AlmParams",
"Parameters for the ALM algorithm",
204 bp::init<>(
"self"_a))
209 ._c(mu_update_factor)
WorkspaceTpl< Scalar > Workspace
ResultsTpl< Scalar > Results
TrajOptProblemTpl< Scalar > TrajOptProblem