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");
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);
539 LinearArgument[] transitionExpressions,
long startingState,
long[] finalStates) {
544 getLinearExpressionProtoBuilderFromLinearArgument(expr,
false));
546 automaton.setStartingState(startingState);
547 for (
long c : finalStates) {
548 automaton.addFinalStates(c);
560 long startingState,
long[] finalStates) {
565 getLinearExpressionProtoBuilderFromLinearArgument(expr,
false));
567 automaton.setStartingState(startingState);
568 for (
long c : finalStates) {
569 automaton.addFinalStates(c);
586 if (variables.length != inverseVariables.length) {
591 for (
IntVar var : variables) {
592 inverse.addFDirect(var.getIndex());
594 for (
IntVar var : inverseVariables) {
595 inverse.addFInverse(var.getIndex());
625 throw new IllegalArgumentException(
"CpModel.addReservoirConstraint: minLevel must be <= 0");
628 throw new IllegalArgumentException(
"CpModel.addReservoirConstraint: maxLevel must be >= 0");
632 reservoir.setMinLevel(minLevel).setMaxLevel(maxLevel);
638 for (
int i = 0; i < booleans.length; ++i) {
648 linMax.setTarget(getLinearExpressionProtoBuilderFromLinearArgument(target,
true));
650 linMax.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(expr,
true));
657 LinearArgument target, Iterable<? extends LinearArgument> exprs) {
660 linMax.setTarget(getLinearExpressionProtoBuilderFromLinearArgument(target,
true));
662 linMax.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(expr,
true));
671 linMax.setTarget(getLinearExpressionProtoBuilderFromLinearArgument(target,
false));
673 linMax.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(expr,
false));
680 LinearArgument target, Iterable<? extends LinearArgument> exprs) {
683 linMax.setTarget(getLinearExpressionProtoBuilderFromLinearArgument(target,
false));
685 linMax.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(expr,
false));
696 .setTarget(getLinearExpressionProtoBuilderFromLinearArgument(target,
false))
697 .addExprs(getLinearExpressionProtoBuilderFromLinearArgument(num,
false))
698 .addExprs(getLinearExpressionProtoBuilderFromLinearArgument(denom,
false));
706 linMax.setTarget(getLinearExpressionProtoBuilderFromLinearArgument(target,
false));
707 linMax.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(expr,
false));
708 linMax.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(expr,
true));
718 .setTarget(getLinearExpressionProtoBuilderFromLinearArgument(target,
false))
719 .addExprs(getLinearExpressionProtoBuilderFromLinearArgument(var,
false))
720 .addExprs(getLinearExpressionProtoBuilderFromLinearArgument(mod,
false));
729 .setTarget(getLinearExpressionProtoBuilderFromLinearArgument(target,
false))
730 .addExprs(getLinearExpressionProtoBuilderFromLinearArgument(var,
false))
731 .addExprs(getLinearExpressionProtoBuilderFromLong(mod));
739 intProd.setTarget(getLinearExpressionProtoBuilderFromLinearArgument(target,
false));
741 intProd.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(expr,
false));
751 intProd.setTarget(getLinearExpressionProtoBuilderFromLinearArgument(target,
false));
752 intProd.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(left,
false));
753 intProd.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(right,
false));
776 getLinearExpressionProtoBuilderFromLinearArgument(start,
false),
777 getLinearExpressionProtoBuilderFromLinearArgument(size,
false),
778 getLinearExpressionProtoBuilderFromLinearArgument(end,
false), name);
794 getLinearExpressionProtoBuilderFromLinearArgument(start,
false),
795 getLinearExpressionProtoBuilderFromLong(size),
796 getLinearExpressionProtoBuilderFromLinearArgument(
803 return new IntervalVar(modelBuilder, getLinearExpressionProtoBuilderFromLong(start),
804 getLinearExpressionProtoBuilderFromLong(size),
805 getLinearExpressionProtoBuilderFromLong(start + size), name);
829 getLinearExpressionProtoBuilderFromLinearArgument(start,
false),
830 getLinearExpressionProtoBuilderFromLinearArgument(size,
false),
831 getLinearExpressionProtoBuilderFromLinearArgument(end,
false),
851 getLinearExpressionProtoBuilderFromLinearArgument(start,
false),
852 getLinearExpressionProtoBuilderFromLong(size),
853 getLinearExpressionProtoBuilderFromLinearArgument(
860 long start,
long size,
Literal isPresent, String name) {
861 return new IntervalVar(modelBuilder, getLinearExpressionProtoBuilderFromLong(start),
862 getLinearExpressionProtoBuilderFromLong(size),
863 getLinearExpressionProtoBuilderFromLong(start + size), isPresent.
getIndex(), name);
887 noOverlap.addIntervals(var.getIndex());
924 cumul.setCapacity(getLinearExpressionProtoBuilderFromLinearArgument(capacity,
false));
936 cumul.setCapacity(getLinearExpressionProtoBuilderFromLong(capacity));
942 modelBuilder.getSolutionHintBuilder().addVars(var.
getIndex());
943 modelBuilder.getSolutionHintBuilder().addValues(value);
949 modelBuilder.getSolutionHintBuilder().addVars(lit.
getIndex());
950 modelBuilder.getSolutionHintBuilder().addValues(value ? 1 : 0);
952 modelBuilder.getSolutionHintBuilder().addVars(
negated(lit.
getIndex()));
953 modelBuilder.getSolutionHintBuilder().addValues(value ? 0 : 1);
959 modelBuilder.clearSolutionHint();
964 modelBuilder.addAssumptions(lit.
getIndex());
976 modelBuilder.clearAssumptions();
1011 obj.setScalingFactor(-1.0);
1026 modelBuilder.clearObjective();
1027 modelBuilder.clearFloatingPointObjective();
1032 return modelBuilder.hasObjective() || modelBuilder.hasFloatingPointObjective();
1043 ds.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(arg,
false));
1054 ds.addExprs(getLinearExpressionProtoBuilderFromLinearArgument(arg,
false));
1087 final long mult = negate ? -1 : 1;
1088 for (
int i = 0; i < numVariables; ++i) {
1092 builder.setOffset(expr.
getOffset() * mult);
1096 LinearExpressionProto.Builder getLinearExpressionProtoBuilderFromLong(
long value) {
1097 LinearExpressionProto.Builder builder = LinearExpressionProto.newBuilder();
1098 builder.setOffset(value);
1105 return modelBuilder.build();
1118 return modelBuilder;
1122 private final Map<Long, Integer> constantMap;
static Domain fromFlatIntervals(long[] flat_intervals)
long[] flattenedIntervals()