package com.plectix.simulator.stories.graphs;
import static org.junit.Assert.fail;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeMap;
import java.util.Map.Entry;
public class TestTransitivity {
private TreeMap<Long, Set<Long>> trace;
private TreeMap<Long, Set<Long>> transitiveTrace;
public TestTransitivity(TreeMap<Long, Set<Long>> edges) {
trace = edges;
}
public void test() {
transitiveTrace = copyTrace(trace);
transitiveTrace = warshall(transitiveTrace);
checkTransitivity(trace, transitiveTrace);
}
private TreeMap<Long, Set<Long>> copyTrace(TreeMap<Long, Set<Long>> trace2) {
TreeMap<Long, Set<Long>> newTrace = new TreeMap<Long, Set<Long>>();
Set<Long> set;
for (Entry<Long, Set<Long>> traceEntry : trace2.entrySet()) {
set = new LinkedHashSet<Long>();
for (Long i : traceEntry.getValue()) {
set.add(i);
}
newTrace.put(traceEntry.getKey(), set);
}
return newTrace;
}
private TreeMap<Long, Set<Long>> warshall(TreeMap<Long, Set<Long>> trace) {
Set<Long> set = new LinkedHashSet<Long>();
for (Entry<Long, Set<Long>> traceEntry2 : trace.entrySet()) {
for (Entry<Long, Set<Long>> traceEntry : trace.entrySet()) {
for (Long w : trace.keySet()) {
set = traceEntry.getValue();
if (!set.contains(w) && set.contains(traceEntry2.getKey())
&& traceEntry2.getValue().contains(w)) {
set.add(w);
trace.put(traceEntry.getKey(), set);
}
}
}
}
return trace;
}
private void checkTransitivity(TreeMap<Long, Set<Long>> trace2,
TreeMap<Long, Set<Long>> transitiveTrace2) {
for (Long k : trace2.keySet()) {
for (Entry<Long, Set<Long>> traceEntry : trace2.entrySet()) {
for (Long w : traceEntry.getValue()) {
if (transitiveTrace2.get(traceEntry.getKey()).contains(k)
&& transitiveTrace2.get(k).contains(w)) {
fail("the graph has a transitive relation");
}
}
}
}
}
}