/*******************************************************************************
* 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 java.util.Objects.*;
import static org.junit.Assert.*;
import java.util.Map;
import java.util.Random;
import org.junit.Test;
import com.analog.lyric.dimple.model.core.DirectedNodeSorter;
import com.analog.lyric.dimple.model.core.FactorGraph;
import com.analog.lyric.dimple.model.core.Node;
import com.analog.lyric.dimple.model.factors.Factor;
import com.analog.lyric.dimple.model.variables.Variable;
import com.analog.lyric.dimple.test.DimpleTestBase;
/**
* Tests for {@link DirectedNodeSorter}
*
* @since 0.07
* @author Christopher Barber
*/
public class TestDirectedNodeSorter extends DimpleTestBase
{
@Test
public void test()
{
RandomGraphGenerator generator = new RandomGraphGenerator(new Random(42));
// Undirected cases
testCase(generator.buildRandomGraph(20));
testCase(generator.buildGrid(3));
// Fully directed cases
testCase(generator.buildStudentNetwork());
generator.direction(RandomGraphGenerator.Direction.FORWARD);
testCase(generator.buildRandomGraph(20));
testCase(generator.buildGrid(3));
}
private void testCase(FactorGraph fg)
{
testInvariants(fg, DirectedNodeSorter.orderDirectedNodes(fg));
}
private void testInvariants(FactorGraph fg, Map<Node, Integer> orderMap)
{
for (Factor factor : fg.getFactors())
{
assertEquals(factor.isDirected(), orderMap.containsKey(factor));
if (!factor.isDirected())
{
continue;
}
int order = orderMap.get(factor);
int[] to = requireNonNull(factor.getDirectedTo());
for (int i : to)
{
Variable var = factor.getSibling(i);
assertTrue(orderMap.containsKey(var));
assertTrue(order < orderMap.get(var));
}
int[] from = requireNonNull(factor.getDirectedFrom());
for (int i : from)
{
Variable var = factor.getSibling(i);
assertTrue(orderMap.containsKey(var));
assertTrue(order > orderMap.get(var));
}
if (from.length == 0)
{
assertEquals(0, order);
}
else
{
assertTrue(order > 0);
}
}
for (Node node : orderMap.keySet())
{
assertTrue(orderMap.get(node) >= 0);
if (node instanceof Factor)
{
assertTrue(((Factor)node).isDirected());
}
}
}
}