📄 childview.cpp
字号:
/*
*
* Copyright 2004-2006 Ghassan OREIBY
*
* This file is part of Neurality.
*
* Neurality is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Neurality is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Neurality; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*
*/
// ChildView.cpp : implementation of the CChildView class
//
#include "stdafx.h"
#include "GUI.h"
#include "ChildView.h"
#include "NewDialog.h"
#include "LearnOptionsDlg.h"
#include <atlimage.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#define SAMPLES 99
#define PI 3.141592654f
UINT StartLearn(LPVOID pParam)
{
CChildView* Child = (CChildView*) pParam;
CClientDC dc(Child);
RECT rect;
Child->GetClientRect(&rect);
Child->m_Net->Learn(SAMPLES , Child->m_reIn, Child->m_reOut, Child->m_fMSE,
Child->m_nItrShow, Child->m_nItrSave, &dc.m_hDC, &rect, &Child->m_bContinue);
Child->m_bContinue = FALSE;
return 0;
}
// CChildView
CChildView::CChildView()
: m_bContinue(FALSE)
, m_reIn(NULL)
, m_reOut(NULL)
, m_Net(NULL)
, m_nTotalHidden(0)
, m_HiddenLayer(NULL)
, m_nItrSave(5000)
, m_nItrShow(1)
, m_fMSE(0.0005f)
{
}
CChildView::~CChildView()
{
if (m_reIn) delete[] m_reIn;
if (m_reOut) delete[] m_reOut;
if (m_Net) delete m_Net;
if (m_HiddenLayer)
{
for (int i = 0; i < m_nTotalHidden; i++)
delete m_HiddenLayer[i];
delete[] m_HiddenLayer;
}
}
BEGIN_MESSAGE_MAP(CChildView, CWnd)
ON_WM_PAINT()
ON_WM_KEYDOWN()
ON_WM_KEYUP()
ON_COMMAND(ID_LEARNING_START, OnLearningStart)
// ON_WM_CHAR()
ON_COMMAND(ID_LEARNING_LOADSAMPLES, OnLearningLoadsamples)
ON_COMMAND(ID_FILE_NEW, OnFileNew)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_UPDATE_COMMAND_UI(ID_LEARNING_LOADSAMPLES, OnUpdateLearningLoadsamples)
ON_COMMAND(ID_LEARNING_OPTIONS, OnLearningOptions)
ON_UPDATE_COMMAND_UI(ID_LEARNING_START, OnUpdateLearningStart)
ON_COMMAND(ID_TEST_IMAGE, OnTestImage)
ON_UPDATE_COMMAND_UI(ID_TEST_IMAGE, OnUpdateTestImage)
END_MESSAGE_MAP()
// CChildView message handlers
BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CWnd::PreCreateWindow(cs))
return FALSE;
cs.dwExStyle |= WS_EX_CLIENTEDGE;
cs.style &= ~WS_BORDER;
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL);
//CBitmap bitmap;
// bitmap.LoadBitmap(IDB_BITMAP1);
//////CImage Image;
//////Image.Load("Test.bmp");
//////CBitmap *bitmap = CBitmap::FromHandle(Image.GetDC());
//m_brush.CreatePatternBrush(&bitmap);
return TRUE;
}
void CChildView::OnPaint()
{
CPaintDC dc(this); // device context for painting
//POINT Start, Finish;
//// TODO: Add your message handler code here
//
//RECT ClientRect, EllipseRect, TextRect;
//char szStr[2];
//CSize Size;
//this->GetClientRect(&ClientRect);
//EllipseRect.bottom = ClientRect.bottom / 2 + min(ClientRect.bottom, ClientRect.right) / 4;
//EllipseRect.left = ClientRect.right / 2 - min(ClientRect.bottom, ClientRect.right) / 4;
//EllipseRect.right = ClientRect.right / 2 + min(ClientRect.bottom, ClientRect.right) / 4;
//EllipseRect.top = ClientRect.bottom / 2 - min(ClientRect.bottom, ClientRect.right) / 4;
//
//for (int i = 0; i < 26; i++)
//{
// Start.x = ClientRect.right / 2 + cos ( 2 * PI * i / 26) * min(ClientRect.bottom, ClientRect.right) / 4;
// Start.y = ClientRect.bottom / 2 + sin ( 2 * PI * i / 26)* min(ClientRect.bottom, ClientRect.right) / 4;
// Finish.x = ClientRect.right / 2 + cos ( 2 * PI * (i + 1) / 26)* min(ClientRect.bottom, ClientRect.right) / 4;
// Finish.y = ClientRect.bottom / 2 + sin ( 2 * PI * (i + 1) / 26)* min(ClientRect.bottom, ClientRect.right) / 4;
// /*dc.MoveTo(Start);
// dc.LineTo(Finish);*/
// dc.Pie(&ClientRect, Finish, Start);
//}
//for (int i = 0; i < 26; i++)
//{
// sprintf(szStr, "%c", 'A' + i);
//
// TextRect.left = -20 + ClientRect.right / 2 + cos ( 2 * PI * i / 26 - PI / 2) * max(ClientRect.bottom, ClientRect.right) / 4;
// TextRect.top = -20 + ClientRect.bottom / 2 + sin ( 2 * PI * i / 26 - PI / 2)* max(ClientRect.bottom, ClientRect.right) / 4;
// TextRect.right = TextRect.left + 20;
// TextRect.bottom = TextRect.top + 20;
// dc.Rectangle(&TextRect);
// dc.DrawText(szStr, 1, &TextRect, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_NOCLIP);
//}
//dc.Ellipse(&EllipseRect);
//CBrush Brush(&m_bitmap);
/*dc.FillRect(&rect, &m_brush);
dc.DrawText(TEXT("Ready"), 5, &rect, NULL);*/
// Do not call CWnd::OnPaint() for painting messages
}
void CChildView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
if (nChar != VK_ESCAPE)
{
CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
return;
}
CClientDC dc(this);
//dc = GetDC();
RECT rect;
//CBrush Brush(&m_bitmap);//(RGB(255, 0, 0));
this->GetClientRect(&rect);
//dc.FillRect(&rect, &m_brush);
dc.DrawText(TEXT("Learning Stopped"), 16, &rect, NULL);
m_bContinue = FALSE;
//ReleaseDC(dc);
CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CChildView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
InvalidateRect(NULL, FALSE);
CWnd::OnKeyUp(nChar, nRepCnt, nFlags);
}
void CChildView::OnLearningStart()
{
//real inp[SAMPLES][1], outp[SAMPLES][1];
//real in[SAMPLES], out[SAMPLES];
//CClientDC dc(this);
// for (int i=0; i < SAMPLES; i++)
//{
// inp[i][0] = i * 0.35f / SAMPLES;// * 0.35f / 25 + 0.15f;
// outp[i][0] = sinf( 2.0f * PI * inp[i][0] * 5.0f) + sinf( 2.0f * PI * inp[i][0] * 10.0f);
//}
//LINEARIZE_ARRAY(inp, SAMPLES, 1, in);
//LINEARIZE_ARRAY(outp, SAMPLES, 1, out);
//RECT rect;
//this->GetClientRect(&rect);
m_bContinue ^= TRUE;
if (m_bContinue) CWinThread* pThread = AfxBeginThread(StartLearn, this);
/*CNetwork Net("test.nnf");
Net.Learn(SAMPLES , in, out, 0.0005f, 100, 50000, &dc.m_hDC, &rect);*/
}
//void CChildView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
//{
// // TODO: Add your message handler code here and/or call default
// if (nChar == VK_ESCAPE) m_bContinue = FALSE;
//
// CWnd::OnChar(nChar, nRepCnt, nFlags);
//}
void CChildView::OnLearningLoadsamples()
{
// TODO: Add your command handler code here
FILE *stream;
char str[4], szStr[4];
int insize, sampleno;
static char BASED_CODE szFilter[] = "Neural Network Samples Files (*.nns)|*.nns|All Files (*.*)|*.*||";
CFileDialog OpenDlg(TRUE, NULL, NULL, OFN_EXPLORER | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
char szFileName[256];
SIZE_T buf;
if (OpenDlg.DoModal() == IDCANCEL) return;
sprintf(szFileName, "%s", OpenDlg.GetPathName().GetString());
if (m_reIn) delete[] m_reIn;
if (m_reOut) delete[] m_reOut;
m_reIn = new real[39600];
m_reOut = new real[2574];
sprintf(szStr, "NNS");
stream = fopen(szFileName, "rb");
fread(str, sizeof(char), 4, stream);
if (strcmp(str, szStr)) MessageBox(TEXT("error, file uncompatible"), NULL);
fread(&insize, sizeof(int), 1, stream);
fread(&sampleno, sizeof(int), 1, stream);
buf = fread(m_reIn, sizeof(real), 39600, stream);
if (buf != 39600) MessageBox(TEXT("error, file uncompatible"), NULL);
buf = fread(m_reOut, sizeof(real), 2574, stream);
if (buf != 2574) MessageBox(TEXT("error, file uncompatible"), NULL);
fclose(stream);
}
void CChildView::OnFileNew()
{
// TODO: Add your command handler code here
CNewDialog NewDlg;
if (NewDlg.DoModal() == IDCANCEL) return;
//if (m_HiddenLayer)
//{
// for (int i = 0; i < m_nTotalHidden; i++)
// if (m_HiddenLayer[i]) delete m_HiddenLayer[i];
// delete[] m_HiddenLayer;
//}
// Cleaning the Network variables (m_Net and m_HiddenLayer) in order
// to create new ones.
if (m_Net) delete m_Net;
if (m_HiddenLayer)
{
for (int i = 0; i < m_nTotalHidden; i++)
if (m_HiddenLayer[i]) delete m_HiddenLayer[i];
delete[] m_HiddenLayer;
}
m_nTotalHidden = NewDlg.m_nTotalHidden;
m_HiddenLayer = new CLayer*[m_nTotalHidden];
for (int i = 0; i < NewDlg.m_nTotalHidden; i++)
m_HiddenLayer[i] = new CLayer(NewDlg.m_nHiddenArray[i]);
m_Net = new CNetwork(m_HiddenLayer, m_nTotalHidden, NewDlg.m_nInputNo, NewDlg.m_nOuputNo,
NewDlg.m_fInputMin, NewDlg.m_fInputMax, NewDlg.m_fOutputMin, NewDlg.m_fOutputMax);
MessageBox(TEXT("Neural Network created Successfully"), TEXT("Success"), NULL);
}
void CChildView::OnFileOpen()
{
// TODO: Add your command handler code here
static char BASED_CODE szFilter[] = "Neural Network Files (*.nnf)|*.nnf|All Files (*.*)|*.*||";
CFileDialog OpenDlg(TRUE, NULL, NULL, OFN_EXPLORER | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
char str[256];
if (OpenDlg.DoModal() == IDCANCEL) return;
sprintf(str, "%s", OpenDlg.GetPathName().GetString());
if (m_Net) delete m_Net;
m_Net = new CNetwork(str);
if (m_Net->GetState())
MessageBox(OpenDlg.GetPathName(), TEXT("Success!"), MB_OK);
else
{
MessageBox(TEXT("Couldnt open the File."), NULL, MB_ICONERROR);
delete m_Net;
m_Net = NULL;
}
}
void CChildView::OnUpdateLearningLoadsamples(CCmdUI *pCmdUI)
{
// TODO: Add your command update UI handler code here
if (m_Net && !m_bContinue) pCmdUI->Enable();
else pCmdUI->Enable(FALSE);
}
void CChildView::OnLearningOptions()
{
//NOTE: Probably considering removing "static" statement is more memory efficient
static CLearnOptionsDlg LearnDlg;
LearnDlg.DoModal();
LearnDlg.AdjustNetworkLearning();
m_nItrSave = LearnDlg.GetItrSave();
m_nItrShow = LearnDlg.GetItrShow();
m_bShowCurve = LearnDlg.GetShowCurveState();
m_fMSE = LearnDlg.GetMSE();
}
void CChildView::OnUpdateLearningStart(CCmdUI *pCmdUI)
{
// TODO: Add your command update UI handler code here
if (m_Net && m_reIn && m_reOut) pCmdUI->Enable();
else pCmdUI->Enable(FALSE);
if (m_bContinue) pCmdUI->SetText(TEXT("Stop"));
else pCmdUI->SetText(TEXT("Start"));
}
void CChildView::OnTestImage()
{
static char BASED_CODE szFilter[] = "Neural Network Files (*.bmp)|*.bmp|All Files (*.*)|*.*||";
CFileDialog OpenDlg(TRUE, NULL, NULL, OFN_EXPLORER | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
char sFileName[256];
CImage Image;
real *reInput, *reOutput;
real reMax = 0;
int MaxLocation = 0;
RECT rect;
real reCol;
int j;
CClientDC ClientDC(this);
GetClientRect(&rect);
if (OpenDlg.DoModal() == IDCANCEL) return;
sprintf(sFileName, "%s", OpenDlg.GetPathName().GetString());
Image.Load(sFileName);
if (Image.GetHeight() * Image.GetWidth() != m_Net->GetInputSize())
{
MessageBox(TEXT("Incompatible Image!"), TEXT("Error"));
return;
}
reInput = new real[m_Net->GetInputSize()];
reOutput = new real[m_Net->GetOutputSize()];
for (int i = 0; i < m_Net->GetInputSize(); i++)
{
reInput[i] = (Image.GetPixel(i % Image.GetWidth(), i / Image.GetWidth()) > 1) ?
0.0f : 1.0f;
}
//Image.Draw(ClientDC, rect, rect);
Image.Destroy();
m_Net->ComputeOutput(reInput, reOutput);
for (int i = 0; i < m_Net->GetOutputSize(); i++)
{
if (reMax < reOutput[i])
{
MaxLocation = i;
reMax = reOutput[i];
}
reCol = 1 - max(0, min( 1, reOutput[i]));
j = sprintf(sFileName, "%c %f", 'A' + i, reOutput[i]);
ClientDC.SetTextColor(RGB(reCol * 255, reCol * 255, reCol * 255));
ClientDC.TextOut( rect.right / 8, rect.bottom * ( 1 + i) / 28, sFileName, j);
/*sprintf(sFileName, "The result for this image is the letter %c with result of %f",
'A' + MaxLocation, reOutput[MaxLocation]);*/
}
/*sprintf(sFileName, "The result for this image is the letter %c with result of %f",
'A' + MaxLocation, reOutput[MaxLocation]);*/
//MessageBox(sFileName, TEXT("Result"));
delete[] reInput;
delete[] reOutput;
}
void CChildView::OnUpdateTestImage(CCmdUI *pCmdUI)
{
if (m_Net && !m_bContinue) pCmdUI->Enable();
else pCmdUI->Enable(FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -