From d37edd207bf25e3344613206a96f8759f18b1ac2 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Thu, 20 Jan 2022 13:52:13 +0300 Subject: [PATCH] Make ml::neural_net return spans --- libs/ml/include/psemek/ml/neural_net.hpp | 12 +++++------- libs/ml/include/psemek/ml/neural_net_evaluator.hpp | 6 +++--- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/libs/ml/include/psemek/ml/neural_net.hpp b/libs/ml/include/psemek/ml/neural_net.hpp index 4582f022..7a673283 100644 --- a/libs/ml/include/psemek/ml/neural_net.hpp +++ b/libs/ml/include/psemek/ml/neural_net.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -52,19 +53,16 @@ namespace psemek::ml // A non-empty neural net is basically unusable bool empty() const { return layer_sizes_.empty(); } - std::size_t layer_count() const { return layer_sizes_.size(); } - std::size_t const * layer_sizes() const { return layer_sizes_.data(); } + util::span layer_sizes() const { return layer_sizes_; } - std::size_t activation_type_count() const { return activation_types_.size(); } - activation_type const * activation_types() const { return activation_types_.data(); } + util::span activation_types() const { return activation_types_; } // Weights are stored in a sequential manner, in the order in which they // appear in evalution of the neural net, i.e. first come the weights // between layers 0 and 1 (including the bias) in row-major order, then // 1-2 in row-major order, etc. - std::size_t weight_count() const { return weights_.size(); } - T const * weights() const { return weights_.data(); } - T * weights() { return weights_.data(); } + util::span weights() const { return weights_; } + util::span weights() { return weights_; } private: std::vector layer_sizes_; diff --git a/libs/ml/include/psemek/ml/neural_net_evaluator.hpp b/libs/ml/include/psemek/ml/neural_net_evaluator.hpp index 9f74ecb3..e8ebebab 100644 --- a/libs/ml/include/psemek/ml/neural_net_evaluator.hpp +++ b/libs/ml/include/psemek/ml/neural_net_evaluator.hpp @@ -29,13 +29,13 @@ namespace psemek::ml template std::vector neural_net_evaluator::evaluate(neural_net const & nn, std::vector input) const { - std::size_t const * layer_sizes = nn.layer_sizes(); - T const * weights = nn.weights(); + auto layer_sizes = nn.layer_sizes(); + auto weights = nn.weights().begin(); if (layer_sizes[0] != input.size()) throw wrong_neural_net_input_size{layer_sizes[0], input.size()}; - for (std::size_t l = 0; l + 1 < nn.layer_count(); ++l) + for (std::size_t l = 0; l + 1 < layer_sizes.size(); ++l) { temp_.resize(layer_sizes[l + 1]);