From 36f4f5dd31d49cb815518dcbba091f3047126cfd Mon Sep 17 00:00:00 2001 From: JAJHall Date: Sun, 5 Jan 2025 18:04:19 +0000 Subject: [PATCH] Added getDualRay, getDualUnboundednessDirection and getPrimalRay to highspy --- docs/src/interfaces/python/example-py.md | 8 ++++ src/highs_bindings.cpp | 54 ++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/docs/src/interfaces/python/example-py.md b/docs/src/interfaces/python/example-py.md index d47bdd9b54..7f026fb903 100644 --- a/docs/src/interfaces/python/example-py.md +++ b/docs/src/interfaces/python/example-py.md @@ -254,6 +254,14 @@ print('Basis validity = ', h.basisValidityToString(info.basis_validity)) * `getReducedColumn` * `getReducedColumnSparse` +## Rays and unboundedness + + * `getDualRayExist` + * `getDualRay` + * `getDualUnboundednessDirectionExist` + * `getDualUnboundednessDirection` + * `getPrimalRayExist` + * `getPrimalRay` ## Multi-objective optimization diff --git a/src/highs_bindings.cpp b/src/highs_bindings.cpp index 4e5ebaff79..c9b6c42269 100644 --- a/src/highs_bindings.cpp +++ b/src/highs_bindings.cpp @@ -373,6 +373,54 @@ highs_getReducedColumnSparse(Highs* h, HighsInt col) { return std::make_tuple(status, py::cast(solution_vector), solution_num_nz, py::cast(solution_index)); } +std::tuple highs_getDualRayExist(Highs* h) { + bool has_dual_ray; + HighsStatus status = h->getDualRay(has_dual_ray); + return std::make_tuple(status, has_dual_ray); +} + +std::tuple> highs_getDualRay(Highs* h) { + HighsInt num_row = h->getNumRow(); + bool has_dual_ray; + HighsStatus status = HighsStatus::kOk; + std::vector value(num_row); + double* value_ptr = static_cast(value.data()); + if (num_row > 0) status = h->getDualRay(has_dual_ray, value_ptr); + return std::make_tuple(status, has_dual_ray, py::cast(value)); +} + +std::tuple highs_getDualUnboundednessDirectionExist(Highs* h) { + bool has_dual_unboundedness_direction; + HighsStatus status = h->getDualUnboundednessDirection(has_dual_unboundedness_direction); + return std::make_tuple(status, has_dual_unboundedness_direction); +} + +std::tuple> highs_getDualUnboundednessDirection(Highs* h) { + HighsInt num_col = h->getNumCol(); + bool has_dual_unboundedness_direction; + HighsStatus status = HighsStatus::kOk; + std::vector value(num_col); + double* value_ptr = static_cast(value.data()); + if (num_col > 0) status = h->getDualUnboundednessDirection(has_dual_unboundedness_direction, value_ptr); + return std::make_tuple(status, has_dual_unboundedness_direction, py::cast(value)); +} + +std::tuple highs_getPrimalRayExist(Highs* h) { + bool has_primal_ray; + HighsStatus status = h->getPrimalRay(has_primal_ray); + return std::make_tuple(status, has_primal_ray); +} + +std::tuple> highs_getPrimalRay(Highs* h) { + HighsInt num_col = h->getNumCol(); + bool has_primal_ray; + HighsStatus status = HighsStatus::kOk; + std::vector value(num_col); + double* value_ptr = static_cast(value.data()); + if (num_col > 0) status = h->getPrimalRay(has_primal_ray, value_ptr); + return std::make_tuple(status, has_primal_ray, py::cast(value)); +} + HighsStatus highs_addRow(Highs* h, double lower, double upper, HighsInt num_new_nz, dense_array_t indices, dense_array_t values) { @@ -1236,6 +1284,12 @@ PYBIND11_MODULE(_core, m, py::mod_gil_not_used()) { .def("getReducedRowSparse", &highs_getReducedRowSparse) .def("getReducedColumn", &highs_getReducedColumn) .def("getReducedColumnSparse", &highs_getReducedColumnSparse) + .def("getDualRayExist", &highs_getDualRayExist) + .def("getDualRay", &highs_getDualRay) + .def("getDualUnboundednessDirectionExist", &highs_getDualUnboundednessDirectionExist) + .def("getDualUnboundednessDirection", &highs_getDualUnboundednessDirection) + .def("getPrimalRayExist", &highs_getPrimalRayExist) + .def("getPrimalRay", &highs_getPrimalRay) .def("getNumCol", &Highs::getNumCol) .def("getNumRow", &Highs::getNumRow) .def("getNumNz", &Highs::getNumNz)