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