#ifndef NEURAL_NET_H
#define NEURAL_NET_H
#include <vector>
#include <string>
class Synapse;
class Neuron;
class Network;
enum Input {input};enum Hidden {hidden};enum Output {output};enum Layers {layers};
class Synapse {
public: Neuron* post() const { return n; }
float weight() const { return w; } void grow(float delta) { w += delta; } void setPost(Neuron* neuron) { n = neuron; }
void setWeight(float value) { w = value; } Synapse(Neuron* neuron = 0, float value = 0.) : n(neuron), w(value) {}
Synapse(const Synapse& s) : n(s.n), w(s.w) {} Synapse& operator=(const Synapse& s) { if (&s != this) { n = s.n, w = s.w; }
return *this; }
~Synapse() {}
private:
Neuron* n; float w;};
class Neuron {
public: bool isActive() const { return state; }
float potential() const { return h; }
float threshold() const { return theta; } int size() const { return axon.size(); }
int size(Input) const { return ni; }
int size(Output) const { return size(); } void setActivity(bool a) { state = a; }
void raisePotential(float delta) { h += delta; }
void resetPotential() { h = 0.; }
void setThreshold(float t) { theta = t; } void connect(Neuron* post, float w = 0.) {
axon.push_back(Synapse(post, w));
++post->ni;
} Synapse& operator[](int i) { return axon[i]; } Neuron() : state(false), h(0.), theta(0.), ni(0) {}
~Neuron() {}
private:
bool state;
float h; float theta; int ni; std::vector<Synapse> axon;
Neuron(const Neuron&); void operator=(const Neuron&);};
class Network {
public:
int size() const { return n; }
int size(Input) const { return ni; }
int size(Hidden) const { return nh; }
int size(Output) const { return no; }
int size(Layers) const { return nl; } int offset(Input) const { return 0; }
int offset(Hidden) const { return ni; }
int offset(Output) const { return n - no; } int offset(int number) const { return ni + nh * number; }
Neuron* begin() const { return neuron; }
Neuron* end() const { return output_end; }
Neuron* begin(Input) const { return neuron; }
Neuron* end(Input) const { return input_end; }
Neuron* begin(Hidden) const { return input_end; }
Neuron* end(Hidden) const { return hidden_end; }
Neuron* begin(Output) const { return hidden_end; }
Neuron* end(Output) const { return output_end; } Neuron* begin(int number) const { return input_end + nh * number; }
Neuron* end(int number) const { return begin(number) + nh; }
Neuron* const neuron; Neuron& operator[](int i) { return neuron[i]; }
void setInput(const std::vector<bool>& in);
const std::vector<bool>& getOutput() const; void findFixed(const std::vector<bool>& in, int nah = 0, int nao = 0); int findFixed(int tmax, const std::vector<bool>& in, int nah = 0, int nao = 0);
Network( int ninput, int nhidden, int noutput, int hiddenlayers, const std::vector<float>& chances) throw (std::string); Network(int ninput, int nhidden, int noutput, float ph, float po)
throw (std::string);
~Network() { delete []neuron; }
private:
const int n; const int ni; const int nh; const int no; const int nl; Neuron* const input_end;
Neuron* const hidden_end;
Neuron* const output_end;
Network(const Network&); void operator=(const Network&);};void connect(Neuron* src_begin, Neuron* src_end,
Neuron* dest_begin, Neuron* dest_end, float chance = 1.);void fire(Neuron* start, Neuron* end);void update(Neuron* start, Neuron* end, int na = 0);void Hebb(Neuron* start, Neuron* end, float eta, float kappa, float delta);void antiHebb(Neuron* start, Neuron* end, float rho, float alpha, float delta);
#endif // NEURAL_NET_H