// 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
}