DotNet Reference

DotNet Reference

IntVarArrayHelper.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 {
16 using System;
17 using System.Collections.Generic;
18 
19 // IntVar[] helper class.
20 public static class IntVarArrayHelper
21 {
22  // All Different
23  public static Constraint AllDifferent(this IntVar[] vars)
24  {
25  Solver solver = GetSolver(vars);
26  return solver.MakeAllDifferent(vars);
27  }
28  // Allowed assignment
29  public static Constraint AllowedAssignments(this IntVar[] vars,
30  IntTupleSet tuples)
31  {
32  Solver solver = GetSolver(vars);
33  return solver.MakeAllowedAssignments(vars, tuples);
34  }
35  // sum of all vars.
36  public static IntExpr Sum(this IntVar[] vars)
37  {
38  Solver solver = GetSolver(vars);
39  return solver.MakeSum(vars);
40  }
41  // sum of all constraints.
42  public static IntExpr Sum(this IConstraintWithStatus[] cts)
43  {
44  Solver solver = GetSolver(cts);
45  IntVar[] vars = new IntVar[cts.Length];
46  for (int i = 0; i < cts.Length; ++i)
47  {
48  vars[i] = cts[i].Var();
49  }
50  return solver.MakeSum(vars);
51  }
52  public static IntExpr Sum(this IntExpr[] exprs)
53  {
54  Solver solver = GetSolver(exprs);
55  IntVar[] vars = new IntVar[exprs.Length];
56  for (int i = 0; i < exprs.Length; ++i)
57  {
58  vars[i] = exprs[i].Var();
59  }
60  return solver.MakeSum(vars);
61  }
62 
63  // scalar product
64  public static IntExpr ScalProd(this IntVar[] vars, long[] coefs)
65  {
66  Solver solver = GetSolver(vars);
67  return solver.MakeScalProd(vars, coefs);
68  }
69 
70  // scalar product
71  public static IntExpr ScalProd(this IntVar[] vars, int[] coefs)
72  {
73  Solver solver = GetSolver(vars);
74  return solver.MakeScalProd(vars, coefs);
75  }
76 
77  // get solver from array of integer variables
78  private static Solver GetSolver(IntVar[] vars)
79  {
80  if (vars == null || vars.Length <= 0)
81  throw new ArgumentException("Array <vars> cannot be null or empty");
82 
83  return vars[0].solver();
84  }
85  // get solver from array of integer expressions
86  private static Solver GetSolver(IntExpr[] expressions)
87  {
88  if (expressions == null || expressions.Length <= 0)
89  throw new ArgumentException("Array <expr> cannot be null or empty");
90 
91  return expressions[0].solver();
92  }
93  private static Solver GetSolver(IConstraintWithStatus[] cts)
94  {
95  if (cts == null || cts.Length <= 0)
96  throw new ArgumentException("Array <cts> cannot be null or empty");
97 
98  return cts[0].solver();
99  }
100  public static IntExpr Element(this IntVar[] array, IntExpr index) {
101  return index.solver().MakeElement(array, index.Var());
102  }
103  // min of all vars.
104  public static IntExpr Min(this IntVar[] vars)
105  {
106  Solver solver = GetSolver(vars);
107  return solver.MakeMin(vars);
108  }
109  // min of all vars.
110  public static IntExpr Max(this IntVar[] vars)
111  {
112  Solver solver = GetSolver(vars);
113  return solver.MakeMax(vars);
114  }
115  // count of all vars.
116  public static Constraint Count(this IntVar[] vars, long value, long count)
117  {
118  Solver solver = GetSolver(vars);
119  return solver.MakeCount(vars, value, count);
120  }
121  // count of all vars.
122  public static Constraint Count(this IntVar[] vars,
123  long value,
124  IntExpr count)
125  {
126  Solver solver = GetSolver(vars);
127  return solver.MakeCount(vars, value, count.Var());
128  }
129  public static Constraint Distribute(this IntVar[] vars,
130  long[] values,
131  IntVar[] cards)
132  {
133  Solver solver = GetSolver(vars);
134  return solver.MakeDistribute(vars, values, cards);
135  }
136  public static Constraint Distribute(this IntVar[] vars,
137  int[] values,
138  IntVar[] cards)
139  {
140  Solver solver = GetSolver(vars);
141  return solver.MakeDistribute(vars, values, cards);
142  }
143  public static Constraint Distribute(this IntVar[] vars,
144  IntVar[] cards)
145  {
146  Solver solver = GetSolver(vars);
147  return solver.MakeDistribute(vars, cards);
148  }
149  public static Constraint Distribute(this IntVar[] vars,
150  long card_min,
151  long card_max,
152  long card_size)
153  {
154  Solver solver = GetSolver(vars);
155  return solver.MakeDistribute(vars, card_min, card_max, card_size);
156  }
157  public static Constraint Transition(this IntVar[] vars,
158  IntTupleSet transitions,
159  long initial_state,
160  long[] final_states) {
161  Solver solver = GetSolver(vars);
162  return solver.MakeTransitionConstraint(vars,
163  transitions,
164  initial_state,
165  final_states);
166  }
167  public static Constraint Transition(this IntVar[] vars,
168  IntTupleSet transitions,
169  long initial_state,
170  int[] final_states) {
171  Solver solver = GetSolver(vars);
172  return solver.MakeTransitionConstraint(vars,
173  transitions,
174  initial_state,
175  final_states);
176  }
177 
178  // Matrix API
179  public static IntVar[] Flatten(this IntVar[,] vars)
180  {
181  int rows = vars.GetLength(0);
182  int cols = vars.GetLength(1);
183  IntVar[] flat = new IntVar[cols * rows];
184  for(int i = 0; i < rows; i++) {
185  for(int j = 0; j < cols; j++) {
186  flat[i * cols + j] = vars[i, j];
187  }
188  }
189  return flat;
190  }
191 }
192 
193 
194 // TODO(user): Try to move this code back to the .swig with @define macros.
195 public partial class IntVarVector: IDisposable, System.Collections.IEnumerable
196 #if !SWIG_DOTNET_1
197  , System.Collections.Generic.IList<IntVar>
198 #endif
199 {
200  // cast from C# IntVar array
201  public static implicit operator IntVarVector(IntVar[] inVal) {
202  var outVal= new IntVarVector();
203  foreach (IntVar element in inVal) {
204  outVal.Add(element);
205  }
206  return outVal;
207  }
208 
209  // cast to C# IntVar array
210  public static implicit operator IntVar[](IntVarVector inVal) {
211  var outVal= new IntVar[inVal.Count];
212  inVal.CopyTo(outVal);
213  return outVal;
214  }
215 }
216 
217 public partial class SearchMonitorVector: IDisposable, System.Collections.IEnumerable
218 #if !SWIG_DOTNET_1
219  , System.Collections.Generic.IList<SearchMonitor>
220 #endif
221 {
222  // cast from C# SearchMonitor array
223  public static implicit operator SearchMonitorVector(SearchMonitor[] inVal) {
224  var outVal= new SearchMonitorVector();
225  foreach (SearchMonitor element in inVal) {
226  outVal.Add(element);
227  }
228  return outVal;
229  }
230 
231  // cast to C# SearchMonitor array
232  public static implicit operator SearchMonitor[](SearchMonitorVector inVal) {
233  var outVal= new SearchMonitor[inVal.Count];
234  inVal.CopyTo(outVal);
235  return outVal;
236  }
237 }
238 
239 public partial class DecisionBuilderVector: IDisposable, System.Collections.IEnumerable
240 #if !SWIG_DOTNET_1
241  , System.Collections.Generic.IList<DecisionBuilder>
242 #endif
243 {
244  // cast from C# DecisionBuilder array
245  public static implicit operator DecisionBuilderVector(DecisionBuilder[] inVal) {
246  var outVal= new DecisionBuilderVector();
247  foreach (DecisionBuilder element in inVal) {
248  outVal.Add(element);
249  }
250  return outVal;
251  }
252 
253  // cast to C# DecisionBuilder array
254  public static implicit operator DecisionBuilder[](DecisionBuilderVector inVal) {
255  var outVal= new DecisionBuilder[inVal.Count];
256  inVal.CopyTo(outVal);
257  return outVal;
258  }
259 }
260 
261 public partial class IntervalVarVector: IDisposable, System.Collections.IEnumerable
262 #if !SWIG_DOTNET_1
263  , System.Collections.Generic.IList<IntervalVar>
264 #endif
265 {
266  // cast from C# IntervalVar array
267  public static implicit operator IntervalVarVector(IntervalVar[] inVal) {
268  var outVal= new IntervalVarVector();
269  foreach (IntervalVar element in inVal) {
270  outVal.Add(element);
271  }
272  return outVal;
273  }
274 
275  // cast to C# IntervalVar array
276  public static implicit operator IntervalVar[](IntervalVarVector inVal) {
277  var outVal= new IntervalVar[inVal.Count];
278  inVal.CopyTo(outVal);
279  return outVal;
280  }
281 }
282 
283 public partial class SequenceVarVector: IDisposable, System.Collections.IEnumerable
284 #if !SWIG_DOTNET_1
285  , System.Collections.Generic.IList<SequenceVar>
286 #endif
287 {
288  // cast from C# SequenceVar array
289  public static implicit operator SequenceVarVector(SequenceVar[] inVal) {
290  var outVal= new SequenceVarVector();
291  foreach (SequenceVar element in inVal) {
292  outVal.Add(element);
293  }
294  return outVal;
295  }
296 
297  // cast to C# SequenceVar array
298  public static implicit operator SequenceVar[](SequenceVarVector inVal) {
299  var outVal= new SequenceVar[inVal.Count];
300  inVal.CopyTo(outVal);
301  return outVal;
302  }
303 }
304 
305 public partial class LocalSearchOperatorVector: IDisposable, System.Collections.IEnumerable
306 #if !SWIG_DOTNET_1
307  , System.Collections.Generic.IList<LocalSearchOperator>
308 #endif
309 {
310  // cast from C# LocalSearchOperator array
311  public static implicit operator LocalSearchOperatorVector(LocalSearchOperator[] inVal) {
312  var outVal= new LocalSearchOperatorVector();
313  foreach (LocalSearchOperator element in inVal) {
314  outVal.Add(element);
315  }
316  return outVal;
317  }
318 
319  // cast to C# LocalSearchOperator array
320  public static implicit operator LocalSearchOperator[](LocalSearchOperatorVector inVal) {
321  var outVal= new LocalSearchOperator[inVal.Count];
322  inVal.CopyTo(outVal);
323  return outVal;
324  }
325 }
326 
327 public partial class LocalSearchFilterVector: IDisposable, System.Collections.IEnumerable
328 #if !SWIG_DOTNET_1
329  , System.Collections.Generic.IList<LocalSearchFilter>
330 #endif
331 {
332  // cast from C# LocalSearchFilter array
333  public static implicit operator LocalSearchFilterVector(LocalSearchFilter[] inVal) {
334  var outVal= new LocalSearchFilterVector();
335  foreach (LocalSearchFilter element in inVal) {
336  outVal.Add(element);
337  }
338  return outVal;
339  }
340 
341  // cast to C# LocalSearchFilter array
342  public static implicit operator LocalSearchFilter[](LocalSearchFilterVector inVal) {
343  var outVal= new LocalSearchFilter[inVal.Count];
344  inVal.CopyTo(outVal);
345  return outVal;
346  }
347 }
348 
349 public partial class SymmetryBreakerVector: IDisposable, System.Collections.IEnumerable
350 #if !SWIG_DOTNET_1
351  , System.Collections.Generic.IList<SymmetryBreaker>
352 #endif
353 {
354  // cast from C# SymmetryBreaker array
355  public static implicit operator SymmetryBreakerVector(SymmetryBreaker[] inVal) {
356  var outVal= new SymmetryBreakerVector();
357  foreach (SymmetryBreaker element in inVal) {
358  outVal.Add(element);
359  }
360  return outVal;
361  }
362 
363  // cast to C# SymmetryBreaker array
364  public static implicit operator SymmetryBreaker[](SymmetryBreakerVector inVal) {
365  var outVal= new SymmetryBreaker[inVal.Count];
366  inVal.CopyTo(outVal);
367  return outVal;
368  }
369 }
370 } // namespace Google.OrTools.ConstraintSolver
static Constraint Distribute(this IntVar[] vars, long card_min, long card_max, long card_size)
Definition: ValCstPair.cs:20
static Constraint AllowedAssignments(this IntVar[] vars, IntTupleSet tuples)
Definition: IntVar.cs:18
Constraint MakeCount(IntVarVector vars, long value, long max_count)
SearchMonitorVector()
SequenceVarVector()
Constraint MakeTransitionConstraint(IntVarVector vars, IntTupleSet transition_table, long initial_state, long[] final_states)
Definition: IntExpr.cs:18
SymmetryBreakerVector()
static IntExpr Element(this IntVar[] array, IntExpr index)
static IntExpr Sum(this IntExpr[] exprs)
Definition: Assignment.cs:11
Definition: IntVarVector.cs:19
static Constraint Distribute(this IntVar[] vars, long[] values, IntVar[] cards)
static Constraint Distribute(this IntVar[] vars, int[] values, IntVar[] cards)
IntVar Var()
Definition: SequenceVar.cs:18
LocalSearchFilterVector()
static Constraint Count(this IntVar[] vars, long value, long count)
LocalSearchOperatorVector()
Constraint MakeAllowedAssignments(IntVarVector vars, IntTupleSet tuples)
static IntExpr Sum(this IntVar[] vars)
IntExpr MakeMin(IntVarVector vars)
static Constraint AllDifferent(this IntVar[] vars)
static Constraint Count(this IntVar[] vars, long value, IntExpr count)
Constraint MakeAllDifferent(IntVarVector vars)
IntExpr MakeElement(long[] values, IntVar index)
IntVarVector()
Definition: IntTupleSet.cs:18
static IntExpr ScalProd(this IntVar[] vars, int[] coefs)
Definition: IntervalVar.cs:18
IntExpr MakeSum(IntExpr left, IntExpr right)
IntExpr MakeScalProd(IntVarVector vars, long[] coefs)
static Constraint Transition(this IntVar[] vars, IntTupleSet transitions, long initial_state, long[] final_states)
static Constraint Distribute(this IntVar[] vars, IntVar[] cards)
static IntExpr Max(this IntVar[] vars)
IntExpr MakeMax(IntVarVector vars)
DecisionBuilderVector()
static IntExpr Sum(this IConstraintWithStatus[] cts)
IntervalVarVector()
Constraint MakeDistribute(IntVarVector vars, long[] values, IntVarVector cards)
static Constraint Transition(this IntVar[] vars, IntTupleSet transitions, long initial_state, int[] final_states)
static IntExpr Min(this IntVar[] vars)
Solver solver()
virtual IntVar Var()
Definition: IntExpr.cs:95
static IntVar[] Flatten(this IntVar[,] vars)
static IntExpr ScalProd(this IntVar[] vars, long[] coefs)