Java Reference

Java Reference

CpModel.java
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 package com.google.ortools.sat;
15 
33 
39 public final class CpModel {
40  static class CpModelException extends Exception {
41  public CpModelException(String methodName, String msg) {
42  // Call constructor of parent Exception
43  super("CpModel." + methodName + ": " + msg);
44  }
45  }
46 
48  public static class MismatchedArrayLengths extends CpModelException {
49  public MismatchedArrayLengths(String methodName, String array1Name, String array2Name) {
50  super(methodName, array1Name + " and " + array2Name + " have mismatched lengths");
51  }
52  }
53 
55  public static class WrongLength extends CpModelException {
56  public WrongLength(String methodName, String msg) {
57  super(methodName, msg);
58  }
59  }
60 
61  public CpModel() {
62  modelBuilder = CpModelProto.newBuilder();
63  }
64 
65  // Integer variables.
66 
68  public IntVar newIntVar(long lb, long ub, String name) {
69  return new IntVar(modelBuilder, new Domain(lb, ub), name);
70  }
71 
79  public IntVar newIntVarFromDomain(Domain domain, String name) {
80  return new IntVar(modelBuilder, domain, name);
81  }
82 
84  public IntVar newBoolVar(String name) {
85  return new IntVar(modelBuilder, new Domain(0, 1), name);
86  }
87 
89  public IntVar newConstant(long value) {
90  return new IntVar(modelBuilder, new Domain(value), ""); // bounds and name.
91  }
92 
93  // Boolean Constraints.
94 
96  public Constraint addBoolOr(Literal[] literals) {
97  Constraint ct = new Constraint(modelBuilder);
98  BoolArgumentProto.Builder boolOr = ct.getBuilder().getBoolOrBuilder();
99  for (Literal lit : literals) {
100  boolOr.addLiterals(lit.getIndex());
101  }
102  return ct;
103  }
104 
106  public Constraint addBoolAnd(Literal[] literals) {
107  Constraint ct = new Constraint(modelBuilder);
108  BoolArgumentProto.Builder boolOr = ct.getBuilder().getBoolAndBuilder();
109  for (Literal lit : literals) {
110  boolOr.addLiterals(lit.getIndex());
111  }
112  return ct;
113  }
114 
116  public Constraint addBoolXor(Literal[] literals) {
117  Constraint ct = new Constraint(modelBuilder);
118  BoolArgumentProto.Builder boolOr = ct.getBuilder().getBoolXorBuilder();
119  for (Literal lit : literals) {
120  boolOr.addLiterals(lit.getIndex());
121  }
122  return ct;
123  }
124 
127  return addBoolOr(new Literal[] {a.not(), b});
128  }
129 
130  // Linear constraints.
131 
134  Constraint ct = new Constraint(modelBuilder);
135  LinearConstraintProto.Builder lin = ct.getBuilder().getLinearBuilder();
136  for (int i = 0; i < expr.numElements(); ++i) {
137  lin.addVars(expr.getVariable(i).getIndex()).addCoeffs(expr.getCoefficient(i));
138  }
139  for (long b : domain.flattenedIntervals()) {
140  lin.addDomain(b);
141  }
142  return ct;
143  }
144 
146  public Constraint addLinearConstraint(LinearExpr expr, long lb, long ub) {
147  return addLinearExpressionInDomain(expr, new Domain(lb, ub));
148  }
149 
151  public Constraint addEquality(LinearExpr expr, long value) {
152  return addLinearExpressionInDomain(expr, new Domain(value));
153  }
154 
157  return addLinearExpressionInDomain(new Difference(left, right), new Domain(0));
158  }
159 
161  public Constraint addEqualityWithOffset(LinearExpr left, LinearExpr right, long offset) {
162  return addLinearExpressionInDomain(new Difference(left, right), new Domain(-offset));
163  }
164 
166  public Constraint addLessOrEqual(LinearExpr expr, long value) {
167  return addLinearExpressionInDomain(expr, new Domain(Long.MIN_VALUE, value));
168  }
169 
172  return addLinearExpressionInDomain(new Difference(left, right), new Domain(Long.MIN_VALUE, 0));
173  }
174 
176  public Constraint addLessThan(LinearExpr expr, long value) {
177  return addLinearExpressionInDomain(expr, new Domain(Long.MIN_VALUE, value - 1));
178  }
179 
182  return addLinearExpressionInDomain(new Difference(left, right), new Domain(Long.MIN_VALUE, -1));
183  }
184 
186  public Constraint addLessOrEqualWithOffset(LinearExpr left, LinearExpr right, long offset) {
188  new Difference(left, right), new Domain(Long.MIN_VALUE, -offset));
189  }
190 
192  public Constraint addGreaterOrEqual(LinearExpr expr, long value) {
193  return addLinearExpressionInDomain(expr, new Domain(value, Long.MAX_VALUE));
194  }
195 
198  return addLinearExpressionInDomain(new Difference(left, right), new Domain(0, Long.MAX_VALUE));
199  }
200 
202  public Constraint addGreaterThan(LinearExpr expr, long value) {
203  return addLinearExpressionInDomain(expr, new Domain(value + 1, Long.MAX_VALUE));
204  }
205 
208  return addLinearExpressionInDomain(new Difference(left, right), new Domain(1, Long.MAX_VALUE));
209  }
210 
212  public Constraint addGreaterOrEqualWithOffset(LinearExpr left, LinearExpr right, long offset) {
214  new Difference(left, right), new Domain(-offset, Long.MAX_VALUE));
215  }
216 
218  public Constraint addDifferent(LinearExpr expr, long value) {
219  return addLinearExpressionInDomain(expr,
221  new long[] {Long.MIN_VALUE, value - 1, value + 1, Long.MAX_VALUE}));
222  }
223 
225  public Constraint addDifferent(IntVar left, IntVar right) {
226  return addLinearExpressionInDomain(new Difference(left, right),
227  Domain.fromFlatIntervals(new long[] {Long.MIN_VALUE, -1, 1, Long.MAX_VALUE}));
228  }
229 
231  public Constraint addDifferentWithOffset(IntVar left, IntVar right, long offset) {
232  return addLinearExpressionInDomain(new Difference(left, right),
234  new long[] {Long.MIN_VALUE, -offset - 1, -offset + 1, Long.MAX_VALUE}));
235  }
236 
237  // Integer constraints.
238 
247  public Constraint addAllDifferent(IntVar[] variables) {
248  Constraint ct = new Constraint(modelBuilder);
249  AllDifferentConstraintProto.Builder allDiff = ct.getBuilder().getAllDiffBuilder();
250  for (IntVar var : variables) {
251  allDiff.addVars(var.getIndex());
252  }
253  return ct;
254  }
255 
257  public Constraint addElement(IntVar index, IntVar[] variables, IntVar target) {
258  Constraint ct = new Constraint(modelBuilder);
260  ct.getBuilder().getElementBuilder().setIndex(index.getIndex());
261  for (IntVar var : variables) {
262  element.addVars(var.getIndex());
263  }
264  element.setTarget(target.getIndex());
265  return ct;
266  }
267 
269  public Constraint addElement(IntVar index, long[] values, IntVar target) {
270  Constraint ct = new Constraint(modelBuilder);
272  ct.getBuilder().getElementBuilder().setIndex(index.getIndex());
273  for (long v : values) {
274  element.addVars(indexFromConstant(v));
275  }
276  element.setTarget(target.getIndex());
277  return ct;
278  }
279 
281  public Constraint addElement(IntVar index, int[] values, IntVar target) {
282  Constraint ct = new Constraint(modelBuilder);
284  ct.getBuilder().getElementBuilder().setIndex(index.getIndex());
285  for (long v : values) {
286  element.addVars(indexFromConstant(v));
287  }
288  element.setTarget(target.getIndex());
289  return ct;
290  }
291 
307  public Constraint addCircuit(int[] tails, int[] heads, Literal[] literals)
308  throws MismatchedArrayLengths {
309  if (tails.length != heads.length) {
310  throw new MismatchedArrayLengths("addCircuit", "tails", "heads");
311  }
312  if (tails.length != literals.length) {
313  throw new MismatchedArrayLengths("addCircuit", "tails", "literals");
314  }
315 
316  Constraint ct = new Constraint(modelBuilder);
317  CircuitConstraintProto.Builder circuit = ct.getBuilder().getCircuitBuilder();
318  for (int t : tails) {
319  circuit.addTails(t);
320  }
321  for (int h : heads) {
322  circuit.addHeads(h);
323  }
324  for (Literal lit : literals) {
325  circuit.addLiterals(lit.getIndex());
326  }
327  return ct;
328  }
329 
343  public Constraint addAllowedAssignments(IntVar[] variables, long[][] tuplesList)
344  throws WrongLength {
345  Constraint ct = new Constraint(modelBuilder);
346  TableConstraintProto.Builder table = ct.getBuilder().getTableBuilder();
347  for (IntVar var : variables) {
348  table.addVars(var.getIndex());
349  }
350  int numVars = variables.length;
351  for (int t = 0; t < tuplesList.length; ++t) {
352  if (tuplesList[t].length != numVars) {
353  throw new WrongLength("addAllowedAssignments",
354  "tuple " + t + " does not have the same length as the variables");
355  }
356  for (int i = 0; i < tuplesList[t].length; ++i) {
357  table.addValues(tuplesList[t][i]);
358  }
359  }
360  return ct;
361  }
362 
368  public Constraint addAllowedAssignments(IntVar[] variables, int[][] tuplesList)
369  throws WrongLength {
370  Constraint ct = new Constraint(modelBuilder);
371  TableConstraintProto.Builder table = ct.getBuilder().getTableBuilder();
372  for (IntVar var : variables) {
373  table.addVars(var.getIndex());
374  }
375  int numVars = variables.length;
376  for (int t = 0; t < tuplesList.length; ++t) {
377  if (tuplesList[t].length != numVars) {
378  throw new WrongLength("addAllowedAssignments",
379  "tuple " + t + " does not have the same length as the variables");
380  }
381  for (int i = 0; i < tuplesList[t].length; ++i) {
382  table.addValues(tuplesList[t][i]);
383  }
384  }
385  return ct;
386  }
387 
400  public Constraint addForbiddenAssignments(IntVar[] variables, long[][] tuplesList)
401  throws WrongLength {
402  Constraint ct = addAllowedAssignments(variables, tuplesList);
403  // Reverse the flag.
404  ct.getBuilder().getTableBuilder().setNegated(true);
405  return ct;
406  }
407 
413  public Constraint addForbiddenAssignments(IntVar[] variables, int[][] tuplesList)
414  throws WrongLength {
415  Constraint ct = addAllowedAssignments(variables, tuplesList);
416  // Reverse the flag.
417  ct.getBuilder().getTableBuilder().setNegated(true);
418  return ct;
419  }
420 
452  public Constraint addAutomaton(IntVar[] transitionVariables, long startingState,
453  long[] finalStates, long[][] transitions) throws WrongLength {
454  Constraint ct = new Constraint(modelBuilder);
455  AutomatonConstraintProto.Builder automaton = ct.getBuilder().getAutomatonBuilder();
456  for (IntVar var : transitionVariables) {
457  automaton.addVars(var.getIndex());
458  }
459  automaton.setStartingState(startingState);
460  for (long c : finalStates) {
461  automaton.addFinalStates(c);
462  }
463  for (long[] t : transitions) {
464  if (t.length != 3) {
465  throw new WrongLength("addAutomaton", "transition does not have length 3");
466  }
467  automaton.addTransitionTail(t[0]).addTransitionLabel(t[1]).addTransitionHead(t[2]);
468  }
469  return ct;
470  }
471 
483  public Constraint addInverse(IntVar[] variables, IntVar[] inverseVariables)
484  throws MismatchedArrayLengths {
485  if (variables.length != inverseVariables.length) {
486  throw new MismatchedArrayLengths("addInverse", "variables", "inverseVariables");
487  }
488  Constraint ct = new Constraint(modelBuilder);
489  InverseConstraintProto.Builder inverse = ct.getBuilder().getInverseBuilder();
490  for (IntVar var : variables) {
491  inverse.addFDirect(var.getIndex());
492  }
493  for (IntVar var : inverseVariables) {
494  inverse.addFInverse(var.getIndex());
495  }
496  return ct;
497  }
498 
523  IntVar[] times, long[] demands, long minLevel, long maxLevel) throws MismatchedArrayLengths {
524  if (times.length != demands.length) {
525  throw new MismatchedArrayLengths("addReservoirConstraint", "times", "demands");
526  }
527  Constraint ct = new Constraint(modelBuilder);
528  ReservoirConstraintProto.Builder reservoir = ct.getBuilder().getReservoirBuilder();
529  for (IntVar var : times) {
530  reservoir.addTimes(var.getIndex());
531  }
532  for (long d : demands) {
533  reservoir.addDemands(d);
534  }
535  reservoir.setMinLevel(minLevel).setMaxLevel(maxLevel);
536  return ct;
537  }
538 
545  IntVar[] times, int[] demands, long minLevel, long maxLevel) throws MismatchedArrayLengths {
546  return addReservoirConstraint(times, toLongArray(demands), minLevel, maxLevel);
547  }
548 
574  public Constraint addReservoirConstraintWithActive(IntVar[] times, long[] demands,
575  IntVar[] actives, long minLevel, long maxLevel) throws MismatchedArrayLengths {
576  if (times.length != demands.length) {
577  throw new MismatchedArrayLengths("addReservoirConstraint", "times", "demands");
578  }
579  if (times.length != actives.length) {
580  throw new MismatchedArrayLengths("addReservoirConstraint", "times", "actives");
581  }
582 
583  Constraint ct = new Constraint(modelBuilder);
584  ReservoirConstraintProto.Builder reservoir = ct.getBuilder().getReservoirBuilder();
585  for (IntVar var : times) {
586  reservoir.addTimes(var.getIndex());
587  }
588  for (long d : demands) {
589  reservoir.addDemands(d);
590  }
591  for (IntVar var : actives) {
592  reservoir.addActives(var.getIndex());
593  }
594  reservoir.setMinLevel(minLevel).setMaxLevel(maxLevel);
595  return ct;
596  }
597 
603  public Constraint addReservoirConstraintWithActive(IntVar[] times, int[] demands,
604  IntVar[] actives, long minLevel, long maxLevel) throws MismatchedArrayLengths {
606  times, toLongArray(demands), actives, minLevel, maxLevel);
607  }
608 
610  public void addMapDomain(IntVar var, Literal[] booleans, long offset) {
611  for (int i = 0; i < booleans.length; ++i) {
612  addEquality(var, offset + i).onlyEnforceIf(booleans[i]);
613  addDifferent(var, offset + i).onlyEnforceIf(booleans[i].not());
614  }
615  }
616 
618  public Constraint addMinEquality(IntVar target, IntVar[] vars) {
619  Constraint ct = new Constraint(modelBuilder);
621  ct.getBuilder().getIntMinBuilder().setTarget(target.getIndex());
622  for (IntVar var : vars) {
623  intMin.addVars(var.getIndex());
624  }
625  return ct;
626  }
627 
629  public Constraint addMaxEquality(IntVar target, IntVar[] vars) {
630  Constraint ct = new Constraint(modelBuilder);
632  ct.getBuilder().getIntMaxBuilder().setTarget(target.getIndex());
633  for (IntVar var : vars) {
634  intMax.addVars(var.getIndex());
635  }
636  return ct;
637  }
638 
640  public Constraint addDivisionEquality(IntVar target, IntVar num, IntVar denom) {
641  Constraint ct = new Constraint(modelBuilder);
642  ct.getBuilder()
643  .getIntDivBuilder()
644  .setTarget(target.getIndex())
645  .addVars(num.getIndex())
646  .addVars(denom.getIndex());
647  return ct;
648  }
649 
651  public Constraint addAbsEquality(IntVar target, IntVar var) {
652  Constraint ct = new Constraint(modelBuilder);
653  ct.getBuilder()
654  .getIntMaxBuilder()
655  .setTarget(target.getIndex())
656  .addVars(var.getIndex())
657  .addVars(-var.getIndex() - 1);
658  return ct;
659  }
660 
662  public Constraint addModuloEquality(IntVar target, IntVar var, IntVar mod) {
663  Constraint ct = new Constraint(modelBuilder);
664  ct.getBuilder()
665  .getIntModBuilder()
666  .setTarget(target.getIndex())
667  .addVars(var.getIndex())
668  .addVars(mod.getIndex());
669  return ct;
670  }
671 
673  public Constraint addModuloEquality(IntVar target, IntVar var, long mod) {
674  Constraint ct = new Constraint(modelBuilder);
675  ct.getBuilder()
676  .getIntModBuilder()
677  .setTarget(target.getIndex())
678  .addVars(var.getIndex())
679  .addVars(indexFromConstant(mod));
680  return ct;
681  }
682 
684  public Constraint addProductEquality(IntVar target, IntVar[] vars) {
685  Constraint ct = new Constraint(modelBuilder);
686  IntegerArgumentProto.Builder intProd =
687  ct.getBuilder().getIntProdBuilder().setTarget(target.getIndex());
688  for (IntVar var : vars) {
689  intProd.addVars(var.getIndex());
690  }
691  return ct;
692  }
693 
694  // Scheduling support.
695 
710  public IntervalVar newIntervalVar(IntVar start, IntVar size, IntVar end, String name) {
711  return new IntervalVar(modelBuilder, start.getIndex(), size.getIndex(), end.getIndex(), name);
712  }
713 
719  public IntervalVar newIntervalVar(IntVar start, IntVar size, long end, String name) {
720  return new IntervalVar(
721  modelBuilder, start.getIndex(), size.getIndex(), indexFromConstant(end), name);
722  }
723 
729  public IntervalVar newIntervalVar(IntVar start, long size, IntVar end, String name) {
730  return new IntervalVar(
731  modelBuilder, start.getIndex(), indexFromConstant(size), end.getIndex(), name);
732  }
733 
739  public IntervalVar newIntervalVar(long start, IntVar size, IntVar end, String name) {
740  return new IntervalVar(
741  modelBuilder, indexFromConstant(start), size.getIndex(), end.getIndex(), name);
742  }
743 
745  public IntervalVar newFixedInterval(long start, long size, String name) {
746  return new IntervalVar(modelBuilder, indexFromConstant(start), indexFromConstant(size),
747  indexFromConstant(start + size), name);
748  }
749 
768  IntVar start, IntVar size, IntVar end, Literal isPresent, String name) {
769  return new IntervalVar(modelBuilder, start.getIndex(), size.getIndex(), end.getIndex(),
770  isPresent.getIndex(), name);
771  }
772 
779  IntVar start, IntVar size, long end, Literal isPresent, String name) {
780  return new IntervalVar(modelBuilder, start.getIndex(), size.getIndex(), indexFromConstant(end),
781  isPresent.getIndex(), name);
782  }
783 
790  IntVar start, long size, IntVar end, Literal isPresent, String name) {
791  return new IntervalVar(modelBuilder, start.getIndex(), indexFromConstant(size), end.getIndex(),
792  isPresent.getIndex(), name);
793  }
794 
797  long start, IntVar size, IntVar end, Literal isPresent, String name) {
798  return new IntervalVar(modelBuilder, indexFromConstant(start), size.getIndex(), end.getIndex(),
799  isPresent.getIndex(), name);
800  }
801 
808  long start, long size, Literal isPresent, String name) {
809  return new IntervalVar(modelBuilder, indexFromConstant(start), indexFromConstant(size),
810  indexFromConstant(start + size), isPresent.getIndex(), name);
811  }
812 
821  public Constraint addNoOverlap(IntervalVar[] intervalVars) {
822  Constraint ct = new Constraint(modelBuilder);
823  NoOverlapConstraintProto.Builder noOverlap = ct.getBuilder().getNoOverlapBuilder();
824  for (IntervalVar var : intervalVars) {
825  noOverlap.addIntervals(var.getIndex());
826  }
827  return ct;
828  }
829 
841  public Constraint addNoOverlap2D(IntervalVar[] xIntervals, IntervalVar[] yIntervals) {
842  Constraint ct = new Constraint(modelBuilder);
843  NoOverlap2DConstraintProto.Builder noOverlap2d = ct.getBuilder().getNoOverlap2DBuilder();
844  for (IntervalVar x : xIntervals) {
845  noOverlap2d.addXIntervals(x.getIndex());
846  }
847  for (IntervalVar y : yIntervals) {
848  noOverlap2d.addYIntervals(y.getIndex());
849  }
850  return ct;
851  }
852 
868  public Constraint addCumulative(IntervalVar[] intervals, IntVar[] demands, IntVar capacity) {
869  Constraint ct = new Constraint(modelBuilder);
870  CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
871  for (IntervalVar interval : intervals) {
872  cumul.addIntervals(interval.getIndex());
873  }
874  for (IntVar var : demands) {
875  cumul.addDemands(var.getIndex());
876  }
877  cumul.setCapacity(capacity.getIndex());
878  return ct;
879  }
880 
886  public Constraint addCumulative(IntervalVar[] intervals, long[] demands, IntVar capacity) {
887  Constraint ct = new Constraint(modelBuilder);
888  CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
889  for (IntervalVar interval : intervals) {
890  cumul.addIntervals(interval.getIndex());
891  }
892  for (long d : demands) {
893  cumul.addDemands(indexFromConstant(d));
894  }
895  cumul.setCapacity(capacity.getIndex());
896  return ct;
897  }
898 
904  public Constraint addCumulative(IntervalVar[] intervals, int[] demands, IntVar capacity) {
905  return addCumulative(intervals, toLongArray(demands), capacity);
906  }
907 
913  public Constraint addCumulative(IntervalVar[] intervals, IntVar[] demands, long capacity) {
914  Constraint ct = new Constraint(modelBuilder);
915  CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
916  for (IntervalVar interval : intervals) {
917  cumul.addIntervals(interval.getIndex());
918  }
919  for (IntVar var : demands) {
920  cumul.addDemands(var.getIndex());
921  }
922  cumul.setCapacity(indexFromConstant(capacity));
923  return ct;
924  }
925 
931  public Constraint addCumulative(IntervalVar[] intervals, long[] demands, long capacity) {
932  Constraint ct = new Constraint(modelBuilder);
933  CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
934  for (IntervalVar interval : intervals) {
935  cumul.addIntervals(interval.getIndex());
936  }
937  for (long d : demands) {
938  cumul.addDemands(indexFromConstant(d));
939  }
940  cumul.setCapacity(indexFromConstant(capacity));
941  return ct;
942  }
943 
949  public Constraint addCumulative(IntervalVar[] intervals, int[] demands, long capacity) {
950  return addCumulative(intervals, toLongArray(demands), capacity);
951  }
952 
954  public void addHint(IntVar var, long value) {
955  modelBuilder.getSolutionHintBuilder().addVars(var.getIndex());
956  modelBuilder.getSolutionHintBuilder().addValues(value);
957  }
958 
959  // Objective.
960 
962  public void minimize(LinearExpr expr) {
963  CpObjectiveProto.Builder obj = modelBuilder.getObjectiveBuilder();
964  for (int i = 0; i < expr.numElements(); ++i) {
965  obj.addVars(expr.getVariable(i).getIndex()).addCoeffs(expr.getCoefficient(i));
966  }
967  }
968 
970  public void maximize(LinearExpr expr) {
971  CpObjectiveProto.Builder obj = modelBuilder.getObjectiveBuilder();
972  for (int i = 0; i < expr.numElements(); ++i) {
973  obj.addVars(expr.getVariable(i).getIndex()).addCoeffs(-expr.getCoefficient(i));
974  }
975  obj.setScalingFactor(-1.0);
976  }
977 
978  // DecisionStrategy
979 
981  public void addDecisionStrategy(IntVar[] variables,
984  DecisionStrategyProto.Builder ds = modelBuilder.addSearchStrategyBuilder();
985  for (IntVar var : variables) {
986  ds.addVariables(var.getIndex());
987  }
988  ds.setVariableSelectionStrategy(varStr).setDomainReductionStrategy(domStr);
989  }
990 
992  public String modelStats() {
993  return SatHelper.modelStats(model());
994  }
995 
997  public String validate() {
998  return SatHelper.validateModel(model());
999  }
1000 
1002  public Boolean exportToFile(String file) {
1003  return SatHelper.writeModelToFile(model(), file);
1004  }
1005 
1006  // Helpers
1007 
1008  long[] toLongArray(int[] values) {
1009  long[] result = new long[values.length];
1010  for (int i = 0; i < values.length; ++i) {
1011  result[i] = values[i];
1012  }
1013  return result;
1014  }
1015 
1016  int indexFromConstant(long constant) {
1017  int index = modelBuilder.getVariablesCount();
1018  modelBuilder.addVariablesBuilder().addDomain(constant).addDomain(constant);
1019  return index;
1020  }
1021 
1022  // Getters.
1023 
1024  public CpModelProto model() {
1025  return modelBuilder.build();
1026  }
1027 
1028  public int negated(int index) {
1029  return -index - 1;
1030  }
1031 
1034  return modelBuilder;
1035  }
1036 
1037  private final CpModelProto.Builder modelBuilder;
1038 }
Exception thrown when parallel arrays have mismatched lengths.
Definition: CpModel.java:48
Constraint addNoOverlap2D(IntervalVar[] xIntervals, IntervalVar[] yIntervals)
Adds.
Definition: CpModel.java:841
Constraint addElement(IntVar index, IntVar[] variables, IntVar target)
Adds the element constraint:
Definition: CpModel.java:257
Constraint addBoolOr(Literal[] literals)
Adds.
Definition: CpModel.java:96
Constraint addAbsEquality(IntVar target, IntVar var)
Adds.
Definition: CpModel.java:651
IntervalVar newFixedInterval(long start, long size, String name)
Creates a fixed interval from its start and its size.
Definition: CpModel.java:745
Wrapper around a ConstraintProto.
Constraint addNoOverlap(IntervalVar[] intervalVars)
Adds.
Definition: CpModel.java:821
Constraint addGreaterOrEqual(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:197
Constraint addProductEquality(IntVar target, IntVar[] vars)
Adds.
Definition: CpModel.java:684
static boolean writeModelToFile(com.google.ortools.sat.CpModelProto model_proto, String filename)
Definition: SatHelper.java:96
int negated(int index)
Definition: CpModel.java:1028
Constraint addLinearConstraint(LinearExpr expr, long lb, long ub)
Adds.
Definition: CpModel.java:146
CpModelProto.Builder getBuilder()
Returns the model builder.
Definition: CpModel.java:1033
Constraint addGreaterThan(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:202
WrongLength(String methodName, String msg)
Definition: CpModel.java:56
Constraint addLessOrEqual(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:166
CpModel()
Definition: CpModel.java:61
long[] flattenedIntervals()
This method returns the flattened list of interval bounds of the domain.
Definition: Domain.java:111
Constraint addModuloEquality(IntVar target, IntVar var, IntVar mod)
Adds.
Definition: CpModel.java:662
IntervalVar newOptionalIntervalVar(IntVar start, long size, IntVar end, Literal isPresent, String name)
Creates an optional interval with a fixed size.
Definition: CpModel.java:789
IntVar newIntVarFromDomain(Domain domain, String name)
Creates an integer variable with given domain.
Definition: CpModel.java:79
Constraint addMinEquality(IntVar target, IntVar[] vars)
Adds.
Definition: CpModel.java:618
IntervalVar newOptionalIntervalVar(IntVar start, IntVar size, long end, Literal isPresent, String name)
Creates an optional interval with a fixed end.
Definition: CpModel.java:778
Constraint addDifferentWithOffset(IntVar left, IntVar right, long offset)
Adds.
Definition: CpModel.java:231
long getCoefficient(int index)
Returns the ith coefficient.
.lang.Override int getVariablesCount()
Constraint addEqualityWithOffset(LinearExpr left, LinearExpr right, long offset)
Adds.
Definition: CpModel.java:161
Constraint addAllDifferent(IntVar[] variables)
Adds.
Definition: CpModel.java:247
ConstraintProto.Builder getBuilder()
Returns the constraint builder.
int numElements()
Returns the number of elements in the interface.
Constraint addMaxEquality(IntVar target, IntVar[] vars)
Adds.
Definition: CpModel.java:629
Constraint addCumulative(IntervalVar[] intervals, long[] demands, long capacity)
Adds.
Definition: CpModel.java:931
Constraint addModuloEquality(IntVar target, IntVar var, long mod)
Adds.
Definition: CpModel.java:673
IntervalVar newIntervalVar(IntVar start, IntVar size, IntVar end, String name)
Creates an interval variable from start, size, and end.
Definition: CpModel.java:710
Constraint addLinearExpressionInDomain(LinearExpr expr, Domain domain)
Adds.
Definition: CpModel.java:133
Constraint addEquality(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:156
Constraint addCumulative(IntervalVar[] intervals, IntVar[] demands, long capacity)
Adds.
Definition: CpModel.java:913
void onlyEnforceIf(Literal lit)
Adds a literal to the constraint.
IntervalVar newOptionalFixedInterval(long start, long size, Literal isPresent, String name)
Creates an optional fixed interval from start and size.
Definition: CpModel.java:807
Constraint addDivisionEquality(IntVar target, IntVar num, IntVar denom)
Adds.
Definition: CpModel.java:640
Constraint addLessThan(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:181
Interface to describe a boolean variable or its negation.
Definition: Literal.java:17
Exception thrown when an array has a wrong length.
Definition: CpModel.java:55
Constraint addDifferent(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:218
Constraint addGreaterOrEqual(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:192
We call domain any subset of Int64 = [kint64min, kint64max].
Definition: Domain.java:21
Constraint addAutomaton(IntVar[] transitionVariables, long startingState, long[] finalStates, long[][] transitions)
Adds an automaton constraint.
Definition: CpModel.java:452
IntervalVar newIntervalVar(IntVar start, long size, IntVar end, String name)
Creates an interval variable with a fixed size.
Definition: CpModel.java:729
Constraint addBoolAnd(Literal[] literals)
Adds.
Definition: CpModel.java:106
String validate()
Returns a non empty string explaining the issue if the model is invalid.
Definition: CpModel.java:997
IntVar newIntVar(long lb, long ub, String name)
Creates an integer variable with domain [lb, ub].
Definition: CpModel.java:68
Constraint addForbiddenAssignments(IntVar[] variables, long[][] tuplesList)
Adds.
Definition: CpModel.java:400
Constraint addReservoirConstraint(IntVar[] times, int[] demands, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:544
Constraint addCumulative(IntervalVar[] intervals, int[] demands, IntVar capacity)
Adds.
Definition: CpModel.java:904
Constraint addReservoirConstraint(IntVar[] times, long[] demands, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:522
Constraint addLessOrEqualWithOffset(LinearExpr left, LinearExpr right, long offset)
Adds.
Definition: CpModel.java:186
Constraint addCumulative(IntervalVar[] intervals, long[] demands, IntVar capacity)
Adds.
Definition: CpModel.java:886
Constraint addGreaterOrEqualWithOffset(LinearExpr left, LinearExpr right, long offset)
Adds.
Definition: CpModel.java:212
Definition: SatHelper.java:13
Constraint addEquality(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:151
IntervalVar newIntervalVar(IntVar start, IntVar size, long end, String name)
Creates an interval variable with a fixed end.
Definition: CpModel.java:719
IntervalVar newOptionalIntervalVar(IntVar start, IntVar size, IntVar end, Literal isPresent, String name)
Creates an optional interval variable from start, size, end, and isPresent.
Definition: CpModel.java:767
Constraint addCircuit(int[] tails, int[] heads, Literal[] literals)
Adds.
Definition: CpModel.java:307
Constraint addCumulative(IntervalVar[] intervals, int[] demands, long capacity)
Adds.
Definition: CpModel.java:949
CpModelProto model()
Definition: CpModel.java:1024
Constraint addImplication(Literal a, Literal b)
Adds.
Definition: CpModel.java:126
Constraint addAllowedAssignments(IntVar[] variables, long[][] tuplesList)
Adds.
Definition: CpModel.java:343
IntVar getVariable(int index)
Returns the ith variable.
IntVar newConstant(long value)
Creates a constant variable.
Definition: CpModel.java:89
Constraint addCumulative(IntervalVar[] intervals, IntVar[] demands, IntVar capacity)
Adds.
Definition: CpModel.java:868
Constraint addElement(IntVar index, long[] values, IntVar target)
Adds the element constraint:
Definition: CpModel.java:269
Constraint addForbiddenAssignments(IntVar[] variables, int[][] tuplesList)
Adds.
Definition: CpModel.java:413
int getIndex()
Constraint addReservoirConstraintWithActive(IntVar[] times, long[] demands, IntVar[] actives, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:574
Main modeling class.
Definition: CpModel.java:39
Constraint addDifferent(IntVar left, IntVar right)
Adds.
Definition: CpModel.java:225
Constraint addInverse(IntVar[] variables, IntVar[] inverseVariables)
Adds.
Definition: CpModel.java:483
int getIndex()
Internal, returns the index of the variable in the underlying CpModelProto.
static Domain fromFlatIntervals(long[] flat_intervals)
This method is available in Python, Java and .NET.
Definition: Domain.java:100
void minimize(LinearExpr expr)
Adds a minimization objective of a linear expression.
Definition: CpModel.java:962
void addHint(IntVar var, long value)
Adds hinting to a variable.
Definition: CpModel.java:954
static Builder newBuilder()
Constraint addBoolXor(Literal[] literals)
Adds.
Definition: CpModel.java:116
An integer variable.
Literal not()
Returns the Boolean negation of the current literal.
Constraint addAllowedAssignments(IntVar[] variables, int[][] tuplesList)
Adds.
Definition: CpModel.java:368
IntervalVar newOptionalIntervalVar(long start, IntVar size, IntVar end, Literal isPresent, String name)
Creates an optional interval with a fixed start.
Definition: CpModel.java:796
static String modelStats(com.google.ortools.sat.CpModelProto model_proto)
Definition: SatHelper.java:80
An interval variable.
void addDecisionStrategy(IntVar[] variables, DecisionStrategyProto.VariableSelectionStrategy varStr, DecisionStrategyProto.DomainReductionStrategy domStr)
Adds.
Definition: CpModel.java:981
Constraint addReservoirConstraintWithActive(IntVar[] times, int[] demands, IntVar[] actives, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:603
IntervalVar newIntervalVar(long start, IntVar size, IntVar end, String name)
Creates an interval variable with a fixed start.
Definition: CpModel.java:739
Definition: Domain.java:9
Constraint addElement(IntVar index, int[] values, IntVar target)
Adds the element constraint:
Definition: CpModel.java:281
static String validateModel(com.google.ortools.sat.CpModelProto model_proto)
Definition: SatHelper.java:88
String modelStats()
Returns some statistics on model as a string.
Definition: CpModel.java:992
Constraint addGreaterThan(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:207
void maximize(LinearExpr expr)
Adds a maximization objective of a linear expression.
Definition: CpModel.java:970
A linear expression interface that can be parsed.
Definition: LinearExpr.java:17
Boolean exportToFile(String file)
Write the model as a ascii protocol buffer to 'file'.
Definition: CpModel.java:1002
MismatchedArrayLengths(String methodName, String array1Name, String array2Name)
Definition: CpModel.java:49
void addMapDomain(IntVar var, Literal[] booleans, long offset)
Adds.
Definition: CpModel.java:610
Constraint addLessOrEqual(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:171
Constraint addLessThan(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:176
IntVar newBoolVar(String name)
Creates a Boolean variable with the given name.
Definition: CpModel.java:84