143 EinsumIdx(
char _label, std::size_t _cnt, std::size_t _dim, std::size_t _val)
173 DimenHelper(
const std::string& esshape, std::vector<EinsumIdx>& idx_vec);
207 std::vector<std::vector<std::size_t>> shape_inputs,
208 std::vector<std::size_t> shape_output = {}
220 const std::vector<T*>& data_inputs,
233 std::size_t imax = EH.
count3 - 1;
234 std::size_t imin = EH.
count1;
236 memset(einsum_iposes.data(), 0, total_esidx *
sizeof(std::size_t));
237 memset(ipos_inputs.data(), 0, total_tensor *
sizeof(std::size_t));
238 bool reset_zero =
true;
239 data_output[0] = T(0);
240 for (std::size_t iloop = 0, ipos_output = 0; iloop < total_loop; ++iloop) {
241 if (reset_zero) data_output[ipos_output] = T(0);
244 for (
int iten = 0; iten < total_tensor; ++iten) { term *= data_inputs[iten][ipos_inputs[iten]]; }
245 data_output[ipos_output] += term;
247 std::size_t i = imax;
248 while (++einsum_iposes[i] == einsum_dims[i] && i > imin) { einsum_iposes[i--] = 0; }
249 reset_zero = (i < EH.
count2);
251 for (
int iten = 0; iten < total_tensor; ++iten)
252 ipos_inputs[iten] += dh_inputs[iten].mapldims[i];
253 ipos_output += dh_output_mapldims[i];
267void einsum(
const std::string& einsum_expression,
268 std::vector<T*> data_inputs,
269 const std::vector<std::vector<std::size_t>>& shape_inputs,
271 const std::vector<std::size_t>& shape_output = {}
273 EinsumHelper EH(einsum_expression, shape_inputs, shape_output);
274 einsum(EH, data_inputs, data_output);
std::vector< EinsumIdx > einsum_idxs
the EinsumIdx System
EinsumHelper(const std::string &einsum_expression, std::vector< std::vector< std::size_t > > shape_inputs, std::vector< std::size_t > shape_output={})
std::vector< DimenHelper > dh_inputs
DimenHelper for input tensors.
std::vector< std::size_t > einsum_dims
each dimension of EinsumIdx System
DimenHelper dh_output
DimenHelper for ouput tensor.
std::vector< std::size_t > einsum_iposes
idx placeholder for EinsumIdx System
std::vector< std::string > esshape_inputs
store einsum's strings of input tensors
std::string esshape_output
store/deduct einsum's for the ouput tensor
std::size_t total_esidx
total number of EinsumIdx in EinsumIdx System
std::size_t total_tensor
total number of tensor in einsum rule
std::vector< std::string > fixed_label_names
store for fixed labels
std::vector< std::size_t > ipos_inputs
idx placeholder for input tensors
< http://warp.povusers.org/FunctionParser/fparser.html
void einsum(EinsumHelper &EH, const std::vector< T * > &data_inputs, T *data_output)
DimenHelper is a struct control dimensional utils on the orginal/einsum index for a given tensor.
std::size_t total_esidx
size if the EinsumIdx System
std::vector< std::size_t > es_ldims
leading dimensions of the tensor represented in einsum indexes
std::vector< std::size_t > mapldims
utils for sum of several leading dimensions as the shift step
std::vector< std::size_t > ldims
leading dimensions of the tensor
std::vector< std::size_t > dims
leading dimensions of the tensor
std::size_t esshape_rank
the rank of the tensor
EinsumIdx is a struct store information of index used in einsum operation.
EinsumIdx(char _label, std::size_t _cnt, std::size_t _dim, std::size_t _val)
std::size_t val
the value of the index
std::size_t dim
bound of the value of index
std::size_t cnt
indicate the type (0: fixed; 1: outer; >1: inner)
char label
unique identifer for EinsumIdx