Google OR-Tools v9.15
a fast and portable software suite for combinatorial optimization
Loading...
Searching...
No Matches
g_xpress.h
Go to the documentation of this file.
1// Copyright 2010-2025 Google LLC
2// Licensed under the Apache License, Version 2.0 (the "License");
3// you may not use this file except in compliance with the License.
4// You may obtain a copy of the License at
5//
6// http://www.apache.org/licenses/LICENSE-2.0
7//
8// Unless required by applicable law or agreed to in writing, software
9// distributed under the License is distributed on an "AS IS" BASIS,
10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11// See the License for the specific language governing permissions and
12// limitations under the License.
13
14// Google C++ bindings for Xpress C API.
15//
16// Attempts to be as close to the Xpress C API as possible, with the following
17// differences:
18// * Use destructors to automatically clean up the environment and model.
19// * Use absl::Status to propagate errors.
20// * Use absl::StatusOr instead of output arguments.
21// * Use absl::Span<T> instead of T* and size for array args.
22// * Use std::string instead of null terminated char* for string values (note
23// that attribute names are still char*).
24// * When setting array data, accept const data (absl::Span<const T>).
25#ifndef ORTOOLS_MATH_OPT_SOLVERS_XPRESS_G_XPRESS_H_
26#define ORTOOLS_MATH_OPT_SOLVERS_XPRESS_G_XPRESS_H_
27
28#include <map>
29#include <memory>
30#include <optional>
31#include <string>
32#include <vector>
33
34#include "absl/status/status.h"
35#include "absl/status/statusor.h"
36#include "absl/strings/string_view.h"
37#include "absl/types/span.h"
39
41
42class Xpress {
43 public:
44 Xpress() = delete;
45
46 // Creates a new Xpress
47 static absl::StatusOr<std::unique_ptr<Xpress>> New(
48 absl::string_view model_name);
49 absl::Status SetProbName(absl::string_view name);
50
51 ~Xpress();
52
53 absl::Status GetControlInfo(char const* name, int* p_id, int* p_type) const;
54
55 absl::StatusOr<int> GetIntControl(int control) const;
56 absl::Status SetIntControl(int control, int value);
57 absl::Status ResetIntControl(int control); // reset to default value
58
59 absl::StatusOr<int64_t> GetIntControl64(int control) const;
60 absl::Status SetIntControl64(int control, int64_t value);
61
62 absl::StatusOr<double> GetDblControl(int control) const;
63 absl::Status SetDblControl(int control, double value);
64
65 absl::StatusOr<std::string> GetStrControl(int control) const;
66 absl::Status SetStrControl(int control, std::string const& value);
67
68 absl::StatusOr<int> GetIntAttr(int attribute) const;
69
70 absl::StatusOr<double> GetDoubleAttr(int attribute) const;
71 absl::StatusOr<double> GetObjectiveDoubleAttr(int objidx,
72 int attribute) const;
73
74 absl::Status AddVars(std::size_t count, absl::Span<const double> obj,
75 absl::Span<const double> lb, absl::Span<const double> ub,
76 absl::Span<const char> vtype);
77 absl::Status AddNames(int type, absl::Span<const char> names, int first,
78 int last);
79
80 absl::Status AddConstrs(absl::Span<const char> sense,
81 absl::Span<const double> rhs,
82 absl::Span<const double> rng);
83 absl::Status AddConstrs(absl::Span<const char> rowtype,
84 absl::Span<const double> rhs,
85 absl::Span<const double> rng,
86 absl::Span<const int> start,
87 absl::Span<const int> colind,
88 absl::Span<const double> rowcoef);
89
90 absl::Status SetObjectiveSense(bool maximize);
91 absl::Status SetLinearObjective(double constant,
92 absl::Span<const int> col_index,
93 absl::Span<const double> obj_coeffs);
94 absl::Status SetQuadraticObjective(absl::Span<const int> colind1,
95 absl::Span<const int> colind2,
96 absl::Span<const double> coefficients);
97
98 absl::Status ChgCoeffs(absl::Span<const int> rowind,
99 absl::Span<const int> colind,
100 absl::Span<const double> values);
101
102 absl::Status LpOptimize(std::string flags);
103 // Fetch LP solution (primals, duals, and reduced costs)
104 // The user is responsible for ensuring that the three vectors are of correct
105 // size (nVars, nCons, and nVars respectively)
106 absl::Status GetLpSol(absl::Span<double> primals, absl::Span<double> duals,
107 absl::Span<double> reducedCosts);
108 absl::Status Optimize(std::string const& flags = "",
109 int* p_solvestatus = nullptr,
110 int* p_solstatus = nullptr);
111 absl::Status PostSolve();
112
113 absl::Status GetLB(absl::Span<double> lb, int first, int last);
114 absl::Status GetUB(absl::Span<double> ub, int first, int last);
115 absl::Status GetColType(absl::Span<char> ctype, int first, int last);
116
117 absl::Status ChgBounds(absl::Span<int const> colind,
118 absl::Span<char const> bndtype,
119 absl::Span<double const> bndval);
120 absl::Status ChgColType(absl::Span<int const> colind,
121 absl::Span<char const> coltype);
122
123 void Terminate();
124
125 absl::StatusOr<int> GetDualStatus() const;
126 absl::Status GetBasis(std::vector<int>& rowBasis,
127 std::vector<int>& colBasis) const;
128 absl::Status SetStartingBasis(std::vector<int>& rowBasis,
129 std::vector<int>& colBasis) const;
130
131 absl::Status AddCbMessage(void(XPRS_CC* cb)(XPRSprob, void*, char const*, int,
132 int),
133 void* cbdata, int prio = 0);
134 absl::Status RemoveCbMessage(void(XPRS_CC* cb)(XPRSprob, void*, char const*,
135 int, int),
136 void* cbdata = nullptr);
137 absl::Status AddCbChecktime(int(XPRS_CC* cb)(XPRSprob, void*), void* cbdata,
138 int prio = 0);
139 absl::Status RemoveCbChecktime(int(XPRS_CC* cb)(XPRSprob, void*),
140 void* cbdata = nullptr);
141
142 absl::StatusOr<std::vector<double>> GetVarLb() const;
143 absl::StatusOr<std::vector<double>> GetVarUb() const;
144
145 absl::Status Interrupt(int reason);
146
147 absl::StatusOr<bool> IsMIP() const;
148 absl::Status GetDuals(int* p_status,
149 std::optional<absl::Span<double>> const& duals,
150 int first, int last);
151 absl::Status GetSolution(int* p_status,
152 std::optional<absl::Span<double>> const& x,
153 int first, int last);
154 absl::Status GetRedCosts(int* p_status,
155 std::optional<absl::Span<double>> const& dj,
156 int first, int last);
157
158 absl::Status AddMIPSol(absl::Span<double const> vals,
159 absl::Span<int const> colind,
160 char const* name = nullptr);
161 absl::Status LoadDelayedRows(absl::Span<int const> rows);
162 absl::Status LoadDirs(absl::Span<int const> cols,
163 std::optional<absl::Span<int const>> const& prio,
164 std::optional<absl::Span<char const>> const& dir,
165 std::optional<absl::Span<double const>> const& up,
166 std::optional<absl::Span<double const>> const& down);
167
168 absl::Status SetObjectiveIntControl(int obj, int control, int value);
169 absl::Status SetObjectiveDoubleControl(int obj, int control, double value);
170 absl::StatusOr<int> AddObjective(double constant, int ncols,
171 absl::Span<int const> colind,
172 absl::Span<double const> objcoef,
173 int priority, double weight);
174 absl::StatusOr<double> CalculateObjectiveN(int objidx,
175 double const* solution);
176 absl::Status AddSets(absl::Span<char const> settype,
177 absl::Span<XPRSint64 const> start,
178 absl::Span<int const> colind,
179 absl::Span<double const> refval);
180 absl::Status SetIndicators(absl::Span<int const> rowind,
181 absl::Span<int const> colind,
182 absl::Span<int const> complement);
183 absl::Status AddRows(absl::Span<char const> rowtype,
184 absl::Span<double const> rhs,
185 absl::Span<double const> rng,
186 absl::Span<XPRSint64 const> start,
187 absl::Span<int const> colind,
188 absl::Span<double const> rowcoef);
189 absl::Status AddQRow(char sense, double rhs, double rng,
190 absl::Span<int const> colind,
191 absl::Span<double const> rowcoef,
192 absl::Span<int const> qcol1, absl::Span<int const> qcol2,
193 absl::Span<double const> qcoef);
194 absl::Status WriteProb(std::string const& filename,
195 std::string const& flags = "");
196 absl::Status SaveAs(std::string const& filename);
197
198 private:
199 XPRSprob xpress_model_;
200
201 explicit Xpress(XPRSprob& model);
202
203 absl::Status ToStatus(
204 int xprs_err,
205 absl::StatusCode code = absl::StatusCode::kInvalidArgument) const;
206
207 std::map<int, int> int_control_defaults_;
208 void initIntControlDefaults();
209};
210
211} // namespace operations_research::math_opt
212
213#endif // ORTOOLS_MATH_OPT_SOLVERS_XPRESS_G_XPRESS_H_
absl::StatusOr< bool > IsMIP() const
Definition g_xpress.cc:416
absl::Status GetUB(absl::Span< double > ub, int first, int last)
Definition g_xpress.cc:612
absl::StatusOr< std::string > GetStrControl(int control) const
Definition g_xpress.cc:324
absl::Status AddCbChecktime(int(XPRS_CC *cb)(XPRSprob, void *), void *cbdata, int prio=0)
Definition g_xpress.cc:96
absl::Status ChgBounds(absl::Span< int const > colind, absl::Span< char const > bndtype, absl::Span< double const > bndval)
Definition g_xpress.cc:619
absl::Status RemoveCbChecktime(int(XPRS_CC *cb)(XPRSprob, void *), void *cbdata=nullptr)
Definition g_xpress.cc:101
absl::Status ChgCoeffs(absl::Span< const int > rowind, absl::Span< const int > colind, absl::Span< const double > values)
Definition g_xpress.cc:244
absl::Status ChgColType(absl::Span< int const > colind, absl::Span< char const > coltype)
Definition g_xpress.cc:630
absl::Status GetDuals(int *p_status, std::optional< absl::Span< double > > const &duals, int first, int last)
Definition g_xpress.cc:424
absl::StatusOr< std::vector< double > > GetVarUb() const
Definition g_xpress.cc:402
absl::Status GetColType(absl::Span< char > ctype, int first, int last)
Definition g_xpress.cc:615
absl::Status SetIntControl(int control, int value)
Definition g_xpress.cc:287
absl::Status Interrupt(int reason)
Definition g_xpress.cc:412
absl::Status SetStartingBasis(std::vector< int > &rowBasis, std::vector< int > &colBasis) const
Definition g_xpress.cc:383
absl::Status GetLB(absl::Span< double > lb, int first, int last)
Definition g_xpress.cc:609
absl::Status SetIndicators(absl::Span< int const > rowind, absl::Span< int const > colind, absl::Span< int const > complement)
Definition g_xpress.cc:535
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)
Definition g_xpress.cc:553
absl::StatusOr< int > GetDualStatus() const
Definition g_xpress.cc:363
absl::StatusOr< int > GetIntAttr(int attribute) const
Definition g_xpress.cc:340
absl::Status RemoveCbMessage(void(XPRS_CC *cb)(XPRSprob, void *, char const *, int, int), void *cbdata=nullptr)
Definition g_xpress.cc:90
absl::Status SetProbName(absl::string_view name)
Definition g_xpress.cc:75
absl::Status GetLpSol(absl::Span< double > primals, absl::Span< double > duals, absl::Span< double > reducedCosts)
Definition g_xpress.cc:256
absl::Status AddConstrs(absl::Span< const char > sense, absl::Span< const double > rhs, absl::Span< const double > rng)
Definition g_xpress.cc:181
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)
Definition g_xpress.cc:128
absl::Status AddCbMessage(void(XPRS_CC *cb)(XPRSprob, void *, char const *, int, int), void *cbdata, int prio=0)
Definition g_xpress.cc:84
absl::Status SetLinearObjective(double constant, absl::Span< const int > col_index, absl::Span< const double > obj_coeffs)
Definition g_xpress.cc:223
absl::Status GetControlInfo(char const *name, int *p_id, int *p_type) const
Definition g_xpress.cc:275
absl::StatusOr< double > CalculateObjectiveN(int objidx, double const *solution)
Definition g_xpress.cc:510
static absl::StatusOr< std::unique_ptr< Xpress > > New(absl::string_view model_name)
Definition g_xpress.cc:67
absl::Status ResetIntControl(int control)
Definition g_xpress.cc:291
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)
Definition g_xpress.cc:465
absl::Status SetIntControl64(int control, int64_t value)
Definition g_xpress.cc:309
absl::StatusOr< int64_t > GetIntControl64(int control) const
Definition g_xpress.cc:301
absl::StatusOr< int > AddObjective(double constant, int ncols, absl::Span< int const > colind, absl::Span< double const > objcoef, int priority, double weight)
Definition g_xpress.cc:485
absl::Status SetStrControl(int control, std::string const &value)
Definition g_xpress.cc:336
absl::Status Optimize(std::string const &flags="", int *p_solvestatus=nullptr, int *p_solstatus=nullptr)
Definition g_xpress.cc:267
absl::Status LpOptimize(std::string flags)
Definition g_xpress.cc:252
absl::Status AddNames(int type, absl::Span< const char > names, int first, int last)
Definition g_xpress.cc:118
absl::Status SaveAs(std::string const &filename)
Definition g_xpress.cc:605
absl::Status SetQuadraticObjective(absl::Span< const int > colind1, absl::Span< const int > colind2, absl::Span< const double > coefficients)
Definition g_xpress.cc:236
absl::StatusOr< int > GetIntControl(int control) const
Definition g_xpress.cc:280
absl::Status GetSolution(int *p_status, std::optional< absl::Span< double > > const &x, int first, int last)
Definition g_xpress.cc:430
absl::StatusOr< double > GetDoubleAttr(int attribute) const
Definition g_xpress.cc:347
absl::Status SetObjectiveIntControl(int obj, int control, int value)
Definition g_xpress.cc:478
absl::Status LoadDelayedRows(absl::Span< int const > rows)
Definition g_xpress.cc:458
absl::Status SetDblControl(int control, double value)
Definition g_xpress.cc:320
absl::Status SetObjectiveDoubleControl(int obj, int control, double value)
Definition g_xpress.cc:481
absl::StatusOr< double > GetObjectiveDoubleAttr(int objidx, int attribute) const
Definition g_xpress.cc:354
absl::StatusOr< double > GetDblControl(int control) const
Definition g_xpress.cc:313
absl::Status GetRedCosts(int *p_status, std::optional< absl::Span< double > > const &dj, int first, int last)
Definition g_xpress.cc:436
absl::Status WriteProb(std::string const &filename, std::string const &flags="")
Definition g_xpress.cc:599
absl::Status AddMIPSol(absl::Span< double const > vals, absl::Span< int const > colind, char const *name=nullptr)
Definition g_xpress.cc:446
absl::Status GetBasis(std::vector< int > &rowBasis, std::vector< int > &colBasis) const
Definition g_xpress.cc:373
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)
Definition g_xpress.cc:574
absl::Status SetObjectiveSense(bool maximize)
Definition g_xpress.cc:218
absl::StatusOr< std::vector< double > > GetVarLb() const
Definition g_xpress.cc:393
absl::Status AddSets(absl::Span< char const > settype, absl::Span< XPRSint64 const > start, absl::Span< int const > colind, absl::Span< double const > refval)
Definition g_xpress.cc:520
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
struct xo_prob_struct * XPRSprob
#define XPRS_CC