use of com.sri.ai.praise.sgsolver.solver.ExpressionFactorsAndTypes in project aic-praise by aic-sri-international.
the class HOGModelGrounding method makeInferencer.
/**
* Provides an appropriate {@link InferenceForFactorGraphAndEvidence} object.
* @param factorsAndTypes
* @param newUniqueConstantToTypeMap
* @return
*/
private static InferenceForFactorGraphAndEvidence makeInferencer(FactorsAndTypes factorsAndTypes, Map<String, String> newUniqueConstantToTypeMap) {
ExpressionFactorsAndTypes groundedFactorsAndTypesInformation = new ExpressionFactorsAndTypes(// factors
Collections.emptyList(), factorsAndTypes.getMapFromRandomVariableNameToTypeName(), factorsAndTypes.getMapFromNonUniquelyNamedConstantNameToTypeName(), newUniqueConstantToTypeMap, factorsAndTypes.getMapFromCategoricalTypeNameToSizeString(), // additional types
list());
InferenceForFactorGraphAndEvidence inferencer = new InferenceForFactorGraphAndEvidence(groundedFactorsAndTypesInformation, false, null, true, null);
return inferencer;
}
use of com.sri.ai.praise.sgsolver.solver.ExpressionFactorsAndTypes in project aic-praise by aic-sri-international.
the class SGSolverDemoController method importUAIModel.
private void importUAIModel(ActionEvent ae) {
File uaiModelFile = uaiFileChooser.showOpenDialog(mainStage);
if (uaiModelFile != null) {
File uaiEvidenceFile = new File(uaiModelFile.getParent(), uaiModelFile.getName() + ".evid");
StringWriter hogmWriter = new StringWriter();
try (BufferedReader uaiModelReader = new BufferedReader(new FileReader(uaiModelFile));
BufferedReader uaiEvidenceReader = new BufferedReader(new FileReader(uaiEvidenceFile));
PrintWriter hogmPrintWriter = new PrintWriter(hogmWriter)) {
UAI_to_HOGMv1_Using_Equalities_Translator translator = new UAI_to_HOGMv1_Using_Equalities_Translator();
translator.translate(uaiModelFile.getName(), new Reader[] { uaiModelReader, uaiEvidenceReader }, new PrintWriter[] { hogmPrintWriter }, new TranslatorOptions());
String hogmModel = hogmWriter.toString();
// For convenience, pull out all possible queries
HOGMParserWrapper parser = new HOGMParserWrapper();
ParsedHOGModel parsedModel = parser.parseModel(hogmModel);
FactorsAndTypes factorsAndTypes = new ExpressionFactorsAndTypes(parsedModel);
List<String> queries = new ArrayList<>(factorsAndTypes.getMapFromRandomVariableNameToTypeName().keySet());
newModel(hogmModel, queries);
} catch (Throwable th) {
FXUtil.exception(th);
}
}
}
use of com.sri.ai.praise.sgsolver.solver.ExpressionFactorsAndTypes in project aic-praise by aic-sri-international.
the class InferenceForFactorGraphAndEvidenceTest method runSimplifyTest.
private void runSimplifyTest() {
InferenceForFactorGraphAndEvidence inferencer;
Expression simplification;
inferencer = new InferenceForFactorGraphAndEvidence(new ExpressionFactorsAndTypes(factors, mapFromRandomVariableNameToTypeName, mapFromNonUniquelyNamedConstantNameToTypeName, mapFromUniquelyNamedConstantNameToTypeName, mapFromCategoricalTypeNameToSizeString, list()), isBayesianNetwork, evidence, true, null);
simplification = inferencer.simplify(queryExpression);
assertEquals(expected, simplification);
}
use of com.sri.ai.praise.sgsolver.solver.ExpressionFactorsAndTypes in project aic-praise by aic-sri-international.
the class InferenceForFactorGraphAndEvidenceTest method testBurglary.
@Test
public void testBurglary() {
// The definitions of types
mapFromCategoricalTypeNameToSizeString = Util.map("Boolean", "2");
// The definitions of variables
mapFromRandomVariableNameToTypeName = Util.map("burglary", "Boolean", "alarm", "Boolean", "call", "Boolean");
// The definitions of non-uniquely named constants
mapFromNonUniquelyNamedConstantNameToTypeName = Util.map();
// The definitions of non-uniquely named constants
mapFromUniquelyNamedConstantNameToTypeName = Util.map();
isBayesianNetwork = false;
factors = Times.getMultiplicands(parse("" + "(if alarm then if call then 0.7 else 0.3 else if call then 0 else 1)*" + "(if burglary then if alarm then 0.9 else 0.1 else if alarm then 0.01 else 0.99)*" + "(if burglary then 0.1 else 0.9)"));
InferenceForFactorGraphAndEvidence inferencer;
inferencer = new InferenceForFactorGraphAndEvidence(new ExpressionFactorsAndTypes(factors, mapFromRandomVariableNameToTypeName, mapFromNonUniquelyNamedConstantNameToTypeName, mapFromUniquelyNamedConstantNameToTypeName, mapFromCategoricalTypeNameToSizeString, list()), isBayesianNetwork, evidence, false, null);
Expression result = inferencer.sum(list(parse("alarm")), Times.make(factors));
System.out.println(result);
}
use of com.sri.ai.praise.sgsolver.solver.ExpressionFactorsAndTypes in project aic-praise by aic-sri-international.
the class InferenceForFactorGraphAndEvidenceTest method runTestWithFactorizationOption.
/**
* @param useFactorization
* @param queryExpression
* @param evidence
* @param expected
* @param isBayesianNetwork
* @param factorGraph
* @param mapFromRandomVariableNameToTypeName
* @param mapFromNonUniquelyNamedConstantNameToTypeName
* @param mapFromUniquelyNamedConstantNameToTypeName
* @param mapFromCategoricalTypeNameToSizeString
*/
private void runTestWithFactorizationOption(boolean useFactorization, Expression queryExpression, Expression evidence, Expression expected, boolean isBayesianNetwork, List<Expression> factors, Map<String, String> mapFromRandomVariableNameToTypeName, Map<String, String> mapFromNonUniquelyNamedConstantNameToTypeName, Map<String, String> mapFromUniquelyNamedConstantNameToTypeName, Map<String, String> mapFromCategoricalTypeNameToSizeString, Collection<Type> additionalTypes) {
InferenceForFactorGraphAndEvidence inferencer;
Expression marginal;
inferencer = new InferenceForFactorGraphAndEvidence(new ExpressionFactorsAndTypes(factors, mapFromRandomVariableNameToTypeName, mapFromNonUniquelyNamedConstantNameToTypeName, mapFromUniquelyNamedConstantNameToTypeName, mapFromCategoricalTypeNameToSizeString, additionalTypes), isBayesianNetwork, evidence, useFactorization, null);
marginal = inferencer.solve(queryExpression);
TrueContext context = new TrueContext();
marginal = Expressions.roundToAGivenPrecision(marginal, 9, context);
expected = Expressions.roundToAGivenPrecision(expected, 9, context);
if (expected.equals(marginal)) {
// Ok!
} else // check if they are not identical, but equivalent expressions
if (inferencer.evaluate(apply(MINUS, expected, marginal)).equals(ZERO)) {
// first attempt was to compare with equality, but this requires a more complete test of equality theory literals to exclude such a complex equality from being considered a literal, which is much more expensive
// Ok!
} else {
throw new AssertionError("expected:<" + expected + "> but was:<" + marginal + ">, which is not even equivalent.");
}
// Not working yet, need to debug
// Expression negationMarginal;
// negationMarginal = inferencer.solve(Not.make(queryExpression));
// negationMarginal = Expressions.roundToAGivenPrecision(negationMarginal, 9, context);
// expected = inferencer.evaluate(parse(negationMarginal + " = 1 - " + marginal));
// assertEquals(expected, TRUE);
}
Aggregations