/** * Tests that models can be created that have multiple factors over the same edge, and that * potentialOfEdge returns the product in that case. */ public void testMultipleEdgePotentials() { Variable v1 = new Variable(2); Variable v2 = new Variable(2); Variable[] vars = new Variable[] {v1, v2}; FactorGraph mdl = new FactorGraph(vars); Factor ptl1 = new TableFactor(vars, new double[] {0.5, 0.5, 0.5, 0.5}); mdl.addFactor(ptl1); Factor ptl2 = new TableFactor(vars, new double[] {0.25, 0.25, 0.5, 0.5}); mdl.addFactor(ptl2); try { mdl.factorOf(v1, v2); fail(); } catch (RuntimeException e) { } Collection factors = mdl.allFactorsContaining(new HashVarSet(vars)); assertEquals(2, factors.size()); assertTrue(factors.contains(ptl1)); assertTrue(factors.contains(ptl2)); double[] vals = {0.125, 0.125, 0.25, 0.25}; Factor total = TableFactor.multiplyAll(factors); Factor expected = new TableFactor(vars, vals); assertTrue( "Arrays not equal\n Expected " + ArrayUtils.toString(vals) + "\n Actual " + ArrayUtils.toString(((TableFactor) total).toValueArray()), expected.almostEquals(total, 1e-10)); }