#include <ctime>
#include "layer.all.inc.cpp"
#include "layer.all.test.inc.cpp"
#include "train.digit.inc.cpp"
bool runTests() {
if (!AllTest::test()) return false;
return printf("success\n"), true;
}
int main() {
srand(time(NULL));
//return !runTests();
//#define FILENAME "data/output/weights-digit.bin"
#define FILENAME "data/output/weights-digit-conv.bin"
printf("create neural network\n");
//Layer l( nullptr, Layout(28, 28) );
//(new LayerSimple<funcSigmoidExp>( l, Layout(256) ))->filename = FILENAME "1";
//(new LayerSimple<funcSigmoidExp>( l, Layout(64) ))->filename = FILENAME "2";
//(new LayerSimple<funcSigmoidExp>( l, Layout(10) ))->filename = FILENAME "3";
Layer l(nullptr, Layout(28, 28));
(new LayerConvShared<funcReLU>(l, Layout(24, 24, 6), Kernel(5, 1, 0)))->filename = FILENAME "1";
(new LayerSub<funcSigmoidExp>(l, Layout(12, 12, 6)))->filename = FILENAME "2";
(new LayerConvShared<funcReLU>(l, Layout(8, 8, 48), Kernel(5, 1, 0)))->filename = FILENAME "3";
(new LayerSub<funcSigmoidExp>(l, Layout(4, 4, 48)))->filename = FILENAME "4";
(new LayerSimple<funcSigmoidExp>(l, Layout(64)))->filename = FILENAME "5";
(new LayerSimple<funcSigmoidExp>(l, Layout(10)))->filename = FILENAME "6";
l.sumStat().print();
printf("load training data\n");
TrainerDigit t;
if (!t.loadSymbolMap("data/symbols-data.bin")) return 1; // 28x28
//printf("try load previously saved network\n"); l.load();
printf("train\n");
//t.configure(l, 0.5, 8, 70000, 0, 0, 0.00001).run();
t.configure(l, 0.5, 8, 7000, 0, 0, 0.00001).run();
return 0;
}