DotNet Reference

DotNet Reference

constraint_solver/csharp/SolverHelper.cs
Go to the documentation of this file.
1 // Copyright 2010-2018 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 
15 using System;
16 using System.Collections.Generic;
17 
18 public partial class Solver : IDisposable {
19  public IntVar[] MakeIntVarArray(int count, long min, long max) {
20  IntVar[] array = new IntVar[count];
21  for (int i = 0; i < count; ++i) {
22  array[i] = MakeIntVar(min, max);
23  }
24  return array;
25  }
26 
27  public IntVar[] MakeIntVarArray(int count, long min, long max, string name) {
28  IntVar[] array = new IntVar[count];
29  for (int i = 0; i < count; ++i) {
30  string var_name = name + i;
31  array[i] = MakeIntVar(min, max, var_name);
32  }
33  return array;
34  }
35 
36  public IntVar[] MakeIntVarArray(int count, long[] values) {
37  IntVar[] array = new IntVar[count];
38  for (int i = 0; i < count; ++i) {
39  array[i] = MakeIntVar(values);
40  }
41  return array;
42  }
43 
44  public IntVar[] MakeIntVarArray(int count, long[] values, string name) {
45  IntVar[] array = new IntVar[count];
46  for (int i = 0; i < count; ++i) {
47  string var_name = name + i;
48  array[i] = MakeIntVar(values, var_name);
49  }
50  return array;
51  }
52 
53  public IntVar[] MakeIntVarArray(int count, int[] values) {
54  IntVar[] array = new IntVar[count];
55  for (int i = 0; i < count; ++i) {
56  array[i] = MakeIntVar(values);
57  }
58  return array;
59  }
60 
61  public IntVar[] MakeIntVarArray(int count, int[] values, string name) {
62  IntVar[] array = new IntVar[count];
63  for (int i = 0; i < count; ++i) {
64  string var_name = name + i;
65  array[i] = MakeIntVar(values, var_name);
66  }
67  return array;
68  }
69 
70  public IntVar[] MakeBoolVarArray(int count) {
71  IntVar[] array = new IntVar[count];
72  for (int i = 0; i < count; ++i) {
73  array[i] = MakeBoolVar();
74  }
75  return array;
76  }
77 
78  public IntVar[] MakeBoolVarArray(int count, string name) {
79  IntVar[] array = new IntVar[count];
80  for (int i = 0; i < count; ++i) {
81  string var_name = name + i;
82  array[i] = MakeBoolVar(var_name);
83  }
84  return array;
85  }
86 
87  public IntVar[,] MakeIntVarMatrix(int rows, int cols, long min, long max) {
88  IntVar[,] array = new IntVar[rows, cols];
89  for (int i = 0; i < rows; ++i) {
90  for (int j = 0; j < cols; ++j) {
91  array[i,j] = MakeIntVar(min, max);
92  }
93  }
94  return array;
95  }
96 
97  public IntVar[,] MakeIntVarMatrix(int rows, int cols,
98  long min, long max, string name) {
99  IntVar[,] array = new IntVar[rows, cols];
100  for (int i = 0; i < rows; ++i) {
101  for (int j = 0; j < cols; ++j) {
102  string var_name = name + "["+ i + ", " + j +"]";
103  array[i,j] = MakeIntVar(min, max, var_name);
104  }
105  }
106  return array;
107  }
108 
109  public IntVar[,] MakeIntVarMatrix(int rows, int cols, long[] values) {
110  IntVar[,] array = new IntVar[rows, cols];
111  for (int i = 0; i < rows; ++i) {
112  for (int j = 0; j < cols; ++j) {
113  array[i,j] = MakeIntVar(values);
114  }
115  }
116  return array;
117  }
118 
119  public IntVar[,] MakeIntVarMatrix(int rows, int cols,
120  long[] values, string name) {
121  IntVar[,] array = new IntVar[rows, cols];
122  for (int i = 0; i < rows; ++i) {
123  for (int j = 0; j < cols; ++j) {
124  string var_name = name + "["+ i + ", " + j +"]";
125  array[i,j] = MakeIntVar(values, var_name);
126  }
127  }
128  return array;
129  }
130 
131  public IntVar[,] MakeIntVarMatrix(int rows, int cols, int[] values) {
132  IntVar[,] array = new IntVar[rows, cols];
133  for (int i = 0; i < rows; ++i) {
134  for (int j = 0; j < cols; ++j) {
135  array[i,j] = MakeIntVar(values);
136  }
137  }
138  return array;
139  }
140 
141  public IntVar[,] MakeIntVarMatrix(int rows, int cols,
142  int[] values, string name) {
143  IntVar[,] array = new IntVar[rows, cols];
144  for (int i = 0; i < rows; ++i) {
145  for (int j = 0; j < cols; ++j) {
146  string var_name = name + "["+ i + ", " + j +"]";
147  array[i,j] = MakeIntVar(values, var_name);
148  }
149  }
150  return array;
151  }
152 
153  public IntVar[,] MakeBoolVarMatrix(int rows, int cols) {
154  IntVar[,] array = new IntVar[rows, cols];
155  for (int i = 0; i < rows; ++i) {
156  for (int j = 0; j < cols; ++j) {
157  array[i,j] = MakeBoolVar();
158  }
159  }
160  return array;
161  }
162 
163  public IntVar[,] MakeBoolVarMatrix(int rows, int cols, string name) {
164  IntVar[,] array = new IntVar[rows, cols];
165  for (int i = 0; i < rows; ++i) {
166  for (int j = 0; j < cols; ++j) {
167  string var_name = name + "["+ i + ", " + j +"]";
168  array[i,j] = MakeBoolVar(var_name);
169  }
170  }
171  return array;
172  }
173 
175  long start_min,
176  long start_max,
177  long duration,
178  bool optional) {
179  IntervalVar[] array = new IntervalVar[count];
180  for (int i = 0; i < count; ++i) {
181  array[i] = MakeFixedDurationIntervalVar(start_min,
182  start_max,
183  duration,
184  optional,
185  "");
186  }
187  return array;
188  }
189 
191  long start_min,
192  long start_max,
193  long duration,
194  bool optional,
195  string name) {
196  IntervalVar[] array = new IntervalVar[count];
197  for (int i = 0; i < count; ++i) {
198  array[i] = MakeFixedDurationIntervalVar(start_min,
199  start_max,
200  duration,
201  optional,
202  name + i);
203  }
204  return array;
205  }
206 
208  long[] start_min,
209  long[] start_max,
210  long[] duration,
211  bool optional,
212  string name) {
213  IntervalVar[] array = new IntervalVar[count];
214  for (int i = 0; i < count; ++i) {
215  array[i] = MakeFixedDurationIntervalVar(start_min[i],
216  start_max[i],
217  duration[i],
218  optional,
219  name + i);
220  }
221  return array;
222  }
223 
225  int[] start_min,
226  int[] start_max,
227  int[] duration,
228  bool optional,
229  string name) {
230  IntervalVar[] array = new IntervalVar[count];
231  for (int i = 0; i < count; ++i) {
232  array[i] = MakeFixedDurationIntervalVar(start_min[i],
233  start_max[i],
234  duration[i],
235  optional,
236  name + i);
237  }
238  return array;
239  }
241  int[] durations,
242  string name) {
243  int count = starts.Length;
244  IntervalVar[] array = new IntervalVar[count];
245  for (int i = 0; i < count; ++i) {
246  array[i] = MakeFixedDurationIntervalVar(starts[i],
247  durations[i],
248  name + i);
249  }
250  return array;
251  }
253  long[] durations,
254  string name) {
255  int count = starts.Length;
256  IntervalVar[] array = new IntervalVar[count];
257  for (int i = 0; i < count; ++i) {
258  array[i] = MakeFixedDurationIntervalVar(starts[i],
259  durations[i],
260  name + i);
261  }
262  return array;
263  }
264  public void NewSearch(DecisionBuilder db) {
265  pinned_decision_builder_ = db;
266  pinned_search_monitors_.Clear();
267  NewSearchAux(db);
268  }
269 
270  public void NewSearch(DecisionBuilder db, SearchMonitor sm1) {
271  pinned_decision_builder_ = db;
272  pinned_search_monitors_.Clear();
273  pinned_search_monitors_.Add(sm1);
274  NewSearchAux(db, sm1);
275  }
276 
277 
278  public void NewSearch(DecisionBuilder db,
279  SearchMonitor sm1,
280  SearchMonitor sm2) {
281  pinned_decision_builder_ = db;
282  pinned_search_monitors_.Clear();
283  pinned_search_monitors_.Add(sm1);
284  pinned_search_monitors_.Add(sm2);
285  NewSearchAux(db, sm1, sm2);
286  }
287 
288  public void NewSearch(DecisionBuilder db,
289  SearchMonitor sm1,
290  SearchMonitor sm2,
291  SearchMonitor sm3) {
292  pinned_decision_builder_ = db;
293  pinned_search_monitors_.Clear();
294  pinned_search_monitors_.Add(sm1);
295  pinned_search_monitors_.Add(sm2);
296  pinned_search_monitors_.Add(sm3);
297  NewSearchAux(db, sm1, sm2, sm3);
298  }
299 
300  public void NewSearch(DecisionBuilder db,
301  SearchMonitor sm1,
302  SearchMonitor sm2,
303  SearchMonitor sm3,
304  SearchMonitor sm4) {
305  pinned_decision_builder_ = db;
306  pinned_search_monitors_.Clear();
307  pinned_search_monitors_.Add(sm1);
308  pinned_search_monitors_.Add(sm2);
309  pinned_search_monitors_.Add(sm3);
310  pinned_search_monitors_.Add(sm4);
311  NewSearchAux(db, sm1, sm2, sm3, sm4);
312  }
313 
314  public void NewSearch(DecisionBuilder db, SearchMonitor[] monitors) {
315  pinned_decision_builder_ = db;
316  pinned_search_monitors_.Clear();
317  pinned_search_monitors_.AddRange(monitors);
318  NewSearchAux(db, monitors);
319  }
320 
321  public void EndSearch() {
322  pinned_decision_builder_ = null;
323  pinned_search_monitors_.Clear();
324  EndSearchAux();
325  }
326 
327  private System.Collections.Generic.List<SearchMonitor> pinned_search_monitors_
328  = new System.Collections.Generic.List<SearchMonitor>();
329  private DecisionBuilder pinned_decision_builder_;
330 }
331 
332 public partial class IntExpr : PropagationBaseObject {
333  public static IntExpr operator+(IntExpr a, IntExpr b) {
334  return a.solver().MakeSum(a, b);
335  }
336  public static IntExpr operator+(IntExpr a, long v) {
337  return a.solver().MakeSum(a, v);
338  }
339  public static IntExpr operator+(long v, IntExpr a) {
340  return a.solver().MakeSum(a, v);
341  }
342  public static IntExpr operator-(IntExpr a, IntExpr b) {
343  return a.solver().MakeDifference(a, b);
344  }
345  public static IntExpr operator-(IntExpr a, long v) {
346  return a.solver().MakeSum(a, -v);
347  }
348  public static IntExpr operator-(long v, IntExpr a) {
349  return a.solver().MakeDifference(v, a);
350  }
351  public static IntExpr operator*(IntExpr a, IntExpr b) {
352  return a.solver().MakeProd(a, b);
353  }
354  public static IntExpr operator*(IntExpr a, long v) {
355  return a.solver().MakeProd(a, v);
356  }
357  public static IntExpr operator*(long v, IntExpr a) {
358  return a.solver().MakeProd(a, v);
359  }
360  public static IntExpr operator/(IntExpr a, long v) {
361  return a.solver().MakeDiv(a, v);
362  }
363  public static IntExpr operator%(IntExpr a, long v) {
364  return a.solver().MakeModulo(a, v);
365  }
366  public static IntExpr operator-(IntExpr a) {
367  return a.solver().MakeOpposite(a);
368  }
369  public IntExpr Abs() {
370  return this.solver().MakeAbs(this);
371  }
372  public IntExpr Square() {
373  return this.solver().MakeSquare(this);
374  }
376  return new IntExprEquality(a, b, true);
377  }
379  return new IntExprEquality(a, b, false);
380  }
381  public static WrappedConstraint operator ==(IntExpr a, long v) {
382  return new WrappedConstraint(a.solver().MakeEquality(a, v));
383  }
384  public static WrappedConstraint operator !=(IntExpr a, long v) {
385  return new WrappedConstraint(a.solver().MakeNonEquality(a.Var(), v));
386  }
387  public static WrappedConstraint operator >=(IntExpr a, long v) {
388  return new WrappedConstraint(a.solver().MakeGreaterOrEqual(a, v));
389  }
390  public static WrappedConstraint operator >(IntExpr a, long v) {
391  return new WrappedConstraint(a.solver().MakeGreater(a, v));
392  }
393  public static WrappedConstraint operator <=(IntExpr a, long v) {
394  return new WrappedConstraint(a.solver().MakeLessOrEqual(a, v));
395  }
396  public static WrappedConstraint operator <(IntExpr a, long v) {
397  return new WrappedConstraint(a.solver().MakeLess(a, v));
398  }
400  return new WrappedConstraint(a.solver().MakeGreaterOrEqual(a.Var(), b.Var()));
401  }
403  return new WrappedConstraint(a.solver().MakeGreater(a.Var(), b.Var()));
404  }
406  return new WrappedConstraint(a.solver().MakeLessOrEqual(a.Var(), b.Var()));
407  }
409  return new WrappedConstraint(a.solver().MakeLess(a.Var(), b.Var()));
410  }
411 }
412 
413 public partial class Constraint : PropagationBaseObject, IConstraintWithStatus {
414  public static implicit operator IntVar(Constraint eq)
415  {
416  return eq.Var();
417  }
418 
419  public static implicit operator IntExpr(Constraint eq)
420  {
421  return eq.Var();
422  }
423  public static IntExpr operator+(Constraint a, Constraint b) {
424  return a.solver().MakeSum(a.Var(), b.Var());
425  }
426  public static IntExpr operator+(Constraint a, long v) {
427  return a.solver().MakeSum(a.Var(), v);
428  }
429  public static IntExpr operator+(long v, Constraint a) {
430  return a.solver().MakeSum(a.Var(), v);
431  }
432  public static IntExpr operator-(Constraint a, Constraint b) {
433  return a.solver().MakeDifference(a.Var(), b.Var());
434  }
435  public static IntExpr operator-(Constraint a, long v) {
436  return a.solver().MakeSum(a.Var(), -v);
437  }
438  public static IntExpr operator-(long v, Constraint a) {
439  return a.solver().MakeDifference(v, a.Var());
440  }
441  public static IntExpr operator*(Constraint a, Constraint b) {
442  return a.solver().MakeProd(a.Var(), b.Var());
443  }
444  public static IntExpr operator*(Constraint a, long v) {
445  return a.solver().MakeProd(a.Var(), v);
446  }
447  public static IntExpr operator*(long v, Constraint a) {
448  return a.solver().MakeProd(a.Var(), v);
449  }
450  public static IntExpr operator/(Constraint a, long v) {
451  return a.solver().MakeDiv(a.Var(), v);
452  }
453  public static IntExpr operator-(Constraint a) {
454  return a.solver().MakeOpposite(a.Var());
455  }
456  public IntExpr Abs() {
457  return this.solver().MakeAbs(this.Var());
458  }
459  public IntExpr Square() {
460  return this.solver().MakeSquare(this.Var());
461  }
462  public static WrappedConstraint operator ==(Constraint a, long v) {
463  return new WrappedConstraint(a.solver().MakeEquality(a.Var(), v));
464  }
465  public static WrappedConstraint operator ==(long v, Constraint a) {
466  return new WrappedConstraint(a.solver().MakeEquality(a.Var(), v));
467  }
468  public static WrappedConstraint operator !=(Constraint a, long v) {
469  return new WrappedConstraint(a.solver().MakeNonEquality(a.Var(), v));
470  }
471  public static WrappedConstraint operator !=(long v, Constraint a) {
472  return new WrappedConstraint(a.solver().MakeNonEquality(a.Var(), v));
473  }
474  public static WrappedConstraint operator >=(Constraint a, long v) {
475  return new WrappedConstraint(a.solver().MakeGreaterOrEqual(a.Var(), v));
476  }
477  public static WrappedConstraint operator >=(long v, Constraint a) {
478  return new WrappedConstraint(a.solver().MakeLessOrEqual(a.Var(), v));
479  }
480  public static WrappedConstraint operator >(Constraint a, long v) {
481  return new WrappedConstraint(a.solver().MakeGreater(a.Var(), v));
482  }
483  public static WrappedConstraint operator >(long v, Constraint a) {
484  return new WrappedConstraint(a.solver().MakeLess(a.Var(), v));
485  }
486  public static WrappedConstraint operator <=(Constraint a, long v) {
487  return new WrappedConstraint(a.solver().MakeLessOrEqual(a.Var(), v));
488  }
489  public static WrappedConstraint operator <=(long v, Constraint a) {
490  return new WrappedConstraint(a.solver().MakeGreaterOrEqual(a.Var(), v));
491  }
492  public static WrappedConstraint operator <(Constraint a, long v) {
493  return new WrappedConstraint(a.solver().MakeLess(a.Var(), v));
494  }
495  public static WrappedConstraint operator <(long v, Constraint a) {
496  return new WrappedConstraint(a.solver().MakeGreater(a.Var(), v));
497  }
499  return new WrappedConstraint(a.solver().MakeGreaterOrEqual(a.Var(), b.Var()));
500  }
502  return new WrappedConstraint(a.solver().MakeGreater(a.Var(), b.Var()));
503  }
505  return new WrappedConstraint(a.solver().MakeLessOrEqual(a.Var(), b.Var()));
506  }
508  return new WrappedConstraint(a.solver().MakeLess(a.Var(), b.Var()));
509  }
511  return new ConstraintEquality(a, b, true);
512  }
514  return new ConstraintEquality(a, b, false);
515  }
516 }
517 } // namespace Google.OrTools.ConstraintSolver
IntVar[,] MakeIntVarMatrix(int rows, int cols, long[] values, string name)
Definition: IntVar.cs:18
IntVar[] MakeIntVarArray(int count, long[] values)
static IntExpr operator/(Constraint a, long v)
static IntExpr operator*(long v, Constraint a)
IntVar[,] MakeIntVarMatrix(int rows, int cols, int[] values)
static IntExpr operator%(IntExpr a, long v)
void NewSearch(DecisionBuilder db, SearchMonitor[] monitors)
static WrappedConstraint operator>=(Constraint a, long v)
IntVar[] MakeIntVarArray(int count, long min, long max, string name)
IntervalVar[] MakeFixedDurationIntervalVarArray(IntVar[] starts, long[] durations, string name)
static IntExpr operator-(Constraint a)
Definition: IntExpr.cs:18
static IntExpr operator+(long v, Constraint a)
IntervalVar[] MakeFixedDurationIntervalVarArray(int count, long[] start_min, long[] start_max, long[] duration, bool optional, string name)
static IntExpr operator+(IntExpr a, IntExpr b)
IntervalVar MakeFixedDurationIntervalVar(long start_min, long start_max, long duration, bool optional, string name)
void NewSearch(DecisionBuilder db, SearchMonitor sm1)
static IntExpr operator+(Constraint a, Constraint b)
IntVar[] MakeIntVarArray(int count, long[] values, string name)
static WrappedConstraint operator<=(Constraint a, long v)
IntVar[] MakeIntVarArray(int count, int[] values, string name)
static IntExpr operator-(Constraint a, Constraint b)
void NewSearch(DecisionBuilder db, SearchMonitor sm1, SearchMonitor sm2, SearchMonitor sm3, SearchMonitor sm4)
IntExpr MakeAbs(IntExpr expr)
IntervalVar[] MakeFixedDurationIntervalVarArray(IntVar[] starts, int[] durations, string name)
Definition: Assignment.cs:11
static IntExpr operator+(long v, IntExpr a)
static IntExpr operator-(IntExpr a, long v)
static IntExpr operator-(long v, IntExpr a)
IntVar[,] MakeIntVarMatrix(int rows, int cols, long min, long max)
static IntExpr operator+(Constraint a, long v)
static WrappedConstraint operator>(Constraint a, long v)
void NewSearch(DecisionBuilder db, SearchMonitor sm1, SearchMonitor sm2)
static IntExprEquality operator==(IntExpr a, IntExpr b)
void NewSearchAux(DecisionBuilder db, SearchMonitorVector monitors)
IntExpr MakeSquare(IntExpr expr)
static WrappedConstraint operator<(Constraint a, long v)
static IntExpr operator*(long v, IntExpr a)
IntVar[] MakeBoolVarArray(int count, string name)
IntVar[,] MakeBoolVarMatrix(int rows, int cols)
virtual IntVar Var()
Definition: ValCstPair.cs:174
static WrappedConstraint operator<=(IntExpr a, long v)
static IntExpr operator-(IntExpr a)
static IntExpr operator*(IntExpr a, long v)
Definition: IntervalVar.cs:18
static IntExpr operator*(Constraint a, Constraint b)
IntVar[,] MakeIntVarMatrix(int rows, int cols, int[] values, string name)
static IntExprEquality operator!=(IntExpr a, IntExpr b)
static IntExpr operator-(Constraint a, long v)
static WrappedConstraint operator==(Constraint a, long v)
IntVar MakeBoolVar()
IntExpr Abs()
static IntExpr operator*(Constraint a, long v)
IntExpr Square()
IntVar[] MakeBoolVarArray(int count)
static IntExpr operator+(IntExpr a, long v)
void EndSearchAux()
IntExpr Square()
IntExpr Abs()
static WrappedConstraint operator!=(Constraint a, long v)
IntVar[] MakeIntVarArray(int count, int[] values)
IntVar[] MakeIntVarArray(int count, long min, long max)
Definition: ValCstPair.cs:127
IntVar[,] MakeBoolVarMatrix(int rows, int cols, string name)
static WrappedConstraint operator<(IntExpr a, long v)
void EndSearch()
static IntExpr operator/(IntExpr a, long v)
void NewSearch(DecisionBuilder db, SearchMonitor sm1, SearchMonitor sm2, SearchMonitor sm3)
Definition: ValCstPair.cs:237
IntervalVar[] MakeFixedDurationIntervalVarArray(int count, int[] start_min, int[] start_max, int[] duration, bool optional, string name)
IntervalVar[] MakeFixedDurationIntervalVarArray(int count, long start_min, long start_max, long duration, bool optional, string name)
static IntExpr operator-(long v, Constraint a)
IntVar[,] MakeIntVarMatrix(int rows, int cols, long min, long max, string name)
static WrappedConstraint operator>=(IntExpr a, long v)
IntervalVar[] MakeFixedDurationIntervalVarArray(int count, long start_min, long start_max, long duration, bool optional)
IntVar[,] MakeIntVarMatrix(int rows, int cols, long[] values)
void NewSearch(DecisionBuilder db)
Solver solver()
static IntExpr operator*(IntExpr a, IntExpr b)
static IntExpr operator-(IntExpr a, IntExpr b)
static WrappedConstraint operator>(IntExpr a, long v)
IntVar MakeIntVar(long min, long max, string name)