DotNet Reference

.Net Reference

CpModel.cs
Go to the documentation of this file.
1// Copyright 2010-2021 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
14namespace 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 {
36 return model_;
37 }
38 }
39
40 int Negated(int index)
41 {
42 return -index - 1;
43 }
44
45 // Integer variables and constraints.
46
47 public IntVar NewIntVar(long lb, long ub, string name)
48 {
49 return new IntVar(model_, new Domain(lb, ub), name);
50 }
51
52 public IntVar NewIntVarFromDomain(Domain domain, string name)
53 {
54 return new IntVar(model_, domain, name);
55 }
56 // Constants (named or not).
57
58 // TODO: Cache constant.
59 public IntVar NewConstant(long value)
60 {
61 return new IntVar(model_, new Domain(value), String.Format("{0}", value));
62 }
63
64 public IntVar NewConstant(long value, string name)
65 {
66 return new IntVar(model_, new Domain(value), name);
67 }
68
69 public IntVar NewBoolVar(string name)
70 {
71 return new IntVar(model_, new Domain(0, 1), name);
72 }
73
74 public Constraint AddLinearConstraint(LinearExpr linear_expr, long lb, long ub)
75 {
76 return AddLinearExpressionInDomain(linear_expr, new Domain(lb, ub));
77 }
78
80 {
81 Dictionary<IntVar, long> dict = new Dictionary<IntVar, long>();
82 long constant = LinearExpr.GetVarValueMap(linear_expr, 1L, dict);
83 Constraint ct = new Constraint(model_);
85 foreach (KeyValuePair<IntVar, long> term in dict)
86 {
87 linear.Vars.Add(term.Key.Index);
88 linear.Coeffs.Add(term.Value);
89 }
90 foreach (long value in domain.FlattenedIntervals())
91 {
92 if (value == Int64.MinValue || value == Int64.MaxValue)
93 {
94 linear.Domain.Add(value);
95 }
96 else
97 {
98 linear.Domain.Add(value - constant);
99 }
100 }
101 ct.Proto.Linear = linear;
102 return ct;
103 }
104
106 {
107 switch (lin.CtType)
108 {
109 case BoundedLinearExpression.Type.BoundExpression: {
110 return AddLinearExpressionInDomain(lin.Left, new Domain(lin.Lb, lin.Ub));
111 }
112 case BoundedLinearExpression.Type.VarEqVar: {
113 return AddLinearExpressionInDomain(lin.Left - lin.Right, new Domain(0));
114 }
115 case BoundedLinearExpression.Type.VarDiffVar: {
117 lin.Left - lin.Right,
118 Domain.FromFlatIntervals(new long[] { Int64.MinValue, -1, 1, Int64.MaxValue }));
119 }
120 case BoundedLinearExpression.Type.VarEqCst: {
121 return AddLinearExpressionInDomain(lin.Left, new Domain(lin.Lb, lin.Lb));
122 }
123 case BoundedLinearExpression.Type.VarDiffCst: {
125 lin.Left,
126 Domain.FromFlatIntervals(new long[] { Int64.MinValue, lin.Lb - 1, lin.Lb + 1, Int64.MaxValue }));
127 }
128 }
129 return null;
130 }
131
132 public Constraint AddAllDifferent(IEnumerable<IntVar> vars)
133 {
134 Constraint ct = new Constraint(model_);
136 foreach (IntVar var in vars)
137 {
138 alldiff.Vars.Add(var.Index);
139 }
140 ct.Proto.AllDiff = alldiff;
141 return ct;
142 }
143
144 public Constraint AddElement(IntVar index, IEnumerable<IntVar> vars, IntVar target)
145 {
146 Constraint ct = new Constraint(model_);
148 element.Index = index.Index;
149 foreach (IntVar var in vars)
150 {
151 element.Vars.Add(var.Index);
152 }
153 element.Target = target.Index;
154 ct.Proto.Element = element;
155 return ct;
156 }
157
158 public Constraint AddElement(IntVar index, IEnumerable<long> values, IntVar target)
159 {
160 Constraint ct = new Constraint(model_);
162 element.Index = index.Index;
163 foreach (long value in values)
164 {
165 element.Vars.Add(ConvertConstant(value));
166 }
167 element.Target = target.Index;
168 ct.Proto.Element = element;
169 return ct;
170 }
171
172 public Constraint AddElement(IntVar index, IEnumerable<int> values, IntVar target)
173 {
174 Constraint ct = new Constraint(model_);
176 element.Index = index.Index;
177 foreach (int value in values)
178 {
179 element.Vars.Add(ConvertConstant(value));
180 }
181 element.Target = target.Index;
182 ct.Proto.Element = element;
183 return ct;
184 }
185
186 public Constraint AddCircuit(IEnumerable<Tuple<int, int, ILiteral>> arcs)
187 {
188 Constraint ct = new Constraint(model_);
190 foreach (var arc in arcs)
191 {
192 circuit.Tails.Add(arc.Item1);
193 circuit.Heads.Add(arc.Item2);
194 circuit.Literals.Add(arc.Item3.GetIndex());
195 }
196 ct.Proto.Circuit = circuit;
197 return ct;
198 }
199
200 public Constraint AddAllowedAssignments(IEnumerable<IntVar> vars, long[,] tuples)
201 {
202 Constraint ct = new Constraint(model_);
204 foreach (IntVar var in vars)
205 {
206 table.Vars.Add(var.Index);
207 }
208 for (int i = 0; i < tuples.GetLength(0); ++i)
209 {
210 for (int j = 0; j < tuples.GetLength(1); ++j)
211 {
212 table.Values.Add(tuples[i, j]);
213 }
214 }
215 ct.Proto.Table = table;
216 return ct;
217 }
218
219 public Constraint AddForbiddenAssignments(IEnumerable<IntVar> vars, long[,] tuples)
220 {
221 Constraint ct = AddAllowedAssignments(vars, tuples);
222 ct.Proto.Table.Negated = true;
223 return ct;
224 }
225
226 public Constraint AddAutomaton(IEnumerable<IntVar> vars, long starting_state, long[,] transitions,
227 IEnumerable<long> final_states)
228 {
229 Constraint ct = new Constraint(model_);
231 foreach (IntVar var in vars)
232 {
233 aut.Vars.Add(var.Index);
234 }
235 aut.StartingState = starting_state;
236 foreach (long f in final_states)
237 {
238 aut.FinalStates.Add(f);
239 }
240 for (int i = 0; i < transitions.GetLength(0); ++i)
241 {
242 aut.TransitionTail.Add(transitions[i, 0]);
243 aut.TransitionLabel.Add(transitions[i, 1]);
244 aut.TransitionHead.Add(transitions[i, 2]);
245 }
246
247 ct.Proto.Automaton = aut;
248 return ct;
249 }
250
251 public Constraint AddAutomaton(IEnumerable<IntVar> vars, long starting_state,
252 IEnumerable<Tuple<long, long, long>> transitions, IEnumerable<long> final_states)
253 {
254 Constraint ct = new Constraint(model_);
256 foreach (IntVar var in vars)
257 {
258 aut.Vars.Add(var.Index);
259 }
260 aut.StartingState = starting_state;
261 foreach (long f in final_states)
262 {
263 aut.FinalStates.Add(f);
264 }
265 foreach (Tuple<long, long, long> transition in transitions)
266 {
267 aut.TransitionHead.Add(transition.Item1);
268 aut.TransitionLabel.Add(transition.Item2);
269 aut.TransitionTail.Add(transition.Item3);
270 }
271
272 ct.Proto.Automaton = aut;
273 return ct;
274 }
275
276 public Constraint AddInverse(IEnumerable<IntVar> direct, IEnumerable<IntVar> reverse)
277 {
278 Constraint ct = new Constraint(model_);
280 foreach (IntVar var in direct)
281 {
282 inverse.FDirect.Add(var.Index);
283 }
284 foreach (IntVar var in reverse)
285 {
286 inverse.FInverse.Add(var.Index);
287 }
288 ct.Proto.Inverse = inverse;
289 return ct;
290 }
291
292 public Constraint AddReservoirConstraint<I>(IEnumerable<IntVar> times, IEnumerable<I> demands, long min_level,
293 long max_level)
294 {
295 Constraint ct = new Constraint(model_);
297 foreach (IntVar var in times)
298 {
299 res.Times.Add(var.Index);
300 }
301 foreach (I d in demands)
302 {
303 res.Demands.Add(Convert.ToInt64(d));
304 }
305
306 res.MinLevel = min_level;
307 res.MaxLevel = max_level;
308 ct.Proto.Reservoir = res;
309
310 return ct;
311 }
312
313 public Constraint AddReservoirConstraintWithActive<I>(IEnumerable<IntVar> times, IEnumerable<I> demands,
314 IEnumerable<IntVar> actives, long min_level,
315 long max_level)
316 {
317 Constraint ct = new Constraint(model_);
319 foreach (IntVar var in times)
320 {
321 res.Times.Add(var.Index);
322 }
323 foreach (I d in demands)
324 {
325 res.Demands.Add(Convert.ToInt64(d));
326 }
327 foreach (IntVar var in actives)
328 {
329 res.Actives.Add(var.Index);
330 }
331 res.MinLevel = min_level;
332 res.MaxLevel = max_level;
333 ct.Proto.Reservoir = res;
334
335 return ct;
336 }
337
338 public void AddMapDomain(IntVar var, IEnumerable<IntVar> bool_vars, long offset = 0)
339 {
340 int i = 0;
341 foreach (IntVar bool_var in bool_vars)
342 {
343 int b_index = bool_var.Index;
344 int var_index = var.Index;
345
348 lin1.Vars.Add(var_index);
349 lin1.Coeffs.Add(1L);
350 lin1.Domain.Add(offset + i);
351 lin1.Domain.Add(offset + i);
352 ct1.Linear = lin1;
353 ct1.EnforcementLiteral.Add(b_index);
354 model_.Constraints.Add(ct1);
355
358 lin2.Vars.Add(var_index);
359 lin2.Coeffs.Add(1L);
360 lin2.Domain.Add(Int64.MinValue);
361 lin2.Domain.Add(offset + i - 1);
362 lin2.Domain.Add(offset + i + 1);
363 lin2.Domain.Add(Int64.MaxValue);
364 ct2.Linear = lin2;
365 ct2.EnforcementLiteral.Add(-b_index - 1);
366 model_.Constraints.Add(ct2);
367
368 i++;
369 }
370 }
371
373 {
374 Constraint ct = new Constraint(model_);
376 or.Literals.Add(a.Not().GetIndex());
377 or.Literals.Add(b.GetIndex());
378 ct.Proto.BoolOr = or;
379 return ct;
380 }
381
382 public Constraint AddBoolOr(IEnumerable<ILiteral> literals)
383 {
384 Constraint ct = new Constraint(model_);
385 BoolArgumentProto bool_argument = new BoolArgumentProto();
386 foreach (ILiteral lit in literals)
387 {
388 bool_argument.Literals.Add(lit.GetIndex());
389 }
390 ct.Proto.BoolOr = bool_argument;
391 return ct;
392 }
393
394 public Constraint AddBoolAnd(IEnumerable<ILiteral> literals)
395 {
396 Constraint ct = new Constraint(model_);
397 BoolArgumentProto bool_argument = new BoolArgumentProto();
398 foreach (ILiteral lit in literals)
399 {
400 bool_argument.Literals.Add(lit.GetIndex());
401 }
402 ct.Proto.BoolAnd = bool_argument;
403 return ct;
404 }
405
406 public Constraint AddBoolXor(IEnumerable<ILiteral> literals)
407 {
408 Constraint ct = new Constraint(model_);
409 BoolArgumentProto bool_argument = new BoolArgumentProto();
410 foreach (ILiteral lit in literals)
411 {
412 bool_argument.Literals.Add(lit.GetIndex());
413 }
414 ct.Proto.BoolXor = bool_argument;
415 return ct;
416 }
417
418 public Constraint AddMinEquality(IntVar target, IEnumerable<IntVar> vars)
419 {
420 Constraint ct = new Constraint(model_);
422 foreach (IntVar var in vars)
423 {
424 args.Vars.Add(var.Index);
425 }
426 args.Target = target.Index;
427 ct.Proto.IntMin = args;
428 return ct;
429 }
430
431 public Constraint AddMaxEquality(IntVar target, IEnumerable<IntVar> vars)
432 {
433 Constraint ct = new Constraint(model_);
435 foreach (IntVar var in vars)
436 {
437 args.Vars.Add(var.Index);
438 }
439 args.Target = target.Index;
440 ct.Proto.IntMax = args;
441 return ct;
442 }
443
444 public Constraint AddDivisionEquality<T, N, D>(T target, N num, D denom)
445 {
446 Constraint ct = new Constraint(model_);
448 args.Vars.Add(GetOrCreateIndex(num));
449 args.Vars.Add(GetOrCreateIndex(denom));
450 args.Target = GetOrCreateIndex(target);
451 ct.Proto.IntDiv = args;
452 return ct;
453 }
454
456 {
457 Constraint ct = new Constraint(model_);
459 args.Vars.Add(var.Index);
460 args.Vars.Add(-var.Index - 1);
461 args.Target = target.Index;
462 ct.Proto.IntMax = args;
463 return ct;
464 }
465
466 public Constraint AddModuloEquality<T, V, M>(T target, V v, M m)
467 {
468 Constraint ct = new Constraint(model_);
470 args.Vars.Add(GetOrCreateIndex(v));
471 args.Vars.Add(GetOrCreateIndex(m));
472 args.Target = GetOrCreateIndex(target);
473 ct.Proto.IntMod = args;
474 return ct;
475 }
476
477 public Constraint AddMultiplicationEquality(IntVar target, IEnumerable<IntVar> vars)
478 {
479 Constraint ct = new Constraint(model_);
481 args.Target = target.Index;
482 foreach (IntVar var in vars)
483 {
484 args.Vars.Add(var.Index);
485 }
486 ct.Proto.IntProd = args;
487 return ct;
488 }
489
490 public Constraint AddProdEquality(IntVar target, IEnumerable<IntVar> vars)
491 {
492 return AddMultiplicationEquality(target, vars);
493 }
494
495 // Scheduling support
496
497 public IntervalVar NewIntervalVar<S, D, E>(S start, D duration, E end, string name)
498 {
499 LinearExpr startExpr = GetLinearExpr(start);
500 LinearExpr durationExpr = GetLinearExpr(duration);
501 LinearExpr endExpr = GetLinearExpr(end);
502 Add(startExpr + durationExpr == endExpr);
503
504 LinearExpressionProto startProto = GetLinearExpressionProto(startExpr);
505 LinearExpressionProto durationProto = GetLinearExpressionProto(durationExpr);
506 LinearExpressionProto endProto = GetLinearExpressionProto(endExpr);
507 return new IntervalVar(model_, startProto, durationProto, endProto, name);
508 }
509
510 public IntervalVar NewFixedSizeIntervalVar<S>(S start, long duration, string name)
511 {
512 LinearExpr startExpr = GetLinearExpr(start);
513 LinearExpr durationExpr = GetLinearExpr(duration);
514 LinearExpr endExpr = LinearExpr.Sum(new LinearExpr[] { startExpr, durationExpr });
515
516 LinearExpressionProto startProto = GetLinearExpressionProto(startExpr);
517 LinearExpressionProto durationProto = GetLinearExpressionProto(durationExpr);
518 LinearExpressionProto endProto = GetLinearExpressionProto(endExpr);
519 return new IntervalVar(model_, startProto, durationProto, endProto, name);
520 }
521
522 public IntervalVar NewOptionalIntervalVar<S, D, E>(S start, D duration, E end, ILiteral is_present, string name)
523 {
524 LinearExpr startExpr = GetLinearExpr(start);
525 LinearExpr durationExpr = GetLinearExpr(duration);
526 LinearExpr endExpr = GetLinearExpr(end);
527 Add(startExpr + durationExpr == endExpr).OnlyEnforceIf(is_present);
528
529 LinearExpressionProto startProto = GetLinearExpressionProto(startExpr);
530 LinearExpressionProto durationProto = GetLinearExpressionProto(durationExpr);
531 LinearExpressionProto endProto = GetLinearExpressionProto(endExpr);
532 return new IntervalVar(model_, startProto, durationProto, endProto, is_present.GetIndex(), name);
533 }
534
535 public IntervalVar NewOptionalFixedSizeIntervalVar<S>(S start, long duration, ILiteral is_present, string name)
536 {
537 LinearExpr startExpr = GetLinearExpr(start);
538 LinearExpr durationExpr = GetLinearExpr(duration);
539 LinearExpr endExpr = LinearExpr.Sum(new LinearExpr[] { startExpr, durationExpr });
540
541 LinearExpressionProto startProto = GetLinearExpressionProto(startExpr);
542 LinearExpressionProto durationProto = GetLinearExpressionProto(durationExpr);
543 LinearExpressionProto endProto = GetLinearExpressionProto(endExpr);
544 return new IntervalVar(model_, startProto, durationProto, endProto, is_present.GetIndex(), name);
545 }
546
547 public Constraint AddNoOverlap(IEnumerable<IntervalVar> intervals)
548 {
549 Constraint ct = new Constraint(model_);
551 foreach (IntervalVar var in intervals)
552 {
553 args.Intervals.Add(var.GetIndex());
554 }
555 ct.Proto.NoOverlap = args;
556 return ct;
557 }
558
559 public Constraint AddNoOverlap2D(IEnumerable<IntervalVar> x_intervals, IEnumerable<IntervalVar> y_intervals)
560 {
561 Constraint ct = new Constraint(model_);
563 foreach (IntervalVar var in x_intervals)
564 {
565 args.XIntervals.Add(var.GetIndex());
566 }
567 foreach (IntervalVar var in y_intervals)
568 {
569 args.YIntervals.Add(var.GetIndex());
570 }
571 ct.Proto.NoOverlap2D = args;
572 return ct;
573 }
574
575 public Constraint AddCumulative<D, C>(IEnumerable<IntervalVar> intervals, IEnumerable<D> demands, C capacity)
576 {
577 Constraint ct = new Constraint(model_);
579 foreach (IntervalVar var in intervals)
580 {
581 cumul.Intervals.Add(var.GetIndex());
582 }
583 foreach (D demand in demands)
584 {
585 cumul.Demands.Add(GetOrCreateIndex(demand));
586 }
587 cumul.Capacity = GetOrCreateIndex(capacity);
588 ct.Proto.Cumulative = cumul;
589 return ct;
590 }
591
592 // Objective.
593 public void Minimize(LinearExpr obj)
594 {
595 SetObjective(obj, true);
596 }
597
598 public void Maximize(LinearExpr obj)
599 {
600 SetObjective(obj, false);
601 }
602
603 public void Minimize()
604 {
605 SetObjective(null, true);
606 }
607
608 public void Maximize()
609 {
610 SetObjective(null, false);
611 }
612
613 public void AddVarToObjective(IntVar var)
614 {
615 if ((Object)var == null)
616 return;
617 model_.Objective.Vars.Add(var.Index);
618 model_.Objective.Coeffs.Add(model_.Objective.ScalingFactor > 0 ? 1 : -1);
619 }
620
621 public void AddTermToObjective(IntVar var, long coeff)
622 {
623 if (coeff == 0 || (Object)var == null)
624 return;
625 model_.Objective.Vars.Add(var.Index);
626 model_.Objective.Coeffs.Add(model_.Objective.ScalingFactor > 0 ? coeff : -coeff);
627 }
628
629 bool HasObjective()
630 {
631 return model_.Objective == null;
632 }
633
634 // Search Decision.
635
636 public void AddDecisionStrategy(IEnumerable<IntVar> vars,
639 {
641 foreach (IntVar var in vars)
642 {
643 ds.Variables.Add(var.Index);
644 }
645 ds.VariableSelectionStrategy = var_str;
646 ds.DomainReductionStrategy = dom_str;
647 model_.SearchStrategy.Add(ds);
648 }
649
650 public void AddHint(IntVar var, long value)
651 {
652 if (model_.SolutionHint == null)
653 {
655 }
656 model_.SolutionHint.Vars.Add(var.GetIndex());
657 model_.SolutionHint.Values.Add(value);
658 }
659
660 public void ClearHints()
661 {
662 model_.SolutionHint = null;
663 }
664
665 public void AddAssumption(ILiteral lit)
666 {
667 model_.Assumptions.Add(lit.GetIndex());
668 }
669
670 public void AddAssumptions(IEnumerable<ILiteral> literals)
671 {
672 foreach (ILiteral lit in literals)
673 {
674 AddAssumption(lit);
675 }
676 }
677
678 public void ClearAssumptions()
679 {
680 model_.Assumptions.Clear();
681 }
682
683 // Internal methods.
684
685 void SetObjective(LinearExpr obj, bool minimize)
686 {
687 CpObjectiveProto objective = new CpObjectiveProto();
688 if (obj == null)
689 {
690 objective.Offset = 0L;
691 objective.ScalingFactor = minimize ? 1L : -1;
692 }
693 else if (obj is IntVar)
694 {
695 objective.Offset = 0L;
696 objective.Vars.Add(obj.Index);
697 if (minimize)
698 {
699 objective.Coeffs.Add(1L);
700 objective.ScalingFactor = 1L;
701 }
702 else
703 {
704 objective.Coeffs.Add(-1L);
705 objective.ScalingFactor = -1L;
706 }
707 }
708 else
709 {
710 Dictionary<IntVar, long> dict = new Dictionary<IntVar, long>();
711 long constant = LinearExpr.GetVarValueMap(obj, 1L, dict);
712 if (minimize)
713 {
714 objective.ScalingFactor = 1L;
715 objective.Offset = constant;
716 }
717 else
718 {
719 objective.ScalingFactor = -1L;
720 objective.Offset = -constant;
721 }
722 foreach (KeyValuePair<IntVar, long> it in dict)
723 {
724 objective.Vars.Add(it.Key.Index);
725 objective.Coeffs.Add(minimize ? it.Value : -it.Value);
726 }
727 }
728 model_.Objective = objective;
729 }
730 public String ModelStats()
731 {
732 return CpSatHelper.ModelStats(model_);
733 }
734
735 public Boolean ExportToFile(String filename)
736 {
737 return CpSatHelper.WriteModelToFile(model_, filename);
738 }
739
740 public String Validate()
741 {
742 return CpSatHelper.ValidateModel(model_);
743 }
744
745 private int ConvertConstant(long value)
746 {
747 if (constant_map_.ContainsKey(value))
748 {
749 return constant_map_[value];
750 }
751 else
752 {
753 int index = model_.Variables.Count;
754 IntegerVariableProto var = new IntegerVariableProto();
755 var.Domain.Add(value);
756 var.Domain.Add(value);
757 constant_map_.Add(value, index);
758 model_.Variables.Add(var);
759 return index;
760 }
761 }
762
763 private int GetOrCreateIndex<X>(X x)
764 {
765 if (typeof(X) == typeof(IntVar))
766 {
767 IntVar vx = (IntVar)(Object)x;
768 return vx.Index;
769 }
770 if (typeof(X) == typeof(long) || typeof(X) == typeof(int))
771 {
772 return ConvertConstant(Convert.ToInt64(x));
773 }
774 throw new ArgumentException("Cannot extract index from argument");
775 }
776
777 private LinearExpr GetLinearExpr<X>(X x)
778 {
779 if (typeof(X) == typeof(IntVar))
780 {
781 return (IntVar)(Object)x;
782 }
783 if (typeof(X) == typeof(long) || typeof(X) == typeof(int) || typeof(X) == typeof(short))
784 {
785 return new ConstantExpr(Convert.ToInt64(x));
786 }
787 if (typeof(X) == typeof(LinearExpr))
788 {
789 return (LinearExpr)(Object)x;
790 }
791 throw new ArgumentException("Cannot convert argument to LinearExpr");
792 }
793
794 private LinearExpressionProto GetLinearExpressionProto(LinearExpr expr)
795 {
796 Dictionary<IntVar, long> dict = new Dictionary<IntVar, long>();
797 long constant = LinearExpr.GetVarValueMap(expr, 1L, dict);
798 LinearExpressionProto linear = new LinearExpressionProto();
799 foreach (KeyValuePair<IntVar, long> term in dict)
800 {
801 linear.Vars.Add(term.Key.Index);
802 linear.Coeffs.Add(term.Value);
803 }
804 linear.Offset = constant;
805 return linear;
806 }
807
808 private CpModelProto model_;
809 private Dictionary<long, int> constant_map_;
810 }
811
812} // namespace Google.OrTools.Sat
All variables must take different values.
Definition: CpModel.pb.cs:1385
This constraint forces a sequence of variables to be accepted by an automaton.
Definition: CpModel.pb.cs:4613
Argument of the constraints of the form OP(literals).
Definition: CpModel.pb.cs:508
pbc::RepeatedField< int > Literals
Definition: CpModel.pb.cs:555
The circuit constraint is defined on a graph where the arc presence are controlled by literals.
Definition: CpModel.pb.cs:3573
pbc::RepeatedField< int > EnforcementLiteral
The constraint will be enforced iff all literals listed here are true.
Definition: CpModel.pb.cs:5302
global::Google.OrTools.Sat.IntegerArgumentProto?? IntDiv
The int_div constraint forces the target to equal vars[0] / vars[1].
Definition: CpModel.pb.cs:5415
global::Google.OrTools.Sat.IntegerArgumentProto?? IntMod
The int_mod constraint forces the target to equal vars[0] % vars[1].
Definition: CpModel.pb.cs:5432
global::Google.OrTools.Sat.IntegerArgumentProto?? IntMax
The int_max constraint forces the target to equal the maximum of all variables.
Definition: CpModel.pb.cs:5453
global::Google.OrTools.Sat.BoolArgumentProto?? BoolOr
The bool_or constraint forces at least one literal to be true.
Definition: CpModel.pb.cs:5313
global::Google.OrTools.Sat.TableConstraintProto?? Table
The table constraint enforces what values a tuple of variables may take.
Definition: CpModel.pb.cs:5615
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:5537
void OnlyEnforceIf(ILiteral lit)
Definition: Constraints.cs:28
A constraint programming problem.
Definition: CpModel.pb.cs:8770
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:8891
global::Google.OrTools.Sat.PartialVariableAssignment SolutionHint
Solution hint.
Definition: CpModel.pb.cs:8913
pbc::RepeatedField< global::Google.OrTools.Sat.IntegerVariableProto > Variables
The associated Protos should be referred by their index in these fields.
Definition: CpModel.pb.cs:8842
pbc::RepeatedField< global::Google.OrTools.Sat.ConstraintProto > Constraints
Definition: CpModel.pb.cs:8853
pbc::RepeatedField< int > Assumptions
A list of literals.
Definition: CpModel.pb.cs:8942
global::Google.OrTools.Sat.CpObjectiveProto Objective
The objective to minimize.
Definition: CpModel.pb.cs:8865
Wrapper class around the cp_model proto.
Definition: CpModel.cs:24
void AddAssumption(ILiteral lit)
Definition: CpModel.cs:665
Constraint AddInverse(IEnumerable< IntVar > direct, IEnumerable< IntVar > reverse)
Definition: CpModel.cs:276
Constraint AddReservoirConstraintWithActive< I >(IEnumerable< IntVar > times, IEnumerable< I > demands, IEnumerable< IntVar > actives, long min_level, long max_level)
Definition: CpModel.cs:313
void Minimize(LinearExpr obj)
Definition: CpModel.cs:593
Constraint AddBoolXor(IEnumerable< ILiteral > literals)
Definition: CpModel.cs:406
void AddMapDomain(IntVar var, IEnumerable< IntVar > bool_vars, long offset=0)
Definition: CpModel.cs:338
IntVar NewBoolVar(string name)
Definition: CpModel.cs:69
Constraint AddAbsEquality(IntVar target, IntVar var)
Definition: CpModel.cs:455
void AddDecisionStrategy(IEnumerable< IntVar > vars, DecisionStrategyProto.Types.VariableSelectionStrategy var_str, DecisionStrategyProto.Types.DomainReductionStrategy dom_str)
Definition: CpModel.cs:636
Constraint AddDivisionEquality< T, N, D >(T target, N num, D denom)
Definition: CpModel.cs:444
Constraint AddLinearExpressionInDomain(LinearExpr linear_expr, Domain domain)
Definition: CpModel.cs:79
Constraint AddNoOverlap(IEnumerable< IntervalVar > intervals)
Definition: CpModel.cs:547
Constraint AddReservoirConstraint< I >(IEnumerable< IntVar > times, IEnumerable< I > demands, long min_level, long max_level)
Definition: CpModel.cs:292
Constraint AddProdEquality(IntVar target, IEnumerable< IntVar > vars)
Definition: CpModel.cs:490
IntVar NewConstant(long value)
Definition: CpModel.cs:59
Constraint AddLinearConstraint(LinearExpr linear_expr, long lb, long ub)
Definition: CpModel.cs:74
void AddHint(IntVar var, long value)
Definition: CpModel.cs:650
Constraint AddElement(IntVar index, IEnumerable< IntVar > vars, IntVar target)
Definition: CpModel.cs:144
Boolean ExportToFile(String filename)
Definition: CpModel.cs:735
void AddVarToObjective(IntVar var)
Definition: CpModel.cs:613
void Maximize(LinearExpr obj)
Definition: CpModel.cs:598
Constraint AddImplication(ILiteral a, ILiteral b)
Definition: CpModel.cs:372
IntVar NewIntVar(long lb, long ub, string name)
Definition: CpModel.cs:47
Constraint AddBoolAnd(IEnumerable< ILiteral > literals)
Definition: CpModel.cs:394
Constraint AddBoolOr(IEnumerable< ILiteral > literals)
Definition: CpModel.cs:382
Constraint AddModuloEquality< T, V, M >(T target, V v, M m)
Definition: CpModel.cs:466
Constraint AddElement(IntVar index, IEnumerable< long > values, IntVar target)
Definition: CpModel.cs:158
Constraint AddForbiddenAssignments(IEnumerable< IntVar > vars, long[,] tuples)
Definition: CpModel.cs:219
IntVar NewConstant(long value, string name)
Definition: CpModel.cs:64
Constraint AddAllDifferent(IEnumerable< IntVar > vars)
Definition: CpModel.cs:132
Constraint AddMultiplicationEquality(IntVar target, IEnumerable< IntVar > vars)
Definition: CpModel.cs:477
IntVar NewIntVarFromDomain(Domain domain, string name)
Definition: CpModel.cs:52
Constraint AddNoOverlap2D(IEnumerable< IntervalVar > x_intervals, IEnumerable< IntervalVar > y_intervals)
Definition: CpModel.cs:559
Constraint AddAllowedAssignments(IEnumerable< IntVar > vars, long[,] tuples)
Definition: CpModel.cs:200
Constraint AddMaxEquality(IntVar target, IEnumerable< IntVar > vars)
Definition: CpModel.cs:431
IntervalVar NewOptionalIntervalVar< S, D, E >(S start, D duration, E end, ILiteral is_present, string name)
Definition: CpModel.cs:522
Constraint AddElement(IntVar index, IEnumerable< int > values, IntVar target)
Definition: CpModel.cs:172
Constraint AddCumulative< D, C >(IEnumerable< IntervalVar > intervals, IEnumerable< D > demands, C capacity)
Definition: CpModel.cs:575
IntervalVar NewOptionalFixedSizeIntervalVar< S >(S start, long duration, ILiteral is_present, string name)
Definition: CpModel.cs:535
CpModelProto Model
Definition: CpModel.cs:34
void AddTermToObjective(IntVar var, long coeff)
Definition: CpModel.cs:621
Constraint AddAutomaton(IEnumerable< IntVar > vars, long starting_state, IEnumerable< Tuple< long, long, long > > transitions, IEnumerable< long > final_states)
Definition: CpModel.cs:251
Constraint Add(BoundedLinearExpression lin)
Definition: CpModel.cs:105
IntervalVar NewFixedSizeIntervalVar< S >(S start, long duration, string name)
Definition: CpModel.cs:510
Constraint AddMinEquality(IntVar target, IEnumerable< IntVar > vars)
Definition: CpModel.cs:418
Constraint AddAutomaton(IEnumerable< IntVar > vars, long starting_state, long[,] transitions, IEnumerable< long > final_states)
Definition: CpModel.cs:226
Constraint AddCircuit(IEnumerable< Tuple< int, int, ILiteral > > arcs)
Definition: CpModel.cs:186
void AddAssumptions(IEnumerable< ILiteral > literals)
Definition: CpModel.cs:670
IntervalVar NewIntervalVar< S, D, E >(S start, D duration, E end, string name)
Definition: CpModel.cs:497
double Offset
The displayed objective is always: scaling_factor * (sum(coefficients[i] * objective_vars[i]) + offse...
Definition: CpModel.pb.cs:7008
pbc::RepeatedField< int > Vars
The linear terms of the objective to minimize.
Definition: CpModel.pb.cs:6979
pbc::RepeatedField< long > Coeffs
Definition: CpModel.pb.cs:6990
static string ValidateModel(Google.OrTools.Sat.CpModelProto model_proto)
Definition: CpSatHelper.cs:59
static bool WriteModelToFile(Google.OrTools.Sat.CpModelProto model_proto, string filename)
Definition: CpSatHelper.cs:69
static string ModelStats(Google.OrTools.Sat.CpModelProto model_proto)
Definition: CpSatHelper.cs:49
The sum of the demands of the intervals at each interval point cannot exceed a capacity.
Definition: CpModel.pb.cs:2945
Container for nested types declared in the DecisionStrategyProto message type.
Definition: CpModel.pb.cs:7539
VariableSelectionStrategy
The order in which the variables above should be considered.
Definition: CpModel.pb.cs:7546
DomainReductionStrategy
Once a variable has been chosen, this enum describe what decision is taken on its domain.
Definition: CpModel.pb.cs:7560
Define the strategy to follow when the solver needs to take a new decision.
Definition: CpModel.pb.cs:7256
The constraint target = vars[index].
Definition: CpModel.pb.cs:1816
Argument of the constraints of the form target_var = OP(vars).
Definition: CpModel.pb.cs:691
pbc::RepeatedField< int > Vars
Definition: CpModel.pb.cs:751
The two arrays of variable each represent a function, the second is the inverse of the first: f_direc...
Definition: CpModel.pb.cs:4401
The linear sum vars[i] * coeffs[i] must fall in the given domain.
Definition: CpModel.pb.cs:1573
pbc::RepeatedField< int > Vars
Definition: CpModel.pb.cs:1622
pbc::RepeatedField< long > Coeffs
Same size as vars.
Definition: CpModel.pb.cs:1636
pbc::RepeatedField< long > Domain
Definition: CpModel.pb.cs:1647
static long GetVarValueMap(LinearExpr e, long initial_coeff, Dictionary< IntVar, long > dict)
static LinearExpr Sum(IEnumerable< IntVar > vars)
Some constraints supports linear expression instead of just using a reference to a variable.
Definition: CpModel.pb.cs:913
The boxes defined by [start_x, end_x) * [start_y, end_y) cannot overlap.
Definition: CpModel.pb.cs:2686
All the intervals (index of IntervalConstraintProto) must be disjoint.
Definition: CpModel.pb.cs:2501
This message encodes a partial (or full) assignment of the variables of a CpModelProto.
Definition: CpModel.pb.cs:7851
Maintain a reservoir level within bounds.
Definition: CpModel.pb.cs:3243
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:4148
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:4221
static Domain FromFlatIntervals(long[] flat_intervals)
Definition: Domain.cs:79