#pragma once #include "Buffer.hpp" namespace tp { // Fully connected neural network class FCNN { struct Layer { struct Neuron { struct Parameter { Parameter() = default; Parameter(halnf in) : val(in) {} halnf val = 0; halnf grad = 0; public: template void archive(tArchiver& ar) { ar % val; } }; Parameter bias; Buffer weights; halnf activationValue = 0; halnf activationValueLinear = 0; halnf cache; public: template void archive(tArchiver& ar) { ar % bias; ar % weights; } }; Buffer neurons; public: template void archive(tArchiver& ar) { ar % neurons; } }; public: FCNN() = default; explicit FCNN(const Buffer& description); void initializeRandom(const Buffer& description); void evaluate(const Buffer& input, Buffer& output); halnf calcCost(const Buffer& output); void clearGrad(); void calcGrad(const Buffer& output); void applyGrad(halnf step); public: template void archive(tArchiver& ar) { ar % mLayers; } public: Buffer mLayers; halni mAvgCount = 0; }; };