Exemple #1
0
        public static void ConformTrees(DataTree t1, DataTree t2, DataGroupingModes mode, out DataTree firstTree, out DataTree secondTree, int primary = 0)
        {
            int ind = -1;

            if (mode == DataGroupingModes.Shortest)
            {
                ind = t1.Count <= t2.Count ? 0 : 1;
            }
            else if (mode == DataGroupingModes.Longest)
            {
                ind = t1.Count >= t2.Count ? 0 : 1;
            }
            else if (mode == DataGroupingModes.Primary)
            {
                firstTree  = primary == 0 ? t1 : t1.ConformTree(t2);
                secondTree = primary == 0 ? t2.ConformTree(t1) : t2;
                return;
            }

            if (ind != -1)
            {
                if (ind == 0)
                {
                    firstTree = t1; secondTree = t2.ConformList(t1);
                }
                else
                {
                    firstTree = t1.ConformList(t2); secondTree = t2;
                }
                bool test = ind == 0 ? firstTree.IsTree : secondTree.IsTree;
                if (test)
                {
                    if (ind == 0 && !secondTree.IsTree)
                    {
                        secondTree.GraftTree();
                    }
                    else if (ind == 1 && !firstTree.IsTree)
                    {
                        firstTree.GraftTree();
                    }
                    for (int i = 0; i < firstTree.Count; i++)
                    {
                        ConformTrees(firstTree[i] as DataTree, secondTree[i] as DataTree, mode, out DataTree f1, out DataTree f2, primary);
                        firstTree.Data[i].Replace(f1);
                        secondTree.Data[i].Replace(f2);
                    }
                }
            }
            else
            {
                CrossRefTree(t1, t2, out firstTree, out secondTree);
            }
        }
Exemple #2
0
        private static void ConformListOfTreesLongestShortest(List <DataTree> input, out List <DataTree> output, DataGroupingModes mode)
        {
            output = new List <DataTree>();
            int maxCount = -1;
            int maxIndex = -1;
            int minCount = int.MaxValue;
            int minIndex = -1;

            for (int i = 0; i < input.Count; i++)
            {
                if (input[i].Count > maxCount)
                {
                    maxCount = input[i].Count; maxIndex = i;
                }
                ; if (input[i].Count < minCount)
                {
                    minCount = input[i].Count; minIndex = i;
                }
            }
            bool test = false;

            foreach (var l in input)
            {
                output.Add(l.RequestNewSizeRepeatLast(mode == DataGroupingModes.Longest ? maxCount : minCount));
                test |= l.IsTree;
            }
            if (test)
            {
                foreach (var l in output)
                {
                    if (!(l.IsTree))
                    {
                        l.GraftTree();
                    }
                }


                for (int i = 0; i < output[0].Count; i++)
                {
                    var newInput = new List <DataTree>();
                    foreach (var l in output)
                    {
                        newInput.Add(l.Data[i] as DataTree);
                    }
                    ConformListOfTreesLongestShortest(newInput, out List <DataTree> newOutput, mode);
                    for (int j = 0; j < newOutput.Count; j++)
                    {
                        output[j].ReplaceBranch(newOutput[j], i);
                    }
                }
            }
        }
Exemple #3
0
 public static void ConformTrees(List <DataTree> trees, out List <DataTree> output, DataGroupingModes mode, int primaryIndex = 0)
 {
     output = new List <DataTree>();
     if (mode == DataGroupingModes.Primary)
     {
         output.Add(trees[primaryIndex]);
         for (int i = 0; i < trees.Count; i++)
         {
             if (i != primaryIndex)
             {
                 ConformTrees(trees[primaryIndex], trees[i], mode, out DataTree f1, out DataTree f2, 0);
                 //output.Add(f1);
                 output.Add(f2);
             }
         }
     }
     else if (mode == DataGroupingModes.CrossReference)
     {
         CrossRefTree(trees, out output);
     }
     else
     {
         ConformListOfTreesLongestShortest(trees, out output, mode);
     }
 }