Return to Appendix B.

BACKPROP.CPP
// Matt Streeter
// 2/27/00
// BACKPROP.CPP
// Implementation of class TBackpropWindow; implementation "Backprop Control"
// window spawned by TNVisWindow.
// Copyright Matt Streeter, 2000.  All rights reserved

#include <stdio.h>
#include <owl\edit.h>
#include "backprop.h"
#include "ids.h"
#include "nvis.h"

#if(USE_THREADS)
unsigned long BackpropThread::Run()
{
	while(1)
	{
		mpBackpropWin->BackProp();
		if(ShouldTerminate())
      	break;
		mpBackpropWin->IncrementIteration();
		mpBackpropWin->UpdateIterationNumStatic();
		mpBackpropWin->UpdateFitnessScoreStatic();
	}
	return(0);
}
#endif

DEFINE_RESPONSE_TABLE1(TBackpropWindow,TWindow)
	EV_COMMAND(ID_BP_PAUSE_BUTTON,HandlePauseButtonMsg),
	EV_COMMAND(ID_BP_RESUME_BUTTON,HandleResumeButtonMsg),
END_RESPONSE_TABLE;

TBackpropWindow::TBackpropWindow(TWindow *pParent,TNVisWindow *pNParent,
	TBackpropWindow **ppThis)
	:TESWindow(pParent,0)
{
	mpNParent=pNParent;
	mppThis=ppThis;
	mbRunning=1;
#if(USE_THREADS)
	mpBackpropThread=0;
#endif

	Attr.Style|=WS_VISIBLE|WS_OVERLAPPEDWINDOW;

	// tbd: account correctly for parent coords
	Attr.X=(pParent?pParent->Attr.X+3-300:0);
	Attr.Y=(pParent?pParent->Attr.Y+25:0);
	Attr.W=300;
	Attr.H=200;
	SetCaption("Backprop Control");
	mlIteration=0;
	new TESStatic(this,ID_ITERATION_STATIC,"Iteration: ",25,25,75,25);
	mpIterationNumStatic=new TESStatic(this,ID_ITERATION_NUM_STATIC,"0",
		125,25,50,25);
	new TESStatic(this,ID_FITNESS_STATIC,"Fitness: ",25,75,75,25);
	mpFitnessScoreStatic=new TESStatic(this,ID_FITNESS_SCORE_STATIC,"NA",
		125,75,125,25);

	mpPauseButton=new TESButton(this,ID_BP_PAUSE_BUTTON,"Pause",25,125,75,25);
	mpResumeButton=new TESButton(this,ID_BP_RESUME_BUTTON,"Resume",
		125,125,75,25);
}

void TBackpropWindow::Paint(TDC&, bool, TRect&)
{
}

bool TBackpropWindow::IdleAction(long)
{
#if(!USE_THREADS)
	if(mbRunning && mpNParent)
	{
		mpNParent->BackProp();
		mlIteration++;
		UpdateIterationNumStatic();
		UpdateFitnessScoreStatic();
	}
	return(true);
#else
	return(false);
#endif
}

void TBackpropWindow::UpdateIterationNumStatic()
{
char temp[200];

	itoa((int)mlIteration,temp,10);
	mpIterationNumStatic->SetText(temp);
}

void TBackpropWindow::UpdateFitnessScoreStatic()
{
char temp[200];

	if(mpNParent)
	{
		double dFitness;
		dFitness=mpNParent->GetFitness();
		sprintf(temp,"%lf",dFitness);
		mpFitnessScoreStatic->SetText(temp);
	}
}

TBackpropWindow::~TBackpropWindow()
{
#if(USE_THREADS)
	if(mpBackpropThread)
		mpBackpropThread->Terminate();
#endif
	if(mppThis)
		(*mppThis)=0;
}

void TBackpropWindow::BackProp()
{
	if(mpNParent)
   	mpNParent->BackProp();
}

void TBackpropWindow::HandlePauseButtonMsg()
{
#if(!USE_THREADS)
	if(mbRunning)
	{
		mbRunning=0;
	}
#else
	if(mpBackpropThread)
		mpBackpropThread->Suspend();
#endif
}

void TBackpropWindow::HandleResumeButtonMsg()
{
#if(!USE_THREADS)
	if(!mbRunning)
	{
		mbRunning=1;
	}
#else
	if(!mpBackpropThread)
	{
		mpBackpropThread=new BackpropThread(this);
		mpBackpropThread->Start();
	}
	else
	{
   	mpBackpropThread->Resume();
	}
#endif
}

Return to Appendix B.