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 
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  res.MinLevel = min_level;
328  res.MaxLevel = max_level;
329 
330  return ct;
331  }
332 
334  IEnumerable<IntVar> times,
335  IEnumerable<I> demands,
336  IEnumerable<IntVar> actives,
337  long min_level, long max_level)
338  {
339  Constraint ct = new Constraint(model_);
341  foreach (IntVar var in times)
342  {
343  res.Times.Add(var.Index);
344  }
345  foreach (I d in demands)
346  {
347  res.Demands.Add(Convert.ToInt64(d));
348  }
349  foreach (IntVar var in actives)
350  {
351  res.Actives.Add(var.Index);
352  }
353  res.MinLevel = min_level;
354  res.MaxLevel = max_level;
355 
356  ct.Proto.Reservoir = res;
357  return ct;
358  }
359 
360  public void AddMapDomain(
361  IntVar var, IEnumerable<IntVar> bool_vars, long offset = 0)
362  {
363  int i = 0;
364  foreach (IntVar bool_var in bool_vars)
365  {
366  int b_index = bool_var.Index;
367  int var_index = var.Index;
368 
369  ConstraintProto ct1 = new ConstraintProto();
371  lin1.Vars.Add(var_index);
372  lin1.Coeffs.Add(1L);
373  lin1.Domain.Add(offset + i);
374  lin1.Domain.Add(offset + i);
375  ct1.Linear = lin1;
376  ct1.EnforcementLiteral.Add(b_index);
377  model_.Constraints.Add(ct1);
378 
379  ConstraintProto ct2 = new ConstraintProto();
381  lin2.Vars.Add(var_index);
382  lin2.Coeffs.Add(1L);
383  lin2.Domain.Add(Int64.MinValue);
384  lin2.Domain.Add(offset + i - 1);
385  lin2.Domain.Add(offset + i + 1);
386  lin2.Domain.Add(Int64.MaxValue);
387  ct2.Linear = lin2;
388  ct2.EnforcementLiteral.Add(-b_index - 1);
389  model_.Constraints.Add(ct2);
390 
391  i++;
392  }
393  }
394 
396  {
397  Constraint ct = new Constraint(model_);
399  or.Literals.Add(a.Not().GetIndex());
400  or.Literals.Add(b.GetIndex());
401  ct.Proto.BoolOr = or;
402  return ct;
403  }
404 
405  public Constraint AddBoolOr(IEnumerable<ILiteral> literals)
406  {
407  Constraint ct = new Constraint(model_);
408  BoolArgumentProto bool_argument = new BoolArgumentProto();
409  foreach (ILiteral lit in literals)
410  {
411  bool_argument.Literals.Add(lit.GetIndex());
412  }
413  ct.Proto.BoolOr = bool_argument;
414  return ct;
415  }
416 
417  public Constraint AddBoolAnd(IEnumerable<ILiteral> literals)
418  {
419  Constraint ct = new Constraint(model_);
420  BoolArgumentProto bool_argument = new BoolArgumentProto();
421  foreach (ILiteral lit in literals)
422  {
423  bool_argument.Literals.Add(lit.GetIndex());
424  }
425  ct.Proto.BoolAnd = bool_argument;
426  return ct;
427  }
428 
429  public Constraint AddBoolXor(IEnumerable<ILiteral> literals)
430  {
431  Constraint ct = new Constraint(model_);
432  BoolArgumentProto bool_argument = new BoolArgumentProto();
433  foreach (ILiteral lit in literals)
434  {
435  bool_argument.Literals.Add(lit.GetIndex());
436  }
437  ct.Proto.BoolXor = bool_argument;
438  return ct;
439  }
440 
441  public Constraint AddMinEquality(IntVar target, IEnumerable<IntVar> vars)
442  {
443  Constraint ct = new Constraint(model_);
445  foreach (IntVar var in vars)
446  {
447  args.Vars.Add(var.Index);
448  }
449  args.Target = target.Index;
450  ct.Proto.IntMin = args;
451  return ct;
452  }
453 
454  public Constraint AddMaxEquality(IntVar target, IEnumerable<IntVar> vars)
455  {
456  Constraint ct = new Constraint(model_);
458  foreach (IntVar var in vars)
459  {
460  args.Vars.Add(var.Index);
461  }
462  args.Target = target.Index;
463  ct.Proto.IntMax = args;
464  return ct;
465  }
466 
467  public Constraint AddDivisionEquality<T, N, D>(T target, N num, D denom)
468  {
469  Constraint ct = new Constraint(model_);
471  args.Vars.Add(GetOrCreateIndex(num));
472  args.Vars.Add(GetOrCreateIndex(denom));
473  args.Target = GetOrCreateIndex(target);
474  ct.Proto.IntDiv = args;
475  return ct;
476  }
477 
479  {
480  Constraint ct = new Constraint(model_);
482  args.Vars.Add(var.Index);
483  args.Vars.Add(-var.Index - 1);
484  args.Target = target.Index;
485  ct.Proto.IntMax = args;
486  return ct;
487  }
488 
489  public Constraint AddModuloEquality<T, V, M>(T target, V v, M m)
490  {
491  Constraint ct = new Constraint(model_);
493  args.Vars.Add(GetOrCreateIndex(v));
494  args.Vars.Add(GetOrCreateIndex(m));
495  args.Target = GetOrCreateIndex(target);
496  ct.Proto.IntMod = args;
497  return ct;
498  }
499 
500  public Constraint AddProdEquality(IntVar target, IEnumerable<IntVar> vars)
501  {
502  Constraint ct = new Constraint(model_);
504  args.Target = target.Index;
505  foreach (IntVar var in vars)
506  {
507  args.Vars.Add(var.Index);
508  }
509  ct.Proto.IntProd = args;
510  return ct;
511  }
512 
513  // Scheduling support
514 
516  S start, D duration, E end, string name)
517  {
518  return new IntervalVar(model_,
519  GetOrCreateIndex(start),
520  GetOrCreateIndex(duration),
521  GetOrCreateIndex(end),
522  name);
523  }
524 
525 
527  S start, D duration, E end, ILiteral is_present, string name)
528  {
529  int i = is_present.GetIndex();
530  return new IntervalVar(model_,
531  GetOrCreateIndex(start),
532  GetOrCreateIndex(duration),
533  GetOrCreateIndex(end),
534  i,
535  name);
536  }
537 
538  public Constraint AddNoOverlap(IEnumerable<IntervalVar> intervals)
539  {
540  Constraint ct = new Constraint(model_);
542  foreach (IntervalVar var in intervals)
543  {
544  args.Intervals.Add(var.GetIndex());
545  }
546  ct.Proto.NoOverlap = args;
547  return ct;
548  }
549 
550  public Constraint AddNoOverlap2D(IEnumerable<IntervalVar> x_intervals,
551  IEnumerable<IntervalVar> y_intervals)
552  {
553  Constraint ct = new Constraint(model_);
555  foreach (IntervalVar var in x_intervals)
556  {
557  args.XIntervals.Add(var.GetIndex());
558  }
559  foreach (IntervalVar var in y_intervals)
560  {
561  args.YIntervals.Add(var.GetIndex());
562  }
563  ct.Proto.NoOverlap2D = args;
564  return ct;
565  }
566 
567  public Constraint AddCumulative<D, C>(IEnumerable<IntervalVar> intervals,
568  IEnumerable<D> demands,
569  C capacity)
570  {
571  Constraint ct = new Constraint(model_);
573  foreach (IntervalVar var in intervals)
574  {
575  cumul.Intervals.Add(var.GetIndex());
576  }
577  foreach (D demand in demands)
578  {
579  cumul.Demands.Add(GetOrCreateIndex(demand));
580  }
581  cumul.Capacity = GetOrCreateIndex(capacity);
582  ct.Proto.Cumulative = cumul;
583  return ct;
584  }
585 
586 
587  // Objective.
588  public void Minimize(LinearExpr obj)
589  {
590  SetObjective(obj, true);
591  }
592 
593  public void Maximize(LinearExpr obj)
594  {
595  SetObjective(obj, false);
596  }
597 
598  public void Minimize()
599  {
600  SetObjective(null, true);
601  }
602 
603  public void Maximize()
604  {
605  SetObjective(null, false);
606  }
607 
608  public void AddVarToObjective(IntVar var)
609  {
610  if ((Object)var == null) return;
611  model_.Objective.Vars.Add(var.Index);
612  model_.Objective.Coeffs.Add(model_.Objective.ScalingFactor > 0 ? 1 : -1);
613  }
614 
615  public void AddTermToObjective(IntVar var, long coeff)
616  {
617  if (coeff == 0 || (Object)var == null) return;
618  model_.Objective.Vars.Add(var.Index);
619  model_.Objective.Coeffs.Add(model_.Objective.ScalingFactor > 0 ? coeff : -coeff);
620  }
621 
622  bool HasObjective()
623  {
624  return model_.Objective == null;
625  }
626 
627  // Search Decision.
628 
629  public void AddDecisionStrategy(IEnumerable<IntVar> vars,
632  {
634  foreach (IntVar var in vars)
635  {
636  ds.Variables.Add(var.Index);
637  }
638  ds.VariableSelectionStrategy = var_str;
639  ds.DomainReductionStrategy = dom_str;
640  model_.SearchStrategy.Add(ds);
641  }
642 
643  public void AddHint(IntVar var, long value)
644  {
645  if (model_.SolutionHint == null) {
647  }
648  model_.SolutionHint.Vars.Add(var.GetIndex());
649  model_.SolutionHint.Values.Add(value);
650  }
651 
652  // Internal methods.
653 
654  void SetObjective(LinearExpr obj, bool minimize)
655  {
656  CpObjectiveProto objective = new CpObjectiveProto();
657  if (obj == null)
658  {
659  objective.Offset = 0L;
660  objective.ScalingFactor = minimize ? 1L : -1;
661  }
662  else if (obj is IntVar)
663  {
664  objective.Offset = 0L;
665  objective.Vars.Add(obj.Index);
666  if (minimize)
667  {
668  objective.Coeffs.Add(1L);
669  objective.ScalingFactor = 1L;
670  }
671  else
672  {
673  objective.Coeffs.Add(-1L);
674  objective.ScalingFactor = -1L;
675  }
676  }
677  else
678  {
679  Dictionary<IntVar, long> dict = new Dictionary<IntVar, long>();
680  long constant = LinearExpr.GetVarValueMap(obj, 1L, dict);
681  if (minimize)
682  {
683  objective.ScalingFactor = 1L;
684  objective.Offset = constant;
685  }
686  else
687  {
688  objective.ScalingFactor = -1L;
689  objective.Offset = -constant;
690  }
691  foreach (KeyValuePair<IntVar, long> it in dict)
692  {
693  objective.Vars.Add(it.Key.Index);
694  objective.Coeffs.Add(minimize ? it.Value : -it.Value);
695  }
696  }
697  model_.Objective = objective;
698  }
699 
700  public String ModelStats()
701  {
702  return SatHelper.ModelStats(model_);
703  }
704 
705  public String Validate()
706  {
707  return SatHelper.ValidateModel(model_);
708  }
709 
710  private int ConvertConstant(long value)
711  {
712  if (constant_map_.ContainsKey(value))
713  {
714  return constant_map_[value];
715  }
716  else
717  {
718  int index = model_.Variables.Count;
719  IntegerVariableProto var = new IntegerVariableProto();
720  var.Domain.Add(value);
721  var.Domain.Add(value);
722  constant_map_.Add(value, index);
723  model_.Variables.Add(var);
724  return index;
725  }
726  }
727 
728  private int GetOrCreateIndex<X>(X x)
729  {
730  if (typeof(X) == typeof(IntVar))
731  {
732  IntVar vx = (IntVar)(Object)x;
733  return vx.Index;
734  }
735  if (typeof(X) == typeof(long) || typeof(X) == typeof(int))
736  {
737  return ConvertConstant(Convert.ToInt64(x));
738  }
739  throw new ArgumentException("Cannot extract index from argument");
740  }
741 
742  private CpModelProto model_;
743  private Dictionary<long, int> constant_map_;
744  }
745 
746 } // namespace Google.OrTools.Sat
Container for nested types declared in the DecisionStrategyProto message type.
Definition: CpModel.pb.cs:5287
Argument of the constraints of the form target_var = OP(vars).
Definition: CpModel.pb.cs:544
Wrapper class around the cp_model proto.
Definition: CpModel.cs:24
The linear sum vars[i] * coeffs[i] must fall in the given domain.
Definition: CpModel.pb.cs:1153
Constraint AddBoolXor(IEnumerable< ILiteral > literals)
Definition: CpModel.cs:429
global::Google.OrTools.Sat.PartialVariableAssignment SolutionHint
Solution hint.
Definition: CpModel.pb.cs:5793
static long GetVarValueMap(LinearExpr e, long initial_coeff, Dictionary< IntVar, long > dict)
ConstraintProto Proto
Definition: Constraints.cs:46
pbc::RepeatedField< int > Vars
The linear terms of the objective to minimize.
Definition: CpModel.pb.cs:4889
Constraint AddMinEquality(IntVar target, IEnumerable< IntVar > vars)
Definition: CpModel.cs:441
pbc::RepeatedField< int > EnforcementLiteral
The constraint will be enforced iff all literals listed here are true.
Definition: CpModel.pb.cs:3711
Definition: Domain.cs:17
Constraint AddAllowedAssignments(IEnumerable< IntVar > vars, long[,] tuples)
Definition: CpModel.cs:210
Constraint AddDivisionEquality< T, N, D >(T target, N num, D denom)
Definition: CpModel.cs:467
CpModelProto Model
Definition: CpModel.cs:34
static Domain FromFlatIntervals(long[] flat_intervals)
Definition: Domain.cs:79
void Minimize(LinearExpr obj)
Definition: CpModel.cs:588
override int GetIndex()
All the intervals (index of IntervalConstraintProto) must be disjoint.
Definition: CpModel.pb.cs:1698
Constraint AddMaxEquality(IntVar target, IEnumerable< IntVar > vars)
Definition: CpModel.cs:454
void AddDecisionStrategy(IEnumerable< IntVar > vars, DecisionStrategyProto.Types.VariableSelectionStrategy var_str, DecisionStrategyProto.Types.DomainReductionStrategy dom_str)
Definition: CpModel.cs:629
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:3891
CpModel()
Definition: CpModel.cs:25
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:3049
IntVar NewConstant(long value)
Definition: CpModel.cs:57
Optimization objective.
Definition: CpModel.pb.cs:4840
Constraint AddImplication(ILiteral a, ILiteral b)
Definition: CpModel.cs:395
int GetIndex()
Maintain a reservoir level within bounds.
Definition: CpModel.pb.cs:2193
VariableSelectionStrategy
The order in which the variables above should be considered.
Definition: CpModel.pb.cs:5294
String ModelStats()
Definition: CpModel.cs:700
Constraint AddNoOverlap(IEnumerable< IntervalVar > intervals)
Definition: CpModel.cs:538
Constraint AddBoolAnd(IEnumerable< ILiteral > literals)
Definition: CpModel.cs:417
Type
The sum of the demands of the intervals at each interval point cannot exceed a capacity.
Definition: CpModel.pb.cs:2003
Definition: SatHelper.cs:15
double ScalingFactor
Definition: CpModel.pb.cs:4927
ILiteral Not()
static string ValidateModel(Google.OrTools.Sat.CpModelProto model_proto)
Definition: SatHelper.cs:119
pbc::RepeatedField< int > Vars
Definition: CpModel.pb.cs:1195
Constraint AddInverse(IEnumerable< IntVar > direct, IEnumerable< IntVar > reverse)
Definition: CpModel.cs:294
int Target
Definition: CpModel.pb.cs:583
pbc::RepeatedField< int > Vars
Definition: CpModel.pb.cs:5558
Constraint AddBoolOr(IEnumerable< ILiteral > literals)
Definition: CpModel.cs:405
Constraint AddElement(IntVar index, IEnumerable< IntVar > vars, IntVar target)
Definition: CpModel.cs:151
Constraint AddLinearConstraint(LinearExpr linear_expr, long lb, long ub)
Definition: CpModel.cs:72
The constraint target = vars[index].
Definition: CpModel.pb.cs:1324
The boxes defined by [start_x, end_x) * [start_y, end_y) cannot overlap.
Definition: CpModel.pb.cs:1823
IntVar NewConstant(long value, string name)
Definition: CpModel.cs:62
void AddTermToObjective(IntVar var, long coeff)
Definition: CpModel.cs:615
A constraint programming problem.
Definition: CpModel.pb.cs:5663
void Maximize()
Definition: CpModel.cs:603
IntVar NewIntVar(long lb, long ub, string name)
Definition: CpModel.cs:45
pbc::RepeatedField< int > Vars
Definition: CpModel.pb.cs:596
Constraint Add(BoundedLinearExpression lin)
Definition: CpModel.cs:104
global::Google.OrTools.Sat.TableConstraintProto?? Table
The table constraint enforces what values a tuple of variables may take.
Definition: CpModel.pb.cs:3979
Argument of the constraints of the form OP(literals).
Definition: CpModel.pb.cs:419
int Index
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:2985
long Lb
Constraint AddForbiddenAssignments(IEnumerable< IntVar > vars, long[,] tuples)
Definition: CpModel.cs:230
pbc::RepeatedField< global::Google.OrTools.Sat.IntegerVariableProto > Variables
The associated Protos should be referred by their index in these fields.
Definition: CpModel.pb.cs:5726
This constraint forces a sequence of variables to be accepted by an automaton.
Definition: CpModel.pb.cs:3311
global::Google.OrTools.Sat.IntegerArgumentProto?? IntMax
The int_max constraint forces the target to equal the maximum of all variables.
Definition: CpModel.pb.cs:3815
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:5772
Constraint AddElement(IntVar index, IEnumerable< int > values, IntVar target)
Definition: CpModel.cs:181
Constraint AddElement(IntVar index, IEnumerable< long > values, IntVar target)
Definition: CpModel.cs:166
int Index
Definition: CpModel.pb.cs:1364
long Ub
Constraint AddCircuit(IEnumerable< Tuple< int, int, ILiteral >> arcs)
Definition: CpModel.cs:196
global::Google.OrTools.Sat.IntegerArgumentProto?? IntMod
The int_mod constraint forces the target to equal vars[0] % vars[1].
Definition: CpModel.pb.cs:3799
global::Google.OrTools.Sat.CpObjectiveProto Objective
The objective to minimize.
Definition: CpModel.pb.cs:5747
void Minimize()
Definition: CpModel.cs:598
Constraint AddLinearExpressionInDomain(LinearExpr linear_expr, Domain domain)
Definition: CpModel.cs:78
Constraint AddAbsEquality(IntVar target, IntVar var)
Definition: CpModel.cs:478
LinearExpr Left
Constraint AddCumulative< D, C >(IEnumerable< IntervalVar > intervals, IEnumerable< D > demands, C capacity)
Definition: CpModel.cs:567
IntervalVar NewIntervalVar< S, D, E >(S start, D duration, E end, string name)
Definition: CpModel.cs:515
pbc::RepeatedField< int > Literals
Definition: CpModel.pb.cs:459
IntervalVar NewOptionalIntervalVar< S, D, E >(S start, D duration, E end, ILiteral is_present, string name)
Definition: CpModel.cs:526
static string ModelStats(Google.OrTools.Sat.CpModelProto model_proto)
Definition: SatHelper.cs:109
void AddHint(IntVar var, long value)
Definition: CpModel.cs:643
void AddVarToObjective(IntVar var)
Definition: CpModel.cs:608
IntVar NewIntVarFromDomain(Domain domain, string name)
Definition: CpModel.cs:50
DomainReductionStrategy
Once a variable has been chosen, this enum describe what decision is taken on its domain.
Definition: CpModel.pb.cs:5308
Constraint AddAllDifferent(IEnumerable< IntVar > vars)
Definition: CpModel.cs:139
Constraint AddModuloEquality< T, V, M >(T target, V v, M m)
Definition: CpModel.cs:489
Next id: 29
Definition: CpModel.pb.cs:3562
Constraint AddAutomaton(IEnumerable< IntVar > vars, long starting_state, IEnumerable< Tuple< long, long, long >> transitions, IEnumerable< long > final_states)
Definition: CpModel.cs:265
The circuit constraint is defined on a graph where the arc presence are controlled by literals.
Definition: CpModel.pb.cs:2433
void AddMapDomain(IntVar var, IEnumerable< IntVar > bool_vars, long offset=0)
Definition: CpModel.cs:360
Type CtType
Constraint AddReservoirConstraintWithActive< I >(IEnumerable< IntVar > times, IEnumerable< I > demands, IEnumerable< IntVar > actives, long min_level, long max_level)
Definition: CpModel.cs:333
pbc::RepeatedField< global::Google.OrTools.Sat.ConstraintProto > Constraints
Definition: CpModel.pb.cs:5736
global::Google.OrTools.Sat.BoolArgumentProto?? BoolOr
The bool_or constraint forces at least one literal to be true.
Definition: CpModel.pb.cs:3721
The two arrays of variable each represent a function, the second is the inverse of the first: f_direc...
Definition: CpModel.pb.cs:3164
LinearExpr Right
Constraint AddProdEquality(IntVar target, IEnumerable< IntVar > vars)
Definition: CpModel.cs:500
Definition: Domain.cs:11
void Maximize(LinearExpr obj)
Definition: CpModel.cs:593
IntVar NewBoolVar(string name)
Definition: CpModel.cs:67
Constraint AddReservoirConstraint< I >(IEnumerable< IntVar > times, IEnumerable< I > demands, long min_level, long max_level)
Definition: CpModel.cs:311
pbc::RepeatedField< long > Domain
Definition: CpModel.pb.cs:1218
pbc::RepeatedField< long > Values
Definition: CpModel.pb.cs:5568
int Index
String Validate()
Definition: CpModel.cs:705
int GetIndex()
Define the strategy to follow when the solver needs to take a new decision.
Definition: CpModel.pb.cs:5083
Constraint AddAutomaton(IEnumerable< IntVar > vars, long starting_state, long[,] transitions, IEnumerable< long > final_states)
Definition: CpModel.cs:238
This message encodes a partial (or full) assignment of the variables of a CpModelProto.
Definition: CpModel.pb.cs:5517
pbc::RepeatedField< long > Coeffs
Definition: CpModel.pb.cs:4899
Definition: Constraints.cs:20
All variables must take different values.
Definition: CpModel.pb.cs:1023
pbc::RepeatedField< long > Coeffs
Same size as vars.
Definition: CpModel.pb.cs:1208
Constraint AddNoOverlap2D(IEnumerable< IntervalVar > x_intervals, IEnumerable< IntervalVar > y_intervals)
Definition: CpModel.cs:550
global::Google.OrTools.Sat.IntegerArgumentProto?? IntDiv
The int_div constraint forces the target to equal vars[0] / vars[1].
Definition: CpModel.pb.cs:3785
double Offset
The displayed objective is always: scaling_factor * (sum(coefficients[i] * objective_vars[i]) + offse...
Definition: CpModel.pb.cs:4916
Definition: CpModel.pb.cs:12