1#ifndef TMVA_SOFIE_ROPERATOR_LAYERNORMALIZATION 
    2#define TMVA_SOFIE_ROPERATOR_LAYERNORMALIZATION 
   11namespace Experimental {
 
   82         throw std::runtime_error(
"TMVA::SOFIE - Tensor " + 
fNX + 
" not found.");
 
 
  145      std::stringstream out;
 
  147         out << 
SP << 
"// Broadcasting the bias of LayerNormalization op\n";
 
  149         out << 
SP << 
SP << 
"float* data = TMVA::Experimental::SOFIE::UTILITY::UnidirectionalBroadcast<float>(tensor_";
 
  152         out << 
SP << 
"delete[] data;\n";
 
 
  162         throw std::runtime_error(
"TMVA::SOFIE LayerNormalization operator " + 
opName +
 
  163                                  " called to generate without being initialized first.");
 
  166         throw std::runtime_error(
"TMVA::SOFIE LayerNormalization operator not " 
  167                                  "implemented for input tensor of size > 5.");
 
  170      std::stringstream out;
 
  172      out << 
"//---- Layer Normalization  operator " << 
opName << 
"\n";
 
  177      for (
size_t i = 0; i < 
fSize; i++) {
 
  182      std::string 
InputIndex = 
"axis_0 * " + strides[0].GetVal();
 
  183      for (
size_t i = 1; i < 
fSize; i++) {
 
  184         InputIndex += 
" + axis_" + std::to_string(i) + 
" * " + strides[i].GetVal();
 
  189      for (
size_t i = 1; i < 
fAxis; i++) {
 
  201         out << 
SP << 
"for (size_t i = 0; i < " << 
fLength << 
"; i++) {\n";
 
  202         out << 
SP << 
SP << 
"tensor_" << 
fNCastedX << 
"[i] = " << 
"static_cast<float>(tensor_" << 
fNX;
 
  207      out << 
SP << 
"// Compute the mean\n";
 
  209      for (
size_t i = 0; i < 
fAxis; i++) {
 
  210         std::string 
iIdx = 
"axis_" + std::to_string(i);
 
  212                      << 
"; " << 
iIdx << 
"++) {\n";
 
  214      out << 
SP << 
SP << 
fType << 
" sum = 0.;\n";
 
  217         std::string 
jIdx = 
"axis_" + std::to_string(
j);
 
  219                         << 
"; " << 
jIdx << 
"++) {\n";
 
  223         out << 
SP << 
SP << 
"}\n";
 
  231      out << 
SP << 
"// Compute the inverse Standard Deviation\n";
 
  233      for (
size_t i = 0; i < 
fAxis; i++) {
 
  234         std::string 
iIdx = 
"axis_" + std::to_string(i);
 
  236                   << 
"; " << 
iIdx << 
"++){\n";
 
  239      out << 
SP << 
SP << 
fType << 
" sum = 0.;\n";
 
  242         std::string 
jIdx = 
"axis_" + std::to_string(
j);
 
  244                          << 
"; " << 
jIdx << 
"++){\n";
 
  246      out << 
SP << 
SP << 
SP << 
"float tmp = tensor_" << 
fNX << 
"[" << 
InputIndex << 
"] - tensor_" 
  248      out << 
SP << 
SP << 
SP << 
"sum += tmp*tmp;\n";
 
  250         out << 
SP << 
SP << 
"}\n";
 
  254      for (
size_t i = 0; i < 
fAxis; i++) {
 
  259         out << 
"// NormalizedX = InvStdDev * (CastedX - Mean)\n";
 
  260         for (
size_t i = 0; i < 
fAxis; i++) {
 
  261            std::string 
iIdx = 
"axis_" + std::to_string(i);
 
  263                          << 
"; " << 
iIdx << 
"++){\n";
 
  266            std::string 
jIdx = 
"axis_" + std::to_string(
j);
 
  268                             << 
"; " << 
jIdx << 
"++){\n";
 
  274            out << 
SP << 
SP << 
"}\n";
 
  279         out << 
"// Y = Scale o NormalizedX";
 
  280         for (
size_t i = 0; i < 
fAxis; i++) {
 
  281            std::string 
iIdx = 
"axis_" + std::to_string(i);
 
  283                      << 
"; " << 
iIdx << 
"++){\n";
 
  286            std::string 
jIdx = 
"axis_" + std::to_string(
j);
 
  288                            << 
"; " << 
jIdx << 
"++){\n";
 
  294            out << 
SP << 
SP << 
"}\n";
 
  300         out << 
SP << 
"// Y = Scale o InvStdDev (X - Mean)\n";
 
  301         for (
size_t i = 0; i < 
fAxis; i++) {
 
  302            std::string 
iIdx = 
"axis_" + std::to_string(i);
 
  304                         << 
"; " << 
iIdx << 
"++){\n";
 
  307            std::string 
jIdx = 
"axis_" + std::to_string(
j);
 
  309                           << 
"; " << 
jIdx << 
"++){\n";
 
  316            out << 
SP << 
SP << 
"}\n";
 
  325         out << 
SP << 
"// Add the bias to Y\n";
 
  327         out << 
SP << 
"float " << 
opName << 
"_alpha = 1.;\n";
 
  328         out << 
SP << 
"int " << 
opName << 
"_inc = 1;\n";
 
  329         out << 
SP << 
"BLAS::saxpy_(&" << 
opName << 
"_n, &" << 
opName << 
"_alpha, " << 
bias << 
", &";
 
  330         out << 
opName << 
"_inc, " << 
"tensor_" << 
fNY << 
", &" << 
opName << 
"_inc);\n";
 
 
  336   std::vector<std::string> 
GetBlasRoutines()
 override { 
return { std::string(
"Axpy") }; }
 
  338   std::vector<std::string> 
GetStdLibs()
 override { 
return { std::string(
"cmath") }; }
 
 
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void input
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
 
void AddNeededStdLib(std::string libname)
 
bool IsDynamicTensor(const std::string &name) const
 
void AddIntermediateTensor(std::string tensor_name, ETensorType type, std::vector< Dim > dim_shape)
 
bool CheckIfTensorAlreadyExist(std::string tensor_name)
 
const ETensorType & GetTensorType(std::string name) const
 
const std::vector< size_t > & GetTensorShape(std::string name) const
 
std::vector< Dim > GetDynamicTensorShape(std::string name) const
 
std::vector< std::string > GetBlasRoutines() override
 
std::vector< Dim > fShapeX
 
ROperator_LayerNormalization()
 
std::vector< Dim > fShapeInvStdDev
 
ROperator_LayerNormalization(int axis, float epsilon, size_t stashType, const std::string &nameX, const std::string &nameScale, const std::string &nameB, const std::string &nameY, const std::string &nameMean, const std::string &nameInvStdDev)
 
std::string fNormalizedLength
 
std::string Generate(std::string opName) override
 
std::vector< std::string > GetStdLibs() override
 
std::string GenerateInitCode() override
 
std::vector< Dim > fNormalizedShape
 
std::vector< Dim > fShapeScale
 
void Initialize(RModel &model) override
 
std::vector< Dim > fShapeY
 
std::vector< size_t > fShapeB
 
std::vector< std::vector< size_t > > ShapeInference(std::vector< std::vector< size_t > > input) override
 
std::string fNBroadcastedB
 
std::vector< ETensorType > TypeInference(std::vector< ETensorType > input) override
 
std::vector< Dim > fShapeMean
 
std::string fNNormalizedX
 
std::vector< Dim > fAxesShape
 
std::vector< std::string_view > fInputTensorNames
 
const std::string SP
space used to correctly indent the generated C++ code
 
std::vector< std::string_view > fOutputTensorNames
 
std::vector< size_t > ComputeStrideFromShape(const std::vector< size_t > &shape)
compute stride of a tensor given its shape (assume layout is row-major)
 
std::string ConvertDynamicShapeToLength(std::vector< Dim > shape)
 
std::string ConvertShapeToString(std::vector< size_t > shape)
 
std::string ConvertTypeToString(ETensorType type)
 
std::string ConvertDynamicShapeToString(std::vector< Dim > shape)
 
ETensorType ConvertStringToType(std::string type)
 
std::size_t ConvertShapeToLength(std::vector< size_t > shape)
 
create variable transformations