1 //
2 // BAGEL - Brilliantly Advanced General Electronic Structure Library
3 // Filename: MRCI_tasks3.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_tasks3.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 Task100::Task_local::compute() {
36   const Index x2 = b(0);
37   const Index x3 = b(1);
38   const Index x1 = b(2);
39   const Index x4 = b(3);
40   const Index x5 = b(4);
41   const Index x6 = b(5);
42   const Index x0 = b(6);
43   const Index x7 = b(7);
44   // tensor label: Gamma533
45   std::unique_ptr<double[]> odata(new double[out()->get_size(x7, x0, x6, x5, x4, x1, x3, x2)]);
46   std::fill_n(odata.get(), out()->get_size(x7, x0, x6, x5, x4, x1, x3, x2), 0.0);
47   {
48     if (x3 == x5) {
49       std::unique_ptr<double[]> i0data = in(0)->get_block(x7, x0, x6, x2, x4, x1);
50       for (int i2 = 0; i2 != x2.size(); ++i2) {
51         for (int i1 = 0; i1 != x1.size(); ++i1) {
52           for (int i4 = 0; i4 != x4.size(); ++i4) {
53             for (int i5 = 0; i5 != x5.size(); ++i5) {
54               for (int i6 = 0; i6 != x6.size(); ++i6) {
55                 for (int i0 = 0; i0 != x0.size(); ++i0) {
56                   for (int i7 = 0; i7 != x7.size(); ++i7) {
57                     odata[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i5+x5.size()*(i4+x4.size()*(i1+x1.size()*(i5+x3.size()*(i2)))))))]
58                       += (1.0) * i0data[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i2+x2.size()*(i4+x4.size()*(i1)))))];
59                   }
60                 }
61               }
62             }
63           }
64         }
65       }
66     }
67   }
68   {
69     if (x4 == x5) {
70       std::unique_ptr<double[]> i0data = in(0)->get_block(x7, x0, x6, x1, x3, x2);
71       for (int i2 = 0; i2 != x2.size(); ++i2) {
72         for (int i3 = 0; i3 != x3.size(); ++i3) {
73           for (int i1 = 0; i1 != x1.size(); ++i1) {
74             for (int i5 = 0; i5 != x5.size(); ++i5) {
75               for (int i6 = 0; i6 != x6.size(); ++i6) {
76                 for (int i0 = 0; i0 != x0.size(); ++i0) {
77                   for (int i7 = 0; i7 != x7.size(); ++i7) {
78                     odata[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i5+x5.size()*(i5+x4.size()*(i1+x1.size()*(i3+x3.size()*(i2)))))))]
79                       += (1.0) * i0data[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i1+x1.size()*(i3+x3.size()*(i2)))))];
80                   }
81                 }
82               }
83             }
84           }
85         }
86       }
87     }
88   }
89   {
90     std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x0, x6, x5, x4, x1, x3, x2);
91     sort_indices<0,1,2,3,4,5,6,7,1,1,1,1>(i0data, odata, x7.size(), x0.size(), x6.size(), x5.size(), x4.size(), x1.size(), x3.size(), x2.size());
92   }
93   out()->add_block(odata, x7, x0, x6, x5, x4, x1, x3, x2);
94 }
95 
compute()96 void Task101::Task_local::compute() {
97   const Index x1 = b(0);
98   const Index x3 = b(1);
99   const Index x2 = b(2);
100   const Index x4 = b(3);
101   const Index x0 = b(4);
102   const Index x5 = b(5);
103   // tensor label: Gamma545
104   std::unique_ptr<double[]> odata(new double[out()->get_size(x5, x0, x4, x2, x3, x1)]);
105   std::fill_n(odata.get(), out()->get_size(x5, x0, x4, x2, x3, x1), 0.0);
106   {
107     std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0, x4, x2, x3, x1);
108     sort_indices<0,1,2,3,4,5,1,1,-1,1>(i0data, odata, x5.size(), x0.size(), x4.size(), x2.size(), x3.size(), x1.size());
109   }
110   out()->add_block(odata, x5, x0, x4, x2, x3, x1);
111 }
112 
compute()113 void Task102::Task_local::compute() {
114   const Index x4 = b(0);
115   const Index x1 = b(1);
116   const Index x5 = b(2);
117   const Index x0 = b(3);
118   const Index x2 = b(4);
119   const Index x3 = b(5);
120   // tensor label: Gamma548
121   std::unique_ptr<double[]> odata(new double[out()->get_size(x0, x5, x1, x4)]);
122   std::fill_n(odata.get(), out()->get_size(x0, x5, x1, x4), 0.0);
123   // associated with merged
124   std::unique_ptr<double[]> fdata = in(4)->get_block(x3, x2);
125   // rdm0 merged case
126   if (x3 == x5 && x1 == x4 && x0 == x2) {
127     std::unique_ptr<double[]> i0data = in(0)->get_block();
128     for (int i5 = 0; i5 != x5.size(); ++i5) {
129       for (int i4 = 0; i4 != x4.size(); ++i4) {
130         for (int i2 = 0; i2 != x2.size(); ++i2) {
131           odata[i2+x0.size()*(i5+x5.size()*(i4+x1.size()*(i4)))]  += -4.0 * i0data[0] * fdata[i5+x3.size()*(i2)];
132         }
133       }
134     }
135   }
136   // rdm0 merged case
137   if (x3 == x4 && x0 == x2 && x1 == x5) {
138     std::unique_ptr<double[]> i0data = in(0)->get_block();
139     for (int i4 = 0; i4 != x4.size(); ++i4) {
140       for (int i2 = 0; i2 != x2.size(); ++i2) {
141         for (int i5 = 0; i5 != x5.size(); ++i5) {
142           odata[i2+x0.size()*(i5+x5.size()*(i5+x1.size()*(i4)))]  += 2.0 * i0data[0] * fdata[i4+x3.size()*(i2)];
143         }
144       }
145     }
146   }
147   if (x0 == x2 && x3 == x4) {
148     std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x5);
149     for (int i5 = 0; i5 != x5.size(); ++i5) {
150       for (int i1 = 0; i1 != x1.size(); ++i1) {
151         for (int i2 = 0; i2 != x2.size(); ++i2) {
152           for (int i4 = 0; i4 != x4.size(); ++i4) {
153             odata[i2+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4)))]
154               += (-1.0) * i0data[i1+x1.size()*(i5)] * fdata[i4+x3.size()*(i2)];
155           }
156         }
157       }
158     }
159   }
160   if (x3 == x5 && x0 == x2) {
161     std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x4);
162     for (int i4 = 0; i4 != x4.size(); ++i4) {
163       for (int i1 = 0; i1 != x1.size(); ++i1) {
164         for (int i5 = 0; i5 != x5.size(); ++i5) {
165           for (int i2 = 0; i2 != x2.size(); ++i2) {
166             odata[i2+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4)))]
167               += (2.0) * i0data[i1+x1.size()*(i4)] * fdata[i5+x3.size()*(i2)];
168           }
169         }
170       }
171     }
172   }
173   // rdm0 merged case
174   if (x1 == x2 && x0 == x4 && x3 == x5) {
175     std::unique_ptr<double[]> i0data = in(0)->get_block();
176     for (int i2 = 0; i2 != x2.size(); ++i2) {
177       for (int i4 = 0; i4 != x4.size(); ++i4) {
178         for (int i5 = 0; i5 != x5.size(); ++i5) {
179           odata[i4+x0.size()*(i5+x5.size()*(i2+x1.size()*(i4)))]  += 2.0 * i0data[0] * fdata[i5+x3.size()*(i2)];
180         }
181       }
182     }
183   }
184   if (x3 == x5 && x0 == x4) {
185     std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x2);
186     for (int i2 = 0; i2 != x2.size(); ++i2) {
187       for (int i1 = 0; i1 != x1.size(); ++i1) {
188         for (int i5 = 0; i5 != x5.size(); ++i5) {
189           for (int i4 = 0; i4 != x4.size(); ++i4) {
190             odata[i4+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4)))]
191               += (-1.0) * i0data[i1+x1.size()*(i2)] * fdata[i5+x3.size()*(i2)];
192           }
193         }
194       }
195     }
196   }
197   // rdm0 merged case
198   if (x1 == x2 && x3 == x4 && x0 == x5) {
199     std::unique_ptr<double[]> i0data = in(0)->get_block();
200     for (int i2 = 0; i2 != x2.size(); ++i2) {
201       for (int i4 = 0; i4 != x4.size(); ++i4) {
202         for (int i5 = 0; i5 != x5.size(); ++i5) {
203           odata[i5+x0.size()*(i5+x5.size()*(i2+x1.size()*(i4)))]  += -4.0 * i0data[0] * fdata[i4+x3.size()*(i2)];
204         }
205       }
206     }
207   }
208   if (x3 == x4 && x0 == x5) {
209     std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x2);
210     for (int i2 = 0; i2 != x2.size(); ++i2) {
211       for (int i1 = 0; i1 != x1.size(); ++i1) {
212         for (int i4 = 0; i4 != x4.size(); ++i4) {
213           for (int i5 = 0; i5 != x5.size(); ++i5) {
214             odata[i5+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4)))]
215               += (2.0) * i0data[i1+x1.size()*(i2)] * fdata[i4+x3.size()*(i2)];
216           }
217         }
218       }
219     }
220   }
221   if (x1 == x2 && x3 == x4) {
222     std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x5);
223     for (int i5 = 0; i5 != x5.size(); ++i5) {
224       for (int i0 = 0; i0 != x0.size(); ++i0) {
225         for (int i2 = 0; i2 != x2.size(); ++i2) {
226           for (int i4 = 0; i4 != x4.size(); ++i4) {
227             odata[i0+x0.size()*(i5+x5.size()*(i2+x1.size()*(i4)))]
228               += (2.0) * i0data[i0+x0.size()*(i5)] * fdata[i4+x3.size()*(i2)];
229           }
230         }
231       }
232     }
233   }
234   if (x3 == x5 && x1 == x2) {
235     std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x4);
236     for (int i4 = 0; i4 != x4.size(); ++i4) {
237       for (int i0 = 0; i0 != x0.size(); ++i0) {
238         for (int i5 = 0; i5 != x5.size(); ++i5) {
239           for (int i2 = 0; i2 != x2.size(); ++i2) {
240             odata[i0+x0.size()*(i5+x5.size()*(i2+x1.size()*(i4)))]
241               += (-1.0) * i0data[i0+x0.size()*(i4)] * fdata[i5+x3.size()*(i2)];
242           }
243         }
244       }
245     }
246   }
247   if (x3 == x5 && x1 == x4) {
248     std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x2);
249     for (int i2 = 0; i2 != x2.size(); ++i2) {
250       for (int i0 = 0; i0 != x0.size(); ++i0) {
251         for (int i5 = 0; i5 != x5.size(); ++i5) {
252           for (int i4 = 0; i4 != x4.size(); ++i4) {
253             odata[i0+x0.size()*(i5+x5.size()*(i4+x1.size()*(i4)))]
254               += (2.0) * i0data[i0+x0.size()*(i2)] * fdata[i5+x3.size()*(i2)];
255           }
256         }
257       }
258     }
259   }
260   if (x3 == x4 && x1 == x5) {
261     std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x2);
262     for (int i2 = 0; i2 != x2.size(); ++i2) {
263       for (int i0 = 0; i0 != x0.size(); ++i0) {
264         for (int i4 = 0; i4 != x4.size(); ++i4) {
265           for (int i5 = 0; i5 != x5.size(); ++i5) {
266             odata[i0+x0.size()*(i5+x5.size()*(i5+x1.size()*(i4)))]
267               += (-1.0) * i0data[i0+x0.size()*(i2)] * fdata[i4+x3.size()*(i2)];
268           }
269         }
270       }
271     }
272   }
273   if (x3 == x4) {
274     std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x5, x1, x2);
275     for (int i2 = 0; i2 != x2.size(); ++i2) {
276       for (int i1 = 0; i1 != x1.size(); ++i1) {
277         for (int i5 = 0; i5 != x5.size(); ++i5) {
278           for (int i0 = 0; i0 != x0.size(); ++i0) {
279             for (int i4 = 0; i4 != x4.size(); ++i4) {
280               odata[i0+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4)))]
281                 += (-1.0) * i0data[i0+x0.size()*(i5+x5.size()*(i1+x1.size()*(i2)))] * fdata[i4+x3.size()*(i2)];
282             }
283           }
284         }
285       }
286     }
287   }
288   if (x3 == x5) {
289     std::unique_ptr<double[]> i0data = in(2)->get_block(x1, x4, x0, x2);
290     for (int i2 = 0; i2 != x2.size(); ++i2) {
291       for (int i0 = 0; i0 != x0.size(); ++i0) {
292         for (int i4 = 0; i4 != x4.size(); ++i4) {
293           for (int i1 = 0; i1 != x1.size(); ++i1) {
294             for (int i5 = 0; i5 != x5.size(); ++i5) {
295               odata[i0+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4)))]
296                 += (-1.0) * i0data[i1+x1.size()*(i4+x4.size()*(i0+x0.size()*(i2)))] * fdata[i5+x3.size()*(i2)];
297             }
298           }
299         }
300       }
301     }
302   }
303   out()->add_block(odata, x0, x5, x1, x4);
304 }
305 
compute()306 void Task103::Task_local::compute() {
307   const Index x6 = b(0);
308   const Index x1 = b(1);
309   const Index x7 = b(2);
310   const Index x0 = b(3);
311   const Index x2 = b(4);
312   const Index x3 = b(5);
313   const Index x4 = b(6);
314   const Index x5 = b(7);
315   // tensor label: Gamma549
316   std::unique_ptr<double[]> odata(new double[out()->get_size(x0, x7, x1, x6)]);
317   std::fill_n(odata.get(), out()->get_size(x0, x7, x1, x6), 0.0);
318   // associated with merged
319   std::unique_ptr<double[]> fdata = in(5)->get_block(x5, x4, x3, x2);
320   if (x0 == x2 && x3 == x7 && x1 == x6) {
321     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x4);
322     for (int i4 = 0; i4 != x4.size(); ++i4) {
323       for (int i5 = 0; i5 != x5.size(); ++i5) {
324         for (int i2 = 0; i2 != x2.size(); ++i2) {
325           for (int i7 = 0; i7 != x7.size(); ++i7) {
326             for (int i6 = 0; i6 != x6.size(); ++i6) {
327               odata[i2+x0.size()*(i7+x7.size()*(i6+x1.size()*(i6)))]
328                 += (-4.0) * i0data[i5+x5.size()*(i4)] * fdata[i5+x5.size()*(i4+x4.size()*(i7+x3.size()*(i2)))];
329             }
330           }
331         }
332       }
333     }
334   }
335   if (x3 == x6 && x1 == x7 && x0 == x2) {
336     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x4);
337     for (int i4 = 0; i4 != x4.size(); ++i4) {
338       for (int i5 = 0; i5 != x5.size(); ++i5) {
339         for (int i6 = 0; i6 != x6.size(); ++i6) {
340           for (int i7 = 0; i7 != x7.size(); ++i7) {
341             for (int i2 = 0; i2 != x2.size(); ++i2) {
342               odata[i2+x0.size()*(i7+x7.size()*(i7+x1.size()*(i6)))]
343                 += (2.0) * i0data[i5+x5.size()*(i4)] * fdata[i5+x5.size()*(i4+x4.size()*(i6+x3.size()*(i2)))];
344             }
345           }
346         }
347       }
348     }
349   }
350   if (x3 == x7 && x1 == x6 && x0 == x4) {
351     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x2);
352     for (int i2 = 0; i2 != x2.size(); ++i2) {
353       for (int i5 = 0; i5 != x5.size(); ++i5) {
354         for (int i7 = 0; i7 != x7.size(); ++i7) {
355           for (int i6 = 0; i6 != x6.size(); ++i6) {
356             for (int i4 = 0; i4 != x4.size(); ++i4) {
357               odata[i4+x0.size()*(i7+x7.size()*(i6+x1.size()*(i6)))]
358                 += (2.0) * i0data[i5+x5.size()*(i2)] * fdata[i5+x5.size()*(i4+x4.size()*(i7+x3.size()*(i2)))];
359             }
360           }
361         }
362       }
363     }
364   }
365   if (x3 == x6 && x1 == x7 && x0 == x4) {
366     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x2);
367     for (int i2 = 0; i2 != x2.size(); ++i2) {
368       for (int i5 = 0; i5 != x5.size(); ++i5) {
369         for (int i6 = 0; i6 != x6.size(); ++i6) {
370           for (int i7 = 0; i7 != x7.size(); ++i7) {
371             for (int i4 = 0; i4 != x4.size(); ++i4) {
372               odata[i4+x0.size()*(i7+x7.size()*(i7+x1.size()*(i6)))]
373                 += (-1.0) * i0data[i5+x5.size()*(i2)] * fdata[i5+x5.size()*(i4+x4.size()*(i6+x3.size()*(i2)))];
374             }
375           }
376         }
377       }
378     }
379   }
380   if (x3 == x7 && x1 == x2 && x0 == x6) {
381     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x4);
382     for (int i4 = 0; i4 != x4.size(); ++i4) {
383       for (int i5 = 0; i5 != x5.size(); ++i5) {
384         for (int i7 = 0; i7 != x7.size(); ++i7) {
385           for (int i2 = 0; i2 != x2.size(); ++i2) {
386             for (int i6 = 0; i6 != x6.size(); ++i6) {
387               odata[i6+x0.size()*(i7+x7.size()*(i2+x1.size()*(i6)))]
388                 += (2.0) * i0data[i5+x5.size()*(i4)] * fdata[i5+x5.size()*(i4+x4.size()*(i7+x3.size()*(i2)))];
389             }
390           }
391         }
392       }
393     }
394   }
395   if (x3 == x7 && x1 == x4 && x0 == x6) {
396     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x2);
397     for (int i2 = 0; i2 != x2.size(); ++i2) {
398       for (int i5 = 0; i5 != x5.size(); ++i5) {
399         for (int i7 = 0; i7 != x7.size(); ++i7) {
400           for (int i4 = 0; i4 != x4.size(); ++i4) {
401             for (int i6 = 0; i6 != x6.size(); ++i6) {
402               odata[i6+x0.size()*(i7+x7.size()*(i4+x1.size()*(i6)))]
403                 += (-1.0) * i0data[i5+x5.size()*(i2)] * fdata[i5+x5.size()*(i4+x4.size()*(i7+x3.size()*(i2)))];
404             }
405           }
406         }
407       }
408     }
409   }
410   if (x3 == x7 && x0 == x6) {
411     std::unique_ptr<double[]> i0data = in(2)->get_block(x5, x4, x1, x2);
412     for (int i2 = 0; i2 != x2.size(); ++i2) {
413       for (int i1 = 0; i1 != x1.size(); ++i1) {
414         for (int i4 = 0; i4 != x4.size(); ++i4) {
415           for (int i5 = 0; i5 != x5.size(); ++i5) {
416             for (int i7 = 0; i7 != x7.size(); ++i7) {
417               for (int i6 = 0; i6 != x6.size(); ++i6) {
418                 odata[i6+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
419                   += (-1.0) * i0data[i5+x5.size()*(i4+x4.size()*(i1+x1.size()*(i2)))] * fdata[i5+x5.size()*(i4+x4.size()*(i7+x3.size()*(i2)))];
420               }
421             }
422           }
423         }
424       }
425     }
426   }
427   if (x3 == x6 && x1 == x2 && x0 == x7) {
428     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x4);
429     for (int i4 = 0; i4 != x4.size(); ++i4) {
430       for (int i5 = 0; i5 != x5.size(); ++i5) {
431         for (int i6 = 0; i6 != x6.size(); ++i6) {
432           for (int i2 = 0; i2 != x2.size(); ++i2) {
433             for (int i7 = 0; i7 != x7.size(); ++i7) {
434               odata[i7+x0.size()*(i7+x7.size()*(i2+x1.size()*(i6)))]
435                 += (-4.0) * i0data[i5+x5.size()*(i4)] * fdata[i5+x5.size()*(i4+x4.size()*(i6+x3.size()*(i2)))];
436             }
437           }
438         }
439       }
440     }
441   }
442   if (x3 == x6 && x1 == x4 && x0 == x7) {
443     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x2);
444     for (int i2 = 0; i2 != x2.size(); ++i2) {
445       for (int i5 = 0; i5 != x5.size(); ++i5) {
446         for (int i6 = 0; i6 != x6.size(); ++i6) {
447           for (int i4 = 0; i4 != x4.size(); ++i4) {
448             for (int i7 = 0; i7 != x7.size(); ++i7) {
449               odata[i7+x0.size()*(i7+x7.size()*(i4+x1.size()*(i6)))]
450                 += (2.0) * i0data[i5+x5.size()*(i2)] * fdata[i5+x5.size()*(i4+x4.size()*(i6+x3.size()*(i2)))];
451             }
452           }
453         }
454       }
455     }
456   }
457   if (x3 == x6 && x0 == x7) {
458     std::unique_ptr<double[]> i0data = in(2)->get_block(x5, x4, x1, x2);
459     for (int i2 = 0; i2 != x2.size(); ++i2) {
460       for (int i1 = 0; i1 != x1.size(); ++i1) {
461         for (int i4 = 0; i4 != x4.size(); ++i4) {
462           for (int i5 = 0; i5 != x5.size(); ++i5) {
463             for (int i6 = 0; i6 != x6.size(); ++i6) {
464               for (int i7 = 0; i7 != x7.size(); ++i7) {
465                 odata[i7+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
466                   += (2.0) * i0data[i5+x5.size()*(i4+x4.size()*(i1+x1.size()*(i2)))] * fdata[i5+x5.size()*(i4+x4.size()*(i6+x3.size()*(i2)))];
467               }
468             }
469           }
470         }
471       }
472     }
473   }
474   if (x3 == x7 && x1 == x6) {
475     std::unique_ptr<double[]> i0data = in(2)->get_block(x5, x4, x0, x2);
476     for (int i2 = 0; i2 != x2.size(); ++i2) {
477       for (int i0 = 0; i0 != x0.size(); ++i0) {
478         for (int i4 = 0; i4 != x4.size(); ++i4) {
479           for (int i5 = 0; i5 != x5.size(); ++i5) {
480             for (int i7 = 0; i7 != x7.size(); ++i7) {
481               for (int i6 = 0; i6 != x6.size(); ++i6) {
482                 odata[i0+x0.size()*(i7+x7.size()*(i6+x1.size()*(i6)))]
483                   += (2.0) * i0data[i5+x5.size()*(i4+x4.size()*(i0+x0.size()*(i2)))] * fdata[i5+x5.size()*(i4+x4.size()*(i7+x3.size()*(i2)))];
484               }
485             }
486           }
487         }
488       }
489     }
490   }
491   if (x3 == x6 && x1 == x7) {
492     std::unique_ptr<double[]> i0data = in(2)->get_block(x5, x4, x0, x2);
493     for (int i2 = 0; i2 != x2.size(); ++i2) {
494       for (int i0 = 0; i0 != x0.size(); ++i0) {
495         for (int i4 = 0; i4 != x4.size(); ++i4) {
496           for (int i5 = 0; i5 != x5.size(); ++i5) {
497             for (int i6 = 0; i6 != x6.size(); ++i6) {
498               for (int i7 = 0; i7 != x7.size(); ++i7) {
499                 odata[i0+x0.size()*(i7+x7.size()*(i7+x1.size()*(i6)))]
500                   += (-1.0) * i0data[i5+x5.size()*(i4+x4.size()*(i0+x0.size()*(i2)))] * fdata[i5+x5.size()*(i4+x4.size()*(i6+x3.size()*(i2)))];
501               }
502             }
503           }
504         }
505       }
506     }
507   }
508   // rdm0 merged case
509   if (x3 == x6 && x0 == x2 && x1 == x4 && x5 == x7) {
510     std::unique_ptr<double[]> i0data = in(0)->get_block();
511     for (int i6 = 0; i6 != x6.size(); ++i6) {
512       for (int i2 = 0; i2 != x2.size(); ++i2) {
513         for (int i4 = 0; i4 != x4.size(); ++i4) {
514           for (int i7 = 0; i7 != x7.size(); ++i7) {
515             odata[i2+x0.size()*(i7+x7.size()*(i4+x1.size()*(i6)))]  += 2.0 * i0data[0] * fdata[i7+x5.size()*(i4+x4.size()*(i6+x3.size()*(i2)))];
516           }
517         }
518       }
519     }
520   }
521   if (x1 == x4 && x0 == x2 && x3 == x6) {
522     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x7);
523     for (int i7 = 0; i7 != x7.size(); ++i7) {
524       for (int i5 = 0; i5 != x5.size(); ++i5) {
525         for (int i4 = 0; i4 != x4.size(); ++i4) {
526           for (int i2 = 0; i2 != x2.size(); ++i2) {
527             for (int i6 = 0; i6 != x6.size(); ++i6) {
528               odata[i2+x0.size()*(i7+x7.size()*(i4+x1.size()*(i6)))]
529                 += (-1.0) * i0data[i5+x5.size()*(i7)] * fdata[i5+x5.size()*(i4+x4.size()*(i6+x3.size()*(i2)))];
530             }
531           }
532         }
533       }
534     }
535   }
536   // rdm0 merged case
537   if (x1 == x4 && x0 == x2 && x5 == x6 && x3 == x7) {
538     std::unique_ptr<double[]> i0data = in(0)->get_block();
539     for (int i4 = 0; i4 != x4.size(); ++i4) {
540       for (int i2 = 0; i2 != x2.size(); ++i2) {
541         for (int i6 = 0; i6 != x6.size(); ++i6) {
542           for (int i7 = 0; i7 != x7.size(); ++i7) {
543             odata[i2+x0.size()*(i7+x7.size()*(i4+x1.size()*(i6)))]  += -4.0 * i0data[0] * fdata[i6+x5.size()*(i4+x4.size()*(i7+x3.size()*(i2)))];
544           }
545         }
546       }
547     }
548   }
549   if (x1 == x4 && x0 == x2 && x3 == x7) {
550     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x6);
551     for (int i6 = 0; i6 != x6.size(); ++i6) {
552       for (int i5 = 0; i5 != x5.size(); ++i5) {
553         for (int i4 = 0; i4 != x4.size(); ++i4) {
554           for (int i2 = 0; i2 != x2.size(); ++i2) {
555             for (int i7 = 0; i7 != x7.size(); ++i7) {
556               odata[i2+x0.size()*(i7+x7.size()*(i4+x1.size()*(i6)))]
557                 += (2.0) * i0data[i5+x5.size()*(i6)] * fdata[i5+x5.size()*(i4+x4.size()*(i7+x3.size()*(i2)))];
558             }
559           }
560         }
561       }
562     }
563   }
564   if (x1 == x4 && x5 == x6 && x0 == x2) {
565     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x7);
566     for (int i7 = 0; i7 != x7.size(); ++i7) {
567       for (int i3 = 0; i3 != x3.size(); ++i3) {
568         for (int i4 = 0; i4 != x4.size(); ++i4) {
569           for (int i6 = 0; i6 != x6.size(); ++i6) {
570             for (int i2 = 0; i2 != x2.size(); ++i2) {
571               odata[i2+x0.size()*(i7+x7.size()*(i4+x1.size()*(i6)))]
572                 += (2.0) * i0data[i3+x3.size()*(i7)] * fdata[i6+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
573             }
574           }
575         }
576       }
577     }
578   }
579   if (x5 == x7 && x0 == x2 && x1 == x4) {
580     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x6);
581     for (int i6 = 0; i6 != x6.size(); ++i6) {
582       for (int i3 = 0; i3 != x3.size(); ++i3) {
583         for (int i7 = 0; i7 != x7.size(); ++i7) {
584           for (int i2 = 0; i2 != x2.size(); ++i2) {
585             for (int i4 = 0; i4 != x4.size(); ++i4) {
586               odata[i2+x0.size()*(i7+x7.size()*(i4+x1.size()*(i6)))]
587                 += (-1.0) * i0data[i3+x3.size()*(i6)] * fdata[i7+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
588             }
589           }
590         }
591       }
592     }
593   }
594   // rdm0 merged case
595   if (x3 == x4 && x5 == x7 && x1 == x6 && x0 == x2) {
596     std::unique_ptr<double[]> i0data = in(0)->get_block();
597     for (int i4 = 0; i4 != x4.size(); ++i4) {
598       for (int i7 = 0; i7 != x7.size(); ++i7) {
599         for (int i6 = 0; i6 != x6.size(); ++i6) {
600           for (int i2 = 0; i2 != x2.size(); ++i2) {
601             odata[i2+x0.size()*(i7+x7.size()*(i6+x1.size()*(i6)))]  += -4.0 * i0data[0] * fdata[i7+x5.size()*(i4+x4.size()*(i4+x3.size()*(i2)))];
602           }
603         }
604       }
605     }
606   }
607   if (x1 == x6 && x5 == x7 && x0 == x2) {
608     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x4);
609     for (int i4 = 0; i4 != x4.size(); ++i4) {
610       for (int i3 = 0; i3 != x3.size(); ++i3) {
611         for (int i6 = 0; i6 != x6.size(); ++i6) {
612           for (int i7 = 0; i7 != x7.size(); ++i7) {
613             for (int i2 = 0; i2 != x2.size(); ++i2) {
614               odata[i2+x0.size()*(i7+x7.size()*(i6+x1.size()*(i6)))]
615                 += (2.0) * i0data[i3+x3.size()*(i4)] * fdata[i7+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
616             }
617           }
618         }
619       }
620     }
621   }
622   // rdm0 merged case
623   if (x5 == x6 && x3 == x4 && x1 == x7 && x0 == x2) {
624     std::unique_ptr<double[]> i0data = in(0)->get_block();
625     for (int i6 = 0; i6 != x6.size(); ++i6) {
626       for (int i4 = 0; i4 != x4.size(); ++i4) {
627         for (int i7 = 0; i7 != x7.size(); ++i7) {
628           for (int i2 = 0; i2 != x2.size(); ++i2) {
629             odata[i2+x0.size()*(i7+x7.size()*(i7+x1.size()*(i6)))]  += 2.0 * i0data[0] * fdata[i6+x5.size()*(i4+x4.size()*(i4+x3.size()*(i2)))];
630           }
631         }
632       }
633     }
634   }
635   if (x0 == x2 && x5 == x6 && x1 == x7) {
636     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x4);
637     for (int i4 = 0; i4 != x4.size(); ++i4) {
638       for (int i3 = 0; i3 != x3.size(); ++i3) {
639         for (int i2 = 0; i2 != x2.size(); ++i2) {
640           for (int i6 = 0; i6 != x6.size(); ++i6) {
641             for (int i7 = 0; i7 != x7.size(); ++i7) {
642               odata[i2+x0.size()*(i7+x7.size()*(i7+x1.size()*(i6)))]
643                 += (-1.0) * i0data[i3+x3.size()*(i4)] * fdata[i6+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
644             }
645           }
646         }
647       }
648     }
649   }
650   if (x5 == x6 && x3 == x4 && x0 == x2) {
651     std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x7);
652     for (int i7 = 0; i7 != x7.size(); ++i7) {
653       for (int i1 = 0; i1 != x1.size(); ++i1) {
654         for (int i6 = 0; i6 != x6.size(); ++i6) {
655           for (int i4 = 0; i4 != x4.size(); ++i4) {
656             for (int i2 = 0; i2 != x2.size(); ++i2) {
657               odata[i2+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
658                 += (-1.0) * i0data[i1+x1.size()*(i7)] * fdata[i6+x5.size()*(i4+x4.size()*(i4+x3.size()*(i2)))];
659             }
660           }
661         }
662       }
663     }
664   }
665   if (x5 == x7 && x3 == x4 && x0 == x2) {
666     std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x6);
667     for (int i6 = 0; i6 != x6.size(); ++i6) {
668       for (int i1 = 0; i1 != x1.size(); ++i1) {
669         for (int i7 = 0; i7 != x7.size(); ++i7) {
670           for (int i4 = 0; i4 != x4.size(); ++i4) {
671             for (int i2 = 0; i2 != x2.size(); ++i2) {
672               odata[i2+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
673                 += (2.0) * i0data[i1+x1.size()*(i6)] * fdata[i7+x5.size()*(i4+x4.size()*(i4+x3.size()*(i2)))];
674             }
675           }
676         }
677       }
678     }
679   }
680   if (x5 == x7 && x3 == x6 && x0 == x2) {
681     std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x4);
682     for (int i4 = 0; i4 != x4.size(); ++i4) {
683       for (int i1 = 0; i1 != x1.size(); ++i1) {
684         for (int i7 = 0; i7 != x7.size(); ++i7) {
685           for (int i6 = 0; i6 != x6.size(); ++i6) {
686             for (int i2 = 0; i2 != x2.size(); ++i2) {
687               odata[i2+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
688                 += (-1.0) * i0data[i1+x1.size()*(i4)] * fdata[i7+x5.size()*(i4+x4.size()*(i6+x3.size()*(i2)))];
689             }
690           }
691         }
692       }
693     }
694   }
695   if (x3 == x6 && x0 == x2) {
696     std::unique_ptr<double[]> i0data = in(2)->get_block(x1, x7, x5, x4);
697     for (int i4 = 0; i4 != x4.size(); ++i4) {
698       for (int i5 = 0; i5 != x5.size(); ++i5) {
699         for (int i7 = 0; i7 != x7.size(); ++i7) {
700           for (int i1 = 0; i1 != x1.size(); ++i1) {
701             for (int i6 = 0; i6 != x6.size(); ++i6) {
702               for (int i2 = 0; i2 != x2.size(); ++i2) {
703                 odata[i2+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
704                   += (-1.0) * i0data[i1+x1.size()*(i7+x7.size()*(i5+x5.size()*(i4)))] * fdata[i5+x5.size()*(i4+x4.size()*(i6+x3.size()*(i2)))];
705               }
706             }
707           }
708         }
709       }
710     }
711   }
712   if (x3 == x7 && x0 == x2 && x5 == x6) {
713     std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x4);
714     for (int i4 = 0; i4 != x4.size(); ++i4) {
715       for (int i1 = 0; i1 != x1.size(); ++i1) {
716         for (int i7 = 0; i7 != x7.size(); ++i7) {
717           for (int i2 = 0; i2 != x2.size(); ++i2) {
718             for (int i6 = 0; i6 != x6.size(); ++i6) {
719               odata[i2+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
720                 += (2.0) * i0data[i1+x1.size()*(i4)] * fdata[i6+x5.size()*(i4+x4.size()*(i7+x3.size()*(i2)))];
721             }
722           }
723         }
724       }
725     }
726   }
727   if (x3 == x7 && x0 == x2) {
728     std::unique_ptr<double[]> i0data = in(2)->get_block(x1, x6, x5, x4);
729     for (int i4 = 0; i4 != x4.size(); ++i4) {
730       for (int i5 = 0; i5 != x5.size(); ++i5) {
731         for (int i6 = 0; i6 != x6.size(); ++i6) {
732           for (int i1 = 0; i1 != x1.size(); ++i1) {
733             for (int i7 = 0; i7 != x7.size(); ++i7) {
734               for (int i2 = 0; i2 != x2.size(); ++i2) {
735                 odata[i2+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
736                   += (2.0) * i0data[i1+x1.size()*(i6+x6.size()*(i5+x5.size()*(i4)))] * fdata[i5+x5.size()*(i4+x4.size()*(i7+x3.size()*(i2)))];
737               }
738             }
739           }
740         }
741       }
742     }
743   }
744   if (x5 == x6 && x0 == x2) {
745     std::unique_ptr<double[]> i0data = in(2)->get_block(x3, x7, x1, x4);
746     for (int i4 = 0; i4 != x4.size(); ++i4) {
747       for (int i1 = 0; i1 != x1.size(); ++i1) {
748         for (int i7 = 0; i7 != x7.size(); ++i7) {
749           for (int i3 = 0; i3 != x3.size(); ++i3) {
750             for (int i6 = 0; i6 != x6.size(); ++i6) {
751               for (int i2 = 0; i2 != x2.size(); ++i2) {
752                 odata[i2+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
753                   += (-1.0) * i0data[i3+x3.size()*(i7+x7.size()*(i1+x1.size()*(i4)))] * fdata[i6+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
754               }
755             }
756           }
757         }
758       }
759     }
760   }
761   if (x5 == x7 && x0 == x2) {
762     std::unique_ptr<double[]> i0data = in(2)->get_block(x1, x6, x3, x4);
763     for (int i4 = 0; i4 != x4.size(); ++i4) {
764       for (int i3 = 0; i3 != x3.size(); ++i3) {
765         for (int i6 = 0; i6 != x6.size(); ++i6) {
766           for (int i1 = 0; i1 != x1.size(); ++i1) {
767             for (int i7 = 0; i7 != x7.size(); ++i7) {
768               for (int i2 = 0; i2 != x2.size(); ++i2) {
769                 odata[i2+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
770                   += (-1.0) * i0data[i1+x1.size()*(i6+x6.size()*(i3+x3.size()*(i4)))] * fdata[i7+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
771               }
772             }
773           }
774         }
775       }
776     }
777   }
778   // rdm0 merged case
779   if (x5 == x7 && x3 == x6 && x1 == x2 && x0 == x4) {
780     std::unique_ptr<double[]> i0data = in(0)->get_block();
781     for (int i7 = 0; i7 != x7.size(); ++i7) {
782       for (int i6 = 0; i6 != x6.size(); ++i6) {
783         for (int i2 = 0; i2 != x2.size(); ++i2) {
784           for (int i4 = 0; i4 != x4.size(); ++i4) {
785             odata[i4+x0.size()*(i7+x7.size()*(i2+x1.size()*(i6)))]  += -4.0 * i0data[0] * fdata[i7+x5.size()*(i4+x4.size()*(i6+x3.size()*(i2)))];
786           }
787         }
788       }
789     }
790   }
791   if (x3 == x6 && x1 == x2 && x0 == x4) {
792     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x7);
793     for (int i7 = 0; i7 != x7.size(); ++i7) {
794       for (int i5 = 0; i5 != x5.size(); ++i5) {
795         for (int i6 = 0; i6 != x6.size(); ++i6) {
796           for (int i2 = 0; i2 != x2.size(); ++i2) {
797             for (int i4 = 0; i4 != x4.size(); ++i4) {
798               odata[i4+x0.size()*(i7+x7.size()*(i2+x1.size()*(i6)))]
799                 += (2.0) * i0data[i5+x5.size()*(i7)] * fdata[i5+x5.size()*(i4+x4.size()*(i6+x3.size()*(i2)))];
800             }
801           }
802         }
803       }
804     }
805   }
806   // rdm0 merged case
807   if (x5 == x6 && x0 == x4 && x3 == x7 && x1 == x2) {
808     std::unique_ptr<double[]> i0data = in(0)->get_block();
809     for (int i6 = 0; i6 != x6.size(); ++i6) {
810       for (int i4 = 0; i4 != x4.size(); ++i4) {
811         for (int i7 = 0; i7 != x7.size(); ++i7) {
812           for (int i2 = 0; i2 != x2.size(); ++i2) {
813             odata[i4+x0.size()*(i7+x7.size()*(i2+x1.size()*(i6)))]  += 2.0 * i0data[0] * fdata[i6+x5.size()*(i4+x4.size()*(i7+x3.size()*(i2)))];
814           }
815         }
816       }
817     }
818   }
819   if (x0 == x4 && x3 == x7 && x1 == x2) {
820     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x6);
821     for (int i6 = 0; i6 != x6.size(); ++i6) {
822       for (int i5 = 0; i5 != x5.size(); ++i5) {
823         for (int i4 = 0; i4 != x4.size(); ++i4) {
824           for (int i7 = 0; i7 != x7.size(); ++i7) {
825             for (int i2 = 0; i2 != x2.size(); ++i2) {
826               odata[i4+x0.size()*(i7+x7.size()*(i2+x1.size()*(i6)))]
827                 += (-1.0) * i0data[i5+x5.size()*(i6)] * fdata[i5+x5.size()*(i4+x4.size()*(i7+x3.size()*(i2)))];
828             }
829           }
830         }
831       }
832     }
833   }
834   if (x5 == x6 && x1 == x2 && x0 == x4) {
835     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x7);
836     for (int i7 = 0; i7 != x7.size(); ++i7) {
837       for (int i3 = 0; i3 != x3.size(); ++i3) {
838         for (int i6 = 0; i6 != x6.size(); ++i6) {
839           for (int i2 = 0; i2 != x2.size(); ++i2) {
840             for (int i4 = 0; i4 != x4.size(); ++i4) {
841               odata[i4+x0.size()*(i7+x7.size()*(i2+x1.size()*(i6)))]
842                 += (-1.0) * i0data[i3+x3.size()*(i7)] * fdata[i6+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
843             }
844           }
845         }
846       }
847     }
848   }
849   if (x5 == x7 && x1 == x2 && x0 == x4) {
850     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x6);
851     for (int i6 = 0; i6 != x6.size(); ++i6) {
852       for (int i3 = 0; i3 != x3.size(); ++i3) {
853         for (int i7 = 0; i7 != x7.size(); ++i7) {
854           for (int i2 = 0; i2 != x2.size(); ++i2) {
855             for (int i4 = 0; i4 != x4.size(); ++i4) {
856               odata[i4+x0.size()*(i7+x7.size()*(i2+x1.size()*(i6)))]
857                 += (2.0) * i0data[i3+x3.size()*(i6)] * fdata[i7+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
858             }
859           }
860         }
861       }
862     }
863   }
864   if (x5 == x7 && x1 == x6 && x0 == x4) {
865     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x2);
866     for (int i2 = 0; i2 != x2.size(); ++i2) {
867       for (int i3 = 0; i3 != x3.size(); ++i3) {
868         for (int i7 = 0; i7 != x7.size(); ++i7) {
869           for (int i6 = 0; i6 != x6.size(); ++i6) {
870             for (int i4 = 0; i4 != x4.size(); ++i4) {
871               odata[i4+x0.size()*(i7+x7.size()*(i6+x1.size()*(i6)))]
872                 += (-4.0) * i0data[i3+x3.size()*(i2)] * fdata[i7+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
873             }
874           }
875         }
876       }
877     }
878   }
879   if (x5 == x6 && x1 == x7 && x0 == x4) {
880     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x2);
881     for (int i2 = 0; i2 != x2.size(); ++i2) {
882       for (int i3 = 0; i3 != x3.size(); ++i3) {
883         for (int i6 = 0; i6 != x6.size(); ++i6) {
884           for (int i7 = 0; i7 != x7.size(); ++i7) {
885             for (int i4 = 0; i4 != x4.size(); ++i4) {
886               odata[i4+x0.size()*(i7+x7.size()*(i7+x1.size()*(i6)))]
887                 += (2.0) * i0data[i3+x3.size()*(i2)] * fdata[i6+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
888             }
889           }
890         }
891       }
892     }
893   }
894   if (x5 == x7 && x3 == x6 && x0 == x4) {
895     std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x2);
896     for (int i2 = 0; i2 != x2.size(); ++i2) {
897       for (int i1 = 0; i1 != x1.size(); ++i1) {
898         for (int i7 = 0; i7 != x7.size(); ++i7) {
899           for (int i6 = 0; i6 != x6.size(); ++i6) {
900             for (int i4 = 0; i4 != x4.size(); ++i4) {
901               odata[i4+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
902                 += (2.0) * i0data[i1+x1.size()*(i2)] * fdata[i7+x5.size()*(i4+x4.size()*(i6+x3.size()*(i2)))];
903             }
904           }
905         }
906       }
907     }
908   }
909   if (x3 == x6 && x0 == x4) {
910     std::unique_ptr<double[]> i0data = in(2)->get_block(x5, x7, x1, x2);
911     for (int i2 = 0; i2 != x2.size(); ++i2) {
912       for (int i1 = 0; i1 != x1.size(); ++i1) {
913         for (int i7 = 0; i7 != x7.size(); ++i7) {
914           for (int i5 = 0; i5 != x5.size(); ++i5) {
915             for (int i6 = 0; i6 != x6.size(); ++i6) {
916               for (int i4 = 0; i4 != x4.size(); ++i4) {
917                 odata[i4+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
918                   += (-1.0) * i0data[i5+x5.size()*(i7+x7.size()*(i1+x1.size()*(i2)))] * fdata[i5+x5.size()*(i4+x4.size()*(i6+x3.size()*(i2)))];
919               }
920             }
921           }
922         }
923       }
924     }
925   }
926   if (x5 == x6 && x3 == x7 && x0 == x4) {
927     std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x2);
928     for (int i2 = 0; i2 != x2.size(); ++i2) {
929       for (int i1 = 0; i1 != x1.size(); ++i1) {
930         for (int i6 = 0; i6 != x6.size(); ++i6) {
931           for (int i7 = 0; i7 != x7.size(); ++i7) {
932             for (int i4 = 0; i4 != x4.size(); ++i4) {
933               odata[i4+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
934                 += (-1.0) * i0data[i1+x1.size()*(i2)] * fdata[i6+x5.size()*(i4+x4.size()*(i7+x3.size()*(i2)))];
935             }
936           }
937         }
938       }
939     }
940   }
941   if (x3 == x7 && x0 == x4) {
942     std::unique_ptr<double[]> i0data = in(2)->get_block(x1, x6, x5, x2);
943     for (int i2 = 0; i2 != x2.size(); ++i2) {
944       for (int i5 = 0; i5 != x5.size(); ++i5) {
945         for (int i6 = 0; i6 != x6.size(); ++i6) {
946           for (int i1 = 0; i1 != x1.size(); ++i1) {
947             for (int i7 = 0; i7 != x7.size(); ++i7) {
948               for (int i4 = 0; i4 != x4.size(); ++i4) {
949                 odata[i4+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
950                   += (-1.0) * i0data[i1+x1.size()*(i6+x6.size()*(i5+x5.size()*(i2)))] * fdata[i5+x5.size()*(i4+x4.size()*(i7+x3.size()*(i2)))];
951               }
952             }
953           }
954         }
955       }
956     }
957   }
958   if (x5 == x6 && x0 == x4) {
959     std::unique_ptr<double[]> i0data = in(2)->get_block(x1, x7, x3, x2);
960     for (int i2 = 0; i2 != x2.size(); ++i2) {
961       for (int i3 = 0; i3 != x3.size(); ++i3) {
962         for (int i7 = 0; i7 != x7.size(); ++i7) {
963           for (int i1 = 0; i1 != x1.size(); ++i1) {
964             for (int i6 = 0; i6 != x6.size(); ++i6) {
965               for (int i4 = 0; i4 != x4.size(); ++i4) {
966                 odata[i4+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
967                   += (-1.0) * i0data[i1+x1.size()*(i7+x7.size()*(i3+x3.size()*(i2)))] * fdata[i6+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
968               }
969             }
970           }
971         }
972       }
973     }
974   }
975   if (x5 == x7 && x0 == x4) {
976     std::unique_ptr<double[]> i0data = in(2)->get_block(x1, x6, x3, x2);
977     for (int i2 = 0; i2 != x2.size(); ++i2) {
978       for (int i3 = 0; i3 != x3.size(); ++i3) {
979         for (int i6 = 0; i6 != x6.size(); ++i6) {
980           for (int i1 = 0; i1 != x1.size(); ++i1) {
981             for (int i7 = 0; i7 != x7.size(); ++i7) {
982               for (int i4 = 0; i4 != x4.size(); ++i4) {
983                 odata[i4+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
984                   += (2.0) * i0data[i1+x1.size()*(i6+x6.size()*(i3+x3.size()*(i2)))] * fdata[i7+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
985               }
986             }
987           }
988         }
989       }
990     }
991   }
992   // rdm0 merged case
993   if (x5 == x7 && x3 == x4 && x1 == x2 && x0 == x6) {
994     std::unique_ptr<double[]> i0data = in(0)->get_block();
995     for (int i7 = 0; i7 != x7.size(); ++i7) {
996       for (int i4 = 0; i4 != x4.size(); ++i4) {
997         for (int i2 = 0; i2 != x2.size(); ++i2) {
998           for (int i6 = 0; i6 != x6.size(); ++i6) {
999             odata[i6+x0.size()*(i7+x7.size()*(i2+x1.size()*(i6)))]  += 2.0 * i0data[0] * fdata[i7+x5.size()*(i4+x4.size()*(i4+x3.size()*(i2)))];
1000           }
1001         }
1002       }
1003     }
1004   }
1005   if (x5 == x7 && x1 == x2 && x0 == x6) {
1006     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x4);
1007     for (int i4 = 0; i4 != x4.size(); ++i4) {
1008       for (int i3 = 0; i3 != x3.size(); ++i3) {
1009         for (int i7 = 0; i7 != x7.size(); ++i7) {
1010           for (int i2 = 0; i2 != x2.size(); ++i2) {
1011             for (int i6 = 0; i6 != x6.size(); ++i6) {
1012               odata[i6+x0.size()*(i7+x7.size()*(i2+x1.size()*(i6)))]
1013                 += (-1.0) * i0data[i3+x3.size()*(i4)] * fdata[i7+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
1014             }
1015           }
1016         }
1017       }
1018     }
1019   }
1020   if (x5 == x7 && x1 == x4 && x0 == x6) {
1021     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x2);
1022     for (int i2 = 0; i2 != x2.size(); ++i2) {
1023       for (int i3 = 0; i3 != x3.size(); ++i3) {
1024         for (int i7 = 0; i7 != x7.size(); ++i7) {
1025           for (int i4 = 0; i4 != x4.size(); ++i4) {
1026             for (int i6 = 0; i6 != x6.size(); ++i6) {
1027               odata[i6+x0.size()*(i7+x7.size()*(i4+x1.size()*(i6)))]
1028                 += (2.0) * i0data[i3+x3.size()*(i2)] * fdata[i7+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
1029             }
1030           }
1031         }
1032       }
1033     }
1034   }
1035   if (x5 == x7 && x3 == x4 && x0 == x6) {
1036     std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x2);
1037     for (int i2 = 0; i2 != x2.size(); ++i2) {
1038       for (int i1 = 0; i1 != x1.size(); ++i1) {
1039         for (int i7 = 0; i7 != x7.size(); ++i7) {
1040           for (int i4 = 0; i4 != x4.size(); ++i4) {
1041             for (int i6 = 0; i6 != x6.size(); ++i6) {
1042               odata[i6+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
1043                 += (-1.0) * i0data[i1+x1.size()*(i2)] * fdata[i7+x5.size()*(i4+x4.size()*(i4+x3.size()*(i2)))];
1044             }
1045           }
1046         }
1047       }
1048     }
1049   }
1050   if (x5 == x7 && x0 == x6) {
1051     std::unique_ptr<double[]> i0data = in(2)->get_block(x1, x4, x3, x2);
1052     for (int i2 = 0; i2 != x2.size(); ++i2) {
1053       for (int i3 = 0; i3 != x3.size(); ++i3) {
1054         for (int i4 = 0; i4 != x4.size(); ++i4) {
1055           for (int i1 = 0; i1 != x1.size(); ++i1) {
1056             for (int i7 = 0; i7 != x7.size(); ++i7) {
1057               for (int i6 = 0; i6 != x6.size(); ++i6) {
1058                 odata[i6+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
1059                   += (-1.0) * i0data[i1+x1.size()*(i4+x4.size()*(i3+x3.size()*(i2)))] * fdata[i7+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
1060               }
1061             }
1062           }
1063         }
1064       }
1065     }
1066   }
1067   // rdm0 merged case
1068   if (x5 == x6 && x3 == x4 && x1 == x2 && x0 == x7) {
1069     std::unique_ptr<double[]> i0data = in(0)->get_block();
1070     for (int i6 = 0; i6 != x6.size(); ++i6) {
1071       for (int i4 = 0; i4 != x4.size(); ++i4) {
1072         for (int i2 = 0; i2 != x2.size(); ++i2) {
1073           for (int i7 = 0; i7 != x7.size(); ++i7) {
1074             odata[i7+x0.size()*(i7+x7.size()*(i2+x1.size()*(i6)))]  += -4.0 * i0data[0] * fdata[i6+x5.size()*(i4+x4.size()*(i4+x3.size()*(i2)))];
1075           }
1076         }
1077       }
1078     }
1079   }
1080   if (x5 == x6 && x1 == x2 && x0 == x7) {
1081     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x4);
1082     for (int i4 = 0; i4 != x4.size(); ++i4) {
1083       for (int i3 = 0; i3 != x3.size(); ++i3) {
1084         for (int i6 = 0; i6 != x6.size(); ++i6) {
1085           for (int i2 = 0; i2 != x2.size(); ++i2) {
1086             for (int i7 = 0; i7 != x7.size(); ++i7) {
1087               odata[i7+x0.size()*(i7+x7.size()*(i2+x1.size()*(i6)))]
1088                 += (2.0) * i0data[i3+x3.size()*(i4)] * fdata[i6+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
1089             }
1090           }
1091         }
1092       }
1093     }
1094   }
1095   if (x5 == x6 && x1 == x4 && x0 == x7) {
1096     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x2);
1097     for (int i2 = 0; i2 != x2.size(); ++i2) {
1098       for (int i3 = 0; i3 != x3.size(); ++i3) {
1099         for (int i6 = 0; i6 != x6.size(); ++i6) {
1100           for (int i4 = 0; i4 != x4.size(); ++i4) {
1101             for (int i7 = 0; i7 != x7.size(); ++i7) {
1102               odata[i7+x0.size()*(i7+x7.size()*(i4+x1.size()*(i6)))]
1103                 += (-4.0) * i0data[i3+x3.size()*(i2)] * fdata[i6+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
1104             }
1105           }
1106         }
1107       }
1108     }
1109   }
1110   if (x5 == x6 && x3 == x4 && x0 == x7) {
1111     std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x2);
1112     for (int i2 = 0; i2 != x2.size(); ++i2) {
1113       for (int i1 = 0; i1 != x1.size(); ++i1) {
1114         for (int i6 = 0; i6 != x6.size(); ++i6) {
1115           for (int i4 = 0; i4 != x4.size(); ++i4) {
1116             for (int i7 = 0; i7 != x7.size(); ++i7) {
1117               odata[i7+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
1118                 += (2.0) * i0data[i1+x1.size()*(i2)] * fdata[i6+x5.size()*(i4+x4.size()*(i4+x3.size()*(i2)))];
1119             }
1120           }
1121         }
1122       }
1123     }
1124   }
1125   if (x5 == x6 && x0 == x7) {
1126     std::unique_ptr<double[]> i0data = in(2)->get_block(x1, x4, x3, x2);
1127     for (int i2 = 0; i2 != x2.size(); ++i2) {
1128       for (int i3 = 0; i3 != x3.size(); ++i3) {
1129         for (int i4 = 0; i4 != x4.size(); ++i4) {
1130           for (int i1 = 0; i1 != x1.size(); ++i1) {
1131             for (int i6 = 0; i6 != x6.size(); ++i6) {
1132               for (int i7 = 0; i7 != x7.size(); ++i7) {
1133                 odata[i7+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
1134                   += (2.0) * i0data[i1+x1.size()*(i4+x4.size()*(i3+x3.size()*(i2)))] * fdata[i6+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
1135               }
1136             }
1137           }
1138         }
1139       }
1140     }
1141   }
1142   if (x5 == x6 && x3 == x4 && x1 == x2) {
1143     std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x7);
1144     for (int i7 = 0; i7 != x7.size(); ++i7) {
1145       for (int i0 = 0; i0 != x0.size(); ++i0) {
1146         for (int i6 = 0; i6 != x6.size(); ++i6) {
1147           for (int i4 = 0; i4 != x4.size(); ++i4) {
1148             for (int i2 = 0; i2 != x2.size(); ++i2) {
1149               odata[i0+x0.size()*(i7+x7.size()*(i2+x1.size()*(i6)))]
1150                 += (2.0) * i0data[i0+x0.size()*(i7)] * fdata[i6+x5.size()*(i4+x4.size()*(i4+x3.size()*(i2)))];
1151             }
1152           }
1153         }
1154       }
1155     }
1156   }
1157   if (x5 == x7 && x3 == x4 && x1 == x2) {
1158     std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x6);
1159     for (int i6 = 0; i6 != x6.size(); ++i6) {
1160       for (int i0 = 0; i0 != x0.size(); ++i0) {
1161         for (int i7 = 0; i7 != x7.size(); ++i7) {
1162           for (int i4 = 0; i4 != x4.size(); ++i4) {
1163             for (int i2 = 0; i2 != x2.size(); ++i2) {
1164               odata[i0+x0.size()*(i7+x7.size()*(i2+x1.size()*(i6)))]
1165                 += (-1.0) * i0data[i0+x0.size()*(i6)] * fdata[i7+x5.size()*(i4+x4.size()*(i4+x3.size()*(i2)))];
1166             }
1167           }
1168         }
1169       }
1170     }
1171   }
1172   if (x5 == x7 && x3 == x6 && x1 == x2) {
1173     std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x4);
1174     for (int i4 = 0; i4 != x4.size(); ++i4) {
1175       for (int i0 = 0; i0 != x0.size(); ++i0) {
1176         for (int i7 = 0; i7 != x7.size(); ++i7) {
1177           for (int i6 = 0; i6 != x6.size(); ++i6) {
1178             for (int i2 = 0; i2 != x2.size(); ++i2) {
1179               odata[i0+x0.size()*(i7+x7.size()*(i2+x1.size()*(i6)))]
1180                 += (2.0) * i0data[i0+x0.size()*(i4)] * fdata[i7+x5.size()*(i4+x4.size()*(i6+x3.size()*(i2)))];
1181             }
1182           }
1183         }
1184       }
1185     }
1186   }
1187   if (x3 == x6 && x1 == x2) {
1188     std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x7, x5, x4);
1189     for (int i4 = 0; i4 != x4.size(); ++i4) {
1190       for (int i5 = 0; i5 != x5.size(); ++i5) {
1191         for (int i7 = 0; i7 != x7.size(); ++i7) {
1192           for (int i0 = 0; i0 != x0.size(); ++i0) {
1193             for (int i6 = 0; i6 != x6.size(); ++i6) {
1194               for (int i2 = 0; i2 != x2.size(); ++i2) {
1195                 odata[i0+x0.size()*(i7+x7.size()*(i2+x1.size()*(i6)))]
1196                   += (2.0) * i0data[i0+x0.size()*(i7+x7.size()*(i5+x5.size()*(i4)))] * fdata[i5+x5.size()*(i4+x4.size()*(i6+x3.size()*(i2)))];
1197               }
1198             }
1199           }
1200         }
1201       }
1202     }
1203   }
1204   if (x5 == x6 && x3 == x7 && x1 == x2) {
1205     std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x4);
1206     for (int i4 = 0; i4 != x4.size(); ++i4) {
1207       for (int i0 = 0; i0 != x0.size(); ++i0) {
1208         for (int i6 = 0; i6 != x6.size(); ++i6) {
1209           for (int i7 = 0; i7 != x7.size(); ++i7) {
1210             for (int i2 = 0; i2 != x2.size(); ++i2) {
1211               odata[i0+x0.size()*(i7+x7.size()*(i2+x1.size()*(i6)))]
1212                 += (-1.0) * i0data[i0+x0.size()*(i4)] * fdata[i6+x5.size()*(i4+x4.size()*(i7+x3.size()*(i2)))];
1213             }
1214           }
1215         }
1216       }
1217     }
1218   }
1219   if (x3 == x7 && x1 == x2) {
1220     std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x6, x5, x4);
1221     for (int i4 = 0; i4 != x4.size(); ++i4) {
1222       for (int i5 = 0; i5 != x5.size(); ++i5) {
1223         for (int i6 = 0; i6 != x6.size(); ++i6) {
1224           for (int i0 = 0; i0 != x0.size(); ++i0) {
1225             for (int i7 = 0; i7 != x7.size(); ++i7) {
1226               for (int i2 = 0; i2 != x2.size(); ++i2) {
1227                 odata[i0+x0.size()*(i7+x7.size()*(i2+x1.size()*(i6)))]
1228                   += (-1.0) * i0data[i0+x0.size()*(i6+x6.size()*(i5+x5.size()*(i4)))] * fdata[i5+x5.size()*(i4+x4.size()*(i7+x3.size()*(i2)))];
1229               }
1230             }
1231           }
1232         }
1233       }
1234     }
1235   }
1236   if (x5 == x6 && x1 == x2) {
1237     std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x7, x3, x4);
1238     for (int i4 = 0; i4 != x4.size(); ++i4) {
1239       for (int i3 = 0; i3 != x3.size(); ++i3) {
1240         for (int i7 = 0; i7 != x7.size(); ++i7) {
1241           for (int i0 = 0; i0 != x0.size(); ++i0) {
1242             for (int i6 = 0; i6 != x6.size(); ++i6) {
1243               for (int i2 = 0; i2 != x2.size(); ++i2) {
1244                 odata[i0+x0.size()*(i7+x7.size()*(i2+x1.size()*(i6)))]
1245                   += (-1.0) * i0data[i0+x0.size()*(i7+x7.size()*(i3+x3.size()*(i4)))] * fdata[i6+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
1246               }
1247             }
1248           }
1249         }
1250       }
1251     }
1252   }
1253   if (x5 == x7 && x1 == x2) {
1254     std::unique_ptr<double[]> i0data = in(2)->get_block(x3, x6, x0, x4);
1255     for (int i4 = 0; i4 != x4.size(); ++i4) {
1256       for (int i0 = 0; i0 != x0.size(); ++i0) {
1257         for (int i6 = 0; i6 != x6.size(); ++i6) {
1258           for (int i3 = 0; i3 != x3.size(); ++i3) {
1259             for (int i7 = 0; i7 != x7.size(); ++i7) {
1260               for (int i2 = 0; i2 != x2.size(); ++i2) {
1261                 odata[i0+x0.size()*(i7+x7.size()*(i2+x1.size()*(i6)))]
1262                   += (-1.0) * i0data[i3+x3.size()*(i6+x6.size()*(i0+x0.size()*(i4)))] * fdata[i7+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
1263               }
1264             }
1265           }
1266         }
1267       }
1268     }
1269   }
1270   if (x5 == x7 && x3 == x6 && x1 == x4) {
1271     std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x2);
1272     for (int i2 = 0; i2 != x2.size(); ++i2) {
1273       for (int i0 = 0; i0 != x0.size(); ++i0) {
1274         for (int i7 = 0; i7 != x7.size(); ++i7) {
1275           for (int i6 = 0; i6 != x6.size(); ++i6) {
1276             for (int i4 = 0; i4 != x4.size(); ++i4) {
1277               odata[i0+x0.size()*(i7+x7.size()*(i4+x1.size()*(i6)))]
1278                 += (-1.0) * i0data[i0+x0.size()*(i2)] * fdata[i7+x5.size()*(i4+x4.size()*(i6+x3.size()*(i2)))];
1279             }
1280           }
1281         }
1282       }
1283     }
1284   }
1285   if (x3 == x6 && x1 == x4) {
1286     std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x7, x5, x2);
1287     for (int i2 = 0; i2 != x2.size(); ++i2) {
1288       for (int i5 = 0; i5 != x5.size(); ++i5) {
1289         for (int i7 = 0; i7 != x7.size(); ++i7) {
1290           for (int i0 = 0; i0 != x0.size(); ++i0) {
1291             for (int i6 = 0; i6 != x6.size(); ++i6) {
1292               for (int i4 = 0; i4 != x4.size(); ++i4) {
1293                 odata[i0+x0.size()*(i7+x7.size()*(i4+x1.size()*(i6)))]
1294                   += (-1.0) * i0data[i0+x0.size()*(i7+x7.size()*(i5+x5.size()*(i2)))] * fdata[i5+x5.size()*(i4+x4.size()*(i6+x3.size()*(i2)))];
1295               }
1296             }
1297           }
1298         }
1299       }
1300     }
1301   }
1302   if (x5 == x6 && x3 == x7 && x1 == x4) {
1303     std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x2);
1304     for (int i2 = 0; i2 != x2.size(); ++i2) {
1305       for (int i0 = 0; i0 != x0.size(); ++i0) {
1306         for (int i6 = 0; i6 != x6.size(); ++i6) {
1307           for (int i7 = 0; i7 != x7.size(); ++i7) {
1308             for (int i4 = 0; i4 != x4.size(); ++i4) {
1309               odata[i0+x0.size()*(i7+x7.size()*(i4+x1.size()*(i6)))]
1310                 += (2.0) * i0data[i0+x0.size()*(i2)] * fdata[i6+x5.size()*(i4+x4.size()*(i7+x3.size()*(i2)))];
1311             }
1312           }
1313         }
1314       }
1315     }
1316   }
1317   if (x3 == x7 && x1 == x4) {
1318     std::unique_ptr<double[]> i0data = in(2)->get_block(x5, x6, x0, x2);
1319     for (int i2 = 0; i2 != x2.size(); ++i2) {
1320       for (int i0 = 0; i0 != x0.size(); ++i0) {
1321         for (int i6 = 0; i6 != x6.size(); ++i6) {
1322           for (int i5 = 0; i5 != x5.size(); ++i5) {
1323             for (int i7 = 0; i7 != x7.size(); ++i7) {
1324               for (int i4 = 0; i4 != x4.size(); ++i4) {
1325                 odata[i0+x0.size()*(i7+x7.size()*(i4+x1.size()*(i6)))]
1326                   += (-1.0) * i0data[i5+x5.size()*(i6+x6.size()*(i0+x0.size()*(i2)))] * fdata[i5+x5.size()*(i4+x4.size()*(i7+x3.size()*(i2)))];
1327               }
1328             }
1329           }
1330         }
1331       }
1332     }
1333   }
1334   if (x5 == x6 && x1 == x4) {
1335     std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x7, x3, x2);
1336     for (int i2 = 0; i2 != x2.size(); ++i2) {
1337       for (int i3 = 0; i3 != x3.size(); ++i3) {
1338         for (int i7 = 0; i7 != x7.size(); ++i7) {
1339           for (int i0 = 0; i0 != x0.size(); ++i0) {
1340             for (int i6 = 0; i6 != x6.size(); ++i6) {
1341               for (int i4 = 0; i4 != x4.size(); ++i4) {
1342                 odata[i0+x0.size()*(i7+x7.size()*(i4+x1.size()*(i6)))]
1343                   += (2.0) * i0data[i0+x0.size()*(i7+x7.size()*(i3+x3.size()*(i2)))] * fdata[i6+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
1344               }
1345             }
1346           }
1347         }
1348       }
1349     }
1350   }
1351   if (x5 == x7 && x1 == x4) {
1352     std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x6, x3, x2);
1353     for (int i2 = 0; i2 != x2.size(); ++i2) {
1354       for (int i3 = 0; i3 != x3.size(); ++i3) {
1355         for (int i6 = 0; i6 != x6.size(); ++i6) {
1356           for (int i0 = 0; i0 != x0.size(); ++i0) {
1357             for (int i7 = 0; i7 != x7.size(); ++i7) {
1358               for (int i4 = 0; i4 != x4.size(); ++i4) {
1359                 odata[i0+x0.size()*(i7+x7.size()*(i4+x1.size()*(i6)))]
1360                   += (-1.0) * i0data[i0+x0.size()*(i6+x6.size()*(i3+x3.size()*(i2)))] * fdata[i7+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
1361               }
1362             }
1363           }
1364         }
1365       }
1366     }
1367   }
1368   if (x5 == x7 && x3 == x4 && x1 == x6) {
1369     std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x2);
1370     for (int i2 = 0; i2 != x2.size(); ++i2) {
1371       for (int i0 = 0; i0 != x0.size(); ++i0) {
1372         for (int i7 = 0; i7 != x7.size(); ++i7) {
1373           for (int i4 = 0; i4 != x4.size(); ++i4) {
1374             for (int i6 = 0; i6 != x6.size(); ++i6) {
1375               odata[i0+x0.size()*(i7+x7.size()*(i6+x1.size()*(i6)))]
1376                 += (2.0) * i0data[i0+x0.size()*(i2)] * fdata[i7+x5.size()*(i4+x4.size()*(i4+x3.size()*(i2)))];
1377             }
1378           }
1379         }
1380       }
1381     }
1382   }
1383   if (x5 == x7 && x1 == x6) {
1384     std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x4, x3, x2);
1385     for (int i2 = 0; i2 != x2.size(); ++i2) {
1386       for (int i3 = 0; i3 != x3.size(); ++i3) {
1387         for (int i4 = 0; i4 != x4.size(); ++i4) {
1388           for (int i0 = 0; i0 != x0.size(); ++i0) {
1389             for (int i7 = 0; i7 != x7.size(); ++i7) {
1390               for (int i6 = 0; i6 != x6.size(); ++i6) {
1391                 odata[i0+x0.size()*(i7+x7.size()*(i6+x1.size()*(i6)))]
1392                   += (2.0) * i0data[i0+x0.size()*(i4+x4.size()*(i3+x3.size()*(i2)))] * fdata[i7+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
1393               }
1394             }
1395           }
1396         }
1397       }
1398     }
1399   }
1400   if (x5 == x6 && x3 == x4 && x1 == x7) {
1401     std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x2);
1402     for (int i2 = 0; i2 != x2.size(); ++i2) {
1403       for (int i0 = 0; i0 != x0.size(); ++i0) {
1404         for (int i6 = 0; i6 != x6.size(); ++i6) {
1405           for (int i4 = 0; i4 != x4.size(); ++i4) {
1406             for (int i7 = 0; i7 != x7.size(); ++i7) {
1407               odata[i0+x0.size()*(i7+x7.size()*(i7+x1.size()*(i6)))]
1408                 += (-1.0) * i0data[i0+x0.size()*(i2)] * fdata[i6+x5.size()*(i4+x4.size()*(i4+x3.size()*(i2)))];
1409             }
1410           }
1411         }
1412       }
1413     }
1414   }
1415   if (x5 == x6 && x1 == x7) {
1416     std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x4, x3, x2);
1417     for (int i2 = 0; i2 != x2.size(); ++i2) {
1418       for (int i3 = 0; i3 != x3.size(); ++i3) {
1419         for (int i4 = 0; i4 != x4.size(); ++i4) {
1420           for (int i0 = 0; i0 != x0.size(); ++i0) {
1421             for (int i6 = 0; i6 != x6.size(); ++i6) {
1422               for (int i7 = 0; i7 != x7.size(); ++i7) {
1423                 odata[i0+x0.size()*(i7+x7.size()*(i7+x1.size()*(i6)))]
1424                   += (-1.0) * i0data[i0+x0.size()*(i4+x4.size()*(i3+x3.size()*(i2)))] * fdata[i6+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
1425               }
1426             }
1427           }
1428         }
1429       }
1430     }
1431   }
1432   if (x5 == x6 && x3 == x4) {
1433     std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x7, x1, x2);
1434     for (int i2 = 0; i2 != x2.size(); ++i2) {
1435       for (int i1 = 0; i1 != x1.size(); ++i1) {
1436         for (int i7 = 0; i7 != x7.size(); ++i7) {
1437           for (int i0 = 0; i0 != x0.size(); ++i0) {
1438             for (int i6 = 0; i6 != x6.size(); ++i6) {
1439               for (int i4 = 0; i4 != x4.size(); ++i4) {
1440                 odata[i0+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
1441                   += (-1.0) * i0data[i0+x0.size()*(i7+x7.size()*(i1+x1.size()*(i2)))] * fdata[i6+x5.size()*(i4+x4.size()*(i4+x3.size()*(i2)))];
1442               }
1443             }
1444           }
1445         }
1446       }
1447     }
1448   }
1449   if (x5 == x7 && x3 == x4) {
1450     std::unique_ptr<double[]> i0data = in(2)->get_block(x1, x6, x0, x2);
1451     for (int i2 = 0; i2 != x2.size(); ++i2) {
1452       for (int i0 = 0; i0 != x0.size(); ++i0) {
1453         for (int i6 = 0; i6 != x6.size(); ++i6) {
1454           for (int i1 = 0; i1 != x1.size(); ++i1) {
1455             for (int i7 = 0; i7 != x7.size(); ++i7) {
1456               for (int i4 = 0; i4 != x4.size(); ++i4) {
1457                 odata[i0+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
1458                   += (-1.0) * i0data[i1+x1.size()*(i6+x6.size()*(i0+x0.size()*(i2)))] * fdata[i7+x5.size()*(i4+x4.size()*(i4+x3.size()*(i2)))];
1459               }
1460             }
1461           }
1462         }
1463       }
1464     }
1465   }
1466   if (x5 == x7 && x3 == x6) {
1467     std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x4, x1, x2);
1468     for (int i2 = 0; i2 != x2.size(); ++i2) {
1469       for (int i1 = 0; i1 != x1.size(); ++i1) {
1470         for (int i4 = 0; i4 != x4.size(); ++i4) {
1471           for (int i0 = 0; i0 != x0.size(); ++i0) {
1472             for (int i7 = 0; i7 != x7.size(); ++i7) {
1473               for (int i6 = 0; i6 != x6.size(); ++i6) {
1474                 odata[i0+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
1475                   += (-1.0) * i0data[i0+x0.size()*(i4+x4.size()*(i1+x1.size()*(i2)))] * fdata[i7+x5.size()*(i4+x4.size()*(i6+x3.size()*(i2)))];
1476               }
1477             }
1478           }
1479         }
1480       }
1481     }
1482   }
1483   if (x3 == x6) {
1484     std::unique_ptr<double[]> i0data = in(3)->get_block(x0, x7, x5, x4, x1, x2);
1485     for (int i2 = 0; i2 != x2.size(); ++i2) {
1486       for (int i1 = 0; i1 != x1.size(); ++i1) {
1487         for (int i4 = 0; i4 != x4.size(); ++i4) {
1488           for (int i5 = 0; i5 != x5.size(); ++i5) {
1489             for (int i7 = 0; i7 != x7.size(); ++i7) {
1490               for (int i0 = 0; i0 != x0.size(); ++i0) {
1491                 for (int i6 = 0; i6 != x6.size(); ++i6) {
1492                   odata[i0+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
1493                     += (-1.0) * i0data[i0+x0.size()*(i7+x7.size()*(i5+x5.size()*(i4+x4.size()*(i1+x1.size()*(i2)))))] * fdata[i5+x5.size()*(i4+x4.size()*(i6+x3.size()*(i2)))];
1494                 }
1495               }
1496             }
1497           }
1498         }
1499       }
1500     }
1501   }
1502   if (x5 == x6 && x3 == x7) {
1503     std::unique_ptr<double[]> i0data = in(2)->get_block(x1, x4, x0, x2);
1504     for (int i2 = 0; i2 != x2.size(); ++i2) {
1505       for (int i0 = 0; i0 != x0.size(); ++i0) {
1506         for (int i4 = 0; i4 != x4.size(); ++i4) {
1507           for (int i1 = 0; i1 != x1.size(); ++i1) {
1508             for (int i6 = 0; i6 != x6.size(); ++i6) {
1509               for (int i7 = 0; i7 != x7.size(); ++i7) {
1510                 odata[i0+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
1511                   += (-1.0) * i0data[i1+x1.size()*(i4+x4.size()*(i0+x0.size()*(i2)))] * fdata[i6+x5.size()*(i4+x4.size()*(i7+x3.size()*(i2)))];
1512               }
1513             }
1514           }
1515         }
1516       }
1517     }
1518   }
1519   if (x3 == x7) {
1520     std::unique_ptr<double[]> i0data = in(3)->get_block(x1, x6, x5, x4, x0, x2);
1521     for (int i2 = 0; i2 != x2.size(); ++i2) {
1522       for (int i0 = 0; i0 != x0.size(); ++i0) {
1523         for (int i4 = 0; i4 != x4.size(); ++i4) {
1524           for (int i5 = 0; i5 != x5.size(); ++i5) {
1525             for (int i6 = 0; i6 != x6.size(); ++i6) {
1526               for (int i1 = 0; i1 != x1.size(); ++i1) {
1527                 for (int i7 = 0; i7 != x7.size(); ++i7) {
1528                   odata[i0+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
1529                     += (-1.0) * i0data[i1+x1.size()*(i6+x6.size()*(i5+x5.size()*(i4+x4.size()*(i0+x0.size()*(i2)))))] * fdata[i5+x5.size()*(i4+x4.size()*(i7+x3.size()*(i2)))];
1530                 }
1531               }
1532             }
1533           }
1534         }
1535       }
1536     }
1537   }
1538   if (x5 == x6) {
1539     std::unique_ptr<double[]> i0data = in(3)->get_block(x0, x7, x1, x4, x3, x2);
1540     for (int i2 = 0; i2 != x2.size(); ++i2) {
1541       for (int i3 = 0; i3 != x3.size(); ++i3) {
1542         for (int i4 = 0; i4 != x4.size(); ++i4) {
1543           for (int i1 = 0; i1 != x1.size(); ++i1) {
1544             for (int i7 = 0; i7 != x7.size(); ++i7) {
1545               for (int i0 = 0; i0 != x0.size(); ++i0) {
1546                 for (int i6 = 0; i6 != x6.size(); ++i6) {
1547                   odata[i0+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
1548                     += (-1.0) * i0data[i0+x0.size()*(i7+x7.size()*(i1+x1.size()*(i4+x4.size()*(i3+x3.size()*(i2)))))] * fdata[i6+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
1549                 }
1550               }
1551             }
1552           }
1553         }
1554       }
1555     }
1556   }
1557   if (x5 == x7) {
1558     std::unique_ptr<double[]> i0data = in(3)->get_block(x1, x6, x0, x4, x3, x2);
1559     for (int i2 = 0; i2 != x2.size(); ++i2) {
1560       for (int i3 = 0; i3 != x3.size(); ++i3) {
1561         for (int i4 = 0; i4 != x4.size(); ++i4) {
1562           for (int i0 = 0; i0 != x0.size(); ++i0) {
1563             for (int i6 = 0; i6 != x6.size(); ++i6) {
1564               for (int i1 = 0; i1 != x1.size(); ++i1) {
1565                 for (int i7 = 0; i7 != x7.size(); ++i7) {
1566                   odata[i0+x0.size()*(i7+x7.size()*(i1+x1.size()*(i6)))]
1567                     += (-1.0) * i0data[i1+x1.size()*(i6+x6.size()*(i0+x0.size()*(i4+x4.size()*(i3+x3.size()*(i2)))))] * fdata[i7+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
1568                 }
1569               }
1570             }
1571           }
1572         }
1573       }
1574     }
1575   }
1576   out()->add_block(odata, x0, x7, x1, x6);
1577 }
1578 
compute()1579 void Task104::Task_local::compute() {
1580   const Index x0 = b(0);
1581   const Index x1 = b(1);
1582   // scalar
1583   // tensor label: Gamma558
1584   std::unique_ptr<double[]> odata(new double[out()->get_size()]);
1585   std::fill_n(odata.get(), out()->get_size(), 0.0);
1586   // associated with merged
1587   std::unique_ptr<double[]> fdata = in(1)->get_block(x1, x0);
1588   out()->add_block(odata);
1589 }
1590 
compute()1591 void Task105::Task_local::compute() {
1592   const Index x0 = b(0);
1593   const Index x1 = b(1);
1594   const Index x2 = b(2);
1595   const Index x3 = b(3);
1596   // scalar
1597   // tensor label: Gamma560
1598   std::unique_ptr<double[]> odata(new double[out()->get_size()]);
1599   std::fill_n(odata.get(), out()->get_size(), 0.0);
1600   // associated with merged
1601   std::unique_ptr<double[]> fdata = in(2)->get_block(x3, x2, x1, x0);
1602   out()->add_block(odata);
1603 }
1604 
compute()1605 void Task106::Task_local::compute() {
1606   const Index x1 = b(0);
1607   const Index x4 = b(1);
1608   const Index x0 = b(2);
1609   const Index x5 = b(3);
1610   const Index x2 = b(4);
1611   const Index x3 = b(5);
1612   // tensor label: Gamma566
1613   std::unique_ptr<double[]> odata(new double[out()->get_size(x5, x0, x4, x1)]);
1614   std::fill_n(odata.get(), out()->get_size(x5, x0, x4, x1), 0.0);
1615   // associated with merged
1616   std::unique_ptr<double[]> fdata = in(2)->get_block(x3, x2);
1617   if (x4 == x2) {
1618     std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x1, x5, x0);
1619     for (int i0 = 0; i0 != x0.size(); ++i0) {
1620       for (int i5 = 0; i5 != x5.size(); ++i5) {
1621         for (int i1 = 0; i1 != x1.size(); ++i1) {
1622           for (int i3 = 0; i3 != x3.size(); ++i3) {
1623             for (int i2 = 0; i2 != x2.size(); ++i2) {
1624               odata[i5+x5.size()*(i0+x0.size()*(i2+x4.size()*(i1)))]
1625                 += (1.0) * i0data[i3+x3.size()*(i1+x1.size()*(i5+x5.size()*(i0)))] * fdata[i3+x3.size()*(i2)];
1626             }
1627           }
1628         }
1629       }
1630     }
1631   }
1632   if (x5 == x2) {
1633     std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x0, x4, x1);
1634     for (int i1 = 0; i1 != x1.size(); ++i1) {
1635       for (int i4 = 0; i4 != x4.size(); ++i4) {
1636         for (int i0 = 0; i0 != x0.size(); ++i0) {
1637           for (int i3 = 0; i3 != x3.size(); ++i3) {
1638             for (int i2 = 0; i2 != x2.size(); ++i2) {
1639               odata[i2+x5.size()*(i0+x0.size()*(i4+x4.size()*(i1)))]
1640                 += (1.0) * i0data[i3+x3.size()*(i0+x0.size()*(i4+x4.size()*(i1)))] * fdata[i3+x3.size()*(i2)];
1641             }
1642           }
1643         }
1644       }
1645     }
1646   }
1647   out()->add_block(odata, x5, x0, x4, x1);
1648 }
1649 
compute()1650 void Task107::Task_local::compute() {
1651   const Index x1 = b(0);
1652   const Index x6 = b(1);
1653   const Index x0 = b(2);
1654   const Index x7 = b(3);
1655   const Index x2 = b(4);
1656   const Index x3 = b(5);
1657   const Index x4 = b(6);
1658   const Index x5 = b(7);
1659   // tensor label: Gamma567
1660   std::unique_ptr<double[]> odata(new double[out()->get_size(x7, x0, x6, x1)]);
1661   std::fill_n(odata.get(), out()->get_size(x7, x0, x6, x1), 0.0);
1662   // associated with merged
1663   std::unique_ptr<double[]> fdata = in(3)->get_block(x5, x4, x3, x2);
1664   if (x7 == x4 && x6 == x2) {
1665     std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0, x3, x1);
1666     for (int i1 = 0; i1 != x1.size(); ++i1) {
1667       for (int i3 = 0; i3 != x3.size(); ++i3) {
1668         for (int i0 = 0; i0 != x0.size(); ++i0) {
1669           for (int i5 = 0; i5 != x5.size(); ++i5) {
1670             for (int i4 = 0; i4 != x4.size(); ++i4) {
1671               for (int i2 = 0; i2 != x2.size(); ++i2) {
1672                 odata[i4+x7.size()*(i0+x0.size()*(i2+x6.size()*(i1)))]
1673                   += (1.0) * i0data[i5+x5.size()*(i0+x0.size()*(i3+x3.size()*(i1)))] * fdata[i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
1674               }
1675             }
1676           }
1677         }
1678       }
1679     }
1680   }
1681   if (x7 == x2 && x6 == x4) {
1682     std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x1, x3, x0);
1683     for (int i0 = 0; i0 != x0.size(); ++i0) {
1684       for (int i3 = 0; i3 != x3.size(); ++i3) {
1685         for (int i1 = 0; i1 != x1.size(); ++i1) {
1686           for (int i5 = 0; i5 != x5.size(); ++i5) {
1687             for (int i2 = 0; i2 != x2.size(); ++i2) {
1688               for (int i4 = 0; i4 != x4.size(); ++i4) {
1689                 odata[i2+x7.size()*(i0+x0.size()*(i4+x6.size()*(i1)))]
1690                   += (1.0) * i0data[i5+x5.size()*(i1+x1.size()*(i3+x3.size()*(i0)))] * fdata[i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
1691               }
1692             }
1693           }
1694         }
1695       }
1696     }
1697   }
1698   if (x6 == x4) {
1699     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x1, x3, x2, x7, x0);
1700     for (int i0 = 0; i0 != x0.size(); ++i0) {
1701       for (int i7 = 0; i7 != x7.size(); ++i7) {
1702         for (int i2 = 0; i2 != x2.size(); ++i2) {
1703           for (int i3 = 0; i3 != x3.size(); ++i3) {
1704             for (int i1 = 0; i1 != x1.size(); ++i1) {
1705               for (int i5 = 0; i5 != x5.size(); ++i5) {
1706                 for (int i4 = 0; i4 != x4.size(); ++i4) {
1707                   odata[i7+x7.size()*(i0+x0.size()*(i4+x6.size()*(i1)))]
1708                     += (1.0) * i0data[i5+x5.size()*(i1+x1.size()*(i3+x3.size()*(i2+x2.size()*(i7+x7.size()*(i0)))))] * fdata[i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
1709                 }
1710               }
1711             }
1712           }
1713         }
1714       }
1715     }
1716   }
1717   if (x7 == x4) {
1718     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x0, x3, x2, x6, x1);
1719     for (int i1 = 0; i1 != x1.size(); ++i1) {
1720       for (int i6 = 0; i6 != x6.size(); ++i6) {
1721         for (int i2 = 0; i2 != x2.size(); ++i2) {
1722           for (int i3 = 0; i3 != x3.size(); ++i3) {
1723             for (int i0 = 0; i0 != x0.size(); ++i0) {
1724               for (int i5 = 0; i5 != x5.size(); ++i5) {
1725                 for (int i4 = 0; i4 != x4.size(); ++i4) {
1726                   odata[i4+x7.size()*(i0+x0.size()*(i6+x6.size()*(i1)))]
1727                     += (1.0) * i0data[i5+x5.size()*(i0+x0.size()*(i3+x3.size()*(i2+x2.size()*(i6+x6.size()*(i1)))))] * fdata[i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
1728                 }
1729               }
1730             }
1731           }
1732         }
1733       }
1734     }
1735   }
1736   if (x3 == x4 && x6 == x2) {
1737     std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x1, x7, x0);
1738     for (int i0 = 0; i0 != x0.size(); ++i0) {
1739       for (int i7 = 0; i7 != x7.size(); ++i7) {
1740         for (int i1 = 0; i1 != x1.size(); ++i1) {
1741           for (int i5 = 0; i5 != x5.size(); ++i5) {
1742             for (int i4 = 0; i4 != x4.size(); ++i4) {
1743               for (int i2 = 0; i2 != x2.size(); ++i2) {
1744                 odata[i7+x7.size()*(i0+x0.size()*(i2+x6.size()*(i1)))]
1745                   += (1.0) * i0data[i5+x5.size()*(i1+x1.size()*(i7+x7.size()*(i0)))] * fdata[i5+x5.size()*(i4+x4.size()*(i4+x3.size()*(i2)))];
1746               }
1747             }
1748           }
1749         }
1750       }
1751     }
1752   }
1753   if (x6 == x2) {
1754     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x4, x3, x1, x7, x0);
1755     for (int i0 = 0; i0 != x0.size(); ++i0) {
1756       for (int i7 = 0; i7 != x7.size(); ++i7) {
1757         for (int i1 = 0; i1 != x1.size(); ++i1) {
1758           for (int i3 = 0; i3 != x3.size(); ++i3) {
1759             for (int i4 = 0; i4 != x4.size(); ++i4) {
1760               for (int i5 = 0; i5 != x5.size(); ++i5) {
1761                 for (int i2 = 0; i2 != x2.size(); ++i2) {
1762                   odata[i7+x7.size()*(i0+x0.size()*(i2+x6.size()*(i1)))]
1763                     += (1.0) * i0data[i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i1+x1.size()*(i7+x7.size()*(i0)))))] * fdata[i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
1764                 }
1765               }
1766             }
1767           }
1768         }
1769       }
1770     }
1771   }
1772   if (x3 == x4 && x7 == x2) {
1773     std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0, x6, x1);
1774     for (int i1 = 0; i1 != x1.size(); ++i1) {
1775       for (int i6 = 0; i6 != x6.size(); ++i6) {
1776         for (int i0 = 0; i0 != x0.size(); ++i0) {
1777           for (int i5 = 0; i5 != x5.size(); ++i5) {
1778             for (int i4 = 0; i4 != x4.size(); ++i4) {
1779               for (int i2 = 0; i2 != x2.size(); ++i2) {
1780                 odata[i2+x7.size()*(i0+x0.size()*(i6+x6.size()*(i1)))]
1781                   += (1.0) * i0data[i5+x5.size()*(i0+x0.size()*(i6+x6.size()*(i1)))] * fdata[i5+x5.size()*(i4+x4.size()*(i4+x3.size()*(i2)))];
1782               }
1783             }
1784           }
1785         }
1786       }
1787     }
1788   }
1789   if (x7 == x2) {
1790     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x4, x3, x0, x6, x1);
1791     for (int i1 = 0; i1 != x1.size(); ++i1) {
1792       for (int i6 = 0; i6 != x6.size(); ++i6) {
1793         for (int i0 = 0; i0 != x0.size(); ++i0) {
1794           for (int i3 = 0; i3 != x3.size(); ++i3) {
1795             for (int i4 = 0; i4 != x4.size(); ++i4) {
1796               for (int i5 = 0; i5 != x5.size(); ++i5) {
1797                 for (int i2 = 0; i2 != x2.size(); ++i2) {
1798                   odata[i2+x7.size()*(i0+x0.size()*(i6+x6.size()*(i1)))]
1799                     += (1.0) * i0data[i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i0+x0.size()*(i6+x6.size()*(i1)))))] * fdata[i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
1800                 }
1801               }
1802             }
1803           }
1804         }
1805       }
1806     }
1807   }
1808   out()->add_block(odata, x7, x0, x6, x1);
1809 }
1810 
compute()1811 void Task109::Task_local::compute() {
1812   const Index c2 = b(0);
1813   const Index x1 = b(1);
1814   const Index c1 = b(2);
1815   const Index x0 = b(3);
1816   // tensor label: r
1817   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, x1, c1, x0)]);
1818   std::fill_n(odata.get(), out()->get_size(c2, x1, c1, x0), 0.0);
1819   {
1820     // tensor label: I0
1821     std::unique_ptr<double[]> i0data = in(0)->get_block(c2, c1, x0, x1);
1822     sort_indices<0,3,1,2,1,1,1,1>(i0data, odata, c2.size(), c1.size(), x0.size(), x1.size());
1823   }
1824   {
1825     // tensor label: I0
1826     std::unique_ptr<double[]> i0data = in(0)->get_block(c1, c2, x1, x0);
1827     sort_indices<1,2,0,3,1,1,1,1>(i0data, odata, c1.size(), c2.size(), x1.size(), x0.size());
1828   }
1829   out()->add_block(odata, c2, x1, c1, x0);
1830 }
1831 
compute()1832 void Task110::Task_local::compute() {
1833   const Index c2 = b(0);
1834   const Index c1 = b(1);
1835   const Index x0 = b(2);
1836   const Index x1 = b(3);
1837   // tensor label: I0
1838   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, c1, x0, x1)]);
1839   std::fill_n(odata.get(), out()->get_size(c2, c1, x0, x1), 0.0);
1840   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, c1, x0, x1)]);
1841   std::fill_n(odata_sorted.get(), out()->get_size(c2, c1, x0, x1), 0.0);
1842   for (auto& x3 : *range_[1]) {
1843     for (auto& x2 : *range_[1]) {
1844       // tensor label: Gamma0
1845       std::unique_ptr<double[]> i0data = in(0)->get_block(x0, x3, x1, x2);
1846       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x0, x3, x1, x2)]);
1847       sort_indices<1,3,0,2,0,1,1,1>(i0data, i0data_sorted, x0.size(), x3.size(), x1.size(), x2.size());
1848       // tensor label: I1
1849       std::unique_ptr<double[]> i1data = in(1)->get_block(c2, c1, x3, x2);
1850       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c2, c1, x3, x2)]);
1851       sort_indices<2,3,0,1,0,1,1,1>(i1data, i1data_sorted, c2.size(), c1.size(), x3.size(), x2.size());
1852       dgemm_("T", "N", x0.size()*x1.size(), c2.size()*c1.size(), x3.size()*x2.size(),
1853              1.0, i0data_sorted, x3.size()*x2.size(), i1data_sorted, x3.size()*x2.size(),
1854              1.0, odata_sorted, x0.size()*x1.size());
1855     }
1856   }
1857   sort_indices<2,3,0,1,1,1,1,1>(odata_sorted, odata, x0.size(), x1.size(), c2.size(), c1.size());
1858   out()->add_block(odata, c2, c1, x0, x1);
1859 }
1860 
compute()1861 void Task111::Task_local::compute() {
1862   const Index c2 = b(0);
1863   const Index c1 = b(1);
1864   const Index x3 = b(2);
1865   const Index x2 = b(3);
1866   // tensor label: I1
1867   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, c1, x3, x2)]);
1868   std::fill_n(odata.get(), out()->get_size(c2, c1, x3, x2), 0.0);
1869   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, c1, x3, x2)]);
1870   std::fill_n(odata_sorted.get(), out()->get_size(c2, c1, x3, x2), 0.0);
1871   for (auto& c3 : *range_[0]) {
1872     // tensor label: t2
1873     std::unique_ptr<double[]> i0data = in(0)->get_block(c1, x3, c3, x2);
1874     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c1, x3, c3, x2)]);
1875     sort_indices<2,0,1,3,0,1,1,1>(i0data, i0data_sorted, c1.size(), x3.size(), c3.size(), x2.size());
1876     // tensor label: h1
1877     std::unique_ptr<double[]> i1data = in(1)->get_block(c2, c3);
1878     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c2, c3)]);
1879     sort_indices<1,0,0,1,-2,1>(i1data, i1data_sorted, c2.size(), c3.size());
1880     dgemm_("T", "N", c1.size()*x3.size()*x2.size(), c2.size(), c3.size(),
1881            1.0, i0data_sorted, c3.size(), i1data_sorted, c3.size(),
1882            1.0, odata_sorted, c1.size()*x3.size()*x2.size());
1883   }
1884   sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, c1.size(), x3.size(), x2.size(), c2.size());
1885   out()->add_block(odata, c2, c1, x3, x2);
1886 }
1887 
compute()1888 void Task112::Task_local::compute() {
1889   const Index c2 = b(0);
1890   const Index c1 = b(1);
1891   const Index x3 = b(2);
1892   const Index x2 = b(3);
1893   // tensor label: I1
1894   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, c1, x3, x2)]);
1895   std::fill_n(odata.get(), out()->get_size(c2, c1, x3, x2), 0.0);
1896   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, c1, x3, x2)]);
1897   std::fill_n(odata_sorted.get(), out()->get_size(c2, c1, x3, x2), 0.0);
1898   for (auto& c3 : *range_[0]) {
1899     for (auto& a4 : *range_[2]) {
1900       // tensor label: t2
1901       std::unique_ptr<double[]> i0data = in(0)->get_block(c3, a4, c1, x3);
1902       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c3, a4, c1, x3)]);
1903       sort_indices<0,1,2,3,0,1,1,1>(i0data, i0data_sorted, c3.size(), a4.size(), c1.size(), x3.size());
1904       // tensor label: I280
1905       std::unique_ptr<double[]> i1data = in(1)->get_block(a4, x2, c2, c3);
1906       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(a4, x2, c2, c3)]);
1907       sort_indices<3,0,1,2,0,1,1,1>(i1data, i1data_sorted, a4.size(), x2.size(), c2.size(), c3.size());
1908       dgemm_("T", "N", c1.size()*x3.size(), x2.size()*c2.size(), a4.size()*c3.size(),
1909              1.0, i0data_sorted, a4.size()*c3.size(), i1data_sorted, a4.size()*c3.size(),
1910              1.0, odata_sorted, c1.size()*x3.size());
1911     }
1912   }
1913   sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, c1.size(), x3.size(), x2.size(), c2.size());
1914   out()->add_block(odata, c2, c1, x3, x2);
1915 }
1916 
compute()1917 void Task113::Task_local::compute() {
1918   const Index a4 = b(0);
1919   const Index x2 = b(1);
1920   const Index c2 = b(2);
1921   const Index c3 = b(3);
1922   // tensor label: I280
1923   std::unique_ptr<double[]> odata(new double[out()->get_size(a4, x2, c2, c3)]);
1924   std::fill_n(odata.get(), out()->get_size(a4, x2, c2, c3), 0.0);
1925   {
1926     // tensor label: v2
1927     std::unique_ptr<double[]> i0data = in(0)->get_block(a4, x2, c2, c3);
1928     sort_indices<0,1,2,3,1,1,-1,1>(i0data, odata, a4.size(), x2.size(), c2.size(), c3.size());
1929   }
1930   {
1931     // tensor label: v2
1932     std::unique_ptr<double[]> i1data = in(0)->get_block(c2, x2, a4, c3);
1933     sort_indices<2,1,0,3,1,1,2,1>(i1data, odata, c2.size(), x2.size(), a4.size(), c3.size());
1934   }
1935   out()->add_block(odata, a4, x2, c2, c3);
1936 }
1937 
compute()1938 void Task114::Task_local::compute() {
1939   const Index c2 = b(0);
1940   const Index c1 = b(1);
1941   const Index x3 = b(2);
1942   const Index x2 = b(3);
1943   // tensor label: I1
1944   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, c1, x3, x2)]);
1945   std::fill_n(odata.get(), out()->get_size(c2, c1, x3, x2), 0.0);
1946   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, c1, x3, x2)]);
1947   std::fill_n(odata_sorted.get(), out()->get_size(c2, c1, x3, x2), 0.0);
1948   for (auto& a4 : *range_[2]) {
1949     for (auto& c3 : *range_[0]) {
1950       // tensor label: t2
1951       std::unique_ptr<double[]> i0data = in(0)->get_block(c1, a4, c3, x3);
1952       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c1, a4, c3, x3)]);
1953       sort_indices<1,2,0,3,0,1,1,1>(i0data, i0data_sorted, c1.size(), a4.size(), c3.size(), x3.size());
1954       // tensor label: v2
1955       std::unique_ptr<double[]> i1data = in(1)->get_block(c2, x2, a4, c3);
1956       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c2, x2, a4, c3)]);
1957       sort_indices<2,3,0,1,0,1,-1,1>(i1data, i1data_sorted, c2.size(), x2.size(), a4.size(), c3.size());
1958       dgemm_("T", "N", c1.size()*x3.size(), c2.size()*x2.size(), a4.size()*c3.size(),
1959              1.0, i0data_sorted, a4.size()*c3.size(), i1data_sorted, a4.size()*c3.size(),
1960              1.0, odata_sorted, c1.size()*x3.size());
1961     }
1962   }
1963   sort_indices<2,0,1,3,1,1,1,1>(odata_sorted, odata, c1.size(), x3.size(), c2.size(), x2.size());
1964   out()->add_block(odata, c2, c1, x3, x2);
1965 }
1966 
compute()1967 void Task115::Task_local::compute() {
1968   const Index c2 = b(0);
1969   const Index c1 = b(1);
1970   const Index x0 = b(2);
1971   const Index x1 = b(3);
1972   // tensor label: I0
1973   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, c1, x0, x1)]);
1974   std::fill_n(odata.get(), out()->get_size(c2, c1, x0, x1), 0.0);
1975   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, c1, x0, x1)]);
1976   std::fill_n(odata_sorted.get(), out()->get_size(c2, c1, x0, x1), 0.0);
1977   for (auto& x2 : *range_[1]) {
1978     // tensor label: h1
1979     std::unique_ptr<double[]> i0data = in(0)->get_block(c2, x2);
1980     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c2, x2)]);
1981     sort_indices<1,0,0,1,1,1>(i0data, i0data_sorted, c2.size(), x2.size());
1982     // tensor label: I4
1983     std::unique_ptr<double[]> i1data = in(1)->get_block(c1, x0, x1, x2);
1984     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c1, x0, x1, x2)]);
1985     sort_indices<3,0,1,2,0,1,1,1>(i1data, i1data_sorted, c1.size(), x0.size(), x1.size(), x2.size());
1986     dgemm_("T", "N", c2.size(), c1.size()*x0.size()*x1.size(), x2.size(),
1987            1.0, i0data_sorted, x2.size(), i1data_sorted, x2.size(),
1988            1.0, odata_sorted, c2.size());
1989   }
1990   sort_indices<0,1,2,3,1,1,1,1>(odata_sorted, odata, c2.size(), c1.size(), x0.size(), x1.size());
1991   out()->add_block(odata, c2, c1, x0, x1);
1992 }
1993 
compute()1994 void Task116::Task_local::compute() {
1995   const Index c1 = b(0);
1996   const Index x0 = b(1);
1997   const Index x1 = b(2);
1998   const Index x2 = b(3);
1999   // tensor label: I4
2000   std::unique_ptr<double[]> odata(new double[out()->get_size(c1, x0, x1, x2)]);
2001   std::fill_n(odata.get(), out()->get_size(c1, x0, x1, x2), 0.0);
2002   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c1, x0, x1, x2)]);
2003   std::fill_n(odata_sorted.get(), out()->get_size(c1, x0, x1, x2), 0.0);
2004   for (auto& x5 : *range_[1]) {
2005     for (auto& x4 : *range_[1]) {
2006       for (auto& x3 : *range_[1]) {
2007         // tensor label: Gamma1
2008         std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x4, x0, x3, x1, x2);
2009         std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x5, x4, x0, x3, x1, x2)]);
2010         sort_indices<0,1,3,2,4,5,0,1,1,1>(i0data, i0data_sorted, x5.size(), x4.size(), x0.size(), x3.size(), x1.size(), x2.size());
2011         // tensor label: t2
2012         std::unique_ptr<double[]> i1data = in(1)->get_block(x5, x4, c1, x3);
2013         std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x5, x4, c1, x3)]);
2014         sort_indices<0,1,3,2,0,1,1,1>(i1data, i1data_sorted, x5.size(), x4.size(), c1.size(), x3.size());
2015         dgemm_("T", "N", x0.size()*x1.size()*x2.size(), c1.size(), x5.size()*x4.size()*x3.size(),
2016                1.0, i0data_sorted, x5.size()*x4.size()*x3.size(), i1data_sorted, x5.size()*x4.size()*x3.size(),
2017                1.0, odata_sorted, x0.size()*x1.size()*x2.size());
2018       }
2019     }
2020   }
2021   sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, x0.size(), x1.size(), x2.size(), c1.size());
2022   out()->add_block(odata, c1, x0, x1, x2);
2023 }
2024 
compute()2025 void Task117::Task_local::compute() {
2026   const Index c2 = b(0);
2027   const Index c1 = b(1);
2028   const Index x0 = b(2);
2029   const Index x1 = b(3);
2030   // tensor label: I0
2031   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, c1, x0, x1)]);
2032   std::fill_n(odata.get(), out()->get_size(c2, c1, x0, x1), 0.0);
2033   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, c1, x0, x1)]);
2034   std::fill_n(odata_sorted.get(), out()->get_size(c2, c1, x0, x1), 0.0);
2035   for (auto& x3 : *range_[1]) {
2036     for (auto& x2 : *range_[1]) {
2037       // tensor label: Gamma2
2038       std::unique_ptr<double[]> i0data = in(0)->get_block(x1, x3, x0, x2);
2039       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, x3, x0, x2)]);
2040       sort_indices<1,3,0,2,0,1,1,1>(i0data, i0data_sorted, x1.size(), x3.size(), x0.size(), x2.size());
2041       // tensor label: I7
2042       std::unique_ptr<double[]> i1data = in(1)->get_block(x2, c1, c2, x3);
2043       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x2, c1, c2, x3)]);
2044       sort_indices<3,0,1,2,0,1,1,1>(i1data, i1data_sorted, x2.size(), c1.size(), c2.size(), x3.size());
2045       dgemm_("T", "N", x1.size()*x0.size(), c1.size()*c2.size(), x2.size()*x3.size(),
2046              1.0, i0data_sorted, x2.size()*x3.size(), i1data_sorted, x2.size()*x3.size(),
2047              1.0, odata_sorted, x1.size()*x0.size());
2048     }
2049   }
2050   sort_indices<3,2,1,0,1,1,1,1>(odata_sorted, odata, x1.size(), x0.size(), c1.size(), c2.size());
2051   out()->add_block(odata, c2, c1, x0, x1);
2052 }
2053 
compute()2054 void Task118::Task_local::compute() {
2055   const Index x2 = b(0);
2056   const Index c1 = b(1);
2057   const Index c2 = b(2);
2058   const Index x3 = b(3);
2059   // tensor label: I7
2060   std::unique_ptr<double[]> odata(new double[out()->get_size(x2, c1, c2, x3)]);
2061   std::fill_n(odata.get(), out()->get_size(x2, c1, c2, x3), 0.0);
2062   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(x2, c1, c2, x3)]);
2063   std::fill_n(odata_sorted.get(), out()->get_size(x2, c1, c2, x3), 0.0);
2064   for (auto& a3 : *range_[2]) {
2065     // tensor label: t2
2066     std::unique_ptr<double[]> i0data = in(0)->get_block(c1, a3, c2, x3);
2067     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c1, a3, c2, x3)]);
2068     sort_indices<1,0,2,3,0,1,1,1>(i0data, i0data_sorted, c1.size(), a3.size(), c2.size(), x3.size());
2069     // tensor label: h1
2070     std::unique_ptr<double[]> i1data = in(1)->get_block(a3, x2);
2071     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(a3, x2)]);
2072     sort_indices<0,1,0,1,-1,1>(i1data, i1data_sorted, a3.size(), x2.size());
2073     dgemm_("T", "N", c1.size()*c2.size()*x3.size(), x2.size(), a3.size(),
2074            1.0, i0data_sorted, a3.size(), i1data_sorted, a3.size(),
2075            1.0, odata_sorted, c1.size()*c2.size()*x3.size());
2076   }
2077   sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, c1.size(), c2.size(), x3.size(), x2.size());
2078   out()->add_block(odata, x2, c1, c2, x3);
2079 }
2080 
compute()2081 void Task119::Task_local::compute() {
2082   const Index x2 = b(0);
2083   const Index c1 = b(1);
2084   const Index c2 = b(2);
2085   const Index x3 = b(3);
2086   // tensor label: I7
2087   std::unique_ptr<double[]> odata(new double[out()->get_size(x2, c1, c2, x3)]);
2088   std::fill_n(odata.get(), out()->get_size(x2, c1, c2, x3), 0.0);
2089   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(x2, c1, c2, x3)]);
2090   std::fill_n(odata_sorted.get(), out()->get_size(x2, c1, c2, x3), 0.0);
2091   for (auto& a4 : *range_[2]) {
2092     for (auto& c3 : *range_[0]) {
2093       // tensor label: t2
2094       std::unique_ptr<double[]> i0data = in(0)->get_block(c1, a4, c3, x3);
2095       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c1, a4, c3, x3)]);
2096       sort_indices<1,2,0,3,0,1,1,1>(i0data, i0data_sorted, c1.size(), a4.size(), c3.size(), x3.size());
2097       // tensor label: v2
2098       std::unique_ptr<double[]> i1data = in(1)->get_block(a4, x2, c2, c3);
2099       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(a4, x2, c2, c3)]);
2100       sort_indices<0,3,1,2,0,1,1,1>(i1data, i1data_sorted, a4.size(), x2.size(), c2.size(), c3.size());
2101       dgemm_("T", "N", c1.size()*x3.size(), x2.size()*c2.size(), a4.size()*c3.size(),
2102              1.0, i0data_sorted, a4.size()*c3.size(), i1data_sorted, a4.size()*c3.size(),
2103              1.0, odata_sorted, c1.size()*x3.size());
2104     }
2105   }
2106   sort_indices<2,0,3,1,1,1,1,1>(odata_sorted, odata, c1.size(), x3.size(), x2.size(), c2.size());
2107   out()->add_block(odata, x2, c1, c2, x3);
2108 }
2109 
compute()2110 void Task120::Task_local::compute() {
2111   const Index c2 = b(0);
2112   const Index c1 = b(1);
2113   const Index x0 = b(2);
2114   const Index x1 = b(3);
2115   // tensor label: I0
2116   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, c1, x0, x1)]);
2117   std::fill_n(odata.get(), out()->get_size(c2, c1, x0, x1), 0.0);
2118   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, c1, x0, x1)]);
2119   std::fill_n(odata_sorted.get(), out()->get_size(c2, c1, x0, x1), 0.0);
2120   for (auto& x5 : *range_[1]) {
2121     for (auto& x4 : *range_[1]) {
2122       for (auto& x3 : *range_[1]) {
2123         for (auto& x2 : *range_[1]) {
2124           // tensor label: Gamma80
2125           std::unique_ptr<double[]> i0data = in(0)->get_block(x0, x5, x1, x4, x3, x2);
2126           std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x0, x5, x1, x4, x3, x2)]);
2127           sort_indices<1,3,4,5,0,2,0,1,1,1>(i0data, i0data_sorted, x0.size(), x5.size(), x1.size(), x4.size(), x3.size(), x2.size());
2128           // tensor label: I249
2129           std::unique_ptr<double[]> i1data = in(1)->get_block(c2, x3, x2, c1, x5, x4);
2130           std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c2, x3, x2, c1, x5, x4)]);
2131           sort_indices<4,5,1,2,0,3,0,1,1,1>(i1data, i1data_sorted, c2.size(), x3.size(), x2.size(), c1.size(), x5.size(), x4.size());
2132           dgemm_("T", "N", x0.size()*x1.size(), c2.size()*c1.size(), x3.size()*x2.size()*x5.size()*x4.size(),
2133                  1.0, i0data_sorted, x3.size()*x2.size()*x5.size()*x4.size(), i1data_sorted, x3.size()*x2.size()*x5.size()*x4.size(),
2134                  1.0, odata_sorted, x0.size()*x1.size());
2135         }
2136       }
2137     }
2138   }
2139   sort_indices<2,3,0,1,1,1,1,1>(odata_sorted, odata, x0.size(), x1.size(), c2.size(), c1.size());
2140   out()->add_block(odata, c2, c1, x0, x1);
2141 }
2142 
compute()2143 void Task121::Task_local::compute() {
2144   const Index c2 = b(0);
2145   const Index x3 = b(1);
2146   const Index x2 = b(2);
2147   const Index c1 = b(3);
2148   const Index x5 = b(4);
2149   const Index x4 = b(5);
2150   // tensor label: I249
2151   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, x3, x2, c1, x5, x4)]);
2152   std::fill_n(odata.get(), out()->get_size(c2, x3, x2, c1, x5, x4), 0.0);
2153   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, x3, x2, c1, x5, x4)]);
2154   std::fill_n(odata_sorted.get(), out()->get_size(c2, x3, x2, c1, x5, x4), 0.0);
2155   for (auto& c3 : *range_[0]) {
2156     // tensor label: t2
2157     std::unique_ptr<double[]> i0data = in(0)->get_block(c1, x5, c3, x4);
2158     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c1, x5, c3, x4)]);
2159     sort_indices<2,0,1,3,0,1,1,1>(i0data, i0data_sorted, c1.size(), x5.size(), c3.size(), x4.size());
2160     // tensor label: I250
2161     std::unique_ptr<double[]> i1data = in(1)->get_block(c2, c3, x3, x2);
2162     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c2, c3, x3, x2)]);
2163     sort_indices<1,0,2,3,0,1,1,1>(i1data, i1data_sorted, c2.size(), c3.size(), x3.size(), x2.size());
2164     dgemm_("T", "N", c1.size()*x5.size()*x4.size(), c2.size()*x3.size()*x2.size(), c3.size(),
2165            1.0, i0data_sorted, c3.size(), i1data_sorted, c3.size(),
2166            1.0, odata_sorted, c1.size()*x5.size()*x4.size());
2167   }
2168   sort_indices<3,4,5,0,1,2,1,1,1,1>(odata_sorted, odata, c1.size(), x5.size(), x4.size(), c2.size(), x3.size(), x2.size());
2169   out()->add_block(odata, c2, x3, x2, c1, x5, x4);
2170 }
2171 
compute()2172 void Task122::Task_local::compute() {
2173   const Index c2 = b(0);
2174   const Index c3 = b(1);
2175   const Index x3 = b(2);
2176   const Index x2 = b(3);
2177   // tensor label: I250
2178   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, c3, x3, x2)]);
2179   std::fill_n(odata.get(), out()->get_size(c2, c3, x3, x2), 0.0);
2180   {
2181     // tensor label: v2
2182     std::unique_ptr<double[]> i0data = in(0)->get_block(c2, c3, x3, x2);
2183     sort_indices<0,1,2,3,1,1,-1,1>(i0data, odata, c2.size(), c3.size(), x3.size(), x2.size());
2184   }
2185   {
2186     // tensor label: v2
2187     std::unique_ptr<double[]> i1data = in(0)->get_block(x3, x2, c2, c3);
2188     sort_indices<2,3,0,1,1,1,-1,1>(i1data, odata, x3.size(), x2.size(), c2.size(), c3.size());
2189   }
2190   out()->add_block(odata, c2, c3, x3, x2);
2191 }
2192 
compute()2193 void Task123::Task_local::compute() {
2194   const Index c2 = b(0);
2195   const Index c1 = b(1);
2196   const Index x0 = b(2);
2197   const Index x1 = b(3);
2198   // tensor label: I0
2199   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, c1, x0, x1)]);
2200   std::fill_n(odata.get(), out()->get_size(c2, c1, x0, x1), 0.0);
2201   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, c1, x0, x1)]);
2202   std::fill_n(odata_sorted.get(), out()->get_size(c2, c1, x0, x1), 0.0);
2203   for (auto& x5 : *range_[1]) {
2204     for (auto& x2 : *range_[1]) {
2205       for (auto& x4 : *range_[1]) {
2206         for (auto& x3 : *range_[1]) {
2207           // tensor label: Gamma81
2208           std::unique_ptr<double[]> i0data = in(0)->get_block(x0, x5, x2, x4, x1, x3);
2209           std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x0, x5, x2, x4, x1, x3)]);
2210           sort_indices<1,2,3,5,0,4,0,1,1,1>(i0data, i0data_sorted, x0.size(), x5.size(), x2.size(), x4.size(), x1.size(), x3.size());
2211           // tensor label: I252
2212           std::unique_ptr<double[]> i1data = in(1)->get_block(c2, x3, x2, c1, x5, x4);
2213           std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c2, x3, x2, c1, x5, x4)]);
2214           sort_indices<4,2,5,1,0,3,0,1,1,1>(i1data, i1data_sorted, c2.size(), x3.size(), x2.size(), c1.size(), x5.size(), x4.size());
2215           dgemm_("T", "N", x0.size()*x1.size(), c2.size()*c1.size(), x3.size()*x2.size()*x5.size()*x4.size(),
2216                  1.0, i0data_sorted, x3.size()*x2.size()*x5.size()*x4.size(), i1data_sorted, x3.size()*x2.size()*x5.size()*x4.size(),
2217                  1.0, odata_sorted, x0.size()*x1.size());
2218         }
2219       }
2220     }
2221   }
2222   sort_indices<2,3,0,1,1,1,1,1>(odata_sorted, odata, x0.size(), x1.size(), c2.size(), c1.size());
2223   out()->add_block(odata, c2, c1, x0, x1);
2224 }
2225 
compute()2226 void Task124::Task_local::compute() {
2227   const Index c2 = b(0);
2228   const Index x3 = b(1);
2229   const Index x2 = b(2);
2230   const Index c1 = b(3);
2231   const Index x5 = b(4);
2232   const Index x4 = b(5);
2233   // tensor label: I252
2234   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, x3, x2, c1, x5, x4)]);
2235   std::fill_n(odata.get(), out()->get_size(c2, x3, x2, c1, x5, x4), 0.0);
2236   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, x3, x2, c1, x5, x4)]);
2237   std::fill_n(odata_sorted.get(), out()->get_size(c2, x3, x2, c1, x5, x4), 0.0);
2238   for (auto& c3 : *range_[0]) {
2239     // tensor label: t2
2240     std::unique_ptr<double[]> i0data = in(0)->get_block(c1, x5, c3, x4);
2241     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c1, x5, c3, x4)]);
2242     sort_indices<2,0,1,3,0,1,1,1>(i0data, i0data_sorted, c1.size(), x5.size(), c3.size(), x4.size());
2243     // tensor label: v2
2244     std::unique_ptr<double[]> i1data = in(1)->get_block(c2, x3, x2, c3);
2245     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c2, x3, x2, c3)]);
2246     sort_indices<3,0,1,2,0,1,-1,1>(i1data, i1data_sorted, c2.size(), x3.size(), x2.size(), c3.size());
2247     dgemm_("T", "N", c1.size()*x5.size()*x4.size(), c2.size()*x3.size()*x2.size(), c3.size(),
2248            1.0, i0data_sorted, c3.size(), i1data_sorted, c3.size(),
2249            1.0, odata_sorted, c1.size()*x5.size()*x4.size());
2250   }
2251   sort_indices<3,4,5,0,1,2,1,1,1,1>(odata_sorted, odata, c1.size(), x5.size(), x4.size(), c2.size(), x3.size(), x2.size());
2252   out()->add_block(odata, c2, x3, x2, c1, x5, x4);
2253 }
2254 
compute()2255 void Task125::Task_local::compute() {
2256   const Index c2 = b(0);
2257   const Index c1 = b(1);
2258   const Index x0 = b(2);
2259   const Index x1 = b(3);
2260   // tensor label: I0
2261   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, c1, x0, x1)]);
2262   std::fill_n(odata.get(), out()->get_size(c2, c1, x0, x1), 0.0);
2263   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, c1, x0, x1)]);
2264   std::fill_n(odata_sorted.get(), out()->get_size(c2, c1, x0, x1), 0.0);
2265   for (auto& x5 : *range_[1]) {
2266     for (auto& x3 : *range_[1]) {
2267       for (auto& x4 : *range_[1]) {
2268         for (auto& x2 : *range_[1]) {
2269           // tensor label: Gamma82
2270           std::unique_ptr<double[]> i0data = in(0)->get_block(x0, x5, x3, x4, x1, x2);
2271           std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x0, x5, x3, x4, x1, x2)]);
2272           sort_indices<1,2,3,5,0,4,0,1,1,1>(i0data, i0data_sorted, x0.size(), x5.size(), x3.size(), x4.size(), x1.size(), x2.size());
2273           // tensor label: I255
2274           std::unique_ptr<double[]> i1data = in(1)->get_block(x3, c2, x2, c1, x5, x4);
2275           std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x3, c2, x2, c1, x5, x4)]);
2276           sort_indices<4,0,5,2,1,3,0,1,1,1>(i1data, i1data_sorted, x3.size(), c2.size(), x2.size(), c1.size(), x5.size(), x4.size());
2277           dgemm_("T", "N", x0.size()*x1.size(), c2.size()*c1.size(), x3.size()*x2.size()*x5.size()*x4.size(),
2278                  1.0, i0data_sorted, x3.size()*x2.size()*x5.size()*x4.size(), i1data_sorted, x3.size()*x2.size()*x5.size()*x4.size(),
2279                  1.0, odata_sorted, x0.size()*x1.size());
2280         }
2281       }
2282     }
2283   }
2284   sort_indices<2,3,0,1,1,1,1,1>(odata_sorted, odata, x0.size(), x1.size(), c2.size(), c1.size());
2285   out()->add_block(odata, c2, c1, x0, x1);
2286 }
2287 
compute()2288 void Task126::Task_local::compute() {
2289   const Index x3 = b(0);
2290   const Index c2 = b(1);
2291   const Index x2 = b(2);
2292   const Index c1 = b(3);
2293   const Index x5 = b(4);
2294   const Index x4 = b(5);
2295   // tensor label: I255
2296   std::unique_ptr<double[]> odata(new double[out()->get_size(x3, c2, x2, c1, x5, x4)]);
2297   std::fill_n(odata.get(), out()->get_size(x3, c2, x2, c1, x5, x4), 0.0);
2298   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(x3, c2, x2, c1, x5, x4)]);
2299   std::fill_n(odata_sorted.get(), out()->get_size(x3, c2, x2, c1, x5, x4), 0.0);
2300   for (auto& c3 : *range_[0]) {
2301     // tensor label: t2
2302     std::unique_ptr<double[]> i0data = in(0)->get_block(c1, x5, c3, x4);
2303     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c1, x5, c3, x4)]);
2304     sort_indices<2,0,1,3,0,1,1,1>(i0data, i0data_sorted, c1.size(), x5.size(), c3.size(), x4.size());
2305     // tensor label: v2
2306     std::unique_ptr<double[]> i1data = in(1)->get_block(x3, c3, c2, x2);
2307     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x3, c3, c2, x2)]);
2308     sort_indices<1,0,2,3,0,1,1,1>(i1data, i1data_sorted, x3.size(), c3.size(), c2.size(), x2.size());
2309     dgemm_("T", "N", c1.size()*x5.size()*x4.size(), x3.size()*c2.size()*x2.size(), c3.size(),
2310            1.0, i0data_sorted, c3.size(), i1data_sorted, c3.size(),
2311            1.0, odata_sorted, c1.size()*x5.size()*x4.size());
2312   }
2313   sort_indices<3,4,5,0,1,2,1,1,1,1>(odata_sorted, odata, c1.size(), x5.size(), x4.size(), x3.size(), c2.size(), x2.size());
2314   out()->add_block(odata, x3, c2, x2, c1, x5, x4);
2315 }
2316 
compute()2317 void Task127::Task_local::compute() {
2318   const Index c2 = b(0);
2319   const Index c1 = b(1);
2320   const Index x0 = b(2);
2321   const Index x1 = b(3);
2322   // tensor label: I0
2323   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, c1, x0, x1)]);
2324   std::fill_n(odata.get(), out()->get_size(c2, c1, x0, x1), 0.0);
2325   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, c1, x0, x1)]);
2326   std::fill_n(odata_sorted.get(), out()->get_size(c2, c1, x0, x1), 0.0);
2327   for (auto& x7 : *range_[1]) {
2328     for (auto& x6 : *range_[1]) {
2329       for (auto& x5 : *range_[1]) {
2330         // tensor label: t2
2331         std::unique_ptr<double[]> i0data = in(0)->get_block(x7, x6, c1, x5);
2332         std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x7, x6, c1, x5)]);
2333         sort_indices<0,1,3,2,0,1,1,1>(i0data, i0data_sorted, x7.size(), x6.size(), c1.size(), x5.size());
2334         // tensor label: I264
2335         std::unique_ptr<double[]> i1data = in(1)->get_block(c2, x7, x6, x0, x5, x1);
2336         std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c2, x7, x6, x0, x5, x1)]);
2337         sort_indices<1,2,4,0,3,5,0,1,1,1>(i1data, i1data_sorted, c2.size(), x7.size(), x6.size(), x0.size(), x5.size(), x1.size());
2338         dgemm_("T", "N", c1.size(), c2.size()*x0.size()*x1.size(), x7.size()*x6.size()*x5.size(),
2339                1.0, i0data_sorted, x7.size()*x6.size()*x5.size(), i1data_sorted, x7.size()*x6.size()*x5.size(),
2340                1.0, odata_sorted, c1.size());
2341       }
2342     }
2343   }
2344   sort_indices<1,0,2,3,1,1,1,1>(odata_sorted, odata, c1.size(), c2.size(), x0.size(), x1.size());
2345   out()->add_block(odata, c2, c1, x0, x1);
2346 }
2347 
compute()2348 void Task128::Task_local::compute() {
2349   const Index c2 = b(0);
2350   const Index x7 = b(1);
2351   const Index x6 = b(2);
2352   const Index x0 = b(3);
2353   const Index x5 = b(4);
2354   const Index x1 = b(5);
2355   // tensor label: I264
2356   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, x7, x6, x0, x5, x1)]);
2357   std::fill_n(odata.get(), out()->get_size(c2, x7, x6, x0, x5, x1), 0.0);
2358   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, x7, x6, x0, x5, x1)]);
2359   std::fill_n(odata_sorted.get(), out()->get_size(c2, x7, x6, x0, x5, x1), 0.0);
2360   for (auto& x4 : *range_[1]) {
2361     for (auto& x3 : *range_[1]) {
2362       for (auto& x2 : *range_[1]) {
2363         // tensor label: Gamma85
2364         std::unique_ptr<double[]> i0data = in(0)->get_block(x7, x6, x0, x5, x1, x4, x3, x2);
2365         std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x7, x6, x0, x5, x1, x4, x3, x2)]);
2366         sort_indices<5,6,7,0,1,2,3,4,0,1,1,1>(i0data, i0data_sorted, x7.size(), x6.size(), x0.size(), x5.size(), x1.size(), x4.size(), x3.size(), x2.size());
2367         // tensor label: v2
2368         std::unique_ptr<double[]> i1data = in(1)->get_block(c2, x4, x3, x2);
2369         std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c2, x4, x3, x2)]);
2370         sort_indices<1,2,3,0,0,1,1,2>(i1data, i1data_sorted, c2.size(), x4.size(), x3.size(), x2.size());
2371         dgemm_("T", "N", x7.size()*x6.size()*x0.size()*x5.size()*x1.size(), c2.size(), x4.size()*x3.size()*x2.size(),
2372                1.0, i0data_sorted, x4.size()*x3.size()*x2.size(), i1data_sorted, x4.size()*x3.size()*x2.size(),
2373                1.0, odata_sorted, x7.size()*x6.size()*x0.size()*x5.size()*x1.size());
2374       }
2375     }
2376   }
2377   sort_indices<5,0,1,2,3,4,1,1,1,1>(odata_sorted, odata, x7.size(), x6.size(), x0.size(), x5.size(), x1.size(), c2.size());
2378   out()->add_block(odata, c2, x7, x6, x0, x5, x1);
2379 }
2380 
compute()2381 void Task129::Task_local::compute() {
2382   const Index c2 = b(0);
2383   const Index x7 = b(1);
2384   const Index x6 = b(2);
2385   const Index x0 = b(3);
2386   const Index x5 = b(4);
2387   const Index x1 = b(5);
2388   // tensor label: I264
2389   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, x7, x6, x0, x5, x1)]);
2390   std::fill_n(odata.get(), out()->get_size(c2, x7, x6, x0, x5, x1), 0.0);
2391   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, x7, x6, x0, x5, x1)]);
2392   std::fill_n(odata_sorted.get(), out()->get_size(c2, x7, x6, x0, x5, x1), 0.0);
2393   for (auto& x4 : *range_[1]) {
2394     for (auto& x3 : *range_[1]) {
2395       for (auto& x2 : *range_[1]) {
2396         // tensor label: Gamma86
2397         std::unique_ptr<double[]> i0data = in(0)->get_block(x7, x6, x0, x5, x4, x3, x1, x2);
2398         std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x7, x6, x0, x5, x4, x3, x1, x2)]);
2399         sort_indices<4,5,7,0,1,2,3,6,0,1,1,1>(i0data, i0data_sorted, x7.size(), x6.size(), x0.size(), x5.size(), x4.size(), x3.size(), x1.size(), x2.size());
2400         // tensor label: v2
2401         std::unique_ptr<double[]> i1data = in(1)->get_block(x4, x3, c2, x2);
2402         std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x4, x3, c2, x2)]);
2403         sort_indices<0,1,3,2,0,1,1,2>(i1data, i1data_sorted, x4.size(), x3.size(), c2.size(), x2.size());
2404         dgemm_("T", "N", x7.size()*x6.size()*x0.size()*x5.size()*x1.size(), c2.size(), x4.size()*x3.size()*x2.size(),
2405                1.0, i0data_sorted, x4.size()*x3.size()*x2.size(), i1data_sorted, x4.size()*x3.size()*x2.size(),
2406                1.0, odata_sorted, x7.size()*x6.size()*x0.size()*x5.size()*x1.size());
2407       }
2408     }
2409   }
2410   sort_indices<5,0,1,2,3,4,1,1,1,1>(odata_sorted, odata, x7.size(), x6.size(), x0.size(), x5.size(), x1.size(), c2.size());
2411   out()->add_block(odata, c2, x7, x6, x0, x5, x1);
2412 }
2413 
compute()2414 void Task130::Task_local::compute() {
2415   const Index c2 = b(0);
2416   const Index c1 = b(1);
2417   const Index x0 = b(2);
2418   const Index x1 = b(3);
2419   // tensor label: I0
2420   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, c1, x0, x1)]);
2421   std::fill_n(odata.get(), out()->get_size(c2, c1, x0, x1), 0.0);
2422   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, c1, x0, x1)]);
2423   std::fill_n(odata_sorted.get(), out()->get_size(c2, c1, x0, x1), 0.0);
2424   for (auto& x2 : *range_[1]) {
2425     for (auto& c3 : *range_[0]) {
2426       // tensor label: v2
2427       std::unique_ptr<double[]> i0data = in(0)->get_block(c1, x2, c2, c3);
2428       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c1, x2, c2, c3)]);
2429       sort_indices<1,3,0,2,0,1,1,1>(i0data, i0data_sorted, c1.size(), x2.size(), c2.size(), c3.size());
2430       // tensor label: I270
2431       std::unique_ptr<double[]> i1data = in(1)->get_block(c3, x1, x0, x2);
2432       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c3, x1, x0, x2)]);
2433       sort_indices<3,0,1,2,0,1,1,1>(i1data, i1data_sorted, c3.size(), x1.size(), x0.size(), x2.size());
2434       dgemm_("T", "N", c1.size()*c2.size(), x1.size()*x0.size(), c3.size()*x2.size(),
2435              1.0, i0data_sorted, c3.size()*x2.size(), i1data_sorted, c3.size()*x2.size(),
2436              1.0, odata_sorted, c1.size()*c2.size());
2437     }
2438   }
2439   sort_indices<1,0,3,2,1,1,1,1>(odata_sorted, odata, c1.size(), c2.size(), x1.size(), x0.size());
2440   out()->add_block(odata, c2, c1, x0, x1);
2441 }
2442 
compute()2443 void Task131::Task_local::compute() {
2444   const Index c3 = b(0);
2445   const Index x1 = b(1);
2446   const Index x0 = b(2);
2447   const Index x2 = b(3);
2448   // tensor label: I270
2449   std::unique_ptr<double[]> odata(new double[out()->get_size(c3, x1, x0, x2)]);
2450   std::fill_n(odata.get(), out()->get_size(c3, x1, x0, x2), 0.0);
2451   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c3, x1, x0, x2)]);
2452   std::fill_n(odata_sorted.get(), out()->get_size(c3, x1, x0, x2), 0.0);
2453   for (auto& x5 : *range_[1]) {
2454     for (auto& x4 : *range_[1]) {
2455       for (auto& x3 : *range_[1]) {
2456         // tensor label: Gamma87
2457         std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x4, x1, x3, x0, x2);
2458         std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x5, x4, x1, x3, x0, x2)]);
2459         sort_indices<0,1,3,2,4,5,0,1,1,1>(i0data, i0data_sorted, x5.size(), x4.size(), x1.size(), x3.size(), x0.size(), x2.size());
2460         // tensor label: t2
2461         std::unique_ptr<double[]> i1data = in(1)->get_block(x5, x4, c3, x3);
2462         std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x5, x4, c3, x3)]);
2463         sort_indices<0,1,3,2,0,1,1,1>(i1data, i1data_sorted, x5.size(), x4.size(), c3.size(), x3.size());
2464         dgemm_("T", "N", x1.size()*x0.size()*x2.size(), c3.size(), x5.size()*x4.size()*x3.size(),
2465                1.0, i0data_sorted, x5.size()*x4.size()*x3.size(), i1data_sorted, x5.size()*x4.size()*x3.size(),
2466                1.0, odata_sorted, x1.size()*x0.size()*x2.size());
2467       }
2468     }
2469   }
2470   sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, x1.size(), x0.size(), x2.size(), c3.size());
2471   out()->add_block(odata, c3, x1, x0, x2);
2472 }
2473 
compute()2474 void Task132::Task_local::compute() {
2475   const Index c2 = b(0);
2476   const Index c1 = b(1);
2477   const Index x0 = b(2);
2478   const Index x1 = b(3);
2479   // tensor label: I0
2480   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, c1, x0, x1)]);
2481   std::fill_n(odata.get(), out()->get_size(c2, c1, x0, x1), 0.0);
2482   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, c1, x0, x1)]);
2483   std::fill_n(odata_sorted.get(), out()->get_size(c2, c1, x0, x1), 0.0);
2484   for (auto& a3 : *range_[2]) {
2485     for (auto& x5 : *range_[1]) {
2486       // tensor label: t2
2487       std::unique_ptr<double[]> i0data = in(0)->get_block(c1, a3, c2, x5);
2488       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c1, a3, c2, x5)]);
2489       sort_indices<1,3,0,2,0,1,1,1>(i0data, i0data_sorted, c1.size(), a3.size(), c2.size(), x5.size());
2490       // tensor label: I273
2491       std::unique_ptr<double[]> i1data = in(1)->get_block(a3, x1, x5, x0);
2492       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(a3, x1, x5, x0)]);
2493       sort_indices<0,2,1,3,0,1,1,1>(i1data, i1data_sorted, a3.size(), x1.size(), x5.size(), x0.size());
2494       dgemm_("T", "N", c1.size()*c2.size(), x1.size()*x0.size(), a3.size()*x5.size(),
2495              1.0, i0data_sorted, a3.size()*x5.size(), i1data_sorted, a3.size()*x5.size(),
2496              1.0, odata_sorted, c1.size()*c2.size());
2497     }
2498   }
2499   sort_indices<1,0,3,2,1,1,1,1>(odata_sorted, odata, c1.size(), c2.size(), x1.size(), x0.size());
2500   out()->add_block(odata, c2, c1, x0, x1);
2501 }
2502 
compute()2503 void Task133::Task_local::compute() {
2504   const Index a3 = b(0);
2505   const Index x1 = b(1);
2506   const Index x5 = b(2);
2507   const Index x0 = b(3);
2508   // tensor label: I273
2509   std::unique_ptr<double[]> odata(new double[out()->get_size(a3, x1, x5, x0)]);
2510   std::fill_n(odata.get(), out()->get_size(a3, x1, x5, x0), 0.0);
2511   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a3, x1, x5, x0)]);
2512   std::fill_n(odata_sorted.get(), out()->get_size(a3, x1, x5, x0), 0.0);
2513   for (auto& x4 : *range_[1]) {
2514     for (auto& x3 : *range_[1]) {
2515       for (auto& x2 : *range_[1]) {
2516         // tensor label: Gamma88
2517         std::unique_ptr<double[]> i0data = in(0)->get_block(x1, x5, x0, x4, x3, x2);
2518         std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, x5, x0, x4, x3, x2)]);
2519         sort_indices<3,4,5,0,1,2,0,1,1,1>(i0data, i0data_sorted, x1.size(), x5.size(), x0.size(), x4.size(), x3.size(), x2.size());
2520         // tensor label: v2
2521         std::unique_ptr<double[]> i1data = in(1)->get_block(a3, x4, x3, x2);
2522         std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(a3, x4, x3, x2)]);
2523         sort_indices<1,2,3,0,0,1,-1,2>(i1data, i1data_sorted, a3.size(), x4.size(), x3.size(), x2.size());
2524         dgemm_("T", "N", x1.size()*x5.size()*x0.size(), a3.size(), x4.size()*x3.size()*x2.size(),
2525                1.0, i0data_sorted, x4.size()*x3.size()*x2.size(), i1data_sorted, x4.size()*x3.size()*x2.size(),
2526                1.0, odata_sorted, x1.size()*x5.size()*x0.size());
2527       }
2528     }
2529   }
2530   sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, x1.size(), x5.size(), x0.size(), a3.size());
2531   out()->add_block(odata, a3, x1, x5, x0);
2532 }
2533 
compute()2534 void Task134::Task_local::compute() {
2535   const Index a3 = b(0);
2536   const Index x1 = b(1);
2537   const Index x5 = b(2);
2538   const Index x0 = b(3);
2539   // tensor label: I273
2540   std::unique_ptr<double[]> odata(new double[out()->get_size(a3, x1, x5, x0)]);
2541   std::fill_n(odata.get(), out()->get_size(a3, x1, x5, x0), 0.0);
2542   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(a3, x1, x5, x0)]);
2543   std::fill_n(odata_sorted.get(), out()->get_size(a3, x1, x5, x0), 0.0);
2544   for (auto& x4 : *range_[1]) {
2545     for (auto& x3 : *range_[1]) {
2546       for (auto& x2 : *range_[1]) {
2547         // tensor label: Gamma89
2548         std::unique_ptr<double[]> i0data = in(0)->get_block(x1, x5, x4, x3, x0, x2);
2549         std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, x5, x4, x3, x0, x2)]);
2550         sort_indices<2,3,5,0,1,4,0,1,1,1>(i0data, i0data_sorted, x1.size(), x5.size(), x4.size(), x3.size(), x0.size(), x2.size());
2551         // tensor label: v2
2552         std::unique_ptr<double[]> i1data = in(1)->get_block(x4, x3, a3, x2);
2553         std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x4, x3, a3, x2)]);
2554         sort_indices<0,1,3,2,0,1,-1,2>(i1data, i1data_sorted, x4.size(), x3.size(), a3.size(), x2.size());
2555         dgemm_("T", "N", x1.size()*x5.size()*x0.size(), a3.size(), x4.size()*x3.size()*x2.size(),
2556                1.0, i0data_sorted, x4.size()*x3.size()*x2.size(), i1data_sorted, x4.size()*x3.size()*x2.size(),
2557                1.0, odata_sorted, x1.size()*x5.size()*x0.size());
2558       }
2559     }
2560   }
2561   sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, x1.size(), x5.size(), x0.size(), a3.size());
2562   out()->add_block(odata, a3, x1, x5, x0);
2563 }
2564 
compute()2565 void Task135::Task_local::compute() {
2566   const Index c2 = b(0);
2567   const Index c1 = b(1);
2568   const Index x0 = b(2);
2569   const Index x1 = b(3);
2570   // tensor label: I0
2571   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, c1, x0, x1)]);
2572   std::fill_n(odata.get(), out()->get_size(c2, c1, x0, x1), 0.0);
2573   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, c1, x0, x1)]);
2574   std::fill_n(odata_sorted.get(), out()->get_size(c2, c1, x0, x1), 0.0);
2575   for (auto& x5 : *range_[1]) {
2576     for (auto& x2 : *range_[1]) {
2577       for (auto& x4 : *range_[1]) {
2578         for (auto& x3 : *range_[1]) {
2579           // tensor label: Gamma94
2580           std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x2, x0, x4, x1, x3);
2581           std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x5, x2, x0, x4, x1, x3)]);
2582           sort_indices<0,1,3,5,2,4,0,1,1,1>(i0data, i0data_sorted, x5.size(), x2.size(), x0.size(), x4.size(), x1.size(), x3.size());
2583           // tensor label: I291
2584           std::unique_ptr<double[]> i1data = in(1)->get_block(c2, x3, x2, x5, c1, x4);
2585           std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c2, x3, x2, x5, c1, x4)]);
2586           sort_indices<3,2,5,1,0,4,0,1,1,1>(i1data, i1data_sorted, c2.size(), x3.size(), x2.size(), x5.size(), c1.size(), x4.size());
2587           dgemm_("T", "N", x0.size()*x1.size(), c2.size()*c1.size(), x3.size()*x2.size()*x5.size()*x4.size(),
2588                  1.0, i0data_sorted, x3.size()*x2.size()*x5.size()*x4.size(), i1data_sorted, x3.size()*x2.size()*x5.size()*x4.size(),
2589                  1.0, odata_sorted, x0.size()*x1.size());
2590         }
2591       }
2592     }
2593   }
2594   sort_indices<2,3,0,1,1,1,1,1>(odata_sorted, odata, x0.size(), x1.size(), c2.size(), c1.size());
2595   out()->add_block(odata, c2, c1, x0, x1);
2596 }
2597 
compute()2598 void Task136::Task_local::compute() {
2599   const Index c2 = b(0);
2600   const Index x3 = b(1);
2601   const Index x2 = b(2);
2602   const Index x5 = b(3);
2603   const Index c1 = b(4);
2604   const Index x4 = b(5);
2605   // tensor label: I291
2606   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, x3, x2, x5, c1, x4)]);
2607   std::fill_n(odata.get(), out()->get_size(c2, x3, x2, x5, c1, x4), 0.0);
2608   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, x3, x2, x5, c1, x4)]);
2609   std::fill_n(odata_sorted.get(), out()->get_size(c2, x3, x2, x5, c1, x4), 0.0);
2610   for (auto& a3 : *range_[2]) {
2611     // tensor label: t2
2612     std::unique_ptr<double[]> i0data = in(0)->get_block(x5, a3, c1, x4);
2613     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x5, a3, c1, x4)]);
2614     sort_indices<1,0,2,3,0,1,1,1>(i0data, i0data_sorted, x5.size(), a3.size(), c1.size(), x4.size());
2615     // tensor label: v2
2616     std::unique_ptr<double[]> i1data = in(1)->get_block(c2, x3, a3, x2);
2617     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c2, x3, a3, x2)]);
2618     sort_indices<2,0,1,3,0,1,1,1>(i1data, i1data_sorted, c2.size(), x3.size(), a3.size(), x2.size());
2619     dgemm_("T", "N", x5.size()*c1.size()*x4.size(), c2.size()*x3.size()*x2.size(), a3.size(),
2620            1.0, i0data_sorted, a3.size(), i1data_sorted, a3.size(),
2621            1.0, odata_sorted, x5.size()*c1.size()*x4.size());
2622   }
2623   sort_indices<3,4,5,0,1,2,1,1,1,1>(odata_sorted, odata, x5.size(), c1.size(), x4.size(), c2.size(), x3.size(), x2.size());
2624   out()->add_block(odata, c2, x3, x2, x5, c1, x4);
2625 }
2626 
compute()2627 void Task137::Task_local::compute() {
2628   const Index c2 = b(0);
2629   const Index c1 = b(1);
2630   const Index x0 = b(2);
2631   const Index x1 = b(3);
2632   // tensor label: I0
2633   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, c1, x0, x1)]);
2634   std::fill_n(odata.get(), out()->get_size(c2, c1, x0, x1), 0.0);
2635   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, c1, x0, x1)]);
2636   std::fill_n(odata_sorted.get(), out()->get_size(c2, c1, x0, x1), 0.0);
2637   for (auto& x5 : *range_[1]) {
2638     for (auto& x4 : *range_[1]) {
2639       for (auto& x3 : *range_[1]) {
2640         for (auto& x2 : *range_[1]) {
2641           // tensor label: Gamma87
2642           std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x4, x1, x3, x0, x2);
2643           std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x5, x4, x1, x3, x0, x2)]);
2644           sort_indices<0,1,3,5,2,4,0,1,1,1>(i0data, i0data_sorted, x5.size(), x4.size(), x1.size(), x3.size(), x0.size(), x2.size());
2645           // tensor label: I294
2646           std::unique_ptr<double[]> i1data = in(1)->get_block(c2, x3, x2, c1, x5, x4);
2647           std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c2, x3, x2, c1, x5, x4)]);
2648           sort_indices<4,5,1,2,0,3,0,1,1,1>(i1data, i1data_sorted, c2.size(), x3.size(), x2.size(), c1.size(), x5.size(), x4.size());
2649           dgemm_("T", "N", x1.size()*x0.size(), c2.size()*c1.size(), x3.size()*x2.size()*x5.size()*x4.size(),
2650                  1.0, i0data_sorted, x3.size()*x2.size()*x5.size()*x4.size(), i1data_sorted, x3.size()*x2.size()*x5.size()*x4.size(),
2651                  1.0, odata_sorted, x1.size()*x0.size());
2652         }
2653       }
2654     }
2655   }
2656   sort_indices<2,3,1,0,1,1,1,1>(odata_sorted, odata, x1.size(), x0.size(), c2.size(), c1.size());
2657   out()->add_block(odata, c2, c1, x0, x1);
2658 }
2659 
compute()2660 void Task138::Task_local::compute() {
2661   const Index c2 = b(0);
2662   const Index x3 = b(1);
2663   const Index x2 = b(2);
2664   const Index c1 = b(3);
2665   const Index x5 = b(4);
2666   const Index x4 = b(5);
2667   // tensor label: I294
2668   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, x3, x2, c1, x5, x4)]);
2669   std::fill_n(odata.get(), out()->get_size(c2, x3, x2, c1, x5, x4), 0.0);
2670   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c2, x3, x2, c1, x5, x4)]);
2671   std::fill_n(odata_sorted.get(), out()->get_size(c2, x3, x2, c1, x5, x4), 0.0);
2672   for (auto& a3 : *range_[2]) {
2673     // tensor label: t2
2674     std::unique_ptr<double[]> i0data = in(0)->get_block(c1, a3, x5, x4);
2675     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c1, a3, x5, x4)]);
2676     sort_indices<1,0,2,3,0,1,1,1>(i0data, i0data_sorted, c1.size(), a3.size(), x5.size(), x4.size());
2677     // tensor label: v2
2678     std::unique_ptr<double[]> i1data = in(1)->get_block(c2, x3, a3, x2);
2679     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c2, x3, a3, x2)]);
2680     sort_indices<2,0,1,3,0,1,-1,1>(i1data, i1data_sorted, c2.size(), x3.size(), a3.size(), x2.size());
2681     dgemm_("T", "N", c1.size()*x5.size()*x4.size(), c2.size()*x3.size()*x2.size(), a3.size(),
2682            1.0, i0data_sorted, a3.size(), i1data_sorted, a3.size(),
2683            1.0, odata_sorted, c1.size()*x5.size()*x4.size());
2684   }
2685   sort_indices<3,4,5,0,1,2,1,1,1,1>(odata_sorted, odata, c1.size(), x5.size(), x4.size(), c2.size(), x3.size(), x2.size());
2686   out()->add_block(odata, c2, x3, x2, c1, x5, x4);
2687 }
2688 
compute()2689 void Task139::Task_local::compute() {
2690   const Index c1 = b(0);
2691   const Index x2 = b(1);
2692   const Index x0 = b(2);
2693   const Index x1 = b(3);
2694   // tensor label: r
2695   std::unique_ptr<double[]> odata(new double[out()->get_size(c1, x2, x0, x1)]);
2696   std::fill_n(odata.get(), out()->get_size(c1, x2, x0, x1), 0.0);
2697   {
2698     // tensor label: I9
2699     std::unique_ptr<double[]> i0data = in(0)->get_block(c1, x2, x1, x0);
2700     sort_indices<0,1,3,2,1,1,1,1>(i0data, odata, c1.size(), x2.size(), x1.size(), x0.size());
2701   }
2702   out()->add_block(odata, c1, x2, x0, x1);
2703 }
2704 
compute()2705 void Task140::Task_local::compute() {
2706   const Index c1 = b(0);
2707   const Index x2 = b(1);
2708   const Index x1 = b(2);
2709   const Index x0 = b(3);
2710   // tensor label: I9
2711   std::unique_ptr<double[]> odata(new double[out()->get_size(c1, x2, x1, x0)]);
2712   std::fill_n(odata.get(), out()->get_size(c1, x2, x1, x0), 0.0);
2713   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c1, x2, x1, x0)]);
2714   std::fill_n(odata_sorted.get(), out()->get_size(c1, x2, x1, x0), 0.0);
2715   for (auto& x5 : *range_[1]) {
2716     for (auto& x3 : *range_[1]) {
2717       for (auto& x4 : *range_[1]) {
2718         // tensor label: Gamma3
2719         std::unique_ptr<double[]> i0data = in(0)->get_block(x2, x5, x3, x4, x1, x0);
2720         std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x2, x5, x3, x4, x1, x0)]);
2721         sort_indices<1,2,3,0,4,5,0,1,1,1>(i0data, i0data_sorted, x2.size(), x5.size(), x3.size(), x4.size(), x1.size(), x0.size());
2722         // tensor label: I10
2723         std::unique_ptr<double[]> i1data = in(1)->get_block(x3, c1, x5, x4);
2724         std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x3, c1, x5, x4)]);
2725         sort_indices<2,0,3,1,0,1,1,1>(i1data, i1data_sorted, x3.size(), c1.size(), x5.size(), x4.size());
2726         dgemm_("T", "N", x2.size()*x1.size()*x0.size(), c1.size(), x3.size()*x5.size()*x4.size(),
2727                1.0, i0data_sorted, x3.size()*x5.size()*x4.size(), i1data_sorted, x3.size()*x5.size()*x4.size(),
2728                1.0, odata_sorted, x2.size()*x1.size()*x0.size());
2729       }
2730     }
2731   }
2732   sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, x2.size(), x1.size(), x0.size(), c1.size());
2733   out()->add_block(odata, c1, x2, x1, x0);
2734 }
2735 
compute()2736 void Task141::Task_local::compute() {
2737   const Index x3 = b(0);
2738   const Index c1 = b(1);
2739   const Index x5 = b(2);
2740   const Index x4 = b(3);
2741   // tensor label: I10
2742   std::unique_ptr<double[]> odata(new double[out()->get_size(x3, c1, x5, x4)]);
2743   std::fill_n(odata.get(), out()->get_size(x3, c1, x5, x4), 0.0);
2744   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(x3, c1, x5, x4)]);
2745   std::fill_n(odata_sorted.get(), out()->get_size(x3, c1, x5, x4), 0.0);
2746   for (auto& c2 : *range_[0]) {
2747     // tensor label: t2
2748     std::unique_ptr<double[]> i0data = in(0)->get_block(c1, x5, c2, x4);
2749     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c1, x5, c2, x4)]);
2750     sort_indices<2,0,1,3,0,1,1,1>(i0data, i0data_sorted, c1.size(), x5.size(), c2.size(), x4.size());
2751     // tensor label: h1
2752     std::unique_ptr<double[]> i1data = in(1)->get_block(x3, c2);
2753     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x3, c2)]);
2754     sort_indices<1,0,0,1,2,1>(i1data, i1data_sorted, x3.size(), c2.size());
2755     dgemm_("T", "N", c1.size()*x5.size()*x4.size(), x3.size(), c2.size(),
2756            1.0, i0data_sorted, c2.size(), i1data_sorted, c2.size(),
2757            1.0, odata_sorted, c1.size()*x5.size()*x4.size());
2758   }
2759   sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, c1.size(), x5.size(), x4.size(), x3.size());
2760   out()->add_block(odata, x3, c1, x5, x4);
2761 }
2762 
compute()2763 void Task142::Task_local::compute() {
2764   const Index x3 = b(0);
2765   const Index c1 = b(1);
2766   const Index x5 = b(2);
2767   const Index x4 = b(3);
2768   // tensor label: I10
2769   std::unique_ptr<double[]> odata(new double[out()->get_size(x3, c1, x5, x4)]);
2770   std::fill_n(odata.get(), out()->get_size(x3, c1, x5, x4), 0.0);
2771   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(x3, c1, x5, x4)]);
2772   std::fill_n(odata_sorted.get(), out()->get_size(x3, c1, x5, x4), 0.0);
2773   for (auto& c2 : *range_[0]) {
2774     for (auto& c3 : *range_[0]) {
2775       // tensor label: t2
2776       std::unique_ptr<double[]> i0data = in(0)->get_block(c2, x5, c3, x4);
2777       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c2, x5, c3, x4)]);
2778       sort_indices<0,2,1,3,0,1,1,1>(i0data, i0data_sorted, c2.size(), x5.size(), c3.size(), x4.size());
2779       // tensor label: v2
2780       std::unique_ptr<double[]> i1data = in(1)->get_block(x3, c3, c1, c2);
2781       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x3, c3, c1, c2)]);
2782       sort_indices<3,1,0,2,0,1,-2,1>(i1data, i1data_sorted, x3.size(), c3.size(), c1.size(), c2.size());
2783       dgemm_("T", "N", x5.size()*x4.size(), x3.size()*c1.size(), c3.size()*c2.size(),
2784              1.0, i0data_sorted, c3.size()*c2.size(), i1data_sorted, c3.size()*c2.size(),
2785              1.0, odata_sorted, x5.size()*x4.size());
2786     }
2787   }
2788   sort_indices<2,3,0,1,1,1,1,1>(odata_sorted, odata, x5.size(), x4.size(), x3.size(), c1.size());
2789   out()->add_block(odata, x3, c1, x5, x4);
2790 }
2791 
compute()2792 void Task143::Task_local::compute() {
2793   const Index x3 = b(0);
2794   const Index c1 = b(1);
2795   const Index x5 = b(2);
2796   const Index x4 = b(3);
2797   // tensor label: I10
2798   std::unique_ptr<double[]> odata(new double[out()->get_size(x3, c1, x5, x4)]);
2799   std::fill_n(odata.get(), out()->get_size(x3, c1, x5, x4), 0.0);
2800   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(x3, c1, x5, x4)]);
2801   std::fill_n(odata_sorted.get(), out()->get_size(x3, c1, x5, x4), 0.0);
2802   for (auto& c2 : *range_[0]) {
2803     for (auto& a3 : *range_[2]) {
2804       // tensor label: t2
2805       std::unique_ptr<double[]> i0data = in(0)->get_block(c2, a3, c1, x5);
2806       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c2, a3, c1, x5)]);
2807       sort_indices<0,1,2,3,0,1,1,1>(i0data, i0data_sorted, c2.size(), a3.size(), c1.size(), x5.size());
2808       // tensor label: v2
2809       std::unique_ptr<double[]> i1data = in(1)->get_block(a3, x4, x3, c2);
2810       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(a3, x4, x3, c2)]);
2811       sort_indices<3,0,1,2,0,1,1,2>(i1data, i1data_sorted, a3.size(), x4.size(), x3.size(), c2.size());
2812       dgemm_("T", "N", c1.size()*x5.size(), x4.size()*x3.size(), a3.size()*c2.size(),
2813              1.0, i0data_sorted, a3.size()*c2.size(), i1data_sorted, a3.size()*c2.size(),
2814              1.0, odata_sorted, c1.size()*x5.size());
2815     }
2816   }
2817   sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, c1.size(), x5.size(), x4.size(), x3.size());
2818   out()->add_block(odata, x3, c1, x5, x4);
2819 }
2820 
compute()2821 void Task144::Task_local::compute() {
2822   const Index c1 = b(0);
2823   const Index x2 = b(1);
2824   const Index x1 = b(2);
2825   const Index x0 = b(3);
2826   // tensor label: I9
2827   std::unique_ptr<double[]> odata(new double[out()->get_size(c1, x2, x1, x0)]);
2828   std::fill_n(odata.get(), out()->get_size(c1, x2, x1, x0), 0.0);
2829   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c1, x2, x1, x0)]);
2830   std::fill_n(odata_sorted.get(), out()->get_size(c1, x2, x1, x0), 0.0);
2831   for (auto& x5 : *range_[1]) {
2832     for (auto& x4 : *range_[1]) {
2833       for (auto& x3 : *range_[1]) {
2834         // tensor label: Gamma4
2835         std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x4, x2, x3, x1, x0);
2836         std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x5, x4, x2, x3, x1, x0)]);
2837         sort_indices<0,1,3,2,4,5,0,1,1,1>(i0data, i0data_sorted, x5.size(), x4.size(), x2.size(), x3.size(), x1.size(), x0.size());
2838         // tensor label: I13
2839         std::unique_ptr<double[]> i1data = in(1)->get_block(c1, x5, x4, x3);
2840         std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c1, x5, x4, x3)]);
2841         sort_indices<1,2,3,0,0,1,1,1>(i1data, i1data_sorted, c1.size(), x5.size(), x4.size(), x3.size());
2842         dgemm_("T", "N", x2.size()*x1.size()*x0.size(), c1.size(), x5.size()*x4.size()*x3.size(),
2843                1.0, i0data_sorted, x5.size()*x4.size()*x3.size(), i1data_sorted, x5.size()*x4.size()*x3.size(),
2844                1.0, odata_sorted, x2.size()*x1.size()*x0.size());
2845       }
2846     }
2847   }
2848   sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, x2.size(), x1.size(), x0.size(), c1.size());
2849   out()->add_block(odata, c1, x2, x1, x0);
2850 }
2851 
compute()2852 void Task145::Task_local::compute() {
2853   const Index c1 = b(0);
2854   const Index x5 = b(1);
2855   const Index x4 = b(2);
2856   const Index x3 = b(3);
2857   // tensor label: I13
2858   std::unique_ptr<double[]> odata(new double[out()->get_size(c1, x5, x4, x3)]);
2859   std::fill_n(odata.get(), out()->get_size(c1, x5, x4, x3), 0.0);
2860   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c1, x5, x4, x3)]);
2861   std::fill_n(odata_sorted.get(), out()->get_size(c1, x5, x4, x3), 0.0);
2862   for (auto& c2 : *range_[0]) {
2863     // tensor label: t2
2864     std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x4, c2, x3);
2865     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x5, x4, c2, x3)]);
2866     sort_indices<2,0,1,3,0,1,1,1>(i0data, i0data_sorted, x5.size(), x4.size(), c2.size(), x3.size());
2867     // tensor label: h1
2868     std::unique_ptr<double[]> i1data = in(1)->get_block(c1, c2);
2869     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c1, c2)]);
2870     sort_indices<1,0,0,1,-1,1>(i1data, i1data_sorted, c1.size(), c2.size());
2871     dgemm_("T", "N", x5.size()*x4.size()*x3.size(), c1.size(), c2.size(),
2872            1.0, i0data_sorted, c2.size(), i1data_sorted, c2.size(),
2873            1.0, odata_sorted, x5.size()*x4.size()*x3.size());
2874   }
2875   sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, x5.size(), x4.size(), x3.size(), c1.size());
2876   out()->add_block(odata, c1, x5, x4, x3);
2877 }
2878 
compute()2879 void Task146::Task_local::compute() {
2880   const Index c1 = b(0);
2881   const Index x5 = b(1);
2882   const Index x4 = b(2);
2883   const Index x3 = b(3);
2884   // tensor label: I13
2885   std::unique_ptr<double[]> odata(new double[out()->get_size(c1, x5, x4, x3)]);
2886   std::fill_n(odata.get(), out()->get_size(c1, x5, x4, x3), 0.0);
2887   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c1, x5, x4, x3)]);
2888   std::fill_n(odata_sorted.get(), out()->get_size(c1, x5, x4, x3), 0.0);
2889   for (auto& a2 : *range_[2]) {
2890     // tensor label: t2
2891     std::unique_ptr<double[]> i0data = in(0)->get_block(c1, a2, x5, x4);
2892     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c1, a2, x5, x4)]);
2893     sort_indices<1,0,2,3,0,1,1,1>(i0data, i0data_sorted, c1.size(), a2.size(), x5.size(), x4.size());
2894     // tensor label: h1
2895     std::unique_ptr<double[]> i1data = in(1)->get_block(a2, x3);
2896     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(a2, x3)]);
2897     sort_indices<0,1,0,1,1,1>(i1data, i1data_sorted, a2.size(), x3.size());
2898     dgemm_("T", "N", c1.size()*x5.size()*x4.size(), x3.size(), a2.size(),
2899            1.0, i0data_sorted, a2.size(), i1data_sorted, a2.size(),
2900            1.0, odata_sorted, c1.size()*x5.size()*x4.size());
2901   }
2902   sort_indices<0,1,2,3,1,1,1,1>(odata_sorted, odata, c1.size(), x5.size(), x4.size(), x3.size());
2903   out()->add_block(odata, c1, x5, x4, x3);
2904 }
2905 
compute()2906 void Task147::Task_local::compute() {
2907   const Index c1 = b(0);
2908   const Index x5 = b(1);
2909   const Index x4 = b(2);
2910   const Index x3 = b(3);
2911   // tensor label: I13
2912   std::unique_ptr<double[]> odata(new double[out()->get_size(c1, x5, x4, x3)]);
2913   std::fill_n(odata.get(), out()->get_size(c1, x5, x4, x3), 0.0);
2914   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c1, x5, x4, x3)]);
2915   std::fill_n(odata_sorted.get(), out()->get_size(c1, x5, x4, x3), 0.0);
2916   for (auto& a3 : *range_[2]) {
2917     for (auto& c2 : *range_[0]) {
2918       // tensor label: t2
2919       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, a3, c2, x4);
2920       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x5, a3, c2, x4)]);
2921       sort_indices<1,2,0,3,0,1,1,1>(i0data, i0data_sorted, x5.size(), a3.size(), c2.size(), x4.size());
2922       // tensor label: v2
2923       std::unique_ptr<double[]> i1data = in(1)->get_block(c1, x3, a3, c2);
2924       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c1, x3, a3, c2)]);
2925       sort_indices<2,3,0,1,0,1,-1,1>(i1data, i1data_sorted, c1.size(), x3.size(), a3.size(), c2.size());
2926       dgemm_("T", "N", x5.size()*x4.size(), c1.size()*x3.size(), a3.size()*c2.size(),
2927              1.0, i0data_sorted, a3.size()*c2.size(), i1data_sorted, a3.size()*c2.size(),
2928              1.0, odata_sorted, x5.size()*x4.size());
2929     }
2930   }
2931   sort_indices<2,0,1,3,1,1,1,1>(odata_sorted, odata, x5.size(), x4.size(), c1.size(), x3.size());
2932   out()->add_block(odata, c1, x5, x4, x3);
2933 }
2934 
compute()2935 void Task148::Task_local::compute() {
2936   const Index c1 = b(0);
2937   const Index x5 = b(1);
2938   const Index x4 = b(2);
2939   const Index x3 = b(3);
2940   // tensor label: I13
2941   std::unique_ptr<double[]> odata(new double[out()->get_size(c1, x5, x4, x3)]);
2942   std::fill_n(odata.get(), out()->get_size(c1, x5, x4, x3), 0.0);
2943   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c1, x5, x4, x3)]);
2944   std::fill_n(odata_sorted.get(), out()->get_size(c1, x5, x4, x3), 0.0);
2945   for (auto& c2 : *range_[0]) {
2946     for (auto& a3 : *range_[2]) {
2947       // tensor label: t2
2948       std::unique_ptr<double[]> i0data = in(0)->get_block(c2, a3, x5, x4);
2949       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c2, a3, x5, x4)]);
2950       sort_indices<0,1,2,3,0,1,1,1>(i0data, i0data_sorted, c2.size(), a3.size(), x5.size(), x4.size());
2951       // tensor label: I370
2952       std::unique_ptr<double[]> i1data = in(1)->get_block(a3, x3, c1, c2);
2953       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(a3, x3, c1, c2)]);
2954       sort_indices<3,0,1,2,0,1,1,1>(i1data, i1data_sorted, a3.size(), x3.size(), c1.size(), c2.size());
2955       dgemm_("T", "N", x5.size()*x4.size(), x3.size()*c1.size(), a3.size()*c2.size(),
2956              1.0, i0data_sorted, a3.size()*c2.size(), i1data_sorted, a3.size()*c2.size(),
2957              1.0, odata_sorted, x5.size()*x4.size());
2958     }
2959   }
2960   sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, x5.size(), x4.size(), x3.size(), c1.size());
2961   out()->add_block(odata, c1, x5, x4, x3);
2962 }
2963 
compute()2964 void Task149::Task_local::compute() {
2965   const Index a3 = b(0);
2966   const Index x3 = b(1);
2967   const Index c1 = b(2);
2968   const Index c2 = b(3);
2969   // tensor label: I370
2970   std::unique_ptr<double[]> odata(new double[out()->get_size(a3, x3, c1, c2)]);
2971   std::fill_n(odata.get(), out()->get_size(a3, x3, c1, c2), 0.0);
2972   {
2973     // tensor label: v2
2974     std::unique_ptr<double[]> i0data = in(0)->get_block(a3, x3, c1, c2);
2975     sort_indices<0,1,2,3,1,1,-1,1>(i0data, odata, a3.size(), x3.size(), c1.size(), c2.size());
2976   }
2977   {
2978     // tensor label: v2
2979     std::unique_ptr<double[]> i1data = in(0)->get_block(c1, x3, a3, c2);
2980     sort_indices<2,1,0,3,1,1,2,1>(i1data, odata, c1.size(), x3.size(), a3.size(), c2.size());
2981   }
2982   out()->add_block(odata, a3, x3, c1, c2);
2983 }
2984 
2985 #endif
2986