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{
16using System;
17using System.Collections.Generic;
18using Google.OrTools.Util;
19
23public 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, Domain.FromFlatIntervals(new long[] { Int64.MinValue, -1, 1, Int64.MaxValue }));
118 }
119 case BoundedLinearExpression.Type.VarEqCst: {
120 return AddLinearExpressionInDomain(lin.Left, new Domain(lin.Lb, lin.Lb));
121 }
122 case BoundedLinearExpression.Type.VarDiffCst: {
124 lin.Left,
125 Domain.FromFlatIntervals(new long[] { Int64.MinValue, lin.Lb - 1, lin.Lb + 1, Int64.MaxValue }));
126 }
127 }
128 return null;
129 }
130
131 public Constraint AddAllDifferent(IEnumerable<IntVar> vars)
132 {
133 Constraint ct = new Constraint(model_);
135 foreach (IntVar var in vars)
136 {
137 alldiff.Exprs.Add(GetLinearExpressionProto(var));
138 }
139 ct.Proto.AllDiff = alldiff;
140 return ct;
141 }
142
143 public Constraint AddAllDifferent(IEnumerable<LinearExpr> exprs)
144 {
145 Constraint ct = new Constraint(model_);
147 foreach (LinearExpr expr in exprs)
148 {
149 alldiff.Exprs.Add(GetLinearExpressionProto(expr));
150 }
151
152 ct.Proto.AllDiff = alldiff;
153 return ct;
154 }
155
156 public Constraint AddElement(IntVar index, IEnumerable<IntVar> vars, IntVar target)
157 {
158 Constraint ct = new Constraint(model_);
160 element.Index = index.Index;
161 foreach (IntVar var in vars)
162 {
163 element.Vars.Add(var.Index);
164 }
165 element.Target = target.Index;
166 ct.Proto.Element = element;
167 return ct;
168 }
169
170 public Constraint AddElement(IntVar index, IEnumerable<long> values, IntVar target)
171 {
172 Constraint ct = new Constraint(model_);
174 element.Index = index.Index;
175 foreach (long value in values)
176 {
177 element.Vars.Add(ConvertConstant(value));
178 }
179 element.Target = target.Index;
180 ct.Proto.Element = element;
181 return ct;
182 }
183
184 public Constraint AddElement(IntVar index, IEnumerable<int> values, IntVar target)
185 {
186 Constraint ct = new Constraint(model_);
188 element.Index = index.Index;
189 foreach (int value in values)
190 {
191 element.Vars.Add(ConvertConstant(value));
192 }
193 element.Target = target.Index;
194 ct.Proto.Element = element;
195 return ct;
196 }
197
198 public Constraint AddCircuit(IEnumerable<Tuple<int, int, ILiteral>> arcs)
199 {
200 Constraint ct = new Constraint(model_);
202 foreach (var arc in arcs)
203 {
204 circuit.Tails.Add(arc.Item1);
205 circuit.Heads.Add(arc.Item2);
206 circuit.Literals.Add(arc.Item3.GetIndex());
207 }
208 ct.Proto.Circuit = circuit;
209 return ct;
210 }
211
212 public Constraint AddAllowedAssignments(IEnumerable<IntVar> vars, long[,] tuples)
213 {
214 Constraint ct = new Constraint(model_);
216 foreach (IntVar var in vars)
217 {
218 table.Vars.Add(var.Index);
219 }
220 for (int i = 0; i < tuples.GetLength(0); ++i)
221 {
222 for (int j = 0; j < tuples.GetLength(1); ++j)
223 {
224 table.Values.Add(tuples[i, j]);
225 }
226 }
227 ct.Proto.Table = table;
228 return ct;
229 }
230
231 public Constraint AddForbiddenAssignments(IEnumerable<IntVar> vars, 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, long starting_state, long[,] transitions,
239 IEnumerable<long> final_states)
240 {
241 Constraint ct = new Constraint(model_);
243 foreach (IntVar var in vars)
244 {
245 aut.Vars.Add(var.Index);
246 }
247 aut.StartingState = starting_state;
248 foreach (long f in final_states)
249 {
250 aut.FinalStates.Add(f);
251 }
252 for (int i = 0; i < transitions.GetLength(0); ++i)
253 {
254 aut.TransitionTail.Add(transitions[i, 0]);
255 aut.TransitionLabel.Add(transitions[i, 1]);
256 aut.TransitionHead.Add(transitions[i, 2]);
257 }
258
259 ct.Proto.Automaton = aut;
260 return ct;
261 }
262
263 public Constraint AddAutomaton(IEnumerable<IntVar> vars, long starting_state,
264 IEnumerable<Tuple<long, long, long>> transitions, IEnumerable<long> final_states)
265 {
266 Constraint ct = new Constraint(model_);
268 foreach (IntVar var in vars)
269 {
270 aut.Vars.Add(var.Index);
271 }
272 aut.StartingState = starting_state;
273 foreach (long f in final_states)
274 {
275 aut.FinalStates.Add(f);
276 }
277 foreach (Tuple<long, long, long> transition in transitions)
278 {
279 aut.TransitionHead.Add(transition.Item1);
280 aut.TransitionLabel.Add(transition.Item2);
281 aut.TransitionTail.Add(transition.Item3);
282 }
283
284 ct.Proto.Automaton = aut;
285 return ct;
286 }
287
288 public Constraint AddInverse(IEnumerable<IntVar> direct, IEnumerable<IntVar> reverse)
289 {
290 Constraint ct = new Constraint(model_);
292 foreach (IntVar var in direct)
293 {
294 inverse.FDirect.Add(var.Index);
295 }
296 foreach (IntVar var in reverse)
297 {
298 inverse.FInverse.Add(var.Index);
299 }
300 ct.Proto.Inverse = inverse;
301 return ct;
302 }
303
304 public Constraint AddReservoirConstraint<I>(IEnumerable<IntVar> times, IEnumerable<I> levelChanges, long minLevel,
305 long maxLevel)
306 {
307 Constraint ct = new Constraint(model_);
309 foreach (IntVar time in times)
310 {
311 res.TimeExprs.Add(GetLinearExpressionProto(time));
312 }
313 foreach (I d in levelChanges)
314 {
315 res.LevelChanges.Add(Convert.ToInt64(d));
316 }
317
318 res.MinLevel = minLevel;
319 res.MaxLevel = maxLevel;
320 ct.Proto.Reservoir = res;
321
322 return ct;
323 }
324
325 public Constraint AddReservoirConstraintWithActive<I>(IEnumerable<IntVar> times, IEnumerable<I> levelChanges,
326 IEnumerable<IntVar> actives, long minLevel, long maxLevel)
327 {
328 Constraint ct = new Constraint(model_);
330 foreach (IntVar time in times)
331 {
332 res.TimeExprs.Add(GetLinearExpressionProto(time));
333 }
334 foreach (I d in levelChanges)
335 {
336 res.LevelChanges.Add(Convert.ToInt64(d));
337 }
338 foreach (IntVar var in actives)
339 {
340 res.ActiveLiterals.Add(var.Index);
341 }
342 res.MinLevel = minLevel;
343 res.MaxLevel = maxLevel;
344 ct.Proto.Reservoir = res;
345
346 return ct;
347 }
348
349 public Constraint AddReservoirConstraint<I>(IEnumerable<LinearExpr> times, IEnumerable<I> levelChanges,
350 long minLevel, long maxLevel)
351 {
352 Constraint ct = new Constraint(model_);
354 foreach (LinearExpr time in times)
355 {
356 res.TimeExprs.Add(GetLinearExpressionProto(time));
357 }
358 foreach (I d in levelChanges)
359 {
360 res.LevelChanges.Add(Convert.ToInt64(d));
361 }
362
363 res.MinLevel = minLevel;
364 res.MaxLevel = maxLevel;
365 ct.Proto.Reservoir = res;
366
367 return ct;
368 }
369
370 public Constraint AddReservoirConstraintWithActive<I>(IEnumerable<LinearExpr> times, IEnumerable<I> levelChanges,
371 IEnumerable<IntVar> actives, long minLevel, long maxLevel)
372 {
373 Constraint ct = new Constraint(model_);
375 foreach (LinearExpr time in times)
376 {
377 res.TimeExprs.Add(GetLinearExpressionProto(time));
378 }
379 foreach (I d in levelChanges)
380 {
381 res.LevelChanges.Add(Convert.ToInt64(d));
382 }
383 foreach (IntVar var in actives)
384 {
385 res.ActiveLiterals.Add(var.Index);
386 }
387 res.MinLevel = minLevel;
388 res.MaxLevel = maxLevel;
389 ct.Proto.Reservoir = res;
390
391 return ct;
392 }
393
394 public void AddMapDomain(IntVar var, IEnumerable<IntVar> bool_vars, long offset = 0)
395 {
396 int i = 0;
397 foreach (IntVar bool_var in bool_vars)
398 {
399 int b_index = bool_var.Index;
400 int var_index = var.Index;
401
404 lin1.Vars.Add(var_index);
405 lin1.Coeffs.Add(1L);
406 lin1.Domain.Add(offset + i);
407 lin1.Domain.Add(offset + i);
408 ct1.Linear = lin1;
409 ct1.EnforcementLiteral.Add(b_index);
410 model_.Constraints.Add(ct1);
411
414 lin2.Vars.Add(var_index);
415 lin2.Coeffs.Add(1L);
416 lin2.Domain.Add(Int64.MinValue);
417 lin2.Domain.Add(offset + i - 1);
418 lin2.Domain.Add(offset + i + 1);
419 lin2.Domain.Add(Int64.MaxValue);
420 ct2.Linear = lin2;
421 ct2.EnforcementLiteral.Add(-b_index - 1);
422 model_.Constraints.Add(ct2);
423
424 i++;
425 }
426 }
427
429 {
430 Constraint ct = new Constraint(model_);
432 or.Literals.Add(a.Not().GetIndex());
433 or.Literals.Add(b.GetIndex());
434 ct.Proto.BoolOr = or;
435 return ct;
436 }
437
438 public Constraint AddBoolOr(IEnumerable<ILiteral> literals)
439 {
440 Constraint ct = new Constraint(model_);
441 BoolArgumentProto bool_argument = new BoolArgumentProto();
442 foreach (ILiteral lit in literals)
443 {
444 bool_argument.Literals.Add(lit.GetIndex());
445 }
446 ct.Proto.BoolOr = bool_argument;
447 return ct;
448 }
449
450 public Constraint AddBoolAnd(IEnumerable<ILiteral> literals)
451 {
452 Constraint ct = new Constraint(model_);
453 BoolArgumentProto bool_argument = new BoolArgumentProto();
454 foreach (ILiteral lit in literals)
455 {
456 bool_argument.Literals.Add(lit.GetIndex());
457 }
458 ct.Proto.BoolAnd = bool_argument;
459 return ct;
460 }
461
462 public Constraint AddBoolXor(IEnumerable<ILiteral> literals)
463 {
464 Constraint ct = new Constraint(model_);
465 BoolArgumentProto bool_argument = new BoolArgumentProto();
466 foreach (ILiteral lit in literals)
467 {
468 bool_argument.Literals.Add(lit.GetIndex());
469 }
470 ct.Proto.BoolXor = bool_argument;
471 return ct;
472 }
473
474 public Constraint AddMinEquality(LinearExpr target, IEnumerable<IntVar> vars)
475 {
476 Constraint ct = new Constraint(model_);
478 foreach (IntVar var in vars)
479 {
480 args.Exprs.Add(GetLinearExpressionProto(var, /*negate=*/true));
481 }
482 args.Target = GetLinearExpressionProto(target, /*negate=*/true);
483 ct.Proto.LinMax = args;
484 return ct;
485 }
486
487 public Constraint AddMinEquality(LinearExpr target, IEnumerable<LinearExpr> exprs)
488 {
489 Constraint ct = new Constraint(model_);
491 foreach (LinearExpr expr in exprs)
492 {
493 args.Exprs.Add(GetLinearExpressionProto(expr, /*negate=*/true));
494 }
495 args.Target = GetLinearExpressionProto(target, /*negate=*/true);
496 ct.Proto.LinMax = args;
497 return ct;
498 }
499
500 public Constraint AddMaxEquality(IntVar target, IEnumerable<IntVar> vars)
501 {
502 Constraint ct = new Constraint(model_);
504 foreach (IntVar var in vars)
505 {
506 args.Exprs.Add(GetLinearExpressionProto(var));
507 }
508 args.Target = GetLinearExpressionProto(target);
509 ct.Proto.LinMax = args;
510 return ct;
511 }
512
513 public Constraint AddMaxEquality(LinearExpr target, IEnumerable<LinearExpr> exprs)
514 {
515 Constraint ct = new Constraint(model_);
517 foreach (LinearExpr expr in exprs)
518 {
519 args.Exprs.Add(GetLinearExpressionProto(expr));
520 }
521 args.Target = GetLinearExpressionProto(target);
522 ct.Proto.LinMax = args;
523 return ct;
524 }
525
526 public Constraint AddDivisionEquality<T, N, D>(T target, N num, D denom)
527 {
528 Constraint ct = new Constraint(model_);
530 args.Exprs.Add(GetLinearExpressionProto(GetLinearExpr(num)));
531 args.Exprs.Add(GetLinearExpressionProto(GetLinearExpr(denom)));
532 args.Target = GetLinearExpressionProto(GetLinearExpr(target));
533 ct.Proto.IntDiv = args;
534 return ct;
535 }
536
538 {
539 Constraint ct = new Constraint(model_);
541 args.Exprs.Add(GetLinearExpressionProto(expr));
542 args.Exprs.Add(GetLinearExpressionProto(expr, /*negate=*/true));
543 args.Target = GetLinearExpressionProto(target);
544 ct.Proto.LinMax = args;
545 return ct;
546 }
547
548 public Constraint AddModuloEquality<T, V, M>(T target, V v, M m)
549 {
550 Constraint ct = new Constraint(model_);
552 args.Exprs.Add(GetLinearExpressionProto(GetLinearExpr(v)));
553 args.Exprs.Add(GetLinearExpressionProto(GetLinearExpr(m)));
554 args.Target = GetLinearExpressionProto(GetLinearExpr(target));
555 ct.Proto.IntMod = args;
556 return ct;
557 }
558
559 public Constraint AddMultiplicationEquality(LinearExpr target, IEnumerable<IntVar> vars)
560 {
561 Constraint ct = new Constraint(model_);
563 args.Target = GetLinearExpressionProto(target);
564 foreach (IntVar var in vars)
565 {
566 args.Exprs.Add(GetLinearExpressionProto(var));
567 }
568 ct.Proto.IntProd = args;
569 return ct;
570 }
571
572 public Constraint AddMultiplicationEquality(LinearExpr target, IEnumerable<LinearExpr> exprs)
573 {
574 Constraint ct = new Constraint(model_);
576 args.Target = GetLinearExpressionProto(target);
577 foreach (LinearExpr expr in exprs)
578 {
579 args.Exprs.Add(GetLinearExpressionProto(expr));
580 }
581 ct.Proto.IntProd = args;
582 return ct;
583 }
584
585 public Constraint AddProdEquality(IntVar target, IEnumerable<IntVar> vars)
586 {
587 return AddMultiplicationEquality(target, vars);
588 }
589
590 // Scheduling support
591
592 public IntervalVar NewIntervalVar<S, D, E>(S start, D duration, E end, string name)
593 {
594 LinearExpr startExpr = GetLinearExpr(start);
595 LinearExpr durationExpr = GetLinearExpr(duration);
596 LinearExpr endExpr = GetLinearExpr(end);
597 Add(startExpr + durationExpr == endExpr);
598
599 LinearExpressionProto startProto = GetLinearExpressionProto(startExpr);
600 LinearExpressionProto durationProto = GetLinearExpressionProto(durationExpr);
601 LinearExpressionProto endProto = GetLinearExpressionProto(endExpr);
602 return new IntervalVar(model_, startProto, durationProto, endProto, name);
603 }
604
605 public IntervalVar NewFixedSizeIntervalVar<S>(S start, long duration, string name)
606 {
607 LinearExpr startExpr = GetLinearExpr(start);
608 LinearExpr durationExpr = GetLinearExpr(duration);
609 LinearExpr endExpr = LinearExpr.Sum(new LinearExpr[] { startExpr, durationExpr });
610
611 LinearExpressionProto startProto = GetLinearExpressionProto(startExpr);
612 LinearExpressionProto durationProto = GetLinearExpressionProto(durationExpr);
613 LinearExpressionProto endProto = GetLinearExpressionProto(endExpr);
614 return new IntervalVar(model_, startProto, durationProto, endProto, name);
615 }
616
617 public IntervalVar NewOptionalIntervalVar<S, D, E>(S start, D duration, E end, ILiteral is_present, string name)
618 {
619 LinearExpr startExpr = GetLinearExpr(start);
620 LinearExpr durationExpr = GetLinearExpr(duration);
621 LinearExpr endExpr = GetLinearExpr(end);
622 Add(startExpr + durationExpr == endExpr).OnlyEnforceIf(is_present);
623
624 LinearExpressionProto startProto = GetLinearExpressionProto(startExpr);
625 LinearExpressionProto durationProto = GetLinearExpressionProto(durationExpr);
626 LinearExpressionProto endProto = GetLinearExpressionProto(endExpr);
627 return new IntervalVar(model_, startProto, durationProto, endProto, is_present.GetIndex(), name);
628 }
629
630 public IntervalVar NewOptionalFixedSizeIntervalVar<S>(S start, long duration, ILiteral is_present, string name)
631 {
632 LinearExpr startExpr = GetLinearExpr(start);
633 LinearExpr durationExpr = GetLinearExpr(duration);
634 LinearExpr endExpr = LinearExpr.Sum(new LinearExpr[] { startExpr, durationExpr });
635
636 LinearExpressionProto startProto = GetLinearExpressionProto(startExpr);
637 LinearExpressionProto durationProto = GetLinearExpressionProto(durationExpr);
638 LinearExpressionProto endProto = GetLinearExpressionProto(endExpr);
639 return new IntervalVar(model_, startProto, durationProto, endProto, is_present.GetIndex(), name);
640 }
641
642 public Constraint AddNoOverlap(IEnumerable<IntervalVar> intervals)
643 {
644 Constraint ct = new Constraint(model_);
646 foreach (IntervalVar var in intervals)
647 {
648 args.Intervals.Add(var.GetIndex());
649 }
650 ct.Proto.NoOverlap = args;
651 return ct;
652 }
653
654 public Constraint AddNoOverlap2D(IEnumerable<IntervalVar> x_intervals, IEnumerable<IntervalVar> y_intervals)
655 {
656 Constraint ct = new Constraint(model_);
658 foreach (IntervalVar var in x_intervals)
659 {
660 args.XIntervals.Add(var.GetIndex());
661 }
662 foreach (IntervalVar var in y_intervals)
663 {
664 args.YIntervals.Add(var.GetIndex());
665 }
666 ct.Proto.NoOverlap2D = args;
667 return ct;
668 }
669
670 public Constraint AddCumulative<D, C>(IEnumerable<IntervalVar> intervals, IEnumerable<D> demands, C capacity)
671 {
672 Constraint ct = new Constraint(model_);
674 foreach (IntervalVar var in intervals)
675 {
676 cumul.Intervals.Add(var.GetIndex());
677 }
678 foreach (D demand in demands)
679 {
680 LinearExpr demandExpr = GetLinearExpr(demand);
681 cumul.Demands.Add(GetLinearExpressionProto(demandExpr));
682 }
683 LinearExpr capacityExpr = GetLinearExpr(capacity);
684 cumul.Capacity = GetLinearExpressionProto(capacityExpr);
685 ct.Proto.Cumulative = cumul;
686 return ct;
687 }
688
689 // Objective.
690 public void Minimize(LinearExpr obj)
691 {
692 SetObjective(obj, true);
693 }
694
695 public void Maximize(LinearExpr obj)
696 {
697 SetObjective(obj, false);
698 }
699
700 public void Minimize()
701 {
702 SetObjective(null, true);
703 }
704
705 public void Maximize()
706 {
707 SetObjective(null, false);
708 }
709
710 public void AddVarToObjective(IntVar var)
711 {
712 if ((Object)var == null)
713 return;
714 model_.Objective.Vars.Add(var.Index);
715 model_.Objective.Coeffs.Add(model_.Objective.ScalingFactor > 0 ? 1 : -1);
716 }
717
718 public void AddTermToObjective(IntVar var, long coeff)
719 {
720 if (coeff == 0 || (Object)var == null)
721 return;
722 model_.Objective.Vars.Add(var.Index);
723 model_.Objective.Coeffs.Add(model_.Objective.ScalingFactor > 0 ? coeff : -coeff);
724 }
725
726 bool HasObjective()
727 {
728 return model_.Objective == null;
729 }
730
731 // Search Decision.
732
733 public void AddDecisionStrategy(IEnumerable<IntVar> vars,
736 {
738 foreach (IntVar var in vars)
739 {
740 ds.Variables.Add(var.Index);
741 }
742 ds.VariableSelectionStrategy = var_str;
743 ds.DomainReductionStrategy = dom_str;
744 model_.SearchStrategy.Add(ds);
745 }
746
747 public void AddHint(IntVar var, long value)
748 {
749 if (model_.SolutionHint == null)
750 {
752 }
753 model_.SolutionHint.Vars.Add(var.GetIndex());
754 model_.SolutionHint.Values.Add(value);
755 }
756
757 public void ClearHints()
758 {
759 model_.SolutionHint = null;
760 }
761
762 public void AddAssumption(ILiteral lit)
763 {
764 model_.Assumptions.Add(lit.GetIndex());
765 }
766
767 public void AddAssumptions(IEnumerable<ILiteral> literals)
768 {
769 foreach (ILiteral lit in literals)
770 {
771 AddAssumption(lit);
772 }
773 }
774
775 public void ClearAssumptions()
776 {
777 model_.Assumptions.Clear();
778 }
779
780 // Internal methods.
781
782 void SetObjective(LinearExpr obj, bool minimize)
783 {
784 CpObjectiveProto objective = new CpObjectiveProto();
785 if (obj == null)
786 {
787 objective.Offset = 0L;
788 objective.ScalingFactor = minimize ? 1L : -1;
789 }
790 else if (obj is IntVar)
791 {
792 objective.Offset = 0L;
793 objective.Vars.Add(obj.Index);
794 if (minimize)
795 {
796 objective.Coeffs.Add(1L);
797 objective.ScalingFactor = 1L;
798 }
799 else
800 {
801 objective.Coeffs.Add(-1L);
802 objective.ScalingFactor = -1L;
803 }
804 }
805 else
806 {
807 Dictionary<IntVar, long> dict = new Dictionary<IntVar, long>();
808 long constant = LinearExpr.GetVarValueMap(obj, 1L, dict);
809 if (minimize)
810 {
811 objective.ScalingFactor = 1L;
812 objective.Offset = constant;
813 }
814 else
815 {
816 objective.ScalingFactor = -1L;
817 objective.Offset = -constant;
818 }
819 foreach (KeyValuePair<IntVar, long> it in dict)
820 {
821 objective.Vars.Add(it.Key.Index);
822 objective.Coeffs.Add(minimize ? it.Value : -it.Value);
823 }
824 }
825 model_.Objective = objective;
826 }
827 public String ModelStats()
828 {
829 return CpSatHelper.ModelStats(model_);
830 }
831
832 public Boolean ExportToFile(String filename)
833 {
834 return CpSatHelper.WriteModelToFile(model_, filename);
835 }
836
837 public String Validate()
838 {
839 return CpSatHelper.ValidateModel(model_);
840 }
841
842 private int ConvertConstant(long value)
843 {
844 if (constant_map_.ContainsKey(value))
845 {
846 return constant_map_[value];
847 }
848 else
849 {
850 int index = model_.Variables.Count;
851 IntegerVariableProto var = new IntegerVariableProto();
852 var.Domain.Add(value);
853 var.Domain.Add(value);
854 constant_map_.Add(value, index);
855 model_.Variables.Add(var);
856 return index;
857 }
858 }
859
860 private int GetOrCreateIndex<X>(X x)
861 {
862 if (typeof(X) == typeof(IntVar))
863 {
864 IntVar vx = (IntVar)(Object)x;
865 return vx.Index;
866 }
867 if (typeof(X) == typeof(long) || typeof(X) == typeof(int))
868 {
869 return ConvertConstant(Convert.ToInt64(x));
870 }
871 throw new ArgumentException("Cannot extract index from argument");
872 }
873
874 private LinearExpr GetLinearExpr<X>(X x)
875 {
876 if (typeof(X) == typeof(IntVar))
877 {
878 return (IntVar)(Object)x;
879 }
880 if (typeof(X) == typeof(long) || typeof(X) == typeof(int) || typeof(X) == typeof(short))
881 {
882 return new ConstantExpr(Convert.ToInt64(x));
883 }
884 if (typeof(X) == typeof(LinearExpr))
885 {
886 return (LinearExpr)(Object)x;
887 }
888 throw new ArgumentException("Cannot convert argument to LinearExpr");
889 }
890
891 private LinearExpressionProto GetLinearExpressionProto(LinearExpr expr, bool negate = false)
892 {
893 Dictionary<IntVar, long> dict = new Dictionary<IntVar, long>();
894 long constant = LinearExpr.GetVarValueMap(expr, 1L, dict);
895 long mult = negate ? -1 : 1;
896 LinearExpressionProto linear = new LinearExpressionProto();
897 foreach (KeyValuePair<IntVar, long> term in dict)
898 {
899 linear.Vars.Add(term.Key.Index);
900 linear.Coeffs.Add(term.Value * mult);
901 }
902 linear.Offset = constant * mult;
903 return linear;
904 }
905
906 private CpModelProto model_;
907 private Dictionary<long, int> constant_map_;
908}
909
910} // namespace Google.OrTools.Sat
All affine expressions must take different values.
Definition: CpModel.pb.cs:1171
This constraint forces a sequence of variables to be accepted by an automaton.
Definition: CpModel.pb.cs:4245
Argument of the constraints of the form OP(literals).
Definition: CpModel.pb.cs:514
pbc::RepeatedField< int > Literals
Definition: CpModel.pb.cs:561
The circuit constraint is defined on a graph where the arc presence are controlled by literals.
Definition: CpModel.pb.cs:3205
global::Google.OrTools.Sat.LinearArgumentProto?? IntMod
The int_mod constraint forces the target to equal exprs[0] % exprs[1].
Definition: CpModel.pb.cs:5055
pbc::RepeatedField< int > EnforcementLiteral
The constraint will be enforced iff all literals listed here are true.
Definition: CpModel.pb.cs:4925
global::Google.OrTools.Sat.BoolArgumentProto?? BoolOr
The bool_or constraint forces at least one literal to be true.
Definition: CpModel.pb.cs:4936
global::Google.OrTools.Sat.TableConstraintProto?? Table
The table constraint enforces what values a tuple of variables may take.
Definition: CpModel.pb.cs:5189
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:5111
global::Google.OrTools.Sat.LinearArgumentProto?? LinMax
The lin_max constraint forces the target to equal the maximum of all linear expressions.
Definition: CpModel.pb.cs:5095
global::Google.OrTools.Sat.LinearArgumentProto?? IntDiv
The int_div constraint forces the target to equal exprs[0] / exprs[1].
Definition: CpModel.pb.cs:5038
void OnlyEnforceIf(ILiteral lit)
Definition: Constraints.cs:28
A constraint programming problem.
Definition: CpModel.pb.cs:8645
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:8793
global::Google.OrTools.Sat.PartialVariableAssignment SolutionHint
Solution hint.
Definition: CpModel.pb.cs:8815
pbc::RepeatedField< global::Google.OrTools.Sat.IntegerVariableProto > Variables
The associated Protos should be referred by their index in these fields.
Definition: CpModel.pb.cs:8718
pbc::RepeatedField< global::Google.OrTools.Sat.ConstraintProto > Constraints
Definition: CpModel.pb.cs:8729
pbc::RepeatedField< int > Assumptions
A list of literals.
Definition: CpModel.pb.cs:8844
global::Google.OrTools.Sat.CpObjectiveProto Objective
The objective to minimize.
Definition: CpModel.pb.cs:8741
Wrapper class around the cp_model proto.
Definition: CpModel.cs:24
void AddAssumption(ILiteral lit)
Definition: CpModel.cs:762
Constraint AddInverse(IEnumerable< IntVar > direct, IEnumerable< IntVar > reverse)
Definition: CpModel.cs:288
void Minimize(LinearExpr obj)
Definition: CpModel.cs:690
Constraint AddBoolXor(IEnumerable< ILiteral > literals)
Definition: CpModel.cs:462
void AddMapDomain(IntVar var, IEnumerable< IntVar > bool_vars, long offset=0)
Definition: CpModel.cs:394
IntVar NewBoolVar(string name)
Definition: CpModel.cs:69
void AddDecisionStrategy(IEnumerable< IntVar > vars, DecisionStrategyProto.Types.VariableSelectionStrategy var_str, DecisionStrategyProto.Types.DomainReductionStrategy dom_str)
Definition: CpModel.cs:733
Constraint AddMaxEquality(LinearExpr target, IEnumerable< LinearExpr > exprs)
Definition: CpModel.cs:513
Constraint AddDivisionEquality< T, N, D >(T target, N num, D denom)
Definition: CpModel.cs:526
Constraint AddLinearExpressionInDomain(LinearExpr linear_expr, Domain domain)
Definition: CpModel.cs:79
Constraint AddNoOverlap(IEnumerable< IntervalVar > intervals)
Definition: CpModel.cs:642
Constraint AddProdEquality(IntVar target, IEnumerable< IntVar > vars)
Definition: CpModel.cs:585
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:747
Constraint AddElement(IntVar index, IEnumerable< IntVar > vars, IntVar target)
Definition: CpModel.cs:156
Boolean ExportToFile(String filename)
Definition: CpModel.cs:832
void AddVarToObjective(IntVar var)
Definition: CpModel.cs:710
Constraint AddMinEquality(LinearExpr target, IEnumerable< LinearExpr > exprs)
Definition: CpModel.cs:487
Constraint AddMultiplicationEquality(LinearExpr target, IEnumerable< LinearExpr > exprs)
Definition: CpModel.cs:572
void Maximize(LinearExpr obj)
Definition: CpModel.cs:695
Constraint AddMultiplicationEquality(LinearExpr target, IEnumerable< IntVar > vars)
Definition: CpModel.cs:559
Constraint AddImplication(ILiteral a, ILiteral b)
Definition: CpModel.cs:428
IntVar NewIntVar(long lb, long ub, string name)
Definition: CpModel.cs:47
Constraint AddBoolAnd(IEnumerable< ILiteral > literals)
Definition: CpModel.cs:450
Constraint AddBoolOr(IEnumerable< ILiteral > literals)
Definition: CpModel.cs:438
Constraint AddModuloEquality< T, V, M >(T target, V v, M m)
Definition: CpModel.cs:548
Constraint AddElement(IntVar index, IEnumerable< long > values, IntVar target)
Definition: CpModel.cs:170
Constraint AddForbiddenAssignments(IEnumerable< IntVar > vars, long[,] tuples)
Definition: CpModel.cs:231
IntVar NewConstant(long value, string name)
Definition: CpModel.cs:64
Constraint AddAllDifferent(IEnumerable< IntVar > vars)
Definition: CpModel.cs:131
IntVar NewIntVarFromDomain(Domain domain, string name)
Definition: CpModel.cs:52
Constraint AddNoOverlap2D(IEnumerable< IntervalVar > x_intervals, IEnumerable< IntervalVar > y_intervals)
Definition: CpModel.cs:654
Constraint AddAllowedAssignments(IEnumerable< IntVar > vars, long[,] tuples)
Definition: CpModel.cs:212
Constraint AddMaxEquality(IntVar target, IEnumerable< IntVar > vars)
Definition: CpModel.cs:500
IntervalVar NewOptionalIntervalVar< S, D, E >(S start, D duration, E end, ILiteral is_present, string name)
Definition: CpModel.cs:617
Constraint AddElement(IntVar index, IEnumerable< int > values, IntVar target)
Definition: CpModel.cs:184
Constraint AddCumulative< D, C >(IEnumerable< IntervalVar > intervals, IEnumerable< D > demands, C capacity)
Definition: CpModel.cs:670
Constraint AddMinEquality(LinearExpr target, IEnumerable< IntVar > vars)
Definition: CpModel.cs:474
Constraint AddReservoirConstraint< I >(IEnumerable< IntVar > times, IEnumerable< I > levelChanges, long minLevel, long maxLevel)
Definition: CpModel.cs:304
IntervalVar NewOptionalFixedSizeIntervalVar< S >(S start, long duration, ILiteral is_present, string name)
Definition: CpModel.cs:630
CpModelProto Model
Definition: CpModel.cs:34
void AddTermToObjective(IntVar var, long coeff)
Definition: CpModel.cs:718
Constraint AddReservoirConstraintWithActive< I >(IEnumerable< IntVar > times, IEnumerable< I > levelChanges, IEnumerable< IntVar > actives, long minLevel, long maxLevel)
Definition: CpModel.cs:325
Constraint AddAllDifferent(IEnumerable< LinearExpr > exprs)
Definition: CpModel.cs:143
Constraint AddAutomaton(IEnumerable< IntVar > vars, long starting_state, IEnumerable< Tuple< long, long, long > > transitions, IEnumerable< long > final_states)
Definition: CpModel.cs:263
Constraint Add(BoundedLinearExpression lin)
Definition: CpModel.cs:105
IntervalVar NewFixedSizeIntervalVar< S >(S start, long duration, string name)
Definition: CpModel.cs:605
Constraint AddAutomaton(IEnumerable< IntVar > vars, long starting_state, long[,] transitions, IEnumerable< long > final_states)
Definition: CpModel.cs:238
Constraint AddAbsEquality(LinearExpr target, LinearExpr expr)
Definition: CpModel.cs:537
Constraint AddCircuit(IEnumerable< Tuple< int, int, ILiteral > > arcs)
Definition: CpModel.cs:198
void AddAssumptions(IEnumerable< ILiteral > literals)
Definition: CpModel.cs:767
IntervalVar NewIntervalVar< S, D, E >(S start, D duration, E end, string name)
Definition: CpModel.cs:592
double Offset
The displayed objective is always: scaling_factor * (sum(coefficients[i] * objective_vars[i]) + offse...
Definition: CpModel.pb.cs:6469
pbc::RepeatedField< int > Vars
The linear terms of the objective to minimize.
Definition: CpModel.pb.cs:6440
pbc::RepeatedField< long > Coeffs
Definition: CpModel.pb.cs:6451
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:2608
Container for nested types declared in the DecisionStrategyProto message type.
Definition: CpModel.pb.cs:7414
VariableSelectionStrategy
The order in which the variables above should be considered.
Definition: CpModel.pb.cs:7421
DomainReductionStrategy
Once a variable has been chosen, this enum describe what decision is taken on its domain.
Definition: CpModel.pb.cs:7435
Define the strategy to follow when the solver needs to take a new decision.
Definition: CpModel.pb.cs:7131
The constraint target = vars[index].
Definition: CpModel.pb.cs:1600
The two arrays of variable each represent a function, the second is the inverse of the first: f_direc...
Definition: CpModel.pb.cs:4033
pbc::RepeatedField< global::Google.OrTools.Sat.LinearExpressionProto > Exprs
Definition: CpModel.pb.cs:1004
global::Google.OrTools.Sat.LinearExpressionProto Target
Definition: CpModel.pb.cs:990
The linear sum vars[i] * coeffs[i] must fall in the given domain.
Definition: CpModel.pb.cs:1357
pbc::RepeatedField< int > Vars
Definition: CpModel.pb.cs:1406
pbc::RepeatedField< long > Coeffs
Same size as vars.
Definition: CpModel.pb.cs:1420
pbc::RepeatedField< long > Domain
Definition: CpModel.pb.cs:1431
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:699
The boxes defined by [start_x, end_x) * [start_y, end_y) cannot overlap.
Definition: CpModel.pb.cs:2351
All the intervals (index of IntervalConstraintProto) must be disjoint.
Definition: CpModel.pb.cs:2166
This message encodes a partial (or full) assignment of the variables of a CpModelProto.
Definition: CpModel.pb.cs:7726
Maintain a reservoir level within bounds.
Definition: CpModel.pb.cs:2880
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:3780
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:3853
static Domain FromFlatIntervals(long[] flat_intervals)
Definition: util/Domain.cs:79