21#include "absl/base/attributes.h"
22#include "absl/log/check.h"
23#include "absl/status/status.h"
24#include "absl/status/statusor.h"
25#include "absl/strings/str_cat.h"
45 return interrupt ==
nullptr;
48 std::atomic<bool>* interrupt)
override {
49 DCHECK_EQ(interrupt,
nullptr);
50 const bool log_error = request->enable_internal_solver_output();
56 void Reset()
override;
64 double new_value,
double old_value)
override;
67 double coefficient)
override;
73 int64_t
nodes()
const override;
79 bool IsLP()
const override;
80 bool IsMIP()
const override;
97 const std::string& parameters)
override;
101 void NonIncrementalChange();
103 const bool solve_as_a_mip_;
104 std::optional<HighsSolveInfo> solve_info_;
118 for (
int i = 0; i <
solver_->variables_.size(); ++i) {
121 for (
int i = 0; i <
solver_->constraints_.size(); ++i) {
126 solver_->ExportModelToProto(&model_proto);
136 solver_->solver_specific_parameter_string_);
139 static_cast<double>(
solver_->time_limit()) / 1000.0);
144 absl::StatusOr<MPSolutionResponse> response =
147 if (!response.ok()) {
148 LOG(ERROR) <<
"Unexpected error solving with Highs: " << response.status();
158 const absl::Status result =
solver_->LoadSolutionFromProto(*response);
160 LOG(ERROR) <<
"LoadSolutionFromProto failed: " << result;
173 NonIncrementalChange();
177 NonIncrementalChange();
181 NonIncrementalChange();
185 NonIncrementalChange();
189 NonIncrementalChange();
193 NonIncrementalChange();
198 double new_value,
double old_value) {
199 NonIncrementalChange();
203 NonIncrementalChange();
207 double coefficient) {
208 NonIncrementalChange();
212 NonIncrementalChange();
222 QCHECK(solve_info_.has_value())
223 <<
"Number of nodes only available after solve";
224 return solve_info_->mip_node_count;
262 if (num_threads < 1) {
263 return absl::InvalidArgumentError(
264 absl::StrCat(
"Invalid number of threads: ", num_threads));
267 return absl::OkStatus();
279 const std::string& parameters) {
284void HighsInterface::NonIncrementalChange() {
292const void*
const kRegisterHighsLp ABSL_ATTRIBUTE_UNUSED = [] {
294 [](MPSolver* solver) {
return new HighsInterface(solver,
false); },
300const void*
const kRegisterHighsMip ABSL_ATTRIBUTE_UNUSED = [] {
MPSolver::BasisStatus row_status(int constraint_index) const override
void SetConstraintBounds(int index, double lb, double ub) override
absl::Status SetNumThreads(int num_threads) override
int64_t nodes() const override
bool IsContinuous() const override
void AddVariable(MPVariable *var) override
void SetObjectiveCoefficient(const MPVariable *variable, double coefficient) override
bool IsMIP() const override
bool SupportsDirectlySolveProto(std::atomic< bool > *interrupt) const override
bool IsLP() const override
MPSolver::ResultStatus Solve(const MPSolverParameters ¶m) override
void SetCoefficient(MPConstraint *constraint, const MPVariable *variable, double new_value, double old_value) override
MPSolutionResponse DirectlySolveProto(LazyMutableCopy< MPModelRequest > request, std::atomic< bool > *interrupt) override
bool SetSolverSpecificParametersAsString(const std::string ¶meters) override
int64_t iterations() const override
void SetPresolveMode(int value) override
void SetVariableInteger(int index, bool integer) override
void SetScalingMode(int value) override
void SetVariableBounds(int index, double lb, double ub) override
void * underlying_solver() override
std::string SolverVersion() const override
MPSolver::BasisStatus column_status(int variable_index) const override
void SetDualTolerance(double value) override
void SetRelativeMipGap(double value) override
void ClearObjective() override
HighsInterface(MPSolver *solver, bool solve_as_a_mip)
void SetParameters(const MPSolverParameters ¶m) override
~HighsInterface() override
void ExtractNewVariables() override
void AddRowConstraint(MPConstraint *ct) override
void SetOptimizationDirection(bool maximize) override
void SetPrimalTolerance(double value) override
void ClearConstraint(MPConstraint *constraint) override
void ExtractObjective() override
void ExtractNewConstraints() override
void SetLpAlgorithm(int value) override
void SetObjectiveOffset(double value) override
void set_enable_internal_solver_output(bool value)
void set_solver_specific_parameters(Arg_ &&arg, Args_... args)
static constexpr SolverType HIGHS_LINEAR_PROGRAMMING
static constexpr SolverType HIGHS_MIXED_INTEGER_PROGRAMMING
::operations_research::MPModelProto *PROTOBUF_NONNULL mutable_model()
void set_solver_type(::operations_research::MPModelRequest_SolverType value)
void set_solver_time_limit_seconds(double value)
static MPSolverInterfaceFactoryRepository * GetInstance()
void Register(MPSolverInterfaceFactory factory, MPSolver::OptimizationProblemType problem_type, std::function< bool()> is_runtime_ready={})
void set_variable_as_extracted(int var_index, bool extracted)
friend class MPConstraint
void set_constraint_as_extracted(int ct_index, bool extracted)
void ResetExtractionInformation()
MPSolverInterface(MPSolver *solver)
void SetCommonParameters(const MPSolverParameters ¶m)
MPSolver::ResultStatus result_status_
SynchronizationStatus sync_status_
@ ABNORMAL
abnormal, i.e., error of some kind.
@ HIGHS_MIXED_INTEGER_PROGRAMMING
@ HIGHS_LINEAR_PROGRAMMING
The class for variables of a Mathematical Programming (MP) model.
absl::StatusOr< MPSolutionResponse > HighsSolveProto(LazyMutableCopy< MPModelRequest > request, HighsSolveInfo *solve_info)
MPSolutionResponse ConvertStatusOrMPSolutionResponse(bool log_error, absl::StatusOr< MPSolutionResponse > response)