23#include "absl/log/check.h"
24#include "absl/log/die_if_null.h"
25#include "absl/memory/memory.h"
26#include "absl/status/status.h"
27#include "absl/status/statusor.h"
28#include "absl/strings/string_view.h"
29#include "absl/types/span.h"
38bool checkInt32Overflow(
const std::size_t value) {
return value >
INT32_MAX; }
41T* forwardSpan(std::optional<absl::Span<T>>
const& span) {
42 return span.has_value() ? span.value().data() :
nullptr;
48absl::Status Xpress::ToStatus(
const int xprs_err,
49 const absl::StatusCode code)
const {
51 return absl::OkStatus();
57 <<
"Xpress error code: " << xprs_err <<
", message: " << errmsg;
60 <<
" (message could not be fetched)";
64 initIntControlDefaults();
67absl::StatusOr<std::unique_ptr<Xpress>>
Xpress::New(absl::string_view) {
69 CHECK(correctlyLoaded);
72 return absl::WrapUnique(
new Xpress(model));
76 std::string truncated(name);
78 if (truncated.length() > maxLength.value_or(INT_MAX)) {
79 truncated = truncated.substr(0, maxLength.value_or(INT_MAX));
85 char const*,
int,
int),
86 void* cbdata,
int prio) {
91 char const*,
int,
int),
97 void* cbdata,
int prio) {
111void Xpress::initIntControlDefaults() {
113 for (
auto control : controls) {
114 int_control_defaults_[control] = GetIntControl(control).value();
120 return ToStatus(
XPRSaddnames(xpress_model_, type, names.data(), first, last));
129 const absl::Span<const double> obj,
130 const absl::Span<const double> lb,
131 const absl::Span<const double> ub,
132 const absl::Span<const char> vtype) {
134 if (checkInt32Overflow(count) ||
135 checkInt32Overflow(std::size_t(oldCols) + std::size_t(count))) {
136 return absl::InvalidArgumentError(
137 "XPRESS cannot handle more than 2^31 variables");
139 const int num_vars =
static_cast<int>(count);
140 double const* c_obj =
nullptr;
142 if (obj.size() != count)
143 return absl::InvalidArgumentError(
144 "Xpress::AddVars objective argument has bad size");
147 if (!lb.empty() && lb.size() != count)
148 return absl::InvalidArgumentError(
149 "Xpress::AddVars lower bound argument has bad size");
150 if (!ub.empty() && ub.size() != count)
151 return absl::InvalidArgumentError(
152 "Xpress::AddVars upper bound argument has bad size");
153 std::vector<int> colind;
154 if (!vtype.empty()) {
155 if (vtype.size() != count)
156 return absl::InvalidArgumentError(
157 "Xpress::AddVars type argument has bad size");
158 colind.reserve(count);
165 xpress_model_, num_vars, 0, c_obj,
nullptr,
nullptr,
nullptr,
166 lb.size() ? lb.data() :
nullptr, ub.size() ? ub.data() :
nullptr)));
167 if (!vtype.empty()) {
168 for (
int i = 0; i < num_vars; ++i) colind.push_back(oldCols + i);
170 XPRSchgcoltype(xpress_model_, num_vars, colind.data(), vtype.data());
174 XPRSdelcols(xpress_model_, num_vars, colind.data());
176 return ToStatus(ret);
178 return absl::OkStatus();
182 const absl::Span<const double> rhs,
183 const absl::Span<const double> rng) {
184 const int num_cons =
static_cast<int>(sense.size());
185 if (rhs.size() != num_cons) {
186 return absl::InvalidArgumentError(
187 "RHS must have one element per constraint.");
189 return ToStatus(
XPRSaddrows(xpress_model_, num_cons, 0, sense.data(),
190 rhs.data(), rng.data(),
nullptr,
nullptr,
195 const absl::Span<const double> rhs,
196 const absl::Span<const double> rng,
197 const absl::Span<const int> start,
198 const absl::Span<const int> colind,
199 const absl::Span<const double> rowcoef) {
200 const int num_cons =
static_cast<int>(rowtype.size());
201 if (rhs.size() != num_cons) {
202 return absl::InvalidArgumentError(
203 "RHS must have one element per constraint.");
205 if (start.size() != num_cons) {
206 return absl::InvalidArgumentError(
207 "START must have one element per constraint.");
209 if (colind.size() != rowcoef.size()) {
210 return absl::InvalidArgumentError(
211 "COLIND and ROWCOEF must be of the same size.");
213 return ToStatus(
XPRSaddrows(xpress_model_, num_cons, 0, rowtype.data(),
214 rhs.data(), rng.data(), start.data(),
215 colind.data(), rowcoef.data()));
224 double constant,
const absl::Span<const int> col_index,
225 const absl::Span<const double> obj_coeffs) {
226 static int indexes[1] = {-1};
227 double xprs_values[1] = {-constant};
229 <<
"Failed to set objective offset in XPRESS";
231 const int n_cols =
static_cast<int>(col_index.size());
233 XPRSchgobj(xpress_model_, n_cols, col_index.data(), obj_coeffs.data()));
237 const absl::Span<const int> colind1,
const absl::Span<const int> colind2,
238 const absl::Span<const double> coefficients) {
239 const int ncoefs =
static_cast<int>(coefficients.size());
240 return ToStatus(
XPRSchgmqobj(xpress_model_, ncoefs, colind1.data(),
241 colind2.data(), coefficients.data()));
245 absl::Span<const int> colind,
246 absl::Span<const double> values) {
248 return ToStatus(
XPRSchgmcoef64(xpress_model_, n_coefs, rowind.data(),
249 colind.data(), values.data()));
257 absl::Span<double> duals,
258 absl::Span<double> reducedCosts) {
259 return ToStatus(
XPRSgetlpsol(xpress_model_, primals.data(),
nullptr,
260 duals.data(), reducedCosts.data()));
270 XPRSoptimize(xpress_model_, flags.c_str(), p_solvestatus, p_solstatus));
283 <<
"Error getting Xpress int control: " << control;
292 if (int_control_defaults_.count(control)) {
294 int_control_defaults_[control]));
296 return absl::InvalidArgumentError(
297 "Default value unknown for control " + std::to_string(control) +
298 ", consider adding it to Xpress::initIntControlDefaults");
305 <<
"Error getting Xpress int64 control: " << control;
316 <<
"Error getting Xpress double control: " << control;
328 std::vector<char> result(nbytes,
331 xpress_model_, control, result.data(), nbytes, &nbytes)))
332 <<
"Error getting Xpress string control: " << control;
333 return std::string(result.data(), nbytes);
343 <<
"Error getting Xpress int attribute: " << attribute;
350 <<
"Error getting Xpress double attribute: " << attribute;
355 int attribute)
const {
359 <<
"Error getting Xpress objective double attribute: " << attribute;
369 <<
"Failed to retrieve dual status from XPRESS";
374 std::vector<int>& colBasis)
const {
377 rowBasis.resize(rows);
378 colBasis.resize(cols);
380 XPRSgetbasis(xpress_model_, rowBasis.data(), colBasis.data()));
384 std::vector<int>& colBasis)
const {
385 if (rowBasis.size() != colBasis.size()) {
386 return absl::InvalidArgumentError(
387 "Row basis and column basis must be of same size.");
390 XPRSloadbasis(xpress_model_, rowBasis.data(), colBasis.data()));
395 std::vector<double> bounds;
396 bounds.reserve(cols);
398 ToStatus(
XPRSgetlb(xpress_model_, bounds.data(), 0, cols - 1)))
399 <<
"Failed to retrieve variable LB from XPRESS";
404 std::vector<double> bounds;
405 bounds.reserve(cols);
407 ToStatus(
XPRSgetub(xpress_model_, bounds.data(), 0, cols - 1)))
408 <<
"Failed to retrieve variable UB from XPRESS";
418 if (ents != 0)
return true;
420 if (sets != 0)
return true;
425 std::optional<absl::Span<double>>
const& duals,
426 int first,
int last) {
428 XPRSgetduals(xpress_model_, p_status, forwardSpan(duals), first, last));
431 std::optional<absl::Span<double>>
const&
x,
432 int first,
int last) {
437 std::optional<absl::Span<double>>
const& dj,
438 int first,
int last) {
440 XPRSgetredcosts(xpress_model_, p_status, forwardSpan(dj), first, last));
447 absl::Span<int const> colind,
char const* name) {
448 if (checkInt32Overflow(colind.size()))
449 return absl::InvalidArgumentError(
"more start values than columns");
450 if (colind.size() != vals.size())
451 return absl::InvalidArgumentError(
"inconsitent data to AddMIPSol()");
454 return ToStatus(
XPRSaddmipsol(xpress_model_,
static_cast<int>(colind.size()),
455 vals.data(), colind.data(), name));
459 if (checkInt32Overflow(rows.size()))
460 return absl::InvalidArgumentError(
"more delayed rows than rows");
462 xpress_model_,
static_cast<int>(rows.size()), rows.data()));
466 absl::Span<int const> cols,
467 std::optional<absl::Span<int const>>
const& prio,
468 std::optional<absl::Span<char const>>
const& dir,
469 std::optional<absl::Span<double const>>
const& up,
470 std::optional<absl::Span<double const>>
const& down) {
471 if (checkInt32Overflow(cols.size()))
472 return absl::InvalidArgumentError(
"more directions than columns");
473 return ToStatus(
XPRSloaddirs(xpress_model_,
static_cast<int>(cols.size()),
474 cols.data(), forwardSpan(prio), forwardSpan(dir),
475 forwardSpan(up), forwardSpan(down)));
486 absl::Span<int const> colind,
487 absl::Span<double const> objcoef,
488 int priority,
double weight) {
490 if (objs == INT_MAX) {
492 <<
"too many objectives";
494 int ret =
XPRSaddobj(xpress_model_, ncols, colind.data(), objcoef.data(),
497 return ToStatus(ret);
499 if (constant != 0.0) {
504 return ToStatus(ret);
515 return ToStatus(ret);
521 absl::Span<XPRSint64 const> start,
522 absl::Span<int const> colind,
523 absl::Span<double const> refval) {
525 if (checkInt32Overflow(settype.size()) ||
526 checkInt32Overflow(std::size_t(oldSets) + settype.size())) {
527 return absl::InvalidArgumentError(
528 "XPRESS cannot handle more than 2^31 SOSs");
530 return ToStatus(
XPRSaddsets64(xpress_model_,
static_cast<int>(settype.size()),
531 colind.size(), settype.data(), start.data(),
532 colind.data(), refval.data()));
536 absl::Span<int const> colind,
537 absl::Span<int const> complement) {
539 if (checkInt32Overflow(rowind.size()) ||
540 checkInt32Overflow(std::size_t(oldInds) + rowind.size())) {
541 return absl::InvalidArgumentError(
542 "XPRESS cannot handle more than 2^31 indicators");
544 if (rowind.size() != colind.size() || rowind.size() != complement.size()) {
545 return absl::InvalidArgumentError(
546 "inconsistent arguments to SetInidicators");
550 rowind.data(), colind.data(), complement.data()));
554 absl::Span<double const> rhs,
555 absl::Span<double const> rng,
556 absl::Span<XPRSint64 const> start,
557 absl::Span<int const> colind,
558 absl::Span<double const> rowcoef) {
560 if (checkInt32Overflow(rowtype.size()) ||
561 checkInt32Overflow(std::size_t(oldRows) + rowtype.size())) {
562 return absl::InvalidArgumentError(
563 "XPRESS cannot handle more than 2^31 rows");
565 if (rowtype.size() != rhs.size() || rowtype.size() != rng.size() ||
566 rowtype.size() != start.size() || colind.size() != rowcoef.size())
567 return absl::InvalidArgumentError(
"inconsistent arguments to AddRows");
568 return ToStatus(
XPRSaddrows64(xpress_model_,
static_cast<int>(rowtype.size()),
569 colind.size(), rowtype.data(), rhs.data(),
570 rng.data(), start.data(), colind.data(),
575 absl::Span<int const> colind,
576 absl::Span<double const> rowcoef,
577 absl::Span<int const> qcol1,
578 absl::Span<int const> qcol2,
579 absl::Span<double const> qcoef) {
581 if (checkInt32Overflow(std::size_t(oldRows) + 1))
582 return absl::InvalidArgumentError(
583 "XPRESS cannot handle more than 2^31 rows");
586 ToStatus(
XPRSaddrows64(xpress_model_, 1, colind.size(), &sense, &rhs,
587 &rng, &start, colind.data(), rowcoef.data())));
588 if (qcol1.size() > 0) {
590 qcol1.data(), qcol2.data(), qcoef.data());
593 return ToStatus(ret);
596 return absl::OkStatus();
600 std::string
const& flags) {
602 XPRSwriteprob(xpress_model_, filename.c_str(), flags.c_str()));
606 return ToStatus(
XPRSsaveas(xpress_model_, filename.c_str()));
610 return ToStatus(
XPRSgetlb(xpress_model_, lb.data(), first, last));
613 return ToStatus(
XPRSgetub(xpress_model_, ub.data(), first, last));
616 return ToStatus(
XPRSgetcoltype(xpress_model_, ctype.data(), first, last));
620 absl::Span<char const> bndtype,
621 absl::Span<double const> bndval) {
622 if (colind.size() != bndtype.size() || colind.size() != bndval.size())
623 return absl::InvalidArgumentError(
"inconsitent data to ChgBounds()");
624 if (checkInt32Overflow(colind.size()))
625 return absl::InvalidArgumentError(
626 "XPRESS cannot handle more than 2^31 bound changes");
627 return ToStatus(
XPRSchgbounds(xpress_model_, colind.size(), colind.data(),
628 bndtype.data(), bndval.data()));
631 absl::Span<char const> coltype) {
632 if (colind.size() != coltype.size())
633 return absl::InvalidArgumentError(
"inconsitent data to ChgColType()");
634 if (checkInt32Overflow(colind.size()))
635 return absl::InvalidArgumentError(
636 "XPRESS cannot handle more than 2^31 type changes");
637 return ToStatus(
XPRSchgcoltype(xpress_model_, colind.size(), colind.data(),
#define ASSIGN_OR_RETURN(lhs, rexpr)
#define RETURN_IF_ERROR(expr)
absl::StatusOr< bool > IsMIP() const
absl::Status GetUB(absl::Span< double > ub, int first, int last)
absl::StatusOr< std::string > GetStrControl(int control) const
absl::Status AddCbChecktime(int(XPRS_CC *cb)(XPRSprob, void *), void *cbdata, int prio=0)
absl::Status ChgBounds(absl::Span< int const > colind, absl::Span< char const > bndtype, absl::Span< double const > bndval)
absl::Status RemoveCbChecktime(int(XPRS_CC *cb)(XPRSprob, void *), void *cbdata=nullptr)
absl::Status ChgCoeffs(absl::Span< const int > rowind, absl::Span< const int > colind, absl::Span< const double > values)
absl::Status ChgColType(absl::Span< int const > colind, absl::Span< char const > coltype)
absl::Status GetDuals(int *p_status, std::optional< absl::Span< double > > const &duals, int first, int last)
absl::StatusOr< std::vector< double > > GetVarUb() const
absl::Status GetColType(absl::Span< char > ctype, int first, int last)
absl::Status SetIntControl(int control, int value)
absl::Status Interrupt(int reason)
absl::Status SetStartingBasis(std::vector< int > &rowBasis, std::vector< int > &colBasis) const
absl::Status GetLB(absl::Span< double > lb, int first, int last)
absl::Status SetIndicators(absl::Span< int const > rowind, absl::Span< int const > colind, absl::Span< int const > complement)
absl::Status AddRows(absl::Span< char const > rowtype, absl::Span< double const > rhs, absl::Span< double const > rng, absl::Span< XPRSint64 const > start, absl::Span< int const > colind, absl::Span< double const > rowcoef)
absl::StatusOr< int > GetDualStatus() const
absl::StatusOr< int > GetIntAttr(int attribute) const
absl::Status RemoveCbMessage(void(XPRS_CC *cb)(XPRSprob, void *, char const *, int, int), void *cbdata=nullptr)
absl::Status SetProbName(absl::string_view name)
absl::Status GetLpSol(absl::Span< double > primals, absl::Span< double > duals, absl::Span< double > reducedCosts)
absl::Status AddConstrs(absl::Span< const char > sense, absl::Span< const double > rhs, absl::Span< const double > rng)
absl::Status AddVars(std::size_t count, absl::Span< const double > obj, absl::Span< const double > lb, absl::Span< const double > ub, absl::Span< const char > vtype)
absl::Status AddCbMessage(void(XPRS_CC *cb)(XPRSprob, void *, char const *, int, int), void *cbdata, int prio=0)
absl::Status SetLinearObjective(double constant, absl::Span< const int > col_index, absl::Span< const double > obj_coeffs)
absl::Status GetControlInfo(char const *name, int *p_id, int *p_type) const
absl::StatusOr< double > CalculateObjectiveN(int objidx, double const *solution)
static absl::StatusOr< std::unique_ptr< Xpress > > New(absl::string_view model_name)
absl::Status ResetIntControl(int control)
absl::Status LoadDirs(absl::Span< int const > cols, std::optional< absl::Span< int const > > const &prio, std::optional< absl::Span< char const > > const &dir, std::optional< absl::Span< double const > > const &up, std::optional< absl::Span< double const > > const &down)
absl::Status SetIntControl64(int control, int64_t value)
absl::StatusOr< int64_t > GetIntControl64(int control) const
absl::StatusOr< int > AddObjective(double constant, int ncols, absl::Span< int const > colind, absl::Span< double const > objcoef, int priority, double weight)
absl::Status SetStrControl(int control, std::string const &value)
absl::Status Optimize(std::string const &flags="", int *p_solvestatus=nullptr, int *p_solstatus=nullptr)
absl::Status LpOptimize(std::string flags)
absl::Status AddNames(int type, absl::Span< const char > names, int first, int last)
absl::Status SaveAs(std::string const &filename)
absl::Status SetQuadraticObjective(absl::Span< const int > colind1, absl::Span< const int > colind2, absl::Span< const double > coefficients)
absl::StatusOr< int > GetIntControl(int control) const
absl::Status GetSolution(int *p_status, std::optional< absl::Span< double > > const &x, int first, int last)
absl::StatusOr< double > GetDoubleAttr(int attribute) const
absl::Status SetObjectiveIntControl(int obj, int control, int value)
absl::Status LoadDelayedRows(absl::Span< int const > rows)
absl::Status SetDblControl(int control, double value)
absl::Status SetObjectiveDoubleControl(int obj, int control, double value)
absl::StatusOr< double > GetObjectiveDoubleAttr(int objidx, int attribute) const
absl::StatusOr< double > GetDblControl(int control) const
absl::Status GetRedCosts(int *p_status, std::optional< absl::Span< double > > const &dj, int first, int last)
absl::Status WriteProb(std::string const &filename, std::string const &flags="")
absl::Status AddMIPSol(absl::Span< double const > vals, absl::Span< int const > colind, char const *name=nullptr)
absl::Status GetBasis(std::vector< int > &rowBasis, std::vector< int > &colBasis) const
absl::Status AddQRow(char sense, double rhs, double rng, absl::Span< int const > colind, absl::Span< double const > rowcoef, absl::Span< int const > qcol1, absl::Span< int const > qcol2, absl::Span< double const > qcoef)
absl::Status SetObjectiveSense(bool maximize)
absl::StatusOr< std::vector< double > > GetVarLb() const
absl::Status AddSets(absl::Span< char const > settype, absl::Span< XPRSint64 const > start, absl::Span< int const > colind, absl::Span< double const > refval)
dual_gradient T(y - `dual_solution`) class DiagonalTrustRegionProblemFromQp
std::function< int(XPRSprob prob, int objidx)> XPRSdelobj
std::function< int(XPRSprob prob, int(XPRS_CC *f_checktime)(XPRSprob cbprob, void *cbdata), void *p)> XPRSremovecbchecktime
std::function< int(XPRSprob prob, int objidx, const double solution[], double *p_objval)> XPRScalcobjn
std::function< int(XPRSprob prob, int(XPRS_CC *f_checktime)(XPRSprob cbprob, void *cbdata), void *p, int priority)> XPRSaddcbchecktime
std::function< int(XPRSprob prob, int nrows, const int rowind[])> XPRSloaddelayedrows
std::function< int(XPRSprob prob, int attrib, int *p_value)> XPRSgetintattrib
std::function< int(XPRSprob prob, int ndirs, const int colind[], const int priority[], const char dir[], const double uppseudo[], const double downpseudo[])> XPRSloaddirs
std::function< int(XPRSprob prob, int ncoefs, const int objqcol1[], const int objqcol2[], const double objqcoef[])> XPRSchgmqobj
std::function< int(XPRSprob prob, void(XPRS_CC *f_message)(XPRSprob cbprob, void *cbdata, const char *msg, int msglen, int msgtype), void *p)> XPRSremovecbmessage
std::function< int(XPRSprob prob, char coltype[], int first, int last)> XPRSgetcoltype
std::function< int(XPRSprob prob, int attrib, double *p_value)> XPRSgetdblattrib
std::function< int(XPRSprob prob, int *status, double djs[], int first, int last)> XPRSgetredcosts
std::function< int(XPRSprob prob, const char *filename, const char *flags)> XPRSwriteprob
std::function< int(XPRSprob prob, void(XPRS_CC *f_message)(XPRSprob cbprob, void *cbdata, const char *msg, int msglen, int msgtype), void *p, int priority)> XPRSaddcbmessage
Select next search node to expand Select next item_i to add this new search node to the search Generate a new search node where item_i is not in the knapsack Check validity of this new partial solution(using propagators) - If valid
bool initXpressEnv(bool verbose, int xpress_oem_license_key)
init XPRESS environment.
std::function< int(XPRSprob prob, int length, const double solval[], const int colind[], const char *name)> XPRSaddmipsol
std::function< int(XPRSprob prob, int nbounds, const int colind[], const char bndtype[], const double bndval[])> XPRSchgbounds
std::function< int(XPRSprob prob, const int rowstat[], const int colstat[])> XPRSloadbasis
std::function< int(XPRSprob prob, int nrows, const int rowind[])> XPRSdelrows
std::function< int(XPRSprob prob, int ncols, const int colind[])> XPRSdelcols
std::function< int(XPRSprob prob, int control, double *p_value)> XPRSgetdblcontrol
std::function< int(XPRSprob prob, int objidx, int control, int value)> XPRSsetobjintcontrol
std::function< int(XPRSprob prob, double lb[], int first, int last)> XPRSgetlb
std::function< int(XPRSprob prob, const char *flags, int *solvestatus, int *solstatus)> XPRSoptimize
std::function< int(XPRSprob prob, int control, int *p_value)> XPRSgetintcontrol
std::function< int(XPRSprob prob, int ncols, const int colind[], const char coltype[])> XPRSchgcoltype
std::function< int(XPRSprob prob, int nrows, const int rowind[], const int colind[], const int complement[])> XPRSsetindicators
std::function< int(XPRSprob prob, const char *name, int *p_id, int *p_type)> XPRSgetcontrolinfo
std::function< int(XPRSprob prob, double x[], double slack[], double duals[], double djs[])> XPRSgetlpsol
std::function< int(XPRSprob prob, int control, XPRSint64 *p_value)> XPRSgetintcontrol64
std::function< int(XPRSprob prob)> XPRSpostsolve
std::function< int(XPRSprob prob, int type, const char names[], int first, int last)> XPRSaddnames
std::function< int(void)> XPRSfree
std::function< int(XPRSprob prob, int reason)> XPRSinterrupt
std::function< int(XPRSprob prob, const char *filename)> XPRSsaveas
std::function< int(XPRSprob prob, int nsets, XPRSint64 nelems, const char settype[], const XPRSint64 start[], const int colind[], const double refval[])> XPRSaddsets64
std::function< int(XPRSprob prob, int control, int value)> XPRSsetintcontrol
std::function< int(XPRSprob prob, int nrows, int ncoefs, const char rowtype[], const double rhs[], const double rng[], const int start[], const int colind[], const double rowcoef[])> XPRSaddrows
std::function< int(XPRSprob prob, char *errmsg)> XPRSgetlasterror
std::function< int(XPRSprob prob)> XPRSdestroyprob
std::function< int(XPRSprob prob, int control, double value)> XPRSsetdblcontrol
std::function< int(XPRSprob prob, XPRSint64 ncoefs, const int rowind[], const int colind[], const double rowcoef[])> XPRSchgmcoef64
std::function< int(XPRSprob prob, int *status, double x[], int first, int last)> XPRSgetsolution
std::function< int(XPRSprob prob, double ub[], int first, int last)> XPRSgetub
std::function< int(XPRSprob prob, int control, const char *value)> XPRSsetstrcontrol
std::function< int(XPRSprob prob, int ncols, int ncoefs, const double objcoef[], const int start[], const int rowind[], const double rowcoef[], const double lb[], const double ub[])> XPRSaddcols
std::function< int(XPRSprob prob, int control, char *value, int maxbytes, int *p_nbytes)> XPRSgetstringcontrol
std::function< int(XPRSprob prob, int row, int ncoefs, const int rowqcol1[], int const rowqcol2[], const double rowqcoef[])> XPRSaddqmatrix64
std::function< int(XPRSprob prob, int ncols, const int colind[], const double objcoef[], int priority, double weight)> XPRSaddobj
std::function< int(XPRSprob prob, int nrows, int ncoefs, const char rowtype[], const double rhs[], const double rng[], const XPRSint64 start[], const int colind[], const double rowcoef[])> XPRSaddrows64
std::function< int(XPRSprob prob, int objidx, int attrib, double *p_value)> XPRSgetobjdblattrib
std::function< int(XPRSprob prob, int objidx, int control, double value)> XPRSsetobjdblcontrol
std::function< int(XPRSprob prob, int ncols, const int colind[], const double objcoef[])> XPRSchgobj
std::function< int(XPRSprob prob, int *status, double duals[], int first, int last)> XPRSgetduals
std::function< int(XPRSprob *p_prob)> XPRScreateprob
std::function< int(XPRSprob prob, const char *flags)> XPRSlpoptimize
std::function< int(XPRSprob prob, int control, XPRSint64 value)> XPRSsetintcontrol64
std::function< int(XPRSprob prob, int objsense)> XPRSchgobjsense
std::function< int(XPRSprob prob, const char *probname)> XPRSsetprobname
std::function< int(XPRSprob prob, int rowstat[], int colstat[])> XPRSgetbasis
#define XPRS_ORIGINALINDICATORS
#define XPRS_OBJ_MAXIMIZE
#define XPRS_OBJECTIVE_RHS
#define XPRS_ORIGINALROWS
#define XPRS_ORIGINALSETS
#define XPRS_ORIGINALCOLS
struct xo_prob_struct * XPRSprob
#define XPRS_MAXPROBNAMELENGTH
#define XPRS_ORIGINALMIPENTS
#define XPRS_BARITERLIMIT
#define XPRS_OBJ_MINIMIZE