1 //
2 // BAGEL - Brilliantly Advanced General Electronic Structure Library
3 // Filename: MRCI_tasks15.cc
4 // Copyright (C) 2014 Toru Shiozaki
5 //
6 // Author: Toru Shiozaki <shiozaki@northwestern.edu>
7 // Maintainer: Shiozaki group
8 //
9 // This file is part of the BAGEL package.
10 //
11 // This program is free software: you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation, either version 3 of the License, or
14 // (at your option) any later version.
15 //
16 // This program is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 // GNU General Public License for more details.
20 //
21 // You should have received a copy of the GNU General Public License
22 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
23 //
24 
25 #include <bagel_config.h>
26 #ifdef COMPILE_SMITH
27 
28 #include <src/smith/mrci/MRCI_tasks15.h>
29 
30 using namespace std;
31 using namespace bagel;
32 using namespace bagel::SMITH;
33 using namespace bagel::SMITH::MRCI;
34 
compute()35 void Task700::Task_local::compute() {
36   const Index a2 = b(0);
37   const Index c1 = b(1);
38   const Index a4 = b(2);
39   const Index c3 = b(3);
40   // tensor label: I162
41   std::unique_ptr<double[]> odata(new double[out()->get_size(a2, c1, a4, c3)]);
42   std::fill_n(odata.get(), out()->get_size(a2, c1, a4, c3), 0.0);
43   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a2, c1, a4, c3)]);
44   std::fill_n(odata_sorted.get(), out()->get_size(a2, c1, a4, c3), 0.0);
45   for (auto& c6 : *range_[0]) {
46     for (auto& a5 : *range_[2]) {
47       // tensor label: t2
48       std::unique_ptr<double[]> i0data = in(0)->get_block(c1, a2, c6, a5);
49       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c1, a2, c6, a5)]);
50       sort_indices<2,3,0,1,0,1,1,1>(i0data, i0data_sorted, c1.size(), a2.size(), c6.size(), a5.size());
51       // tensor label: v2
52       std::unique_ptr<double[]> i1data = in(1)->get_block(c3, c6, a5, a4);
53       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c3, c6, a5, a4)]);
54       sort_indices<1,2,0,3,0,1,-8,1>(i1data, i1data_sorted, c3.size(), c6.size(), a5.size(), a4.size());
55       dgemm_("T", "N", c1.size()*a2.size(), c3.size()*a4.size(), c6.size()*a5.size(),
56              1.0, i0data_sorted, c6.size()*a5.size(), i1data_sorted, c6.size()*a5.size(),
57              1.0, odata_sorted, c1.size()*a2.size());
58     }
59   }
60   sort_indices<1,0,3,2,1,1,1,1>(odata_sorted, odata, c1.size(), a2.size(), c3.size(), a4.size());
61   out()->add_block(odata, a2, c1, a4, c3);
62 }
63 
compute()64 void Task701::Task_local::compute() {
65   const Index a2 = b(0);
66   const Index c1 = b(1);
67   const Index a4 = b(2);
68   const Index c3 = b(3);
69   // tensor label: I162
70   std::unique_ptr<double[]> odata(new double[out()->get_size(a2, c1, a4, c3)]);
71   std::fill_n(odata.get(), out()->get_size(a2, c1, a4, c3), 0.0);
72   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a2, c1, a4, c3)]);
73   std::fill_n(odata_sorted.get(), out()->get_size(a2, c1, a4, c3), 0.0);
74   for (auto& a6 : *range_[2]) {
75     for (auto& c5 : *range_[0]) {
76       // tensor label: t2
77       std::unique_ptr<double[]> i0data = in(0)->get_block(c1, a6, c5, a4);
78       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c1, a6, c5, a4)]);
79       sort_indices<1,2,0,3,0,1,1,1>(i0data, i0data_sorted, c1.size(), a6.size(), c5.size(), a4.size());
80       // tensor label: v2
81       std::unique_ptr<double[]> i1data = in(1)->get_block(c3, a2, a6, c5);
82       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c3, a2, a6, c5)]);
83       sort_indices<2,3,0,1,0,1,4,1>(i1data, i1data_sorted, c3.size(), a2.size(), a6.size(), c5.size());
84       dgemm_("T", "N", c1.size()*a4.size(), c3.size()*a2.size(), a6.size()*c5.size(),
85              1.0, i0data_sorted, a6.size()*c5.size(), i1data_sorted, a6.size()*c5.size(),
86              1.0, odata_sorted, c1.size()*a4.size());
87     }
88   }
89   sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, c1.size(), a4.size(), c3.size(), a2.size());
90   out()->add_block(odata, a2, c1, a4, c3);
91 }
92 
compute()93 void Task702::Task_local::compute() {
94   const Index a2 = b(0);
95   const Index c1 = b(1);
96   const Index a4 = b(2);
97   const Index c3 = b(3);
98   // tensor label: I162
99   std::unique_ptr<double[]> odata(new double[out()->get_size(a2, c1, a4, c3)]);
100   std::fill_n(odata.get(), out()->get_size(a2, c1, a4, c3), 0.0);
101   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a2, c1, a4, c3)]);
102   std::fill_n(odata_sorted.get(), out()->get_size(a2, c1, a4, c3), 0.0);
103   for (auto& c5 : *range_[0]) {
104     for (auto& a6 : *range_[2]) {
105       // tensor label: t2
106       std::unique_ptr<double[]> i0data = in(0)->get_block(c1, a4, c5, a6);
107       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c1, a4, c5, a6)]);
108       sort_indices<2,3,0,1,0,1,1,1>(i0data, i0data_sorted, c1.size(), a4.size(), c5.size(), a6.size());
109       // tensor label: v2
110       std::unique_ptr<double[]> i1data = in(1)->get_block(c3, a2, a6, c5);
111       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c3, a2, a6, c5)]);
112       sort_indices<3,2,0,1,0,1,-8,1>(i1data, i1data_sorted, c3.size(), a2.size(), a6.size(), c5.size());
113       dgemm_("T", "N", c1.size()*a4.size(), c3.size()*a2.size(), a6.size()*c5.size(),
114              1.0, i0data_sorted, a6.size()*c5.size(), i1data_sorted, a6.size()*c5.size(),
115              1.0, odata_sorted, c1.size()*a4.size());
116     }
117   }
118   sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, c1.size(), a4.size(), c3.size(), a2.size());
119   out()->add_block(odata, a2, c1, a4, c3);
120 }
121 
compute()122 void Task703::Task_local::compute() {
123   const Index a2 = b(0);
124   const Index c1 = b(1);
125   const Index a4 = b(2);
126   const Index c3 = b(3);
127   // tensor label: I162
128   std::unique_ptr<double[]> odata(new double[out()->get_size(a2, c1, a4, c3)]);
129   std::fill_n(odata.get(), out()->get_size(a2, c1, a4, c3), 0.0);
130   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a2, c1, a4, c3)]);
131   std::fill_n(odata_sorted.get(), out()->get_size(a2, c1, a4, c3), 0.0);
132   for (auto& a6 : *range_[2]) {
133     for (auto& c5 : *range_[0]) {
134       // tensor label: t2
135       std::unique_ptr<double[]> i0data = in(0)->get_block(c1, a6, c5, a2);
136       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c1, a6, c5, a2)]);
137       sort_indices<1,2,0,3,0,1,1,1>(i0data, i0data_sorted, c1.size(), a6.size(), c5.size(), a2.size());
138       // tensor label: v2
139       std::unique_ptr<double[]> i1data = in(1)->get_block(c3, a4, a6, c5);
140       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c3, a4, a6, c5)]);
141       sort_indices<2,3,0,1,0,1,-8,1>(i1data, i1data_sorted, c3.size(), a4.size(), a6.size(), c5.size());
142       dgemm_("T", "N", c1.size()*a2.size(), c3.size()*a4.size(), a6.size()*c5.size(),
143              1.0, i0data_sorted, a6.size()*c5.size(), i1data_sorted, a6.size()*c5.size(),
144              1.0, odata_sorted, c1.size()*a2.size());
145     }
146   }
147   sort_indices<1,0,3,2,1,1,1,1>(odata_sorted, odata, c1.size(), a2.size(), c3.size(), a4.size());
148   out()->add_block(odata, a2, c1, a4, c3);
149 }
150 
compute()151 void Task704::Task_local::compute() {
152   const Index a2 = b(0);
153   const Index c1 = b(1);
154   const Index a4 = b(2);
155   const Index c3 = b(3);
156   // tensor label: I162
157   std::unique_ptr<double[]> odata(new double[out()->get_size(a2, c1, a4, c3)]);
158   std::fill_n(odata.get(), out()->get_size(a2, c1, a4, c3), 0.0);
159   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a2, c1, a4, c3)]);
160   std::fill_n(odata_sorted.get(), out()->get_size(a2, c1, a4, c3), 0.0);
161   for (auto& c5 : *range_[0]) {
162     for (auto& a6 : *range_[2]) {
163       // tensor label: t2
164       std::unique_ptr<double[]> i0data = in(0)->get_block(c1, a2, c5, a6);
165       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c1, a2, c5, a6)]);
166       sort_indices<2,3,0,1,0,1,1,1>(i0data, i0data_sorted, c1.size(), a2.size(), c5.size(), a6.size());
167       // tensor label: v2
168       std::unique_ptr<double[]> i1data = in(1)->get_block(c3, a4, a6, c5);
169       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c3, a4, a6, c5)]);
170       sort_indices<3,2,0,1,0,1,16,1>(i1data, i1data_sorted, c3.size(), a4.size(), a6.size(), c5.size());
171       dgemm_("T", "N", c1.size()*a2.size(), c3.size()*a4.size(), a6.size()*c5.size(),
172              1.0, i0data_sorted, a6.size()*c5.size(), i1data_sorted, a6.size()*c5.size(),
173              1.0, odata_sorted, c1.size()*a2.size());
174     }
175   }
176   sort_indices<1,0,3,2,1,1,1,1>(odata_sorted, odata, c1.size(), a2.size(), c3.size(), a4.size());
177   out()->add_block(odata, a2, c1, a4, c3);
178 }
179 
compute()180 void Task705::Task_local::compute() {
181   const Index a2 = b(0);
182   const Index c1 = b(1);
183   const Index a4 = b(2);
184   const Index c3 = b(3);
185   // tensor label: I162
186   std::unique_ptr<double[]> odata(new double[out()->get_size(a2, c1, a4, c3)]);
187   std::fill_n(odata.get(), out()->get_size(a2, c1, a4, c3), 0.0);
188   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a2, c1, a4, c3)]);
189   std::fill_n(odata_sorted.get(), out()->get_size(a2, c1, a4, c3), 0.0);
190   for (auto& x3 : *range_[1]) {
191     // tensor label: t2
192     std::unique_ptr<double[]> i0data = in(0)->get_block(x3, a4, c1, a2);
193     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x3, a4, c1, a2)]);
194     sort_indices<0,1,2,3,0,1,1,1>(i0data, i0data_sorted, x3.size(), a4.size(), c1.size(), a2.size());
195     // tensor label: I1310
196     std::unique_ptr<double[]> i1data = in(1)->get_block(c3, x3);
197     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c3, x3)]);
198     sort_indices<1,0,0,1,1,1>(i1data, i1data_sorted, c3.size(), x3.size());
199     dgemm_("T", "N", a4.size()*c1.size()*a2.size(), c3.size(), x3.size(),
200            1.0, i0data_sorted, x3.size(), i1data_sorted, x3.size(),
201            1.0, odata_sorted, a4.size()*c1.size()*a2.size());
202   }
203   sort_indices<2,1,0,3,1,1,1,1>(odata_sorted, odata, a4.size(), c1.size(), a2.size(), c3.size());
204   out()->add_block(odata, a2, c1, a4, c3);
205 }
206 
compute()207 void Task706::Task_local::compute() {
208   const Index c3 = b(0);
209   const Index x3 = b(1);
210   // tensor label: I1310
211   std::unique_ptr<double[]> odata(new double[out()->get_size(c3, x3)]);
212   std::fill_n(odata.get(), out()->get_size(c3, x3), 0.0);
213   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c3, x3)]);
214   std::fill_n(odata_sorted.get(), out()->get_size(c3, x3), 0.0);
215   for (auto& x2 : *range_[1]) {
216     for (auto& x1 : *range_[1]) {
217       for (auto& x0 : *range_[1]) {
218         // tensor label: Gamma29
219         std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x2, x1, x0);
220         std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x3, x2, x1, x0)]);
221         sort_indices<1,2,3,0,0,1,1,1>(i0data, i0data_sorted, x3.size(), x2.size(), x1.size(), x0.size());
222         // tensor label: v2
223         std::unique_ptr<double[]> i1data = in(1)->get_block(c3, x2, x1, x0);
224         std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c3, x2, x1, x0)]);
225         sort_indices<1,2,3,0,0,1,-1,1>(i1data, i1data_sorted, c3.size(), x2.size(), x1.size(), x0.size());
226         dgemm_("T", "N", x3.size(), c3.size(), x2.size()*x1.size()*x0.size(),
227                1.0, i0data_sorted, x2.size()*x1.size()*x0.size(), i1data_sorted, x2.size()*x1.size()*x0.size(),
228                1.0, odata_sorted, x3.size());
229       }
230     }
231   }
232   sort_indices<1,0,1,1,1,1>(odata_sorted, odata, x3.size(), c3.size());
233   out()->add_block(odata, c3, x3);
234 }
235 
compute()236 void Task707::Task_local::compute() {
237   const Index c3 = b(0);
238   const Index x3 = b(1);
239   // tensor label: I1310
240   std::unique_ptr<double[]> odata(new double[out()->get_size(c3, x3)]);
241   std::fill_n(odata.get(), out()->get_size(c3, x3), 0.0);
242   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c3, x3)]);
243   std::fill_n(odata_sorted.get(), out()->get_size(c3, x3), 0.0);
244   for (auto& x0 : *range_[1]) {
245     for (auto& x2 : *range_[1]) {
246       for (auto& x1 : *range_[1]) {
247         // tensor label: Gamma51
248         std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x0, x2, x1);
249         std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x3, x0, x2, x1)]);
250         sort_indices<1,2,3,0,0,1,1,1>(i0data, i0data_sorted, x3.size(), x0.size(), x2.size(), x1.size());
251         // tensor label: v2
252         std::unique_ptr<double[]> i1data = in(1)->get_block(x2, x1, c3, x0);
253         std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x2, x1, c3, x0)]);
254         sort_indices<3,0,1,2,0,1,-1,1>(i1data, i1data_sorted, x2.size(), x1.size(), c3.size(), x0.size());
255         dgemm_("T", "N", x3.size(), c3.size(), x2.size()*x1.size()*x0.size(),
256                1.0, i0data_sorted, x2.size()*x1.size()*x0.size(), i1data_sorted, x2.size()*x1.size()*x0.size(),
257                1.0, odata_sorted, x3.size());
258       }
259     }
260   }
261   sort_indices<1,0,1,1,1,1>(odata_sorted, odata, x3.size(), c3.size());
262   out()->add_block(odata, c3, x3);
263 }
264 
compute()265 void Task708::Task_local::compute() {
266   const Index a2 = b(0);
267   const Index c1 = b(1);
268   const Index a4 = b(2);
269   const Index c3 = b(3);
270   // tensor label: I162
271   std::unique_ptr<double[]> odata(new double[out()->get_size(a2, c1, a4, c3)]);
272   std::fill_n(odata.get(), out()->get_size(a2, c1, a4, c3), 0.0);
273   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a2, c1, a4, c3)]);
274   std::fill_n(odata_sorted.get(), out()->get_size(a2, c1, a4, c3), 0.0);
275   for (auto& x3 : *range_[1]) {
276     // tensor label: t2
277     std::unique_ptr<double[]> i0data = in(0)->get_block(x3, a2, c1, a4);
278     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x3, a2, c1, a4)]);
279     sort_indices<0,1,2,3,0,1,1,1>(i0data, i0data_sorted, x3.size(), a2.size(), c1.size(), a4.size());
280     // tensor label: I1313
281     std::unique_ptr<double[]> i1data = in(1)->get_block(c3, x3);
282     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c3, x3)]);
283     sort_indices<1,0,0,1,1,1>(i1data, i1data_sorted, c3.size(), x3.size());
284     dgemm_("T", "N", a2.size()*c1.size()*a4.size(), c3.size(), x3.size(),
285            1.0, i0data_sorted, x3.size(), i1data_sorted, x3.size(),
286            1.0, odata_sorted, a2.size()*c1.size()*a4.size());
287   }
288   sort_indices<0,1,2,3,1,1,1,1>(odata_sorted, odata, a2.size(), c1.size(), a4.size(), c3.size());
289   out()->add_block(odata, a2, c1, a4, c3);
290 }
291 
compute()292 void Task709::Task_local::compute() {
293   const Index c3 = b(0);
294   const Index x3 = b(1);
295   // tensor label: I1313
296   std::unique_ptr<double[]> odata(new double[out()->get_size(c3, x3)]);
297   std::fill_n(odata.get(), out()->get_size(c3, x3), 0.0);
298   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c3, x3)]);
299   std::fill_n(odata_sorted.get(), out()->get_size(c3, x3), 0.0);
300   for (auto& x2 : *range_[1]) {
301     for (auto& x1 : *range_[1]) {
302       for (auto& x0 : *range_[1]) {
303         // tensor label: Gamma29
304         std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x2, x1, x0);
305         std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x3, x2, x1, x0)]);
306         sort_indices<1,2,3,0,0,1,1,1>(i0data, i0data_sorted, x3.size(), x2.size(), x1.size(), x0.size());
307         // tensor label: v2
308         std::unique_ptr<double[]> i1data = in(1)->get_block(c3, x2, x1, x0);
309         std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c3, x2, x1, x0)]);
310         sort_indices<1,2,3,0,0,1,1,2>(i1data, i1data_sorted, c3.size(), x2.size(), x1.size(), x0.size());
311         dgemm_("T", "N", x3.size(), c3.size(), x2.size()*x1.size()*x0.size(),
312                1.0, i0data_sorted, x2.size()*x1.size()*x0.size(), i1data_sorted, x2.size()*x1.size()*x0.size(),
313                1.0, odata_sorted, x3.size());
314       }
315     }
316   }
317   sort_indices<1,0,1,1,1,1>(odata_sorted, odata, x3.size(), c3.size());
318   out()->add_block(odata, c3, x3);
319 }
320 
compute()321 void Task710::Task_local::compute() {
322   const Index c3 = b(0);
323   const Index x3 = b(1);
324   // tensor label: I1313
325   std::unique_ptr<double[]> odata(new double[out()->get_size(c3, x3)]);
326   std::fill_n(odata.get(), out()->get_size(c3, x3), 0.0);
327   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c3, x3)]);
328   std::fill_n(odata_sorted.get(), out()->get_size(c3, x3), 0.0);
329   for (auto& x0 : *range_[1]) {
330     for (auto& x2 : *range_[1]) {
331       for (auto& x1 : *range_[1]) {
332         // tensor label: Gamma51
333         std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x0, x2, x1);
334         std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x3, x0, x2, x1)]);
335         sort_indices<1,2,3,0,0,1,1,1>(i0data, i0data_sorted, x3.size(), x0.size(), x2.size(), x1.size());
336         // tensor label: v2
337         std::unique_ptr<double[]> i1data = in(1)->get_block(x2, x1, c3, x0);
338         std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x2, x1, c3, x0)]);
339         sort_indices<3,0,1,2,0,1,1,2>(i1data, i1data_sorted, x2.size(), x1.size(), c3.size(), x0.size());
340         dgemm_("T", "N", x3.size(), c3.size(), x2.size()*x1.size()*x0.size(),
341                1.0, i0data_sorted, x2.size()*x1.size()*x0.size(), i1data_sorted, x2.size()*x1.size()*x0.size(),
342                1.0, odata_sorted, x3.size());
343       }
344     }
345   }
346   sort_indices<1,0,1,1,1,1>(odata_sorted, odata, x3.size(), c3.size());
347   out()->add_block(odata, c3, x3);
348 }
349 
compute()350 void Task711::Task_local::compute() {
351   const Index a2 = b(0);
352   const Index c1 = b(1);
353   const Index a4 = b(2);
354   const Index c3 = b(3);
355   // tensor label: I162
356   std::unique_ptr<double[]> odata(new double[out()->get_size(a2, c1, a4, c3)]);
357   std::fill_n(odata.get(), out()->get_size(a2, c1, a4, c3), 0.0);
358   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a2, c1, a4, c3)]);
359   std::fill_n(odata_sorted.get(), out()->get_size(a2, c1, a4, c3), 0.0);
360   for (auto& x1 : *range_[1]) {
361     for (auto& c5 : *range_[0]) {
362       // tensor label: t2
363       std::unique_ptr<double[]> i0data = in(0)->get_block(x1, a4, c5, a2);
364       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, a4, c5, a2)]);
365       sort_indices<0,2,1,3,0,1,1,1>(i0data, i0data_sorted, x1.size(), a4.size(), c5.size(), a2.size());
366       // tensor label: I1322
367       std::unique_ptr<double[]> i1data = in(1)->get_block(c1, c3, c5, x1);
368       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c1, c3, c5, x1)]);
369       sort_indices<3,2,0,1,0,1,1,1>(i1data, i1data_sorted, c1.size(), c3.size(), c5.size(), x1.size());
370       dgemm_("T", "N", a4.size()*a2.size(), c1.size()*c3.size(), c5.size()*x1.size(),
371              1.0, i0data_sorted, c5.size()*x1.size(), i1data_sorted, c5.size()*x1.size(),
372              1.0, odata_sorted, a4.size()*a2.size());
373     }
374   }
375   sort_indices<1,2,0,3,1,1,1,1>(odata_sorted, odata, a4.size(), a2.size(), c1.size(), c3.size());
376   out()->add_block(odata, a2, c1, a4, c3);
377 }
378 
compute()379 void Task712::Task_local::compute() {
380   const Index c1 = b(0);
381   const Index c3 = b(1);
382   const Index c5 = b(2);
383   const Index x1 = b(3);
384   // tensor label: I1322
385   std::unique_ptr<double[]> odata(new double[out()->get_size(c1, c3, c5, x1)]);
386   std::fill_n(odata.get(), out()->get_size(c1, c3, c5, x1), 0.0);
387   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c1, c3, c5, x1)]);
388   std::fill_n(odata_sorted.get(), out()->get_size(c1, c3, c5, x1), 0.0);
389   for (auto& x0 : *range_[1]) {
390     // tensor label: Gamma32
391     std::unique_ptr<double[]> i0data = in(0)->get_block(x1, x0);
392     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, x0)]);
393     sort_indices<1,0,0,1,1,1>(i0data, i0data_sorted, x1.size(), x0.size());
394     // tensor label: v2
395     std::unique_ptr<double[]> i1data = in(1)->get_block(c1, x0, c3, c5);
396     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c1, x0, c3, c5)]);
397     sort_indices<1,0,2,3,0,1,-1,1>(i1data, i1data_sorted, c1.size(), x0.size(), c3.size(), c5.size());
398     dgemm_("T", "N", x1.size(), c1.size()*c3.size()*c5.size(), x0.size(),
399            1.0, i0data_sorted, x0.size(), i1data_sorted, x0.size(),
400            1.0, odata_sorted, x1.size());
401   }
402   sort_indices<1,2,3,0,1,1,1,1>(odata_sorted, odata, x1.size(), c1.size(), c3.size(), c5.size());
403   out()->add_block(odata, c1, c3, c5, x1);
404 }
405 
compute()406 void Task713::Task_local::compute() {
407   const Index a2 = b(0);
408   const Index c1 = b(1);
409   const Index a4 = b(2);
410   const Index c3 = b(3);
411   // tensor label: I162
412   std::unique_ptr<double[]> odata(new double[out()->get_size(a2, c1, a4, c3)]);
413   std::fill_n(odata.get(), out()->get_size(a2, c1, a4, c3), 0.0);
414   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a2, c1, a4, c3)]);
415   std::fill_n(odata_sorted.get(), out()->get_size(a2, c1, a4, c3), 0.0);
416   for (auto& x1 : *range_[1]) {
417     for (auto& c5 : *range_[0]) {
418       // tensor label: t2
419       std::unique_ptr<double[]> i0data = in(0)->get_block(x1, a2, c5, a4);
420       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, a2, c5, a4)]);
421       sort_indices<0,2,1,3,0,1,1,1>(i0data, i0data_sorted, x1.size(), a2.size(), c5.size(), a4.size());
422       // tensor label: I1325
423       std::unique_ptr<double[]> i1data = in(1)->get_block(c1, c3, c5, x1);
424       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c1, c3, c5, x1)]);
425       sort_indices<3,2,0,1,0,1,1,1>(i1data, i1data_sorted, c1.size(), c3.size(), c5.size(), x1.size());
426       dgemm_("T", "N", a2.size()*a4.size(), c1.size()*c3.size(), c5.size()*x1.size(),
427              1.0, i0data_sorted, c5.size()*x1.size(), i1data_sorted, c5.size()*x1.size(),
428              1.0, odata_sorted, a2.size()*a4.size());
429     }
430   }
431   sort_indices<0,2,1,3,1,1,1,1>(odata_sorted, odata, a2.size(), a4.size(), c1.size(), c3.size());
432   out()->add_block(odata, a2, c1, a4, c3);
433 }
434 
compute()435 void Task714::Task_local::compute() {
436   const Index c1 = b(0);
437   const Index c3 = b(1);
438   const Index c5 = b(2);
439   const Index x1 = b(3);
440   // tensor label: I1325
441   std::unique_ptr<double[]> odata(new double[out()->get_size(c1, c3, c5, x1)]);
442   std::fill_n(odata.get(), out()->get_size(c1, c3, c5, x1), 0.0);
443   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c1, c3, c5, x1)]);
444   std::fill_n(odata_sorted.get(), out()->get_size(c1, c3, c5, x1), 0.0);
445   for (auto& x0 : *range_[1]) {
446     // tensor label: Gamma32
447     std::unique_ptr<double[]> i0data = in(0)->get_block(x1, x0);
448     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, x0)]);
449     sort_indices<1,0,0,1,1,1>(i0data, i0data_sorted, x1.size(), x0.size());
450     // tensor label: v2
451     std::unique_ptr<double[]> i1data = in(1)->get_block(c1, x0, c3, c5);
452     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c1, x0, c3, c5)]);
453     sort_indices<1,0,2,3,0,1,2,1>(i1data, i1data_sorted, c1.size(), x0.size(), c3.size(), c5.size());
454     dgemm_("T", "N", x1.size(), c1.size()*c3.size()*c5.size(), x0.size(),
455            1.0, i0data_sorted, x0.size(), i1data_sorted, x0.size(),
456            1.0, odata_sorted, x1.size());
457   }
458   sort_indices<1,2,3,0,1,1,1,1>(odata_sorted, odata, x1.size(), c1.size(), c3.size(), c5.size());
459   out()->add_block(odata, c1, c3, c5, x1);
460 }
461 
compute()462 void Task715::Task_local::compute() {
463   const Index a2 = b(0);
464   const Index c1 = b(1);
465   const Index a4 = b(2);
466   const Index c3 = b(3);
467   // tensor label: I162
468   std::unique_ptr<double[]> odata(new double[out()->get_size(a2, c1, a4, c3)]);
469   std::fill_n(odata.get(), out()->get_size(a2, c1, a4, c3), 0.0);
470   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a2, c1, a4, c3)]);
471   std::fill_n(odata_sorted.get(), out()->get_size(a2, c1, a4, c3), 0.0);
472   for (auto& x1 : *range_[1]) {
473     for (auto& a5 : *range_[2]) {
474       // tensor label: t2
475       std::unique_ptr<double[]> i0data = in(0)->get_block(x1, a5, c1, a4);
476       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, a5, c1, a4)]);
477       sort_indices<0,1,2,3,0,1,1,1>(i0data, i0data_sorted, x1.size(), a5.size(), c1.size(), a4.size());
478       // tensor label: I1328
479       std::unique_ptr<double[]> i1data = in(1)->get_block(a5, c3, a2, x1);
480       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(a5, c3, a2, x1)]);
481       sort_indices<3,0,1,2,0,1,1,1>(i1data, i1data_sorted, a5.size(), c3.size(), a2.size(), x1.size());
482       dgemm_("T", "N", c1.size()*a4.size(), c3.size()*a2.size(), a5.size()*x1.size(),
483              1.0, i0data_sorted, a5.size()*x1.size(), i1data_sorted, a5.size()*x1.size(),
484              1.0, odata_sorted, c1.size()*a4.size());
485     }
486   }
487   sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, c1.size(), a4.size(), c3.size(), a2.size());
488   out()->add_block(odata, a2, c1, a4, c3);
489 }
490 
compute()491 void Task716::Task_local::compute() {
492   const Index a5 = b(0);
493   const Index c3 = b(1);
494   const Index a2 = b(2);
495   const Index x1 = b(3);
496   // tensor label: I1328
497   std::unique_ptr<double[]> odata(new double[out()->get_size(a5, c3, a2, x1)]);
498   std::fill_n(odata.get(), out()->get_size(a5, c3, a2, x1), 0.0);
499   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a5, c3, a2, x1)]);
500   std::fill_n(odata_sorted.get(), out()->get_size(a5, c3, a2, x1), 0.0);
501   for (auto& x0 : *range_[1]) {
502     // tensor label: Gamma32
503     std::unique_ptr<double[]> i0data = in(0)->get_block(x1, x0);
504     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, x0)]);
505     sort_indices<1,0,0,1,1,1>(i0data, i0data_sorted, x1.size(), x0.size());
506     // tensor label: I1329
507     std::unique_ptr<double[]> i1data = in(1)->get_block(a5, x0, c3, a2);
508     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(a5, x0, c3, a2)]);
509     sort_indices<1,0,2,3,0,1,1,1>(i1data, i1data_sorted, a5.size(), x0.size(), c3.size(), a2.size());
510     dgemm_("T", "N", x1.size(), a5.size()*c3.size()*a2.size(), x0.size(),
511            1.0, i0data_sorted, x0.size(), i1data_sorted, x0.size(),
512            1.0, odata_sorted, x1.size());
513   }
514   sort_indices<1,2,3,0,1,1,1,1>(odata_sorted, odata, x1.size(), a5.size(), c3.size(), a2.size());
515   out()->add_block(odata, a5, c3, a2, x1);
516 }
517 
compute()518 void Task717::Task_local::compute() {
519   const Index a5 = b(0);
520   const Index x0 = b(1);
521   const Index c3 = b(2);
522   const Index a2 = b(3);
523   // tensor label: I1329
524   std::unique_ptr<double[]> odata(new double[out()->get_size(a5, x0, c3, a2)]);
525   std::fill_n(odata.get(), out()->get_size(a5, x0, c3, a2), 0.0);
526   {
527     // tensor label: v2
528     std::unique_ptr<double[]> i0data = in(0)->get_block(a5, x0, c3, a2);
529     sort_indices<0,1,2,3,1,1,-2,1>(i0data, odata, a5.size(), x0.size(), c3.size(), a2.size());
530   }
531   {
532     // tensor label: v2
533     std::unique_ptr<double[]> i1data = in(0)->get_block(c3, x0, a5, a2);
534     sort_indices<2,1,0,3,1,1,1,1>(i1data, odata, c3.size(), x0.size(), a5.size(), a2.size());
535   }
536   out()->add_block(odata, a5, x0, c3, a2);
537 }
538 
compute()539 void Task718::Task_local::compute() {
540   const Index a2 = b(0);
541   const Index c1 = b(1);
542   const Index a4 = b(2);
543   const Index c3 = b(3);
544   // tensor label: I162
545   std::unique_ptr<double[]> odata(new double[out()->get_size(a2, c1, a4, c3)]);
546   std::fill_n(odata.get(), out()->get_size(a2, c1, a4, c3), 0.0);
547   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a2, c1, a4, c3)]);
548   std::fill_n(odata_sorted.get(), out()->get_size(a2, c1, a4, c3), 0.0);
549   for (auto& x1 : *range_[1]) {
550     for (auto& a5 : *range_[2]) {
551       // tensor label: t2
552       std::unique_ptr<double[]> i0data = in(0)->get_block(x1, a4, c1, a5);
553       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, a4, c1, a5)]);
554       sort_indices<0,3,1,2,0,1,1,1>(i0data, i0data_sorted, x1.size(), a4.size(), c1.size(), a5.size());
555       // tensor label: I1331
556       std::unique_ptr<double[]> i1data = in(1)->get_block(a5, c3, a2, x1);
557       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(a5, c3, a2, x1)]);
558       sort_indices<3,0,1,2,0,1,1,1>(i1data, i1data_sorted, a5.size(), c3.size(), a2.size(), x1.size());
559       dgemm_("T", "N", a4.size()*c1.size(), c3.size()*a2.size(), a5.size()*x1.size(),
560              1.0, i0data_sorted, a5.size()*x1.size(), i1data_sorted, a5.size()*x1.size(),
561              1.0, odata_sorted, a4.size()*c1.size());
562     }
563   }
564   sort_indices<3,1,0,2,1,1,1,1>(odata_sorted, odata, a4.size(), c1.size(), c3.size(), a2.size());
565   out()->add_block(odata, a2, c1, a4, c3);
566 }
567 
compute()568 void Task719::Task_local::compute() {
569   const Index a5 = b(0);
570   const Index c3 = b(1);
571   const Index a2 = b(2);
572   const Index x1 = b(3);
573   // tensor label: I1331
574   std::unique_ptr<double[]> odata(new double[out()->get_size(a5, c3, a2, x1)]);
575   std::fill_n(odata.get(), out()->get_size(a5, c3, a2, x1), 0.0);
576   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a5, c3, a2, x1)]);
577   std::fill_n(odata_sorted.get(), out()->get_size(a5, c3, a2, x1), 0.0);
578   for (auto& x0 : *range_[1]) {
579     // tensor label: Gamma32
580     std::unique_ptr<double[]> i0data = in(0)->get_block(x1, x0);
581     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, x0)]);
582     sort_indices<1,0,0,1,1,1>(i0data, i0data_sorted, x1.size(), x0.size());
583     // tensor label: I1332
584     std::unique_ptr<double[]> i1data = in(1)->get_block(a5, x0, c3, a2);
585     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(a5, x0, c3, a2)]);
586     sort_indices<1,0,2,3,0,1,1,1>(i1data, i1data_sorted, a5.size(), x0.size(), c3.size(), a2.size());
587     dgemm_("T", "N", x1.size(), a5.size()*c3.size()*a2.size(), x0.size(),
588            1.0, i0data_sorted, x0.size(), i1data_sorted, x0.size(),
589            1.0, odata_sorted, x1.size());
590   }
591   sort_indices<1,2,3,0,1,1,1,1>(odata_sorted, odata, x1.size(), a5.size(), c3.size(), a2.size());
592   out()->add_block(odata, a5, c3, a2, x1);
593 }
594 
compute()595 void Task720::Task_local::compute() {
596   const Index a5 = b(0);
597   const Index x0 = b(1);
598   const Index c3 = b(2);
599   const Index a2 = b(3);
600   // tensor label: I1332
601   std::unique_ptr<double[]> odata(new double[out()->get_size(a5, x0, c3, a2)]);
602   std::fill_n(odata.get(), out()->get_size(a5, x0, c3, a2), 0.0);
603   {
604     // tensor label: v2
605     std::unique_ptr<double[]> i0data = in(0)->get_block(a5, x0, c3, a2);
606     sort_indices<0,1,2,3,1,1,1,1>(i0data, odata, a5.size(), x0.size(), c3.size(), a2.size());
607   }
608   {
609     // tensor label: v2
610     std::unique_ptr<double[]> i1data = in(0)->get_block(c3, x0, a5, a2);
611     sort_indices<2,1,0,3,1,1,-2,1>(i1data, odata, c3.size(), x0.size(), a5.size(), a2.size());
612   }
613   out()->add_block(odata, a5, x0, c3, a2);
614 }
615 
compute()616 void Task721::Task_local::compute() {
617   const Index a2 = b(0);
618   const Index c1 = b(1);
619   const Index a4 = b(2);
620   const Index c3 = b(3);
621   // tensor label: I162
622   std::unique_ptr<double[]> odata(new double[out()->get_size(a2, c1, a4, c3)]);
623   std::fill_n(odata.get(), out()->get_size(a2, c1, a4, c3), 0.0);
624   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a2, c1, a4, c3)]);
625   std::fill_n(odata_sorted.get(), out()->get_size(a2, c1, a4, c3), 0.0);
626   for (auto& x1 : *range_[1]) {
627     for (auto& a5 : *range_[2]) {
628       // tensor label: t2
629       std::unique_ptr<double[]> i0data = in(0)->get_block(x1, a5, c1, a2);
630       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, a5, c1, a2)]);
631       sort_indices<0,1,2,3,0,1,1,1>(i0data, i0data_sorted, x1.size(), a5.size(), c1.size(), a2.size());
632       // tensor label: I1334
633       std::unique_ptr<double[]> i1data = in(1)->get_block(a5, c3, a4, x1);
634       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(a5, c3, a4, x1)]);
635       sort_indices<3,0,1,2,0,1,1,1>(i1data, i1data_sorted, a5.size(), c3.size(), a4.size(), x1.size());
636       dgemm_("T", "N", c1.size()*a2.size(), c3.size()*a4.size(), a5.size()*x1.size(),
637              1.0, i0data_sorted, a5.size()*x1.size(), i1data_sorted, a5.size()*x1.size(),
638              1.0, odata_sorted, c1.size()*a2.size());
639     }
640   }
641   sort_indices<1,0,3,2,1,1,1,1>(odata_sorted, odata, c1.size(), a2.size(), c3.size(), a4.size());
642   out()->add_block(odata, a2, c1, a4, c3);
643 }
644 
compute()645 void Task722::Task_local::compute() {
646   const Index a5 = b(0);
647   const Index c3 = b(1);
648   const Index a4 = b(2);
649   const Index x1 = b(3);
650   // tensor label: I1334
651   std::unique_ptr<double[]> odata(new double[out()->get_size(a5, c3, a4, x1)]);
652   std::fill_n(odata.get(), out()->get_size(a5, c3, a4, x1), 0.0);
653   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a5, c3, a4, x1)]);
654   std::fill_n(odata_sorted.get(), out()->get_size(a5, c3, a4, x1), 0.0);
655   for (auto& x0 : *range_[1]) {
656     // tensor label: Gamma32
657     std::unique_ptr<double[]> i0data = in(0)->get_block(x1, x0);
658     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, x0)]);
659     sort_indices<1,0,0,1,1,1>(i0data, i0data_sorted, x1.size(), x0.size());
660     // tensor label: I1335
661     std::unique_ptr<double[]> i1data = in(1)->get_block(a5, x0, c3, a4);
662     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(a5, x0, c3, a4)]);
663     sort_indices<1,0,2,3,0,1,1,1>(i1data, i1data_sorted, a5.size(), x0.size(), c3.size(), a4.size());
664     dgemm_("T", "N", x1.size(), a5.size()*c3.size()*a4.size(), x0.size(),
665            1.0, i0data_sorted, x0.size(), i1data_sorted, x0.size(),
666            1.0, odata_sorted, x1.size());
667   }
668   sort_indices<1,2,3,0,1,1,1,1>(odata_sorted, odata, x1.size(), a5.size(), c3.size(), a4.size());
669   out()->add_block(odata, a5, c3, a4, x1);
670 }
671 
compute()672 void Task723::Task_local::compute() {
673   const Index a5 = b(0);
674   const Index x0 = b(1);
675   const Index c3 = b(2);
676   const Index a4 = b(3);
677   // tensor label: I1335
678   std::unique_ptr<double[]> odata(new double[out()->get_size(a5, x0, c3, a4)]);
679   std::fill_n(odata.get(), out()->get_size(a5, x0, c3, a4), 0.0);
680   {
681     // tensor label: v2
682     std::unique_ptr<double[]> i0data = in(0)->get_block(a5, x0, c3, a4);
683     sort_indices<0,1,2,3,1,1,4,1>(i0data, odata, a5.size(), x0.size(), c3.size(), a4.size());
684   }
685   {
686     // tensor label: v2
687     std::unique_ptr<double[]> i1data = in(0)->get_block(c3, x0, a5, a4);
688     sort_indices<2,1,0,3,1,1,-2,1>(i1data, odata, c3.size(), x0.size(), a5.size(), a4.size());
689   }
690   out()->add_block(odata, a5, x0, c3, a4);
691 }
692 
compute()693 void Task724::Task_local::compute() {
694   const Index a2 = b(0);
695   const Index c1 = b(1);
696   const Index a4 = b(2);
697   const Index c3 = b(3);
698   // tensor label: I162
699   std::unique_ptr<double[]> odata(new double[out()->get_size(a2, c1, a4, c3)]);
700   std::fill_n(odata.get(), out()->get_size(a2, c1, a4, c3), 0.0);
701   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a2, c1, a4, c3)]);
702   std::fill_n(odata_sorted.get(), out()->get_size(a2, c1, a4, c3), 0.0);
703   for (auto& x1 : *range_[1]) {
704     for (auto& a5 : *range_[2]) {
705       // tensor label: t2
706       std::unique_ptr<double[]> i0data = in(0)->get_block(x1, a2, c1, a5);
707       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, a2, c1, a5)]);
708       sort_indices<0,3,1,2,0,1,1,1>(i0data, i0data_sorted, x1.size(), a2.size(), c1.size(), a5.size());
709       // tensor label: I1337
710       std::unique_ptr<double[]> i1data = in(1)->get_block(a5, c3, a4, x1);
711       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(a5, c3, a4, x1)]);
712       sort_indices<3,0,1,2,0,1,1,1>(i1data, i1data_sorted, a5.size(), c3.size(), a4.size(), x1.size());
713       dgemm_("T", "N", a2.size()*c1.size(), c3.size()*a4.size(), a5.size()*x1.size(),
714              1.0, i0data_sorted, a5.size()*x1.size(), i1data_sorted, a5.size()*x1.size(),
715              1.0, odata_sorted, a2.size()*c1.size());
716     }
717   }
718   sort_indices<0,1,3,2,1,1,1,1>(odata_sorted, odata, a2.size(), c1.size(), c3.size(), a4.size());
719   out()->add_block(odata, a2, c1, a4, c3);
720 }
721 
compute()722 void Task725::Task_local::compute() {
723   const Index a5 = b(0);
724   const Index c3 = b(1);
725   const Index a4 = b(2);
726   const Index x1 = b(3);
727   // tensor label: I1337
728   std::unique_ptr<double[]> odata(new double[out()->get_size(a5, c3, a4, x1)]);
729   std::fill_n(odata.get(), out()->get_size(a5, c3, a4, x1), 0.0);
730   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a5, c3, a4, x1)]);
731   std::fill_n(odata_sorted.get(), out()->get_size(a5, c3, a4, x1), 0.0);
732   for (auto& x0 : *range_[1]) {
733     // tensor label: Gamma32
734     std::unique_ptr<double[]> i0data = in(0)->get_block(x1, x0);
735     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, x0)]);
736     sort_indices<1,0,0,1,1,1>(i0data, i0data_sorted, x1.size(), x0.size());
737     // tensor label: I1338
738     std::unique_ptr<double[]> i1data = in(1)->get_block(a5, x0, c3, a4);
739     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(a5, x0, c3, a4)]);
740     sort_indices<1,0,2,3,0,1,1,1>(i1data, i1data_sorted, a5.size(), x0.size(), c3.size(), a4.size());
741     dgemm_("T", "N", x1.size(), a5.size()*c3.size()*a4.size(), x0.size(),
742            1.0, i0data_sorted, x0.size(), i1data_sorted, x0.size(),
743            1.0, odata_sorted, x1.size());
744   }
745   sort_indices<1,2,3,0,1,1,1,1>(odata_sorted, odata, x1.size(), a5.size(), c3.size(), a4.size());
746   out()->add_block(odata, a5, c3, a4, x1);
747 }
748 
compute()749 void Task726::Task_local::compute() {
750   const Index a5 = b(0);
751   const Index x0 = b(1);
752   const Index c3 = b(2);
753   const Index a4 = b(3);
754   // tensor label: I1338
755   std::unique_ptr<double[]> odata(new double[out()->get_size(a5, x0, c3, a4)]);
756   std::fill_n(odata.get(), out()->get_size(a5, x0, c3, a4), 0.0);
757   {
758     // tensor label: v2
759     std::unique_ptr<double[]> i0data = in(0)->get_block(a5, x0, c3, a4);
760     sort_indices<0,1,2,3,1,1,-2,1>(i0data, odata, a5.size(), x0.size(), c3.size(), a4.size());
761   }
762   {
763     // tensor label: v2
764     std::unique_ptr<double[]> i1data = in(0)->get_block(c3, x0, a5, a4);
765     sort_indices<2,1,0,3,1,1,1,1>(i1data, odata, c3.size(), x0.size(), a5.size(), a4.size());
766   }
767   out()->add_block(odata, a5, x0, c3, a4);
768 }
769 
compute()770 void Task727::Task_local::compute() {
771   const Index c2 = b(0);
772   const Index a3 = b(1);
773   const Index x0 = b(2);
774   const Index a1 = b(3);
775   // tensor label: r
776   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, a3, x0, a1)]);
777   std::fill_n(odata.get(), out()->get_size(c2, a3, x0, a1), 0.0);
778   {
779     // tensor label: I194
780     std::unique_ptr<double[]> i0data = in(0)->get_block(a3, c2, x0, a1);
781     sort_indices<1,0,2,3,1,1,1,1>(i0data, odata, a3.size(), c2.size(), x0.size(), a1.size());
782   }
783   out()->add_block(odata, c2, a3, x0, a1);
784 }
785 
compute()786 void Task728::Task_local::compute() {
787   const Index a3 = b(0);
788   const Index c2 = b(1);
789   const Index x0 = b(2);
790   const Index a1 = b(3);
791   // tensor label: I194
792   std::unique_ptr<double[]> odata(new double[out()->get_size(a3, c2, x0, a1)]);
793   std::fill_n(odata.get(), out()->get_size(a3, c2, x0, a1), 0.0);
794   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a3, c2, x0, a1)]);
795   std::fill_n(odata_sorted.get(), out()->get_size(a3, c2, x0, a1), 0.0);
796   for (auto& x1 : *range_[1]) {
797     // tensor label: h1
798     std::unique_ptr<double[]> i0data = in(0)->get_block(x1, a1);
799     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, a1)]);
800     sort_indices<0,1,0,1,1,1>(i0data, i0data_sorted, x1.size(), a1.size());
801     // tensor label: I195
802     std::unique_ptr<double[]> i1data = in(1)->get_block(a3, c2, x1, x0);
803     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(a3, c2, x1, x0)]);
804     sort_indices<2,0,1,3,0,1,1,1>(i1data, i1data_sorted, a3.size(), c2.size(), x1.size(), x0.size());
805     dgemm_("T", "N", a1.size(), a3.size()*c2.size()*x0.size(), x1.size(),
806            1.0, i0data_sorted, x1.size(), i1data_sorted, x1.size(),
807            1.0, odata_sorted, a1.size());
808   }
809   sort_indices<1,2,3,0,1,1,1,1>(odata_sorted, odata, a1.size(), a3.size(), c2.size(), x0.size());
810   out()->add_block(odata, a3, c2, x0, a1);
811 }
812 
compute()813 void Task729::Task_local::compute() {
814   const Index a3 = b(0);
815   const Index c2 = b(1);
816   const Index x1 = b(2);
817   const Index x0 = b(3);
818   // tensor label: I195
819   std::unique_ptr<double[]> odata(new double[out()->get_size(a3, c2, x1, x0)]);
820   std::fill_n(odata.get(), out()->get_size(a3, c2, x1, x0), 0.0);
821   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a3, c2, x1, x0)]);
822   std::fill_n(odata_sorted.get(), out()->get_size(a3, c2, x1, x0), 0.0);
823   for (auto& x3 : *range_[1]) {
824     for (auto& x2 : *range_[1]) {
825       // tensor label: Gamma29
826       std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x2, x1, x0);
827       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x3, x2, x1, x0)]);
828       sort_indices<0,1,2,3,0,1,1,1>(i0data, i0data_sorted, x3.size(), x2.size(), x1.size(), x0.size());
829       // tensor label: I196
830       std::unique_ptr<double[]> i1data = in(1)->get_block(x3, a3, c2, x2);
831       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x3, a3, c2, x2)]);
832       sort_indices<0,3,1,2,0,1,1,1>(i1data, i1data_sorted, x3.size(), a3.size(), c2.size(), x2.size());
833       dgemm_("T", "N", x1.size()*x0.size(), a3.size()*c2.size(), x3.size()*x2.size(),
834              1.0, i0data_sorted, x3.size()*x2.size(), i1data_sorted, x3.size()*x2.size(),
835              1.0, odata_sorted, x1.size()*x0.size());
836     }
837   }
838   sort_indices<2,3,0,1,1,1,1,1>(odata_sorted, odata, x1.size(), x0.size(), a3.size(), c2.size());
839   out()->add_block(odata, a3, c2, x1, x0);
840 }
841 
compute()842 void Task730::Task_local::compute() {
843   const Index x3 = b(0);
844   const Index a3 = b(1);
845   const Index c2 = b(2);
846   const Index x2 = b(3);
847   // tensor label: I196
848   std::unique_ptr<double[]> odata(new double[out()->get_size(x3, a3, c2, x2)]);
849   std::fill_n(odata.get(), out()->get_size(x3, a3, c2, x2), 0.0);
850   {
851     // tensor label: t2
852     std::unique_ptr<double[]> i0data = in(0)->get_block(x3, a3, c2, x2);
853     sort_indices<0,1,2,3,1,1,-1,1>(i0data, odata, x3.size(), a3.size(), c2.size(), x2.size());
854   }
855   {
856     // tensor label: t2
857     std::unique_ptr<double[]> i1data = in(0)->get_block(c2, a3, x3, x2);
858     sort_indices<2,1,0,3,1,1,2,1>(i1data, odata, c2.size(), a3.size(), x3.size(), x2.size());
859   }
860   out()->add_block(odata, x3, a3, c2, x2);
861 }
862 
compute()863 void Task731::Task_local::compute() {
864   const Index a3 = b(0);
865   const Index c2 = b(1);
866   const Index x0 = b(2);
867   const Index a1 = b(3);
868   // tensor label: I194
869   std::unique_ptr<double[]> odata(new double[out()->get_size(a3, c2, x0, a1)]);
870   std::fill_n(odata.get(), out()->get_size(a3, c2, x0, a1), 0.0);
871   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a3, c2, x0, a1)]);
872   std::fill_n(odata_sorted.get(), out()->get_size(a3, c2, x0, a1), 0.0);
873   for (auto& x1 : *range_[1]) {
874     // tensor label: h1
875     std::unique_ptr<double[]> i0data = in(0)->get_block(x1, a3);
876     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, a3)]);
877     sort_indices<0,1,0,1,1,1>(i0data, i0data_sorted, x1.size(), a3.size());
878     // tensor label: I198
879     std::unique_ptr<double[]> i1data = in(1)->get_block(a1, c2, x0, x1);
880     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(a1, c2, x0, x1)]);
881     sort_indices<3,0,1,2,0,1,1,1>(i1data, i1data_sorted, a1.size(), c2.size(), x0.size(), x1.size());
882     dgemm_("T", "N", a3.size(), a1.size()*c2.size()*x0.size(), x1.size(),
883            1.0, i0data_sorted, x1.size(), i1data_sorted, x1.size(),
884            1.0, odata_sorted, a3.size());
885   }
886   sort_indices<0,2,3,1,1,1,1,1>(odata_sorted, odata, a3.size(), a1.size(), c2.size(), x0.size());
887   out()->add_block(odata, a3, c2, x0, a1);
888 }
889 
compute()890 void Task732::Task_local::compute() {
891   const Index a1 = b(0);
892   const Index c2 = b(1);
893   const Index x0 = b(2);
894   const Index x1 = b(3);
895   // tensor label: I198
896   std::unique_ptr<double[]> odata(new double[out()->get_size(a1, c2, x0, x1)]);
897   std::fill_n(odata.get(), out()->get_size(a1, c2, x0, x1), 0.0);
898   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a1, c2, x0, x1)]);
899   std::fill_n(odata_sorted.get(), out()->get_size(a1, c2, x0, x1), 0.0);
900   for (auto& x3 : *range_[1]) {
901     for (auto& x2 : *range_[1]) {
902       // tensor label: Gamma27
903       std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x0, x1, x2);
904       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x3, x0, x1, x2)]);
905       sort_indices<0,3,1,2,0,1,1,1>(i0data, i0data_sorted, x3.size(), x0.size(), x1.size(), x2.size());
906       // tensor label: t2
907       std::unique_ptr<double[]> i1data = in(1)->get_block(x3, a1, c2, x2);
908       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x3, a1, c2, x2)]);
909       sort_indices<0,3,1,2,0,1,1,1>(i1data, i1data_sorted, x3.size(), a1.size(), c2.size(), x2.size());
910       dgemm_("T", "N", x0.size()*x1.size(), a1.size()*c2.size(), x3.size()*x2.size(),
911              1.0, i0data_sorted, x3.size()*x2.size(), i1data_sorted, x3.size()*x2.size(),
912              1.0, odata_sorted, x0.size()*x1.size());
913     }
914   }
915   sort_indices<2,3,0,1,1,1,1,1>(odata_sorted, odata, x0.size(), x1.size(), a1.size(), c2.size());
916   out()->add_block(odata, a1, c2, x0, x1);
917 }
918 
compute()919 void Task733::Task_local::compute() {
920   const Index a1 = b(0);
921   const Index c2 = b(1);
922   const Index x0 = b(2);
923   const Index x1 = b(3);
924   // tensor label: I198
925   std::unique_ptr<double[]> odata(new double[out()->get_size(a1, c2, x0, x1)]);
926   std::fill_n(odata.get(), out()->get_size(a1, c2, x0, x1), 0.0);
927   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a1, c2, x0, x1)]);
928   std::fill_n(odata_sorted.get(), out()->get_size(a1, c2, x0, x1), 0.0);
929   for (auto& x3 : *range_[1]) {
930     for (auto& x2 : *range_[1]) {
931       // tensor label: Gamma29
932       std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x2, x1, x0);
933       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x3, x2, x1, x0)]);
934       sort_indices<0,1,2,3,0,1,1,1>(i0data, i0data_sorted, x3.size(), x2.size(), x1.size(), x0.size());
935       // tensor label: t2
936       std::unique_ptr<double[]> i1data = in(1)->get_block(c2, a1, x3, x2);
937       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c2, a1, x3, x2)]);
938       sort_indices<2,3,0,1,0,1,-1,1>(i1data, i1data_sorted, c2.size(), a1.size(), x3.size(), x2.size());
939       dgemm_("T", "N", x1.size()*x0.size(), c2.size()*a1.size(), x3.size()*x2.size(),
940              1.0, i0data_sorted, x3.size()*x2.size(), i1data_sorted, x3.size()*x2.size(),
941              1.0, odata_sorted, x1.size()*x0.size());
942     }
943   }
944   sort_indices<3,2,1,0,1,1,1,1>(odata_sorted, odata, x1.size(), x0.size(), c2.size(), a1.size());
945   out()->add_block(odata, a1, c2, x0, x1);
946 }
947 
compute()948 void Task734::Task_local::compute() {
949   const Index a3 = b(0);
950   const Index c2 = b(1);
951   const Index x0 = b(2);
952   const Index a1 = b(3);
953   // tensor label: I194
954   std::unique_ptr<double[]> odata(new double[out()->get_size(a3, c2, x0, a1)]);
955   std::fill_n(odata.get(), out()->get_size(a3, c2, x0, a1), 0.0);
956   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a3, c2, x0, a1)]);
957   std::fill_n(odata_sorted.get(), out()->get_size(a3, c2, x0, a1), 0.0);
958   // tensor label: h1
959   std::unique_ptr<double[]> i0data = in(0)->get_block(c2, a1);
960   std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c2, a1)]);
961   sort_indices<0,1,0,1,1,1>(i0data, i0data_sorted, c2.size(), a1.size());
962   // tensor label: I207
963   std::unique_ptr<double[]> i1data = in(1)->get_block(a3, x0);
964   std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(a3, x0)]);
965   sort_indices<0,1,0,1,1,1>(i1data, i1data_sorted, a3.size(), x0.size());
966   dgemm_("T", "N", c2.size()*a1.size(), a3.size()*x0.size(), 1,
967          1.0, i0data_sorted, 1, i1data_sorted, 1,
968          1.0, odata_sorted, c2.size()*a1.size());
969   sort_indices<2,0,3,1,1,1,1,1>(odata_sorted, odata, c2.size(), a1.size(), a3.size(), x0.size());
970   out()->add_block(odata, a3, c2, x0, a1);
971 }
972 
compute()973 void Task735::Task_local::compute() {
974   const Index a3 = b(0);
975   const Index x0 = b(1);
976   // tensor label: I207
977   std::unique_ptr<double[]> odata(new double[out()->get_size(a3, x0)]);
978   std::fill_n(odata.get(), out()->get_size(a3, x0), 0.0);
979   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a3, x0)]);
980   std::fill_n(odata_sorted.get(), out()->get_size(a3, x0), 0.0);
981   for (auto& x3 : *range_[1]) {
982     for (auto& x2 : *range_[1]) {
983       for (auto& x1 : *range_[1]) {
984         // tensor label: Gamma51
985         std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x0, x2, x1);
986         std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x3, x0, x2, x1)]);
987         sort_indices<0,2,3,1,0,1,1,1>(i0data, i0data_sorted, x3.size(), x0.size(), x2.size(), x1.size());
988         // tensor label: t2
989         std::unique_ptr<double[]> i1data = in(1)->get_block(x3, a3, x2, x1);
990         std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x3, a3, x2, x1)]);
991         sort_indices<0,2,3,1,0,1,-1,1>(i1data, i1data_sorted, x3.size(), a3.size(), x2.size(), x1.size());
992         dgemm_("T", "N", x0.size(), a3.size(), x3.size()*x2.size()*x1.size(),
993                1.0, i0data_sorted, x3.size()*x2.size()*x1.size(), i1data_sorted, x3.size()*x2.size()*x1.size(),
994                1.0, odata_sorted, x0.size());
995       }
996     }
997   }
998   sort_indices<1,0,1,1,1,1>(odata_sorted, odata, x0.size(), a3.size());
999   out()->add_block(odata, a3, x0);
1000 }
1001 
compute()1002 void Task736::Task_local::compute() {
1003   const Index a3 = b(0);
1004   const Index c2 = b(1);
1005   const Index x0 = b(2);
1006   const Index a1 = b(3);
1007   // tensor label: I194
1008   std::unique_ptr<double[]> odata(new double[out()->get_size(a3, c2, x0, a1)]);
1009   std::fill_n(odata.get(), out()->get_size(a3, c2, x0, a1), 0.0);
1010   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a3, c2, x0, a1)]);
1011   std::fill_n(odata_sorted.get(), out()->get_size(a3, c2, x0, a1), 0.0);
1012   // tensor label: h1
1013   std::unique_ptr<double[]> i0data = in(0)->get_block(c2, a3);
1014   std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c2, a3)]);
1015   sort_indices<0,1,0,1,1,1>(i0data, i0data_sorted, c2.size(), a3.size());
1016   // tensor label: I210
1017   std::unique_ptr<double[]> i1data = in(1)->get_block(a1, x0);
1018   std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(a1, x0)]);
1019   sort_indices<0,1,0,1,1,1>(i1data, i1data_sorted, a1.size(), x0.size());
1020   dgemm_("T", "N", c2.size()*a3.size(), a1.size()*x0.size(), 1,
1021          1.0, i0data_sorted, 1, i1data_sorted, 1,
1022          1.0, odata_sorted, c2.size()*a3.size());
1023   sort_indices<1,0,3,2,1,1,1,1>(odata_sorted, odata, c2.size(), a3.size(), a1.size(), x0.size());
1024   out()->add_block(odata, a3, c2, x0, a1);
1025 }
1026 
compute()1027 void Task737::Task_local::compute() {
1028   const Index a1 = b(0);
1029   const Index x0 = b(1);
1030   // tensor label: I210
1031   std::unique_ptr<double[]> odata(new double[out()->get_size(a1, x0)]);
1032   std::fill_n(odata.get(), out()->get_size(a1, x0), 0.0);
1033   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a1, x0)]);
1034   std::fill_n(odata_sorted.get(), out()->get_size(a1, x0), 0.0);
1035   for (auto& x3 : *range_[1]) {
1036     for (auto& x2 : *range_[1]) {
1037       for (auto& x1 : *range_[1]) {
1038         // tensor label: Gamma51
1039         std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x0, x2, x1);
1040         std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x3, x0, x2, x1)]);
1041         sort_indices<0,2,3,1,0,1,1,1>(i0data, i0data_sorted, x3.size(), x0.size(), x2.size(), x1.size());
1042         // tensor label: t2
1043         std::unique_ptr<double[]> i1data = in(1)->get_block(x3, a1, x2, x1);
1044         std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x3, a1, x2, x1)]);
1045         sort_indices<0,2,3,1,0,1,2,1>(i1data, i1data_sorted, x3.size(), a1.size(), x2.size(), x1.size());
1046         dgemm_("T", "N", x0.size(), a1.size(), x3.size()*x2.size()*x1.size(),
1047                1.0, i0data_sorted, x3.size()*x2.size()*x1.size(), i1data_sorted, x3.size()*x2.size()*x1.size(),
1048                1.0, odata_sorted, x0.size());
1049       }
1050     }
1051   }
1052   sort_indices<1,0,1,1,1,1>(odata_sorted, odata, x0.size(), a1.size());
1053   out()->add_block(odata, a1, x0);
1054 }
1055 
compute()1056 void Task738::Task_local::compute() {
1057   const Index a3 = b(0);
1058   const Index c2 = b(1);
1059   const Index x0 = b(2);
1060   const Index a1 = b(3);
1061   // tensor label: I194
1062   std::unique_ptr<double[]> odata(new double[out()->get_size(a3, c2, x0, a1)]);
1063   std::fill_n(odata.get(), out()->get_size(a3, c2, x0, a1), 0.0);
1064   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a3, c2, x0, a1)]);
1065   std::fill_n(odata_sorted.get(), out()->get_size(a3, c2, x0, a1), 0.0);
1066   for (auto& c4 : *range_[0]) {
1067     // tensor label: t2
1068     std::unique_ptr<double[]> i0data = in(0)->get_block(c2, a3, c4, a1);
1069     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c2, a3, c4, a1)]);
1070     sort_indices<2,0,1,3,0,1,1,1>(i0data, i0data_sorted, c2.size(), a3.size(), c4.size(), a1.size());
1071     // tensor label: I213
1072     std::unique_ptr<double[]> i1data = in(1)->get_block(c4, x0);
1073     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c4, x0)]);
1074     sort_indices<0,1,0,1,1,1>(i1data, i1data_sorted, c4.size(), x0.size());
1075     dgemm_("T", "N", c2.size()*a3.size()*a1.size(), x0.size(), c4.size(),
1076            1.0, i0data_sorted, c4.size(), i1data_sorted, c4.size(),
1077            1.0, odata_sorted, c2.size()*a3.size()*a1.size());
1078   }
1079   sort_indices<1,0,3,2,1,1,1,1>(odata_sorted, odata, c2.size(), a3.size(), a1.size(), x0.size());
1080   out()->add_block(odata, a3, c2, x0, a1);
1081 }
1082 
compute()1083 void Task739::Task_local::compute() {
1084   const Index c4 = b(0);
1085   const Index x0 = b(1);
1086   // tensor label: I213
1087   std::unique_ptr<double[]> odata(new double[out()->get_size(c4, x0)]);
1088   std::fill_n(odata.get(), out()->get_size(c4, x0), 0.0);
1089   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c4, x0)]);
1090   std::fill_n(odata_sorted.get(), out()->get_size(c4, x0), 0.0);
1091   for (auto& x1 : *range_[1]) {
1092     // tensor label: Gamma32
1093     std::unique_ptr<double[]> i0data = in(0)->get_block(x1, x0);
1094     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, x0)]);
1095     sort_indices<0,1,0,1,1,1>(i0data, i0data_sorted, x1.size(), x0.size());
1096     // tensor label: h1
1097     std::unique_ptr<double[]> i1data = in(1)->get_block(x1, c4);
1098     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x1, c4)]);
1099     sort_indices<0,1,0,1,-4,1>(i1data, i1data_sorted, x1.size(), c4.size());
1100     dgemm_("T", "N", x0.size(), c4.size(), x1.size(),
1101            1.0, i0data_sorted, x1.size(), i1data_sorted, x1.size(),
1102            1.0, odata_sorted, x0.size());
1103   }
1104   sort_indices<1,0,1,1,1,1>(odata_sorted, odata, x0.size(), c4.size());
1105   out()->add_block(odata, c4, x0);
1106 }
1107 
compute()1108 void Task740::Task_local::compute() {
1109   const Index c4 = b(0);
1110   const Index x0 = b(1);
1111   // tensor label: I213
1112   std::unique_ptr<double[]> odata(new double[out()->get_size(c4, x0)]);
1113   std::fill_n(odata.get(), out()->get_size(c4, x0), 0.0);
1114   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c4, x0)]);
1115   std::fill_n(odata_sorted.get(), out()->get_size(c4, x0), 0.0);
1116   for (auto& x3 : *range_[1]) {
1117     for (auto& x2 : *range_[1]) {
1118       for (auto& x1 : *range_[1]) {
1119         // tensor label: Gamma51
1120         std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x0, x2, x1);
1121         std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x3, x0, x2, x1)]);
1122         sort_indices<0,2,3,1,0,1,1,1>(i0data, i0data_sorted, x3.size(), x0.size(), x2.size(), x1.size());
1123         // tensor label: v2
1124         std::unique_ptr<double[]> i1data = in(1)->get_block(x3, c4, x2, x1);
1125         std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x3, c4, x2, x1)]);
1126         sort_indices<0,2,3,1,0,1,-2,1>(i1data, i1data_sorted, x3.size(), c4.size(), x2.size(), x1.size());
1127         dgemm_("T", "N", x0.size(), c4.size(), x3.size()*x2.size()*x1.size(),
1128                1.0, i0data_sorted, x3.size()*x2.size()*x1.size(), i1data_sorted, x3.size()*x2.size()*x1.size(),
1129                1.0, odata_sorted, x0.size());
1130       }
1131     }
1132   }
1133   sort_indices<1,0,1,1,1,1>(odata_sorted, odata, x0.size(), c4.size());
1134   out()->add_block(odata, c4, x0);
1135 }
1136 
compute()1137 void Task741::Task_local::compute() {
1138   const Index c4 = b(0);
1139   const Index x0 = b(1);
1140   // tensor label: I213
1141   std::unique_ptr<double[]> odata(new double[out()->get_size(c4, x0)]);
1142   std::fill_n(odata.get(), out()->get_size(c4, x0), 0.0);
1143   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c4, x0)]);
1144   std::fill_n(odata_sorted.get(), out()->get_size(c4, x0), 0.0);
1145   for (auto& x3 : *range_[1]) {
1146     for (auto& x2 : *range_[1]) {
1147       for (auto& x1 : *range_[1]) {
1148         // tensor label: Gamma29
1149         std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x2, x1, x0);
1150         std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x3, x2, x1, x0)]);
1151         sort_indices<0,1,2,3,0,1,1,1>(i0data, i0data_sorted, x3.size(), x2.size(), x1.size(), x0.size());
1152         // tensor label: v2
1153         std::unique_ptr<double[]> i1data = in(1)->get_block(x3, x2, x1, c4);
1154         std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x3, x2, x1, c4)]);
1155         sort_indices<0,1,2,3,0,1,-2,1>(i1data, i1data_sorted, x3.size(), x2.size(), x1.size(), c4.size());
1156         dgemm_("T", "N", x0.size(), c4.size(), x3.size()*x2.size()*x1.size(),
1157                1.0, i0data_sorted, x3.size()*x2.size()*x1.size(), i1data_sorted, x3.size()*x2.size()*x1.size(),
1158                1.0, odata_sorted, x0.size());
1159       }
1160     }
1161   }
1162   sort_indices<1,0,1,1,1,1>(odata_sorted, odata, x0.size(), c4.size());
1163   out()->add_block(odata, c4, x0);
1164 }
1165 
compute()1166 void Task742::Task_local::compute() {
1167   const Index a3 = b(0);
1168   const Index c2 = b(1);
1169   const Index x0 = b(2);
1170   const Index a1 = b(3);
1171   // tensor label: I194
1172   std::unique_ptr<double[]> odata(new double[out()->get_size(a3, c2, x0, a1)]);
1173   std::fill_n(odata.get(), out()->get_size(a3, c2, x0, a1), 0.0);
1174   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a3, c2, x0, a1)]);
1175   std::fill_n(odata_sorted.get(), out()->get_size(a3, c2, x0, a1), 0.0);
1176   for (auto& c4 : *range_[0]) {
1177     // tensor label: t2
1178     std::unique_ptr<double[]> i0data = in(0)->get_block(c2, a1, c4, a3);
1179     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c2, a1, c4, a3)]);
1180     sort_indices<2,0,1,3,0,1,1,1>(i0data, i0data_sorted, c2.size(), a1.size(), c4.size(), a3.size());
1181     // tensor label: I216
1182     std::unique_ptr<double[]> i1data = in(1)->get_block(c4, x0);
1183     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c4, x0)]);
1184     sort_indices<0,1,0,1,1,1>(i1data, i1data_sorted, c4.size(), x0.size());
1185     dgemm_("T", "N", c2.size()*a1.size()*a3.size(), x0.size(), c4.size(),
1186            1.0, i0data_sorted, c4.size(), i1data_sorted, c4.size(),
1187            1.0, odata_sorted, c2.size()*a1.size()*a3.size());
1188   }
1189   sort_indices<2,0,3,1,1,1,1,1>(odata_sorted, odata, c2.size(), a1.size(), a3.size(), x0.size());
1190   out()->add_block(odata, a3, c2, x0, a1);
1191 }
1192 
compute()1193 void Task743::Task_local::compute() {
1194   const Index c4 = b(0);
1195   const Index x0 = b(1);
1196   // tensor label: I216
1197   std::unique_ptr<double[]> odata(new double[out()->get_size(c4, x0)]);
1198   std::fill_n(odata.get(), out()->get_size(c4, x0), 0.0);
1199   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c4, x0)]);
1200   std::fill_n(odata_sorted.get(), out()->get_size(c4, x0), 0.0);
1201   for (auto& x1 : *range_[1]) {
1202     // tensor label: Gamma32
1203     std::unique_ptr<double[]> i0data = in(0)->get_block(x1, x0);
1204     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, x0)]);
1205     sort_indices<0,1,0,1,1,1>(i0data, i0data_sorted, x1.size(), x0.size());
1206     // tensor label: h1
1207     std::unique_ptr<double[]> i1data = in(1)->get_block(x1, c4);
1208     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x1, c4)]);
1209     sort_indices<0,1,0,1,2,1>(i1data, i1data_sorted, x1.size(), c4.size());
1210     dgemm_("T", "N", x0.size(), c4.size(), x1.size(),
1211            1.0, i0data_sorted, x1.size(), i1data_sorted, x1.size(),
1212            1.0, odata_sorted, x0.size());
1213   }
1214   sort_indices<1,0,1,1,1,1>(odata_sorted, odata, x0.size(), c4.size());
1215   out()->add_block(odata, c4, x0);
1216 }
1217 
compute()1218 void Task744::Task_local::compute() {
1219   const Index c4 = b(0);
1220   const Index x0 = b(1);
1221   // tensor label: I216
1222   std::unique_ptr<double[]> odata(new double[out()->get_size(c4, x0)]);
1223   std::fill_n(odata.get(), out()->get_size(c4, x0), 0.0);
1224   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c4, x0)]);
1225   std::fill_n(odata_sorted.get(), out()->get_size(c4, x0), 0.0);
1226   for (auto& x3 : *range_[1]) {
1227     for (auto& x2 : *range_[1]) {
1228       for (auto& x1 : *range_[1]) {
1229         // tensor label: Gamma51
1230         std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x0, x2, x1);
1231         std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x3, x0, x2, x1)]);
1232         sort_indices<0,2,3,1,0,1,1,1>(i0data, i0data_sorted, x3.size(), x0.size(), x2.size(), x1.size());
1233         // tensor label: v2
1234         std::unique_ptr<double[]> i1data = in(1)->get_block(x3, c4, x2, x1);
1235         std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x3, c4, x2, x1)]);
1236         sort_indices<0,2,3,1,0,1,1,1>(i1data, i1data_sorted, x3.size(), c4.size(), x2.size(), x1.size());
1237         dgemm_("T", "N", x0.size(), c4.size(), x3.size()*x2.size()*x1.size(),
1238                1.0, i0data_sorted, x3.size()*x2.size()*x1.size(), i1data_sorted, x3.size()*x2.size()*x1.size(),
1239                1.0, odata_sorted, x0.size());
1240       }
1241     }
1242   }
1243   sort_indices<1,0,1,1,1,1>(odata_sorted, odata, x0.size(), c4.size());
1244   out()->add_block(odata, c4, x0);
1245 }
1246 
compute()1247 void Task745::Task_local::compute() {
1248   const Index c4 = b(0);
1249   const Index x0 = b(1);
1250   // tensor label: I216
1251   std::unique_ptr<double[]> odata(new double[out()->get_size(c4, x0)]);
1252   std::fill_n(odata.get(), out()->get_size(c4, x0), 0.0);
1253   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c4, x0)]);
1254   std::fill_n(odata_sorted.get(), out()->get_size(c4, x0), 0.0);
1255   for (auto& x3 : *range_[1]) {
1256     for (auto& x2 : *range_[1]) {
1257       for (auto& x1 : *range_[1]) {
1258         // tensor label: Gamma29
1259         std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x2, x1, x0);
1260         std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x3, x2, x1, x0)]);
1261         sort_indices<0,1,2,3,0,1,1,1>(i0data, i0data_sorted, x3.size(), x2.size(), x1.size(), x0.size());
1262         // tensor label: v2
1263         std::unique_ptr<double[]> i1data = in(1)->get_block(x3, x2, x1, c4);
1264         std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x3, x2, x1, c4)]);
1265         sort_indices<0,1,2,3,0,1,1,1>(i1data, i1data_sorted, x3.size(), x2.size(), x1.size(), c4.size());
1266         dgemm_("T", "N", x0.size(), c4.size(), x3.size()*x2.size()*x1.size(),
1267                1.0, i0data_sorted, x3.size()*x2.size()*x1.size(), i1data_sorted, x3.size()*x2.size()*x1.size(),
1268                1.0, odata_sorted, x0.size());
1269       }
1270     }
1271   }
1272   sort_indices<1,0,1,1,1,1>(odata_sorted, odata, x0.size(), c4.size());
1273   out()->add_block(odata, c4, x0);
1274 }
1275 
compute()1276 void Task746::Task_local::compute() {
1277   const Index a3 = b(0);
1278   const Index c2 = b(1);
1279   const Index x0 = b(2);
1280   const Index a1 = b(3);
1281   // tensor label: I194
1282   std::unique_ptr<double[]> odata(new double[out()->get_size(a3, c2, x0, a1)]);
1283   std::fill_n(odata.get(), out()->get_size(a3, c2, x0, a1), 0.0);
1284   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a3, c2, x0, a1)]);
1285   std::fill_n(odata_sorted.get(), out()->get_size(a3, c2, x0, a1), 0.0);
1286   for (auto& x1 : *range_[1]) {
1287     // tensor label: Gamma32
1288     std::unique_ptr<double[]> i0data = in(0)->get_block(x1, x0);
1289     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, x0)]);
1290     sort_indices<0,1,0,1,1,1>(i0data, i0data_sorted, x1.size(), x0.size());
1291     // tensor label: I219
1292     std::unique_ptr<double[]> i1data = in(1)->get_block(c2, x1, a3, a1);
1293     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c2, x1, a3, a1)]);
1294     sort_indices<1,0,2,3,0,1,1,1>(i1data, i1data_sorted, c2.size(), x1.size(), a3.size(), a1.size());
1295     dgemm_("T", "N", x0.size(), c2.size()*a3.size()*a1.size(), x1.size(),
1296            1.0, i0data_sorted, x1.size(), i1data_sorted, x1.size(),
1297            1.0, odata_sorted, x0.size());
1298   }
1299   sort_indices<2,1,0,3,1,1,1,1>(odata_sorted, odata, x0.size(), c2.size(), a3.size(), a1.size());
1300   out()->add_block(odata, a3, c2, x0, a1);
1301 }
1302 
compute()1303 void Task747::Task_local::compute() {
1304   const Index c2 = b(0);
1305   const Index x1 = b(1);
1306   const Index a3 = b(2);
1307   const Index a1 = b(3);
1308   // tensor label: I219
1309   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, x1, a3, a1)]);
1310   std::fill_n(odata.get(), out()->get_size(c2, x1, a3, a1), 0.0);
1311   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, x1, a3, a1)]);
1312   std::fill_n(odata_sorted.get(), out()->get_size(c2, x1, a3, a1), 0.0);
1313   for (auto& c4 : *range_[0]) {
1314     // tensor label: t2
1315     std::unique_ptr<double[]> i0data = in(0)->get_block(x1, a3, c4, a1);
1316     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, a3, c4, a1)]);
1317     sort_indices<2,0,1,3,0,1,1,1>(i0data, i0data_sorted, x1.size(), a3.size(), c4.size(), a1.size());
1318     // tensor label: h1
1319     std::unique_ptr<double[]> i1data = in(1)->get_block(c2, c4);
1320     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c2, c4)]);
1321     sort_indices<1,0,0,1,1,1>(i1data, i1data_sorted, c2.size(), c4.size());
1322     dgemm_("T", "N", x1.size()*a3.size()*a1.size(), c2.size(), c4.size(),
1323            1.0, i0data_sorted, c4.size(), i1data_sorted, c4.size(),
1324            1.0, odata_sorted, x1.size()*a3.size()*a1.size());
1325   }
1326   sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, x1.size(), a3.size(), a1.size(), c2.size());
1327   out()->add_block(odata, c2, x1, a3, a1);
1328 }
1329 
compute()1330 void Task748::Task_local::compute() {
1331   const Index c2 = b(0);
1332   const Index x1 = b(1);
1333   const Index a3 = b(2);
1334   const Index a1 = b(3);
1335   // tensor label: I219
1336   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, x1, a3, a1)]);
1337   std::fill_n(odata.get(), out()->get_size(c2, x1, a3, a1), 0.0);
1338   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, x1, a3, a1)]);
1339   std::fill_n(odata_sorted.get(), out()->get_size(c2, x1, a3, a1), 0.0);
1340   for (auto& c4 : *range_[0]) {
1341     // tensor label: t2
1342     std::unique_ptr<double[]> i0data = in(0)->get_block(x1, a1, c4, a3);
1343     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, a1, c4, a3)]);
1344     sort_indices<2,0,1,3,0,1,1,1>(i0data, i0data_sorted, x1.size(), a1.size(), c4.size(), a3.size());
1345     // tensor label: h1
1346     std::unique_ptr<double[]> i1data = in(1)->get_block(c2, c4);
1347     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c2, c4)]);
1348     sort_indices<1,0,0,1,-2,1>(i1data, i1data_sorted, c2.size(), c4.size());
1349     dgemm_("T", "N", x1.size()*a1.size()*a3.size(), c2.size(), c4.size(),
1350            1.0, i0data_sorted, c4.size(), i1data_sorted, c4.size(),
1351            1.0, odata_sorted, x1.size()*a1.size()*a3.size());
1352   }
1353   sort_indices<3,0,2,1,1,1,1,1>(odata_sorted, odata, x1.size(), a1.size(), a3.size(), c2.size());
1354   out()->add_block(odata, c2, x1, a3, a1);
1355 }
1356 
compute()1357 void Task749::Task_local::compute() {
1358   const Index c2 = b(0);
1359   const Index x1 = b(1);
1360   const Index a3 = b(2);
1361   const Index a1 = b(3);
1362   // tensor label: I219
1363   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, x1, a3, a1)]);
1364   std::fill_n(odata.get(), out()->get_size(c2, x1, a3, a1), 0.0);
1365   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, x1, a3, a1)]);
1366   std::fill_n(odata_sorted.get(), out()->get_size(c2, x1, a3, a1), 0.0);
1367   for (auto& a4 : *range_[2]) {
1368     // tensor label: t2
1369     std::unique_ptr<double[]> i0data = in(0)->get_block(x1, a4, c2, a3);
1370     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, a4, c2, a3)]);
1371     sort_indices<1,0,2,3,0,1,1,1>(i0data, i0data_sorted, x1.size(), a4.size(), c2.size(), a3.size());
1372     // tensor label: h1
1373     std::unique_ptr<double[]> i1data = in(1)->get_block(a4, a1);
1374     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(a4, a1)]);
1375     sort_indices<0,1,0,1,2,1>(i1data, i1data_sorted, a4.size(), a1.size());
1376     dgemm_("T", "N", x1.size()*c2.size()*a3.size(), a1.size(), a4.size(),
1377            1.0, i0data_sorted, a4.size(), i1data_sorted, a4.size(),
1378            1.0, odata_sorted, x1.size()*c2.size()*a3.size());
1379   }
1380   sort_indices<1,0,2,3,1,1,1,1>(odata_sorted, odata, x1.size(), c2.size(), a3.size(), a1.size());
1381   out()->add_block(odata, c2, x1, a3, a1);
1382 }
1383 
1384 #endif
1385