use of org.logicng.solvers.SATSolver in project LogicNG by logic-ng.
the class CCEXOTest method testEXO.
private void testEXO(final int numLits, final FormulaFactory f) {
final Variable[] problemLits = new Variable[numLits];
for (int i = 0; i < numLits; i++) {
problemLits[i] = f.variable("v" + i);
}
final SATSolver solver = MiniSat.miniSat(f);
solver.add(f.exo(problemLits));
assertSolverSat(solver);
assertThat(solver.enumerateAllModels(problemLits)).hasSize(numLits).allMatch(m -> m.positiveVariables().size() == 1);
}
use of org.logicng.solvers.SATSolver in project LogicNG by logic-ng.
the class CCIncrementalFormulaTest method testSimpleIncrementalAMK.
@Test
public void testSimpleIncrementalAMK() {
for (final CCEncoder encoder : this.encoders) {
final CCEncoder initialEncoder = new CCEncoder(this.f);
final int numLits = 10;
final Variable[] vars = new Variable[numLits];
for (int i = 0; i < numLits; i++) {
vars[i] = this.f.variable("v" + i);
}
final Pair<List<Formula>, CCIncrementalData> cc = encoder.encodeIncremental((CardinalityConstraint) this.f.cc(CType.LE, 9, vars));
final CCIncrementalData incData = cc.second();
final SATSolver solver = MiniSat.miniSat(this.f);
// >= 4
solver.add(initialEncoder.encode((CardinalityConstraint) this.f.cc(CType.GE, 4, vars)));
// <= 7
solver.add(initialEncoder.encode((CardinalityConstraint) this.f.cc(CType.LE, 7, vars)));
solver.add(cc.first());
assertSolverSat(solver);
// <= 9
assertSolverSat(solver);
// <= 8
solver.add(incData.newUpperBound(8));
assertSolverSat(solver);
assertThat(incData.currentRHS()).isEqualTo(8);
// <= 7
solver.add(incData.newUpperBound(7));
assertSolverSat(solver);
// <= 6
solver.add(incData.newUpperBound(6));
assertSolverSat(solver);
// <= 5
solver.add(incData.newUpperBound(5));
assertSolverSat(solver);
// <= 4
solver.add(incData.newUpperBound(4));
assertSolverSat(solver);
final SolverState state = solver.saveState();
// <= 3
solver.add(incData.newUpperBound(3));
assertSolverUnsat(solver);
solver.loadState(state);
assertSolverSat(solver);
// <= 2
solver.add(incData.newUpperBound(2));
assertSolverUnsat(solver);
}
}
use of org.logicng.solvers.SATSolver in project LogicNG by logic-ng.
the class CCIncrementalFormulaTest method testLargeTotalizerLowerBoundALK.
@Test
public void testLargeTotalizerLowerBoundALK() {
final CCEncoder encoder = this.encoders[0];
final CCEncoder initivalEncoder = new CCEncoder(this.f);
final int numLits = 100;
int currentBound = 2;
final Variable[] vars = new Variable[numLits];
for (int i = 0; i < numLits; i++) {
vars[i] = this.f.variable("v" + i);
}
final Pair<List<Formula>, CCIncrementalData> cc = encoder.encodeIncremental((CardinalityConstraint) this.f.cc(CType.GE, currentBound, vars));
final CCIncrementalData incData = cc.second();
final SATSolver solver = this.solvers[3];
solver.reset();
// <= 42
solver.add(initivalEncoder.encode((CardinalityConstraint) this.f.cc(CType.LE, 87, vars)));
solver.add(cc.first());
// search the lower bound
while (solver.sat() == Tristate.TRUE) {
// <= currentBound + 1
solver.add(incData.newLowerBound(++currentBound));
}
assertThat(currentBound).isEqualTo(88);
}
use of org.logicng.solvers.SATSolver in project LogicNG by logic-ng.
the class CCIncrementalFormulaTest method testLargeTotalizerUpperBoundAMK.
@Test
public void testLargeTotalizerUpperBoundAMK() {
final CCEncoder encoder = this.encoders[0];
final CCEncoder initivalEncoder = new CCEncoder(this.f);
final int numLits = 100;
int currentBound = numLits - 1;
final Variable[] vars = new Variable[numLits];
for (int i = 0; i < numLits; i++) {
vars[i] = this.f.variable("v" + i);
}
final Pair<List<Formula>, CCIncrementalData> cc = encoder.encodeIncremental((CardinalityConstraint) this.f.cc(CType.LE, currentBound, vars));
final CCIncrementalData incData = cc.second();
final SATSolver solver = this.solvers[3];
solver.reset();
// >= 42
solver.add(initivalEncoder.encode((CardinalityConstraint) this.f.cc(CType.GE, 42, vars)));
solver.add(cc.first());
// search the lower bound
while (solver.sat() == Tristate.TRUE) {
// <= currentBound - 1
solver.add(incData.newUpperBound(--currentBound));
}
assertThat(currentBound).isEqualTo(41);
}
use of org.logicng.solvers.SATSolver in project LogicNG by logic-ng.
the class CCIncrementalFormulaTest method testVeryLargeModularTotalizerAMK.
@Test
@LongRunningTag
public void testVeryLargeModularTotalizerAMK() {
final CCEncoder encoder = this.encoders[2];
final CCEncoder initivalEncoder = new CCEncoder(this.f);
final int numLits = 300;
int currentBound = numLits - 1;
final Variable[] vars = new Variable[numLits];
for (int i = 0; i < numLits; i++) {
vars[i] = this.f.variable("v" + i);
}
final Pair<List<Formula>, CCIncrementalData> cc = encoder.encodeIncremental((CardinalityConstraint) this.f.cc(CType.LE, currentBound, vars));
final CCIncrementalData incData = cc.second();
final SATSolver solver = this.solvers[3];
solver.reset();
solver.add(initivalEncoder.encode((CardinalityConstraint) this.f.cc(CType.GE, 234, vars)));
solver.add(cc.first());
// search the lower bound
while (solver.sat() == Tristate.TRUE) {
solver.add(incData.newUpperBound(--currentBound));
}
assertThat(currentBound).isEqualTo(233);
}
Aggregations