Google OR-Tools v9.15
a fast and portable software suite for combinatorial optimization
Loading...
Searching...
No Matches
model.proto
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// An encoding format for mathematical optimization problems.
15
16syntax = "proto3";
17
18package operations_research.service.v1.mathopt;
19
20import "ortools/service/v1/mathopt/sparse_containers.proto";
21
22option java_multiple_files = true;
23option java_package = "com.google.ortools.service.v1.mathopt";
24
25option csharp_namespace = "Google.OrTools.Service";
26
27// As used below, we define "#variables" = size(VariablesProto.ids).
28message VariablesProto {
29 // Must be nonnegative and strictly increasing. The max(int64) value can't be
30 // used.
31 repeated int64 ids = 1;
32
33 // Should have length equal to #variables, values in [-inf, inf).
34 repeated double lower_bounds = 2;
35
36 // Should have length equal to #variables, values in (-inf, inf].
37 repeated double upper_bounds = 3;
38
39 // Should have length equal to #variables. Value is false for continuous
40 // variables and true for integer variables.
41 repeated bool integers = 4;
42
43 // If not set, assumed to be all empty strings. Otherwise, should have length
44 // equal to #variables.
45 //
46 // All nonempty names must be distinct. TODO(b/169575522): we may relax this.
47 repeated string names = 5;
48}
49
50message ObjectiveProto {
51 // false is minimize, true is maximize
52 bool maximize = 1;
53
54 // Must be finite and not NaN.
55 double offset = 2;
56
57 // ObjectiveProto terms that are linear in the decision variables.
58 //
59 // Requirements:
60 // * linear_coefficients.ids are elements of VariablesProto.ids.
61 // * VariablesProto not specified correspond to zero.
62 // * linear_coefficients.values must all be finite.
63 // * linear_coefficients.values can be zero, but this just wastes space.
64 SparseDoubleVectorProto linear_coefficients = 3;
65
66 // Objective terms that are quadratic in the decision variables.
67 //
68 // Requirements in addition to those on SparseDoubleMatrixProto messages:
69 // * Each element of quadratic_coefficients.row_ids and each element of
70 // quadratic_coefficients.column_ids must be an element of
71 // VariablesProto.ids.
72 // * The matrix must be upper triangular: for each i,
73 // quadratic_coefficients.row_ids[i] <=
74 // quadratic_coefficients.column_ids[i].
75 //
76 // Notes:
77 // * Terms not explicitly stored have zero coefficient.
78 // * Elements of quadratic_coefficients.coefficients can be zero, but this
79 // just wastes space.
80 SparseDoubleMatrixProto quadratic_coefficients = 4;
81
82 // Parent messages may have uniqueness requirements on this field; e.g., see
83 // ModelProto.objectives and AuxiliaryObjectivesUpdatesProto.new_objectives.
84 string name = 5;
85
86 // For multi-objective problems, the priority of this objective relative to
87 // the others (lower is more important). This value must be nonnegative.
88 // Furthermore, each objective priority in the model must be distinct at solve
89 // time. This condition is not validated at the proto level, so models may
90 // temporarily have objectives with the same priority.
91 int64 priority = 6;
92}
93
94// As used below, we define "#linear constraints" =
95// size(LinearConstraintsProto.ids).
96message LinearConstraintsProto {
97 // Must be nonnegative and strictly increasing. The max(int64) value can't be
98 // used.
99 repeated int64 ids = 1;
100
101 // Should have length equal to #linear constraints, values in [-inf, inf).
102 repeated double lower_bounds = 2;
103
104 // Should have length equal to #linear constraints, values in (-inf, inf].
105 repeated double upper_bounds = 3;
106
107 // If not set, assumed to be all empty strings. Otherwise, should have length
108 // equal to #linear constraints.
109 //
110 // All nonempty names must be distinct. TODO(b/169575522): we may relax this.
111 repeated string names = 4;
112}
113
114// A single quadratic constraint of the form:
115// lb <= sum{linear_terms} + sum{quadratic_terms} <= ub.
116//
117// If a variable involved in this constraint is deleted, it is treated as if it
118// were set to zero.
119message QuadraticConstraintProto {
120 // Terms that are linear in the decision variables.
121 //
122 // In addition to requirements on SparseDoubleVectorProto messages we require
123 // that:
124 // * linear_terms.ids are elements of VariablesProto.ids.
125 // * linear_terms.values must all be finite and not-NaN.
126 //
127 // Notes:
128 // * Variable ids omitted have a corresponding coefficient of zero.
129 // * linear_terms.values can be zero, but this just wastes space.
130 SparseDoubleVectorProto linear_terms = 1;
131
132 // Terms that are quadratic in the decision variables.
133 //
134 // In addition to requirements on SparseDoubleMatrixProto messages we require
135 // that:
136 // * Each element of quadratic_terms.row_ids and each element of
137 // quadratic_terms.column_ids must be an element of VariablesProto.ids.
138 // * The matrix must be upper triangular: for each i,
139 // quadratic_terms.row_ids[i] <= quadratic_terms.column_ids[i].
140 //
141 // Notes:
142 // * Terms not explicitly stored have zero coefficient.
143 // * Elements of quadratic_terms.coefficients can be zero, but this just
144 // wastes space.
145 SparseDoubleMatrixProto quadratic_terms = 2;
146
147 // Must have value in [-inf, inf), and be less than or equal to `upper_bound`.
148 double lower_bound = 3;
149
150 // Must have value in (-inf, inf], and be greater than or equal to
151 // `lower_bound`.
152 double upper_bound = 4;
153
154 // Parent messages may have uniqueness requirements on this field; e.g., see
155 // ModelProto.quadratic_constraints and
156 // QuadraticConstraintUpdatesProto.new_constraints.
157 string name = 5;
158}
159
160// A single second-order cone constraint of the form:
161//
162// ||`arguments_to_norm`||_2 <= `upper_bound`,
163//
164// where `upper_bound` and each element of `arguments_to_norm` are linear
165// expressions.
166//
167// If a variable involved in this constraint is deleted, it is treated as if it
168// were set to zero.
169message SecondOrderConeConstraintProto {
170 LinearExpressionProto upper_bound = 1;
171 repeated LinearExpressionProto arguments_to_norm = 2;
172
173 // Parent messages may have uniqueness requirements on this field; e.g., see
174 // `ModelProto.second_order_cone_constraints` and
175 // `SecondOrderConeConstraintUpdatesProto.new_constraints`.
176 string name = 3;
177}
178
179// Data for representing a single SOS1 or SOS2 constraint.
180//
181// If a variable involved in this constraint is deleted, it is treated as if it
182// were set to zero.
183message SosConstraintProto {
184 // The expressions over which to apply the SOS constraint:
185 // * SOS1: At most one element takes a nonzero value.
186 // * SOS2: At most two elements take nonzero values, and they must be
187 // adjacent in the repeated ordering.
188 repeated LinearExpressionProto expressions = 1;
189
190 // Either empty or of equal length to expressions. If empty, default weights
191 // are 1, 2, ...
192 // If present, the entries must be unique.
193 repeated double weights = 2;
194
195 // Parent messages may have uniqueness requirements on this field; e.g., see
196 // ModelProto.sos1_constraints and SosConstraintUpdatesProto.new_constraints.
197 string name = 3;
198}
199
200// Data for representing a single indicator constraint of the form:
201// Variable(indicator_id) = (activate_on_zero ? 0 : 1) ⇒
202// lower_bound <= expression <= upper_bound.
203//
204// If a variable involved in this constraint (either the indicator, or appearing
205// in `expression`) is deleted, it is treated as if it were set to zero. In
206// particular, deleting the indicator variable means that the indicator
207// constraint is vacuous if `activate_on_zero` is false, and that it is
208// equivalent to a linear constraint if `activate_on_zero` is true.
209message IndicatorConstraintProto {
210 // An ID corresponding to a binary variable, or unset. If unset, the indicator
211 // constraint is ignored. If set, we require that:
212 // * VariablesProto.integers[indicator_id] = true,
213 // * VariablesProto.lower_bounds[indicator_id] >= 0,
214 // * VariablesProto.upper_bounds[indicator_id] <= 1.
215 // These conditions are not validated by MathOpt, but if not satisfied will
216 // lead to the solver returning an error upon solving.
217 optional int64 indicator_id = 1;
218
219 // If true, then if the indicator variable takes value 0, the implied
220 // constraint must hold. Otherwise, if the indicator variable takes value 1,
221 // then the implied constraint must hold.
222 bool activate_on_zero = 6;
223
224 // Must be a valid linear expression with respect to the containing model:
225 // * All stated conditions on `SparseDoubleVectorProto`,
226 // * All elements of `expression.values` must be finite,
227 // * `expression.ids` are a subset of `VariablesProto.ids`.
228 SparseDoubleVectorProto expression = 2;
229
230 // Must have value in [-inf, inf); cannot be NaN.
231 double lower_bound = 3;
232
233 // Must have value in (-inf, inf]; cannot be NaN.
234 double upper_bound = 4;
235
236 // Parent messages may have uniqueness requirements on this field; e.g., see
237 // `ModelProto.indicator_constraints` and
238 // `IndicatorConstraintUpdatesProto.new_constraints`.
239 string name = 5;
240}
241
242// An optimization problem.
243// MathOpt supports:
244// - Continuous and integer decision variables with optional finite bounds.
245// - Linear and quadratic objectives (single or multiple objectives), either
246// minimized or maximized.
247// - A number of constraints types, including:
248// * Linear constraints
249// * Quadratic constraints
250// * Second-order cone constraints
251// * Logical constraints
252// > SOS1 and SOS2 constraints
253// > Indicator constraints
254//
255// By default, constraints are represented in "id-to-data" maps. However, we
256// represent linear constraints in a more efficient "struct-of-arrays" format.
257message ModelProto {
258 string name = 1;
259 VariablesProto variables = 2;
260
261 // The primary objective in the model.
262 ObjectiveProto objective = 3;
263
264 // Auxiliary objectives for use in multi-objective models.
265 //
266 // Map key IDs must be in [0, max(int64)). Each priority, and each nonempty
267 // name, must be unique and also distinct from the primary `objective`.
268 map<int64, ObjectiveProto> auxiliary_objectives = 10;
269 LinearConstraintsProto linear_constraints = 4;
270
271 // The variable coefficients for the linear constraints.
272 //
273 // If a variable involved in this constraint is deleted, it is treated as if
274 // it were set to zero.
275 //
276 // Requirements:
277 // * linear_constraint_matrix.row_ids are elements of linear_constraints.ids.
278 // * linear_constraint_matrix.column_ids are elements of variables.ids.
279 // * Matrix entries not specified are zero.
280 // * linear_constraint_matrix.values must all be finite.
281 SparseDoubleMatrixProto linear_constraint_matrix = 5;
282
283 // Mapped constraints (i.e., stored in "constraint ID"-to-"constraint data"
284 // map). For each subsequent submessage, we require that:
285 // * Each key is in [0, max(int64)).
286 // * Each key is unique in its respective map (but not necessarily across
287 // constraint types)
288 // * Each value contains a name field (called `name`), and each nonempty
289 // name must be distinct across all map entries (but not necessarily
290 // across constraint types).
291
292 // Quadratic constraints in the model.
293 map<int64, QuadraticConstraintProto> quadratic_constraints = 6;
294
295 // Second-order cone constraints in the model.
296 map<int64, SecondOrderConeConstraintProto> second_order_cone_constraints = 11;
297
298 // SOS1 constraints in the model, which constrain that at most one
299 // `expression` can be nonzero. The optional `weights` entries are an
300 // implementation detail used by the solver to (hopefully) converge more
301 // quickly. In more detail, solvers may (or may not) use these weights to
302 // select branching decisions that produce "balanced" children nodes.
303 map<int64, SosConstraintProto> sos1_constraints = 7;
304
305 // SOS2 constraints in the model, which constrain that at most two entries of
306 // `expression` can be nonzero, and they must be adjacent in their ordering.
307 // If no `weights` are provided, this ordering is their linear ordering in the
308 // `expressions` list; if `weights` are presented, the ordering is taken with
309 // respect to these values in increasing order.
310 map<int64, SosConstraintProto> sos2_constraints = 8;
311
312 // Indicator constraints in the model, which enforce that, if a binary
313 // "indicator variable" is set to one, then an "implied constraint" must hold.
314 map<int64, IndicatorConstraintProto> indicator_constraints = 9;
315}