//*******************************************************************************
// CSC 143 Computer Programming II Spring 1999 Instructor: Keith Hughes
//
// Homework 3
// File : \\Venus\katy\CIS143\Homework3\AdalineNetwork\adaline.cpp
//
// Purpose : Implementation file for AdalineNet class.
//
// Author : Hsin-yi F. Berg
// Date : 5/9/1999 Sun.
// Last Update: 5/28/1999 Fri.
// Update Note: None
//*******************************************************************************
#include "adaline.h"
#include "NeuralNet.h"
#include <iostream.h>
#include <assert.h>
// weight of the link, defined in base.h
extern const double WEIGHT;
// the learning rate of Adaline network, usually it's 0.25 - 0.50
const double LEARNINGRATE = 0.5;
// the value of the bias node for calculation purpose only
const double BIASNODEVALUE = 1.0;
/*
Function definitions for class AdalineNet
*/
/*
AdalineNet::AdalineNet()
Default constructor for an AdalineNet. AdalineNet is created empty.
*/
AdalineNet::AdalineNet()
{
learning_rate = LEARNINGRATE;
}
/*
AdalineNet::AdalineNet(int sizeInputLayer)
Constructor for an AdalineNet.
Takes an int argument sizeInputLayer to set the number of Neurons in the
input layer. This function will then create a fully connected AdalineNet
with two Layers and specified number of Neurons in the input Layer.
*/
AdalineNet::AdalineNet(int sizeInputLayer)
{
// BuildStructure will do the job
BuildStructure(sizeInputLayer);
learning_rate = LEARNINGRATE;
}
/*
void AdalineNet::BuildStructure(int sizeInputLayer)
private utility.
Takes an int argument sizeInputLayer to create a fully connected AdalineNet
with two Neuron Layers. sizeInputLayer determines how many Neurons are there
in the input Layer, and there is only one Neuron in the output Layer.
*/
void AdalineNet::BuildStructure(int sizeInputLayer)
{
// allocate 2 NeuronLayers, input and output Layers
SetHowManyNeuronLayers(2);
// Set the size of each layer, output layer has one Neuron only,
// inputlayer has specified numbers of neurons + 1 (bias node)
// The bias node (the last one in the input Neuron array which has
// an index "sizeInputLayer") has a permanent value set to BIASNODEVALUE.
// For some misterious reason, this node has to been there for our
// calculating algorithm to work. This value cannot be modified.
SetSizeOfNeuronLayer(0, sizeInputLayer + 1); // set size of input Layer
SetSizeOfNeuronLayer(1, 1); // set size of output Layer
// fully connect the Adaline Network.
InterConnect();
// Interconnect will also allocate the right amount of LinkLayers
// and Links in each layer.
// set the value of bias node
SetInputValue(sizeInputLayer, BIASNODEVALUE);
}
/*
AdalineNet::~AdalineNet()
Destructor for an AdalineNet.
*/
AdalineNet::~AdalineNet()
{}
/*
void AdalineNet::SetSizeOfInputLayer(int numInputLayer)
Set the number of Neurons in the input layer.
This function will create a fully connected AdalineNet with two Layers
and right amount of Neurons in the input layer and output Layer.
See note for BuildStructure(number)
*/
void AdalineNet::SetSizeOfInputLayer(int numInputLayer)
{
// call private utilty
BuildStructure(numInputLayer);
}
/*
void NeuralNet::SetInputValue(int whichNeuron, double Value)
Set the value of a specific Neuron in AdalineNet
*/
void AdalineNet::SetInputValue(int whichNeuron, double Value)
{
NeuralNet::SetInputValue(whichNeuron, Value);
}
/*
double NeuralNet::GetOutputValue(int whichNeuron)
Get the value of a specific Neuron in AdalineNet
*/
double AdalineNet::GetOutputValue(int whichNeuron) const
{
return NeuralNet::GetOutputValue(whichNeuron);
}
/*
void NeuralNet::Fire(void)
Fire the whole AdalineNet
*/
void AdalineNet::Fire(void)
{
NeuralNet::Fire();
}
/*
void AdalineNet::DesiredOutput(double desired_value)
This function will calculate the error of the output Neuron
according to the desired value.
The network should be fired first.
*/
void AdalineNet::DesiredOutput(double desired_value)
{
// Assuming that the network has been fired already
// The only Neuron in the output Layer should have value desired_value
// Therefore, we calculate the "error" of the only output Neuron (index 0)
// and the desired value
double error = desired_value - GetOutputValue(0);
// Set the error of the output Neuron to computed error
neuronLayers[1].SetError(0, error);
// note: neuronLayer is a protected member in the base class
}
/*
void AdalineNet::Learn()
This function will propagate the error of output Neuron
back to its input Links, adjust the weight of each Link
using the rate supplied.
*/
void AdalineNet::Learn()
{
// Call learn() of the only output Neuron from the output Layer.
// neuronLayers[1].GetNeurons()[0] will get the only neuron
// that's in the output Layer.
(neuronLayers[1].GetNeurons())[0].Learn(learning_rate);
}
/*
void AdalineNet::SetLearningRate(double rate)
Set the learning rate of this Adaline Network.
*/
void AdalineNet::SetLearningRate(double rate)
{
learning_rate = rate;
}
/*
double AdalineNet::GetLearningRate()
Get the learning rate of this Adaline Network.
*/
double AdalineNet::GetLearningRate()
{
return learning_rate;
}
// ps: Print(ostream& out) needs to be redefined, so the bias node
// will not be printed.
/*
void AdalineNet::ReadFromFile(istream &in)
Read data into this AdalineNet instance from file specified by "in"
*/
void AdalineNet::ReadFromFile(istream &in)
{
NeuralNet::ReadFromFile(in);
}
/*
void AdalineNet::WriteToFile(ostream &out)
Write data of this AdalineNet instance to file specified by "out"
*/
void AdalineNet::WriteToFile(ostream &out)
{
NeuralNet::WriteToFile(out);
}
Back Top