| Directory: | ./ |
|---|---|
| File: | bindings/python/crocoddyl/core/solvers/box-qp.cpp |
| Date: | 2025-03-26 19:23:43 |
| Exec | Total | Coverage | |
|---|---|---|---|
| Lines: | 48 | 53 | 90.6% |
| Branches: | 47 | 94 | 50.0% |
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /////////////////////////////////////////////////////////////////////////////// | ||
| 2 | // BSD 3-Clause License | ||
| 3 | // | ||
| 4 | // Copyright (C) 2020-2023, University of Edinburgh, Heriot-Watt University | ||
| 5 | // Copyright note valid unless otherwise stated in individual files. | ||
| 6 | // All rights reserved. | ||
| 7 | /////////////////////////////////////////////////////////////////////////////// | ||
| 8 | |||
| 9 | #include "crocoddyl/core/solvers/box-qp.hpp" | ||
| 10 | |||
| 11 | #include "python/crocoddyl/core/core.hpp" | ||
| 12 | #include "python/crocoddyl/utils/copyable.hpp" | ||
| 13 | #include "python/crocoddyl/utils/deprecate.hpp" | ||
| 14 | |||
| 15 | namespace crocoddyl { | ||
| 16 | namespace python { | ||
| 17 | |||
| 18 | 10 | void exposeSolverBoxQP() { | |
| 19 | 10 | bp::register_ptr_to_python<std::shared_ptr<BoxQPSolution> >(); | |
| 20 | |||
| 21 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | bp::class_<BoxQPSolution>( |
| 22 | "BoxQPSolution", "Solution data of the box QP.\n\n", | ||
| 23 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | bp::init<Eigen::MatrixXd, Eigen::VectorXd, std::vector<size_t>, |
| 24 | std::vector<size_t> >( | ||
| 25 | 20 | bp::args("self", "Hff_inv", "x", "free_idx", "clamped_idx"), | |
| 26 | "Initialize the data for the box-QP solution.\n\n" | ||
| 27 | ":param Hff_inv: inverse of the free Hessian\n" | ||
| 28 | ":param x: decision variable\n" | ||
| 29 | ":param free_idx: free indexes\n" | ||
| 30 | ":param clamped_idx: clamped indexes")) | ||
| 31 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | .add_property("Hff_inv", |
| 32 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | bp::make_getter(&BoxQPSolution::Hff_inv, |
| 33 | ✗ | bp::return_internal_reference<>()), | |
| 34 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
20 | bp::make_setter(&BoxQPSolution::Hff_inv), |
| 35 | "inverse of the free Hessian matrix") | ||
| 36 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | .add_property( |
| 37 | "x", | ||
| 38 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | bp::make_getter(&BoxQPSolution::x, bp::return_internal_reference<>()), |
| 39 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
20 | bp::make_setter(&BoxQPSolution::x), "decision variable") |
| 40 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | .add_property( |
| 41 | "free_idx", | ||
| 42 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | bp::make_getter(&BoxQPSolution::free_idx, |
| 43 | ✗ | bp::return_value_policy<bp::return_by_value>()), | |
| 44 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
20 | bp::make_setter(&BoxQPSolution::free_idx), "free indexes") |
| 45 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | .add_property( |
| 46 | "clamped_idx", | ||
| 47 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | bp::make_getter(&BoxQPSolution::clamped_idx, |
| 48 | ✗ | bp::return_value_policy<bp::return_by_value>()), | |
| 49 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
20 | bp::make_setter(&BoxQPSolution::clamped_idx), "clamped indexes") |
| 50 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | .def(CopyableVisitor<BoxQPSolution>()); |
| 51 | |||
| 52 | 10 | bp::register_ptr_to_python<std::shared_ptr<BoxQP> >(); | |
| 53 | |||
| 54 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | bp::class_<BoxQP>( |
| 55 | "BoxQP", | ||
| 56 | "Projected-Newton QP for only bound constraints.\n\n" | ||
| 57 | "It solves a QP problem with bound constraints of the form:\n" | ||
| 58 | " x = argmin 0.5 x^T H x + q^T x\n" | ||
| 59 | " subject to: lb <= x <= ub" | ||
| 60 | "where nx is the number of decision variables.", | ||
| 61 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | bp::init<std::size_t, bp::optional<std::size_t, double, double, double> >( |
| 62 | 20 | bp::args("self", "nx", "maxiter", "th_acceptstep", "th_grad", "reg"), | |
| 63 | "Initialize the Projected-Newton QP for bound constraints.\n\n" | ||
| 64 | ":param nx: dimension of the decision vector\n" | ||
| 65 | ":param maxiter: maximum number of allowed iterations (default 100)\n" | ||
| 66 | ":param th_acceptstep: acceptance step condition (default 0.1)\n" | ||
| 67 | ":param th_grad: gradient tolerance condition (default 1e-9)\n" | ||
| 68 | ":param reg: regularization (default 1e-9)")) | ||
| 69 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | .def("solve", &BoxQP::solve, |
| 70 | ✗ | bp::return_value_policy<bp::return_by_value>(), | |
| 71 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
20 | bp::args("H", "q", "lb", "ub", "xinit"), |
| 72 | "Compute the solution of bound-constrained QP based on Newton " | ||
| 73 | "projection.\n\n" | ||
| 74 | ":param H: Hessian (dimension nx * nx)\n" | ||
| 75 | ":param q: gradient (dimension nx)\n" | ||
| 76 | ":param lb: lower bound (dimension nx)\n" | ||
| 77 | ":param ub: upper bound (dimension nx)\n" | ||
| 78 | ":param xinit: initial guess") | ||
| 79 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | .add_property("solution", |
| 80 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | bp::make_function( |
| 81 | &BoxQP::get_solution, | ||
| 82 | 10 | bp::return_value_policy<bp::copy_const_reference>()), | |
| 83 | "QP solution.") | ||
| 84 |
2/4✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
10 | .add_property("nx", bp::make_function(&BoxQP::get_nx), |
| 85 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
20 | bp::make_function(&BoxQP::set_nx), |
| 86 | "dimension of the decision vector.") | ||
| 87 |
2/4✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
10 | .add_property("maxIter", bp::make_function(&BoxQP::get_maxiter), |
| 88 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
20 | bp::make_function(&BoxQP::set_maxiter), |
| 89 | "maximum number of allowed iterations.") | ||
| 90 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | .add_property("maxiter", |
| 91 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | bp::make_function(&BoxQP::get_maxiter, |
| 92 |
2/4✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
|
20 | deprecated<>("Deprecated. Use maxIter")), |
| 93 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
20 | bp::make_function(&BoxQP::set_maxiter, |
| 94 |
2/4✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
|
20 | deprecated<>("Deprecated. Use maxIter")), |
| 95 | "maximum number of allowed iterations.") | ||
| 96 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | .add_property("th_acceptStep", |
| 97 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | bp::make_function(&BoxQP::get_th_acceptstep), |
| 98 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
20 | bp::make_function(&BoxQP::set_th_acceptstep), |
| 99 | "acceptable reduction ration.") | ||
| 100 |
2/4✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
10 | .add_property("th_grad", bp::make_function(&BoxQP::get_th_grad), |
| 101 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
20 | bp::make_function(&BoxQP::set_th_grad), |
| 102 | "convergence tolerance.") | ||
| 103 |
2/4✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
10 | .add_property("reg", bp::make_function(&BoxQP::get_reg), |
| 104 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
20 | bp::make_function(&BoxQP::set_reg), "regularization value.") |
| 105 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | .add_property("alphas", |
| 106 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | bp::make_function( |
| 107 | &BoxQP::get_alphas, | ||
| 108 | ✗ | bp::return_value_policy<bp::copy_const_reference>()), | |
| 109 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
20 | bp::make_function(&BoxQP::set_alphas), |
| 110 | "list of step length (alpha) values") | ||
| 111 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | .def(CopyableVisitor<BoxQP>()); |
| 112 | 10 | } | |
| 113 | |||
| 114 | } // namespace python | ||
| 115 | } // namespace crocoddyl | ||
| 116 |