private static List <TreePatternMatches> FindIdiomsInTrees(IEnumerable <ICommonTree> treeCollection)
        {
            Stopwatch watch = Stopwatch.StartNew();

            var treeCollector = FindFrequentSubtrees(treeCollection, IdiomProviderConfig.GetDefaultConfig().MinSupportPercentage);

            Debug.WriteLine($"\n\nFound frequent trees from {treeCollection.Count()} trees in {watch.ElapsedMilliseconds} milliseconds");
            Debug.WriteLine($"There are {treeCollector.ClosedTrees.Count} closed trees\n and {treeCollector.MaximalTrees.Count} maximal trees");

            Debug.WriteLine("\n\n\n*** MERGING CLOSED TREES ***");
            var closedTrees = CanonicalizeFrequentTrees(treeCollector.ClosedTrees).ToList();

            Debug.WriteLine("\n\n\n*** MERGING MAXIMAL TREES ***");
            var maximalTrees = CanonicalizeFrequentTrees(treeCollector.MaximalTrees).ToList();

            Debug.WriteLine($"After merging, there are {closedTrees.Count} closed trees\n and {maximalTrees.Count} maximal trees");
            closedTrees  = SubsumeFrequentTrees(closedTrees);
            maximalTrees = SubsumeFrequentTrees(maximalTrees);

            Debug.WriteLine($"After subsumption, there are {closedTrees.Count} closed trees\n and {maximalTrees.Count} maximal trees");
            var orderedSubsumedMaximalTrees = maximalTrees.OrderByDescending(tup => tup.AllMatchLocations.Count()).ToList();

            // var mergedIdiomPatterns = MergeFrequentIdiomTrees(orderedSubsumedMaximalTrees);


            // Debug.WriteLine($"\n\ndone with frequent trees in {watch.ElapsedMilliseconds} milliseconds");
            // return mergedIdiomPatterns;
            return(orderedSubsumedMaximalTrees);
        }
        private static TreeCollector FindFrequentSubtrees(IEnumerable <ICommonTree> treeCollection, int minSupportPercentage)
        {
            Func <ICommonTree, bool> idiomFilter = (ICommonTree x) => true;

            var             treeConverter = new TreeConverter();
            List <TextTree> textTrees     = treeCollection.Select(tree => treeConverter.ConvertToCMOrderedTreeMinerTree(tree)).ToList();

            var main = new Main();

            main.Support = (int)((minSupportPercentage / 100.0) * textTrees.Count());
            main.Support = Math.Max(main.Support, IdiomProviderConfig.GetDefaultConfig().MinSupportCount);
            Debug.WriteLine($"Minimum Support is {main.Support}");
            var treeCollector = new TreeCollector();

            treeCollector.TreeFilter = idiomFilter;

            main.Run(textTrees, treeCollector);

            return(treeCollector);
        }