normaldlg.cpp

来自「OpenSVM was developped under Visual C++ 」· C++ 代码 · 共 406 行

CPP
406
字号
// Normal.cpp : implementation file
//

#include "stdafx.h"
#include "OpenSVM.h"
#include "NormalDlg.h"


#include "MainFrm.h"
#include "OpenSVMDoc.h"
#include "ResultDlg.h"
#include "EnterDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CNormalDlg dialog


CNormalDlg::CNormalDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CNormalDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CNormalDlg)
	m_cacheSize = 128;
	m_eps = 0.001;
	m_nrFold = 5;


	m_csvcC = 1.0;
	m_nusvcNu = 0.5;
	
	m_svrC = 1.0;
	m_esvrE = 0.1;
	m_nusvrNu = 0.5;

	m_polyCoef = 0.0;
	m_polyDegree = 3;
	m_polyGamma = 0.0;

	m_rbfGamma = 0.0;

	m_sigmoidCoef = 0.0;
	m_sigmoidGamma = 0.0;


	//}}AFX_DATA_INIT

	//other val init
	m_kernelType = C_SVC;
	m_funcType   = RBF;
	m_ifDoShirinking =true;
	m_ifDoProbability=false;
	m_ifDoCrossValidation=false;

}


void CNormalDlg::DoDataExchange(CDataExchange* pDX)
{
	//addition
	((CButton *)GetDlgItem(IDC_SHRINKING))->SetCheck(1);
	((CButton *)GetDlgItem(IDC_CSVC     ))->SetCheck(1);
	((CButton *)GetDlgItem(IDC_FUNC_RBF ))->SetCheck(1);
	
	((CEdit	  *)GetDlgItem(IDC_RBF_GAMMA))->EnableWindow(true);
	((CEdit   *)GetDlgItem(IDC_CSVC_C	))->EnableWindow(true);
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CNormalDlg)
	DDX_Text(pDX, IDC_CACHESIZE, m_cacheSize);
	DDV_MinMaxUInt(pDX, m_cacheSize, 16, 512);
	DDX_Text(pDX, IDC_STOP_CRITICAL, m_eps);
	DDV_MinMaxDouble(pDX, m_eps, 1.e-005, 1.);
	DDX_Text(pDX, IDC_CSVC_C, m_csvcC);
	DDX_Text(pDX, IDC_POLY_GAMMA, m_polyGamma);
	DDX_Text(pDX, IDC_ESVR_E, m_esvrE);
	DDX_Text(pDX, IDC_NRFOLD, m_nrFold);
	DDX_Text(pDX, IDC_NUSVC_NU, m_nusvcNu);
	DDV_MinMaxDouble(pDX, m_nusvcNu, 0., 1.);
	DDX_Text(pDX, IDC_NUSVR_NU, m_nusvrNu);
	DDV_MinMaxDouble(pDX, m_nusvrNu, 0., 1.);
	DDX_Text(pDX, IDC_POLY_COEF, m_polyCoef);
	DDX_Text(pDX, IDC_POLY_DEGREE, m_polyDegree);
	DDX_Text(pDX, IDC_RBF_GAMMA, m_rbfGamma);
	DDX_Text(pDX, IDC_SIGMOID_COEF, m_sigmoidCoef);
	DDX_Text(pDX, IDC_SIGMOID_GAMMA, m_sigmoidGamma);
	DDX_Text(pDX, IDC_SVR_C, m_svrC);
	//}}AFX_DATA_MAP

}


BEGIN_MESSAGE_MAP(CNormalDlg, CDialog)
	//{{AFX_MSG_MAP(CNormalDlg)
	ON_BN_CLICKED(ID_TRAIN, OnTrain)
	ON_BN_CLICKED(IDC_CSVC, OnCsvc)
	ON_BN_CLICKED(IDC_NUSVC, OnNusvc)
	ON_BN_CLICKED(IDC_ESVR, OnEsvr)
	ON_BN_CLICKED(IDC_NUSVR, OnNusvr)
	ON_BN_CLICKED(IDC_FUNC_LINEAR, OnFuncLinear)
	ON_BN_CLICKED(IDC_FUNC_POLY, OnFuncPoly)
	ON_BN_CLICKED(IDC_FUNC_RBF, OnFuncRbf)
	ON_BN_CLICKED(IDC_FUNC_SIGMOD, OnFuncSigmoid)
	ON_BN_CLICKED(IDC_CROSSVAL, OnCrossval)
	ON_BN_CLICKED(IDC_SHRINKING, OnShrinking)
	ON_BN_CLICKED(IDC_PROBABILITY, OnProbability)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CNormalDlg message handlers

void CNormalDlg::OnTrain() 
{

	//add Initalized code

	UpdateData(true);
	FILE *fp = fopen("C:\\tempView.tmp","w");
	fflush(fp);
	fclose(fp);
	
	freopen("C:\\tempView.tmp","a",stdout);
	
	CMainFrame  *pFrame=(CMainFrame *)AfxGetMainWnd();   
	COpenSVMDoc *pDoc  =(COpenSVMDoc*)pFrame->GetActiveDocument();
	CString filename=pDoc->GetPathName();


	//add vitual_stolve code 
	GenerateParam();

	
	//add train code
	if(filename.GetLength() == 0)
	{
		MessageBox("You should open a data file before train.", "Error", 
			MB_ICONERROR | MB_OK);
	}
	else
	{
		if (m_ifDoCrossValidation)
			MessageBox("To do cross validation won't generate the model file.", "Note", 
			MB_ICONASTERISK | MB_OK);
		
		if ((!m_sigmoidGamma)||(!m_polyGamma)||(!m_rbfGamma))
			MessageBox("Gamma will set 1/k by default.", "Note",
			MB_ICONASTERISK | MB_OK);
		
		CSVM ownSVM;
		ownSVM.GetParam(virtualparam);
		ownSVM.ReadProblem(filename);
		srand(1);
		if (!m_ifDoCrossValidation)
		{
			ownSVM.DoTrain();
		}
		else 
		{
			if (m_nrFold <2)
			{
				MessageBox("NR_FOLD must >= 2");
			}
			else
			{
				ownSVM.DoCrossValidation(m_nrFold);
			}

		}
		fclose(stdout);

		CResultDlg result;
		result.DoModal();
		
		int ifSave=0;
		if(!m_ifDoCrossValidation)
		{
			ifSave=MessageBox("Would you want to save model?", "Question",
				MB_ICONQUESTION|MB_YESNO);
		
			if (ifSave == IDNO)
			{
				CDialog::OnOK();
			}
			else
			{
				CEnterDlg dlg;
				dlg.DoModal();
				
				if(dlg.m_enter.GetLength() == 0)
				{
					MessageBox("Model name cannot be empty.");
				}
				else
				{
					CString modelname=AppPath;
					modelname+="\\Models\\";
					FILE *base=fopen(modelname+"modelsbase","a");
					if (base == NULL)
					{
						CString modelDir=AppPath;
						modelDir+="\\Models";
						CreateDirectory(modelDir,NULL);
						base = fopen(modelname+"modelsbase","a");
					}
					fprintf(base,"%s\n",dlg.m_enter);
					fclose(base);
					
					modelname+=dlg.m_enter;
					ownSVM.StoreModel(modelname);
					ownSVM.StoreModelInfo(modelname);
				}

				CDialog::OnOK();
			}
		}
		else CDialog::OnOK();
	}
	
}

void CNormalDlg::OnCsvc() //Select C_SVC Kernel
{
	m_kernelType = C_SVC;
	//disable other options which aren't related
	((CEdit*)GetDlgItem(IDC_CSVC_C  ))->EnableWindow(true);
	((CEdit*)GetDlgItem(IDC_NUSVC_NU))->EnableWindow(false);

	((CEdit*)GetDlgItem(IDC_SVR_C   ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_ESVR_E  ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_NUSVR_NU))->EnableWindow(false);

	
}

void CNormalDlg::OnNusvc()//select nu_SVC Kernel
{
	m_kernelType = NU_SVC;
	//disable other options which aren't related
	((CEdit*)GetDlgItem(IDC_CSVC_C  ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_NUSVC_NU))->EnableWindow(true);
	((CEdit*)GetDlgItem(IDC_ESVR_E  ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_NUSVR_NU))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_SVR_C   ))->EnableWindow(false);
}

void CNormalDlg::OnEsvr() //select epsilon-SVR Kernel
{
	m_kernelType = EPSILON_SVR;
	//disable other options which aren't related
	((CEdit*)GetDlgItem(IDC_CSVC_C  ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_NUSVC_NU))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_ESVR_E  ))->EnableWindow(true);
	((CEdit*)GetDlgItem(IDC_NUSVR_NU))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_SVR_C   ))->EnableWindow(true);
}

void CNormalDlg::OnNusvr() //select nu-SVR Kernel
{
	m_kernelType = NU_SVR;
	//disable other options which aren't related
	((CEdit*)GetDlgItem(IDC_CSVC_C  ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_NUSVC_NU))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_ESVR_E  ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_NUSVR_NU))->EnableWindow(true);
	((CEdit*)GetDlgItem(IDC_SVR_C   ))->EnableWindow(true);
}

void CNormalDlg::OnFuncLinear() //select linear function
{
	m_funcType = LINEAR;
	//disable other options which aren't related
	((CEdit*)GetDlgItem(IDC_POLY_COEF   ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_POLY_GAMMA  ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_POLY_DEGREE ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_RBF_GAMMA   ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_SIGMOD_COEF ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_SIGMOD_GAMMA))->EnableWindow(false);
}

void CNormalDlg::OnFuncPoly()  //select poly function
{
	m_funcType = POLY;
	//disable other options which aren't related
	((CEdit*)GetDlgItem(IDC_POLY_COEF   ))->EnableWindow(true);
	((CEdit*)GetDlgItem(IDC_POLY_GAMMA  ))->EnableWindow(true);
	((CEdit*)GetDlgItem(IDC_POLY_DEGREE ))->EnableWindow(true);
	((CEdit*)GetDlgItem(IDC_RBF_GAMMA   ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_SIGMOD_COEF ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_SIGMOD_GAMMA))->EnableWindow(false);
}

void CNormalDlg::OnFuncRbf()  //select RBF function
{
	m_funcType = RBF;
	//disable other options which aren't related
	((CEdit*)GetDlgItem(IDC_POLY_COEF   ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_POLY_GAMMA  ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_POLY_DEGREE ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_RBF_GAMMA   ))->EnableWindow(true);
	((CEdit*)GetDlgItem(IDC_SIGMOD_COEF ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_SIGMOD_GAMMA))->EnableWindow(false);
}

void CNormalDlg::OnFuncSigmoid() //select SIGMOID function
{
	m_funcType = SIGMOID;
	//disable other options which aren't related
	((CEdit*)GetDlgItem(IDC_POLY_COEF   ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_POLY_GAMMA  ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_POLY_DEGREE ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_RBF_GAMMA   ))->EnableWindow(false);
	((CEdit*)GetDlgItem(IDC_SIGMOD_COEF ))->EnableWindow(true);
	((CEdit*)GetDlgItem(IDC_SIGMOD_GAMMA))->EnableWindow(true);
}

void CNormalDlg::OnCrossval() 
{
	// TODO: Add your control notification handler code here
	m_ifDoCrossValidation=!m_ifDoCrossValidation;

	if (m_ifDoCrossValidation)
		((CEdit*)GetDlgItem(IDC_NRFOLD))->EnableWindow(true);
	else
		((CEdit*)GetDlgItem(IDC_NRFOLD))->EnableWindow(false);
}

void CNormalDlg::OnShrinking() 
{
	// TODO: Add your control notification handler code here
	m_ifDoShirinking = !m_ifDoShirinking;
}

void CNormalDlg::OnProbability() 
{
	// TODO: Add your control notification handler code here
	m_ifDoProbability = !m_ifDoProbability;
}

void CNormalDlg::GenerateParam()
{
	//Parameters for SVM types
	virtualparam.svm_type = m_kernelType;

	if (m_kernelType == C_SVC)
	{
		virtualparam.C   = m_csvcC;
	}

	if (m_kernelType == NU_SVC)
	{
		virtualparam.nu = m_nusvcNu;
	}

	
	if (m_kernelType == NU_SVR)
	{
		virtualparam.nu = m_nusvrNu;
		virtualparam.C  = m_svrC;
	}

	if (m_kernelType == EPSILON_SVR)
	{
		virtualparam.p  = m_esvrE;	
		virtualparam.C  = m_svrC;
	}

	//Parameters for Kernel Functions
	virtualparam.kernel_type = m_funcType;
	if (m_funcType == POLY)
	{
		virtualparam.coef0  = m_polyCoef;
		virtualparam.degree = m_polyDegree;
		virtualparam.gamma  = m_polyGamma;
	}
	else 
		virtualparam.degree = m_polyDegree;

	if (m_funcType == RBF)
	{
		virtualparam.gamma = m_rbfGamma;
	}


	if (m_funcType == SIGMOID)
	{
		virtualparam.coef0 = m_sigmoidCoef;
		virtualparam.gamma = m_sigmoidGamma;	
	}

	//Common Setting
	virtualparam.eps		= m_eps;
	virtualparam.cache_size	= m_cacheSize;
	virtualparam.shrinking	= (m_ifDoShirinking) ?1:0;
	virtualparam.probability= (m_ifDoProbability)?1:0;


	//default setting
	virtualparam.nr_weight		= 0;
	virtualparam.weight_label	= NULL;
	virtualparam.weight			= NULL;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?