20template <
typename T,
typename Tout>
23 const std::vector<void*>& data_inputs,
24 const std::vector<kids_dtype>& data_idtype,
37 std::size_t imax = EH.
count3 - 1;
38 std::size_t imin = EH.
count1;
40 std::vector<T> holder(total_tensor);
42 memset(einsum_iposes.data(), 0, total_esidx *
sizeof(std::size_t));
43 memset(ipos_inputs.data(), 0, total_tensor *
sizeof(std::size_t));
44 bool reset_zero =
true;
45 for (std::size_t iloop = 0, ipos_output = 0; iloop < total_loop; ++iloop) {
46 if (reset_zero) data_output[ipos_output] = Tout(0);
48 for (
int iten = 0; iten < total_tensor; ++iten) {
49 switch (data_idtype[iten]) {
51 holder[iten] = cast_at<T, kids_int>(data_inputs[iten], ipos_inputs[iten]);
54 holder[iten] = cast_at<T, kids_real>(data_inputs[iten], ipos_inputs[iten]);
57 holder[iten] = cast_at<T, kids_complex>(data_inputs[iten], ipos_inputs[iten]);
62 data_output[ipos_output] += cast<Tout>(FP.
evaluate(holder.data()));
65 while (++einsum_iposes[i] == einsum_dims[i] && i > imin) { einsum_iposes[i--] = 0; }
67 for (
int iten = 0; iten < total_tensor; ++iten)
68 ipos_inputs[iten] += dh_inputs[iten].mapldims[i];
69 ipos_output += dh_output_mapldims[i];
74 const std::string& mode,
const std::string& save,
75 std::size_t totalFrameNumber)
77 : rule{rule}, mode{mode}, save{save}, totalFrameNumber{totalFrameNumber}, numCollects{0} {
79 auto ipos =
rule.find(
"=");
80 std::string vars_str = (ipos == std::string::npos) ?
rule :
rule.substr(0, ipos);
86 ipos = vars_str.find(
"(");
87 std::string res0_str = (ipos == std::string::npos) ? vars_str : vars_str.substr(0, ipos);
88 res0_str.erase(0, res0_str.find_first_not_of(
" "));
89 res0_str.erase(res0_str.find_last_not_of(
" ") + 1);
97 vars_str = (ipos == std::string::npos) ? vars_str : vars_str.substr(ipos + 1, vars_str.size());
99 while ((ipos = vars_str.find(
",")) != std::string::npos ||
100 (ipos = vars_str.find(
")")) != std::string::npos) {
101 std::string item_str = vars_str.substr(0, ipos);
102 item_str.erase(0, item_str.find_first_not_of(
" "));
103 item_str.erase(item_str.find_last_not_of(
" ") + 1);
104 vars_str = vars_str.substr(ipos + 1, vars_str.size());
106 instance.referIn(DS);
107 variables.push_back(std::move(instance));
111 instance.referIn(DS);
112 variables.push_back(std::move(instance));
117 for (
int i = 0, shift = 0; i <
variables.size(); ++i) {
120 for (
int k = 0; k <
variables[i].shape->rank(); ++k) {
variables[i].index += (char) ((
int)
'a' + shift++); }
139 std::vector<std::size_t> res_cxxshape;
144 res_cxxshape.push_back(i);
147 result->defineIn(DS, res_type, res_cxxshape);
148 collect->defineIn(DS, res_type, res_cxxshape);
149 reduced->defineIn(DS, res_type, res_cxxshape);
154 for (
int i = 0; i <
variables.size(); ++i) {
161 std::vector<std::string> varslist;
176 <<
LOC() <<
"RuleEvaluator Data:\n"
179 <<
".rule = " <<
rule <<
"\n"
180 <<
".mode = " <<
mode <<
"\n"
181 <<
".path = " << path <<
"\n"
182 <<
".save = " <<
save <<
"\n"
197 std::cout <<
result->shape->size() <<
"\n";
225 std::vector<kids_real*> inputDataR;
231 std::vector<kids_complex*> inputDataC;
233 einsum<kids_complex>(*
einsumHelper, inputDataC, resdata);
267 switch (
result->dataType) {
272 for (
int i = 0; i <
result->shape->size(); ++i) todata[i] = fromdata[i];
273 }
else if (
mode ==
"sum") {
274 for (
int i = 0; i <
result->shape->size(); ++i) todata[i] += fromdata[i];
275 }
else if (
mode ==
"average") {
278 for (
int i = 0; i <
result->shape->size(); ++i) todata[i] = k1 * todata[i] + k2 * fromdata[i];
286 for (
int i = 0; i <
result->shape->size(); ++i) todata[i] = fromdata[i];
287 }
else if (
mode ==
"sum") {
288 for (
int i = 0; i <
result->shape->size(); ++i) todata[i] += fromdata[i];
289 }
else if (
mode ==
"average") {
292 for (
int i = 0; i <
result->shape->size(); ++i) todata[i] = k1 * todata[i] + k2 * fromdata[i];
301 switch (
result->dataType) {
309 for (
int i = 0; i <
totalTermNumber; ++i) ofs <<
FMT(8) << real(resdata[i]) <<
FMT(8) << imag(resdata[i]);
this file provides einsum operation
this file provide expression & parser
provide RuleEvaluator class
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::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::size_t > ipos_inputs
idx placeholder for input tensors
A class representing a mathematical expression.
static int registerExpression(const std::string &expression, const std::vector< std::string > &variables)
Register a new mathematical expression.
static std::vector< Expression< T > > & getExpressions()
Get the list of registered expressions.
T evaluate(T *data)
Evaluate the expression with given variable values.
provide utils for debugging the code
#define LOC()
show the location information for debug
< http://warp.povusers.org/FunctionParser/fparser.html
@ kids_real_type
Represents real number type.
@ kids_complex_type
Represents complex number type.
@ kids_int_type
Represents integer type.
@ kids_void_type
Represents void type.
double kids_real
Alias for real number type.
std::complex< double > kids_complex
Alias for complex number type.
void einsum_fun(EinsumHelper &EH, Expression< T > &FP, const std::vector< void * > &data_inputs, const std::vector< kids_dtype > &data_idtype, Tout *data_output)
custumized einsum-like function operation
std::basic_string< CharT > concat(const separator_t< CharT > &sep, Args &&... seq)
std::vector< std::size_t > mapldims
utils for sum of several leading dimensions as the shift step
std::shared_ptr< VariableDescriptor > result
Result of the expression.
void writeTo(std::ofstream &ofs, void *data, int sampleIndex)
Writes the results to a file stream.
std::string rule
The expression rule.
std::vector< kids_dtype > inputDataTypes
Data types of input data.
std::string mode
The mode of evaluation.
std::shared_ptr< EinsumHelper > einsumHelper
Shared pointer to EinsumHelper.
std::vector< void * > inputData
Input data.
std::string expressionString
String representation of the expression.
std::vector< std::vector< std::size_t > > inputShapes
Shapes of input data.
void calculateResult(int sampleIndex=0)
Calculates the expression at a particular time slice.
std::size_t totalTermNumber
Number of terms.
std::shared_ptr< VariableDescriptor > reduced
collect of Result
std::shared_ptr< VariableDescriptor > collect
collect of Result
std::string save
File name to save results.
std::size_t numCollects
Number of Collects.
std::vector< VariableDescriptor > variables
Variables in the expression.
kids_dtype expressionType
Type of the expression.
RuleEvaluator(const std::string &rule, std::shared_ptr< DataSet > &DS, const std::string &mode, const std::string &save, std::size_t totalFrameNumber)
Constructs an RuleEvaluator object.
size_t expressionId
ID of the expression.
std::string einsumString
String representation of expression type.
int expressionCheck
ID of the expression.
std::size_t totalFrameNumber
Number of samples.
Represents a variable token in an expression rule.