DotNet Reference

DotNet Reference

CpModel.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 
14 namespace Google.OrTools.Sat
15 {
16  using System;
17  using System.Collections.Generic;
18  using Google.OrTools.Util;
19 
23  public class CpModel
24  {
25  public CpModel()
26  {
27  model_ = new CpModelProto();
28  constant_map_ = new Dictionary<long, int>();
29  }
30 
31  // Getters.
32 
33  public CpModelProto Model
34  {
35  get { return model_; }
36  }
37 
38  int Negated(int index)
39  {
40  return -index - 1;
41  }
42 
43  // Integer variables and constraints.
44 
45  public IntVar NewIntVar(long lb, long ub, string name)
46  {
47  return new IntVar(model_, new Domain(lb, ub), name);
48  }
49 
50  public IntVar NewIntVarFromDomain(Domain domain, string name)
51  {
52  return new IntVar(model_, domain, name);
53  }
54  // Constants (named or not).
55 
56  // TODO: Cache constant.
57  public IntVar NewConstant(long value)
58  {
59  return new IntVar(model_, new Domain(value), String.Format("{0}", value));
60  }
61 
62  public IntVar NewConstant(long value, string name)
63  {
64  return new IntVar(model_, new Domain(value), name);
65  }
66 
67  public IntVar NewBoolVar(string name)
68  {
69  return new IntVar(model_, new Domain(0, 1), name);
70  }
71 
72  public Constraint AddLinearConstraint(LinearExpr linear_expr, long lb,
73  long ub)
74  {
75  return AddLinearExpressionInDomain(linear_expr, new Domain(lb, ub));
76  }
77 
79  {
80  Dictionary<IntVar, long> dict = new Dictionary<IntVar, long>();
81  long constant = LinearExpr.GetVarValueMap(linear_expr, 1L, dict);
82  Constraint ct = new Constraint(model_);
84  foreach (KeyValuePair<IntVar, long> term in dict)
85  {
86  linear.Vars.Add(term.Key.Index);
87  linear.Coeffs.Add(term.Value);
88  }
89  foreach (long value in domain.FlattenedIntervals())
90  {
91  if (value == Int64.MinValue || value == Int64.MaxValue)
92  {
93  linear.Domain.Add(value);
94  }
95  else
96  {
97  linear.Domain.Add(value - constant);
98  }
99  }
100  ct.Proto.Linear = linear;
101  return ct;
102  }
103 
105  {
106  switch (lin.CtType)
107  {
108  case BoundedLinearExpression.Type.BoundExpression:
109  {
110  return AddLinearExpressionInDomain(lin.Left, new Domain(lin.Lb, lin.Ub));
111  }
112  case BoundedLinearExpression.Type.VarEqVar:
113  {
114  return AddLinearExpressionInDomain(lin.Left - lin.Right, new Domain(0));
115  }
116  case BoundedLinearExpression.Type.VarDiffVar:
117  {
119  lin.Left - lin.Right,
120  Domain.FromFlatIntervals(new long[] { Int64.MinValue, -1, 1,
121  Int64.MaxValue }));
122  }
123  case BoundedLinearExpression.Type.VarEqCst:
124  {
126  new Domain(lin.Lb, lin.Lb));
127  }
128  case BoundedLinearExpression.Type.VarDiffCst:
129  {
131  lin.Left,
133  new long[] { Int64.MinValue, lin.Lb - 1, lin.Lb + 1, Int64.MaxValue }));
134  }
135  }
136  return null;
137  }
138 
139  public Constraint AddAllDifferent(IEnumerable<IntVar> vars)
140  {
141  Constraint ct = new Constraint(model_);
143  foreach (IntVar var in vars)
144  {
145  alldiff.Vars.Add(var.Index);
146  }
147  ct.Proto.AllDiff = alldiff;
148  return ct;
149  }
150 
151  public Constraint AddElement(IntVar index, IEnumerable<IntVar> vars,
152  IntVar target)
153  {
154  Constraint ct = new Constraint(model_);
156  element.Index = index.Index;
157  foreach (IntVar var in vars)
158  {
159  element.Vars.Add(var.Index);
160  }
161  element.Target = target.Index;
162  ct.Proto.Element = element;
163  return ct;
164  }
165 
166  public Constraint AddElement(IntVar index, IEnumerable<long> values,
167  IntVar target)
168  {
169  Constraint ct = new Constraint(model_);
171  element.Index = index.Index;
172  foreach (long value in values)
173  {
174  element.Vars.Add(ConvertConstant(value));
175  }
176  element.Target = target.Index;
177  ct.Proto.Element = element;
178  return ct;
179  }
180 
181  public Constraint AddElement(IntVar index, IEnumerable<int> values,
182  IntVar target)
183  {
184  Constraint ct = new Constraint(model_);
186  element.Index = index.Index;
187  foreach (int value in values)
188  {
189  element.Vars.Add(ConvertConstant(value));
190  }
191  element.Target = target.Index;
192  ct.Proto.Element = element;
193  return ct;
194  }
195 
196  public Constraint AddCircuit(IEnumerable<Tuple<int, int, ILiteral>> arcs)
197  {
198  Constraint ct = new Constraint(model_);
200  foreach (var arc in arcs)
201  {
202  circuit.Tails.Add(arc.Item1);
203  circuit.Heads.Add(arc.Item2);
204  circuit.Literals.Add(arc.Item3.GetIndex());
205  }
206  ct.Proto.Circuit = circuit;
207  return ct;
208  }
209 
210  public Constraint AddAllowedAssignments(IEnumerable<IntVar> vars,
211  long[,] tuples)
212  {
213  Constraint ct = new Constraint(model_);
215  foreach (IntVar var in vars)
216  {
217  table.Vars.Add(var.Index);
218  }
219  for (int i = 0; i < tuples.GetLength(0); ++i)
220  {
221  for (int j = 0; j < tuples.GetLength(1); ++j)
222  {
223  table.Values.Add(tuples[i, j]);
224  }
225  }
226  ct.Proto.Table = table;
227  return ct;
228  }
229 
230  public Constraint AddForbiddenAssignments(IEnumerable<IntVar> vars,
231  long[,] tuples)
232  {
233  Constraint ct = AddAllowedAssignments(vars, tuples);
234  ct.Proto.Table.Negated = true;
235  return ct;
236  }
237 
238  public Constraint AddAutomaton(IEnumerable<IntVar> vars,
239  long starting_state,
240  long[,] transitions,
241  IEnumerable<long> final_states)
242  {
243  Constraint ct = new Constraint(model_);
245  foreach (IntVar var in vars)
246  {
247  aut.Vars.Add(var.Index);
248  }
249  aut.StartingState = starting_state;
250  foreach (long f in final_states)
251  {
252  aut.FinalStates.Add(f);
253  }
254  for (int i = 0; i < transitions.GetLength(0); ++i)
255  {
256  aut.TransitionTail.Add(transitions[i, 0]);
257  aut.TransitionLabel.Add(transitions[i, 1]);
258  aut.TransitionHead.Add(transitions[i, 2]);
259  }
260 
261  ct.Proto.Automaton = aut;
262  return ct;
263  }
264 
266  IEnumerable<IntVar> vars,
267  long starting_state,
268  IEnumerable<Tuple<long, long, long>> transitions,
269  IEnumerable<long> final_states)
270  {
271  Constraint ct = new Constraint(model_);
273  foreach (IntVar var in vars)
274  {
275  aut.Vars.Add(var.Index);
276  }
277  aut.StartingState = starting_state;
278  foreach (long f in final_states)
279  {
280  aut.FinalStates.Add(f);
281  }
282  foreach (Tuple<long, long, long> transition in transitions)
283  {
284 
285  aut.TransitionHead.Add(transition.Item1);
286  aut.TransitionLabel.Add(transition.Item2);
287  aut.TransitionTail.Add(transition.Item3);
288  }
289 
290  ct.Proto.Automaton = aut;
291  return ct;
292  }
293 
294  public Constraint AddInverse(IEnumerable<IntVar> direct,
295  IEnumerable<IntVar> reverse)
296  {
297  Constraint ct = new Constraint(model_);
299  foreach (IntVar var in direct)
300  {
301  inverse.FDirect.Add(var.Index);
302  }
303  foreach (IntVar var in reverse)
304  {
305  inverse.FInverse.Add(var.Index);
306  }
307  ct.Proto.Inverse = inverse;
308  return ct;
309  }
310 
311  public Constraint AddReservoirConstraint<I>(IEnumerable<IntVar> times,
312  IEnumerable<I> demands,
313  long min_level, long max_level)
314  {
315  Constraint ct = new Constraint(model_);
317  foreach (IntVar var in times)
318  {
319  res.Times.Add(var.Index);
320  }
321  foreach (I d in demands)
322  {
323  res.Demands.Add(Convert.ToInt64(d));
324  }
325 
326  ct.Proto.Reservoir = res;
327  return ct;
328  }
329 
331  IEnumerable<IntVar> times,
332  IEnumerable<I> demands,
333  IEnumerable<IntVar> actives,
334  long min_level, long max_level)
335  {
336  Constraint ct = new Constraint(model_);
338  foreach (IntVar var in times)
339  {
340  res.Times.Add(var.Index);
341  }
342  foreach (I d in demands)
343  {
344  res.Demands.Add(Convert.ToInt64(d));
345  }
346  foreach (IntVar var in actives)
347  {
348  res.Actives.Add(var.Index);
349  }
350 
351  ct.Proto.Reservoir = res;
352  return ct;
353  }
354 
355  public void AddMapDomain(
356  IntVar var, IEnumerable<IntVar> bool_vars, long offset = 0)
357  {
358  int i = 0;
359  foreach (IntVar bool_var in bool_vars)
360  {
361  int b_index = bool_var.Index;
362  int var_index = var.Index;
363 
364  ConstraintProto ct1 = new ConstraintProto();
366  lin1.Vars.Add(var_index);
367  lin1.Coeffs.Add(1L);
368  lin1.Domain.Add(offset + i);
369  lin1.Domain.Add(offset + i);
370  ct1.Linear = lin1;
371  ct1.EnforcementLiteral.Add(b_index);
372  model_.Constraints.Add(ct1);
373 
374  ConstraintProto ct2 = new ConstraintProto();
376  lin2.Vars.Add(var_index);
377  lin2.Coeffs.Add(1L);
378  lin2.Domain.Add(Int64.MinValue);
379  lin2.Domain.Add(offset + i - 1);
380  lin2.Domain.Add(offset + i + 1);
381  lin2.Domain.Add(Int64.MaxValue);
382  ct2.Linear = lin2;
383  ct2.EnforcementLiteral.Add(-b_index - 1);
384  model_.Constraints.Add(ct2);
385 
386  i++;
387  }
388  }
389 
391  {
392  Constraint ct = new Constraint(model_);
394  or.Literals.Add(a.Not().GetIndex());
395  or.Literals.Add(b.GetIndex());
396  ct.Proto.BoolOr = or;
397  return ct;
398  }
399 
400  public Constraint AddBoolOr(IEnumerable<ILiteral> literals)
401  {
402  Constraint ct = new Constraint(model_);
403  BoolArgumentProto bool_argument = new BoolArgumentProto();
404  foreach (ILiteral lit in literals)
405  {
406  bool_argument.Literals.Add(lit.GetIndex());
407  }
408  ct.Proto.BoolOr = bool_argument;
409  return ct;
410  }
411 
412  public Constraint AddBoolAnd(IEnumerable<ILiteral> literals)
413  {
414  Constraint ct = new Constraint(model_);
415  BoolArgumentProto bool_argument = new BoolArgumentProto();
416  foreach (ILiteral lit in literals)
417  {
418  bool_argument.Literals.Add(lit.GetIndex());
419  }
420  ct.Proto.BoolAnd = bool_argument;
421  return ct;
422  }
423 
424  public Constraint AddBoolXor(IEnumerable<ILiteral> literals)
425  {
426  Constraint ct = new Constraint(model_);
427  BoolArgumentProto bool_argument = new BoolArgumentProto();
428  foreach (ILiteral lit in literals)
429  {
430  bool_argument.Literals.Add(lit.GetIndex());
431  }
432  ct.Proto.BoolXor = bool_argument;
433  return ct;
434  }
435 
436  public Constraint AddMinEquality(IntVar target, IEnumerable<IntVar> vars)
437  {
438  Constraint ct = new Constraint(model_);
440  foreach (IntVar var in vars)
441  {
442  args.Vars.Add(var.Index);
443  }
444  args.Target = target.Index;
445  ct.Proto.IntMin = args;
446  return ct;
447  }
448 
449  public Constraint AddMaxEquality(IntVar target, IEnumerable<IntVar> vars)
450  {
451  Constraint ct = new Constraint(model_);
453  foreach (IntVar var in vars)
454  {
455  args.Vars.Add(var.Index);
456  }
457  args.Target = target.Index;
458  ct.Proto.IntMax = args;
459  return ct;
460  }
461 
462  public Constraint AddDivisionEquality<T, N, D>(T target, N num, D denom)
463  {
464  Constraint ct = new Constraint(model_);
466  args.Vars.Add(GetOrCreateIndex(num));
467  args.Vars.Add(GetOrCreateIndex(denom));
468  args.Target = GetOrCreateIndex(target);
469  ct.Proto.IntDiv = args;
470  return ct;
471  }
472 
474  {
475  Constraint ct = new Constraint(model_);
477  args.Vars.Add(var.Index);
478  args.Vars.Add(-var.Index - 1);
479  args.Target = target.Index;
480  ct.Proto.IntMax = args;
481  return ct;
482  }
483 
484  public Constraint AddModuloEquality<T, V, M>(T target, V v, M m)
485  {
486  Constraint ct = new Constraint(model_);
488  args.Vars.Add(GetOrCreateIndex(v));
489  args.Vars.Add(GetOrCreateIndex(m));
490  args.Target = GetOrCreateIndex(target);
491  ct.Proto.IntMod = args;
492  return ct;
493  }
494 
495  public Constraint AddProdEquality(IntVar target, IEnumerable<IntVar> vars)
496  {
497  Constraint ct = new Constraint(model_);
499  args.Target = target.Index;
500  foreach (IntVar var in vars)
501  {
502  args.Vars.Add(var.Index);
503  }
504  ct.Proto.IntProd = args;
505  return ct;
506  }
507 
508  // Scheduling support
509 
511  S start, D duration, E end, string name)
512  {
513  return new IntervalVar(model_,
514  GetOrCreateIndex(start),
515  GetOrCreateIndex(duration),
516  GetOrCreateIndex(end),
517  name);
518  }
519 
520 
522  S start, D duration, E end, ILiteral is_present, string name)
523  {
524  int i = is_present.GetIndex();
525  return new IntervalVar(model_,
526  GetOrCreateIndex(start),
527  GetOrCreateIndex(duration),
528  GetOrCreateIndex(end),
529  i,
530  name);
531  }
532 
533  public Constraint AddNoOverlap(IEnumerable<IntervalVar> intervals)
534  {
535  Constraint ct = new Constraint(model_);
537  foreach (IntervalVar var in intervals)
538  {
539  args.Intervals.Add(var.GetIndex());
540  }
541  ct.Proto.NoOverlap = args;
542  return ct;
543  }
544 
545  public Constraint AddNoOverlap2D(IEnumerable<IntervalVar> x_intervals,
546  IEnumerable<IntervalVar> y_intervals)
547  {
548  Constraint ct = new Constraint(model_);
550  foreach (IntervalVar var in x_intervals)
551  {
552  args.XIntervals.Add(var.GetIndex());
553  }
554  foreach (IntervalVar var in y_intervals)
555  {
556  args.YIntervals.Add(var.GetIndex());
557  }
558  ct.Proto.NoOverlap2D = args;
559  return ct;
560  }
561 
562  public Constraint AddCumulative<D, C>(IEnumerable<IntervalVar> intervals,
563  IEnumerable<D> demands,
564  C capacity)
565  {
566  Constraint ct = new Constraint(model_);
568  foreach (IntervalVar var in intervals)
569  {
570  cumul.Intervals.Add(var.GetIndex());
571  }
572  foreach (D demand in demands)
573  {
574  cumul.Demands.Add(GetOrCreateIndex(demand));
575  }
576  cumul.Capacity = GetOrCreateIndex(capacity);
577  ct.Proto.Cumulative = cumul;
578  return ct;
579  }
580 
581 
582  // Objective.
583  public void Minimize(LinearExpr obj)
584  {
585  SetObjective(obj, true);
586  }
587 
588  public void Maximize(LinearExpr obj)
589  {
590  SetObjective(obj, false);
591  }
592 
593  public void Minimize()
594  {
595  SetObjective(null, true);
596  }
597 
598  public void Maximize()
599  {
600  SetObjective(null, false);
601  }
602 
603  public void AddVarToObjective(IntVar var)
604  {
605  if ((Object)var == null) return;
606  model_.Objective.Vars.Add(var.Index);
607  model_.Objective.Coeffs.Add(model_.Objective.ScalingFactor > 0 ? 1 : -1);
608  }
609 
610  public void AddTermToObjective(IntVar var, long coeff)
611  {
612  if (coeff == 0 || (Object)var == null) return;
613  model_.Objective.Vars.Add(var.Index);
614  model_.Objective.Coeffs.Add(model_.Objective.ScalingFactor > 0 ? coeff : -coeff);
615  }
616 
617  bool HasObjective()
618  {
619  return model_.Objective == null;
620  }
621 
622  // Search Decision.
623 
624  public void AddDecisionStrategy(IEnumerable<IntVar> vars,
627  {
629  foreach (IntVar var in vars)
630  {
631  ds.Variables.Add(var.Index);
632  }
633  ds.VariableSelectionStrategy = var_str;
634  ds.DomainReductionStrategy = dom_str;
635  model_.SearchStrategy.Add(ds);
636  }
637 
638  // Internal methods.
639 
640  void SetObjective(LinearExpr obj, bool minimize)
641  {
642  CpObjectiveProto objective = new CpObjectiveProto();
643  if (obj == null)
644  {
645  objective.Offset = 0L;
646  objective.ScalingFactor = minimize ? 1L : -1;
647  }
648  else if (obj is IntVar)
649  {
650  objective.Offset = 0L;
651  objective.Vars.Add(obj.Index);
652  if (minimize)
653  {
654  objective.Coeffs.Add(1L);
655  objective.ScalingFactor = 1L;
656  }
657  else
658  {
659  objective.Coeffs.Add(-1L);
660  objective.ScalingFactor = -1L;
661  }
662  }
663  else
664  {
665  Dictionary<IntVar, long> dict = new Dictionary<IntVar, long>();
666  long constant = LinearExpr.GetVarValueMap(obj, 1L, dict);
667  if (minimize)
668  {
669  objective.ScalingFactor = 1L;
670  objective.Offset = constant;
671  }
672  else
673  {
674  objective.ScalingFactor = -1L;
675  objective.Offset = -constant;
676  }
677  foreach (KeyValuePair<IntVar, long> it in dict)
678  {
679  objective.Vars.Add(it.Key.Index);
680  objective.Coeffs.Add(minimize ? it.Value : -it.Value);
681  }
682  }
683  model_.Objective = objective;
684  }
685 
686  public String ModelStats()
687  {
688  return SatHelper.ModelStats(model_);
689  }
690 
691  public String Validate()
692  {
693  return SatHelper.ValidateModel(model_);
694  }
695 
696  private int ConvertConstant(long value)
697  {
698  if (constant_map_.ContainsKey(value))
699  {
700  return constant_map_[value];
701  }
702  else
703  {
704  int index = model_.Variables.Count;
705  IntegerVariableProto var = new IntegerVariableProto();
706  var.Domain.Add(value);
707  var.Domain.Add(value);
708  constant_map_.Add(value, index);
709  model_.Variables.Add(var);
710  return index;
711  }
712  }
713 
714  private int GetOrCreateIndex<X>(X x)
715  {
716  if (typeof(X) == typeof(IntVar))
717  {
718  IntVar vx = (IntVar)(Object)x;
719  return vx.Index;
720  }
721  if (typeof(X) == typeof(long) || typeof(X) == typeof(int))
722  {
723  return ConvertConstant(Convert.ToInt64(x));
724  }
725  throw new ArgumentException("Cannot extract index from argument");
726  }
727 
728  private CpModelProto model_;
729  private Dictionary<long, int> constant_map_;
730  }
731 
732 } // namespace Google.OrTools.Sat
pbc::RepeatedField< int > Literals
Definition: CpModel.pb.cs:440
void Maximize(LinearExpr obj)
Definition: CpModel.cs:588
static long GetVarValueMap(LinearExpr e, long initial_coeff, Dictionary< IntVar, long > dict)
Constraint AddDivisionEquality< T, N, D >(T target, N num, D denom)
Definition: CpModel.cs:462
pbc::RepeatedField< long > Coeffs
Definition: CpModel.pb.cs:4441
pbc::RepeatedField< int > Vars
The linear terms of the objective to minimize.
Definition: CpModel.pb.cs:4431
Constraint AddNoOverlap(IEnumerable< IntervalVar > intervals)
Definition: CpModel.cs:533
Define the strategy to follow when the solver needs to take a new decision.
Definition: CpModel.pb.cs:4625
Constraint AddProdEquality(IntVar target, IEnumerable< IntVar > vars)
Definition: CpModel.cs:495
Constraint AddMinEquality(IntVar target, IEnumerable< IntVar > vars)
Definition: CpModel.cs:436
IntVar NewIntVarFromDomain(Domain domain, string name)
Definition: CpModel.cs:50
double Offset
The displayed objective is always: scaling_factor * (sum(coefficients[i] * objective_vars[i]) + offse...
Definition: CpModel.pb.cs:4458
Constraint AddImplication(ILiteral a, ILiteral b)
Definition: CpModel.cs:390
Constraint AddReservoirConstraint< I >(IEnumerable< IntVar > times, IEnumerable< I > demands, long min_level, long max_level)
Definition: CpModel.cs:311
The circuit constraint is defined on a graph where the arc presence are controlled by literals.
Definition: CpModel.pb.cs:2063
Constraint AddElement(IntVar index, IEnumerable< long > values, IntVar target)
Definition: CpModel.cs:166
Constraint AddReservoirConstraintWithActive< I >(IEnumerable< IntVar > times, IEnumerable< I > demands, IEnumerable< IntVar > actives, long min_level, long max_level)
Definition: CpModel.cs:330
IntVar NewConstant(long value, string name)
Definition: CpModel.cs:62
VariableSelectionStrategy
The order in which the variables above should be considered.
Definition: CpModel.pb.cs:4836
Constraint AddMaxEquality(IntVar target, IEnumerable< IntVar > vars)
Definition: CpModel.cs:449
IntVar NewConstant(long value)
Definition: CpModel.cs:57
Constraint AddLinearExpressionInDomain(LinearExpr linear_expr, Domain domain)
Definition: CpModel.cs:78
Constraint AddAllowedAssignments(IEnumerable< IntVar > vars, long[,] tuples)
Definition: CpModel.cs:210
Constraint AddAbsEquality(IntVar target, IntVar var)
Definition: CpModel.cs:473
bool Negated
If true, the meaning is "negated", that is we forbid any of the given tuple from a feasible assignmen...
Definition: CpModel.pb.cs:2679
Constraint AddInverse(IEnumerable< IntVar > direct, IEnumerable< IntVar > reverse)
Definition: CpModel.cs:294
pbc::RepeatedField< int > EnforcementLiteral
The constraint will be enforced iff all literals listed here are true.
Definition: CpModel.pb.cs:3335
Container for nested types declared in the DecisionStrategyProto message type.
Definition: CpModel.pb.cs:4829
Constraint Add(BoundedLinearExpression lin)
Definition: CpModel.cs:104
global::Google.OrTools.Sat.LinearConstraintProto?? Linear
The linear constraint enforces a linear inequality among the variables, such as 0 <= x + 2y <= 10.
Definition: CpModel.pb.cs:3483
The sum of the demands of the intervals at each interval point cannot exceed a capacity.
Definition: CpModel.pb.cs:1634
Argument of the constraints of the form target_var = OP(vars).
Definition: CpModel.pb.cs:525
The linear sum vars[i] * coeffs[i] must fall in the given domain.
Definition: CpModel.pb.cs:808
void AddVarToObjective(IntVar var)
Definition: CpModel.cs:603
pbc::RepeatedField< global::Google.OrTools.Sat.ConstraintProto > Constraints
Definition: CpModel.pb.cs:5276
All variables must take different values.
Definition: CpModel.pb.cs:678
global::Google.OrTools.Sat.TableConstraintProto?? Table
The table constraint enforces what values a tuple of variables may take.
Definition: CpModel.pb.cs:3571
global::Google.OrTools.Sat.BoolArgumentProto?? BoolOr
The bool_or constraint forces at least one literal to be true.
Definition: CpModel.pb.cs:3345
The constraint target = vars[index].
Definition: CpModel.pb.cs:979
pbc::RepeatedField< int > Vars
Definition: CpModel.pb.cs:850
pbc::RepeatedField< long > Domain
Definition: CpModel.pb.cs:873
static string ValidateModel(Google.OrTools.Sat.CpModelProto model_proto)
Definition: SatHelper.cs:121
The values of the n-tuple formed by the given variables can only be one of the listed n-tuples in val...
Definition: CpModel.pb.cs:2615
void AddMapDomain(IntVar var, IEnumerable< IntVar > bool_vars, long offset=0)
Definition: CpModel.cs:355
void Minimize(LinearExpr obj)
Definition: CpModel.cs:583
Constraint AddCumulative< D, C >(IEnumerable< IntervalVar > intervals, IEnumerable< D > demands, C capacity)
Definition: CpModel.cs:562
Constraint AddCircuit(IEnumerable< Tuple< int, int, ILiteral >> arcs)
Definition: CpModel.cs:196
Constraint AddModuloEquality< T, V, M >(T target, V v, M m)
Definition: CpModel.cs:484
Constraint AddAutomaton(IEnumerable< IntVar > vars, long starting_state, IEnumerable< Tuple< long, long, long >> transitions, IEnumerable< long > final_states)
Definition: CpModel.cs:265
global::Google.OrTools.Sat.IntegerArgumentProto?? IntMax
The int_max constraint forces the target to equal the maximum of all variables.
Definition: CpModel.pb.cs:3438
Constraint AddForbiddenAssignments(IEnumerable< IntVar > vars, long[,] tuples)
Definition: CpModel.cs:230
Constraint AddBoolAnd(IEnumerable< ILiteral > literals)
Definition: CpModel.cs:412
IntervalVar NewOptionalIntervalVar< S, D, E >(S start, D duration, E end, ILiteral is_present, string name)
Definition: CpModel.cs:521
Wrapper class around the cp_model proto.
Definition: CpModel.cs:23
Maintain a reservoir level within bounds.
Definition: CpModel.pb.cs:1824
A constraint programming problem.
Definition: CpModel.pb.cs:5204
Constraint AddNoOverlap2D(IEnumerable< IntervalVar > x_intervals, IEnumerable< IntervalVar > y_intervals)
Definition: CpModel.cs:545
IntVar NewBoolVar(string name)
Definition: CpModel.cs:67
static Domain FromFlatIntervals(long[] flat_intervals)
Definition: Domain.cs:79
pbc::RepeatedField< global::Google.OrTools.Sat.IntegerVariableProto > Variables
The associated Protos should be referred by their index in these fields.
Definition: CpModel.pb.cs:5266
Constraint AddElement(IntVar index, IEnumerable< int > values, IntVar target)
Definition: CpModel.cs:181
void AddTermToObjective(IntVar var, long coeff)
Definition: CpModel.cs:610
IntVar NewIntVar(long lb, long ub, string name)
Definition: CpModel.cs:45
IntervalVar NewIntervalVar< S, D, E >(S start, D duration, E end, string name)
Definition: CpModel.cs:510
The two arrays of variable each represent a function, the second is the inverse of the first: f_direc...
Definition: CpModel.pb.cs:2794
Argument of the constraints of the form OP(literals).
Definition: CpModel.pb.cs:400
Constraint AddBoolOr(IEnumerable< ILiteral > literals)
Definition: CpModel.cs:400
pbc::RepeatedField< long > Coeffs
Same size as vars.
Definition: CpModel.pb.cs:863
Constraint AddLinearConstraint(LinearExpr linear_expr, long lb, long ub)
Definition: CpModel.cs:72
global::Google.OrTools.Sat.IntegerArgumentProto?? IntDiv
The int_div constraint forces the target to equal vars[0] / vars[1].
Definition: CpModel.pb.cs:3409
static string ModelStats(Google.OrTools.Sat.CpModelProto model_proto)
Definition: SatHelper.cs:111
DomainReductionStrategy
Once a variable has been chosen, this enum describe what decision is taken on its domain.
Definition: CpModel.pb.cs:4850
pbc::RepeatedField< int > Vars
Definition: CpModel.pb.cs:577
void AddDecisionStrategy(IEnumerable< IntVar > vars, DecisionStrategyProto.Types.VariableSelectionStrategy var_str, DecisionStrategyProto.Types.DomainReductionStrategy dom_str)
Definition: CpModel.cs:624
All the intervals (index of IntervalConstraintProto) must be disjoint.
Definition: CpModel.pb.cs:1353
pbc::RepeatedField< global::Google.OrTools.Sat.DecisionStrategyProto > SearchStrategy
Defines the strategy that the solver should follow when the search_branching parameter is set to FIXE...
Definition: CpModel.pb.cs:5312
global::Google.OrTools.Sat.IntegerArgumentProto?? IntMod
The int_mod constraint forces the target to equal vars[0] % vars[1].
Definition: CpModel.pb.cs:3423
Constraint AddAllDifferent(IEnumerable< IntVar > vars)
Definition: CpModel.cs:139
CpModelProto Model
Definition: CpModel.cs:34
The boxes defined by [start_x, end_x) * [start_y, end_y) cannot overlap.
Definition: CpModel.pb.cs:1482
This constraint forces a sequence of variables to be accepted by an automaton.
Definition: CpModel.pb.cs:2941
global::Google.OrTools.Sat.CpObjectiveProto Objective
The objective to minimize.
Definition: CpModel.pb.cs:5287
Constraint AddBoolXor(IEnumerable< ILiteral > literals)
Definition: CpModel.cs:424
Constraint AddAutomaton(IEnumerable< IntVar > vars, long starting_state, long[,] transitions, IEnumerable< long > final_states)
Definition: CpModel.cs:238
Constraint AddElement(IntVar index, IEnumerable< IntVar > vars, IntVar target)
Definition: CpModel.cs:151