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); }
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); }