1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  package org.sat4j.pb.core;
29  
30  import java.math.BigInteger;
31  
32  import org.sat4j.core.ConstrGroup;
33  import org.sat4j.core.Vec;
34  import org.sat4j.minisat.core.IOrder;
35  import org.sat4j.minisat.core.LearningStrategy;
36  import org.sat4j.minisat.core.RestartStrategy;
37  import org.sat4j.minisat.core.SearchParams;
38  import org.sat4j.minisat.core.Solver;
39  import org.sat4j.pb.IPBSolver;
40  import org.sat4j.pb.ObjectiveFunction;
41  import org.sat4j.pb.orders.IOrderObjective;
42  import org.sat4j.specs.ContradictionException;
43  import org.sat4j.specs.IConstr;
44  import org.sat4j.specs.IVec;
45  import org.sat4j.specs.IVecInt;
46  
47  public abstract class PBSolver extends Solver<PBDataStructureFactory> implements
48  		IPBSolver {
49  
50  	private ObjectiveFunction objf;
51  
52  	
53  
54  
55  	private static final long serialVersionUID = 1L;
56  
57  	protected PBSolverStats stats;
58  
59  	public PBSolver(LearningStrategy<PBDataStructureFactory> learner,
60  			PBDataStructureFactory dsf, IOrder order, RestartStrategy restarter) {
61  		super(learner, dsf, order, restarter);
62  		stats = new PBSolverStats();
63  		initStats(stats);
64  	}
65  
66  	public PBSolver(LearningStrategy<PBDataStructureFactory> learner,
67  			PBDataStructureFactory dsf, SearchParams params, IOrder order,
68  			RestartStrategy restarter) {
69  		super(learner, dsf, params, order, restarter);
70  		stats = new PBSolverStats();
71  		initStats(stats);
72  	}
73  
74  	public IConstr addPseudoBoolean(IVecInt literals, IVec<BigInteger> coeffs,
75  			boolean moreThan, BigInteger degree) throws ContradictionException {
76  		IVecInt vlits = dimacs2internal(literals);
77  		assert vlits.size() == literals.size();
78  		assert literals.size() == coeffs.size();
79  		return addConstr(dsfactory.createPseudoBooleanConstraint(vlits, coeffs,
80  				moreThan, degree));
81  	}
82  
83  	public void setObjectiveFunction(ObjectiveFunction obj) {
84  		objf = obj;
85  		IOrder order = getOrder();
86  		if (order instanceof IOrderObjective) {
87  			((IOrderObjective) order).setObjectiveFunction(obj);
88  		}
89  	}
90  
91  	public ObjectiveFunction getObjectiveFunction() {
92  		return objf;
93  	}
94  
95  	public IConstr addAtMost(IVecInt literals, IVecInt coeffs, int degree)
96  			throws ContradictionException {
97  		
98  		IVec<BigInteger> bcoeffs = new Vec<BigInteger>(coeffs.size());
99  		for (int i = 0; i < coeffs.size(); i++) {
100 			bcoeffs.push(BigInteger.valueOf(coeffs.get(i)));
101 		}
102 		return addAtMost(literals, bcoeffs, BigInteger.valueOf(degree));
103 	}
104 
105 	public IConstr addAtMost(IVecInt literals, IVec<BigInteger> coeffs,
106 			BigInteger degree) throws ContradictionException {
107 		IVecInt vlits = dimacs2internal(literals);
108 		assert vlits.size() == literals.size();
109 		assert literals.size() == coeffs.size();
110 		return addConstr(dsfactory.createPseudoBooleanConstraint(vlits, coeffs,
111 				false, degree));
112 	}
113 
114 	public IConstr addAtLeast(IVecInt literals, IVecInt coeffs, int degree)
115 			throws ContradictionException {
116 		
117 		IVec<BigInteger> bcoeffs = new Vec<BigInteger>(coeffs.size());
118 		for (int i = 0; i < coeffs.size(); i++) {
119 			bcoeffs.push(BigInteger.valueOf(coeffs.get(i)));
120 		}
121 		return addAtLeast(literals, bcoeffs, BigInteger.valueOf(degree));
122 	}
123 
124 	public IConstr addAtLeast(IVecInt literals, IVec<BigInteger> coeffs,
125 			BigInteger degree) throws ContradictionException {
126 		IVecInt vlits = dimacs2internal(literals);
127 		assert vlits.size() == literals.size();
128 		assert literals.size() == coeffs.size();
129 		return addConstr(dsfactory.createPseudoBooleanConstraint(vlits, coeffs,
130 				true, degree));
131 	}
132 
133 	public IConstr addExactly(IVecInt literals, IVecInt coeffs, int weight)
134 			throws ContradictionException {
135 		
136 		IVec<BigInteger> bcoeffs = new Vec<BigInteger>(coeffs.size());
137 		for (int i = 0; i < coeffs.size(); i++) {
138 			bcoeffs.push(BigInteger.valueOf(coeffs.get(i)));
139 		}
140 		return addExactly(literals, bcoeffs, BigInteger.valueOf(weight));
141 	}
142 
143 	public IConstr addExactly(IVecInt literals, IVec<BigInteger> coeffs,
144 			BigInteger weight) throws ContradictionException {
145 		IVecInt vlits = dimacs2internal(literals);
146 		assert vlits.size() == literals.size();
147 		assert literals.size() == coeffs.size();
148 		ConstrGroup group = new ConstrGroup(false);
149 		group.add(addConstr(dsfactory.createPseudoBooleanConstraint(vlits,
150 				coeffs, false, weight)));
151 		group.add(addConstr(dsfactory.createPseudoBooleanConstraint(vlits,
152 				coeffs, true, weight)));
153 		return group;
154 	}
155 }