/******************************************************************************* * Copyright 2015 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.core; import static com.analog.lyric.dimple.model.sugar.ModelSyntacticSugar.*; import static org.junit.Assert.*; import java.util.Collection; import java.util.Iterator; import java.util.UUID; import org.junit.Test; import com.analog.lyric.dimple.model.core.Edge; import com.analog.lyric.dimple.model.core.EdgeState; import com.analog.lyric.dimple.model.core.FactorGraph; import com.analog.lyric.dimple.model.core.Ids; import com.analog.lyric.dimple.model.factors.Factor; import com.analog.lyric.dimple.model.sugar.ModelSyntacticSugar.CurrentModel; import com.analog.lyric.dimple.model.variables.Real; import com.analog.lyric.dimple.model.variables.Variable; import com.analog.lyric.dimple.test.DimpleTestBase; /** * git@github.com:AnalogDevicesLyricLabs/dimple.git * @since 0.08 * @author Christopher Barber */ public class TestEdges extends DimpleTestBase { @Test public void test() { FactorGraph template = new FactorGraph("sub"); try (CurrentModel cur = using(template)) { Real x = boundary(real("x")), y = boundary(real("y")); name("z", sum(x,y)); } FactorGraph fg = new FactorGraph("fg"); testGraphEdgeInvariants(fg); try (CurrentModel cur = using(fg)) { Real a = real("a"), b = real("b"); name("c", sum(a,b)); testGraphEdgeInvariants(fg); FactorGraph sub = fg.addGraph(template, a, b); testGraphEdgeInvariants(fg); testGraphEdgeInvariants(sub); sub.remove(sub.getFactors().getByIndex(0)); testGraphEdgeInvariants(fg); testGraphEdgeInvariants(sub); } } @SuppressWarnings("deprecation") private void testGraphEdgeInvariants(FactorGraph fg) { Collection<Edge> edges = fg.getGraphEdges(); Collection<EdgeState> edgeStates = fg.getGraphEdgeState(); assertEquals(edges.size(), edgeStates.size()); Iterator<Edge> edgeIter = edges.iterator(); Iterator<EdgeState> edgeStateIter = edgeStates.iterator(); for (int i = 0, n = edges.size(); i < n; ++i) { assertTrue(edgeIter.hasNext()); assertTrue(edgeStateIter.hasNext()); Edge edge = edgeIter.next(); EdgeState edgeState = edgeStateIter.next(); assertSame(fg, edge.graph()); assertSame(edgeState, edge.edgeState()); assertSame(edge.edgeIndex(), edgeState.edgeIndex(fg)); assertSame(edge.type(), edgeState.type(fg)); assertTrue(edge.edgeIndex() >= 0); assertTrue(edge.edgeIndex() <= fg.getGraphEdgeStateMaxIndex()); assertSame(fg, edge.getParentGraph()); assertSame(fg.getRootGraph(), edge.getRootGraph()); UUID uuid = edge.getUUID(); assertEquals(edge.getGlobalId(), Ids.globalIdFromUUID(uuid)); assertEquals(edge.getLocalId(), edge.getId()); assertEquals(edge, fg.getChildByLocalId(edge.getLocalId())); assertEquals(edge, fg.getRootGraph().getChildByGlobalId(edge.getGlobalId())); assertEquals(edge, fg.getRootGraph().getChildByGraphTreeId(edge.getGraphTreeId())); assertSame(edgeState, fg.getGraphEdgeState(edgeState.edgeIndexInParent(fg))); assertSame(edgeState, edgeState.getFactorParent(fg).getGraphEdgeState(edgeState.factorEdgeIndex())); assertSame(edgeState, edgeState.getVariableParent(fg).getGraphEdgeState(edgeState.variableEdgeIndex())); Factor factor = edge.factor(); Variable variable = edge.variable(); assertSame(factor, edge.getSibling(variable)); assertSame(variable, edge.getSibling(factor)); assertEquals(edge, factor.getSiblingEdge(edge.edgeState().getFactorToVariableEdgeNumber())); assertEquals(edge, variable.getSiblingEdge(edge.edgeState().getVariableToFactorEdgeNumber())); assertSame(factor, edgeState.getFactorParent(fg).getFactorByLocalId(edgeState.factorLocalId())); assertSame(variable, edgeState.getFactorParent(fg).getVariableByLocalId(edgeState.variableLocalId())); switch (edge.type()) { case LOCAL: assertTrue(edge.isLocal()); assertSame(fg, edgeState.getFactorParent(fg)); assertSame(fg, edgeState.getVariableParent(fg)); break; case INNER: assertFalse(edge.isLocal()); assertTrue(fg.isAncestorOf(edgeState.getFactorParent(fg))); assertSame(fg, edgeState.getVariableParent(fg)); break; case OUTER: assertFalse(edge.isLocal()); assertTrue(edgeState.getVariableParent(fg).isAncestorOf(fg)); assertSame(fg, edgeState.getFactorParent(fg)); break; } } assertFalse(edgeIter.hasNext()); assertFalse(edgeStateIter.hasNext()); } }