public FPTree(Arff source, int minimumCoverage, int maximumItemSetSize, double minimumAccuracy, int resultSize)
        {
            //load input
            Source = source;
            MinimumCoverage = minimumCoverage;
            MaximumItemSetSize = maximumItemSetSize;
            MinimumAccuracy = minimumAccuracy;
            ResultSize = resultSize;

            //initiate Root
            Root = new FPTreeNode();

            //local variables
            ItemSet ItemSet;
            ItemSet HighFrequencyOneItemSet;
            FPTreeTable FPTreeTable;

            //get the size 1 ItemSet
            ItemSet = new ItemSet(Source);

            //initiate High Frequency 1-item set
            HighFrequencyOneItemSet = ItemSet.DeepCopy();
            HighFrequencyOneItemSet.MeetMinimumCoverage(MinimumCoverage);
            HighFrequencyOneItemSet.OrderByFrequencyDescending();

            //initiate FPTreeTable
            FPTreeTable = new FPTreeTable(Source, HighFrequencyOneItemSet);

            //build FPTree
            BuildFPTreeFromRoot(FPTreeTable);
        }
        private void BuildFPTreeFromRoot(FPTreeTable table)
        {
            //pick first items from the table
            var FirstItemsQuery = from record in table.Records
                                  group record.Items[0].Condition by record.Items[0].Condition.ToString() into g
                                  select g.ToList();

            List<FPTreeTableRecordItem> FirstItems = new List<FPTreeTableRecordItem>();
            foreach (var firstItem in FirstItemsQuery)
            {
                FirstItems.Add(new FPTreeTableRecordItem(firstItem[0], firstItem.Count()));
            }
            FirstItems = FirstItems.OrderByDescending(i => i.Frequency).ToList();
            //put them into tree
            Root.AddChildren(FirstItems);
        }