use of com.sri.ai.grinder.api.Constraint in project aic-expresso by aic-sri-international.
the class DefaultMultiVariableConstraint method conjoin.
@Override
public Constraint conjoin(Expression formula, Context context) {
myAssert(() -> context.isLiteral(formula) || formula instanceof Constraint, () -> this.getClass() + " currently only supports conjoining with literals and constraints, but received " + formula);
Constraint result;
if (formula instanceof Constraint) {
result = conjoinWithConjunctiveClause(formula, context);
} else {
result = conjoinWithLiteral(formula, context);
}
return result;
}
use of com.sri.ai.grinder.api.Constraint in project aic-expresso by aic-sri-international.
the class AbstractSGVET method solve.
@Override
public Expression solve(MultiQuantifierEliminationProblem problem, Context context) {
AssociativeCommutativeGroup group = problem.getGroup();
List<Expression> indices = problem.getIndices();
Expression indicesConstraint = problem.getConstraint();
Expression body = problem.getBody();
checkInterrupted();
// Make sure body is simplified and quantifier-free.
// context.getTheory().evaluate(body, context);
Expression simplifiedBody = body;
Expression result;
if (getDebug()) {
System.out.println("SGVE(T) input: " + simplifiedBody);
System.out.println("Width : " + width(simplifiedBody, context));
}
AssociativeCommutativeSemiRing semiRing = (AssociativeCommutativeSemiRing) group;
Partition partition;
if (indices.size() < 1) {
partition = null;
} else {
Expression factoredConditionalsExpression = factoredConditionalsWithAbsorbingElseClause(semiRing, simplifiedBody, context);
partition = pickPartition(semiRing, factoredConditionalsExpression, indices, context);
}
if (partition == null) {
if (basicOutput) {
System.out.println("No partition");
}
result = subSolver.solve(group, indices, indicesConstraint, simplifiedBody, context);
} else {
Expression indexSubProblemExpression = product(semiRing, partition.expressionsOnIndexAndNot.first, context);
if (basicOutput) {
System.out.println("Eliminating: " + getFirst(partition.index));
System.out.println("From : " + indexSubProblemExpression);
System.out.println("Width : " + width(indexSubProblemExpression, context) + " out of " + indices.size() + " indices");
}
// We now invoke the subsolver for summing the index out of the factors it is in.
// Ideally, we would reuse the current constraint, but the set of index has changed and the current constraint may
// use an internal representation that depends on its previous set of indices.
// In the future, we should try to re-use that internal representation and re-index it appropriately, but for now
// we rewrite the program in a way that the current constraint becomes a part of the input expression.
// This will be equivalent to using it as a constraint, but will cause the constraint to be re-built.
// BTW, the call to "project" below will also re-context the constraint for the same reason: re-indexing.
// In the future it should also re-use the representation.
// The following transformation is: sum_C E = sum_{true} if C then E else 0
Expression indexSubProblemExpressionWithConstraint = IfThenElse.make(indicesConstraint, indexSubProblemExpression, semiRing.multiplicativeAbsorbingElement());
Expression indexSubProblemSolution = subSolver.extendContextAndSolve(group, partition.index, indexSubProblemExpressionWithConstraint, context);
if (basicOutput) {
System.out.println("Solution : " + indexSubProblemSolution + "\n");
}
partition.expressionsOnIndexAndNot.second.add(indexSubProblemSolution);
Expression remainingSubProblemExpression = product(semiRing, partition.expressionsOnIndexAndNot.second, context);
// the constraint is already represented in indexSubProblemSolution
Constraint constraintOnRemainingIndices = context;
result = solve(group, partition.remainingIndices, constraintOnRemainingIndices, remainingSubProblemExpression, context);
result = semiRing.multiply(result, context);
}
return result;
}
use of com.sri.ai.grinder.api.Constraint in project aic-expresso by aic-sri-international.
the class CompoundTheoryWithDifferenceArithmeticTest method runCompleteSatisfiabilityTest.
/**
* @param conjunction
* @param expected
*/
private void runCompleteSatisfiabilityTest(String conjunction, Expression expected, Map<String, Type> variableNamesAndTypesForTesting) {
TheoryTestingSupport equalityTheoryTestingSupport = TheoryTestingSupport.make(makeRandom(), new EqualityTheory(true, true));
equalityTheoryTestingSupport.setVariableNamesAndTypesForTesting(variableNamesAndTypesForTesting);
TheoryTestingSupport theoryTestingSupport = TheoryTestingSupport.make(makeRandom(), equalityTheoryTestingSupport, TheoryTestingSupport.make(makeRandom(), new PropositionalTheory()));
Constraint context = theoryTestingSupport.makeContextWithTestingInformation();
for (Expression literal : And.getConjuncts(parse(conjunction))) {
context = context.conjoin(literal, theoryTestingSupport.makeContextWithTestingInformation());
}
assertEquals(expected, context);
}
use of com.sri.ai.grinder.api.Constraint in project aic-expresso by aic-sri-international.
the class SGDPLLTTester method testCompleteMultiVariableConstraints.
/**
* Given a theory and a number <code>n</code> of multi-variable constraint tests,
* generates <code>n</code> formulas in the theory
* and see if those detected as unsatisfiable by the corresponding solver
* are indeed unsatisfiable (checked by brute force).
* Throws an {@link Error} with the failure description if a test fails.
* @param theoryTestingSupport
* @param numberOfTests
* @param maxNumberOfLiterals
* @param outputCount
*/
public static void testCompleteMultiVariableConstraints(boolean testAgainstBruteForce, TheoryTestingSupport theoryTestingSupport, long numberOfTests, int maxNumberOfLiterals, boolean outputCount) {
Context context = theoryTestingSupport.makeContextWithTestingInformation();
NullaryFunction<Constraint> makeInitialConstraint = () -> context;
Function<Constraint, Expression> makeRandomLiteral = c -> theoryTestingSupport.makeRandomLiteral(context);
// CompleteMultiVariableContext is complete
TestRunner tester = SGDPLLTTester::testCompleteSatisfiability;
runTesterGivenOnSuccessiveConjunctionsOfLiterals("complete satisfiability", tester, numberOfTests, maxNumberOfLiterals, testAgainstBruteForce, theoryTestingSupport, makeInitialConstraint, makeRandomLiteral, outputCount, context);
}
use of com.sri.ai.grinder.api.Constraint in project aic-expresso by aic-sri-international.
the class SGDPLLTTester method runModelCountingTestForSingleVariableConstraint.
private static void runModelCountingTestForSingleVariableConstraint(Expression variable, Collection<Expression> literals, Constraint constraint, boolean testAgainstBruteForce, Theory theory, Context context) {
Expression literalsConjunction = And.make(literals);
String problemDescription = "model counting of " + literalsConjunction + " for variable " + variable;
output("Problem: " + problemDescription);
Simplifier symbolicSolver = (e, p) -> computeModelCountBySolver((SingleVariableConstraint) e, p);
SingleVariableConstraint singleVariableConstraint = (SingleVariableConstraint) constraint;
Expression symbolicSolution = symbolicSolver.apply(singleVariableConstraint, context);
if (Util.thereExists(new SubExpressionsDepthFirstIterator(symbolicSolution), e -> e instanceof QuantifiedExpression || Sets.isIntensionalSet(e))) {
throw new Error("Symbolic solution is not quantifier-free: " + symbolicSolution);
}
output("Symbolic result: " + symbolicSolution);
if (testAgainstBruteForce) {
if (singleVariableConstraint.isContradiction()) {
if (!symbolicSolution.equals(ZERO)) {
throw new Error("Constraint is contradiction, but symbolic solver does not produce 0, but instead " + symbolicSolution);
}
} else {
Expression testingVariable = singleVariableConstraint.getVariable();
Set<Expression> allVariables = getVariablesBeingReferenced(singleVariableConstraint, context);
Collection<? extends Expression> otherVariables = removeFromSetNonDestructively(allVariables, v -> v.equals(testingVariable));
BinaryFunction<BruteForceCommonInterpreter, Context, Expression> fromInterpreterAndContextWithAssignmentToOtherVariablesToBruteForceSolution = (interpreter, contextWithAssignmentToOtherVariables) -> bruteForceModelCounterForVariableGivenInterpreterAndAssignmentToOtherVariables(variable, literalsConjunction, interpreter, theory, contextWithAssignmentToOtherVariables);
testSymbolicVsBruteForceComputationForEachAssignment(theory, problemDescription, otherVariables, symbolicSolution, fromInterpreterAndContextWithAssignmentToOtherVariablesToBruteForceSolution, context);
}
} else {
output("Skipping test againt brute-force.");
}
}
Aggregations