diff --git a/include/aidge/operator/MetaOperatorDefs.hpp b/include/aidge/operator/MetaOperatorDefs.hpp index e270a78b6a0f6ed036d7048bed47204a2228417b..f80dd38f124a1730519ce6c1e0a4cefcfa8a359a 100644 --- a/include/aidge/operator/MetaOperatorDefs.hpp +++ b/include/aidge/operator/MetaOperatorDefs.hpp @@ -19,11 +19,11 @@ #include "aidge/graph/GraphView.hpp" #include "aidge/graph/Node.hpp" #include "aidge/graph/OpArgs.hpp" // Sequential -#include "aidge/operator/MetaOperator.hpp" #include "aidge/operator/AvgPooling.hpp" -#include "aidge/operator/MaxPooling.hpp" #include "aidge/operator/Conv.hpp" #include "aidge/operator/ConvDepthWise.hpp" +#include "aidge/operator/MaxPooling.hpp" +#include "aidge/operator/MetaOperator.hpp" #include "aidge/operator/Pad.hpp" #include "aidge/operator/Sigmoid.hpp" #include "aidge/utils/ArrayHelpers.hpp" @@ -31,128 +31,174 @@ namespace Aidge { - template <std::array<DimSize_t, 1>::size_type DIM> -extern std::shared_ptr<Node> PaddedConv(DimSize_t in_channels, - DimSize_t out_channels, - const std::array<DimSize_t, DIM> &kernel_dims, - const std::string& name = "", - const std::array<DimSize_t, DIM> &stride_dims = create_array<DimSize_t,DIM>(1), - const std::array<DimSize_t, 2*DIM> &padding_dims = create_array<DimSize_t,2*DIM>(0), - const std::array<DimSize_t, DIM> &dilation_dims = create_array<DimSize_t,DIM>(1), - bool no_bias = false); +extern std::shared_ptr<Node> +PaddedConv(DimSize_t in_channels, + DimSize_t out_channels, + const std::array<DimSize_t, DIM> &kernel_dims, + const std::string &name = "", + const std::array<DimSize_t, DIM> &stride_dims = + create_array<DimSize_t, DIM>(1), + const std::array<DimSize_t, 2 * DIM> &padding_dims = + create_array<DimSize_t, 2 * DIM>(0), + const std::array<DimSize_t, DIM> &dilation_dims = + create_array<DimSize_t, DIM>(1), + bool no_bias = false); template <std::array<DimSize_t, 1>::size_type DIM> -extern std::shared_ptr<MetaOperator_Op> PaddedConv_Op( - const std::array<DimSize_t, DIM> &kernel_dims, - const std::array<DimSize_t, DIM> &stride_dims = create_array<DimSize_t,DIM>(1), - const std::array<DimSize_t, 2*DIM> &padding_dims = create_array<DimSize_t,2*DIM>(0), - const std::array<DimSize_t, DIM> &dilation_dims = create_array<DimSize_t,DIM>(1)); - -// helper with C-style array instead of std::array for kernel_dims to allow automatic template DIM deduction +extern std::shared_ptr<MetaOperator_Op> +PaddedConv_Op(const std::array<DimSize_t, DIM> &kernel_dims, + const std::array<DimSize_t, DIM> &stride_dims = + create_array<DimSize_t, DIM>(1), + const std::array<DimSize_t, 2 * DIM> &padding_dims = + create_array<DimSize_t, 2 * DIM>(0), + const std::array<DimSize_t, DIM> &dilation_dims = + create_array<DimSize_t, DIM>(1)); + +// helper with C-style array instead of std::array for kernel_dims to allow +// automatic template DIM deduction template <DimSize_t DIM> -extern std::shared_ptr<Node> PaddedConv( - DimSize_t in_channels, - DimSize_t out_channels, - DimSize_t const (&kernel_dims)[DIM], - const std::string& name = "", - const std::array<DimSize_t, DIM> &stride_dims = create_array<DimSize_t,DIM>(1), - const std::array<DimSize_t, 2*DIM> &padding_dims = create_array<DimSize_t,2*DIM>(0), - const std::array<DimSize_t, DIM> &dilation_dims = create_array<DimSize_t,DIM>(1), - bool no_bias = false); +extern std::shared_ptr<Node> +PaddedConv(DimSize_t in_channels, + DimSize_t out_channels, + DimSize_t const (&kernel_dims)[DIM], + const std::string &name = "", + const std::array<DimSize_t, DIM> &stride_dims = + create_array<DimSize_t, DIM>(1), + const std::array<DimSize_t, 2 * DIM> &padding_dims = + create_array<DimSize_t, 2 * DIM>(0), + const std::array<DimSize_t, DIM> &dilation_dims = + create_array<DimSize_t, DIM>(1), + bool no_bias = false); //////////////////////////////////////////////////////////////////////////////// template <std::array<DimSize_t, 1>::size_type DIM> -std::shared_ptr<Node> PaddedConvDepthWise(const DimSize_t nb_channels, - const std::array<DimSize_t, DIM> &kernel_dims, - const std::string& name = "", - const std::array<DimSize_t, DIM> &stride_dims = create_array<DimSize_t,DIM>(1), - const std::array<DimSize_t, 2*DIM> &padding_dims = create_array<DimSize_t,2*DIM>(0), - const std::array<DimSize_t, DIM> &dilation_dims = create_array<DimSize_t,DIM>(1), - bool no_bias = false); +std::shared_ptr<Node> +PaddedConvDepthWise(const DimSize_t nb_channels, + const std::array<DimSize_t, DIM> &kernel_dims, + const std::string &name = "", + const std::array<DimSize_t, DIM> &stride_dims = + create_array<DimSize_t, DIM>(1), + const std::array<DimSize_t, 2 * DIM> &padding_dims = + create_array<DimSize_t, 2 * DIM>(0), + const std::array<DimSize_t, DIM> &dilation_dims = + create_array<DimSize_t, DIM>(1), + bool no_bias = false); template <std::array<DimSize_t, 1>::size_type DIM> -std::shared_ptr<MetaOperator_Op> PaddedConvDepthWise_Op( - const std::array<DimSize_t, DIM> &kernel_dims, - const std::array<DimSize_t, DIM> &stride_dims = create_array<DimSize_t,DIM>(1), - const std::array<DimSize_t, 2*DIM> &padding_dims = create_array<DimSize_t,2*DIM>(0), - const std::array<DimSize_t, DIM> &dilation_dims = create_array<DimSize_t,DIM>(1)); - -// helper with C-style array instead of std::array for kernel_dims to allow automatic template DIM deduction +std::shared_ptr<MetaOperator_Op> +PaddedConvDepthWise_Op(const std::array<DimSize_t, DIM> &kernel_dims, + const std::array<DimSize_t, DIM> &stride_dims = + create_array<DimSize_t, DIM>(1), + const std::array<DimSize_t, 2 * DIM> &padding_dims = + create_array<DimSize_t, 2 * DIM>(0), + const std::array<DimSize_t, DIM> &dilation_dims = + create_array<DimSize_t, DIM>(1)); + +// helper with C-style array instead of std::array for kernel_dims to allow +// automatic template DIM deduction template <DimSize_t DIM> -inline std::shared_ptr<Node> PaddedConvDepthWise( - const DimSize_t nb_channels, - DimSize_t const (&kernel_dims)[DIM], - const std::string& name = "", - const std::array<DimSize_t, DIM> &stride_dims = create_array<DimSize_t,DIM>(1), - const std::array<DimSize_t, 2*DIM> &padding_dims = create_array<DimSize_t,2*DIM>(0), - const std::array<DimSize_t, DIM> &dilation_dims = create_array<DimSize_t,DIM>(1), - bool no_bias = false); +inline std::shared_ptr<Node> +PaddedConvDepthWise(const DimSize_t nb_channels, + DimSize_t const (&kernel_dims)[DIM], + const std::string &name = "", + const std::array<DimSize_t, DIM> &stride_dims = + create_array<DimSize_t, DIM>(1), + const std::array<DimSize_t, 2 * DIM> &padding_dims = + create_array<DimSize_t, 2 * DIM>(0), + const std::array<DimSize_t, DIM> &dilation_dims = + create_array<DimSize_t, DIM>(1), + bool no_bias = false); //////////////////////////////////////////////////////////////////////////////// - template <std::array<DimSize_t, 1>::size_type DIM> -extern std::shared_ptr<Node> PaddedAvgPooling(const std::array<DimSize_t, DIM> &kernel_dims, - const std::string& name = "", - const std::array<DimSize_t, DIM> &stride_dims = create_array<DimSize_t,DIM>(1), - const std::array<DimSize_t, 2*DIM> &padding_dims = create_array<DimSize_t,2*DIM>(0)); - +extern std::shared_ptr<Node> +PaddedAvgPooling(const std::array<DimSize_t, DIM> &kernel_dims, + const std::string &name = "", + const std::array<DimSize_t, DIM> &stride_dims = + create_array<DimSize_t, DIM>(1), + const std::array<DimSize_t, 2 * DIM> &padding_dims = + create_array<DimSize_t, 2 * DIM>(0)); template <std::array<DimSize_t, 1>::size_type DIM> -extern std::shared_ptr<MetaOperator_Op> PaddedAvgPooling_Op(const std::array<DimSize_t, DIM> &kernel_dims, - const std::array<DimSize_t, DIM> &stride_dims = create_array<DimSize_t,DIM>(1), - const std::array<DimSize_t, 2*DIM> &padding_dims = create_array<DimSize_t,2*DIM>(0)); - -// helper with C-style array instead of std::array for kernel_dims to allow automatic template DIM deduction +extern std::shared_ptr<MetaOperator_Op> +PaddedAvgPooling_Op(const std::array<DimSize_t, DIM> &kernel_dims, + const std::array<DimSize_t, DIM> &stride_dims = + create_array<DimSize_t, DIM>(1), + const std::array<DimSize_t, 2 * DIM> &padding_dims = + create_array<DimSize_t, 2 * DIM>(0)); + +// helper with C-style array instead of std::array for kernel_dims to allow +// automatic template DIM deduction template <DimSize_t DIM> -extern std::shared_ptr<Node> PaddedAvgPooling(DimSize_t const (&kernel_dims)[DIM], - const std::string& name = "", - const std::array<DimSize_t, DIM> &stride_dims = create_array<DimSize_t,DIM>(1), - const std::array<DimSize_t, 2*DIM> &padding_dims = create_array<DimSize_t,2*DIM>(0)); +extern std::shared_ptr<Node> +PaddedAvgPooling(DimSize_t const (&kernel_dims)[DIM], + const std::string &name = "", + const std::array<DimSize_t, DIM> &stride_dims = + create_array<DimSize_t, DIM>(1), + const std::array<DimSize_t, 2 * DIM> &padding_dims = + create_array<DimSize_t, 2 * DIM>(0)); //////////////////////////////////////////////////////////////////////////////// template <std::array<DimSize_t, 1>::size_type DIM> -inline std::shared_ptr<Node> PaddedMaxPooling(const std::array<DimSize_t, DIM> &kernel_dims, - const std::string& name = "", - const std::array<DimSize_t, DIM> &stride_dims = create_array<DimSize_t,DIM>(1), - const std::array<DimSize_t, 2*DIM> &padding_dims = create_array<DimSize_t,2*DIM>(0), - bool ceil_mode = false) -{ - auto graph = Sequential({ - Pad<DIM>(padding_dims, (!name.empty()) ? name + "_pad" : ""), - MaxPooling(kernel_dims, (!name.empty()) ? name + "_maxpooling" : "", stride_dims, ceil_mode) - }); - - return MetaOperator(("PaddedMaxPooling" + std::to_string(DIM) + "D").c_str(), graph, {}, name); +inline std::shared_ptr<Node> +PaddedMaxPooling(const std::array<DimSize_t, DIM> &kernel_dims, + const std::string &name = "", + const std::array<DimSize_t, DIM> &stride_dims = + create_array<DimSize_t, DIM>(1), + const std::array<DimSize_t, 2 * DIM> &padding_dims = + create_array<DimSize_t, 2 * DIM>(0), + bool ceil_mode = false) { + auto graph = Sequential( + {Pad<DIM>(padding_dims, (!name.empty()) ? name + "_pad" : ""), + MaxPooling(kernel_dims, + (!name.empty()) ? name + "_maxpooling" : "", + stride_dims, + ceil_mode)}); + + return MetaOperator( + ("PaddedMaxPooling" + std::to_string(DIM) + "D").c_str(), + graph, + {}, + name); } template <std::array<DimSize_t, 1>::size_type DIM> -inline std::shared_ptr<MetaOperator_Op> PaddedMaxPooling_Op(const std::array<DimSize_t, DIM> &kernel_dims, - const std::array<DimSize_t, DIM> &stride_dims = create_array<DimSize_t,DIM>(1), - const std::array<DimSize_t, 2*DIM> &padding_dims = create_array<DimSize_t,2*DIM>(0), - bool ceil_mode = false) -{ - auto graph = Sequential({ - Pad<DIM>(padding_dims, ""), - MaxPooling(kernel_dims, "", stride_dims, ceil_mode) - }); - - return std::make_shared<MetaOperator_Op>(("PaddedMaxPooling" + std::to_string(DIM) + "D").c_str(), graph); +inline std::shared_ptr<MetaOperator_Op> +PaddedMaxPooling_Op(const std::array<DimSize_t, DIM> &kernel_dims, + const std::array<DimSize_t, DIM> &stride_dims = + create_array<DimSize_t, DIM>(1), + const std::array<DimSize_t, 2 * DIM> &padding_dims = + create_array<DimSize_t, 2 * DIM>(0), + bool ceil_mode = false) { + auto graph = + Sequential({Pad<DIM>(padding_dims, ""), + MaxPooling(kernel_dims, "", stride_dims, ceil_mode)}); + + return std::make_shared<MetaOperator_Op>( + ("PaddedMaxPooling" + std::to_string(DIM) + "D").c_str(), + graph); } -// helper with C-style array instead of std::array for kernel_dims to allow automatic template DIM deduction +// helper with C-style array instead of std::array for kernel_dims to allow +// automatic template DIM deduction template <DimSize_t DIM> -inline std::shared_ptr<Node> PaddedMaxPooling( - DimSize_t const (&kernel_dims)[DIM], - const std::string& name = "", - const std::array<DimSize_t, DIM> &stride_dims = create_array<DimSize_t,DIM>(1), - const std::array<DimSize_t, 2*DIM> &padding_dims = create_array<DimSize_t,2*DIM>(0), - bool ceil_mode= false) -{ - return PaddedMaxPooling(to_array(kernel_dims), name, stride_dims, padding_dims, ceil_mode); +inline std::shared_ptr<Node> +PaddedMaxPooling(DimSize_t const (&kernel_dims)[DIM], + const std::string &name = "", + const std::array<DimSize_t, DIM> &stride_dims = + create_array<DimSize_t, DIM>(1), + const std::array<DimSize_t, 2 * DIM> &padding_dims = + create_array<DimSize_t, 2 * DIM>(0), + bool ceil_mode = false) { + return PaddedMaxPooling(to_array(kernel_dims), + name, + stride_dims, + padding_dims, + ceil_mode); } //////////////////////////////////////////////////////////////////////////////// @@ -161,13 +207,16 @@ std::shared_ptr<Node> LSTM(DimSize_t in_channels, DimSize_t hidden_channels, DimSize_t seq_length, bool noBias = false, - const std::string& name = ""); + const std::string &name = ""); std::shared_ptr<MetaOperator_Op> LSTM_Op(DimSize_t seq_length); std::shared_ptr<MetaOperator_Op> LeakyOp(); -std::shared_ptr<Node> Leaky(const int nbTimeSteps, const float threshold, const float beta, const std::string& name = ""); +std::shared_ptr<Node> Leaky(const int nbTimeSteps, + const float threshold, + const float beta, + const std::string &name = ""); -} // namespace Aidge +} // namespace Aidge #endif /* AIDGE_CORE_OPERATOR_METAOPERATORDEFS_H_ */ diff --git a/src/operator/MetaOperatorDefs/Leaky.cpp b/src/operator/MetaOperatorDefs/Leaky.cpp index 425d47a497fdc550b223b6e35cf173dbdd37d907..17296d1305db1a832e8e055916a95c7ea0a92f00 100644 --- a/src/operator/MetaOperatorDefs/Leaky.cpp +++ b/src/operator/MetaOperatorDefs/Leaky.cpp @@ -13,7 +13,10 @@ namespace Aidge { constexpr auto memorizeOpDataOutputRecIndex = 1; constexpr auto memorizeOpDataOutputIndex = 0; -std::shared_ptr<Node> Leaky(const int nbTimeSteps, const float threshold, const float beta, const std::string &name) { +std::shared_ptr<Node> Leaky(const int nbTimeSteps, + const float threshold, + const float beta, + const std::string &name) { Log::warn("! Lots of parameters are hardcoded"); @@ -28,8 +31,7 @@ std::shared_ptr<Node> Leaky(const int nbTimeSteps, const float threshold, const auto reset = Mul(!name.empty() ? name + "_reset" : ""); auto betaTensor = std::make_shared<Tensor>(beta); - auto uthTensor = - std::make_shared<Tensor>(static_cast<float>(threshold)); + auto uthTensor = std::make_shared<Tensor>(static_cast<float>(threshold)); uniformFiller<float>(uthTensor, threshold, threshold); auto decayRate = Producer(betaTensor, "leaky_beta", true); @@ -59,7 +61,6 @@ std::shared_ptr<Node> Leaky(const int nbTimeSteps, const float threshold, const // TODO: Handle hard/soft reset uth->addChild(reset, 0, 1); - // Input[T] + beta * U[T-1] - S[T-1] * U_th addNode->addChild(subNode, 0, 0); @@ -92,8 +93,9 @@ std::shared_ptr<Node> Leaky(const int nbTimeSteps, const float threshold, const microGraph->setOrderedInputs( {{inputNode, 0}, {potentialMem, 1}, {spikeMem, 1}}); - // NOTE: Outputs are NOT the memory nodes (as it is done in LSTM), to avoid producing data during init - // This way, we can plug a stack operator after or node, and get correct results + // NOTE: Outputs are NOT the memory nodes (as it is done in LSTM), to avoid + // producing data during init. This way, we can plug an operator after + // our node, and get correct results. microGraph->setOrderedOutputs({//{potentialMem, memorizeOpDataOutputIndex}, //{spikeMem, memorizeOpDataOutputIndex} {subNode, 0},