📄 liedoc.cpp
字号:
// LieDoc.cpp : implementation file
//
#include "stdafx.h"
#include "mainfrm.h"
#include "LinkDB.h"
#include "afxdb.h"
#include "RSet.h"
#include "LieDoc.h"
#include "WaitDlg.h"
#include "lietestdlg.h"
//---------completion
#include "liecompletedel.h"
#include "baocomplete.h"
#include "zssinc/zssMeancomplete.h"
#include "zssinc/zsscombinalcomplete.h"
#include "zssinc/zssconditionmeancomplete.h"
//----discrete -------
#include "discrete/SemiMini.h"
#include "discrete/SemiMiniOne.h"
#include "discrete/seminaive.h"
#include "discrete/naivedis.h"
#include "discrete/mydis.h"
#include "discrete/disone.h"
#include "discrete/distwo.h"
#include "discrete/DisThree.h"
#include "discrete/DisFour.h"
#include "zssinc/zssmanualscaler.h"
#include "zssinc/zssentropyscaler.h"
#include "zssinc/zssbreakpointscaler.h"
#include "zssinc/zsswidthscaler.h"
#include "zssinc/zssfrequencyscaler.h"
//----attribute reduction----
#include "reduct1.h"
#include "reduct2.h"
#include "reduct3.h"
#include "wtpinc\indatt.h"
#include "lie/liedynamicreduct.h"
#include "lie/liegeneticreduct1.h"
#include "lie/liegeneticreduct2.h"
#include "lie/liegeneticreduct3.h"
#include "liemanualreduct.h"
#include "AttEntropyReduce.h"
#include"AttEntropyReduceTwo.h"
#include"MIBARK.h"
//-------value reduction-------
#include "wtpinc/indval.h"
#include "phinc/valreductionone.h"
#include "phinc/valreductionthree.h"
#include "phinc/valreductiontwo.h"
#include "wangyinc/skowron.h"
//-----------special algorithm with incomplete IS------
#include "yyzinc/YyzIncompleteIS1.h"
#include "yyzinc/YyzIncompleteIS2.h"
#include "yyzinc/YyzIncompleteIS3.h"
#include "Rtr.h"
//--------------miss value
#include "yyzinc/miss_value.h"
#include "liesamplerecognise.h"
#include "yyzinc/yyzsamplerecognise1.h"
#include "yyzinc/yyzsamplerecognise2.h"
#include "yyzinc/yyzsamplerecognise3.h"
//----------other
#include "getfilenamedlg.h"
#include "MyPropertySheet.h"
//---------tools
#include "lierandomfilter.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//--------------macro , report error!--------
/////////////////////////////////////////////////////////////////////////////
// CLieDoc
//
//--------general process data---------
//CString GetGlobeFileName();
//UINT PerformFunc( LPVOID pParam );
CString g_strFileToRead=""; //
CString g_strFileToSave="";
int g_iFlag; //algorithm NO.
//--------- batch process data---------
BOOL bDoBatch=false;
HWND hWndDlg;
////////--------------------------
BOOL g_bOpenNotShow=false;
////////--------------------------
// prepair for test and recognise
CString g_strTestInputFile=""; //test input file
bool g_bTestFew=true;
HWND g_hWaitWnd=NULL;
IMPLEMENT_DYNCREATE(CLieDoc, CDocument)
CLieDoc::CLieDoc()
{
m_pstrAttrName=NULL;
m_pstrAttrType=NULL;
m_bHasBlock=FALSE;
m_bHasRule=FALSE;
m_bHasFloat=FALSE;
m_bIsComplete=true;
iString=iInt=iFloat=0;
m_ipReductedAttr=0;
m_iBlockNum=0;
// NotStringComplete=true;
m_pWaitDlg=0;
m_pParam=0;
}
CLieDoc::~CLieDoc()
{
delete []m_sRecNum;
if(m_pParam)
delete m_pParam;
if(m_pWaitDlg) // delete wait dlg;
delete m_pWaitDlg;
if(m_ipReductedAttr)
delete []m_ipReductedAttr;
if(m_pstrAttrName)
{
for(int i=0;i<m_iAttrNum+1;i++)
{
if(m_pstrAttrName[i]) delete[] m_pstrAttrName[i];
}
delete m_pstrAttrName;
}
if(m_pstrAttrType)
{
for(int i=0;i<m_iAttrNum+1;i++)
{
if(m_pstrAttrType[i]) delete[] m_pstrAttrType[i];
}
delete m_pstrAttrType;
}
}
BEGIN_MESSAGE_MAP(CLieDoc, CDocument)
//{{AFX_MSG_MAP(CLieDoc)
ON_COMMAND(ID_RS_ATTR_REDU_NORMAL, OnRsAttrReduNormal)
ON_COMMAND(ID_RS_ATTR_REDU_MATRIX, OnRsAttrReduMatrix)
ON_COMMAND(ID_RS_ATTR_REDU_SELECT, OnRsAttrReduSelect)
ON_COMMAND(ID_RS_ATTR_REDU_INC, OnRsAttrReduInc)
ON_COMMAND(ID_RS_VALUE_REDU_NORMAL, OnRsValueReduNormal)
ON_COMMAND(ID_RS_VALUE_REDU_QIF, OnRsValueReduQif)
ON_COMMAND(ID_RS_VALUE_REDU_MATRIX, OnRsValueReduMatrix)
ON_COMMAND(ID_RS_VALUE_REDU_INC, OnRsValueReduInc)
ON_COMMAND(ID_RS_VALUE_REDU_SKOWRON, OnRsValueReduSkowron)
ON_COMMAND(ID_RS_SPEC_INCMPL, OnRsSpecIncmpl)
ON_COMMAND(ID_RS_SPEC_INCMPL2, OnRsSpecIncmpl2)
ON_COMMAND(ID_FILE_SHOWDATA, OnFileShowdata)
ON_UPDATE_COMMAND_UI(ID_RS_ATTR_REDU_INC, OnUpdateRsAttrReduInc)
ON_UPDATE_COMMAND_UI(ID_RS_ATTR_REDU_MATRIX, OnUpdateRsAttrReduMatrix)
ON_UPDATE_COMMAND_UI(ID_RS_ATTR_REDU_NORMAL, OnUpdateRsAttrReduNormal)
ON_UPDATE_COMMAND_UI(ID_RS_ATTR_REDU_SELECT, OnUpdateRsAttrReduSelect)
ON_UPDATE_COMMAND_UI(ID_RS_VALUE_REDU_INC, OnUpdateRsValueReduInc)
ON_UPDATE_COMMAND_UI(ID_RS_VALUE_REDU_MATRIX, OnUpdateRsValueReduMatrix)
ON_UPDATE_COMMAND_UI(ID_RS_VALUE_REDU_NORMAL, OnUpdateRsValueReduNormal)
ON_UPDATE_COMMAND_UI(ID_RS_VALUE_REDU_QIF, OnUpdateRsValueReduQif)
ON_UPDATE_COMMAND_UI(ID_RS_VALUE_REDU_SKOWRON, OnUpdateRsValueReduSkowron)
ON_UPDATE_COMMAND_UI(ID_RS_SPEC_INCMPL, OnUpdateRsSpecIncmpl)
ON_UPDATE_COMMAND_UI(ID_RS_SPEC_INCMPL2, OnUpdateRsSpecIncmpl2)
ON_UPDATE_COMMAND_UI(ID_RS_SPEC_INCMPL3, OnUpdateRsSpecIncmpl3)
ON_COMMAND(ID_RS_SPEC_INCMPL3, OnRsSpecIncmpl3)
ON_COMMAND(ID_RS_DISCRETE_MINI, OnRsDiscreteMini)
ON_COMMAND(ID_RS_DISCRETE_MYDIS, OnRsDiscreteMydis)
ON_COMMAND(ID_RS_DISCRETE_NAIVE, OnRsDiscreteNaive)
ON_COMMAND(ID_RS_DISCRETE_ONE, OnRsDiscreteOne)
ON_COMMAND(ID_RS_DISCRETE_FOUR, OnRsDiscreteFour)
ON_COMMAND(ID_RS_DISCRETE_FIVE, OnRsDiscreteFive)
ON_COMMAND(ID_RS_DISCRETE_SEMINAIVE, OnRsDiscreteSeminaive)
ON_COMMAND(ID_RS_DISCRETE_TWO, OnRsDiscreteTwo)
ON_COMMAND(ID_RS_DISCRETE, OnRsDiscreteThree)
ON_UPDATE_COMMAND_UI(ID_RS_DISCRETE_TWO, OnUpdateRsDiscreteTwo)
ON_UPDATE_COMMAND_UI(ID_RS_DISCRETE_SEMINAIVE, OnUpdateRsDiscreteSeminaive)
ON_UPDATE_COMMAND_UI(ID_RS_DISCRETE_ONE, OnUpdateRsDiscreteOne)
ON_UPDATE_COMMAND_UI(ID_RS_DISCRETE_FOUR, OnUpdateRsDiscreteFour)
ON_UPDATE_COMMAND_UI(ID_RS_DISCRETE_FIVE, OnUpdateRsDiscreteFive)
ON_UPDATE_COMMAND_UI(ID_RS_DISCRETE_NAIVE, OnUpdateRsDiscreteNaive)
ON_UPDATE_COMMAND_UI(ID_RS_DISCRETE_MYDIS, OnUpdateRsDiscreteMydis)
ON_UPDATE_COMMAND_UI(ID_RS_DISCRETE_MINI, OnUpdateRsDiscreteMini)
ON_COMMAND(ID_RS_COMPLETE_DEL, OnRsCompleteDel)
ON_COMMAND(ID_RS_COMPLETE_MET, OnRsCompleteMet)
ON_UPDATE_COMMAND_UI(ID_RS_COMPLETE_DEL, OnUpdateRsCompleteDel)
ON_UPDATE_COMMAND_UI(ID_RS_COMPLETE_MET, OnUpdateRsCompleteMet)
ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
ON_COMMAND(ID_NOTPAD, OnNotpad)
ON_COMMAND(ID_RS_BATCH, OnRsBatch)
ON_UPDATE_COMMAND_UI(ID_RS_BATCH, OnUpdateRsBatch)
ON_COMMAND(ID_RS_RECOGNISE, OnRsRecognise)
ON_COMMAND(ID_RS_TEST, OnRsTest)
ON_UPDATE_COMMAND_UI(ID_RS_TEST, OnUpdateRsTest)
ON_UPDATE_COMMAND_UI(ID_RS_RECOGNISE, OnUpdateRsRecognise)
ON_COMMAND(ID_RS_ATTR_REDU_ENTROPY1, OnRsAttrReduEntropy1)
ON_UPDATE_COMMAND_UI(ID_RS_ATTR_REDU_ENTROPY1, OnUpdateRsAttrReduEntropy1)
ON_COMMAND(ID_RS_ATTR_REDU_ENTROPY2, OnRsAttrReduEntropy2)
ON_UPDATE_COMMAND_UI(ID_RS_ATTR_REDU_ENTROPY2, OnUpdateRsAttrReduEntropy2)
ON_COMMAND(ID_RS_ATTR_REDU_MIBARK, OnRsAttrReduMibark)
ON_UPDATE_COMMAND_UI(ID_RS_ATTR_REDU_MIBARK, OnUpdateRsAttrReduMibark)
ON_COMMAND(ID_TOOL_MISSVALUE, OnToolMissvalue)
ON_UPDATE_COMMAND_UI(ID_TOOL_MISSVALUE, OnUpdateToolMissvalue)
ON_COMMAND(ID_RS_SPEC_INCMPL2_TEST, OnRsSpecIncmpl2Test)
ON_COMMAND(ID_RS_SPEC_INCMPL3_TEST, OnRsSpecIncmpl3Test)
ON_COMMAND(ID_RS_SPEC_INCMPL3_RECOGNISE, OnRsSpecIncmpl3Recognise)
ON_COMMAND(ID_RS_SPEC_INCMPL2_RECOGNISE, OnRsSpecIncmpl2Recognise)
ON_COMMAND(ID_RS_SPEC_INCMPL_RECOGNISE, OnRsSpecIncmplRecognise)
ON_COMMAND(ID_RS_SPEC_INCMPL_TEST, OnRsSpecIncmplTest)
ON_UPDATE_COMMAND_UI(ID_RS_SPEC_INCMPL_RECOGNISE, OnUpdateRsSpecIncmplRecognise)
ON_UPDATE_COMMAND_UI(ID_RS_SPEC_INCMPL_TEST, OnUpdateRsSpecIncmplTest)
ON_UPDATE_COMMAND_UI(ID_RS_SPEC_INCMPL2_RECOGNISE, OnUpdateRsSpecIncmpl2Recognise)
ON_UPDATE_COMMAND_UI(ID_RS_SPEC_INCMPL2_TEST, OnUpdateRsSpecIncmpl2Test)
ON_UPDATE_COMMAND_UI(ID_RS_SPEC_INCMPL3_RECOGNISE, OnUpdateRsSpecIncmpl3Recognise)
ON_UPDATE_COMMAND_UI(ID_RS_SPEC_INCMPL3_TEST, OnUpdateRsSpecIncmpl3Test)
ON_COMMAND(ID_RS_COMPLETE_COMBINATION, OnRsCompleteCombination)
ON_COMMAND(ID_RS_COMPLETE_MEAN, OnRsCompleteMean)
ON_COMMAND(ID_RS_COMPLETE_CONDITION_MEAN, OnRsCompleteConditionMean)
ON_COMMAND(ID_RS_COMPLETE_CONDITION_COMBINATION, OnRsCompleteConditionCombination)
ON_COMMAND(ID_RS_DISCRETE_EQUAL_WIDTH, OnRsDiscreteEqualWidth)
ON_COMMAND(ID_RS_DISCRETE_BREAK_POINT, OnRsDiscreteBreakPoint)
ON_COMMAND(ID_RS_DISCRETE_ENTROPY, OnRsDiscreteEntropy)
ON_COMMAND(ID_RS_DISCRETE_EQUAL_FREQUENCY, OnRsDiscreteEqualFrequency)
ON_COMMAND(ID_RS_DISCRETE_MANUAL, OnRsDiscreteManual)
ON_COMMAND(ID_RS_ATTR_REDU_DYNAMIC, OnRsAttrReduDynamic)
ON_COMMAND(ID_FILE_SHOWSTAT, OnFileShowstat)
ON_COMMAND(ID_RS_ATTR_REDU_MANUAL, OnRsAttrReduManual)
ON_COMMAND(ID_TOOL_FILTER, OnToolFilter)
ON_COMMAND(ID_RS_ATTR_REDU_GENETIC1, OnRsAttrReduGenetic1)
ON_COMMAND(ID_RS_ATTR_REDU_GENETIC2, OnRsAttrReduGenetic2)
ON_COMMAND(ID_RS_ATTR_REDU_GENETIC3, OnRsAttrReduGenetic3)
ON_COMMAND(ID_FILE_CLOSE_ALL, OnFileCloseAll)
ON_UPDATE_COMMAND_UI(ID_RS_DISCRETE_EQUAL_WIDTH, OnUpdateRsDiscreteEqualWidth)
ON_UPDATE_COMMAND_UI(ID_RS_DISCRETE_EQUAL_FREQUENCY, OnUpdateRsDiscreteEqualFrequency)
ON_UPDATE_COMMAND_UI(ID_RS_DISCRETE_MANUAL, OnUpdateRsDiscreteManual)
ON_UPDATE_COMMAND_UI(ID_RS_DISCRETE_ENTROPY, OnUpdateRsDiscreteEntropy)
ON_UPDATE_COMMAND_UI(ID_RS_DISCRETE_BREAK_POINT, OnUpdateRsDiscreteBreakPoint)
ON_UPDATE_COMMAND_UI(ID_TOOL_FILTER, OnUpdateToolFilter)
ON_COMMAND(ID_AT_HEXIAO, OnAtHexiao)
ON_UPDATE_COMMAND_UI(ID_AT_HEXIAO, OnUpdateAtHexiao)
ON_COMMAND(ID_OPEN_DATABASE, OnOpenDatabase)
ON_UPDATE_COMMAND_UI(ID_OPEN_DATABASE, OnUpdateOpenDatabase)
ON_UPDATE_COMMAND_UI(ID_RS_DISCRETE, OnUpdateRsDiscreteOne)
//}}AFX_MSG_MAP
ON_MESSAGE(KYLIN_DATAHANDLE_FINISHED,OnKylinDataHanleFinished)
ON_MESSAGE(KYLIN_DATAHANDLE_ERROR,OnKylinDataHanleError)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLieDoc diagnostics
#ifdef _DEBUG
void CLieDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CLieDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CLieDoc serialization
void CLieDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////////////
// CLieDoc commands
//-----------------------------
// 该消息处理函数的本意是用TEXT显示数据.
// 但是CMainFrame从工作线程中接收自定义消息会出错(release版本下)
// 故借用该消息(WM_COMMAND, ID_FILE_SHOWSTAT)来运算结果文件的打开
// 如果 CRSetApp::g_bOpenFile 为 true,表示要进行文件打开操作
// 若 为 false,表示是用TEXT显示数据.
// 默认为false
// 故每次使用之后,将其还原为false.以不影响下一次操作.
void CLieDoc::OnFileShowstat()
{
if( !( ((CRSetApp*)AfxGetApp())->g_bOpenFile ) )
{
((CRSetApp*)AfxGetApp())->OpenFile(GetPathName());
}
else
{ //open file
((CRSetApp*)AfxGetApp())->OpenFile(((CRSetApp*)AfxGetApp())->g_strFileToOpen );
((CRSetApp*)AfxGetApp())->g_bOpenFile = false;
}
}
void CLieDoc::OnFileShowdata()
{
((CMainFrame*)AfxGetMainWnd())->GetToolBar()->UpdateWindow();
((CRSetApp*)AfxGetApp())->ShowDataOfFile(GetPathName());
}
void CLieDoc::RunAlgorithm(int flag)
{
//准备线程的参数
if(m_pParam==0)
m_pParam=new KYLIN_PARAM; //创建 参数结构
// if(flag==500)
// m_pParam->inFile1=" ";
// else
m_pParam->inFile1=GetPathName(); //算法输入文件
m_pParam->inFlag=flag; //算法代码
m_pParam->ppWaitDlg=&m_pWaitDlg; //等待对话框指针的指针
m_pParam->pDoc=this; //本文档指针
//创建运算线程,挂起
CWinThread* thread;
thread=AfxBeginThread(PerformFunc,m_pParam,
THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
//填充线程参数,供等待线程使用(参数不交叉)
m_pParam->hThreadToWait=thread->m_hThread;
//创建等待对话框,初始化其所需数据(主要是运算线程的CWinThread指针)
m_pWaitDlg=new CWaitDlg(this);
m_pWaitDlg->Create();
m_pWaitDlg->SetThreadUnderControl(thread);
//显示等待对话框
m_pWaitDlg->UpdateWindow();
//创建并启动等待线程
AfxBeginThread(PerformAndWait,m_pParam);
//启动运算线程
::ResumeThread(thread->m_hThread); //begin to run
m_pWaitDlg->ShowWindow(SW_NORMAL);
m_pWaitDlg->CenterWindow();
// 告述app,正在进行算法处理
CRSetApp* theApp=(CRSetApp*)AfxGetApp();
// disable the toolbar
::InterlockedIncrement(&( theApp->g_lAlgRunning ));
/*
g_strFileToRead=GetPathName();
g_iFlag=flag;
// CWinThread* thread;
thread=AfxBeginThread(PerformFunc,
AfxGetMainWnd()->GetSafeHwnd(),
((CRSetApp*)AfxGetApp())->g_handle,thread->m_hThread);
CWaitDlg dlg;
switch(flag/10)
{
case 1:
dlg.m_strStrToShow="正在进行数据补齐处理,请稍候...";
break;
case 2:
dlg.m_strStrToShow="正在进行数据离散化处理,请稍候...";
break;
case 3:
dlg.m_strStrToShow="正在进行属性约简处理,请稍候...";
break;
case 4:
dlg.m_strStrToShow="正在进行值约简处理,请稍候...";
break;
default:
dlg.m_strStrToShow="正在处理,请稍候...";
break;
}
hWndDlg=dlg.GetSafeHwnd();
dlg.DoModal();
*/
}
//--------------
// 这个线程函数等待performfunc的运行.
UINT CLieDoc::PerformAndWait( LPVOID pParam)
{
P_KYLIN_PARAM param=(P_KYLIN_PARAM)pParam;
CRSetApp* theApp=(CRSetApp*)AfxGetApp();
//等待运算线程的结束
WaitForSingleObject(param->hThreadToWait,INFINITE);
//获取运算线程退出代码.
DWORD ExitCode;
::GetExitCodeThread(param->hThreadToWait,&ExitCode);
//如果退出代码为-1,则表明为用户取消的线程的执行
// 参加 CWaitDlg::OnKill()函数
if( ExitCode==-1 )
{
AfxMessageBox("操作被取消!");
theApp->WriteLog("用户取消操作");
::InterlockedDecrement(&( theApp->g_lAlgRunning ));
return 1;
}
//关闭等待对话框
(* param->ppWaitDlg)->SendMessage(WM_CLOSE);
//检查param->outFlag,该值由运算线程填充,表明运算结果
// 1表示正常结束
// 0表示运算中出错(可能是取消操作(非上述的用户取消),可能是其它错误)
if(param->outFlag)
{ //运算正常结束
if(AfxMessageBox("处理完毕,要保存结果文件吗?",MB_YESNO|MB_ICONINFORMATION)==IDYES)
{
CFileDialog dlg(false,".txt",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"RS files(*.txt)|*.txt|all files(*.*)|*.*||",NULL);
if(dlg.DoModal()==IDCANCEL)
{
theApp->g_strFileToOpen=param->outFile1;
theApp->WriteLogAlgOK(param->outFile1,false);
}
else
{
CopyFile(param->outFile1 , dlg.GetPathName(),FALSE);
DeleteFile(param->outFile1);
theApp->g_strFileToOpen=dlg.GetPathName();
theApp->WriteLogAlgOK(dlg.GetPathName(),true);
}
}
else
{
theApp->g_strFileToOpen=param->outFile1;
theApp->WriteLogAlgOK(param->outFile1,false);
}
::InterlockedDecrement(&( theApp->g_lAlgRunning ));
//发消息给MainFrame,显示中间结果数据.
((CRSetApp*)AfxGetApp())->g_bOpenFile=true;
//此处不使用自定义消息,是因为在release版本下会出错.(莫名其妙?)
AfxGetMainWnd()->SendMessage(WM_COMMAND,ID_FILE_SHOWSTAT);
}
else //运算中出错.(因机制不全,无法得知出错类型及原因.)
{
::InterlockedDecrement(&( theApp->g_lAlgRunning ));
AfxMessageBox("运算中出错!");
theApp->WriteLog("运算中出错!");
}
return 1;
}
//-----------------------------------------------------
/*
算法执行部分:(用一个数字(unsigned long) 代表一个算法)
// 打开数据库文件
// 500 打开数据库
数据补齐 100-
1001 取消补齐
1002 基于可辨识矩阵补齐
1003 组合补齐 combination compleate
1004 条件组合补齐
1005 平均补齐 meancomplete
1006 条件平均补齐 condition mean complete
离散化 200-
2001 等价的Ngugen贪心算法
2002 属性重要性算法
2003 Naive算法
2004 改进的贪心算法1
2005 改进的贪心算法2
2013 改进的贪心算法3(my)
2014 改进的贪心算法3等价算法
2012 贪心算法(重写)
2006 seminaive算法
2007 等距离离散化 widthscaler
2008 等频率 frequency scaler
2009 信息熵 entropy sclaer
2010 断点重要性 breakpointscalar
2011 Manual scalar
属性约简 300-
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -