14 std::vector<Dim> ret_shape(shape.size());
15 for (
size_t i =0; i < shape.size(); i++){
16 ret_shape[i].dim = shape[i];
25 std::vector<size_t> ret_shape(shape.size());
26 for (
size_t i =0; i < shape.size(); i++){
27 if (shape[i].isParam) {
31 val = std::stoi(shape[i].param);
32 if (val >= 0) ret_shape[i] =
static_cast<size_t>(val);
38 catch (
const std::invalid_argument& ) {
43 ret_shape[i] = shape[i].dim;
52 std::size_t fLength = 1;
53 for (
auto& dim: shape) fLength *= dim;
93 if(
type ==
"float32" ||
type ==
"float" ||
type ==
"Float"){
96 else if(
type ==
"int64" ||
type ==
"int64_t"){
99 else if (
type ==
"double" ||
type ==
"float64"){
102 else if (
type ==
"bool" ){
111 std::stringstream out;
113 for (
size_t i = 0; i < shape.size(); i++) {
115 if (i < shape.size()-1) out <<
" , ";
122 std::stringstream out;
124 for (
size_t i = 0; i < shape.size(); i++) {
125 out << shape[i].GetVal();
126 if (i < shape.size()-1) out <<
" , ";
136 size_t int_length = 0;
137 for (
size_t i = 0; i < shape.size(); i++) {
138 if (shape[i].isParam) {
143 int_length = shape[i].dim;
145 int_length *= shape[i].dim;
149 if (int_length > 0) {
151 length += std::to_string(int_length);
159 std::memcpy(
target,
input, input_size *
sizeof(T));
160 int_t already_copied = 1;
162 while (already_copied * 2 <= no_of_copies){
163 std::memcpy(
target + already_copied * input_size,
target, already_copied * input_size *
sizeof(T));
167 if (already_copied < no_of_copies){
168 std::memcpy(
target + already_copied * input_size,
target, (no_of_copies - already_copied) * input_size *
sizeof(T));
174 if (shapeA.size() != shapeB.size()) {
177 for (
size_t dim = 0; dim < shapeA.size(); dim++) {
178 if (shapeA[dim] != shapeB[dim]) {
185 if (shapeA.size() != shapeB.size()) {
188 for (
size_t dim = 0; dim < shapeA.size(); dim++) {
189 if (shapeB[dim].isParam)
return false;
190 if (shapeA[dim] != shapeB[dim].dim) {
197 if (shapeA.size() != shapeB.size()) {
200 for (
size_t dim = 0; dim < shapeA.size(); dim++) {
201 if (shapeA[dim].GetVal() != shapeB[dim].GetVal()) {
210 if (shape.size() < 2) {
212 std::runtime_error(
"TMVA::SOFIE - MultidirectionalBroadcastShape requires at least 2 input shapes.");
215 size_t n = shape.size();
217 size_t targetSize = shape[0].size();
218 for (
size_t i = 1; i <
n; i++) {
219 targetSize = std::max(targetSize, shape[i].
size());
222 bool sameSize =
true;
223 for (
size_t i = 0; i <
n; i++) {
224 if (shape[i].
size() != targetSize) {
231 bool sameShape =
true;
232 for (
size_t i = 1; i <
n; i++) {
233 for (
size_t dim = 0; dim < shape[0].size(); dim++) {
234 if (shape[i][dim] != shape[0][dim]) {
247 std::vector<size_t> targetShape(targetSize, 1);
248 for (
size_t i = 0; i <
n; i++) {
249 for (
size_t dim = 0; dim < targetSize; dim++) {
250 targetShape[dim] = std::max(targetShape[dim], shape[i][dim]);
254 bool broadcastable =
true;
255 for (
size_t i = 0; i <
n; i++) {
256 for (
size_t dim = 0; dim < targetSize; dim++) {
257 if (shape[i][dim] != 1 && targetShape[dim] != 1 && shape[i][dim] != targetShape[dim]) {
258 broadcastable =
false;
261 if (!broadcastable) {
270 std::stringstream ss;
271 ss <<
"TMVA::SOFIE - Error multidirectional broadcasting shapes ";
272 for (
size_t i = 0; i <
n; i++) {
274 if (
n > 2 && i <
n - 2) {
276 }
else if (
n >=2 && i ==
n - 2) {
280 ss <<
" to the same shape.";
282 std::runtime_error(ss.str());
287 for (
size_t i = 0; i <
n; i++) {
288 if (shape[i].
size() < targetSize) {
289 std::vector<size_t> newShape(targetSize, 1);
290 size_t offset = targetSize - shape[i].size();
291 std::copy(shape[i].begin(), shape[i].end(), newShape.begin() +
offset);
296 std::vector<size_t> targetShape(targetSize, 1);
297 for (
size_t i = 0; i <
n; i++) {
298 for (
size_t dim = 0; dim < targetSize; dim++) {
299 targetShape[dim] = std::max(targetShape[dim], shape[i][dim]);
303 bool broadcastable =
true;
304 for (
size_t i = 0; i <
n; i++) {
305 for (
size_t dim = 0; dim < targetSize; dim++) {
306 if (shape[i][dim] != targetShape[dim] && shape[i][dim] != 1 && targetShape[dim] != 1) {
307 broadcastable =
false;
311 if (!broadcastable) {
318 std::stringstream ss;
319 ss <<
"TMVA::SOFIE - Error multidirectional broadcasting shapes ";
320 for (
size_t i = 0; i <
n; i++) {
322 if (
n > 2 && i <
n - 2) {
324 }
else if (
n >=2 && i ==
n - 2) {
328 ss <<
" to the same shape.";
330 std::runtime_error(ss.str());
336 size_t sizeA = shapeA.size();
337 size_t sizeB = shapeB.size();
343 size_t size = std::max(sizeA, sizeB);
345 std::vector<size_t> newShapeA(
size, 1);
347 std::copy(shapeA.begin(), shapeA.end(), newShapeA.begin() +
offset);
348 shapeA = std::move(newShapeA);
351 std::vector<size_t> newShapeB(
size, 1);
353 std::copy(shapeB.begin(), shapeB.end(), newShapeB.begin() +
offset);
354 shapeB = std::move(newShapeB);
356 bool broadcastable =
true;
357 for (
size_t i = 0; i <
size; i++) {
358 if (shapeA[i] != shapeB[i] && shapeA[i] != 1 && shapeB[i] != 1) {
359 broadcastable =
false;
365 std::vector<size_t> targetShape(
size, 1);
366 for (
size_t i = 0; i <
size; i++) {
367 targetShape[i] = std::max(shapeA[i], shapeB[i]);
372 std::runtime_error(
"TMVA::SOFIE - Error unidirectional broadcasting tensors of shape "
374 +
" to a common shape.");
379 std::string s (input_tensor_name);
380 std::replace( s.begin(), s.end(),
'-',
'_');
382 s.erase(std::remove_if(s.begin(), s.end(), [](
char const&
c ) ->
bool { return !std::isalnum(c) && c !=
'_'; } ), s.end());
388 const auto size = shape.size();
389 std::vector<size_t> strides(
size,1);
390 for (std::size_t i = 1; i <
size; i++) {
391 strides[
size - 1 - i] = strides[
size - i ] * shape[
size - i];
398 const auto size = shape.size();
399 std::vector<Dim> strides(
size);
401 for (std::size_t i = 1; i <
size; i++) {
402 if (!shape[
size-i].isParam && !strides[
size-i].isParam)
405 strides[
size - 1 - i] =
Dim{std::string(strides[
size-i].GetVal() +
"*" + shape[
size-i].GetVal())};
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
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 offset
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 target
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 length
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
bool AreSameShape(const std::vector< size_t > &, const std::vector< size_t > &)
std::vector< size_t > UnidirectionalBroadcastShape(std::vector< size_t >, std::vector< size_t >)
std::string Clean_name(std::string input_tensor_name)
std::vector< size_t > MultidirectionalBroadcastShape(std::vector< std::vector< size_t > >)
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)
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::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)
create variable transformations