⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 childview.cpp

📁 函数逼近
💻 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 + -