Exemple #1
0
        private BitmapWrapper PrepareBitmapWrapper(MsInstance <int> data, List <int> elementsList, List <int> transactionsList)
        {
            var stopwatch = new Stopwatch();

            stopwatch.Start();
            var bitmap = BuildTransactionsBitmap(data, transactionsList, elementsList);

            stopwatch.Stop();
            //Console.WriteLine(stopwatch.ElapsedMilliseconds);
            ExecutionEngine.HackTimes.Add(stopwatch.ElapsedMilliseconds);
            var bitmapWrapper = BitmapWrapper.ConvertBitmap(bitmap);

            return(bitmapWrapper);
        }
Exemple #2
0
        public override void Run(ExecutionSettings executionSettings, bool printRules)
        {
            builder = new MsDataBuilder();
            var data                = builder.BuildInstance(executionSettings);
            var elementsList        = data.Elements.Keys.ToList();
            var transactionsList    = data.Transactions.Keys.ToList();
            var bitmapWrapper       = PrepareBitmapWrapper(data, elementsList, transactionsList);
            var elementsFrequencies = CalculateElementsFrequencies(bitmapWrapper);
            var frequentSets        = elementsList
                                      .Where(e => elementsFrequencies[elementsList.IndexOf(e)] >= executionSettings.MinSup * transactionsList.Count)
                                      .Select(element => new List <int> {
                element
            })
                                      .ToList();
            var frequentItemSets = frequentSets.ToDictionary(set => new FrequentItemSet <int>(set),
                                                             set => elementsFrequencies[elementsList.IndexOf(set[0])]);
            List <List <int> > candidates;

            if (frequentSets.Count == 0)
            {
                return;
            }

            var bitmapTransposed = new Bitmap(transactionsList.Count, frequentSets.Count);
            var newElementsList  = new List <int>(frequentSets.Count);
            var jj = 0;

            foreach (var set in frequentSets)
            {
                newElementsList.Add(set[0]);

                for (var i = 0; i < transactionsList.Count; i++)
                {
                    var pixel = bitmapWrapper.Bitmap.GetPixel(elementsList.IndexOf(set[0]), i);

                    bitmapTransposed.SetPixel(i, jj, pixel);
                }
                jj++;
            }
            var newBitmapWrapper = BitmapWrapper.ConvertBitmap(bitmapTransposed);

            while ((candidates = GenerateCandidates(frequentSets)).Count > 0)
            {
                // 1. tranlate into elements Id's
                foreach (var candidate in candidates)
                {
                    for (var i = 0; i < candidate.Count; i++)
                    {
                        candidate[i] = newElementsList.IndexOf(candidate[i]);
                    }
                }

                // 2. execute CUDA counting
                candidates = GetFrequentSets(candidates, executionSettings.MinSup, newBitmapWrapper, transactionsList.Count);

                // 3. translate back from elements Id's
                foreach (var candidate in candidates)
                {
                    for (var i = 0; i < candidate.Count; i++)
                    {
                        candidate[i] = newElementsList[candidate[i]];
                    }
                }

                if (candidates.Count > 0)
                {
                    var sw = new Stopwatch();
                    sw.Start();
                    frequentSets = candidates;
                    foreach (var candidate in candidates)
                    {
                        frequentItemSets.Add(new FrequentItemSet <int>(candidate), candidate.GetSupport(data.Transactions));
                    }
                    sw.Stop();
                    //Console.WriteLine("CAND: {0}", sw.ElapsedMilliseconds);
                }
                else
                {
                    // we don't have any more candidates
                    break;
                }
            }

            //here we should do something with the candidates
            var decisionRules = new List <DecisionRule <int> >();

            foreach (var frequentSet in frequentSets)
            {
                var subSets = EnumerableHelper.GetSubsets(frequentSet);

                foreach (var t in subSets)
                {
                    var leftSide = new FrequentItemSet <int>(t);
                    for (var j = 0; j < subSets.Count; j++)
                    {
                        var rightSide = new FrequentItemSet <int>(subSets[j]);
                        if (rightSide.ItemSet.Count != 1 || !FrequentItemSet <int> .SetsSeparated(rightSide, leftSide))
                        {
                            continue;
                        }

                        if (frequentItemSets.ContainsKey(leftSide))
                        {
                            var confidence = (double)frequentItemSets[new FrequentItemSet <int>(frequentSet)] / frequentItemSets[leftSide];
                            if (confidence >= executionSettings.MinConf)
                            {
                                var rule = new DecisionRule <int>(leftSide.ItemSet, rightSide.ItemSet, frequentItemSets[new FrequentItemSet <int>(frequentSet)], confidence);
                                decisionRules.Add(rule);
                            }
                        }
                    }
                }
            }

            if (!printRules)
            {
                return;
            }

            var result = PrintRules(decisionRules, executionSettings.DataSourcePath, executionSettings.MinSup, executionSettings.MinConf, data.Transactions.Keys.Count, data.Elements);

            Console.WriteLine(result);
        }