use of com.sri.ai.expresso.api.Type in project aic-expresso by aic-sri-international.
the class RandomConditionalExpressionGenerator method main.
public static void main(String[] args) {
Random random = new Random();
TheoryTestingSupport theoryTestingSupport = TheoryTestingSupport.make(new Random(), new DifferenceArithmeticTheory(true, true));
for (int numberOfVariables = 3; numberOfVariables != 5; numberOfVariables++) {
Map<String, Type> variableNamesAndTypes = map();
Type integerInterval = new IntegerInterval(0, 100);
for (int v = 0; v != numberOfVariables; v++) {
variableNamesAndTypes.put("v" + v, integerInterval);
}
theoryTestingSupport.setVariableNamesAndTypesForTesting(variableNamesAndTypes);
Context context = theoryTestingSupport.makeContextWithTestingInformation();
RandomConditionalExpressionGenerator generator = new RandomConditionalExpressionGenerator(theoryTestingSupport, 4, () -> makeSymbol(random.nextDouble()), context);
System.out.println();
System.out.println();
for (Map.Entry<String, Type> variableNameAndType : variableNamesAndTypes.entrySet()) {
Type type = variableNameAndType.getValue();
IntegerInterval interval = (IntegerInterval) type;
System.out.println("random " + variableNameAndType.getKey() + ": " + interval.getNonStrictLowerBound() + ".." + interval.getNonStrictUpperBound() + ";");
}
for (int i = 0; i != 5; i++) {
Expression output = generator.apply();
System.out.println(output + ";");
}
}
}
use of com.sri.ai.expresso.api.Type in project aic-expresso by aic-sri-international.
the class SetOfArgumentTuplesForFunctionOccurringInExpression method computeUnionArgs.
private static void computeUnionArgs(List<Expression> unionArgs, Predicate<Expression> isF, FunctionType fType, Predicate<Expression> isFApplication, Expression e) {
// if E does not contain ƒ, oc<sub>ƒ</sub>[E] is ∅
if (!containsF(e, isF)) {
unionArgs.add(Sets.EMPTY_SET);
} else // if E is ƒ(t) for t a tuple, oc<sub>ƒ</sub>[E] is {t}
if (isFApplication.apply(e)) {
Expression tupleT = Expressions.makeTuple(e.getArguments());
Expression setT = ExtensionalSets.makeUniSet(tupleT);
unionArgs.add(setT);
} else // if E is ƒ, oc<sub>ƒ</sub>[E] is Α
if (isF.apply(e)) {
List<Expression> domainTypes = new ArrayList<>();
for (Type domainType : fType.getArgumentTypes()) {
domainTypes.add(Expressions.parse(domainType.getName()));
}
Expression tupleT = Expressions.makeTuple(domainTypes);
Expression setT = ExtensionalSets.makeUniSet(tupleT);
unionArgs.add(setT);
} else // if E is g(E′) for g a function symbol distinct from ƒ and t a k-tuple of expressions
if (Expressions.isFunctionApplicationWithArguments(e)) {
// if g(E′) is if C the E<sub>1</sub> else E<sub>2</sub> and C does not contain ƒ
if (IfThenElse.isIfThenElse(e) && !containsF(IfThenElse.condition(e), isF)) {
// then oc<sub>ƒ</sub>[E] is<br>
// if C then oc<sub>ƒ</sub>[E<sub>1</sub>] else oc<sub>ƒ</sub>[E<sub>2</sub>]
Expression e1 = IfThenElse.thenBranch(e);
List<Expression> thenUnionArgs = new ArrayList<>();
computeUnionArgs(thenUnionArgs, isF, fType, isFApplication, e1);
Expression thenBranch = makeUnion(thenUnionArgs);
Expression e2 = IfThenElse.elseBranch(e);
List<Expression> elseUnionArgs = new ArrayList<>();
computeUnionArgs(elseUnionArgs, isF, fType, isFApplication, e2);
Expression elseBranch = makeUnion(elseUnionArgs);
Expression ifThenElse = IfThenElse.make(IfThenElse.condition(e), thenBranch, elseBranch);
unionArgs.add(ifThenElse);
} else {
// oc<sub>ƒ</sub>[t<sub>1</sub>] ∪ … ∪ oc<sub>ƒ</sub>[t<sub>k</sub>]
for (Expression t : e.getArguments()) {
computeUnionArgs(unionArgs, isF, fType, isFApplication, t);
}
}
} else // quantified expression,
if (isArbitraryQuantifier(e) && !containsF(getQuantifierCondition(e), isF)) {
// then oc<sub>ƒ</sub>[E] is<br>
// ⋃<sub>x:C</sub>oc<sub>ƒ</sub>[E′]
QuantifiedExpression q = (QuantifiedExpression) e;
IndexExpressionsSet x = q.getIndexExpressions();
Expression c = getQuantifierCondition(e);
Expression ePrime = getQuantifiedExpression(q);
List<Expression> ePrimeUnionArgs = new ArrayList<>();
computeUnionArgs(ePrimeUnionArgs, isF, fType, isFApplication, ePrime);
Expression ocfOfEPrime = makeUnion(ePrimeUnionArgs);
Expression intensionalMultiSet = IntensionalSet.intensionalMultiSet(x, ocfOfEPrime, c);
Expression intensionalUnion = Expressions.apply(FunctorConstants.INTENSIONAL_UNION, intensionalMultiSet);
unionArgs.add(intensionalUnion);
} else // quantified expression,
if (isArbitraryQuantifier(e)) {
// then oc<sub>ƒ</sub>[E] is<br>
// ⋃<sub>x</sub>(oc<sub>ƒ</sub>[C] ∪ oc<sub>ƒ</sub>[E′])
QuantifiedExpression q = (QuantifiedExpression) e;
IndexExpressionsSet x = q.getIndexExpressions();
Expression c = getQuantifierCondition(e);
Expression ePrime = getQuantifiedExpression(q);
List<Expression> conditionUnionArgs = new ArrayList<>();
computeUnionArgs(conditionUnionArgs, isF, fType, isFApplication, c);
List<Expression> ePrimeUnionArgs = new ArrayList<>();
computeUnionArgs(ePrimeUnionArgs, isF, fType, isFApplication, ePrime);
List<Expression> combinedUnionArgs = new ArrayList<>();
combinedUnionArgs.addAll(conditionUnionArgs);
combinedUnionArgs.addAll(ePrimeUnionArgs);
Expression combinedUnion = makeUnion(combinedUnionArgs);
Expression intensionalMultiSet = IntensionalSet.intensionalMultiSet(x, combinedUnion, Expressions.TRUE);
Expression intensionalUnion = Expressions.apply(FunctorConstants.INTENSIONAL_UNION, intensionalMultiSet);
unionArgs.add(intensionalUnion);
} else {
throw new UnsupportedOperationException("Do not have logic for handling expression of the form: " + e);
}
}
use of com.sri.ai.expresso.api.Type in project aic-expresso by aic-sri-international.
the class SampleCommonInterpreterTest method run.
private Expression run(int sampleSizeN, boolean alwaysSample, String expressionString) {
SampleCommonInterpreter interpreter = new SampleCommonInterpreter(sampleSizeN, alwaysSample, random);
Expression expression = parse(expressionString);
if (expression.numberOfArguments() == 1 && Sets.isIntensionalSet(expression.get(0))) {
IntensionalSet intensionalSet = (IntensionalSet) expression.get(0);
IndexExpressionsSet indexExpressions = intensionalSet.getIndexExpressions();
List<Expression> indices = IndexExpressions.getIndices(indexExpressions);
if (indices.size() == 1) {
Expression index = indices.get(0);
Context intensionalSetContext = context.extendWith(indexExpressions);
// Ensure condition of correct type is created
Type indexType = GrinderUtil.getType(index, intensionalSetContext);
SingleVariableConstraint singleVariableConstraint = null;
if (indexType instanceof RealExpressoType || indexType instanceof RealInterval) {
singleVariableConstraint = new SingleVariableLinearRealArithmeticConstraint(index, true, intensionalSetContext.getTheory());
} else if (indexType instanceof IntegerExpressoType || indexType instanceof IntegerInterval) {
singleVariableConstraint = new SingleVariableDifferenceArithmeticConstraint(index, true, intensionalSetContext.getTheory());
}
if (singleVariableConstraint != null) {
singleVariableConstraint = singleVariableConstraint.conjoin(intensionalSet.getCondition(), intensionalSetContext);
intensionalSet = intensionalSet.setCondition(singleVariableConstraint);
expression = expression.set(0, intensionalSet);
}
}
}
Expression result = interpreter.apply(expression, context);
System.out.println("Evaluation with " + sampleSizeN + " samples of " + expressionString + " = " + result.doubleValue() + " (as rational=" + toString(result) + ")");
return result;
}
use of com.sri.ai.expresso.api.Type in project aic-expresso by aic-sri-international.
the class LambdaBetaReductionSimplifierTest method testSimpleReduction.
@Test
public void testSimpleReduction() {
Type peopleType = new Categorical("People", 4, arrayList(makeSymbol("ann"), makeSymbol("bob")));
Context context = new TrueContext();
context = context.add(peopleType);
Assert.assertEquals(parse("if X = ann then 0 else if X = bob then 0 else 0"), simplifier.apply(parse("(lambda : if X = ann then 0 else if X = bob then 0 else 0)()"), context));
Assert.assertEquals(parse("if ann = ann then 0 else if ann = bob then 0 else 0"), simplifier.apply(parse("(lambda X in People : if X = ann then 0 else if X = bob then 0 else 0)(ann)"), context));
Assert.assertEquals(parse("if ann = ann then 0 else if bob = bob then 0 else 0"), simplifier.apply(parse("(lambda X in People, Y in People : if X = ann then 0 else if Y = bob then 0 else 0)(ann, bob)"), context));
}
use of com.sri.ai.expresso.api.Type in project aic-expresso by aic-sri-international.
the class ExpressionStepSolverToLiteralSplitterStepSolverAdapterTest method extendTestingVaribles.
//
//
private void extendTestingVaribles(String variableToBaseTypeOn, TheoryTestingSupport theoryTestingSupport, String... newVariables) {
Map<String, Type> variablesAndTypes = new LinkedHashMap<>(theoryTestingSupport.getVariableNamesAndTypesForTesting());
Type type = variablesAndTypes.get(variableToBaseTypeOn);
if (type == null) {
throw new IllegalArgumentException("variableToBaseTypeOn=" + variableToBaseTypeOn + ", is not already part of the theory.");
}
for (String newVariable : newVariables) {
variablesAndTypes.put(newVariable, type);
}
theoryTestingSupport.setVariableNamesAndTypesForTesting(variablesAndTypes);
}
Aggregations