27 model_ =
new CpModelProto();
28 constant_map_ =
new Dictionary<long, int>();
33 public CpModelProto
Model
35 get {
return model_; }
38 int Negated(
int index)
52 return new IntVar(model_, domain, name);
59 return new IntVar(model_,
new Domain(value), String.Format(
"{0}", value));
80 Dictionary<IntVar, long> dict =
new Dictionary<IntVar, long>();
83 LinearConstraintProto linear =
new LinearConstraintProto();
84 foreach (KeyValuePair<IntVar, long> term
in dict)
86 linear.Vars.Add(term.Key.Index);
87 linear.Coeffs.Add(term.Value);
89 foreach (
long value
in domain.FlattenedIntervals())
91 if (value == Int64.MinValue || value == Int64.MaxValue)
93 linear.Domain.Add(value);
97 linear.Domain.Add(value - constant);
100 ct.Proto.Linear = linear;
133 new long[] { Int64.MinValue, lin.Lb - 1, lin.Lb + 1, Int64.MaxValue }));
142 AllDifferentConstraintProto alldiff =
new AllDifferentConstraintProto();
143 foreach (
IntVar var
in vars)
145 alldiff.Vars.Add(var.
Index);
147 ct.Proto.AllDiff = alldiff;
155 ElementConstraintProto element =
new ElementConstraintProto();
156 element.Index = index.
Index;
157 foreach (
IntVar var
in vars)
159 element.Vars.Add(var.
Index);
161 element.Target = target.Index;
162 ct.Proto.Element = element;
170 ElementConstraintProto element =
new ElementConstraintProto();
171 element.Index = index.
Index;
172 foreach (
long value
in values)
174 element.Vars.Add(ConvertConstant(value));
176 element.Target = target.Index;
177 ct.Proto.Element = element;
185 ElementConstraintProto element =
new ElementConstraintProto();
186 element.Index = index.
Index;
187 foreach (
int value
in values)
189 element.Vars.Add(ConvertConstant(value));
191 element.Target = target.Index;
192 ct.Proto.Element = element;
199 CircuitConstraintProto circuit =
new CircuitConstraintProto();
200 foreach (var arc
in arcs)
202 circuit.Tails.Add(arc.Item1);
203 circuit.Heads.Add(arc.Item2);
204 circuit.Literals.Add(arc.Item3.GetIndex());
206 ct.Proto.Circuit = circuit;
214 TableConstraintProto table =
new TableConstraintProto();
215 foreach (
IntVar var
in vars)
217 table.Vars.Add(var.
Index);
219 for (
int i = 0; i < tuples.GetLength(0); ++i)
221 for (
int j = 0; j < tuples.GetLength(1); ++j)
223 table.Values.Add(tuples[i, j]);
226 ct.Proto.Table = table;
234 ct.
Proto.Table.Negated =
true;
241 IEnumerable<long> final_states)
244 AutomatonConstraintProto aut =
new AutomatonConstraintProto();
245 foreach (
IntVar var
in vars)
247 aut.Vars.Add(var.
Index);
249 aut.StartingState = starting_state;
250 foreach (
long f
in final_states)
252 aut.FinalStates.Add(f);
254 for (
int i = 0; i < transitions.GetLength(0); ++i)
256 aut.TransitionTail.Add(transitions[i, 0]);
257 aut.TransitionLabel.Add(transitions[i, 1]);
258 aut.TransitionHead.Add(transitions[i, 2]);
261 ct.Proto.Automaton = aut;
266 IEnumerable<IntVar> vars,
268 IEnumerable<Tuple<long, long, long>> transitions,
269 IEnumerable<long> final_states)
272 AutomatonConstraintProto aut =
new AutomatonConstraintProto();
273 foreach (
IntVar var
in vars)
275 aut.Vars.Add(var.
Index);
277 aut.StartingState = starting_state;
278 foreach (
long f
in final_states)
280 aut.FinalStates.Add(f);
282 foreach (Tuple<long, long, long> transition
in transitions)
285 aut.TransitionHead.Add(transition.Item1);
286 aut.TransitionLabel.Add(transition.Item2);
287 aut.TransitionTail.Add(transition.Item3);
290 ct.Proto.Automaton = aut;
295 IEnumerable<IntVar> reverse)
298 InverseConstraintProto inverse =
new InverseConstraintProto();
299 foreach (
IntVar var
in direct)
301 inverse.FDirect.Add(var.
Index);
303 foreach (
IntVar var
in reverse)
305 inverse.FInverse.Add(var.
Index);
307 ct.Proto.Inverse = inverse;
312 IEnumerable<I> demands,
313 long min_level,
long max_level)
316 ReservoirConstraintProto res =
new ReservoirConstraintProto();
317 foreach (
IntVar var
in times)
319 res.Times.Add(var.
Index);
321 foreach (I d
in demands)
323 res.Demands.Add(Convert.ToInt64(d));
326 ct.Proto.Reservoir = res;
327 res.MinLevel = min_level;
328 res.MaxLevel = max_level;
334 IEnumerable<IntVar> times,
335 IEnumerable<I> demands,
336 IEnumerable<IntVar> actives,
337 long min_level,
long max_level)
340 ReservoirConstraintProto res =
new ReservoirConstraintProto();
341 foreach (
IntVar var
in times)
343 res.Times.Add(var.
Index);
345 foreach (I d
in demands)
347 res.Demands.Add(Convert.ToInt64(d));
349 foreach (
IntVar var
in actives)
351 res.Actives.Add(var.
Index);
353 res.MinLevel = min_level;
354 res.MaxLevel = max_level;
356 ct.Proto.Reservoir = res;
361 IntVar var, IEnumerable<IntVar> bool_vars,
long offset = 0)
364 foreach (
IntVar bool_var
in bool_vars)
366 int b_index = bool_var.
Index;
367 int var_index = var.
Index;
369 ConstraintProto ct1 =
new ConstraintProto();
370 LinearConstraintProto lin1 =
new LinearConstraintProto();
371 lin1.Vars.Add(var_index);
373 lin1.Domain.Add(offset + i);
374 lin1.Domain.Add(offset + i);
376 ct1.EnforcementLiteral.Add(b_index);
377 model_.Constraints.Add(ct1);
379 ConstraintProto ct2 =
new ConstraintProto();
380 LinearConstraintProto lin2 =
new LinearConstraintProto();
381 lin2.Vars.Add(var_index);
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);
388 ct2.EnforcementLiteral.Add(-b_index - 1);
389 model_.Constraints.Add(ct2);
401 ct.
Proto.BoolOr = or;
411 bool_argument.Literals.Add(lit.
GetIndex());
413 ct.Proto.BoolOr = bool_argument;
423 bool_argument.Literals.Add(lit.
GetIndex());
425 ct.Proto.BoolAnd = bool_argument;
435 bool_argument.Literals.Add(lit.
GetIndex());
437 ct.Proto.BoolXor = bool_argument;
444 IntegerArgumentProto args =
new IntegerArgumentProto();
445 foreach (
IntVar var
in vars)
447 args.Vars.Add(var.
Index);
449 args.Target = target.Index;
450 ct.Proto.IntMin = args;
457 IntegerArgumentProto args =
new IntegerArgumentProto();
458 foreach (
IntVar var
in vars)
460 args.Vars.Add(var.
Index);
462 args.Target = target.Index;
463 ct.Proto.IntMax = args;
470 IntegerArgumentProto args =
new IntegerArgumentProto();
471 args.Vars.Add(GetOrCreateIndex(num));
472 args.Vars.Add(GetOrCreateIndex(denom));
473 args.Target = GetOrCreateIndex(target);
474 ct.
Proto.IntDiv = args;
481 IntegerArgumentProto args =
new IntegerArgumentProto();
482 args.Vars.Add(var.
Index);
483 args.Vars.Add(-var.
Index - 1);
484 args.Target = target.
Index;
485 ct.
Proto.IntMax = args;
492 IntegerArgumentProto args =
new IntegerArgumentProto();
493 args.Vars.Add(GetOrCreateIndex(v));
494 args.Vars.Add(GetOrCreateIndex(m));
495 args.Target = GetOrCreateIndex(target);
496 ct.
Proto.IntMod = args;
503 IntegerArgumentProto args =
new IntegerArgumentProto();
504 args.Target = target.
Index;
505 foreach (
IntVar var
in vars)
507 args.Vars.Add(var.
Index);
509 ct.Proto.IntProd = args;
516 S start, D duration, E end,
string name)
519 GetOrCreateIndex(start),
520 GetOrCreateIndex(duration),
521 GetOrCreateIndex(end),
527 S start, D duration, E end,
ILiteral is_present,
string name)
531 GetOrCreateIndex(start),
532 GetOrCreateIndex(duration),
533 GetOrCreateIndex(end),
541 NoOverlapConstraintProto args =
new NoOverlapConstraintProto();
546 ct.Proto.NoOverlap = args;
551 IEnumerable<IntervalVar> y_intervals)
554 NoOverlap2DConstraintProto args =
new NoOverlap2DConstraintProto();
557 args.XIntervals.Add(var.
GetIndex());
561 args.YIntervals.Add(var.
GetIndex());
563 ct.Proto.NoOverlap2D = args;
568 IEnumerable<D> demands,
572 CumulativeConstraintProto cumul =
new CumulativeConstraintProto();
575 cumul.Intervals.Add(var.
GetIndex());
577 foreach (D demand
in demands)
579 cumul.Demands.Add(GetOrCreateIndex(demand));
581 cumul.Capacity = GetOrCreateIndex(capacity);
582 ct.Proto.Cumulative = cumul;
590 SetObjective(obj,
true);
595 SetObjective(obj,
false);
600 SetObjective(
null,
true);
605 SetObjective(
null,
false);
610 if ((Object)var ==
null)
return;
611 model_.Objective.Vars.Add(var.
Index);
612 model_.Objective.Coeffs.Add(model_.Objective.ScalingFactor > 0 ? 1 : -1);
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);
624 return model_.Objective ==
null;
630 DecisionStrategyProto.Types.VariableSelectionStrategy var_str,
631 DecisionStrategyProto.Types.DomainReductionStrategy dom_str)
633 DecisionStrategyProto ds =
new DecisionStrategyProto();
634 foreach (
IntVar var
in vars)
636 ds.Variables.Add(var.
Index);
638 ds.VariableSelectionStrategy = var_str;
639 ds.DomainReductionStrategy = dom_str;
640 model_.SearchStrategy.Add(ds);
645 if (model_.SolutionHint ==
null) {
646 model_.SolutionHint =
new PartialVariableAssignment();
648 model_.SolutionHint.Vars.Add(var.
GetIndex());
649 model_.SolutionHint.Values.Add(value);
654 void SetObjective(
LinearExpr obj,
bool minimize)
656 CpObjectiveProto objective =
new CpObjectiveProto();
659 objective.Offset = 0L;
660 objective.ScalingFactor = minimize ? 1L : -1;
662 else if (obj is IntVar)
664 objective.Offset = 0L;
665 objective.Vars.Add(obj.
Index);
668 objective.Coeffs.Add(1L);
669 objective.ScalingFactor = 1L;
673 objective.Coeffs.Add(-1L);
674 objective.ScalingFactor = -1L;
679 Dictionary<IntVar, long> dict =
new Dictionary<IntVar, long>();
680 long constant = LinearExpr.GetVarValueMap(obj, 1L, dict);
683 objective.ScalingFactor = 1L;
684 objective.Offset = constant;
688 objective.ScalingFactor = -1L;
689 objective.Offset = -constant;
691 foreach (KeyValuePair<IntVar, long> it
in dict)
693 objective.Vars.Add(it.Key.Index);
694 objective.Coeffs.Add(minimize ? it.Value : -it.Value);
697 model_.Objective = objective;
710 private int ConvertConstant(
long value)
712 if (constant_map_.ContainsKey(value))
714 return constant_map_[value];
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);
728 private int GetOrCreateIndex<X>(X x)
730 if (typeof(X) == typeof(IntVar))
732 IntVar vx = (IntVar)(Object)x;
735 if (typeof(X) == typeof(
long) || typeof(X) == typeof(
int))
737 return ConvertConstant(Convert.ToInt64(x));
739 throw new ArgumentException(
"Cannot extract index from argument");
742 private CpModelProto model_;
743 private Dictionary<long, int> constant_map_;