46 static absl::StatusOr<std::unique_ptr<SolverInterface>>
New(
49 absl::StatusOr<SolveResultProto>
Solve(
56 absl::StatusOr<ComputeInfeasibleSubsystemResultProto>
62 struct SolutionClaims {
63 bool highs_returned_primal_feasible_solution =
false;
64 bool highs_returned_dual_feasible_solution =
false;
65 bool highs_returned_primal_ray =
false;
66 bool highs_returned_dual_ray =
false;
68 struct SolutionsAndClaims {
69 std::vector<SolutionProto> solutions;
71 SolutionClaims solution_claims;
80 struct IndexAndBound {
91 bool bounds_cross()
const {
return lb > ub; }
96 double rounded_lb()
const {
return is_integer ? std::ceil(lb) : lb; }
97 double rounded_ub()
const {
return is_integer ? std::floor(ub) : ub; }
98 bool rounded_bounds_cross()
const {
return rounded_lb() > rounded_ub(); }
100 IndexAndBound(
int index,
double lb,
double ub,
bool is_integer)
101 : index(index), lb(lb), ub(ub), is_integer(is_integer) {}
103 HighsSolver(std::unique_ptr<Highs> highs,
104 absl::flat_hash_map<int64_t, IndexAndBound> variable_data,
105 absl::flat_hash_map<int64_t, IndexAndBound> lin_con_data)
106 : highs_(std::move(highs)),
107 variable_data_(std::move(variable_data)),
108 lin_con_data_(std::move(lin_con_data)) {}
110 absl::StatusOr<bool> PrimalRayReturned()
const;
111 absl::StatusOr<bool> DualRayReturned()
const;
115 absl::StatusOr<SolutionsAndClaims> ExtractSolutionAndRays(
118 static absl::StatusOr<FeasibilityStatusProto> PrimalFeasibilityStatus(
119 SolutionClaims solution_claims);
120 static absl::StatusOr<FeasibilityStatusProto> DualFeasibilityStatus(
121 const HighsInfo& highs_info,
bool is_integer,
122 SolutionClaims solution_claims);
123 static absl::StatusOr<TerminationProto> MakeTermination(
124 HighsModelStatus highs_model_status,
const HighsInfo& highs_info,
125 bool is_integer,
bool had_node_limit,
bool had_solution_limit,
126 bool is_maximize, SolutionClaims solution_claims);
130 absl::StatusOr<std::optional<BasisProto>> ExtractBasis();
132 template <
typename T>
133 absl::Status EnsureOneEntryPerVariable(
const std::vector<T>& vec) {
134 if (vec.size() != variable_data_.size()) {
136 <<
"expected one entry per variable, but model had "
137 << variable_data_.size() <<
" variables and found " << vec.size()
140 return absl::OkStatus();
143 template <
typename T>
144 absl::Status EnsureOneEntryPerLinearConstraint(
const std::vector<T>& vec) {
145 if (vec.size() != lin_con_data_.size()) {
147 <<
"expected one entry per linear constraint, but model had "
148 << lin_con_data_.size() <<
" linear constraints and found "
149 << vec.size() <<
" elements";
151 return absl::OkStatus();
161 bool is_maximize,
double objective_offset,
162 const absl::flat_hash_map<int64_t, IndexAndBound>& lin_con_data);
166 std::unique_ptr<Highs> highs_;
169 absl::flat_hash_map<int64_t, IndexAndBound> variable_data_;
172 absl::flat_hash_map<int64_t, IndexAndBound> lin_con_data_;
absl::StatusOr< SolveResultProto > Solve(const SolveParametersProto ¶meters, const ModelSolveParametersProto &model_parameters, MessageCallback message_cb, const CallbackRegistrationProto &callback_registration, Callback cb, const SolveInterrupter *interrupter) override