📄 funapppage.cpp
字号:
// FunAppPage.cpp : implementation file
//
#include "stdafx.h"
#include "NeuroNetwork.h"
#include "NeuroNetSample.h"
#include "FunAppPage.h"
#include <MATH.H>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define PI2 (3.14159*2)
/////////////////////////////////////////////////////////////////////////////
// CFunAppPage property page
IMPLEMENT_DYNCREATE(CFunAppPage, CPropertyPage)
CFunAppPage::CFunAppPage() : CPropertyPage(CFunAppPage::IDD)
{
//{{AFX_DATA_INIT(CFunAppPage)
m_iTimes = 200;
m_iSamples = 20;
m_iHidLayNodNum = 5;
m_dLearnFactor = 0.05;
m_bAutoScale = FALSE;
m_bStemGraph = TRUE;
//}}AFX_DATA_INIT
m_iLayNum = 3;
m_pLayNodNum = new int [3];
m_pLayNodNum[0] = 1;
m_pLayNodNum[1] = m_iHidLayNodNum;
m_pLayNodNum[2] = 1;
m_pNet = new CNeuroNetBP(m_pLayNodNum, m_iLayNum, NEURONET_FUNCTYPE_SIGMOID, NEURONET_FUNCTYPE_LINEAR, m_dLearnFactor);
m_pIn = new double [m_iSamples];
m_pOut = new double [m_iSamples];
m_pExpOut = new double [m_iSamples];
m_pError = new double [m_iSamples];
int i;
m_pIn[0] = 0;
for (i = 1; i < m_iSamples; i++)
{
m_pIn[i] = PI2/(m_iSamples-1) * i;
}
for (i = 0; i < m_iSamples; i++)
{
m_pExpOut[i] = sin(m_pIn[i]);
}
m_bReset = FALSE;
m_iOldHidLayNodNum = m_iHidLayNodNum;
m_iOldSamples = m_iSamples;
}
CFunAppPage::~CFunAppPage()
{
delete [] m_pIn;
delete [] m_pExpOut;
delete [] m_pError;
delete [] m_pOut;
delete m_pNet;
delete m_pLayNodNum;
}
void CFunAppPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFunAppPage)
DDX_Control(pDX, IDC_STATIC_PIC, m_pic);
DDX_Control(pDX, IDC_SPIN_TIMES, m_spinTimes);
DDX_Control(pDX, IDC_SPIN_HIDNODNUM, m_spinNodNum);
DDX_Control(pDX, IDC_SPIN_SAMPLE, m_spinSamples);
DDX_Control(pDX, IDC_PROGRESS1, m_Progress);
DDX_Text(pDX, IDC_EDIT_TIMES, m_iTimes);
DDV_MinMaxInt(pDX, m_iTimes, 1, 100000);
DDX_Text(pDX, IDC_EDIT_SAMPLE, m_iSamples);
DDV_MinMaxInt(pDX, m_iSamples, 1, 1000);
DDX_Text(pDX, IDC_EDIT_HIDNODNUM, m_iHidLayNodNum);
DDV_MinMaxInt(pDX, m_iHidLayNodNum, 1, 100);
DDX_Text(pDX, IDC_EDIT_LEARNFACTOR, m_dLearnFactor);
DDV_MinMaxDouble(pDX, m_dLearnFactor, 1.e-003, 1.);
DDX_Check(pDX, IDC_CHECK_AUTOSCALE, m_bAutoScale);
DDX_Check(pDX, IDC_CHECK_STEMGRAPH, m_bStemGraph);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFunAppPage, CPropertyPage)
//{{AFX_MSG_MAP(CFunAppPage)
ON_BN_CLICKED(IDC_BUTTON_TRAIN, OnButtonTrain)
ON_BN_CLICKED(IDC_BUTTON_RESET, OnButtonReset)
ON_BN_CLICKED(IDC_BUTTON_CLEAR, OnButtonClear)
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFunAppPage message handlers
void CFunAppPage::OnButtonTrain()
{
// TODO: Add your control notification handler code here
if (!UpdateData(TRUE))
return;
//preparing data
if (m_bReset || m_iOldHidLayNodNum != m_iHidLayNodNum)
{
m_pLayNodNum[1] = m_iHidLayNodNum;
delete m_pNet;
m_pNet = new CNeuroNetBP(m_pLayNodNum, m_iLayNum, NEURONET_FUNCTYPE_SIGMOID, NEURONET_FUNCTYPE_LINEAR, m_dLearnFactor);
}
m_pNet->SetLearnFactor(m_dLearnFactor);
if (m_iOldSamples != m_iSamples)
{
delete [] m_pIn;
delete [] m_pExpOut;
delete [] m_pError;
delete [] m_pOut;
m_pIn = new double [m_iSamples];
m_pOut = new double [m_iSamples];
m_pExpOut = new double [m_iSamples];
m_pError = new double [m_iSamples];
int i;
m_pIn[0] = 0;
for (i = 1; i < m_iSamples; i++)
{
m_pIn[i] = PI2/(m_iSamples-1) * i;
}
m_pExpOut[0] = 0;
for (i = 0; i < m_iSamples; i++)
{
m_pExpOut[i] = sin(m_pIn[i]);
}
}
m_bReset = FALSE;
m_iOldHidLayNodNum = m_iHidLayNodNum;
m_iOldSamples = m_iSamples;
//training
int iTimes = m_iTimes;
int iSamples = m_iSamples;
int t, i;
m_Progress.SetRange32(1, iSamples * iTimes);
m_Progress.SetStep(1);
for (t = 0; t < iTimes; t++)
{
for (i = 0; i < iSamples; i++)
{
m_pNet->SetInput(&m_pIn[i]);
m_pNet->SetExpOutput(&m_pExpOut[i]);
if (!m_pNet->Train(1))
return;
m_Progress.StepIt();
}
}
m_Progress.SetPos(0);
//output
int iSelID = GetCheckedRadioButton(IDC_RADIO_SHOWOUTPUT, IDC_RADIO_SHOWERROR);
BOOL bShowMode = (IDC_RADIO_SHOWOUTPUT == iSelID);
double dMax = 0;
for (i = 0; i < iSamples; i++)
{
m_pNet->SetInput(&m_pIn[i]);
m_pNet->ForwardCalc();
m_pNet->GetOutput(&m_pOut[i]);
m_pError[i] = m_pExpOut[i]-m_pOut[i];
if (bShowMode)
{
if (fabs(m_pOut[i])>dMax)
dMax = fabs(m_pOut[i]);
}
else
{
if (fabs(m_pError[i])>dMax)
dMax = fabs(m_pError[i]);
}
}
m_pic.ClearPaint();
if (bShowMode)
m_pic.PaintImg(m_pOut, m_iSamples, dMax, m_bAutoScale, m_bStemGraph);
else
m_pic.PaintImg(m_pError, m_iSamples, dMax, m_bAutoScale, m_bStemGraph);
}
void CFunAppPage::OnButtonReset()
{
// TODO: Add your control notification handler code here
m_bReset = TRUE;
}
void CFunAppPage::OnButtonClear()
{
// TODO: Add your control notification handler code here
CDC* pdc = m_pic.GetDC();
RECT rect;
m_pic.GetClientRect(&rect);
// rect.bottom = rect.bottom - rect.top - 5;
// rect.right = rect.right - rect.left - 5;
// rect.top = 5;
// rect.left = 5;
// int iWidth = rect.right - rect.left;
// int iHeight = rect.bottom - rect.top;
pdc->FillSolidRect(&rect, 0x00FFFFFF);
}
BOOL CFunAppPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO: Add extra initialization here
CheckRadioButton(IDC_RADIO_SHOWOUTPUT, IDC_RADIO_SHOWERROR, IDC_RADIO_SHOWOUTPUT);
RECT rect;
m_spinNodNum.GetWindowRect(&rect);
ScreenToClient(&rect);
m_spinNodNum.DestroyWindow();
m_spinNodNum.Create(WS_VISIBLE|UDS_WRAP|UDS_ARROWKEYS|UDS_AUTOBUDDY|UDS_SETBUDDYINT, rect, this, IDC_SPIN_NODNUM);
m_spinNodNum.SetBuddy(GetDlgItem(IDC_EDIT_HIDNODNUM));
m_spinNodNum.SetRange(1, 100);
m_spinSamples.GetWindowRect(&rect);
ScreenToClient(&rect);
m_spinSamples.DestroyWindow();
m_spinSamples.Create(WS_VISIBLE|UDS_WRAP|UDS_ARROWKEYS|UDS_AUTOBUDDY|UDS_SETBUDDYINT, rect, this, IDC_SPIN_SAMPLE);
m_spinSamples.SetBuddy(GetDlgItem(IDC_EDIT_SAMPLE));
m_spinSamples.SetRange(1, 1000);
m_spinTimes.GetWindowRect(&rect);
ScreenToClient(&rect);
m_spinTimes.DestroyWindow();
m_spinTimes.Create(WS_VISIBLE|UDS_WRAP|UDS_ARROWKEYS|UDS_AUTOBUDDY|UDS_SETBUDDYINT, rect, this, IDC_SPIN_TIMES);
m_spinTimes.SetBuddy(GetDlgItem(IDC_EDIT_TIMES));
m_spinTimes.SetRange(1, 10000);
m_pic.InitImg();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
int CFunAppPage::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CPropertyPage::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
return 0;
}
BOOL CFunAppPage::OnSetActive()
{
// TODO: Add your specialized code here and/or call the base class
CancelToClose(); //change OK button caption to "Close" and disable the cancel button
return CPropertyPage::OnSetActive();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -