/******************************************************************************* * Copyright 2014 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.dimple.test.model; import static com.analog.lyric.util.test.ExceptionTester.*; import static org.junit.Assert.*; import org.junit.Test; import com.analog.lyric.dimple.environment.DimpleEnvironment; import com.analog.lyric.dimple.factorfunctions.Sum; import com.analog.lyric.dimple.model.core.FactorGraph; import com.analog.lyric.dimple.model.factors.Factor; import com.analog.lyric.dimple.model.variables.Bit; import com.analog.lyric.dimple.model.variables.Variable; import com.analog.lyric.dimple.model.variables.VariableList; import com.analog.lyric.dimple.test.DimpleTestBase; public class TestFactorGraph extends DimpleTestBase { @Test public void test() { // Temporarily change active environment to demonstrate that is what // is getting used when graph is constructed. DimpleEnvironment env = new DimpleEnvironment(); DimpleEnvironment.setActive(env); FactorGraph fg = new FactorGraph(); DimpleEnvironment.setActive(DimpleEnvironment.defaultEnvironment()); assertNotSame(env, DimpleEnvironment.active()); assertFactorGraphInvariants(fg); assertEquals("Graph", fg.getClassLabel()); assertTrue(fg.getNumStepsInfinite()); assertEquals(1, fg.getNumSteps()); assertTrue(fg.getFactorGraphStreams().isEmpty()); assertTrue(fg.getSiblings().isEmpty()); assertTrue(fg.isTree()); assertEquals(0, fg.getVariableCount()); assertEquals(0, fg.getFactorCount()); assertFalse(fg.isSolverRunning()); assertSame(fg, fg.getRootGraph()); // Test environment and option parents assertSame(env, fg.getEnvironment()); assertSame(env, fg.getEventParent()); assertSame(env, fg.getOptionParent()); fg.setEventAndOptionParent(null); assertNull(fg.getOptionParent()); assertNull(fg.getEventParent()); fg.setEventAndOptionParent(env); assertSame(env, fg.getOptionParent()); fg.setSolverFactory(null); assertNull(fg.getSolver()); Bit b1 = new Bit(); assertSame(DimpleEnvironment.active(), b1.getEnvironment()); // defaults to active environment Bit b2 = new Bit(); Factor sum1 = fg.addFactor(new Sum(), b1, b2); assertSame(fg, b1.getParentGraph()); assertSame(b1, fg.getVariableByUUID(b1.getUUID())); assertNull(b1.getSolver()); assertSame(fg, b2.getParentGraph()); assertSame(b2, fg.getVariableByUUID(b2.getUUID())); assertNull(b2.getSolver()); assertSame(fg, sum1.getParentGraph()); assertSame(sum1, fg.getFactorByUUID(sum1.getUUID())); assertNull(sum1.getSolver()); assertSame(env, b1.getEnvironment()); // gets environment from parent graph fg.setSolverFactory(new com.analog.lyric.dimple.solvers.sumproduct.Solver()); assertTrue(fg.getSolver() instanceof com.analog.lyric.dimple.solvers.sumproduct.SumProductSolverGraph); assertTrue(b1.getSolver() instanceof com.analog.lyric.dimple.solvers.sumproduct.SumProductDiscrete); assertTrue(b2.getSolver() instanceof com.analog.lyric.dimple.solvers.sumproduct.SumProductDiscrete); assertTrue(sum1.getSolver() instanceof com.analog.lyric.dimple.solvers.sumproduct.SumProductTableFactor); fg.setSolverFactory(null); assertNull(fg.getSolver()); assertNull(b1.getSolver()); assertNull(b2.getSolver()); assertNull(sum1.getSolver()); RandomGraphGenerator gen = new RandomGraphGenerator(testRand); fg = gen.buildRandomGraph(42); assertFactorGraphInvariants(fg); // Test getNode assertNull(fg.getChild(null)); expectThrow(IllegalArgumentException.class, fg, "getChild", fg.getClass()); } public static void assertFactorGraphInvariants(FactorGraph fg) { assertSame(fg, fg.asFactorGraph()); assertTrue(fg.isFactorGraph()); int id = fg.getGraphId(); assertTrue(id != 0); assertSame(fg, fg.getEnvironment().factorGraphs().getGraphWithId(id)); assertSame(fg, fg.getGraphByTreeIndex(fg.getGraphTreeIndex())); VariableList vars = fg.getVariables(); assertEquals(vars.size(), fg.getVariableCount()); for (Variable var : vars) { assertSame(var, fg.getVariableByUUID(var.getUUID())); assertSame(var, fg.getChild(var)); assertSame(var, fg.getChild(var.getGlobalId())); assertSame(var, fg.getChild(var.getGraphTreeId())); assertSame(var, fg.getChild(var.getUUID())); assertSame(var, fg.getChild(var.getQualifiedName())); assertSame(var, var.requireParentGraph().getChild(var.getLocalId())); } } }