28 constant_map_ =
new Dictionary<long, int>();
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>();
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 }));
143 foreach (
IntVar var
in vars)
145 alldiff.Vars.Add(var.
Index);
147 ct.Proto.AllDiff = alldiff;
157 foreach (
IntVar var
in vars)
159 element.Vars.Add(var.
Index);
161 element.Target = target.Index;
162 ct.Proto.Element = element;
172 foreach (
long value
in values)
174 element.Vars.Add(ConvertConstant(value));
176 element.Target = target.Index;
177 ct.Proto.Element = element;
187 foreach (
int value
in values)
189 element.Vars.Add(ConvertConstant(value));
191 element.Target = target.Index;
192 ct.Proto.Element = element;
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;
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;
241 IEnumerable<long> final_states)
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)
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)
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)
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;
331 IEnumerable<IntVar> times,
332 IEnumerable<I> demands,
333 IEnumerable<IntVar> actives,
334 long min_level,
long max_level)
338 foreach (
IntVar var
in times)
340 res.Times.Add(var.
Index);
342 foreach (I d
in demands)
344 res.Demands.Add(Convert.ToInt64(d));
346 foreach (
IntVar var
in actives)
348 res.Actives.Add(var.
Index);
351 ct.Proto.Reservoir = res;
356 IntVar var, IEnumerable<IntVar> bool_vars,
long offset = 0)
359 foreach (
IntVar bool_var
in bool_vars)
361 int b_index = bool_var.
Index;
362 int var_index = var.
Index;
366 lin1.
Vars.Add(var_index);
368 lin1.
Domain.Add(offset + i);
369 lin1.
Domain.Add(offset + i);
376 lin2.
Vars.Add(var_index);
378 lin2.
Domain.Add(Int64.MinValue);
379 lin2.
Domain.Add(offset + i - 1);
380 lin2.
Domain.Add(offset + i + 1);
381 lin2.
Domain.Add(Int64.MaxValue);
406 bool_argument.Literals.Add(lit.
GetIndex());
408 ct.Proto.BoolOr = bool_argument;
418 bool_argument.Literals.Add(lit.
GetIndex());
420 ct.Proto.BoolAnd = bool_argument;
430 bool_argument.Literals.Add(lit.
GetIndex());
432 ct.Proto.BoolXor = bool_argument;
440 foreach (
IntVar var
in vars)
442 args.Vars.Add(var.
Index);
444 args.Target = target.Index;
445 ct.Proto.IntMin = args;
453 foreach (
IntVar var
in vars)
455 args.Vars.Add(var.
Index);
457 args.Target = target.Index;
458 ct.Proto.IntMax = args;
466 args.
Vars.Add(GetOrCreateIndex(num));
467 args.
Vars.Add(GetOrCreateIndex(denom));
468 args.
Target = GetOrCreateIndex(target);
488 args.
Vars.Add(GetOrCreateIndex(v));
489 args.
Vars.Add(GetOrCreateIndex(m));
490 args.
Target = GetOrCreateIndex(target);
500 foreach (
IntVar var
in vars)
502 args.Vars.Add(var.
Index);
504 ct.Proto.IntProd = args;
511 S start, D duration, E end,
string name)
514 GetOrCreateIndex(start),
515 GetOrCreateIndex(duration),
516 GetOrCreateIndex(end),
522 S start, D duration, E end,
ILiteral is_present,
string name)
526 GetOrCreateIndex(start),
527 GetOrCreateIndex(duration),
528 GetOrCreateIndex(end),
541 ct.Proto.NoOverlap = args;
546 IEnumerable<IntervalVar> y_intervals)
552 args.XIntervals.Add(var.
GetIndex());
556 args.YIntervals.Add(var.
GetIndex());
558 ct.Proto.NoOverlap2D = args;
563 IEnumerable<D> demands,
570 cumul.Intervals.Add(var.
GetIndex());
572 foreach (D demand
in demands)
574 cumul.Demands.Add(GetOrCreateIndex(demand));
576 cumul.Capacity = GetOrCreateIndex(capacity);
577 ct.Proto.Cumulative = cumul;
585 SetObjective(obj,
true);
590 SetObjective(obj,
false);
595 SetObjective(
null,
true);
600 SetObjective(
null,
false);
605 if ((Object)var ==
null)
return;
612 if (coeff == 0 || (Object)var ==
null)
return;
629 foreach (
IntVar var
in vars)
631 ds.Variables.Add(var.
Index);
633 ds.VariableSelectionStrategy = var_str;
634 ds.DomainReductionStrategy = dom_str;
640 void SetObjective(
LinearExpr obj,
bool minimize)
648 else if (obj is IntVar)
659 objective.
Coeffs.Add(-1L);
665 Dictionary<IntVar, long> dict =
new Dictionary<IntVar, long>();
666 long constant = LinearExpr.GetVarValueMap(obj, 1L, dict);
670 objective.
Offset = constant;
675 objective.
Offset = -constant;
677 foreach (KeyValuePair<IntVar, long> it
in dict)
679 objective.
Vars.Add(it.Key.Index);
680 objective.
Coeffs.Add(minimize ? it.Value : -it.Value);
696 private int ConvertConstant(
long value)
698 if (constant_map_.ContainsKey(value))
700 return constant_map_[value];
705 IntegerVariableProto var =
new IntegerVariableProto();
706 var.Domain.Add(value);
707 var.Domain.Add(value);
708 constant_map_.Add(value, index);
714 private int GetOrCreateIndex<X>(X x)
716 if (typeof(X) == typeof(IntVar))
718 IntVar vx = (IntVar)(Object)x;
721 if (typeof(X) == typeof(
long) || typeof(X) == typeof(
int))
723 return ConvertConstant(Convert.ToInt64(x));
725 throw new ArgumentException(
"Cannot extract index from argument");
728 private CpModelProto model_;
729 private Dictionary<long, int> constant_map_;
static Domain FromFlatIntervals(long[] flat_intervals)