14package com.google.ortools.sat;
16import com.google.ortools.sat.AllDifferentConstraintProto;
17import com.google.ortools.sat.AutomatonConstraintProto;
18import com.google.ortools.sat.BoolArgumentProto;
19import com.google.ortools.sat.CpModelProto;
20import com.google.ortools.sat.CpObjectiveProto;
21import com.google.ortools.sat.CumulativeConstraintProto;
22import com.google.ortools.sat.DecisionStrategyProto;
23import com.google.ortools.sat.ElementConstraintProto;
24import com.google.ortools.sat.FloatObjectiveProto;
25import com.google.ortools.sat.InverseConstraintProto;
26import com.google.ortools.sat.LinearArgumentProto;
27import com.google.ortools.sat.LinearConstraintProto;
28import com.google.ortools.sat.LinearExpressionProto;
29import com.google.ortools.sat.NoOverlapConstraintProto;
30import com.google.ortools.sat.ReservoirConstraintProto;
31import com.google.ortools.sat.TableConstraintProto;
32import com.google.ortools.util.Domain;
33import java.util.Arrays;
34import java.util.LinkedHashMap;
43 static class CpModelException
extends RuntimeException {
44 public CpModelException(String methodName, String msg) {
46 super(methodName +
": " + msg);
53 super(methodName, array1Name +
" and " + array2Name +
" have mismatched lengths");
58 public static class WrongLength
extends CpModelException {
60 super(methodName, msg);
66 constantMap =
new LinkedHashMap<>();
71 clone.modelBuilder.mergeFrom(modelBuilder.build());
72 clone.constantMap.clear();
73 clone.constantMap.putAll(constantMap);
81 return new IntVar(modelBuilder,
new Domain(lb, ub), name);
92 return new IntVar(modelBuilder, domain, name);
102 if (constantMap.containsKey(value)) {
103 return new IntVar(modelBuilder, constantMap.get(value));
106 constantMap.put(value, cste.
getIndex());
112 if (constantMap.containsKey(1L)) {
113 return new BoolVar(modelBuilder, constantMap.get(1L));
116 constantMap.put(1L, cste.
getIndex());
122 if (constantMap.containsKey(0L)) {
123 return new BoolVar(modelBuilder, constantMap.get(0L));
126 constantMap.put(0L, cste.
getIndex());
132 return new BoolVar(modelBuilder, index);
137 return new IntVar(modelBuilder, index);
144 return addBoolOr(Arrays.asList(literals));
152 boolOr.addLiterals(lit.getIndex());
159 return addBoolOr(Arrays.asList(literals));
177 atMostOne.addLiterals(lit.getIndex());
192 exactlyOne.addLiterals(lit.getIndex());
207 boolAnd.addLiterals(lit.getIndex());
222 boolXOr.addLiterals(lit.getIndex());
244 if (b == Long.MIN_VALUE || b == Long.MAX_VALUE) {
247 lin.addDomain(b - offset);
327 new long[] {Long.MIN_VALUE, value - 1, value + 1, Long.MAX_VALUE}));
362 allDiff.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(expr,
false));
372 getLinearExpressionProtoBuilderFromLinearArgument(index,
false));
375 getLinearExpressionProtoBuilderFromLinearArgument(expr,
false));
377 element.setLinearTarget(
378 getLinearExpressionProtoBuilderFromLinearArgument(target,
false));
387 getLinearExpressionProtoBuilderFromLinearArgument(index,
false));
390 getLinearExpressionProtoBuilderFromLinearArgument(expr,
false));
392 element.setLinearTarget(
393 getLinearExpressionProtoBuilderFromLinearArgument(target,
false));
401 getLinearExpressionProtoBuilderFromLinearArgument(index,
false));
402 for (
long v : values) {
405 element.setLinearTarget(
406 getLinearExpressionProtoBuilderFromLinearArgument(target,
false));
414 getLinearExpressionProtoBuilderFromLinearArgument(index,
false));
415 for (
long v : values) {
418 element.setLinearTarget(
419 getLinearExpressionProtoBuilderFromLinearArgument(target,
false));
474 table.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(expr,
false));
476 table.setNegated(
false);
503 table.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(expr,
false));
505 table.setNegated(
true);
540 LinearArgument[] transitionExpressions,
long startingState,
long[] finalStates) {
545 getLinearExpressionProtoBuilderFromLinearArgument(expr,
false));
547 automaton.setStartingState(startingState);
548 for (
long c : finalStates) {
549 automaton.addFinalStates(c);
561 long startingState,
long[] finalStates) {
566 getLinearExpressionProtoBuilderFromLinearArgument(expr,
false));
568 automaton.setStartingState(startingState);
569 for (
long c : finalStates) {
570 automaton.addFinalStates(c);
587 if (variables.length != inverseVariables.length) {
592 for (
IntVar var : variables) {
593 inverse.addFDirect(var.getIndex());
595 for (
IntVar var : inverseVariables) {
596 inverse.addFInverse(var.getIndex());
626 throw new IllegalArgumentException(
"CpModel.addReservoirConstraint: minLevel must be <= 0");
629 throw new IllegalArgumentException(
"CpModel.addReservoirConstraint: maxLevel must be >= 0");
633 reservoir.setMinLevel(minLevel).setMaxLevel(maxLevel);
639 for (
int i = 0; i < booleans.length; ++i) {
649 linMax.setTarget(getLinearExpressionProtoBuilderFromLinearArgument(target,
true));
651 linMax.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(expr,
true));
658 LinearArgument target, Iterable<? extends LinearArgument> exprs) {
661 linMax.setTarget(getLinearExpressionProtoBuilderFromLinearArgument(target,
true));
663 linMax.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(expr,
true));
672 linMax.setTarget(getLinearExpressionProtoBuilderFromLinearArgument(target,
false));
674 linMax.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(expr,
false));
681 LinearArgument target, Iterable<? extends LinearArgument> exprs) {
684 linMax.setTarget(getLinearExpressionProtoBuilderFromLinearArgument(target,
false));
686 linMax.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(expr,
false));
697 .setTarget(getLinearExpressionProtoBuilderFromLinearArgument(target,
false))
698 .addExprs(getLinearExpressionProtoBuilderFromLinearArgument(num,
false))
699 .addExprs(getLinearExpressionProtoBuilderFromLinearArgument(denom,
false));
707 linMax.setTarget(getLinearExpressionProtoBuilderFromLinearArgument(target,
false));
708 linMax.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(expr,
false));
709 linMax.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(expr,
true));
719 .setTarget(getLinearExpressionProtoBuilderFromLinearArgument(target,
false))
720 .addExprs(getLinearExpressionProtoBuilderFromLinearArgument(var,
false))
721 .addExprs(getLinearExpressionProtoBuilderFromLinearArgument(mod,
false));
730 .setTarget(getLinearExpressionProtoBuilderFromLinearArgument(target,
false))
731 .addExprs(getLinearExpressionProtoBuilderFromLinearArgument(var,
false))
732 .addExprs(getLinearExpressionProtoBuilderFromLong(mod));
740 intProd.setTarget(getLinearExpressionProtoBuilderFromLinearArgument(target,
false));
742 intProd.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(expr,
false));
752 intProd.setTarget(getLinearExpressionProtoBuilderFromLinearArgument(target,
false));
753 intProd.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(left,
false));
754 intProd.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(right,
false));
777 getLinearExpressionProtoBuilderFromLinearArgument(start,
false),
778 getLinearExpressionProtoBuilderFromLinearArgument(size,
false),
779 getLinearExpressionProtoBuilderFromLinearArgument(end,
false), name);
795 getLinearExpressionProtoBuilderFromLinearArgument(start,
false),
796 getLinearExpressionProtoBuilderFromLong(size),
797 getLinearExpressionProtoBuilderFromLinearArgument(
804 return new IntervalVar(modelBuilder, getLinearExpressionProtoBuilderFromLong(start),
805 getLinearExpressionProtoBuilderFromLong(size),
806 getLinearExpressionProtoBuilderFromLong(start + size), name);
830 getLinearExpressionProtoBuilderFromLinearArgument(start,
false),
831 getLinearExpressionProtoBuilderFromLinearArgument(size,
false),
832 getLinearExpressionProtoBuilderFromLinearArgument(end,
false),
852 getLinearExpressionProtoBuilderFromLinearArgument(start,
false),
853 getLinearExpressionProtoBuilderFromLong(size),
854 getLinearExpressionProtoBuilderFromLinearArgument(
861 long start,
long size,
Literal isPresent, String name) {
862 return new IntervalVar(modelBuilder, getLinearExpressionProtoBuilderFromLong(start),
863 getLinearExpressionProtoBuilderFromLong(size),
864 getLinearExpressionProtoBuilderFromLong(start + size), isPresent.
getIndex(), name);
888 noOverlap.addIntervals(var.getIndex());
925 cumul.setCapacity(getLinearExpressionProtoBuilderFromLinearArgument(capacity,
false));
937 cumul.setCapacity(getLinearExpressionProtoBuilderFromLong(capacity));
943 modelBuilder.getSolutionHintBuilder().addVars(var.
getIndex());
944 modelBuilder.getSolutionHintBuilder().addValues(value);
950 modelBuilder.getSolutionHintBuilder().addVars(lit.
getIndex());
951 modelBuilder.getSolutionHintBuilder().addValues(value ? 1 : 0);
953 modelBuilder.getSolutionHintBuilder().addVars(
negated(lit.
getIndex()));
954 modelBuilder.getSolutionHintBuilder().addValues(value ? 0 : 1);
960 modelBuilder.clearSolutionHint();
965 modelBuilder.addAssumptions(lit.
getIndex());
977 modelBuilder.clearAssumptions();
1012 obj.setScalingFactor(-1.0);
1027 modelBuilder.clearObjective();
1028 modelBuilder.clearFloatingPointObjective();
1033 return modelBuilder.hasObjective() || modelBuilder.hasFloatingPointObjective();
1044 ds.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(arg,
false));
1055 ds.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(arg,
false));
1088 final long mult = negate ? -1 : 1;
1089 for (
int i = 0; i < numVariables; ++i) {
1093 builder.setOffset(expr.
getOffset() * mult);
1097 LinearExpressionProto.Builder getLinearExpressionProtoBuilderFromLong(
long value) {
1098 LinearExpressionProto.Builder builder = LinearExpressionProto.newBuilder();
1099 builder.setOffset(value);
1106 return modelBuilder.build();
1119 return modelBuilder;
1123 private final Map<Long, Integer> constantMap;
static Domain fromFlatIntervals(long[] flat_intervals)
long[] flattenedIntervals()