/******************************************************************************* * Copyright 2012 Analog Devices, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ********************************************************************************/ package com.analog.lyric.util.test; import static java.util.Objects.*; import static org.junit.Assert.*; import java.util.Arrays; import com.analog.lyric.dimple.factorfunctions.XorDelta; import com.analog.lyric.dimple.model.core.FactorGraph; import com.analog.lyric.dimple.model.factors.Factor; import com.analog.lyric.dimple.model.variables.Discrete; import com.analog.lyric.dimple.solvers.sumproduct.SumProductSolverGraph; public class Demo { public static void main(String[] args) { ////////////////////////////////////////////////////////// //SOLVING A SIMPLE GRAPH Double[] binary = new Double[]{0.0, 1.0}; //pass in pre-defined array Discrete v1 = new Discrete((Object[])binary); //or 'on the fly' Discrete v2 = new Discrete(0.0, 1.0); //or array created inline Discrete v3 = new Discrete((Object[])new Double[]{0.0, 1.0}); v1.setPrior(.8, .2); v2.setPrior(.8, .2); v3.setPrior(.4, .6); FactorGraph fg = new FactorGraph(); XorDelta xorFF = new XorDelta(); Factor f = fg.addFactor(xorFF,v1,v2,v3); ((SumProductSolverGraph)requireNonNull(fg.getSolver())).setNumIterations(1); fg.solve(); boolean print = args.length == 0 || !args[0].equals("quiet"); if(print) { ////////////////////////////////////////////////////////// //PRINTING GRAPH System.out.println("-------------------------------------------------------------------------"); System.out.println("before naming...\n"); System.out.println(Helpers.getFullString(fg)); System.out.println("-------------------------------------------------------------------------"); ////////////////////////////////////////////////////////// //PRINTING NAMED GRAPH v1.setName("bit1"); v2.setName("bit2"); v3.setName("bit3"); f.setName("xorDelta1"); fg.setName("trivialFG"); System.out.println("\n\n-------------------------------------------------------------------------"); System.out.println("After naming...\n"); System.out.println(Helpers.getFullString(fg)); System.out.println(v1.getName() + " beliefs: " + Arrays.toString((double[])v1.getBeliefObject())); System.out.println(v2.getName() + " beliefs: " + Arrays.toString((double[])v2.getBeliefObject())); System.out.println(v3.getName() + " beliefs: " + Arrays.toString((double[])v3.getBeliefObject())); System.out.println("-------------------------------------------------------------------------"); } ////////////////////////////////////////////////////////// //NESTED GRAPHS //Variables Discrete vRootB1 = new Discrete(0.0, 1.0); Discrete vRootO1 = new Discrete(0.0, 1.0); Discrete vRootO2 = new Discrete(0.0, 1.0); Discrete vMidB1 = new Discrete(0.0, 1.0); Discrete vMidO1 = new Discrete(0.0, 1.0); Discrete vMidO2 = new Discrete(0.0, 1.0); Discrete vLeafB1 = new Discrete(0.0, 1.0); Discrete vLeafO1 = new Discrete(0.0, 1.0); Discrete vLeafO2 = new Discrete(0.0, 1.0); vRootB1.setName("vRootB1"); vRootO1.setName("vRootO1"); vRootO2.setName("vRootO2"); vMidB1.setName("vMidB1"); vMidO1.setName("vMidO1"); vMidO2.setName("vMidO2"); vLeafB1.setName("vLeafB1"); vLeafO1.setName("vLeafO1"); vLeafO2.setName("vLeafO2"); //Factor graphs FactorGraph fgRoot = new FactorGraph(vRootB1); FactorGraph fgMid = new FactorGraph(vMidB1); FactorGraph fgLeaf = new FactorGraph(vLeafB1); fgRoot.setName("fgRoot"); fgMid.setName("fgMid"); fgLeaf.setName("fgLeaf"); //Factors Factor fRoot = fgRoot.addFactor(xorFF, vRootB1, vRootO1, vRootO2); Factor fMid = fgMid.addFactor( xorFF, vMidB1, vMidO1, vMidO2); Factor fLeaf = fgLeaf.addFactor(xorFF, vLeafB1, vLeafO1, vLeafO2); fRoot.setName("fRoot"); fMid.setName("fMid"); fLeaf.setName("fLeaf"); //Nest the graphs fgMid.addGraph(fgLeaf, vMidO2); fgRoot.addGraph(fgMid, vRootO2); //unqualified immediate children assertNotNull(fgRoot.getObjectByName("fgMid")); assertNotNull(fgRoot.getObjectByName("vRootB1")); assertNotNull(fgRoot.getObjectByName("vRootO1")); assertNotNull(fgRoot.getObjectByName("vRootO2")); //qualified immediate children assertNotNull(fgRoot.getObjectByName("fgRoot.fgMid")); assertNotNull(fgRoot.getObjectByName("fgRoot.vRootB1")); assertNotNull(fgRoot.getObjectByName("fgRoot.vRootO1")); assertNotNull(fgRoot.getObjectByName("fgRoot.vRootO2")); //further down assertNotNull(fgRoot.getObjectByName("fgRoot.fgMid.vMidO1")); assertNotNull(fgRoot.getObjectByName("fgRoot.fgMid.vMidO2")); assertNotNull(fgRoot.getObjectByName("fgRoot.fgMid.fgLeaf")); assertNotNull(fgRoot.getObjectByName("fgRoot.fgMid.fgLeaf.vLeafO1")); assertNotNull(fgRoot.getObjectByName("fgRoot.fgMid.fgLeaf.vLeafO2")); //sub graphs still have their own tables, and can be searched fgMid = requireNonNull((FactorGraph) fgRoot.getObjectByName("fgMid")); fgLeaf = requireNonNull((FactorGraph) fgMid.getObjectByName("fgLeaf")); assertNotNull(fgMid.getObjectByName("vMidO1")); assertNotNull(fgMid.getObjectByName("fgMid.fgLeaf.vLeafO1")); assertNotNull(fgLeaf.getObjectByName("vLeafO1")); if(print) { System.out.println("\n\n-------------------------------------------------------------------------"); System.out.println("Nested graphs\n"); System.out.println(Helpers.getFullString(fgRoot)); System.out.println("-------------------------------------------------------------------------"); } } }