52#ifdef LINE_MP_HAVE_HIGHS
59#ifdef LINE_MP_HAVE_HIGHS
68inline LpSolution<double> highs_solve(
const LpModel<double>& model) {
69 LpSolution<double> out;
70 const std::size_t n = model.num_vars(), m = model.num_rows();
73 hm.lp_.num_col_ =
static_cast<HighsInt
>(n);
74 hm.lp_.num_row_ =
static_cast<HighsInt
>(m);
75 hm.lp_.sense_ = model.maximize() ? ObjSense::kMaximize : ObjSense::kMinimize;
77 hm.lp_.col_cost_ = model.costs();
78 hm.lp_.col_lower_.resize(n);
79 hm.lp_.col_upper_.resize(n);
80 for (std::size_t j = 0; j < n; ++j) {
81 hm.lp_.col_lower_[j] = model.lower_is_free(j) ? -kHighsInf : model.lower(j);
82 hm.lp_.col_upper_[j] = model.upper_is_free(j) ? kHighsInf : model.upper(j);
85 hm.lp_.row_lower_.resize(m);
86 hm.lp_.row_upper_.resize(m);
91 hm.lp_.a_matrix_.num_col_ =
static_cast<HighsInt
>(n);
92 hm.lp_.a_matrix_.num_row_ =
static_cast<HighsInt
>(m);
93 hm.lp_.a_matrix_.format_ = MatrixFormat::kRowwise;
99 hm.lp_.a_matrix_.start_.clear();
100 hm.lp_.a_matrix_.start_.reserve(m + 1);
101 hm.lp_.a_matrix_.index_.reserve(model.num_nonzeros());
102 hm.lp_.a_matrix_.value_.reserve(model.num_nonzeros());
103 hm.lp_.a_matrix_.start_.push_back(0);
104 for (std::size_t i = 0; i < m; ++i) {
105 const double b = model.rhs(i);
106 switch (model.sense(i)) {
108 hm.lp_.row_lower_[i] = -kHighsInf;
109 hm.lp_.row_upper_[i] = b;
112 hm.lp_.row_lower_[i] = b;
113 hm.lp_.row_upper_[i] = kHighsInf;
116 hm.lp_.row_lower_[i] = b;
117 hm.lp_.row_upper_[i] = b;
120 for (std::size_t k = model.row_begin(i); k < model.row_end(i); ++k) {
121 hm.lp_.a_matrix_.index_.push_back(
static_cast<HighsInt
>(model.col_at(k)));
122 hm.lp_.a_matrix_.value_.push_back(model.val_at(k));
124 hm.lp_.a_matrix_.start_.push_back(
static_cast<HighsInt
>(hm.lp_.a_matrix_.index_.size()));
128 highs.setOptionValue(
"output_flag",
false);
134 if (highs.passModel(hm) == HighsStatus::kError) {
138 if (highs.run() == HighsStatus::kError) {
143 const HighsModelStatus st = highs.getModelStatus();
144 if (st == HighsModelStatus::kOptimal) {
146 }
else if (st == HighsModelStatus::kUnbounded) {
149 }
else if (st == HighsModelStatus::kIterationLimit ||
150 st == HighsModelStatus::kTimeLimit) {
158 out.objective = highs.getInfo().objective_function_value;
159 out.iterations =
static_cast<std::size_t
>(highs.getInfo().simplex_iteration_count);
160 out.x = highs.getSolution().col_value;
177 (void)dense_max_cols;
181#ifdef LINE_MP_HAVE_HIGHS
183inline LpSolution<double>
lp_solve(
const LpModel<double>& model, std::size_t dense_max_cols) {
184 if (model.num_vars() > dense_max_cols)
return highs_solve(model);