63 return std::visit([](
auto&& v) {
return v.type(); }, var_);
70 return std::visit([](
auto&& v) {
return v.activation(); }, var_);
83 using T = std::decay_t<
decltype(v)>;
84 if constexpr (std::is_same_v<T, Dense> || std::is_same_v<T, Conv1D>) {
85 return v.activationParams();
98 std::pair<Eigen::MatrixXd, Eigen::MatrixXd>
forward(
99 const Eigen::MatrixXd& input)
const {
100 return std::visit([&](
auto&& v) {
return v.forward(input); }, var_);
112 Eigen::MatrixXd
backward(
const Eigen::MatrixXd& nextW,
113 const Eigen::MatrixXd& nextdZ,
114 const Eigen::MatrixXd& currZ)
const {
116 [&](
auto&& v) {
return v.backward(nextW, nextdZ, currZ); }, var_);
125 Eigen::MatrixXd
backward(
const Eigen::MatrixXd& upstream,
126 const Eigen::MatrixXd& currZ)
const {
128 [&](
auto&& v) {
return v.backward(upstream, currZ); }, var_);
138 double lr)
noexcept {
139 std::visit([&](
auto&& v) { v.update(dW, db, lr); }, var_);
141 void update(
const Eigen::MatrixXd& dW,
const Eigen::VectorXd& db,
142 double lr)
noexcept {
155 [](
auto&& v) -> Eigen::MatrixXd {
156 using T = std::decay_t<
decltype(v)>;
157 if constexpr (std::is_same_v<T, Dense>) {
159 }
else if constexpr (std::is_same_v<T, Conv1D>) {
161 }
else if constexpr (std::is_same_v<T, BatchNorm1D>) {
162 return Eigen::MatrixXd();
163 }
else if constexpr (std::is_same_v<T, MaxPool1D> ||
164 std::is_same_v<T, AvgPool1D>) {
165 return Eigen::MatrixXd();
167 return Eigen::MatrixXd();
182 Eigen::MatrixXd
propagate(
const Eigen::MatrixXd& dZ)
const {
184 [&](
auto&& v) -> Eigen::MatrixXd {
185 using T = std::decay_t<
decltype(v)>;
186 if constexpr (std::is_same_v<T, Dense>) {
187 return v.weights().transpose() * dZ;
188 }
else if constexpr (std::is_same_v<T, Conv1D>) {
189 return v.propagate(dZ);
190 }
else if constexpr (std::is_same_v<T, BatchNorm1D>) {
191 return v.propagate(dZ);
192 }
else if constexpr (std::is_same_v<T, MaxPool1D>) {
193 return v.propagate(dZ);
194 }
else if constexpr (std::is_same_v<T, AvgPool1D>) {
195 return v.propagate(dZ);
210 std::pair<Eigen::MatrixXd, Eigen::VectorXd>
grad(
211 const Eigen::MatrixXd& dZ,
const Eigen::MatrixXd& input)
const {
213 [&](
auto&& v) -> std::pair<Eigen::MatrixXd, Eigen::VectorXd> {
214 using T = std::decay_t<
decltype(v)>;
215 if constexpr (std::is_same_v<T, Dense>) {
216 double m =
static_cast<double>(dZ.cols());
217 Eigen::MatrixXd dW = dZ * input.transpose() / m;
218 Eigen::VectorXd db = dZ.rowwise().mean();
220 }
else if constexpr (std::is_same_v<T, Conv1D>) {
221 return v.grad(dZ, input);
222 }
else if constexpr (std::is_same_v<T, BatchNorm1D>) {
223 return v.grad(dZ, input);
224 }
else if constexpr (std::is_same_v<T, MaxPool1D> ||
225 std::is_same_v<T, AvgPool1D>) {
226 return v.grad(dZ, input);
228 return {Eigen::MatrixXd(), Eigen::VectorXd()};
240 const auto&
variant() const noexcept {
return var_; }
244 const Dense*
asDense() const noexcept {
return std::get_if<Dense>(&var_); }
249 return std::get_if<BatchNorm1D>(&var_);
252 return std::get_if<BatchNorm1D>(&var_);
255 return std::get_if<MaxPool1D>(&var_);
259 return std::get_if<AvgPool1D>(&var_);
264 std::variant<Dense, Conv1D, BatchNorm1D, MaxPool1D, AvgPool1D> var_;
Per-activation hyperparameters for FlexNN::Activations.
BatchNorm1D layer for FlexNN::Layers (training stats, aux export).
1D temporal convolution for FlexNN::Layers.
Dense (fully-connected) layer for FlexNN::Layers.
Pool1D layers — MaxPool1D and AvgPool1D (weightless).
Definition BatchNorm1D.hpp:26
Fully-connected layer: Z = W*X + b, A = act(Z).
Definition Dense.hpp:31
Type-erased layer — holds one concrete layer type.
Definition Layer.hpp:49
Layer(AvgPool1D a)
Definition Layer.hpp:57
Activations::Activation activation() const noexcept
Activation for this layer.
Definition Layer.hpp:69
BatchNorm1D * asBatchNorm1D() noexcept
Definition Layer.hpp:251
Dense * asDense() noexcept
Definition Layer.hpp:245
const MaxPool1D * asMaxPool1D() const noexcept
Definition Layer.hpp:254
const auto & variant() const noexcept
Direct access to the underlying variant (for ModelIO).
Definition Layer.hpp:240
MaxPool1D * asMaxPool1D() noexcept
Definition Layer.hpp:257
const Conv1D * asConv1D() const noexcept
Definition Layer.hpp:246
void update(const Eigen::MatrixXd &dW, const Eigen::VectorXd &db, double lr) noexcept
Definition Layer.hpp:141
auto & variant() noexcept
Definition Layer.hpp:241
Eigen::MatrixXd backward(const Eigen::MatrixXd &upstream, const Eigen::MatrixXd &currZ) const
Backward with already-propagated upstream (W_next^T*dZ_next).
Definition Layer.hpp:125
Layer(BatchNorm1D b)
Definition Layer.hpp:55
const AvgPool1D * asAvgPool1D() const noexcept
Definition Layer.hpp:258
Eigen::MatrixXd backward(const Eigen::MatrixXd &nextW, const Eigen::MatrixXd &nextdZ, const Eigen::MatrixXd &currZ) const
Backward pass for this layer (dispatch via visit).
Definition Layer.hpp:112
void updateWeights(const Eigen::MatrixXd &dW, const Eigen::VectorXd &db, double lr) noexcept
SGD update — dispatches to concrete update.
Definition Layer.hpp:137
std::pair< Eigen::MatrixXd, Eigen::VectorXd > grad(const Eigen::MatrixXd &dZ, const Eigen::MatrixXd &input) const
Compute dW/db for this layer given dZ and input.
Definition Layer.hpp:210
const Dense * asDense() const noexcept
Definition Layer.hpp:244
std::pair< Eigen::MatrixXd, Eigen::MatrixXd > forward(const Eigen::MatrixXd &input) const
Forward pass for this layer (dispatch via visit).
Definition Layer.hpp:98
Layer(Dense d)
Definition Layer.hpp:53
Eigen::MatrixXd weightsMatrix() const
Weight matrix for backward — Dense/Conv1D.
Definition Layer.hpp:153
const BatchNorm1D * asBatchNorm1D() const noexcept
Definition Layer.hpp:248
Conv1D * asConv1D() noexcept
Definition Layer.hpp:247
Layer(MaxPool1D m)
Definition Layer.hpp:56
Activations::ActivationParameters activationParams() const noexcept
Activation hyperparameters (e.g., LeakyReLU alpha).
Definition Layer.hpp:80
Layer(Conv1D c)
Definition Layer.hpp:54
Eigen::MatrixXd propagate(const Eigen::MatrixXd &dZ) const
Propagate gradient to previous layer (W^T * dZ or col2im).
Definition Layer.hpp:182
LayerType type() const noexcept
Layer kind (Dense, Conv1D, ...).
Definition Layer.hpp:62
AvgPool1D * asAvgPool1D() noexcept
Definition Layer.hpp:261
Activation
Activation function identifier.
Definition Activation.hpp:41
Definition BatchNorm1D.hpp:24
LayerType
Layer kind, stable on-wire (uint8_t).
Definition LayerTypes.hpp:22
Hyperparameters for activations.
Definition ActivationParameters.hpp:30