21 #include "Eigen/SparseCore"
22 #include "absl/status/status.h"
23 #include "absl/status/statusor.h"
24 #include "absl/strings/str_cat.h"
25 #include "absl/strings/string_view.h"
26 #include "ortools/linear_solver/linear_solver.pb.h"
30 #include "ortools/pdlp/solvers.pb.h"
31 #include "pybind11/eigen.h"
32 #include "pybind11/pybind11.h"
33 #include "pybind11/pytypes.h"
34 #include "pybind11/stl.h"
36 namespace pdlp = ::operations_research::pdlp;
37 using ::operations_research::MPModelProto;
38 using ::operations_research::pdlp::QuadraticProgram;
39 using ::pybind11::arg;
62 pybind11::class_<QuadraticProgram>(m,
"QuadraticProgram")
63 .def(pybind11::init<>())
64 .def(
"resize_and_initialize", &QuadraticProgram::ResizeAndInitialize)
65 .def(
"apply_objective_scaling_and_offset",
66 &QuadraticProgram::ApplyObjectiveScalingAndOffset)
68 .def_readwrite(
"constraint_matrix", &QuadraticProgram::constraint_matrix)
69 .def_readwrite(
"constraint_lower_bounds",
70 &QuadraticProgram::constraint_lower_bounds)
71 .def_readwrite(
"constraint_upper_bounds",
72 &QuadraticProgram::constraint_upper_bounds)
73 .def_readwrite(
"variable_lower_bounds",
75 .def_readwrite(
"variable_upper_bounds",
77 .def_readwrite(
"problem_name", &QuadraticProgram::problem_name)
78 .def_readwrite(
"variable_names", &QuadraticProgram::variable_names)
79 .def_readwrite(
"constraint_names", &QuadraticProgram::constraint_names)
80 .def_readwrite(
"objective_offset", &QuadraticProgram::objective_offset)
81 .def_readwrite(
"objective_scaling_factor",
82 &QuadraticProgram::objective_scaling_factor)
87 .def_readonly(
"objective_matrix", &QuadraticProgram::objective_matrix)
88 .def(
"set_objective_matrix_diagonal",
89 [](QuadraticProgram& qp,
91 qp.objective_matrix.emplace();
94 .def(
"clear_objective_matrix",
95 [](QuadraticProgram& qp) { qp.objective_matrix.reset(); });
97 m.def(
"validate_quadratic_program_dimensions",
98 [](
const QuadraticProgram& qp) {
99 const absl::Status
status =
104 throw std::invalid_argument(absl::StrCat(
status.message()));
111 "qp_from_mpmodel_proto",
112 [](absl::string_view proto_str,
bool relax_integer_variables,
113 bool include_names) {
115 if (!
proto.ParseFromString(std::string(proto_str))) {
116 throw std::invalid_argument(
"Unable to parse input proto");
119 proto, relax_integer_variables, include_names);
123 throw std::invalid_argument(absl::StrCat(qp.status().message()));
126 arg(
"proto_str"), arg(
"relax_integer_variables"),
127 arg(
"include_names") =
false);
129 m.def(
"qp_to_mpmodel_proto", [](
const QuadraticProgram& qp) {
132 return pybind11::bytes(
proto->SerializeAsString());
134 throw std::invalid_argument(absl::StrCat(
proto.status().message()));
143 arg(
"filename"), arg(
"include_names") =
false);
149 pybind11::class_<pdlp::PrimalAndDualSolution>(m,
"PrimalAndDualSolution")
150 .def(pybind11::init<>())
151 .def_readwrite(
"primal_solution",
153 .def_readwrite(
"dual_solution",
156 pybind11::class_<PywrapSolverResult>(m,
"SolverResult")
157 .def(pybind11::init<>())
165 "primal_dual_hybrid_gradient",
166 [](QuadraticProgram qp, absl::string_view params_str,
167 std::optional<pdlp::PrimalAndDualSolution> initial_solution) {
168 pdlp::PrimalDualHybridGradientParams params;
169 if (!params.ParseFromString(std::string(params_str))) {
170 throw std::invalid_argument(
"Unable to parse input params");
173 std::move(qp), params, std::move(initial_solution));
175 .primal_solution = std::move(result.primal_solution),
176 .dual_solution = std::move(result.dual_solution),
177 .reduced_costs = std::move(result.reduced_costs),
178 .solve_log_str = result.solve_log.SerializeAsString()};
180 arg(
"qp"), arg(
"params"), arg(
"initial_solution") = std::nullopt);
absl::StatusOr< QuadraticProgram > QpFromMpModelProto(const MPModelProto &proto, bool relax_integer_variables, bool include_names)
absl::Status ValidateQuadraticProgramDimensions(const QuadraticProgram &qp)
absl::StatusOr< MPModelProto > QpToMpModelProto(const QuadraticProgram &qp)
bool IsLinearProgram(const QuadraticProgram &qp)
SolverResult PrimalDualHybridGradient(QuadraticProgram qp, const PrimalDualHybridGradientParams ¶ms, const std::atomic< bool > *interrupt_solve, IterationStatsCallback iteration_stats_callback)
QuadraticProgram ReadQuadraticProgramOrDie(const std::string &filename, bool include_names)
PYBIND11_MODULE(pywrap_pdlp, m)
Eigen::VectorXd dual_solution
pybind11::bytes solve_log_str
Eigen::VectorXd reduced_costs
Eigen::VectorXd primal_solution
Eigen::VectorXd dual_solution
Eigen::VectorXd primal_solution
VectorXd variable_lower_bounds
VectorXd variable_upper_bounds
VectorXd objective_vector
VectorXd objective_matrix_diagonal