#include #include "n.h" #include #include #include node nullnode; /* funkcja aktywacji */ double sigma(double v, double di){ double x=-2*di*v; return 1/(1+exp(x)); } /* pochodna funkcji aktywacji */ double dsigma(double v, double di){ double x=-2*di*v; return 2*di*exp(x)/((1+exp(x))*(1+exp(x))); } /* Konstruktor węzła (klasy pierwotnej dla neuronu) * dla ulatwienia debugowania wprowadzona zostala * zmienna name */ node::node(char *aname){ pnext=0; h=0; d=0; eval_ready=false; err_ready=false; ncount=0; if(aname==0) {name= new char[1]; name[0]=0;} else {name= new char[strlen(aname)+1]; strcpy(name,aname);} } node *node::addnext(node* an){ if(!pnext) return pnext=an; return pnext->addnext(an); } /* Ta funkcja łączy wejscia neuronu * do wczesniej utowrzonej warstwy (lub wejsc) * inicjalizuje licznik wejsc. */ node &neuron::connect(node* an){ ncount=an->getCount(); pinput=an; reset(); return *an; } /* * Neuron rozni sie od węzla tym, że posiada wejscia * i dla kazdego z nich okreslon± wagę oraz wagę wejscia * stałego. Wagi wejsc zapisywane sa w tablicy pw * inicjalizowanej w funkcji initw() dla kazdego neuronu * po utworzeniu sieci. */ neuron::neuron(char *aname) : node(aname){ pinput=0; pw=0; w0=0; } neuron::~neuron(){ if(pw) delete [] pw; } node &node::getknext(int k){ if(k<=0) return *this; if(pnext) return pnext->getknext(k-1); return nullnode; } /* oblicznienie funkcji aktywacji dla wartosci * potencjalu membranowego * */ double neuron::fa(){ return sigma(h,1.0); } /* oblicznienie pochodnej funkcji aktywacji dla wartosci * potencjalu membranowego * */ double neuron::dfa(){ return dsigma(h,1.0); } /* oblicznie wyscia neuronu zoptymalizowane tak, by * suma wejsc byla obliczana tylko raz * */ double neuron::eval(){ if(eval_ready) return fa(); if(ncount) { h=-w0; for(int i = 0; i " << "w0"<<"="<< w0<<" " ; for(int i =0; igetknext(k); } /* propagacja wsteczna bledu * */ void neuron::bpg(){ for(int i=0;i