KIDS  ver-0.0.1
KIDS : Kernel Integrated Dynamics Simulator
Loading...
Searching...
No Matches
Einsum.h
Go to the documentation of this file.
1
129#ifndef KIDS_EINSUM_H
130#define KIDS_EINSUM_H
131
132#include <cstring>
133#include <string>
134#include <vector>
135
136namespace PROJECT_NS {
137
138//*********************************************************************************
142struct EinsumIdx {
143 EinsumIdx(char _label, std::size_t _cnt, std::size_t _dim, std::size_t _val)
144 : label{_label}, cnt{_cnt}, dim{_dim}, val{_val} {};
145
146 char label;
147 std::size_t cnt = 0;
148 std::size_t dim = 0;
149 std::size_t val = 0;
150};
151
157 public:
158 std::size_t esshape_rank;
159 std::size_t total_esidx;
160
161 std::vector<std::size_t> dims;
162 std::vector<std::size_t> ldims;
163 std::vector<std::size_t> es_ldims;
164 std::vector<std::size_t> mapldims;
165
167
173 DimenHelper(const std::string& esshape, std::vector<EinsumIdx>& idx_vec);
174};
175
176
178 public:
179 std::size_t total_esidx;
180 std::size_t total_tensor;
181
182 std::vector<EinsumIdx> einsum_idxs;
183 std::vector<std::size_t> einsum_dims;
184
185 std::vector<std::string> fixed_label_names;
186
187 std::vector<std::string> esshape_inputs;
188 std::string esshape_output = "";
189
190 std::vector<DimenHelper> dh_inputs;
192
193 std::vector<std::size_t> einsum_iposes;
194 std::vector<std::size_t> ipos_inputs;
195
196 int count1 = 0;
197 int count2 = 0;
198 int count3 = 0;
199 int total_loop = 0;
200
206 EinsumHelper(const std::string& einsum_expression, //
207 std::vector<std::vector<std::size_t>> shape_inputs, //
208 std::vector<std::size_t> shape_output = {} //
209 );
210};
211
218template <typename T>
220 const std::vector<T*>& data_inputs, //
221 T* data_output //
222) {
223 auto& einsum_dims = EH.einsum_dims;
224 auto& einsum_iposes = EH.einsum_iposes;
225 auto& ipos_inputs = EH.ipos_inputs;
226 // ipos_output
227 auto& dh_inputs = EH.dh_inputs;
228 auto& dh_output_mapldims = EH.dh_output.mapldims;
229
230 std::size_t total_loop = EH.total_loop;
231 std::size_t total_tensor = EH.total_tensor;
232 std::size_t total_esidx = EH.total_esidx;
233 std::size_t imax = EH.count3 - 1;
234 std::size_t imin = EH.count1;
235
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);
242
243 T term = T(1);
244 for (int iten = 0; iten < total_tensor; ++iten) { term *= data_inputs[iten][ipos_inputs[iten]]; }
245 data_output[ipos_output] += term;
246
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);
250
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];
254 }
255}
256
257
266template <typename T>
267void einsum(const std::string& einsum_expression, //
268 std::vector<T*> data_inputs, //
269 const std::vector<std::vector<std::size_t>>& shape_inputs, //
270 T* data_output, //
271 const std::vector<std::size_t>& shape_output = {} //
272) {
273 EinsumHelper EH(einsum_expression, shape_inputs, shape_output);
274 einsum(EH, data_inputs, data_output);
275}
276
277}; // namespace PROJECT_NS
278
279#endif // KIDS_EINSUM_H
std::vector< EinsumIdx > einsum_idxs
the EinsumIdx System
Definition Einsum.h:182
EinsumHelper(const std::string &einsum_expression, std::vector< std::vector< std::size_t > > shape_inputs, std::vector< std::size_t > shape_output={})
Definition Einsum.cpp:43
std::vector< DimenHelper > dh_inputs
DimenHelper for input tensors.
Definition Einsum.h:190
std::vector< std::size_t > einsum_dims
each dimension of EinsumIdx System
Definition Einsum.h:183
DimenHelper dh_output
DimenHelper for ouput tensor.
Definition Einsum.h:191
std::vector< std::size_t > einsum_iposes
idx placeholder for EinsumIdx System
Definition Einsum.h:193
std::vector< std::string > esshape_inputs
store einsum's strings of input tensors
Definition Einsum.h:187
std::string esshape_output
store/deduct einsum's for the ouput tensor
Definition Einsum.h:188
std::size_t total_esidx
total number of EinsumIdx in EinsumIdx System
Definition Einsum.h:179
std::size_t total_tensor
total number of tensor in einsum rule
Definition Einsum.h:180
std::vector< std::string > fixed_label_names
store for fixed labels
Definition Einsum.h:185
std::vector< std::size_t > ipos_inputs
idx placeholder for input tensors
Definition Einsum.h:194
< http://warp.povusers.org/FunctionParser/fparser.html
Definition Context.h:39
void einsum(EinsumHelper &EH, const std::vector< T * > &data_inputs, T *data_output)
Definition Einsum.h:219
DimenHelper is a struct control dimensional utils on the orginal/einsum index for a given tensor.
Definition Einsum.h:156
std::size_t total_esidx
size if the EinsumIdx System
Definition Einsum.h:159
std::vector< std::size_t > es_ldims
leading dimensions of the tensor represented in einsum indexes
Definition Einsum.h:163
std::vector< std::size_t > mapldims
utils for sum of several leading dimensions as the shift step
Definition Einsum.h:164
std::vector< std::size_t > ldims
leading dimensions of the tensor
Definition Einsum.h:162
std::vector< std::size_t > dims
leading dimensions of the tensor
Definition Einsum.h:161
std::size_t esshape_rank
the rank of the tensor
Definition Einsum.h:158
EinsumIdx is a struct store information of index used in einsum operation.
Definition Einsum.h:142
EinsumIdx(char _label, std::size_t _cnt, std::size_t _dim, std::size_t _val)
Definition Einsum.h:143
std::size_t val
the value of the index
Definition Einsum.h:149
std::size_t dim
bound of the value of index
Definition Einsum.h:148
std::size_t cnt
indicate the type (0: fixed; 1: outer; >1: inner)
Definition Einsum.h:147
char label
unique identifer for EinsumIdx
Definition Einsum.h:146