using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Office.Interop.Word;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
namespace VirtualIdentity.CoreMining.AuthorIdentification
{
public struct FrequentItems
{
internal short fequency;
internal string itemName;
}
struct Fptree
{
public string parent;
public string node;
public string child;
public short wight;
}
struct GeneratedRules
{
public double item1Support;
public int item2Support;
public double confidence;
public string item1;
public string item2;
}
GeneratedRules[] rules = new GeneratedRules[10]; //store top ten patterns generated by FP Growth algorithm
string frequentPatterns;
int q = 0;
//-----------------------
RichTextBox richTextBox1 = new RichTextBox();
DataGridView dataGridView1 = new DataGridView();
public static System.Data.DataSet ds = new System.Data.DataSet();
System.Data.DataTable dt;
DataRow dr;
int columnNames;
int numberOfItemInDB = 0;
//________________FPTree___
int treeSize = 0;
FrequentItems[] frequentItemList;
int frequentItemListSize = 0;
int maxNumberOfItems; //maximum number of item containing transaction item length
// FPTree[] tree;
public static double min_support = 3;
public static double min_confidence = 0.5;
//________________________________
public static string databaseName;
public static string tableName;
private int numberOfWords(string[] lineReading)
{
int numberOfWord = 0;
foreach (string s in lineReading)
{
if (!s.Equals(" "))
numberOfWord++;
}
return numberOfWord;
}
private void StartButton_Click_1(object sender, EventArgs e)//start association using selected algorithm
{
richTextBox1.Clear();
numberOfItemInDB = 0;
System.Collections.ArrayList _items = scanDataBase();
insertFrequentItems(_items, numberOfItemInDB - calcutatMinSupport(_items));
frequentItemsOrder();
// Display(_items); //display FP Tree
//--------------------------
initParrentArray();
list = new System.Collections.ArrayList();
richTextBox1.Text = "=== Run information ===";
richTextBox1.Text += "\n\n\n\nScheme : " + databaseName;
richTextBox1.Text += "\nRelation : " + tableName;
richTextBox1.Text += "\nInstance : " + dataGridView1.RowCount;
richTextBox1.Text += "\n\nAttribute : ";
for (int r = 0; r < frequentItemList.Length; r++)// frequentItemSet
{
richTextBox1.Text += "\n\t " + frequentItemList[r].itemName;
itemOrder += frequentItemList[r].itemName + ',';
}
//rules.Add()
richTextBox1.Text += "\n\n\n====== Associator model (full training set) ======";
// richTextBox1.SelectionFont = new System.Drawing.Font("Algerian", 11, FontStyle.Underline);
// richTextBox1.SelectedText = "\n\n\n=== Associator model (full training set) ===";
richTextBox1.Font = new System.Drawing.Font("Times New Roman", 10, System.Drawing.FontStyle.Regular);
// richTextBox1.Font = new System.Drawing.Font("DFKai-SB", 10, FontStyle.Regular);
tree = new Fptree[treeSize];//numberOfItems
int lastColumn = dataGridView1.ColumnCount - 1;
int j = 0;
int countRow = 0;
do
{
drowFPTree(dataGridView1.Rows[countRow].Cells[lastColumn].Value.ToString().TrimEnd(' ').Split(','), ref tree, ref j);
countRow++;
} while (dataGridView1.RowCount > countRow);
Array.Resize<Fptree>(ref tree, j); //chenge the size of the array
private void findFrequentItemSets(string item)
{
string temp = "";
int support = 0;
frequentPatterns = "";
for (int j = 1; j < conditionalFPTree.Length; j++)
{
temp = conditionalFPTree[j].node;
for (int k = 1; k < conditionalFPTree.Length; k++)
{
if (conditionalFPTree[k].node == temp)//conditional pattern for each item
{
support += conditionalFPTree[k].wight;
}
}
if (support >= min_support && !frequentPatterns.Contains(temp) && temp != item)
frequentPatterns += temp + ',';
support = 0;
frequentPatterns.TrimEnd(',');
list.Clear();//An array store all possible combnations of frequent item sets
creatCombination(freqPattern, list);
// displayList(list);
int temp_support = 0;
richTextBox1.Text += "\n\n\t Frequent pattern set for " + itemName + " { ";
for (int i = 0; i < list.Count; i++)
{
temp_support = getSupport(conditionalFPTree, itemName, list[i].ToString());//suport of all possible frequent item sets combination one by one
if (temp_support >= min_support)
{
richTextBox1.Text += list[i].ToString() + ',' + itemName + ':' + temp_support + " "; //pattern
calculateConfidence(list[i].ToString() + ',' + itemName, temp_support);
}
// temp_support = 0;
}
private int getMinimumConfidence(double minConf)//return minimum confidence item in the rules array
{
for (int t = 0; t < 10; t++)
{
if (rules[t].confidence < minConf)
return t;
}
return -1;
}
private int getCombination(int n, int r)
{
int denominator = (getFactorial(n - r) * getFactorial®);
return getFactorial(n) / denominator;
}
private int getFactorial(int num)
{
int fac = 1;
for (int i = 2; i <= num; i++)
fac *= i;
return fac;
}
//------------------ combnation function end-------------------------
//---------------------calculat minimum support -------------------
private int getSupport(Fptree[] _tree, string childName, string parents)//Get support from conditional FP Tree
{
int support = 0;
bool pathExist = false;
for (int c = _tree.Length - 1; c > -1; c--)
{
if (_tree[c].node.Equals(childName))// && conditionalFPTree[c].parent.Contains(_parent))
{
foreach (string par in parents.TrimEnd(',').Split(','))
{
if (!par.Equals(String.Empty))
{
if (_tree[c].parent.TrimEnd('-').Split('-').Contains(par))
pathExist = true;
else
{
pathExist = false;
break;
}
}
}
if (pathExist)
{
support += _tree[c].wight;
pathExist = false;
}
}
}
return support;
}
//---------------------end min support calculation-----------------
private void frequentItemsOrder()//fill datagridview with Frequent Items Order of each transactions
{
treeSize = 0;
string temp = "";
for (int m = 0; m < dataGridView1.Rows.Count; m++)
{
for (int n = 0; n < frequentItemList.Length; n++)
{
for (int col = 0; col < dataGridView1.ColumnCount - 1; col++)
{
if (dataGridView1.Rows[m].Cells[col].Value.ToString().TrimEnd(' ').Equals(frequentItemList[n].itemName) && frequentItemList[n].itemName != null)
temp += frequentItemList[n].itemName + ',';
}
}
if (maxNumberOfItems < temp.TrimEnd(',').Length)
maxNumberOfItems = temp.TrimEnd(',').Length;
private int calcutatMinSupport(System.Collections.ArrayList items)//Find items > given minimum support and return removed number of items
{
items.Sort();
int count = 0;
string itemName = String.Empty;
int NoRemovedItem = 0;//list of item to be removed
string removeList = String.Empty;//list of item to be removed
foreach (string singleItem in items)
{
if (!singleItem.Equals(itemName))
{
if (itemName != String.Empty && count < Convert.ToInt32(min_support))
{
removeList += itemName + ',';
NoRemovedItem++;
}
itemName = singleItem;
count = 1;
}
else
count++;
}
if (itemName != String.Empty && count < Convert.ToInt32(min_support)) // for the last item with in the items arraylist
{
removeList += itemName;
NoRemovedItem++;
}
// MessageBox.Show(removeList);
removeItems(removeList, items);
return NoRemovedItem;
}
private void removeItems(string _itemNames, System.Collections.ArrayList _items)//remove items < given minimum support
{
foreach (string s in _itemNames.Split(','))
{
while (_items.Contains(s))
_items.Remove(s);
}
}
private System.Collections.ArrayList scanDataBase()
{
System.Collections.ArrayList items = new System.Collections.ArrayList();//Temporarly store all items from DB
for (int i = 0; i < dataGridView1.RowCount; i++)
{
for (int column = 0; column < dataGridView1.ColumnCount - 1; column++)
{
if (!dataGridView1.Rows[i].Cells[column].Value.ToString().TrimEnd(' ').Equals(String.Empty))
{
if (!items.Contains(dataGridView1.Rows[i].Cells[column].Value.ToString().TrimEnd(' ')))
numberOfItemInDB++;
items.Add(dataGridView1.Rows[i].Cells[column].Value.ToString().TrimEnd(' '));// if column 0 is trsansaction row
}
}
}
// MessageBox.Show(numberOfItemInDB.ToString());
// Display(items);
return items;
}