void testParallelRecord() { SharedContext ctx; Solver& solver = *ctx.master(); builder.startProgram(ctx, ProgramBuilder::EqOptions().noEq().noScc()) .setAtomName(1, "a").setAtomName(2, "b").setAtomName(3, "c").setAtomName(4, "d") .startRule(CHOICERULE).addHead(1).addHead(2).addHead(3).addHead(4).endRule() ; CPPUNIT_ASSERT_EQUAL(true, builder.endProgram()); ctx.setSolvers(2); ctx.addEnumerator(new RecordEnumerator(0)); ctx.enumerator()->enumerate(0); ctx.endInit(); Solver solver2; ctx.attach(solver2); SymbolTable& index = ctx.symTab(); solver.assume(index[1].lit) && solver.propagate(); solver.assume(index[2].lit) && solver.propagate(); solver.assume(index[3].lit) && solver.propagate(); solver.assume(index[4].lit) && solver.propagate(); CPPUNIT_ASSERT_EQUAL(uint32(0), solver.numFreeVars()); ctx.enumerator()->backtrackFromModel(solver); solver.undoUntil(0); CPPUNIT_ASSERT_EQUAL(true, ctx.enumerator()->update(solver2, false)); solver2.assume(index[1].lit) && solver2.propagate(); solver2.assume(index[2].lit) && solver2.propagate(); solver2.assume(index[3].lit) && solver2.propagate(); CPPUNIT_ASSERT(solver2.isFalse(index[4].lit) && solver2.propagate()); CPPUNIT_ASSERT_EQUAL(uint32(0), solver2.numFreeVars()); ctx.enumerator()->backtrackFromModel(solver2); solver.undoUntil(0); CPPUNIT_ASSERT_EQUAL(true, ctx.enumerator()->update(solver, false)); solver.assume(index[1].lit) && solver.propagate(); solver.assume(index[2].lit) && solver.propagate(); CPPUNIT_ASSERT(solver.isFalse(index[3].lit)); ctx.detach(solver2); ctx.detach(solver); solver2.undoUntil(0); ctx.attach(solver2); solver2.assume(index[1].lit) && solver2.propagate(); solver2.assume(index[2].lit) && solver2.propagate(); solver2.assume(index[3].lit) && solver2.propagate(); CPPUNIT_ASSERT(solver2.value(index[4].lit.var()) == value_free); }
void testParallelUpdate() { SharedContext ctx; Solver& solver = *ctx.master(); builder.startProgram(ctx, ProgramBuilder::EqOptions().noEq().noScc()) .setAtomName(1, "a").setAtomName(2, "b").setAtomName(3, "c") .startRule(CHOICERULE).addHead(1).addHead(2).addHead(3).endRule() .startRule(OPTIMIZERULE).addToBody(2, true).endRule() ; CPPUNIT_ASSERT_EQUAL(true, builder.endProgram()); MinimizeBuilder minBuilder; builder.addMinimize(minBuilder); ctx.setSolvers(2); ctx.addEnumerator(new RecordEnumerator(0)); ctx.enumerator()->enumerate(0); ctx.enumerator()->setMinimize(minBuilder.build(ctx)); ctx.endInit(); Solver solver2; ctx.attach(solver2); SymbolTable& index = ctx.symTab(); // a solver.assume(index[1].lit); solver.pushRootLevel(1); solver.propagate(); // ~a solver2.assume(~index[1].lit); solver2.pushRootLevel(1); solver2.propagate(); // M1: ~b, c solver.assume(~index[2].lit); solver.propagate(); solver.assume(index[3].lit); solver.propagate(); CPPUNIT_ASSERT_EQUAL(uint32(0), solver.numFreeVars()); ctx.enumerator()->backtrackFromModel(solver); solver.undoUntil(0); // M2: ~b, ~c solver2.assume(~index[2].lit); solver2.propagate(); solver2.assume(~index[3].lit); solver2.propagate(); // M2 is NOT VALID! CPPUNIT_ASSERT_EQUAL(false, ctx.enumerator()->update(solver2, true)); }