1#ifndef TMVA_SOFIE_SOFIE_COMMON
2#define TMVA_SOFIE_SOFIE_COMMON
20namespace Experimental{
26 UNDEFINED = 0,
FLOAT = 1,
UNINT8 = 2,
INT8 = 3,
UINT16 = 4,
INT16 = 5,
INT32 = 6,
INT64 = 7,
STRING = 8,
BOOL = 9,
93 std::vector<std::size_t>
const &
shape()
const {
return fShape; }
96 template <
class T =
void>
99 return static_cast<T
const *
>(
fData.get());
107 for (std::size_t item :
fShape) {
108 fSize *=
static_cast<int>(item);
117 throw std::runtime_error(
"TMVA::SOFIE doesn't yet supports serialising data-type " +
173bool AreSameShape(
const std::vector<size_t>&,
const std::vector<size_t>&);
174bool AreSameShape(
const std::vector<size_t>&,
const std::vector<Dim>&);
175bool AreSameShape(
const std::vector<Dim>&,
const std::vector<Dim>&);
184std::string
Clean_name(std::string input_tensor_name);
188 size_t size = targetShape.size();
189 if (targetShape[1] != channel) {
190 std::stringstream ss;
191 ss <<
"TMVA::SOFIE - Error broadcasting Conv Bias of shape {";
192 ss << std::to_string(channel);
196 std::runtime_error(ss.str());
200 T* newData =
new T[targetLength];
202 if (targetLength == channel) {
203 std::copy(
data,
data + channel, newData);
209 for (
size_t i = 2; i <
size; i++)
210 cStride *= targetShape[i];
213 for (
size_t i = 0; i < channel; i++) {
214 std::fill(newData + i * cStride, newData + (i + 1) * cStride,
data[i]);
217 size_t batch = targetShape[0];
218 size_t bStride = channel * cStride;
219 for (
size_t i = 1; i < batch; i++) {
220 std::copy(newData, newData + bStride, newData + i * bStride);
229T*
BroadcastTensor(
const T*
data,
const std::vector<size_t>& shape,
const std::vector<size_t>& targetShape) {
231 size_t size = shape.size();
236 T* broadcastedData =
new T[targetLength];
237 std::copy(
data,
data + curLength, broadcastedData);
241 std::vector<T> newData(targetLength);
243 for (
size_t idx = 0; idx <
size; idx++) {
244 size_t dim = shape[idx];
245 size_t targetDim = targetShape[idx];
246 if (dim == 1 && targetDim > 1) {
248 size_t newLength = curLength * targetDim;
250 size_t arrayLength = curLength / arrayNum;
252 if (arrayLength > 1) {
254 for (
size_t arrayIdx = 0; arrayIdx < arrayNum; arrayIdx++) {
255 for (
size_t targetIdx = 0; targetIdx < targetDim; targetIdx++) {
256 size_t offset = arrayIdx * arrayLength * targetDim + targetIdx * arrayLength;
257 std::copy(broadcastedData + arrayIdx * arrayLength,
258 broadcastedData + (arrayIdx + 1) * arrayLength,
259 newData.begin() +
offset);
264 for (
size_t arrayIdx = 0; arrayIdx < arrayNum; arrayIdx++) {
265 std::fill(newData.begin() + arrayIdx * targetDim,
266 newData.begin() + (arrayIdx + 1) * targetDim, broadcastedData[arrayIdx]);
270 curLength = newLength;
272 std::copy(newData.begin(), newData.begin() + newLength, broadcastedData);
275 arrayNum *= targetDim;
277 return broadcastedData;
284 if (shape.size() < targetShape.size()) {
285 size_t targetSize = targetShape.size();
286 std::vector<size_t> newShape(targetSize, 1);
287 size_t offset = targetSize - shape.size();
288 std::copy(shape.begin(), shape.end(), newShape.begin() +
offset);
289 return BroadcastTensor<T>(
data, newShape, targetShape);
291 return BroadcastTensor<T>(
data, shape, targetShape);
301 return static_cast<unsigned>(
a) <
static_cast<unsigned>(
b);
325void Im2col(
const T *data_im,
const int channels,
const int height,
const int width,
const int kernel_h,
326 const int kernel_w,
const int pad_h,
const int pad_w,
const int stride_h,
const int stride_w,
327 const int dilation_h,
const int dilation_w, T *data_col)
329 const int output_h = (
height + 2 * pad_h - (dilation_h * (kernel_h - 1) + 1)) / stride_h + 1;
330 const int output_w = (
width + 2 * pad_w - (dilation_w * (kernel_w - 1) + 1)) / stride_w + 1;
332 for (
int channel = channels; channel--; data_im += channel_size) {
333 for (
int kernel_row = 0; kernel_row < kernel_h; kernel_row++) {
334 for (
int kernel_col = 0; kernel_col < kernel_w; kernel_col++) {
335 int input_row = -pad_h + kernel_row * dilation_h;
336 for (
int output_rows = output_h; output_rows; output_rows--) {
338 for (
int output_cols = output_w; output_cols; output_cols--) {
342 int input_col = -pad_w + kernel_col * dilation_w;
343 for (
int output_col = output_w; output_col; output_col--) {
345 *(data_col++) = data_im[input_row *
width + input_col];
349 input_col += stride_w;
352 input_row += stride_h;
362 const int depth,
const int height,
const int width,
363 const int kernel_d,
const int kernel_h,
const int kernel_w,
364 const int pad_d,
const int pad_h,
const int pad_w,
365 const int stride_d,
const int stride_h,
const int stride_w,
366 const int dilation_d,
const int dilation_h,
const int dilation_w, T *data_col)
368 const int output_h = (
height + 2 * pad_h - (dilation_h * (kernel_h - 1) + 1)) / stride_h + 1;
369 const int output_w = (
width + 2 * pad_w - (dilation_w * (kernel_w - 1) + 1)) / stride_w + 1;
370 const int output_d = (depth + 2 * pad_d - (dilation_d * (kernel_d - 1) + 1)) / stride_d + 1;
373 for (
int channel = channels; channel--; data_im += channel_size) {
374 for (
int kernel_depth = 0; kernel_depth < kernel_d; kernel_depth++) {
375 for (
int kernel_row = 0; kernel_row < kernel_h; kernel_row++) {
376 for (
int kernel_col = 0; kernel_col < kernel_w; kernel_col++) {
377 int input_dep = -pad_d + kernel_depth * dilation_d;
378 for (
int output_dep = output_d; output_dep; output_dep--) {
380 for (
int output_rows = output_h; output_rows; output_rows--) {
381 for (
int output_cols = output_w; output_cols; output_cols--) {
386 int input_row = -pad_h + kernel_row * dilation_h;
387 for (
int output_rows = output_h; output_rows; output_rows--) {
389 for (
int output_cols = output_w; output_cols; output_cols--) {
393 int input_col = -pad_w + kernel_col * dilation_w;
394 for (
int output_col = output_w; output_col; output_col--) {
396 *(data_col++) = data_im[input_dep *
width *
height + input_row *
width + input_col];
400 input_col += stride_w;
403 input_row += stride_h;
406 input_dep += stride_d;
414template <
typename Dtype>
415void col2im(
const Dtype* data_col,
const int channels,
416 const int height,
const int width,
const int kernel_h,
const int kernel_w,
417 const int pad_h,
const int pad_w,
418 const int stride_h,
const int stride_w,
419 const int dilation_h,
const int dilation_w,
422 std::fill(data_im, data_im +
height *
width * channels, 0.);
426 const int output_h = (
height + 2 * pad_h -
427 (dilation_h * (kernel_h - 1) + 1)) / stride_h + 1;
428 const int output_w = (
width + 2 * pad_w -
429 (dilation_w * (kernel_w - 1) + 1)) / stride_w + 1;
431 for (
int channel = channels; channel--; data_im += channel_size) {
432 for (
int kernel_row = 0; kernel_row < kernel_h; kernel_row++) {
433 for (
int kernel_col = 0; kernel_col < kernel_w; kernel_col++) {
434 int input_row = -pad_h + kernel_row * dilation_h;
435 for (
int output_rows = output_h; output_rows; output_rows--) {
437 data_col += output_w;
439 int input_col = -pad_w + kernel_col * dilation_w;
440 for (
int output_col = output_w; output_col; output_col--) {
447 data_im[input_row *
width + input_col] += *data_col;
450 input_col += stride_w;
453 input_row += stride_h;
466extern "C" void sgemm_(
const char * transa,
const char * transb,
const int *
m,
const int *
n,
const int * k,
467 const float * alpha,
const float * A,
const int * lda,
const float * B,
const int * ldb,
468 const float * beta,
float * C,
const int * ldc);
490 throw std::runtime_error(
"TMVA RTensor Concatenate - tensors have different memory layout");
491 auto & shape1 =
t1.GetShape();
493 if (
t1.GetSize()/shape1[axis] != t2.
GetSize()/shape2[axis]) {
494 std::cout <<
"axis " << axis <<
" sizes " <<
t1.GetSize() <<
" " << t2.
GetSize() <<
" ";
497 throw std::runtime_error(
"TMVA RTensor Concatenate - tensors have incompatible shapes");
499 std::vector<size_t> outShape = shape1;
500 outShape[axis] = shape1[axis] + shape2[axis];
502 if (
t1.GetMemoryLayout() == TMVA::Experimental::MemoryLayout::ColumnMajor) {
503 throw std::runtime_error(
"TMVA RTensor Concatenate is not yet supported for column major tensors");
506 auto & stride1 =
t1.GetStrides();
510 size_t s1 = (axis > 0) ? stride1[axis-1] :
t1.GetSize();
511 size_t s2 = (axis > 0) ? stride2[axis-1] : t2.
GetSize();
512 size_t sout = (axis > 0) ? outStride[axis-1] : tout.
GetSize();
513 size_t nb =
t1.GetSize()/
s1;
514 for (
size_t i = 0; i < nb; i++) {
515 std::copy(
t1.GetData() + i*
s1,
t1.GetData() + (i+1)*
s1, tout.
GetData() + i * sout );
539 std::copy(
data.node_data.GetData(),
data.node_data.GetData()+
data.node_data.GetSize(), out.node_data.GetData());
540 std::copy(
data.edge_data.GetData(),
data.edge_data.GetData()+
data.edge_data.GetSize(), out.edge_data.GetData());
541 std::copy(
data.global_data.GetData(),
data.global_data.GetData()+
data.global_data.GetSize(), out.global_data.GetData());
542 std::copy(
data.edge_index.GetData(),
data.edge_index.GetData()+
data.edge_index.GetSize(), out.edge_index.GetData());
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
winID h TVirtualViewer3D TVirtualGLPainter p
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 offset
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
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
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t height
RTensor is a container with contiguous memory and shape information.
MemoryLayout GetMemoryLayout() const
RTensor< Value_t, Container_t > Copy(MemoryLayout layout=MemoryLayout::RowMajor) const
Copy RTensor to new object.
const Shape_t & GetStrides() const
std::size_t GetSize() const
const Shape_t & GetShape() const
std::shared_ptr< void > const & sharedptr() const
std::shared_ptr< void > fData
! Transient shared data
InitializedTensor()=default
ETensorType fType
Encodes the type of the data.
std::vector< std::size_t > const & shape() const
char * fPersistentData
[fSize] Persistent version of the data
std::vector< std::size_t > fShape
The shape of the data in terms of elements in each dimension.
InitializedTensor(ETensorType type, std::span< std::size_t > shape, std::shared_ptr< void > data)
void CastSharedToPersistent()
ETensorType const & type() const
void CastPersistentToShared()
int fSize
The size of the persistent data in bytes (not number of elements!)
void sgemm_(const char *transa, const char *transb, const int *m, const int *n, const int *k, const float *alpha, const float *A, const int *lda, const float *B, const int *ldb, const float *beta, float *C, const int *ldc)
bool AreSameShape(const std::vector< size_t > &, const std::vector< size_t > &)
void Im2col_3d(const T *data_im, const int channels, const int depth, const int height, const int width, const int kernel_d, const int kernel_h, const int kernel_w, const int pad_d, const int pad_h, const int pad_w, const int stride_d, const int stride_h, const int stride_w, const int dilation_d, const int dilation_h, const int dilation_w, T *data_col)
3d implementation
T * BroadcastConvBias(const T *data, const size_t channel, const std::vector< size_t > &targetShape)
void col2im(const Dtype *data_col, const int channels, const int height, const int width, const int kernel_h, const int kernel_w, const int pad_h, const int pad_w, const int stride_h, const int stride_w, const int dilation_h, const int dilation_w, Dtype *data_im)
T * BroadcastTensor(const T *data, const std::vector< size_t > &shape, const std::vector< size_t > &targetShape)
std::vector< size_t > UnidirectionalBroadcastShape(std::vector< size_t >, std::vector< size_t >)
std::string Clean_name(std::string input_tensor_name)
bool is_a_ge_zero_and_a_lt_b(int a, int b)
function to check if a >> 0 and a < MAX using a single comparison / use trick casting to unsigned val...
std::vector< size_t > MultidirectionalBroadcastShape(std::vector< std::vector< size_t > >)
T * UnidirectionalBroadcast(const T *data, const std::vector< size_t > &shape, const std::vector< size_t > &targetShape)
void Im2col(const T *data_im, const int channels, const int height, const int width, const int kernel_h, const int kernel_w, const int pad_h, const int pad_w, const int stride_h, const int stride_w, const int dilation_h, const int dilation_w, T *data_col)
im2col : efficient function to re-arrange input data of convolution to a matrix that can be used by B...
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::vector< Dim > ConvertShapeToDim(std::vector< size_t > shape)
Convert shape from integer format to dynamic one (based on Dim)
std::string ConvertDynamicShapeToLength(std::vector< Dim > shape)
ETensorType GetTemplatedType(T)
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)
TMVA::Experimental::RTensor< T > Concatenate(TMVA::Experimental::RTensor< T > &t1, TMVA::Experimental::RTensor< T > &t2, int axis=0)
std::vector< size_t > ConvertShapeToInt(std::vector< Dim > shape)
Convert shape based on Dim to integer format.
std::size_t ConvertShapeToLength(std::vector< size_t > shape)
GNN_Data Copy(const GNN_Data &data)
create variable transformations
Dim(const std::string &p, size_t d=0)
std::string GetVal() const
RTensor< float > global_data
RTensor< float > edge_data
RTensor< int > edge_index
RTensor< float > node_data
std::vector< size_t > shape