#include <iostream>
#include <vector>
#include <cmath>
double sigmoid(double x) {
return (1.0 / (1.0 + std::exp(-x)));
}
struct Neuron{
std::vector<double> i;
std::vector<double> w;
double bias;
double out;
};
using N = Neuron;
/*
[n1]
[n3]-
[n2]/
*/
void generate(N &_N) {
_N.out = 0;
for(unsigned int i = 0;i<_N.w.size();i++) {
_N.out += _N.w[i] * _N.i[i];
}
_N.out += _N.bias;
_N.out = sigmoid(_N.out);
}
void lm_train(N &_N,double lr,double target,std::vector<double> data) {
_N.i = data;
generate(_N);
double error = target - _N.out;
for(unsigned int i = 0; i < _N.w.size();i++) {
_N.w[i] += _N.i[i] * error * lr;
}
_N.bias += error * lr;
}
int main() {
N n1;
n1.i.resize(2);
n1.w.resize(2);
N n2;
n2.i.resize(2);
n2.w.resize(2);
N n3;
n3.i.resize(2);
n3.w.resize(2);
for(int i = 0;i<800;i++) { // nand
lm_train(n1,0.1,0,{1,1});
lm_train(n1,0.1,1,{0,1});
lm_train(n1,0.1,1,{1,0});
lm_train(n1,0.1,1,{0,0});
}
for(int i = 0;i<800;i++) { // or
lm_train(n2,0.1,1,{1,1});
lm_train(n2,0.1,1,{0,1});
lm_train(n2,0.1,1,{1,0});
lm_train(n2,0.1,0,{0,0});
}
for(int i = 0;i<800;i++) { // and
lm_train(n3,0.1,1,{1,1});
lm_train(n3,0.1,0,{0,1});
lm_train(n3,0.1,0,{1,0});
lm_train(n3,0.1,0,{0,0});
}
std::cin >> n1.i[0] >> n1.i[1];
n2.i = n1.i;
generate(n1);
generate(n2);
n3.i = {n1.out,n2.out};
generate(n3);
std::cout << n3.out << std::endl;
}
will it compile?