use of com.sri.ai.grinder.group.AssociativeCommutativeGroup in project aic-expresso by aic-sri-international.
the class SGDPLLTTester method runGroupProblemSolvingTesterForSuccessiveConstraints.
private static void runGroupProblemSolvingTesterForSuccessiveConstraints(String problemName, TestRunner tester, boolean testAgainstBruteForce, AssociativeCommutativeGroup group, TheoryTestingSupport theoryTestingSupport, long numberOfTests, int maxNumberOfLiterals, boolean outputCount) throws Error {
Context context = theoryTestingSupport.makeContextWithTestingInformation();
NullaryFunction<Constraint> makeInitialConstraint = () -> theoryTestingSupport.getTheory().makeSingleVariableConstraint(parse(theoryTestingSupport.pickTestingVariableAtRandom()), context);
Function<Constraint, Expression> makeRandomLiteral = c -> theoryTestingSupport.makeRandomLiteralOn(((SingleVariableConstraint) c).getVariable().toString(), context);
runTesterGivenOnSuccessiveConjunctionsOfLiterals(problemName, tester, numberOfTests, maxNumberOfLiterals, testAgainstBruteForce, theoryTestingSupport, makeInitialConstraint, makeRandomLiteral, outputCount, context);
}
use of com.sri.ai.grinder.group.AssociativeCommutativeGroup 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.
Expression simplifiedBody = context.getTheory().evaluate(body, context);
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.group.AssociativeCommutativeGroup in project aic-expresso by aic-sri-international.
the class Compilation method compile.
/**
* Compiles an expression to a normalized (decision-tree-like) expression.
* @param inputExpression
* @param mapFromVariableNameToTypeName
* @param mapFromCategoricalTypeNameToSizeString
* @param additionalTypes
* @param solverListener if not null, invoked on solver used for compilation, before and after compilation starts; returned solver on 'before' invocation is used (it may be the same one used as argument, of course).
* @return
*/
public static Expression compile(Expression inputExpression, Theory theory, Map<String, String> mapFromVariableNameToTypeName, Map<String, String> mapFromUniquelyNamedConstantToTypeName, Map<String, String> mapFromCategoricalTypeNameToSizeString, Collection<Type> additionalTypes, Function<MultiQuantifierEliminator, MultiQuantifierEliminator> solverListener) {
// the group actually does not matter, because we are not going to have any indices.
AssociativeCommutativeGroup group = new Max();
// The solver for the parameters above.
MultiQuantifierEliminator solver = new DefaultMultiQuantifierEliminator();
if (solverListener != null) {
solver = solverListener.apply(solver);
}
// We use the Prolog convention of small-letter initials for constants, but we need an exception for the random variables.
Predicate<Expression> isPrologConstant = new PrologConstantPredicate();
Predicate<Expression> isUniquelyNamedConstantPredicate = e -> isPrologConstant.apply(e) && !mapFromVariableNameToTypeName.containsKey(e);
Map<String, String> mapFromSymbolNameToTypeName = new LinkedHashMap<>(mapFromVariableNameToTypeName);
mapFromSymbolNameToTypeName.putAll(mapFromUniquelyNamedConstantToTypeName);
// Solve the problem.
// no indices; we want to keep all variables
List<Expression> indices = Util.list();
Expression result = solver.solve(group, inputExpression, indices, mapFromSymbolNameToTypeName, mapFromCategoricalTypeNameToSizeString, additionalTypes, isUniquelyNamedConstantPredicate, theory);
if (solverListener != null) {
solverListener.apply(null);
}
return result;
}
use of com.sri.ai.grinder.group.AssociativeCommutativeGroup in project aic-expresso by aic-sri-international.
the class MultiQuantifierEliminator method solveSingleIndexQuantifierEliminationProblem.
// Convenience:
public default Expression solveSingleIndexQuantifierEliminationProblem(SingleQuantifierEliminationProblem problem, Context context) {
AssociativeCommutativeGroup group = problem.getGroup();
LinkedList<Expression> indices = list(problem.getIndex());
Expression indicesCondition = problem.getConstraint();
Expression body = problem.getBody();
Expression result = solve(group, indices, indicesCondition, body, context);
return result;
}
Aggregations