|
|
@@ -9,11 +9,16 @@ import ua.ansymo.hintco.ModelQuery
|
|
|
import ua.ansymo.hintco.ModelStorage
|
|
|
|
|
|
import static org.junit.Assert.*
|
|
|
+import org.jgrapht.alg.connectivity.GabowStrongConnectivityInspector
|
|
|
+import ua.ansymo.hintco.RootCandidateScenario
|
|
|
+import org.jgrapht.graph.DefaultWeightedEdge
|
|
|
+import ua.ansymo.hintco.EmptyTriggerSequence
|
|
|
+import ua.ansymo.hintco.CompleteTriggerSequence
|
|
|
+import ua.ansymo.hintco.PartialTriggerSequence
|
|
|
|
|
|
class AlgebraicLoopProcessingTests {
|
|
|
|
|
|
- @Test
|
|
|
- def void addConstraintsWithAlgebraicLoopsTest() {
|
|
|
+ def loadAndRunAlgLoopsSample((RootCandidateScenario)=>void testBody){
|
|
|
val loader = new ModelStorage()
|
|
|
|
|
|
val src = loader.loadCandidates("instances/algebraic_loop_opt_test.hintco")
|
|
|
@@ -23,53 +28,86 @@ class AlgebraicLoopProcessingTests {
|
|
|
],
|
|
|
[ns, vId, constraints, cs |
|
|
|
val scenario = ModelQuery.findRootScenario(ns)
|
|
|
- val cosimUnits = scenario.cosimunits.filter(CosimUnitInstance)
|
|
|
- val A = cosimUnits.findFirst[u | u.identifier=="A"]
|
|
|
- val B = cosimUnits.findFirst[u | u.identifier=="B"]
|
|
|
- assertTrue(A.inputPorts.findFirst[p|p.identifier=="3fromB"].precedes.contains(A))
|
|
|
- assertTrue(A.inputPorts.findFirst[p|p.identifier=="5fromC"].precedes.contains(A))
|
|
|
- assertFalse(B.inputPorts.findFirst[p|p.identifier=="10fromC"].precedes.contains(B))
|
|
|
+ testBody.apply(scenario)
|
|
|
])
|
|
|
generator.createVariantTree(src)
|
|
|
generator.generateVariants(src, 1, true)
|
|
|
}
|
|
|
|
|
|
+ @Test
|
|
|
+ def void addConstraintsWithAlgebraicLoopsTest() {
|
|
|
+ loadAndRunAlgLoopsSample([ scenario |
|
|
|
+ val cosimUnits = scenario.cosimunits.filter(CosimUnitInstance)
|
|
|
+ val A = cosimUnits.findFirst[u|u.identifier == "A"]
|
|
|
+ val B = cosimUnits.findFirst[u|u.identifier == "B"]
|
|
|
+ assertTrue(A.inputPorts.findFirst[p|p.identifier == "3fromB"].precedes.contains(A))
|
|
|
+ assertTrue(A.inputPorts.findFirst[p|p.identifier == "5fromC"].precedes.contains(A))
|
|
|
+ assertFalse(B.inputPorts.findFirst[p|p.identifier == "10fromC"].precedes.contains(B))
|
|
|
+ ])
|
|
|
+ }
|
|
|
+
|
|
|
@Test
|
|
|
def void transformToCosimUnitGraphTest(){
|
|
|
- val loader = new ModelStorage()
|
|
|
-
|
|
|
- val src = loader.loadCandidates("instances/algebraic_loop_opt_test.hintco")
|
|
|
-
|
|
|
- val generator = new CandidatesGenerator(new ConstraintChecker(), [n, alternatives, ns |
|
|
|
- true
|
|
|
- ],
|
|
|
- [ns, vId, constraints, cs |
|
|
|
- val scenario = ModelQuery.findRootScenario(ns)
|
|
|
-
|
|
|
- val graph = new AlgebraicLoopVariantProcessor(null).transformToCosimUnitGraph(scenario)
|
|
|
-
|
|
|
- assertNotNull(graph)
|
|
|
-
|
|
|
- val vertices = graph.vertexSet
|
|
|
- assertEquals(3, vertices.size)
|
|
|
- val A = vertices.findFirst[v | v.identifier == "A"]
|
|
|
- val B = vertices.findFirst[v | v.identifier == "B"]
|
|
|
- val C = vertices.findFirst[v | v.identifier == "C"]
|
|
|
-
|
|
|
- val A4B = graph.getAllEdges(A, B).head
|
|
|
- val B3A = graph.getAllEdges(B, A).head
|
|
|
- val B3C = graph.getAllEdges(B, C).head
|
|
|
-
|
|
|
- assertNotNull(A4B)
|
|
|
- assertNotNull(B3A)
|
|
|
- assertNotNull(B3C)
|
|
|
- assertTrue(graph.getAllEdges(C, B).isEmpty)
|
|
|
- assertEquals(4.0,graph.getEdgeWeight(A4B),1e-4)
|
|
|
- assertEquals(3.0,graph.getEdgeWeight(B3A),1e-4)
|
|
|
- assertEquals(3.0,graph.getEdgeWeight(B3C),1e-4)
|
|
|
- ])
|
|
|
- generator.createVariantTree(src)
|
|
|
- generator.generateVariants(src, 1, true)
|
|
|
+ loadAndRunAlgLoopsSample([ scenario |
|
|
|
+ val graph = new AlgebraicLoopVariantProcessor(null).transformToCosimUnitGraph(scenario)
|
|
|
+
|
|
|
+ assertNotNull(graph)
|
|
|
+
|
|
|
+ val vertices = graph.vertexSet
|
|
|
+ assertEquals(3, vertices.size)
|
|
|
+ val A = vertices.findFirst[v|v.identifier == "A"]
|
|
|
+ val B = vertices.findFirst[v|v.identifier == "B"]
|
|
|
+ val C = vertices.findFirst[v|v.identifier == "C"]
|
|
|
+
|
|
|
+ val A4B = graph.getAllEdges(A, B).head
|
|
|
+ val B3A = graph.getAllEdges(B, A).head
|
|
|
+ val B3C = graph.getAllEdges(B, C).head
|
|
|
+
|
|
|
+ assertNotNull(A4B)
|
|
|
+ assertNotNull(B3A)
|
|
|
+ assertNotNull(B3C)
|
|
|
+ assertTrue(graph.getAllEdges(C, B).isEmpty)
|
|
|
+ assertEquals(4.0, graph.getEdgeWeight(A4B), 1e-4)
|
|
|
+ assertEquals(3.0, graph.getEdgeWeight(B3A), 1e-4)
|
|
|
+ assertEquals(3.0, graph.getEdgeWeight(B3C), 1e-4)
|
|
|
+ ])
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ def void strongComponentsTest(){
|
|
|
+ loadAndRunAlgLoopsSample([ scenario |
|
|
|
+ val graph = new AlgebraicLoopVariantProcessor(null).transformToCosimUnitGraph(scenario)
|
|
|
+
|
|
|
+ val strongComponents = new GabowStrongConnectivityInspector(graph).stronglyConnectedSets()
|
|
|
+ assertEquals(1, strongComponents.size)
|
|
|
+ assertTrue(strongComponents.head.exists[v | v.identifier == "A"])
|
|
|
+ assertTrue(strongComponents.head.exists[v | v.identifier == "B"])
|
|
|
+ assertTrue(strongComponents.head.exists[v | v.identifier == "C"])
|
|
|
+ ])
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ def void optimalTriggerSequenceTest(){
|
|
|
+ loadAndRunAlgLoopsSample([ scenario |
|
|
|
+ val algLoopProcessor = new AlgebraicLoopVariantProcessor(null)
|
|
|
+ val graph = algLoopProcessor.transformToCosimUnitGraph(scenario)
|
|
|
+ val searchGraphAndTriggerSeq = algLoopProcessor.findOptimalTriggerSequence(graph)
|
|
|
+ val searchGraph = searchGraphAndTriggerSeq.key
|
|
|
+ val triggerSeq = searchGraphAndTriggerSeq.value
|
|
|
+
|
|
|
+ val getTrg = [int idx | (searchGraph.getEdgeTarget(triggerSeq.edgeList.get(idx)) as PartialTriggerSequence)]
|
|
|
+ val getWeight = [int idx | (searchGraph.getEdgeWeight(triggerSeq.edgeList.get(idx)))]
|
|
|
+
|
|
|
+ assertEquals(5, triggerSeq.vertexList.length)
|
|
|
+ assertTrue(searchGraph.getEdgeSource(triggerSeq.edgeList.head) instanceof EmptyTriggerSequence)
|
|
|
+ assertTrue(searchGraph.getEdgeTarget(triggerSeq.edgeList.last) instanceof CompleteTriggerSequence)
|
|
|
+ assertEquals("B", getTrg.apply(0).unit.identifier)
|
|
|
+ assertEquals(4.0, getWeight.apply(0), 1e-4)
|
|
|
+ assertEquals("C", getTrg.apply(1).unit.identifier)
|
|
|
+ assertEquals(3.0, getWeight.apply(1), 1e-4)
|
|
|
+ assertEquals("A", getTrg.apply(2).unit.identifier)
|
|
|
+ assertEquals(0.0, getWeight.apply(2), 1e-4)
|
|
|
+ ])
|
|
|
}
|
|
|
|
|
|
}
|