public void MergeGroup_WithSmallCycle_ReturnsSingle(bool reversedOrder) { //a[i32,r] //r ==> a var a = CreateNode("a", new ConstrainsState(StatePrimitive.I32, StatePrimitive.Real)); var r = CreateNode("r", new StateRefTo(a)); var merged = SolvingFunctions.MergeGroup(reversedOrder?new[] { r, a }: new[] { a, r }); Assert.AreEqual(a, merged); Assert.AreEqual(r.State, new StateRefTo(merged)); Assert.AreEqual(new ConstrainsState(StatePrimitive.I32, StatePrimitive.Real), merged.State); }
public void MergeGroup_WithCycle_ReturnsSingle(params int[] order) { //a[i32,r] //b[i24,r] //r ==> a var a = CreateNode("a", new ConstrainsState(StatePrimitive.I32, StatePrimitive.Real)); var b = CreateNode("b", new ConstrainsState(StatePrimitive.I24, StatePrimitive.Real)); var r = CreateNode("r", new StateRefTo(a)); var group = new TicNode[3]; group[order[0]] = a; group[order[1]] = b; group[order[2]] = r; var merged = SolvingFunctions.MergeGroup(group); Assert.AreNotEqual(r, merged); Assert.AreEqual(new ConstrainsState(StatePrimitive.I32, StatePrimitive.Real), merged.State); }
private static void RemoveRefenceCycles(SolvingNode[] nodes) { while (true) { var refList = FindRefNodesGraph(nodes); var arrayOfRefList = refList.ToArray(); var refGraph = ConvertToRefArrayGraph(arrayOfRefList); var refTopology = GraphTools.SortTopology(refGraph); if (!refTopology.HasCycle) { return; } var refCycle = refTopology.NodeNames.Select(n => nodes[n.To]).ToArray(); SolvingFunctions.MergeGroup(refCycle); } }
public void MergeGroup_WithCycle_AncestorsAreCorrect(params int[] order) { //Arrange: //a[i32,r] //b[i24,r] //r ==> a var a = CreateNode("a", new ConstrainsState(StatePrimitive.I32, StatePrimitive.Real)); var b = CreateNode("b", new ConstrainsState(StatePrimitive.I24, StatePrimitive.Real)); var r = CreateNode("r", new StateRefTo(a)); var anc1 = CreateNode("anc1"); var anc2 = CreateNode("anc2"); var anc3 = CreateNode("anc3"); a.AddAncestor(anc1); b.AddAncestor(anc2); r.AddAncestor(anc3); // Shuffle group order var group = new TicNode[3]; group[order[0]] = a; group[order[1]] = b; group[order[2]] = r; //Act: var merged = SolvingFunctions.MergeGroup(group); //Assert: //All non main node have to loose all ancestors foreach (var nonRef in new [] { a, b, r }.Where(i => i != merged)) { Assert.IsEmpty(nonRef.Ancestors); } //All ancestors move to main node Assert.AreEqual(3, merged.Ancestors.Count); Assert.Contains(anc1, merged.Ancestors.ToArray()); Assert.Contains(anc2, merged.Ancestors.ToArray()); Assert.Contains(anc3, merged.Ancestors.ToArray()); }