47 static absl::StatusOr<std::unique_ptr<SolverInterface>>
New(
50 absl::StatusOr<SolveResultProto>
Solve(
57 absl::StatusOr<ComputeInfeasibleSubsystemResultProto>
63 struct SolutionClaims {
64 bool highs_returned_primal_feasible_solution =
false;
65 bool highs_returned_dual_feasible_solution =
false;
66 bool highs_returned_primal_ray =
false;
67 bool highs_returned_dual_ray =
false;
69 struct SolutionsAndClaims {
70 std::vector<SolutionProto> solutions;
72 SolutionClaims solution_claims;
81 struct IndexAndBound {
92 bool bounds_cross()
const {
return lb > ub; }
97 double rounded_lb()
const {
return is_integer ? std::ceil(lb) : lb; }
98 double rounded_ub()
const {
return is_integer ? std::floor(ub) : ub; }
99 bool rounded_bounds_cross()
const {
return rounded_lb() > rounded_ub(); }
101 IndexAndBound(
int index,
double lb,
double ub,
bool is_integer)
102 : index(index), lb(lb), ub(ub), is_integer(is_integer) {}
104 HighsSolver(std::unique_ptr<Highs> highs,
105 absl::flat_hash_map<int64_t, IndexAndBound> variable_data,
106 absl::flat_hash_map<int64_t, IndexAndBound> lin_con_data)
107 : highs_(std::move(highs)),
108 variable_data_(std::move(variable_data)),
109 lin_con_data_(std::move(lin_con_data)) {}
111 absl::StatusOr<bool> PrimalRayReturned()
const;
112 absl::StatusOr<bool> DualRayReturned()
const;
116 absl::StatusOr<SolutionsAndClaims> ExtractSolutionAndRays(
119 static absl::StatusOr<FeasibilityStatusProto> PrimalFeasibilityStatus(
120 SolutionClaims solution_claims);
121 static absl::StatusOr<FeasibilityStatusProto> DualFeasibilityStatus(
122 const HighsInfo& highs_info,
bool is_integer,
123 SolutionClaims solution_claims);
124 static absl::StatusOr<TerminationProto> MakeTermination(
125 HighsModelStatus highs_model_status,
const HighsInfo& highs_info,
126 bool is_integer,
bool had_node_limit,
bool had_solution_limit,
127 bool is_maximize, SolutionClaims solution_claims);
131 absl::StatusOr<std::optional<BasisProto>> ExtractBasis();
133 template <
typename T>
134 absl::Status EnsureOneEntryPerVariable(
const std::vector<T>& vec) {
135 if (vec.size() != variable_data_.size()) {
137 <<
"expected one entry per variable, but model had "
138 << variable_data_.size() <<
" variables and found " << vec.size()
141 return absl::OkStatus();
144 template <
typename T>
145 absl::Status EnsureOneEntryPerLinearConstraint(
const std::vector<T>& vec) {
146 if (vec.size() != lin_con_data_.size()) {
148 <<
"expected one entry per linear constraint, but model had "
149 << lin_con_data_.size() <<
" linear constraints and found "
150 << vec.size() <<
" elements";
152 return absl::OkStatus();
162 bool is_maximize,
double objective_offset,
163 const absl::flat_hash_map<int64_t, IndexAndBound>& lin_con_data);
167 std::unique_ptr<Highs> highs_;
170 absl::flat_hash_map<int64_t, IndexAndBound> variable_data_;
173 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 *absl_nullable interrupter) override