1 //
2 // BAGEL - Brilliantly Advanced General Electronic Structure Library
3 // Filename: CASPT2_tasks1.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/caspt2/CASPT2_tasks1.h>
29 
30 using namespace std;
31 using namespace bagel;
32 using namespace bagel::SMITH;
33 using namespace bagel::SMITH::CASPT2;
34 
compute()35 void Task0::Task_local::compute() {
36   const Index x0 = b(0);
37   const Index x5 = b(1);
38   const Index x1 = b(2);
39   const Index x4 = b(3);
40   const Index x3 = b(4);
41   const Index x2 = b(5);
42   // tensor label: Gamma0
43   std::unique_ptr<double[]> odata(new double[out()->get_size(x0, x5, x1, x4)]);
44   std::fill_n(odata.get(), out()->get_size(x0, x5, x1, x4), 0.0);
45   // associated with merged
46   std::unique_ptr<double[]> fdata = in(4)->get_block(x3, x2);
47   if (x1 == x5 && x0 == x4) {
48     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x2);
49     for (int i2 = 0; i2 != x2.size(); ++i2) {
50       for (int i3 = 0; i3 != x3.size(); ++i3) {
51         for (int i5 = 0; i5 != x5.size(); ++i5) {
52           for (int i4 = 0; i4 != x4.size(); ++i4) {
53             odata[i4+x0.size()*(i5+x5.size()*(i5+x1.size()*(i4)))]
54               += (-2.0) * i0data[i3+x3.size()*(i2)] * fdata[i3+x3.size()*(i2)];
55           }
56         }
57       }
58     }
59   }
60   if (x1 == x4 && x0 == x5) {
61     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x2);
62     for (int i2 = 0; i2 != x2.size(); ++i2) {
63       for (int i3 = 0; i3 != x3.size(); ++i3) {
64         for (int i4 = 0; i4 != x4.size(); ++i4) {
65           for (int i5 = 0; i5 != x5.size(); ++i5) {
66             odata[i5+x0.size()*(i5+x5.size()*(i4+x1.size()*(i4)))]
67               += (4.0) * i0data[i3+x3.size()*(i2)] * fdata[i3+x3.size()*(i2)];
68           }
69         }
70       }
71     }
72   }
73   // rdm0 merged case
74   if (x1 == x4 && x0 == x2 && x3 == x5) {
75     std::unique_ptr<double[]> i0data = in(0)->get_block();
76     for (int i4 = 0; i4 != x4.size(); ++i4) {
77       for (int i2 = 0; i2 != x2.size(); ++i2) {
78         for (int i5 = 0; i5 != x5.size(); ++i5) {
79           odata[i2+x0.size()*(i5+x5.size()*(i4+x1.size()*(i4)))]  += 4.0 * i0data[0] * fdata[i5+x3.size()*(i2)];
80         }
81       }
82     }
83   }
84   if (x0 == x2 && x1 == x4) {
85     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x5);
86     for (int i5 = 0; i5 != x5.size(); ++i5) {
87       for (int i3 = 0; i3 != x3.size(); ++i3) {
88         for (int i2 = 0; i2 != x2.size(); ++i2) {
89           for (int i4 = 0; i4 != x4.size(); ++i4) {
90             odata[i2+x0.size()*(i5+x5.size()*(i4+x1.size()*(i4)))]
91               += (-2.0) * i0data[i3+x3.size()*(i5)] * fdata[i3+x3.size()*(i2)];
92           }
93         }
94       }
95     }
96   }
97   // rdm0 merged case
98   if (x1 == x5 && x3 == x4 && x0 == x2) {
99     std::unique_ptr<double[]> i0data = in(0)->get_block();
100     for (int i5 = 0; i5 != x5.size(); ++i5) {
101       for (int i4 = 0; i4 != x4.size(); ++i4) {
102         for (int i2 = 0; i2 != x2.size(); ++i2) {
103           odata[i2+x0.size()*(i5+x5.size()*(i5+x1.size()*(i4)))]  += -2.0 * i0data[0] * fdata[i4+x3.size()*(i2)];
104         }
105       }
106     }
107   }
108   if (x1 == x5 && x0 == x2) {
109     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x4);
110     for (int i4 = 0; i4 != x4.size(); ++i4) {
111       for (int i3 = 0; i3 != x3.size(); ++i3) {
112         for (int i5 = 0; i5 != x5.size(); ++i5) {
113           for (int i2 = 0; i2 != x2.size(); ++i2) {
114             odata[i2+x0.size()*(i5+x5.size()*(i5+x1.size()*(i4)))]
115               += (1.0) * i0data[i3+x3.size()*(i4)] * fdata[i3+x3.size()*(i2)];
116           }
117         }
118       }
119     }
120   }
121   if (x3 == x4 && x0 == x2) {
122     std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x5);
123     for (int i5 = 0; i5 != x5.size(); ++i5) {
124       for (int i1 = 0; i1 != x1.size(); ++i1) {
125         for (int i4 = 0; i4 != x4.size(); ++i4) {
126           for (int i2 = 0; i2 != x2.size(); ++i2) {
127             odata[i2+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4)))]
128               += (1.0) * i0data[i1+x1.size()*(i5)] * fdata[i4+x3.size()*(i2)];
129           }
130         }
131       }
132     }
133   }
134   if (x3 == x5 && x0 == x2) {
135     std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x4);
136     for (int i4 = 0; i4 != x4.size(); ++i4) {
137       for (int i1 = 0; i1 != x1.size(); ++i1) {
138         for (int i5 = 0; i5 != x5.size(); ++i5) {
139           for (int i2 = 0; i2 != x2.size(); ++i2) {
140             odata[i2+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4)))]
141               += (-2.0) * i0data[i1+x1.size()*(i4)] * fdata[i5+x3.size()*(i2)];
142           }
143         }
144       }
145     }
146   }
147   if (x0 == x2) {
148     std::unique_ptr<double[]> i0data = in(2)->get_block(x3, x5, x1, x4);
149     for (int i4 = 0; i4 != x4.size(); ++i4) {
150       for (int i1 = 0; i1 != x1.size(); ++i1) {
151         for (int i5 = 0; i5 != x5.size(); ++i5) {
152           for (int i3 = 0; i3 != x3.size(); ++i3) {
153             for (int i2 = 0; i2 != x2.size(); ++i2) {
154               odata[i2+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4)))]
155                 += (1.0) * i0data[i3+x3.size()*(i5+x5.size()*(i1+x1.size()*(i4)))] * fdata[i3+x3.size()*(i2)];
156             }
157           }
158         }
159       }
160     }
161   }
162   // rdm0 merged case
163   if (x3 == x5 && x1 == x2 && x0 == x4) {
164     std::unique_ptr<double[]> i0data = in(0)->get_block();
165     for (int i5 = 0; i5 != x5.size(); ++i5) {
166       for (int i2 = 0; i2 != x2.size(); ++i2) {
167         for (int i4 = 0; i4 != x4.size(); ++i4) {
168           odata[i4+x0.size()*(i5+x5.size()*(i2+x1.size()*(i4)))]  += -2.0 * i0data[0] * fdata[i5+x3.size()*(i2)];
169         }
170       }
171     }
172   }
173   if (x1 == x2 && x0 == x4) {
174     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x5);
175     for (int i5 = 0; i5 != x5.size(); ++i5) {
176       for (int i3 = 0; i3 != x3.size(); ++i3) {
177         for (int i2 = 0; i2 != x2.size(); ++i2) {
178           for (int i4 = 0; i4 != x4.size(); ++i4) {
179             odata[i4+x0.size()*(i5+x5.size()*(i2+x1.size()*(i4)))]
180               += (1.0) * i0data[i3+x3.size()*(i5)] * fdata[i3+x3.size()*(i2)];
181           }
182         }
183       }
184     }
185   }
186   if (x3 == x5 && x0 == x4) {
187     std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x2);
188     for (int i2 = 0; i2 != x2.size(); ++i2) {
189       for (int i1 = 0; i1 != x1.size(); ++i1) {
190         for (int i5 = 0; i5 != x5.size(); ++i5) {
191           for (int i4 = 0; i4 != x4.size(); ++i4) {
192             odata[i4+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4)))]
193               += (1.0) * i0data[i1+x1.size()*(i2)] * fdata[i5+x3.size()*(i2)];
194           }
195         }
196       }
197     }
198   }
199   if (x0 == x4) {
200     std::unique_ptr<double[]> i0data = in(2)->get_block(x1, x5, x3, x2);
201     for (int i2 = 0; i2 != x2.size(); ++i2) {
202       for (int i3 = 0; i3 != x3.size(); ++i3) {
203         for (int i5 = 0; i5 != x5.size(); ++i5) {
204           for (int i1 = 0; i1 != x1.size(); ++i1) {
205             for (int i4 = 0; i4 != x4.size(); ++i4) {
206               odata[i4+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4)))]
207                 += (1.0) * i0data[i1+x1.size()*(i5+x5.size()*(i3+x3.size()*(i2)))] * fdata[i3+x3.size()*(i2)];
208             }
209           }
210         }
211       }
212     }
213   }
214   // rdm0 merged case
215   if (x3 == x4 && x0 == x5 && x1 == x2) {
216     std::unique_ptr<double[]> i0data = in(0)->get_block();
217     for (int i4 = 0; i4 != x4.size(); ++i4) {
218       for (int i5 = 0; i5 != x5.size(); ++i5) {
219         for (int i2 = 0; i2 != x2.size(); ++i2) {
220           odata[i5+x0.size()*(i5+x5.size()*(i2+x1.size()*(i4)))]  += 4.0 * i0data[0] * fdata[i4+x3.size()*(i2)];
221         }
222       }
223     }
224   }
225   if (x0 == x5 && x1 == x2) {
226     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x4);
227     for (int i4 = 0; i4 != x4.size(); ++i4) {
228       for (int i3 = 0; i3 != x3.size(); ++i3) {
229         for (int i5 = 0; i5 != x5.size(); ++i5) {
230           for (int i2 = 0; i2 != x2.size(); ++i2) {
231             odata[i5+x0.size()*(i5+x5.size()*(i2+x1.size()*(i4)))]
232               += (-2.0) * i0data[i3+x3.size()*(i4)] * fdata[i3+x3.size()*(i2)];
233           }
234         }
235       }
236     }
237   }
238   if (x3 == x4 && x0 == x5) {
239     std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x2);
240     for (int i2 = 0; i2 != x2.size(); ++i2) {
241       for (int i1 = 0; i1 != x1.size(); ++i1) {
242         for (int i4 = 0; i4 != x4.size(); ++i4) {
243           for (int i5 = 0; i5 != x5.size(); ++i5) {
244             odata[i5+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4)))]
245               += (-2.0) * i0data[i1+x1.size()*(i2)] * fdata[i4+x3.size()*(i2)];
246           }
247         }
248       }
249     }
250   }
251   if (x0 == x5) {
252     std::unique_ptr<double[]> i0data = in(2)->get_block(x1, x4, x3, x2);
253     for (int i2 = 0; i2 != x2.size(); ++i2) {
254       for (int i3 = 0; i3 != x3.size(); ++i3) {
255         for (int i4 = 0; i4 != x4.size(); ++i4) {
256           for (int i1 = 0; i1 != x1.size(); ++i1) {
257             for (int i5 = 0; i5 != x5.size(); ++i5) {
258               odata[i5+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4)))]
259                 += (-2.0) * i0data[i1+x1.size()*(i4+x4.size()*(i3+x3.size()*(i2)))] * fdata[i3+x3.size()*(i2)];
260             }
261           }
262         }
263       }
264     }
265   }
266   if (x3 == x4 && x1 == x2) {
267     std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x5);
268     for (int i5 = 0; i5 != x5.size(); ++i5) {
269       for (int i0 = 0; i0 != x0.size(); ++i0) {
270         for (int i4 = 0; i4 != x4.size(); ++i4) {
271           for (int i2 = 0; i2 != x2.size(); ++i2) {
272             odata[i0+x0.size()*(i5+x5.size()*(i2+x1.size()*(i4)))]
273               += (-2.0) * i0data[i0+x0.size()*(i5)] * fdata[i4+x3.size()*(i2)];
274           }
275         }
276       }
277     }
278   }
279   if (x3 == x5 && x1 == x2) {
280     std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x4);
281     for (int i4 = 0; i4 != x4.size(); ++i4) {
282       for (int i0 = 0; i0 != x0.size(); ++i0) {
283         for (int i5 = 0; i5 != x5.size(); ++i5) {
284           for (int i2 = 0; i2 != x2.size(); ++i2) {
285             odata[i0+x0.size()*(i5+x5.size()*(i2+x1.size()*(i4)))]
286               += (1.0) * i0data[i0+x0.size()*(i4)] * fdata[i5+x3.size()*(i2)];
287           }
288         }
289       }
290     }
291   }
292   if (x1 == x2) {
293     std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x5, x3, x4);
294     for (int i4 = 0; i4 != x4.size(); ++i4) {
295       for (int i3 = 0; i3 != x3.size(); ++i3) {
296         for (int i5 = 0; i5 != x5.size(); ++i5) {
297           for (int i0 = 0; i0 != x0.size(); ++i0) {
298             for (int i2 = 0; i2 != x2.size(); ++i2) {
299               odata[i0+x0.size()*(i5+x5.size()*(i2+x1.size()*(i4)))]
300                 += (1.0) * i0data[i0+x0.size()*(i5+x5.size()*(i3+x3.size()*(i4)))] * fdata[i3+x3.size()*(i2)];
301             }
302           }
303         }
304       }
305     }
306   }
307   if (x3 == x5 && x1 == x4) {
308     std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x2);
309     for (int i2 = 0; i2 != x2.size(); ++i2) {
310       for (int i0 = 0; i0 != x0.size(); ++i0) {
311         for (int i5 = 0; i5 != x5.size(); ++i5) {
312           for (int i4 = 0; i4 != x4.size(); ++i4) {
313             odata[i0+x0.size()*(i5+x5.size()*(i4+x1.size()*(i4)))]
314               += (-2.0) * i0data[i0+x0.size()*(i2)] * fdata[i5+x3.size()*(i2)];
315           }
316         }
317       }
318     }
319   }
320   if (x1 == x4) {
321     std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x5, x3, x2);
322     for (int i2 = 0; i2 != x2.size(); ++i2) {
323       for (int i3 = 0; i3 != x3.size(); ++i3) {
324         for (int i5 = 0; i5 != x5.size(); ++i5) {
325           for (int i0 = 0; i0 != x0.size(); ++i0) {
326             for (int i4 = 0; i4 != x4.size(); ++i4) {
327               odata[i0+x0.size()*(i5+x5.size()*(i4+x1.size()*(i4)))]
328                 += (-2.0) * i0data[i0+x0.size()*(i5+x5.size()*(i3+x3.size()*(i2)))] * fdata[i3+x3.size()*(i2)];
329             }
330           }
331         }
332       }
333     }
334   }
335   if (x3 == x4 && x1 == x5) {
336     std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x2);
337     for (int i2 = 0; i2 != x2.size(); ++i2) {
338       for (int i0 = 0; i0 != x0.size(); ++i0) {
339         for (int i4 = 0; i4 != x4.size(); ++i4) {
340           for (int i5 = 0; i5 != x5.size(); ++i5) {
341             odata[i0+x0.size()*(i5+x5.size()*(i5+x1.size()*(i4)))]
342               += (1.0) * i0data[i0+x0.size()*(i2)] * fdata[i4+x3.size()*(i2)];
343           }
344         }
345       }
346     }
347   }
348   if (x1 == x5) {
349     std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x4, x3, x2);
350     for (int i2 = 0; i2 != x2.size(); ++i2) {
351       for (int i3 = 0; i3 != x3.size(); ++i3) {
352         for (int i4 = 0; i4 != x4.size(); ++i4) {
353           for (int i0 = 0; i0 != x0.size(); ++i0) {
354             for (int i5 = 0; i5 != x5.size(); ++i5) {
355               odata[i0+x0.size()*(i5+x5.size()*(i5+x1.size()*(i4)))]
356                 += (1.0) * i0data[i0+x0.size()*(i4+x4.size()*(i3+x3.size()*(i2)))] * fdata[i3+x3.size()*(i2)];
357             }
358           }
359         }
360       }
361     }
362   }
363   if (x3 == x4) {
364     std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x5, x1, x2);
365     for (int i2 = 0; i2 != x2.size(); ++i2) {
366       for (int i1 = 0; i1 != x1.size(); ++i1) {
367         for (int i5 = 0; i5 != x5.size(); ++i5) {
368           for (int i0 = 0; i0 != x0.size(); ++i0) {
369             for (int i4 = 0; i4 != x4.size(); ++i4) {
370               odata[i0+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4)))]
371                 += (1.0) * i0data[i0+x0.size()*(i5+x5.size()*(i1+x1.size()*(i2)))] * fdata[i4+x3.size()*(i2)];
372             }
373           }
374         }
375       }
376     }
377   }
378   if (x3 == x5) {
379     std::unique_ptr<double[]> i0data = in(2)->get_block(x1, x4, x0, x2);
380     for (int i2 = 0; i2 != x2.size(); ++i2) {
381       for (int i0 = 0; i0 != x0.size(); ++i0) {
382         for (int i4 = 0; i4 != x4.size(); ++i4) {
383           for (int i1 = 0; i1 != x1.size(); ++i1) {
384             for (int i5 = 0; i5 != x5.size(); ++i5) {
385               odata[i0+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4)))]
386                 += (1.0) * i0data[i1+x1.size()*(i4+x4.size()*(i0+x0.size()*(i2)))] * fdata[i5+x3.size()*(i2)];
387             }
388           }
389         }
390       }
391     }
392   }
393   {
394     std::unique_ptr<double[]> i0data = in(3)->get_block(x0, x5, x1, x4, x3, x2);
395     for (int i2 = 0; i2 != x2.size(); ++i2) {
396       for (int i3 = 0; i3 != x3.size(); ++i3) {
397         for (int i4 = 0; i4 != x4.size(); ++i4) {
398           for (int i1 = 0; i1 != x1.size(); ++i1) {
399             for (int i5 = 0; i5 != x5.size(); ++i5) {
400               for (int i0 = 0; i0 != x0.size(); ++i0) {
401                 odata[i0+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4)))]
402                   += (1.0) * i0data[i0+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4+x4.size()*(i3+x3.size()*(i2)))))] * fdata[i3+x3.size()*(i2)];
403               }
404             }
405           }
406         }
407       }
408     }
409   }
410   out()->add_block(odata, x0, x5, x1, x4);
411 }
412 
compute()413 void Task1::Task_local::compute() {
414   const Index x0 = b(0);
415   const Index x3 = b(1);
416   const Index x1 = b(2);
417   const Index x2 = b(3);
418   // tensor label: Gamma92
419   std::unique_ptr<double[]> odata(new double[out()->get_size(x0, x3, x1, x2)]);
420   std::fill_n(odata.get(), out()->get_size(x0, x3, x1, x2), 0.0);
421   {
422     // rdm0 non-merged case
423     if (x1 == x3 && x0 == x2) {
424       std::unique_ptr<double[]> i0data = in(0)->get_block();
425       for (int i2 = 0; i2 != x2.size(); ++i2) {
426         for (int i3 = 0; i3 != x3.size(); ++i3) {
427           odata[i2+x0.size()*(i3+x3.size()*(i3+x1.size()*(i2)))]  += -2.0 * i0data[0];
428         }
429       }
430     }
431   }
432   {
433     if (x0 == x2) {
434       std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x3);
435       for (int i2 = 0; i2 != x2.size(); ++i2) {
436         for (int i1 = 0; i1 != x1.size(); ++i1) {
437           for (int i3 = 0; i3 != x3.size(); ++i3) {
438             odata[i2+x0.size()*(i3+x3.size()*(i1+x1.size()*(i2)))]
439               += (1.0) * i0data[i1+x1.size()*(i3)];
440           }
441         }
442       }
443     }
444   }
445   {
446     // rdm0 non-merged case
447     if (x1 == x2 && x0 == x3) {
448       std::unique_ptr<double[]> i0data = in(0)->get_block();
449       for (int i2 = 0; i2 != x2.size(); ++i2) {
450         for (int i3 = 0; i3 != x3.size(); ++i3) {
451           odata[i3+x0.size()*(i3+x3.size()*(i2+x1.size()*(i2)))]  += 4.0 * i0data[0];
452         }
453       }
454     }
455   }
456   {
457     if (x0 == x3) {
458       std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x2);
459       for (int i2 = 0; i2 != x2.size(); ++i2) {
460         for (int i1 = 0; i1 != x1.size(); ++i1) {
461           for (int i3 = 0; i3 != x3.size(); ++i3) {
462             odata[i3+x0.size()*(i3+x3.size()*(i1+x1.size()*(i2)))]
463               += (-2.0) * i0data[i1+x1.size()*(i2)];
464           }
465         }
466       }
467     }
468   }
469   {
470     if (x1 == x2) {
471       std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x3);
472       for (int i2 = 0; i2 != x2.size(); ++i2) {
473         for (int i3 = 0; i3 != x3.size(); ++i3) {
474           for (int i0 = 0; i0 != x0.size(); ++i0) {
475             odata[i0+x0.size()*(i3+x3.size()*(i2+x1.size()*(i2)))]
476               += (-2.0) * i0data[i0+x0.size()*(i3)];
477           }
478         }
479       }
480     }
481   }
482   {
483     if (x1 == x3) {
484       std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x2);
485       for (int i2 = 0; i2 != x2.size(); ++i2) {
486         for (int i3 = 0; i3 != x3.size(); ++i3) {
487           for (int i0 = 0; i0 != x0.size(); ++i0) {
488             odata[i0+x0.size()*(i3+x3.size()*(i3+x1.size()*(i2)))]
489               += (1.0) * i0data[i0+x0.size()*(i2)];
490           }
491         }
492       }
493     }
494   }
495   {
496     std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x3, x1, x2);
497     sort_indices<0,1,2,3,1,1,1,1>(i0data, odata, x0.size(), x3.size(), x1.size(), x2.size());
498   }
499   out()->add_block(odata, x0, x3, x1, x2);
500 }
501 
compute()502 void Task2::Task_local::compute() {
503   const Index x5 = b(0);
504   const Index x4 = b(1);
505   const Index x0 = b(2);
506   const Index x3 = b(3);
507   const Index x1 = b(4);
508   const Index x2 = b(5);
509   // tensor label: Gamma2
510   std::unique_ptr<double[]> odata(new double[out()->get_size(x5, x4, x0, x3, x1, x2)]);
511   std::fill_n(odata.get(), out()->get_size(x5, x4, x0, x3, x1, x2), 0.0);
512   {
513     if (x1 == x3 && x0 == x2) {
514       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x4);
515       for (int i2 = 0; i2 != x2.size(); ++i2) {
516         for (int i3 = 0; i3 != x3.size(); ++i3) {
517           for (int i4 = 0; i4 != x4.size(); ++i4) {
518             for (int i5 = 0; i5 != x5.size(); ++i5) {
519               odata[i5+x5.size()*(i4+x4.size()*(i2+x0.size()*(i3+x3.size()*(i3+x1.size()*(i2)))))]
520                 += (-2.0) * i0data[i5+x5.size()*(i4)];
521             }
522           }
523         }
524       }
525     }
526   }
527   {
528     if (x1 == x4 && x0 == x2) {
529       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x3);
530       for (int i2 = 0; i2 != x2.size(); ++i2) {
531         for (int i3 = 0; i3 != x3.size(); ++i3) {
532           for (int i4 = 0; i4 != x4.size(); ++i4) {
533             for (int i5 = 0; i5 != x5.size(); ++i5) {
534               odata[i5+x5.size()*(i4+x4.size()*(i2+x0.size()*(i3+x3.size()*(i4+x1.size()*(i2)))))]
535                 += (1.0) * i0data[i5+x5.size()*(i3)];
536             }
537           }
538         }
539       }
540     }
541   }
542   {
543     if (x0 == x2) {
544       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x4, x1, x3);
545       for (int i2 = 0; i2 != x2.size(); ++i2) {
546         for (int i1 = 0; i1 != x1.size(); ++i1) {
547           for (int i3 = 0; i3 != x3.size(); ++i3) {
548             for (int i4 = 0; i4 != x4.size(); ++i4) {
549               for (int i5 = 0; i5 != x5.size(); ++i5) {
550                 odata[i5+x5.size()*(i4+x4.size()*(i2+x0.size()*(i3+x3.size()*(i1+x1.size()*(i2)))))]
551                   += (1.0) * i0data[i5+x5.size()*(i4+x4.size()*(i1+x1.size()*(i3)))];
552               }
553             }
554           }
555         }
556       }
557     }
558   }
559   {
560     if (x1 == x2 && x0 == x3) {
561       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x4);
562       for (int i2 = 0; i2 != x2.size(); ++i2) {
563         for (int i3 = 0; i3 != x3.size(); ++i3) {
564           for (int i4 = 0; i4 != x4.size(); ++i4) {
565             for (int i5 = 0; i5 != x5.size(); ++i5) {
566               odata[i5+x5.size()*(i4+x4.size()*(i3+x0.size()*(i3+x3.size()*(i2+x1.size()*(i2)))))]
567                 += (4.0) * i0data[i5+x5.size()*(i4)];
568             }
569           }
570         }
571       }
572     }
573   }
574   {
575     if (x1 == x4 && x0 == x3) {
576       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x2);
577       for (int i2 = 0; i2 != x2.size(); ++i2) {
578         for (int i3 = 0; i3 != x3.size(); ++i3) {
579           for (int i4 = 0; i4 != x4.size(); ++i4) {
580             for (int i5 = 0; i5 != x5.size(); ++i5) {
581               odata[i5+x5.size()*(i4+x4.size()*(i3+x0.size()*(i3+x3.size()*(i4+x1.size()*(i2)))))]
582                 += (-2.0) * i0data[i5+x5.size()*(i2)];
583             }
584           }
585         }
586       }
587     }
588   }
589   {
590     if (x0 == x3) {
591       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x4, x1, x2);
592       for (int i2 = 0; i2 != x2.size(); ++i2) {
593         for (int i1 = 0; i1 != x1.size(); ++i1) {
594           for (int i3 = 0; i3 != x3.size(); ++i3) {
595             for (int i4 = 0; i4 != x4.size(); ++i4) {
596               for (int i5 = 0; i5 != x5.size(); ++i5) {
597                 odata[i5+x5.size()*(i4+x4.size()*(i3+x0.size()*(i3+x3.size()*(i1+x1.size()*(i2)))))]
598                   += (-2.0) * i0data[i5+x5.size()*(i4+x4.size()*(i1+x1.size()*(i2)))];
599               }
600             }
601           }
602         }
603       }
604     }
605   }
606   {
607     if (x1 == x2 && x0 == x4) {
608       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x3);
609       for (int i2 = 0; i2 != x2.size(); ++i2) {
610         for (int i3 = 0; i3 != x3.size(); ++i3) {
611           for (int i4 = 0; i4 != x4.size(); ++i4) {
612             for (int i5 = 0; i5 != x5.size(); ++i5) {
613               odata[i5+x5.size()*(i4+x4.size()*(i4+x0.size()*(i3+x3.size()*(i2+x1.size()*(i2)))))]
614                 += (-2.0) * i0data[i5+x5.size()*(i3)];
615             }
616           }
617         }
618       }
619     }
620   }
621   {
622     if (x1 == x3 && x0 == x4) {
623       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x2);
624       for (int i2 = 0; i2 != x2.size(); ++i2) {
625         for (int i3 = 0; i3 != x3.size(); ++i3) {
626           for (int i4 = 0; i4 != x4.size(); ++i4) {
627             for (int i5 = 0; i5 != x5.size(); ++i5) {
628               odata[i5+x5.size()*(i4+x4.size()*(i4+x0.size()*(i3+x3.size()*(i3+x1.size()*(i2)))))]
629                 += (1.0) * i0data[i5+x5.size()*(i2)];
630             }
631           }
632         }
633       }
634     }
635   }
636   {
637     if (x0 == x4) {
638       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x3, x1, x2);
639       for (int i2 = 0; i2 != x2.size(); ++i2) {
640         for (int i1 = 0; i1 != x1.size(); ++i1) {
641           for (int i3 = 0; i3 != x3.size(); ++i3) {
642             for (int i4 = 0; i4 != x4.size(); ++i4) {
643               for (int i5 = 0; i5 != x5.size(); ++i5) {
644                 odata[i5+x5.size()*(i4+x4.size()*(i4+x0.size()*(i3+x3.size()*(i1+x1.size()*(i2)))))]
645                   += (1.0) * i0data[i5+x5.size()*(i3+x3.size()*(i1+x1.size()*(i2)))];
646               }
647             }
648           }
649         }
650       }
651     }
652   }
653   {
654     if (x1 == x2) {
655       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x4, x0, x3);
656       for (int i2 = 0; i2 != x2.size(); ++i2) {
657         for (int i3 = 0; i3 != x3.size(); ++i3) {
658           for (int i0 = 0; i0 != x0.size(); ++i0) {
659             for (int i4 = 0; i4 != x4.size(); ++i4) {
660               for (int i5 = 0; i5 != x5.size(); ++i5) {
661                 odata[i5+x5.size()*(i4+x4.size()*(i0+x0.size()*(i3+x3.size()*(i2+x1.size()*(i2)))))]
662                   += (-2.0) * i0data[i5+x5.size()*(i4+x4.size()*(i0+x0.size()*(i3)))];
663               }
664             }
665           }
666         }
667       }
668     }
669   }
670   {
671     if (x1 == x3) {
672       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x4, x0, x2);
673       for (int i2 = 0; i2 != x2.size(); ++i2) {
674         for (int i3 = 0; i3 != x3.size(); ++i3) {
675           for (int i0 = 0; i0 != x0.size(); ++i0) {
676             for (int i4 = 0; i4 != x4.size(); ++i4) {
677               for (int i5 = 0; i5 != x5.size(); ++i5) {
678                 odata[i5+x5.size()*(i4+x4.size()*(i0+x0.size()*(i3+x3.size()*(i3+x1.size()*(i2)))))]
679                   += (1.0) * i0data[i5+x5.size()*(i4+x4.size()*(i0+x0.size()*(i2)))];
680               }
681             }
682           }
683         }
684       }
685     }
686   }
687   {
688     if (x1 == x4) {
689       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x2, x0, x3);
690       for (int i2 = 0; i2 != x2.size(); ++i2) {
691         for (int i3 = 0; i3 != x3.size(); ++i3) {
692           for (int i0 = 0; i0 != x0.size(); ++i0) {
693             for (int i4 = 0; i4 != x4.size(); ++i4) {
694               for (int i5 = 0; i5 != x5.size(); ++i5) {
695                 odata[i5+x5.size()*(i4+x4.size()*(i0+x0.size()*(i3+x3.size()*(i4+x1.size()*(i2)))))]
696                   += (1.0) * i0data[i5+x5.size()*(i2+x2.size()*(i0+x0.size()*(i3)))];
697               }
698             }
699           }
700         }
701       }
702     }
703   }
704   {
705     std::unique_ptr<double[]> i0data = in(2)->get_block(x5, x4, x0, x3, x1, x2);
706     sort_indices<0,1,2,3,4,5,1,1,1,1>(i0data, odata, x5.size(), x4.size(), x0.size(), x3.size(), x1.size(), x2.size());
707   }
708   out()->add_block(odata, x5, x4, x0, x3, x1, x2);
709 }
710 
compute()711 void Task3::Task_local::compute() {
712   const Index x1 = b(0);
713   const Index x3 = b(1);
714   const Index x0 = b(2);
715   const Index x2 = b(3);
716   // tensor label: Gamma3
717   std::unique_ptr<double[]> odata(new double[out()->get_size(x1, x3, x0, x2)]);
718   std::fill_n(odata.get(), out()->get_size(x1, x3, x0, x2), 0.0);
719   {
720     // rdm0 non-merged case
721     if (x1 == x3 && x0 == x2) {
722       std::unique_ptr<double[]> i0data = in(0)->get_block();
723       for (int i2 = 0; i2 != x2.size(); ++i2) {
724         for (int i3 = 0; i3 != x3.size(); ++i3) {
725           odata[i3+x1.size()*(i3+x3.size()*(i2+x0.size()*(i2)))]  += -4.0 * i0data[0];
726         }
727       }
728     }
729   }
730   {
731     if (x0 == x2) {
732       std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x3);
733       for (int i2 = 0; i2 != x2.size(); ++i2) {
734         for (int i3 = 0; i3 != x3.size(); ++i3) {
735           for (int i1 = 0; i1 != x1.size(); ++i1) {
736             odata[i1+x1.size()*(i3+x3.size()*(i2+x0.size()*(i2)))]
737               += (2.0) * i0data[i1+x1.size()*(i3)];
738           }
739         }
740       }
741     }
742   }
743   {
744     // rdm0 non-merged case
745     if (x1 == x2 && x0 == x3) {
746       std::unique_ptr<double[]> i0data = in(0)->get_block();
747       for (int i2 = 0; i2 != x2.size(); ++i2) {
748         for (int i3 = 0; i3 != x3.size(); ++i3) {
749           odata[i2+x1.size()*(i3+x3.size()*(i3+x0.size()*(i2)))]  += 2.0 * i0data[0];
750         }
751       }
752     }
753   }
754   {
755     if (x0 == x3) {
756       std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x2);
757       for (int i2 = 0; i2 != x2.size(); ++i2) {
758         for (int i3 = 0; i3 != x3.size(); ++i3) {
759           for (int i1 = 0; i1 != x1.size(); ++i1) {
760             odata[i1+x1.size()*(i3+x3.size()*(i3+x0.size()*(i2)))]
761               += (-1.0) * i0data[i1+x1.size()*(i2)];
762           }
763         }
764       }
765     }
766   }
767   {
768     if (x1 == x2) {
769       std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x3);
770       for (int i2 = 0; i2 != x2.size(); ++i2) {
771         for (int i0 = 0; i0 != x0.size(); ++i0) {
772           for (int i3 = 0; i3 != x3.size(); ++i3) {
773             odata[i2+x1.size()*(i3+x3.size()*(i0+x0.size()*(i2)))]
774               += (-1.0) * i0data[i0+x0.size()*(i3)];
775           }
776         }
777       }
778     }
779   }
780   {
781     if (x1 == x3) {
782       std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x2);
783       for (int i2 = 0; i2 != x2.size(); ++i2) {
784         for (int i0 = 0; i0 != x0.size(); ++i0) {
785           for (int i3 = 0; i3 != x3.size(); ++i3) {
786             odata[i3+x1.size()*(i3+x3.size()*(i0+x0.size()*(i2)))]
787               += (2.0) * i0data[i0+x0.size()*(i2)];
788           }
789         }
790       }
791     }
792   }
793   {
794     std::unique_ptr<double[]> i0data = in(2)->get_block(x1, x3, x0, x2);
795     sort_indices<0,1,2,3,1,1,-1,1>(i0data, odata, x1.size(), x3.size(), x0.size(), x2.size());
796   }
797   out()->add_block(odata, x1, x3, x0, x2);
798 }
799 
compute()800 void Task4::Task_local::compute() {
801   const Index x2 = b(0);
802   const Index x5 = b(1);
803   const Index x3 = b(2);
804   const Index x4 = b(3);
805   const Index x1 = b(4);
806   const Index x0 = b(5);
807   // tensor label: Gamma4
808   std::unique_ptr<double[]> odata(new double[out()->get_size(x2, x5, x3, x4, x1, x0)]);
809   std::fill_n(odata.get(), out()->get_size(x2, x5, x3, x4, x1, x0), 0.0);
810   {
811     if (x2 == x5 && x1 == x4) {
812       std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x0);
813       for (int i0 = 0; i0 != x0.size(); ++i0) {
814         for (int i4 = 0; i4 != x4.size(); ++i4) {
815           for (int i3 = 0; i3 != x3.size(); ++i3) {
816             for (int i5 = 0; i5 != x5.size(); ++i5) {
817               odata[i5+x2.size()*(i5+x5.size()*(i3+x3.size()*(i4+x4.size()*(i4+x1.size()*(i0)))))]
818                 += (-2.0) * i0data[i3+x3.size()*(i0)];
819             }
820           }
821         }
822       }
823     }
824   }
825   {
826     if (x2 == x4 && x1 == x5) {
827       std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x0);
828       for (int i0 = 0; i0 != x0.size(); ++i0) {
829         for (int i4 = 0; i4 != x4.size(); ++i4) {
830           for (int i3 = 0; i3 != x3.size(); ++i3) {
831             for (int i5 = 0; i5 != x5.size(); ++i5) {
832               odata[i4+x2.size()*(i5+x5.size()*(i3+x3.size()*(i4+x4.size()*(i5+x1.size()*(i0)))))]
833                 += (1.0) * i0data[i3+x3.size()*(i0)];
834             }
835           }
836         }
837       }
838     }
839   }
840   {
841     if (x3 == x5 && x1 == x4) {
842       std::unique_ptr<double[]> i0data = in(0)->get_block(x2, x0);
843       for (int i0 = 0; i0 != x0.size(); ++i0) {
844         for (int i4 = 0; i4 != x4.size(); ++i4) {
845           for (int i5 = 0; i5 != x5.size(); ++i5) {
846             for (int i2 = 0; i2 != x2.size(); ++i2) {
847               odata[i2+x2.size()*(i5+x5.size()*(i5+x3.size()*(i4+x4.size()*(i4+x1.size()*(i0)))))]
848                 += (1.0) * i0data[i2+x2.size()*(i0)];
849             }
850           }
851         }
852       }
853     }
854   }
855   {
856     if (x1 == x4) {
857       std::unique_ptr<double[]> i0data = in(1)->get_block(x2, x5, x3, x0);
858       for (int i0 = 0; i0 != x0.size(); ++i0) {
859         for (int i4 = 0; i4 != x4.size(); ++i4) {
860           for (int i3 = 0; i3 != x3.size(); ++i3) {
861             for (int i5 = 0; i5 != x5.size(); ++i5) {
862               for (int i2 = 0; i2 != x2.size(); ++i2) {
863                 odata[i2+x2.size()*(i5+x5.size()*(i3+x3.size()*(i4+x4.size()*(i4+x1.size()*(i0)))))]
864                   += (1.0) * i0data[i2+x2.size()*(i5+x5.size()*(i3+x3.size()*(i0)))];
865               }
866             }
867           }
868         }
869       }
870     }
871   }
872   {
873     if (x3 == x4 && x1 == x5) {
874       std::unique_ptr<double[]> i0data = in(0)->get_block(x2, x0);
875       for (int i0 = 0; i0 != x0.size(); ++i0) {
876         for (int i4 = 0; i4 != x4.size(); ++i4) {
877           for (int i5 = 0; i5 != x5.size(); ++i5) {
878             for (int i2 = 0; i2 != x2.size(); ++i2) {
879               odata[i2+x2.size()*(i5+x5.size()*(i4+x3.size()*(i4+x4.size()*(i5+x1.size()*(i0)))))]
880                 += (-2.0) * i0data[i2+x2.size()*(i0)];
881             }
882           }
883         }
884       }
885     }
886   }
887   {
888     if (x1 == x5) {
889       std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x4, x2, x0);
890       for (int i0 = 0; i0 != x0.size(); ++i0) {
891         for (int i4 = 0; i4 != x4.size(); ++i4) {
892           for (int i3 = 0; i3 != x3.size(); ++i3) {
893             for (int i5 = 0; i5 != x5.size(); ++i5) {
894               for (int i2 = 0; i2 != x2.size(); ++i2) {
895                 odata[i2+x2.size()*(i5+x5.size()*(i3+x3.size()*(i4+x4.size()*(i5+x1.size()*(i0)))))]
896                   += (1.0) * i0data[i3+x3.size()*(i4+x4.size()*(i2+x2.size()*(i0)))];
897               }
898             }
899           }
900         }
901       }
902     }
903   }
904   {
905     if (x3 == x5 && x2 == x4) {
906       std::unique_ptr<double[]> i0data = in(0)->get_block(x1, x0);
907       for (int i0 = 0; i0 != x0.size(); ++i0) {
908         for (int i1 = 0; i1 != x1.size(); ++i1) {
909           for (int i4 = 0; i4 != x4.size(); ++i4) {
910             for (int i5 = 0; i5 != x5.size(); ++i5) {
911               odata[i4+x2.size()*(i5+x5.size()*(i5+x3.size()*(i4+x4.size()*(i1+x1.size()*(i0)))))]
912                 += (-2.0) * i0data[i1+x1.size()*(i0)];
913             }
914           }
915         }
916       }
917     }
918   }
919   {
920     if (x2 == x4) {
921       std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x5, x1, x0);
922       for (int i0 = 0; i0 != x0.size(); ++i0) {
923         for (int i1 = 0; i1 != x1.size(); ++i1) {
924           for (int i4 = 0; i4 != x4.size(); ++i4) {
925             for (int i3 = 0; i3 != x3.size(); ++i3) {
926               for (int i5 = 0; i5 != x5.size(); ++i5) {
927                 odata[i4+x2.size()*(i5+x5.size()*(i3+x3.size()*(i4+x4.size()*(i1+x1.size()*(i0)))))]
928                   += (1.0) * i0data[i3+x3.size()*(i5+x5.size()*(i1+x1.size()*(i0)))];
929               }
930             }
931           }
932         }
933       }
934     }
935   }
936   {
937     if (x3 == x4 && x2 == x5) {
938       std::unique_ptr<double[]> i0data = in(0)->get_block(x1, x0);
939       for (int i0 = 0; i0 != x0.size(); ++i0) {
940         for (int i1 = 0; i1 != x1.size(); ++i1) {
941           for (int i4 = 0; i4 != x4.size(); ++i4) {
942             for (int i5 = 0; i5 != x5.size(); ++i5) {
943               odata[i5+x2.size()*(i5+x5.size()*(i4+x3.size()*(i4+x4.size()*(i1+x1.size()*(i0)))))]
944                 += (4.0) * i0data[i1+x1.size()*(i0)];
945             }
946           }
947         }
948       }
949     }
950   }
951   {
952     if (x2 == x5) {
953       std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x4, x1, x0);
954       for (int i0 = 0; i0 != x0.size(); ++i0) {
955         for (int i1 = 0; i1 != x1.size(); ++i1) {
956           for (int i4 = 0; i4 != x4.size(); ++i4) {
957             for (int i3 = 0; i3 != x3.size(); ++i3) {
958               for (int i5 = 0; i5 != x5.size(); ++i5) {
959                 odata[i5+x2.size()*(i5+x5.size()*(i3+x3.size()*(i4+x4.size()*(i1+x1.size()*(i0)))))]
960                   += (-2.0) * i0data[i3+x3.size()*(i4+x4.size()*(i1+x1.size()*(i0)))];
961               }
962             }
963           }
964         }
965       }
966     }
967   }
968   {
969     if (x3 == x4) {
970       std::unique_ptr<double[]> i0data = in(1)->get_block(x2, x5, x1, x0);
971       for (int i0 = 0; i0 != x0.size(); ++i0) {
972         for (int i1 = 0; i1 != x1.size(); ++i1) {
973           for (int i4 = 0; i4 != x4.size(); ++i4) {
974             for (int i5 = 0; i5 != x5.size(); ++i5) {
975               for (int i2 = 0; i2 != x2.size(); ++i2) {
976                 odata[i2+x2.size()*(i5+x5.size()*(i4+x3.size()*(i4+x4.size()*(i1+x1.size()*(i0)))))]
977                   += (-2.0) * i0data[i2+x2.size()*(i5+x5.size()*(i1+x1.size()*(i0)))];
978               }
979             }
980           }
981         }
982       }
983     }
984   }
985   {
986     if (x3 == x5) {
987       std::unique_ptr<double[]> i0data = in(1)->get_block(x2, x4, x1, x0);
988       for (int i0 = 0; i0 != x0.size(); ++i0) {
989         for (int i1 = 0; i1 != x1.size(); ++i1) {
990           for (int i4 = 0; i4 != x4.size(); ++i4) {
991             for (int i5 = 0; i5 != x5.size(); ++i5) {
992               for (int i2 = 0; i2 != x2.size(); ++i2) {
993                 odata[i2+x2.size()*(i5+x5.size()*(i5+x3.size()*(i4+x4.size()*(i1+x1.size()*(i0)))))]
994                   += (1.0) * i0data[i2+x2.size()*(i4+x4.size()*(i1+x1.size()*(i0)))];
995               }
996             }
997           }
998         }
999       }
1000     }
1001   }
1002   {
1003     std::unique_ptr<double[]> i0data = in(2)->get_block(x2, x5, x3, x4, x1, x0);
1004     sort_indices<0,1,2,3,4,5,1,1,1,1>(i0data, odata, x2.size(), x5.size(), x3.size(), x4.size(), x1.size(), x0.size());
1005   }
1006   out()->add_block(odata, x2, x5, x3, x4, x1, x0);
1007 }
1008 
compute()1009 void Task5::Task_local::compute() {
1010   const Index x7 = b(0);
1011   const Index x6 = b(1);
1012   const Index x2 = b(2);
1013   const Index x5 = b(3);
1014   const Index x1 = b(4);
1015   const Index x0 = b(5);
1016   const Index x4 = b(6);
1017   const Index x3 = b(7);
1018   // tensor label: Gamma5
1019   std::unique_ptr<double[]> odata(new double[out()->get_size(x7, x6, x2, x5, x1, x0)]);
1020   std::fill_n(odata.get(), out()->get_size(x7, x6, x2, x5, x1, x0), 0.0);
1021   // associated with merged
1022   std::unique_ptr<double[]> fdata = in(4)->get_block(x4, x3);
1023   if (x2 == x6 && x1 == x5) {
1024     std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x0, x4, x3);
1025     for (int i3 = 0; i3 != x3.size(); ++i3) {
1026       for (int i4 = 0; i4 != x4.size(); ++i4) {
1027         for (int i0 = 0; i0 != x0.size(); ++i0) {
1028           for (int i7 = 0; i7 != x7.size(); ++i7) {
1029             for (int i6 = 0; i6 != x6.size(); ++i6) {
1030               for (int i5 = 0; i5 != x5.size(); ++i5) {
1031                 odata[i7+x7.size()*(i6+x6.size()*(i6+x2.size()*(i5+x5.size()*(i5+x1.size()*(i0)))))]
1032                   += (-1.0) * i0data[i7+x7.size()*(i0+x0.size()*(i4+x4.size()*(i3)))] * fdata[i4+x4.size()*(i3)];
1033               }
1034             }
1035           }
1036         }
1037       }
1038     }
1039   }
1040   if (x2 == x5 && x1 == x6) {
1041     std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x0, x4, x3);
1042     for (int i3 = 0; i3 != x3.size(); ++i3) {
1043       for (int i4 = 0; i4 != x4.size(); ++i4) {
1044         for (int i0 = 0; i0 != x0.size(); ++i0) {
1045           for (int i7 = 0; i7 != x7.size(); ++i7) {
1046             for (int i5 = 0; i5 != x5.size(); ++i5) {
1047               for (int i6 = 0; i6 != x6.size(); ++i6) {
1048                 odata[i7+x7.size()*(i6+x6.size()*(i5+x2.size()*(i5+x5.size()*(i6+x1.size()*(i0)))))]
1049                   += (2.0) * i0data[i7+x7.size()*(i0+x0.size()*(i4+x4.size()*(i3)))] * fdata[i4+x4.size()*(i3)];
1050               }
1051             }
1052           }
1053         }
1054       }
1055     }
1056   }
1057   if (x2 == x5 && x1 == x3 && x4 == x6) {
1058     std::unique_ptr<double[]> i0data = in(0)->get_block(x7, x0);
1059     for (int i0 = 0; i0 != x0.size(); ++i0) {
1060       for (int i7 = 0; i7 != x7.size(); ++i7) {
1061         for (int i5 = 0; i5 != x5.size(); ++i5) {
1062           for (int i3 = 0; i3 != x3.size(); ++i3) {
1063             for (int i6 = 0; i6 != x6.size(); ++i6) {
1064               odata[i7+x7.size()*(i6+x6.size()*(i5+x2.size()*(i5+x5.size()*(i3+x1.size()*(i0)))))]
1065                 += (2.0) * i0data[i7+x7.size()*(i0)] * fdata[i6+x4.size()*(i3)];
1066             }
1067           }
1068         }
1069       }
1070     }
1071   }
1072   if (x2 == x5 && x1 == x3) {
1073     std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x6, x4, x0);
1074     for (int i0 = 0; i0 != x0.size(); ++i0) {
1075       for (int i4 = 0; i4 != x4.size(); ++i4) {
1076         for (int i6 = 0; i6 != x6.size(); ++i6) {
1077           for (int i7 = 0; i7 != x7.size(); ++i7) {
1078             for (int i5 = 0; i5 != x5.size(); ++i5) {
1079               for (int i3 = 0; i3 != x3.size(); ++i3) {
1080                 odata[i7+x7.size()*(i6+x6.size()*(i5+x2.size()*(i5+x5.size()*(i3+x1.size()*(i0)))))]
1081                   += (2.0) * i0data[i7+x7.size()*(i6+x6.size()*(i4+x4.size()*(i0)))] * fdata[i4+x4.size()*(i3)];
1082               }
1083             }
1084           }
1085         }
1086       }
1087     }
1088   }
1089   if (x4 == x5 && x2 == x6 && x1 == x3) {
1090     std::unique_ptr<double[]> i0data = in(0)->get_block(x7, x0);
1091     for (int i0 = 0; i0 != x0.size(); ++i0) {
1092       for (int i7 = 0; i7 != x7.size(); ++i7) {
1093         for (int i5 = 0; i5 != x5.size(); ++i5) {
1094           for (int i6 = 0; i6 != x6.size(); ++i6) {
1095             for (int i3 = 0; i3 != x3.size(); ++i3) {
1096               odata[i7+x7.size()*(i6+x6.size()*(i6+x2.size()*(i5+x5.size()*(i3+x1.size()*(i0)))))]
1097                 += (-1.0) * i0data[i7+x7.size()*(i0)] * fdata[i5+x4.size()*(i3)];
1098             }
1099           }
1100         }
1101       }
1102     }
1103   }
1104   if (x2 == x6 && x1 == x3) {
1105     std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x5, x4, x0);
1106     for (int i0 = 0; i0 != x0.size(); ++i0) {
1107       for (int i4 = 0; i4 != x4.size(); ++i4) {
1108         for (int i5 = 0; i5 != x5.size(); ++i5) {
1109           for (int i7 = 0; i7 != x7.size(); ++i7) {
1110             for (int i6 = 0; i6 != x6.size(); ++i6) {
1111               for (int i3 = 0; i3 != x3.size(); ++i3) {
1112                 odata[i7+x7.size()*(i6+x6.size()*(i6+x2.size()*(i5+x5.size()*(i3+x1.size()*(i0)))))]
1113                   += (-1.0) * i0data[i7+x7.size()*(i5+x5.size()*(i4+x4.size()*(i0)))] * fdata[i4+x4.size()*(i3)];
1114               }
1115             }
1116           }
1117         }
1118       }
1119     }
1120   }
1121   if (x4 == x5 && x1 == x3) {
1122     std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x6, x2, x0);
1123     for (int i0 = 0; i0 != x0.size(); ++i0) {
1124       for (int i2 = 0; i2 != x2.size(); ++i2) {
1125         for (int i6 = 0; i6 != x6.size(); ++i6) {
1126           for (int i7 = 0; i7 != x7.size(); ++i7) {
1127             for (int i5 = 0; i5 != x5.size(); ++i5) {
1128               for (int i3 = 0; i3 != x3.size(); ++i3) {
1129                 odata[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i3+x1.size()*(i0)))))]
1130                   += (-1.0) * i0data[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i0)))] * fdata[i5+x4.size()*(i3)];
1131               }
1132             }
1133           }
1134         }
1135       }
1136     }
1137   }
1138   if (x4 == x6 && x1 == x3) {
1139     std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x0, x2, x5);
1140     for (int i5 = 0; i5 != x5.size(); ++i5) {
1141       for (int i2 = 0; i2 != x2.size(); ++i2) {
1142         for (int i0 = 0; i0 != x0.size(); ++i0) {
1143           for (int i7 = 0; i7 != x7.size(); ++i7) {
1144             for (int i6 = 0; i6 != x6.size(); ++i6) {
1145               for (int i3 = 0; i3 != x3.size(); ++i3) {
1146                 odata[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i3+x1.size()*(i0)))))]
1147                   += (-1.0) * i0data[i7+x7.size()*(i0+x0.size()*(i2+x2.size()*(i5)))] * fdata[i6+x4.size()*(i3)];
1148               }
1149             }
1150           }
1151         }
1152       }
1153     }
1154   }
1155   if (x1 == x3) {
1156     std::unique_ptr<double[]> i0data = in(2)->get_block(x7, x6, x2, x5, x4, x0);
1157     for (int i0 = 0; i0 != x0.size(); ++i0) {
1158       for (int i4 = 0; i4 != x4.size(); ++i4) {
1159         for (int i5 = 0; i5 != x5.size(); ++i5) {
1160           for (int i2 = 0; i2 != x2.size(); ++i2) {
1161             for (int i6 = 0; i6 != x6.size(); ++i6) {
1162               for (int i7 = 0; i7 != x7.size(); ++i7) {
1163                 for (int i3 = 0; i3 != x3.size(); ++i3) {
1164                   odata[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i3+x1.size()*(i0)))))]
1165                     += (-1.0) * i0data[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i4+x4.size()*(i0)))))] * fdata[i4+x4.size()*(i3)];
1166                 }
1167               }
1168             }
1169           }
1170         }
1171       }
1172     }
1173   }
1174   if (x4 == x6 && x2 == x3 && x1 == x5) {
1175     std::unique_ptr<double[]> i0data = in(0)->get_block(x7, x0);
1176     for (int i0 = 0; i0 != x0.size(); ++i0) {
1177       for (int i7 = 0; i7 != x7.size(); ++i7) {
1178         for (int i6 = 0; i6 != x6.size(); ++i6) {
1179           for (int i3 = 0; i3 != x3.size(); ++i3) {
1180             for (int i5 = 0; i5 != x5.size(); ++i5) {
1181               odata[i7+x7.size()*(i6+x6.size()*(i3+x2.size()*(i5+x5.size()*(i5+x1.size()*(i0)))))]
1182                 += (-1.0) * i0data[i7+x7.size()*(i0)] * fdata[i6+x4.size()*(i3)];
1183             }
1184           }
1185         }
1186       }
1187     }
1188   }
1189   if (x2 == x3 && x1 == x5) {
1190     std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x6, x4, x0);
1191     for (int i0 = 0; i0 != x0.size(); ++i0) {
1192       for (int i4 = 0; i4 != x4.size(); ++i4) {
1193         for (int i6 = 0; i6 != x6.size(); ++i6) {
1194           for (int i7 = 0; i7 != x7.size(); ++i7) {
1195             for (int i3 = 0; i3 != x3.size(); ++i3) {
1196               for (int i5 = 0; i5 != x5.size(); ++i5) {
1197                 odata[i7+x7.size()*(i6+x6.size()*(i3+x2.size()*(i5+x5.size()*(i5+x1.size()*(i0)))))]
1198                   += (-1.0) * i0data[i7+x7.size()*(i6+x6.size()*(i4+x4.size()*(i0)))] * fdata[i4+x4.size()*(i3)];
1199               }
1200             }
1201           }
1202         }
1203       }
1204     }
1205   }
1206   if (x4 == x6 && x1 == x5) {
1207     std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x3, x2, x0);
1208     for (int i0 = 0; i0 != x0.size(); ++i0) {
1209       for (int i2 = 0; i2 != x2.size(); ++i2) {
1210         for (int i3 = 0; i3 != x3.size(); ++i3) {
1211           for (int i7 = 0; i7 != x7.size(); ++i7) {
1212             for (int i6 = 0; i6 != x6.size(); ++i6) {
1213               for (int i5 = 0; i5 != x5.size(); ++i5) {
1214                 odata[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i5+x1.size()*(i0)))))]
1215                   += (-1.0) * i0data[i7+x7.size()*(i3+x3.size()*(i2+x2.size()*(i0)))] * fdata[i6+x4.size()*(i3)];
1216               }
1217             }
1218           }
1219         }
1220       }
1221     }
1222   }
1223   if (x1 == x5) {
1224     std::unique_ptr<double[]> i0data = in(2)->get_block(x7, x6, x4, x3, x2, x0);
1225     for (int i0 = 0; i0 != x0.size(); ++i0) {
1226       for (int i2 = 0; i2 != x2.size(); ++i2) {
1227         for (int i3 = 0; i3 != x3.size(); ++i3) {
1228           for (int i4 = 0; i4 != x4.size(); ++i4) {
1229             for (int i6 = 0; i6 != x6.size(); ++i6) {
1230               for (int i7 = 0; i7 != x7.size(); ++i7) {
1231                 for (int i5 = 0; i5 != x5.size(); ++i5) {
1232                   odata[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i5+x1.size()*(i0)))))]
1233                     += (-1.0) * i0data[i7+x7.size()*(i6+x6.size()*(i4+x4.size()*(i3+x3.size()*(i2+x2.size()*(i0)))))] * fdata[i4+x4.size()*(i3)];
1234                 }
1235               }
1236             }
1237           }
1238         }
1239       }
1240     }
1241   }
1242   if (x4 == x5 && x2 == x3 && x1 == x6) {
1243     std::unique_ptr<double[]> i0data = in(0)->get_block(x7, x0);
1244     for (int i0 = 0; i0 != x0.size(); ++i0) {
1245       for (int i7 = 0; i7 != x7.size(); ++i7) {
1246         for (int i5 = 0; i5 != x5.size(); ++i5) {
1247           for (int i3 = 0; i3 != x3.size(); ++i3) {
1248             for (int i6 = 0; i6 != x6.size(); ++i6) {
1249               odata[i7+x7.size()*(i6+x6.size()*(i3+x2.size()*(i5+x5.size()*(i6+x1.size()*(i0)))))]
1250                 += (2.0) * i0data[i7+x7.size()*(i0)] * fdata[i5+x4.size()*(i3)];
1251             }
1252           }
1253         }
1254       }
1255     }
1256   }
1257   if (x2 == x3 && x1 == x6) {
1258     std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x0, x4, x5);
1259     for (int i5 = 0; i5 != x5.size(); ++i5) {
1260       for (int i4 = 0; i4 != x4.size(); ++i4) {
1261         for (int i0 = 0; i0 != x0.size(); ++i0) {
1262           for (int i7 = 0; i7 != x7.size(); ++i7) {
1263             for (int i3 = 0; i3 != x3.size(); ++i3) {
1264               for (int i6 = 0; i6 != x6.size(); ++i6) {
1265                 odata[i7+x7.size()*(i6+x6.size()*(i3+x2.size()*(i5+x5.size()*(i6+x1.size()*(i0)))))]
1266                   += (-1.0) * i0data[i7+x7.size()*(i0+x0.size()*(i4+x4.size()*(i5)))] * fdata[i4+x4.size()*(i3)];
1267               }
1268             }
1269           }
1270         }
1271       }
1272     }
1273   }
1274   if (x4 == x5 && x1 == x6) {
1275     std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x0, x2, x3);
1276     for (int i3 = 0; i3 != x3.size(); ++i3) {
1277       for (int i2 = 0; i2 != x2.size(); ++i2) {
1278         for (int i0 = 0; i0 != x0.size(); ++i0) {
1279           for (int i7 = 0; i7 != x7.size(); ++i7) {
1280             for (int i5 = 0; i5 != x5.size(); ++i5) {
1281               for (int i6 = 0; i6 != x6.size(); ++i6) {
1282                 odata[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i6+x1.size()*(i0)))))]
1283                   += (-1.0) * i0data[i7+x7.size()*(i0+x0.size()*(i2+x2.size()*(i3)))] * fdata[i5+x4.size()*(i3)];
1284               }
1285             }
1286           }
1287         }
1288       }
1289     }
1290   }
1291   if (x1 == x6) {
1292     std::unique_ptr<double[]> i0data = in(2)->get_block(x7, x0, x2, x5, x4, x3);
1293     for (int i3 = 0; i3 != x3.size(); ++i3) {
1294       for (int i4 = 0; i4 != x4.size(); ++i4) {
1295         for (int i5 = 0; i5 != x5.size(); ++i5) {
1296           for (int i2 = 0; i2 != x2.size(); ++i2) {
1297             for (int i0 = 0; i0 != x0.size(); ++i0) {
1298               for (int i7 = 0; i7 != x7.size(); ++i7) {
1299                 for (int i6 = 0; i6 != x6.size(); ++i6) {
1300                   odata[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i6+x1.size()*(i0)))))]
1301                     += (-1.0) * i0data[i7+x7.size()*(i0+x0.size()*(i2+x2.size()*(i5+x5.size()*(i4+x4.size()*(i3)))))] * fdata[i4+x4.size()*(i3)];
1302                 }
1303               }
1304             }
1305           }
1306         }
1307       }
1308     }
1309   }
1310   if (x4 == x5 && x2 == x3) {
1311     std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x6, x1, x0);
1312     for (int i0 = 0; i0 != x0.size(); ++i0) {
1313       for (int i1 = 0; i1 != x1.size(); ++i1) {
1314         for (int i6 = 0; i6 != x6.size(); ++i6) {
1315           for (int i7 = 0; i7 != x7.size(); ++i7) {
1316             for (int i5 = 0; i5 != x5.size(); ++i5) {
1317               for (int i3 = 0; i3 != x3.size(); ++i3) {
1318                 odata[i7+x7.size()*(i6+x6.size()*(i3+x2.size()*(i5+x5.size()*(i1+x1.size()*(i0)))))]
1319                   += (2.0) * i0data[i7+x7.size()*(i6+x6.size()*(i1+x1.size()*(i0)))] * fdata[i5+x4.size()*(i3)];
1320               }
1321             }
1322           }
1323         }
1324       }
1325     }
1326   }
1327   if (x4 == x6 && x2 == x3) {
1328     std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x5, x1, x0);
1329     for (int i0 = 0; i0 != x0.size(); ++i0) {
1330       for (int i1 = 0; i1 != x1.size(); ++i1) {
1331         for (int i5 = 0; i5 != x5.size(); ++i5) {
1332           for (int i7 = 0; i7 != x7.size(); ++i7) {
1333             for (int i6 = 0; i6 != x6.size(); ++i6) {
1334               for (int i3 = 0; i3 != x3.size(); ++i3) {
1335                 odata[i7+x7.size()*(i6+x6.size()*(i3+x2.size()*(i5+x5.size()*(i1+x1.size()*(i0)))))]
1336                   += (-1.0) * i0data[i7+x7.size()*(i5+x5.size()*(i1+x1.size()*(i0)))] * fdata[i6+x4.size()*(i3)];
1337               }
1338             }
1339           }
1340         }
1341       }
1342     }
1343   }
1344   if (x2 == x3) {
1345     std::unique_ptr<double[]> i0data = in(2)->get_block(x7, x6, x4, x5, x1, x0);
1346     for (int i0 = 0; i0 != x0.size(); ++i0) {
1347       for (int i1 = 0; i1 != x1.size(); ++i1) {
1348         for (int i5 = 0; i5 != x5.size(); ++i5) {
1349           for (int i4 = 0; i4 != x4.size(); ++i4) {
1350             for (int i6 = 0; i6 != x6.size(); ++i6) {
1351               for (int i7 = 0; i7 != x7.size(); ++i7) {
1352                 for (int i3 = 0; i3 != x3.size(); ++i3) {
1353                   odata[i7+x7.size()*(i6+x6.size()*(i3+x2.size()*(i5+x5.size()*(i1+x1.size()*(i0)))))]
1354                     += (-1.0) * i0data[i7+x7.size()*(i6+x6.size()*(i4+x4.size()*(i5+x5.size()*(i1+x1.size()*(i0)))))] * fdata[i4+x4.size()*(i3)];
1355                 }
1356               }
1357             }
1358           }
1359         }
1360       }
1361     }
1362   }
1363   if (x4 == x6 && x2 == x5) {
1364     std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x3, x1, x0);
1365     for (int i0 = 0; i0 != x0.size(); ++i0) {
1366       for (int i1 = 0; i1 != x1.size(); ++i1) {
1367         for (int i3 = 0; i3 != x3.size(); ++i3) {
1368           for (int i7 = 0; i7 != x7.size(); ++i7) {
1369             for (int i6 = 0; i6 != x6.size(); ++i6) {
1370               for (int i5 = 0; i5 != x5.size(); ++i5) {
1371                 odata[i7+x7.size()*(i6+x6.size()*(i5+x2.size()*(i5+x5.size()*(i1+x1.size()*(i0)))))]
1372                   += (2.0) * i0data[i7+x7.size()*(i3+x3.size()*(i1+x1.size()*(i0)))] * fdata[i6+x4.size()*(i3)];
1373               }
1374             }
1375           }
1376         }
1377       }
1378     }
1379   }
1380   if (x2 == x5) {
1381     std::unique_ptr<double[]> i0data = in(2)->get_block(x7, x6, x4, x3, x1, x0);
1382     for (int i0 = 0; i0 != x0.size(); ++i0) {
1383       for (int i1 = 0; i1 != x1.size(); ++i1) {
1384         for (int i3 = 0; i3 != x3.size(); ++i3) {
1385           for (int i4 = 0; i4 != x4.size(); ++i4) {
1386             for (int i6 = 0; i6 != x6.size(); ++i6) {
1387               for (int i7 = 0; i7 != x7.size(); ++i7) {
1388                 for (int i5 = 0; i5 != x5.size(); ++i5) {
1389                   odata[i7+x7.size()*(i6+x6.size()*(i5+x2.size()*(i5+x5.size()*(i1+x1.size()*(i0)))))]
1390                     += (2.0) * i0data[i7+x7.size()*(i6+x6.size()*(i4+x4.size()*(i3+x3.size()*(i1+x1.size()*(i0)))))] * fdata[i4+x4.size()*(i3)];
1391                 }
1392               }
1393             }
1394           }
1395         }
1396       }
1397     }
1398   }
1399   if (x4 == x5 && x2 == x6) {
1400     std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x3, x1, x0);
1401     for (int i0 = 0; i0 != x0.size(); ++i0) {
1402       for (int i1 = 0; i1 != x1.size(); ++i1) {
1403         for (int i3 = 0; i3 != x3.size(); ++i3) {
1404           for (int i7 = 0; i7 != x7.size(); ++i7) {
1405             for (int i5 = 0; i5 != x5.size(); ++i5) {
1406               for (int i6 = 0; i6 != x6.size(); ++i6) {
1407                 odata[i7+x7.size()*(i6+x6.size()*(i6+x2.size()*(i5+x5.size()*(i1+x1.size()*(i0)))))]
1408                   += (-1.0) * i0data[i7+x7.size()*(i3+x3.size()*(i1+x1.size()*(i0)))] * fdata[i5+x4.size()*(i3)];
1409               }
1410             }
1411           }
1412         }
1413       }
1414     }
1415   }
1416   if (x2 == x6) {
1417     std::unique_ptr<double[]> i0data = in(2)->get_block(x7, x5, x4, x3, x1, x0);
1418     for (int i0 = 0; i0 != x0.size(); ++i0) {
1419       for (int i1 = 0; i1 != x1.size(); ++i1) {
1420         for (int i3 = 0; i3 != x3.size(); ++i3) {
1421           for (int i4 = 0; i4 != x4.size(); ++i4) {
1422             for (int i5 = 0; i5 != x5.size(); ++i5) {
1423               for (int i7 = 0; i7 != x7.size(); ++i7) {
1424                 for (int i6 = 0; i6 != x6.size(); ++i6) {
1425                   odata[i7+x7.size()*(i6+x6.size()*(i6+x2.size()*(i5+x5.size()*(i1+x1.size()*(i0)))))]
1426                     += (-1.0) * i0data[i7+x7.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i1+x1.size()*(i0)))))] * fdata[i4+x4.size()*(i3)];
1427                 }
1428               }
1429             }
1430           }
1431         }
1432       }
1433     }
1434   }
1435   if (x4 == x5) {
1436     std::unique_ptr<double[]> i0data = in(2)->get_block(x7, x6, x2, x3, x1, x0);
1437     for (int i0 = 0; i0 != x0.size(); ++i0) {
1438       for (int i1 = 0; i1 != x1.size(); ++i1) {
1439         for (int i3 = 0; i3 != x3.size(); ++i3) {
1440           for (int i2 = 0; i2 != x2.size(); ++i2) {
1441             for (int i6 = 0; i6 != x6.size(); ++i6) {
1442               for (int i7 = 0; i7 != x7.size(); ++i7) {
1443                 for (int i5 = 0; i5 != x5.size(); ++i5) {
1444                   odata[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i1+x1.size()*(i0)))))]
1445                     += (-1.0) * i0data[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i3+x3.size()*(i1+x1.size()*(i0)))))] * fdata[i5+x4.size()*(i3)];
1446                 }
1447               }
1448             }
1449           }
1450         }
1451       }
1452     }
1453   }
1454   if (x4 == x6) {
1455     std::unique_ptr<double[]> i0data = in(2)->get_block(x7, x3, x2, x5, x1, x0);
1456     for (int i0 = 0; i0 != x0.size(); ++i0) {
1457       for (int i1 = 0; i1 != x1.size(); ++i1) {
1458         for (int i5 = 0; i5 != x5.size(); ++i5) {
1459           for (int i2 = 0; i2 != x2.size(); ++i2) {
1460             for (int i3 = 0; i3 != x3.size(); ++i3) {
1461               for (int i7 = 0; i7 != x7.size(); ++i7) {
1462                 for (int i6 = 0; i6 != x6.size(); ++i6) {
1463                   odata[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i1+x1.size()*(i0)))))]
1464                     += (-1.0) * i0data[i7+x7.size()*(i3+x3.size()*(i2+x2.size()*(i5+x5.size()*(i1+x1.size()*(i0)))))] * fdata[i6+x4.size()*(i3)];
1465                 }
1466               }
1467             }
1468           }
1469         }
1470       }
1471     }
1472   }
1473   {
1474     std::unique_ptr<double[]> i0data = in(3)->get_block(x7, x6, x2, x5, x1, x0);
1475     for (int i0 = 0; i0 != x0.size(); ++i0) {
1476       for (int i1 = 0; i1 != x1.size(); ++i1) {
1477         for (int i5 = 0; i5 != x5.size(); ++i5) {
1478           for (int i2 = 0; i2 != x2.size(); ++i2) {
1479             for (int i6 = 0; i6 != x6.size(); ++i6) {
1480               for (int i7 = 0; i7 != x7.size(); ++i7) {
1481                 odata[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i1+x1.size()*(i0)))))]
1482                   += (-1.0) * i0data[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i1+x1.size()*(i0)))))];
1483               }
1484             }
1485           }
1486         }
1487       }
1488     }
1489   }
1490   out()->add_block(odata, x7, x6, x2, x5, x1, x0);
1491 }
1492 
compute()1493 void Task6::Task_local::compute() {
1494   const Index x5 = b(0);
1495   const Index x4 = b(1);
1496   const Index x2 = b(2);
1497   const Index x3 = b(3);
1498   const Index x1 = b(4);
1499   const Index x0 = b(5);
1500   // tensor label: Gamma6
1501   std::unique_ptr<double[]> odata(new double[out()->get_size(x5, x4, x2, x3, x1, x0)]);
1502   std::fill_n(odata.get(), out()->get_size(x5, x4, x2, x3, x1, x0), 0.0);
1503   {
1504     if (x2 == x4 && x1 == x3) {
1505       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0);
1506       for (int i0 = 0; i0 != x0.size(); ++i0) {
1507         for (int i3 = 0; i3 != x3.size(); ++i3) {
1508           for (int i4 = 0; i4 != x4.size(); ++i4) {
1509             for (int i5 = 0; i5 != x5.size(); ++i5) {
1510               odata[i5+x5.size()*(i4+x4.size()*(i4+x2.size()*(i3+x3.size()*(i3+x1.size()*(i0)))))]
1511                 += (-1.0) * i0data[i5+x5.size()*(i0)];
1512             }
1513           }
1514         }
1515       }
1516     }
1517   }
1518   {
1519     if (x1 == x3) {
1520       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x4, x2, x0);
1521       for (int i0 = 0; i0 != x0.size(); ++i0) {
1522         for (int i3 = 0; i3 != x3.size(); ++i3) {
1523           for (int i2 = 0; i2 != x2.size(); ++i2) {
1524             for (int i4 = 0; i4 != x4.size(); ++i4) {
1525               for (int i5 = 0; i5 != x5.size(); ++i5) {
1526                 odata[i5+x5.size()*(i4+x4.size()*(i2+x2.size()*(i3+x3.size()*(i3+x1.size()*(i0)))))]
1527                   += (-1.0) * i0data[i5+x5.size()*(i4+x4.size()*(i2+x2.size()*(i0)))];
1528               }
1529             }
1530           }
1531         }
1532       }
1533     }
1534   }
1535   {
1536     if (x2 == x3 && x1 == x4) {
1537       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0);
1538       for (int i0 = 0; i0 != x0.size(); ++i0) {
1539         for (int i3 = 0; i3 != x3.size(); ++i3) {
1540           for (int i4 = 0; i4 != x4.size(); ++i4) {
1541             for (int i5 = 0; i5 != x5.size(); ++i5) {
1542               odata[i5+x5.size()*(i4+x4.size()*(i3+x2.size()*(i3+x3.size()*(i4+x1.size()*(i0)))))]
1543                 += (2.0) * i0data[i5+x5.size()*(i0)];
1544             }
1545           }
1546         }
1547       }
1548     }
1549   }
1550   {
1551     if (x1 == x4) {
1552       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x0, x2, x3);
1553       for (int i0 = 0; i0 != x0.size(); ++i0) {
1554         for (int i3 = 0; i3 != x3.size(); ++i3) {
1555           for (int i2 = 0; i2 != x2.size(); ++i2) {
1556             for (int i4 = 0; i4 != x4.size(); ++i4) {
1557               for (int i5 = 0; i5 != x5.size(); ++i5) {
1558                 odata[i5+x5.size()*(i4+x4.size()*(i2+x2.size()*(i3+x3.size()*(i4+x1.size()*(i0)))))]
1559                   += (-1.0) * i0data[i5+x5.size()*(i0+x0.size()*(i2+x2.size()*(i3)))];
1560               }
1561             }
1562           }
1563         }
1564       }
1565     }
1566   }
1567   {
1568     if (x2 == x3) {
1569       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x4, x1, x0);
1570       for (int i0 = 0; i0 != x0.size(); ++i0) {
1571         for (int i1 = 0; i1 != x1.size(); ++i1) {
1572           for (int i3 = 0; i3 != x3.size(); ++i3) {
1573             for (int i4 = 0; i4 != x4.size(); ++i4) {
1574               for (int i5 = 0; i5 != x5.size(); ++i5) {
1575                 odata[i5+x5.size()*(i4+x4.size()*(i3+x2.size()*(i3+x3.size()*(i1+x1.size()*(i0)))))]
1576                   += (2.0) * i0data[i5+x5.size()*(i4+x4.size()*(i1+x1.size()*(i0)))];
1577               }
1578             }
1579           }
1580         }
1581       }
1582     }
1583   }
1584   {
1585     if (x2 == x4) {
1586       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x3, x1, x0);
1587       for (int i0 = 0; i0 != x0.size(); ++i0) {
1588         for (int i1 = 0; i1 != x1.size(); ++i1) {
1589           for (int i3 = 0; i3 != x3.size(); ++i3) {
1590             for (int i4 = 0; i4 != x4.size(); ++i4) {
1591               for (int i5 = 0; i5 != x5.size(); ++i5) {
1592                 odata[i5+x5.size()*(i4+x4.size()*(i4+x2.size()*(i3+x3.size()*(i1+x1.size()*(i0)))))]
1593                   += (-1.0) * i0data[i5+x5.size()*(i3+x3.size()*(i1+x1.size()*(i0)))];
1594               }
1595             }
1596           }
1597         }
1598       }
1599     }
1600   }
1601   {
1602     std::unique_ptr<double[]> i0data = in(2)->get_block(x5, x4, x2, x3, x1, x0);
1603     sort_indices<0,1,2,3,4,5,1,1,-1,1>(i0data, odata, x5.size(), x4.size(), x2.size(), x3.size(), x1.size(), x0.size());
1604   }
1605   out()->add_block(odata, x5, x4, x2, x3, x1, x0);
1606 }
1607 
compute()1608 void Task7::Task_local::compute() {
1609   const Index x2 = b(0);
1610   const Index x3 = b(1);
1611   const Index x1 = b(2);
1612   const Index x0 = b(3);
1613   // tensor label: Gamma7
1614   std::unique_ptr<double[]> odata(new double[out()->get_size(x2, x3, x1, x0)]);
1615   std::fill_n(odata.get(), out()->get_size(x2, x3, x1, x0), 0.0);
1616   {
1617     if (x1 == x3) {
1618       std::unique_ptr<double[]> i0data = in(0)->get_block(x2, x0);
1619       for (int i0 = 0; i0 != x0.size(); ++i0) {
1620         for (int i3 = 0; i3 != x3.size(); ++i3) {
1621           for (int i2 = 0; i2 != x2.size(); ++i2) {
1622             odata[i2+x2.size()*(i3+x3.size()*(i3+x1.size()*(i0)))]
1623               += (-1.0) * i0data[i2+x2.size()*(i0)];
1624           }
1625         }
1626       }
1627     }
1628   }
1629   {
1630     if (x2 == x3) {
1631       std::unique_ptr<double[]> i0data = in(0)->get_block(x1, x0);
1632       for (int i0 = 0; i0 != x0.size(); ++i0) {
1633         for (int i1 = 0; i1 != x1.size(); ++i1) {
1634           for (int i3 = 0; i3 != x3.size(); ++i3) {
1635             odata[i3+x2.size()*(i3+x3.size()*(i1+x1.size()*(i0)))]
1636               += (2.0) * i0data[i1+x1.size()*(i0)];
1637           }
1638         }
1639       }
1640     }
1641   }
1642   {
1643     std::unique_ptr<double[]> i0data = in(1)->get_block(x2, x3, x1, x0);
1644     sort_indices<0,1,2,3,1,1,-1,1>(i0data, odata, x2.size(), x3.size(), x1.size(), x0.size());
1645   }
1646   out()->add_block(odata, x2, x3, x1, x0);
1647 }
1648 
compute()1649 void Task8::Task_local::compute() {
1650   const Index x5 = b(0);
1651   const Index x3 = b(1);
1652   const Index x2 = b(2);
1653   const Index x4 = b(3);
1654   const Index x1 = b(4);
1655   const Index x0 = b(5);
1656   // tensor label: Gamma9
1657   std::unique_ptr<double[]> odata(new double[out()->get_size(x5, x3, x2, x4, x1, x0)]);
1658   std::fill_n(odata.get(), out()->get_size(x5, x3, x2, x4, x1, x0), 0.0);
1659   {
1660     if (x2 == x4 && x1 == x3) {
1661       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0);
1662       for (int i0 = 0; i0 != x0.size(); ++i0) {
1663         for (int i4 = 0; i4 != x4.size(); ++i4) {
1664           for (int i3 = 0; i3 != x3.size(); ++i3) {
1665             for (int i5 = 0; i5 != x5.size(); ++i5) {
1666               odata[i5+x5.size()*(i3+x3.size()*(i4+x2.size()*(i4+x4.size()*(i3+x1.size()*(i0)))))]
1667                 += (-2.0) * i0data[i5+x5.size()*(i0)];
1668             }
1669           }
1670         }
1671       }
1672     }
1673   }
1674   {
1675     if (x1 == x3) {
1676       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x0, x2, x4);
1677       for (int i0 = 0; i0 != x0.size(); ++i0) {
1678         for (int i4 = 0; i4 != x4.size(); ++i4) {
1679           for (int i2 = 0; i2 != x2.size(); ++i2) {
1680             for (int i3 = 0; i3 != x3.size(); ++i3) {
1681               for (int i5 = 0; i5 != x5.size(); ++i5) {
1682                 odata[i5+x5.size()*(i3+x3.size()*(i2+x2.size()*(i4+x4.size()*(i3+x1.size()*(i0)))))]
1683                   += (1.0) * i0data[i5+x5.size()*(i0+x0.size()*(i2+x2.size()*(i4)))];
1684               }
1685             }
1686           }
1687         }
1688       }
1689     }
1690   }
1691   {
1692     if (x2 == x3 && x1 == x4) {
1693       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0);
1694       for (int i0 = 0; i0 != x0.size(); ++i0) {
1695         for (int i4 = 0; i4 != x4.size(); ++i4) {
1696           for (int i3 = 0; i3 != x3.size(); ++i3) {
1697             for (int i5 = 0; i5 != x5.size(); ++i5) {
1698               odata[i5+x5.size()*(i3+x3.size()*(i3+x2.size()*(i4+x4.size()*(i4+x1.size()*(i0)))))]
1699                 += (1.0) * i0data[i5+x5.size()*(i0)];
1700             }
1701           }
1702         }
1703       }
1704     }
1705   }
1706   {
1707     if (x1 == x4) {
1708       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x3, x2, x0);
1709       for (int i0 = 0; i0 != x0.size(); ++i0) {
1710         for (int i4 = 0; i4 != x4.size(); ++i4) {
1711           for (int i2 = 0; i2 != x2.size(); ++i2) {
1712             for (int i3 = 0; i3 != x3.size(); ++i3) {
1713               for (int i5 = 0; i5 != x5.size(); ++i5) {
1714                 odata[i5+x5.size()*(i3+x3.size()*(i2+x2.size()*(i4+x4.size()*(i4+x1.size()*(i0)))))]
1715                   += (1.0) * i0data[i5+x5.size()*(i3+x3.size()*(i2+x2.size()*(i0)))];
1716               }
1717             }
1718           }
1719         }
1720       }
1721     }
1722   }
1723   {
1724     if (x2 == x3) {
1725       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x4, x1, x0);
1726       for (int i0 = 0; i0 != x0.size(); ++i0) {
1727         for (int i1 = 0; i1 != x1.size(); ++i1) {
1728           for (int i4 = 0; i4 != x4.size(); ++i4) {
1729             for (int i3 = 0; i3 != x3.size(); ++i3) {
1730               for (int i5 = 0; i5 != x5.size(); ++i5) {
1731                 odata[i5+x5.size()*(i3+x3.size()*(i3+x2.size()*(i4+x4.size()*(i1+x1.size()*(i0)))))]
1732                   += (1.0) * i0data[i5+x5.size()*(i4+x4.size()*(i1+x1.size()*(i0)))];
1733               }
1734             }
1735           }
1736         }
1737       }
1738     }
1739   }
1740   {
1741     if (x2 == x4) {
1742       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x3, x1, x0);
1743       for (int i0 = 0; i0 != x0.size(); ++i0) {
1744         for (int i1 = 0; i1 != x1.size(); ++i1) {
1745           for (int i4 = 0; i4 != x4.size(); ++i4) {
1746             for (int i3 = 0; i3 != x3.size(); ++i3) {
1747               for (int i5 = 0; i5 != x5.size(); ++i5) {
1748                 odata[i5+x5.size()*(i3+x3.size()*(i4+x2.size()*(i4+x4.size()*(i1+x1.size()*(i0)))))]
1749                   += (-2.0) * i0data[i5+x5.size()*(i3+x3.size()*(i1+x1.size()*(i0)))];
1750               }
1751             }
1752           }
1753         }
1754       }
1755     }
1756   }
1757   {
1758     std::unique_ptr<double[]> i0data = in(2)->get_block(x5, x3, x2, x4, x1, x0);
1759     sort_indices<0,1,2,3,4,5,1,1,1,1>(i0data, odata, x5.size(), x3.size(), x2.size(), x4.size(), x1.size(), x0.size());
1760   }
1761   out()->add_block(odata, x5, x3, x2, x4, x1, x0);
1762 }
1763 
compute()1764 void Task9::Task_local::compute() {
1765   const Index x3 = b(0);
1766   const Index x2 = b(1);
1767   const Index x0 = b(2);
1768   const Index x1 = b(3);
1769   // tensor label: Gamma12
1770   std::unique_ptr<double[]> odata(new double[out()->get_size(x3, x2, x0, x1)]);
1771   std::fill_n(odata.get(), out()->get_size(x3, x2, x0, x1), 0.0);
1772   {
1773     if (x0 == x1) {
1774       std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x2);
1775       for (int i1 = 0; i1 != x1.size(); ++i1) {
1776         for (int i2 = 0; i2 != x2.size(); ++i2) {
1777           for (int i3 = 0; i3 != x3.size(); ++i3) {
1778             odata[i3+x3.size()*(i2+x2.size()*(i1+x0.size()*(i1)))]
1779               += (2.0) * i0data[i3+x3.size()*(i2)];
1780           }
1781         }
1782       }
1783     }
1784   }
1785   {
1786     if (x0 == x2) {
1787       std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x1);
1788       for (int i1 = 0; i1 != x1.size(); ++i1) {
1789         for (int i2 = 0; i2 != x2.size(); ++i2) {
1790           for (int i3 = 0; i3 != x3.size(); ++i3) {
1791             odata[i3+x3.size()*(i2+x2.size()*(i2+x0.size()*(i1)))]
1792               += (-1.0) * i0data[i3+x3.size()*(i1)];
1793           }
1794         }
1795       }
1796     }
1797   }
1798   {
1799     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x2, x0, x1);
1800     sort_indices<0,1,2,3,1,1,-1,1>(i0data, odata, x3.size(), x2.size(), x0.size(), x1.size());
1801   }
1802   out()->add_block(odata, x3, x2, x0, x1);
1803 }
1804 
compute()1805 void Task10::Task_local::compute() {
1806   const Index x0 = b(0);
1807   const Index x3 = b(1);
1808   const Index x2 = b(2);
1809   const Index x1 = b(3);
1810   // tensor label: Gamma14
1811   std::unique_ptr<double[]> odata(new double[out()->get_size(x0, x3)]);
1812   std::fill_n(odata.get(), out()->get_size(x0, x3), 0.0);
1813   // associated with merged
1814   std::unique_ptr<double[]> fdata = in(3)->get_block(x2, x1);
1815   if (x0 == x3) {
1816     std::unique_ptr<double[]> i0data = in(1)->get_block(x2, x1);
1817     for (int i1 = 0; i1 != x1.size(); ++i1) {
1818       for (int i2 = 0; i2 != x2.size(); ++i2) {
1819         for (int i3 = 0; i3 != x3.size(); ++i3) {
1820           odata[i3+x0.size()*(i3)]
1821             += (2.0) * i0data[i2+x2.size()*(i1)] * fdata[i2+x2.size()*(i1)];
1822         }
1823       }
1824     }
1825   }
1826   // rdm0 merged case
1827   if (x2 == x3 && x0 == x1) {
1828     std::unique_ptr<double[]> i0data = in(0)->get_block();
1829     for (int i3 = 0; i3 != x3.size(); ++i3) {
1830       for (int i1 = 0; i1 != x1.size(); ++i1) {
1831         odata[i1+x0.size()*(i3)]  += 2.0 * i0data[0] * fdata[i3+x2.size()*(i1)];
1832       }
1833     }
1834   }
1835   if (x0 == x1) {
1836     std::unique_ptr<double[]> i0data = in(1)->get_block(x2, x3);
1837     for (int i3 = 0; i3 != x3.size(); ++i3) {
1838       for (int i2 = 0; i2 != x2.size(); ++i2) {
1839         for (int i1 = 0; i1 != x1.size(); ++i1) {
1840           odata[i1+x0.size()*(i3)]
1841             += (-1.0) * i0data[i2+x2.size()*(i3)] * fdata[i2+x2.size()*(i1)];
1842         }
1843       }
1844     }
1845   }
1846   if (x2 == x3) {
1847     std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x1);
1848     for (int i1 = 0; i1 != x1.size(); ++i1) {
1849       for (int i0 = 0; i0 != x0.size(); ++i0) {
1850         for (int i3 = 0; i3 != x3.size(); ++i3) {
1851           odata[i0+x0.size()*(i3)]
1852             += (-1.0) * i0data[i0+x0.size()*(i1)] * fdata[i3+x2.size()*(i1)];
1853         }
1854       }
1855     }
1856   }
1857   {
1858     std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x3, x2, x1);
1859     for (int i1 = 0; i1 != x1.size(); ++i1) {
1860       for (int i2 = 0; i2 != x2.size(); ++i2) {
1861         for (int i3 = 0; i3 != x3.size(); ++i3) {
1862           for (int i0 = 0; i0 != x0.size(); ++i0) {
1863             odata[i0+x0.size()*(i3)]
1864               += (-1.0) * i0data[i0+x0.size()*(i3+x3.size()*(i2+x2.size()*(i1)))] * fdata[i2+x2.size()*(i1)];
1865           }
1866         }
1867       }
1868     }
1869   }
1870   out()->add_block(odata, x0, x3);
1871 }
1872 
compute()1873 void Task11::Task_local::compute() {
1874   const Index x0 = b(0);
1875   const Index x1 = b(1);
1876   // tensor label: Gamma16
1877   std::unique_ptr<double[]> odata(new double[out()->get_size(x0, x1)]);
1878   std::fill_n(odata.get(), out()->get_size(x0, x1), 0.0);
1879   {
1880     // rdm0 non-merged case
1881     if (x0 == x1) {
1882       std::unique_ptr<double[]> i0data = in(0)->get_block();
1883       for (int i1 = 0; i1 != x1.size(); ++i1) {
1884         odata[i1+x0.size()*(i1)]  += 2.0 * i0data[0];
1885       }
1886     }
1887   }
1888   {
1889     std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x1);
1890     sort_indices<0,1,1,1,-1,1>(i0data, odata, x0.size(), x1.size());
1891   }
1892   out()->add_block(odata, x0, x1);
1893 }
1894 
compute()1895 void Task12::Task_local::compute() {
1896   const Index x3 = b(0);
1897   const Index x1 = b(1);
1898   const Index x0 = b(2);
1899   const Index x2 = b(3);
1900   // tensor label: Gamma22
1901   std::unique_ptr<double[]> odata(new double[out()->get_size(x3, x1, x0, x2)]);
1902   std::fill_n(odata.get(), out()->get_size(x3, x1, x0, x2), 0.0);
1903   {
1904     if (x0 == x1) {
1905       std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x2);
1906       for (int i2 = 0; i2 != x2.size(); ++i2) {
1907         for (int i1 = 0; i1 != x1.size(); ++i1) {
1908           for (int i3 = 0; i3 != x3.size(); ++i3) {
1909             odata[i3+x3.size()*(i1+x1.size()*(i1+x0.size()*(i2)))]
1910               += (1.0) * i0data[i3+x3.size()*(i2)];
1911           }
1912         }
1913       }
1914     }
1915   }
1916   {
1917     if (x0 == x2) {
1918       std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x1);
1919       for (int i2 = 0; i2 != x2.size(); ++i2) {
1920         for (int i1 = 0; i1 != x1.size(); ++i1) {
1921           for (int i3 = 0; i3 != x3.size(); ++i3) {
1922             odata[i3+x3.size()*(i1+x1.size()*(i2+x0.size()*(i2)))]
1923               += (-2.0) * i0data[i3+x3.size()*(i1)];
1924           }
1925         }
1926       }
1927     }
1928   }
1929   {
1930     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x1, x0, x2);
1931     sort_indices<0,1,2,3,1,1,1,1>(i0data, odata, x3.size(), x1.size(), x0.size(), x2.size());
1932   }
1933   out()->add_block(odata, x3, x1, x0, x2);
1934 }
1935 
compute()1936 void Task13::Task_local::compute() {
1937   const Index x5 = b(0);
1938   const Index x4 = b(1);
1939   const Index x1 = b(2);
1940   const Index x3 = b(3);
1941   const Index x2 = b(4);
1942   const Index x0 = b(5);
1943   // tensor label: Gamma28
1944   std::unique_ptr<double[]> odata(new double[out()->get_size(x5, x4, x1, x3, x2, x0)]);
1945   std::fill_n(odata.get(), out()->get_size(x5, x4, x1, x3, x2, x0), 0.0);
1946   {
1947     if (x2 == x4 && x1 == x3) {
1948       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0);
1949       for (int i0 = 0; i0 != x0.size(); ++i0) {
1950         for (int i3 = 0; i3 != x3.size(); ++i3) {
1951           for (int i4 = 0; i4 != x4.size(); ++i4) {
1952             for (int i5 = 0; i5 != x5.size(); ++i5) {
1953               odata[i5+x5.size()*(i4+x4.size()*(i3+x1.size()*(i3+x3.size()*(i4+x2.size()*(i0)))))]
1954                 += (-2.0) * i0data[i5+x5.size()*(i0)];
1955             }
1956           }
1957         }
1958       }
1959     }
1960   }
1961   {
1962     if (x1 == x3) {
1963       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x4, x2, x0);
1964       for (int i0 = 0; i0 != x0.size(); ++i0) {
1965         for (int i2 = 0; i2 != x2.size(); ++i2) {
1966           for (int i3 = 0; i3 != x3.size(); ++i3) {
1967             for (int i4 = 0; i4 != x4.size(); ++i4) {
1968               for (int i5 = 0; i5 != x5.size(); ++i5) {
1969                 odata[i5+x5.size()*(i4+x4.size()*(i3+x1.size()*(i3+x3.size()*(i2+x2.size()*(i0)))))]
1970                   += (-2.0) * i0data[i5+x5.size()*(i4+x4.size()*(i2+x2.size()*(i0)))];
1971               }
1972             }
1973           }
1974         }
1975       }
1976     }
1977   }
1978   {
1979     if (x2 == x3 && x1 == x4) {
1980       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0);
1981       for (int i0 = 0; i0 != x0.size(); ++i0) {
1982         for (int i3 = 0; i3 != x3.size(); ++i3) {
1983           for (int i4 = 0; i4 != x4.size(); ++i4) {
1984             for (int i5 = 0; i5 != x5.size(); ++i5) {
1985               odata[i5+x5.size()*(i4+x4.size()*(i4+x1.size()*(i3+x3.size()*(i3+x2.size()*(i0)))))]
1986                 += (1.0) * i0data[i5+x5.size()*(i0)];
1987             }
1988           }
1989         }
1990       }
1991     }
1992   }
1993   {
1994     if (x1 == x4) {
1995       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x3, x2, x0);
1996       for (int i0 = 0; i0 != x0.size(); ++i0) {
1997         for (int i2 = 0; i2 != x2.size(); ++i2) {
1998           for (int i3 = 0; i3 != x3.size(); ++i3) {
1999             for (int i4 = 0; i4 != x4.size(); ++i4) {
2000               for (int i5 = 0; i5 != x5.size(); ++i5) {
2001                 odata[i5+x5.size()*(i4+x4.size()*(i4+x1.size()*(i3+x3.size()*(i2+x2.size()*(i0)))))]
2002                   += (1.0) * i0data[i5+x5.size()*(i3+x3.size()*(i2+x2.size()*(i0)))];
2003               }
2004             }
2005           }
2006         }
2007       }
2008     }
2009   }
2010   {
2011     if (x2 == x3) {
2012       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x4, x1, x0);
2013       for (int i0 = 0; i0 != x0.size(); ++i0) {
2014         for (int i3 = 0; i3 != x3.size(); ++i3) {
2015           for (int i1 = 0; i1 != x1.size(); ++i1) {
2016             for (int i4 = 0; i4 != x4.size(); ++i4) {
2017               for (int i5 = 0; i5 != x5.size(); ++i5) {
2018                 odata[i5+x5.size()*(i4+x4.size()*(i1+x1.size()*(i3+x3.size()*(i3+x2.size()*(i0)))))]
2019                   += (1.0) * i0data[i5+x5.size()*(i4+x4.size()*(i1+x1.size()*(i0)))];
2020               }
2021             }
2022           }
2023         }
2024       }
2025     }
2026   }
2027   {
2028     if (x2 == x4) {
2029       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x0, x1, x3);
2030       for (int i0 = 0; i0 != x0.size(); ++i0) {
2031         for (int i3 = 0; i3 != x3.size(); ++i3) {
2032           for (int i1 = 0; i1 != x1.size(); ++i1) {
2033             for (int i4 = 0; i4 != x4.size(); ++i4) {
2034               for (int i5 = 0; i5 != x5.size(); ++i5) {
2035                 odata[i5+x5.size()*(i4+x4.size()*(i1+x1.size()*(i3+x3.size()*(i4+x2.size()*(i0)))))]
2036                   += (1.0) * i0data[i5+x5.size()*(i0+x0.size()*(i1+x1.size()*(i3)))];
2037               }
2038             }
2039           }
2040         }
2041       }
2042     }
2043   }
2044   {
2045     std::unique_ptr<double[]> i0data = in(2)->get_block(x5, x4, x1, x3, x2, x0);
2046     sort_indices<0,1,2,3,4,5,1,1,1,1>(i0data, odata, x5.size(), x4.size(), x1.size(), x3.size(), x2.size(), x0.size());
2047   }
2048   out()->add_block(odata, x5, x4, x1, x3, x2, x0);
2049 }
2050 
compute()2051 void Task14::Task_local::compute() {
2052   const Index x1 = b(0);
2053   const Index x3 = b(1);
2054   const Index x2 = b(2);
2055   const Index x0 = b(3);
2056   // tensor label: Gamma29
2057   std::unique_ptr<double[]> odata(new double[out()->get_size(x1, x3, x2, x0)]);
2058   std::fill_n(odata.get(), out()->get_size(x1, x3, x2, x0), 0.0);
2059   {
2060     if (x1 == x3) {
2061       std::unique_ptr<double[]> i0data = in(0)->get_block(x2, x0);
2062       for (int i0 = 0; i0 != x0.size(); ++i0) {
2063         for (int i2 = 0; i2 != x2.size(); ++i2) {
2064           for (int i3 = 0; i3 != x3.size(); ++i3) {
2065             odata[i3+x1.size()*(i3+x3.size()*(i2+x2.size()*(i0)))]
2066               += (-2.0) * i0data[i2+x2.size()*(i0)];
2067           }
2068         }
2069       }
2070     }
2071   }
2072   {
2073     if (x2 == x3) {
2074       std::unique_ptr<double[]> i0data = in(0)->get_block(x1, x0);
2075       for (int i0 = 0; i0 != x0.size(); ++i0) {
2076         for (int i3 = 0; i3 != x3.size(); ++i3) {
2077           for (int i1 = 0; i1 != x1.size(); ++i1) {
2078             odata[i1+x1.size()*(i3+x3.size()*(i3+x2.size()*(i0)))]
2079               += (1.0) * i0data[i1+x1.size()*(i0)];
2080           }
2081         }
2082       }
2083     }
2084   }
2085   {
2086     std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x3, x2, x0);
2087     sort_indices<0,1,2,3,1,1,1,1>(i0data, odata, x1.size(), x3.size(), x2.size(), x0.size());
2088   }
2089   out()->add_block(odata, x1, x3, x2, x0);
2090 }
2091 
compute()2092 void Task15::Task_local::compute() {
2093   const Index x5 = b(0);
2094   const Index x0 = b(1);
2095   const Index x1 = b(2);
2096   const Index x4 = b(3);
2097   const Index x3 = b(4);
2098   const Index x2 = b(5);
2099   // tensor label: Gamma31
2100   std::unique_ptr<double[]> odata(new double[out()->get_size(x5, x0, x1, x4)]);
2101   std::fill_n(odata.get(), out()->get_size(x5, x0, x1, x4), 0.0);
2102   // associated with merged
2103   std::unique_ptr<double[]> fdata = in(3)->get_block(x3, x2);
2104   if (x1 == x4) {
2105     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x0, x3, x2);
2106     for (int i2 = 0; i2 != x2.size(); ++i2) {
2107       for (int i3 = 0; i3 != x3.size(); ++i3) {
2108         for (int i0 = 0; i0 != x0.size(); ++i0) {
2109           for (int i5 = 0; i5 != x5.size(); ++i5) {
2110             for (int i4 = 0; i4 != x4.size(); ++i4) {
2111               odata[i5+x5.size()*(i0+x0.size()*(i4+x1.size()*(i4)))]
2112                 += (2.0) * i0data[i5+x5.size()*(i0+x0.size()*(i3+x3.size()*(i2)))] * fdata[i3+x3.size()*(i2)];
2113             }
2114           }
2115         }
2116       }
2117     }
2118   }
2119   if (x3 == x4 && x1 == x2) {
2120     std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0);
2121     for (int i0 = 0; i0 != x0.size(); ++i0) {
2122       for (int i5 = 0; i5 != x5.size(); ++i5) {
2123         for (int i4 = 0; i4 != x4.size(); ++i4) {
2124           for (int i2 = 0; i2 != x2.size(); ++i2) {
2125             odata[i5+x5.size()*(i0+x0.size()*(i2+x1.size()*(i4)))]
2126               += (2.0) * i0data[i5+x5.size()*(i0)] * fdata[i4+x3.size()*(i2)];
2127           }
2128         }
2129       }
2130     }
2131   }
2132   if (x1 == x2) {
2133     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x0, x3, x4);
2134     for (int i4 = 0; i4 != x4.size(); ++i4) {
2135       for (int i3 = 0; i3 != x3.size(); ++i3) {
2136         for (int i0 = 0; i0 != x0.size(); ++i0) {
2137           for (int i5 = 0; i5 != x5.size(); ++i5) {
2138             for (int i2 = 0; i2 != x2.size(); ++i2) {
2139               odata[i5+x5.size()*(i0+x0.size()*(i2+x1.size()*(i4)))]
2140                 += (-1.0) * i0data[i5+x5.size()*(i0+x0.size()*(i3+x3.size()*(i4)))] * fdata[i3+x3.size()*(i2)];
2141             }
2142           }
2143         }
2144       }
2145     }
2146   }
2147   if (x3 == x4) {
2148     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x0, x1, x2);
2149     for (int i2 = 0; i2 != x2.size(); ++i2) {
2150       for (int i1 = 0; i1 != x1.size(); ++i1) {
2151         for (int i0 = 0; i0 != x0.size(); ++i0) {
2152           for (int i5 = 0; i5 != x5.size(); ++i5) {
2153             for (int i4 = 0; i4 != x4.size(); ++i4) {
2154               odata[i5+x5.size()*(i0+x0.size()*(i1+x1.size()*(i4)))]
2155                 += (-1.0) * i0data[i5+x5.size()*(i0+x0.size()*(i1+x1.size()*(i2)))] * fdata[i4+x3.size()*(i2)];
2156             }
2157           }
2158         }
2159       }
2160     }
2161   }
2162   {
2163     std::unique_ptr<double[]> i0data = in(2)->get_block(x5, x0, x1, x4, x3, x2);
2164     for (int i2 = 0; i2 != x2.size(); ++i2) {
2165       for (int i3 = 0; i3 != x3.size(); ++i3) {
2166         for (int i4 = 0; i4 != x4.size(); ++i4) {
2167           for (int i1 = 0; i1 != x1.size(); ++i1) {
2168             for (int i0 = 0; i0 != x0.size(); ++i0) {
2169               for (int i5 = 0; i5 != x5.size(); ++i5) {
2170                 odata[i5+x5.size()*(i0+x0.size()*(i1+x1.size()*(i4)))]
2171                   += (-1.0) * i0data[i5+x5.size()*(i0+x0.size()*(i1+x1.size()*(i4+x4.size()*(i3+x3.size()*(i2)))))] * fdata[i3+x3.size()*(i2)];
2172               }
2173             }
2174           }
2175         }
2176       }
2177     }
2178   }
2179   out()->add_block(odata, x5, x0, x1, x4);
2180 }
2181 
compute()2182 void Task16::Task_local::compute() {
2183   const Index x3 = b(0);
2184   const Index x0 = b(1);
2185   const Index x1 = b(2);
2186   const Index x2 = b(3);
2187   // tensor label: Gamma32
2188   std::unique_ptr<double[]> odata(new double[out()->get_size(x3, x0, x1, x2)]);
2189   std::fill_n(odata.get(), out()->get_size(x3, x0, x1, x2), 0.0);
2190   {
2191     if (x1 == x2) {
2192       std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x0);
2193       for (int i2 = 0; i2 != x2.size(); ++i2) {
2194         for (int i0 = 0; i0 != x0.size(); ++i0) {
2195           for (int i3 = 0; i3 != x3.size(); ++i3) {
2196             odata[i3+x3.size()*(i0+x0.size()*(i2+x1.size()*(i2)))]
2197               += (2.0) * i0data[i3+x3.size()*(i0)];
2198           }
2199         }
2200       }
2201     }
2202   }
2203   {
2204     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x0, x1, x2);
2205     sort_indices<0,1,2,3,1,1,-1,1>(i0data, odata, x3.size(), x0.size(), x1.size(), x2.size());
2206   }
2207   out()->add_block(odata, x3, x0, x1, x2);
2208 }
2209 
compute()2210 void Task17::Task_local::compute() {
2211   const Index x3 = b(0);
2212   const Index x2 = b(1);
2213   const Index x1 = b(2);
2214   const Index x0 = b(3);
2215   // tensor label: Gamma35
2216   std::unique_ptr<double[]> odata(new double[out()->get_size(x3, x2, x1, x0)]);
2217   std::fill_n(odata.get(), out()->get_size(x3, x2, x1, x0), 0.0);
2218   {
2219     if (x1 == x2) {
2220       std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x0);
2221       for (int i0 = 0; i0 != x0.size(); ++i0) {
2222         for (int i2 = 0; i2 != x2.size(); ++i2) {
2223           for (int i3 = 0; i3 != x3.size(); ++i3) {
2224             odata[i3+x3.size()*(i2+x2.size()*(i2+x1.size()*(i0)))]
2225               += (1.0) * i0data[i3+x3.size()*(i0)];
2226           }
2227         }
2228       }
2229     }
2230   }
2231   {
2232     std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x2, x1, x0);
2233     sort_indices<0,1,2,3,1,1,1,1>(i0data, odata, x3.size(), x2.size(), x1.size(), x0.size());
2234   }
2235   out()->add_block(odata, x3, x2, x1, x0);
2236 }
2237 
compute()2238 void Task18::Task_local::compute() {
2239   const Index x5 = b(0);
2240   const Index x4 = b(1);
2241   const Index x1 = b(2);
2242   const Index x0 = b(3);
2243   const Index x3 = b(4);
2244   const Index x2 = b(5);
2245   // tensor label: Gamma34
2246   std::unique_ptr<double[]> odata(new double[out()->get_size(x5, x4, x1, x0)]);
2247   std::fill_n(odata.get(), out()->get_size(x5, x4, x1, x0), 0.0);
2248   // associated with merged
2249   std::unique_ptr<double[]> fdata = in(3)->get_block(x3, x2);
2250   if (x1 == x4) {
2251     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x0, x3, x2);
2252     for (int i2 = 0; i2 != x2.size(); ++i2) {
2253       for (int i3 = 0; i3 != x3.size(); ++i3) {
2254         for (int i0 = 0; i0 != x0.size(); ++i0) {
2255           for (int i5 = 0; i5 != x5.size(); ++i5) {
2256             for (int i4 = 0; i4 != x4.size(); ++i4) {
2257               odata[i5+x5.size()*(i4+x4.size()*(i4+x1.size()*(i0)))]
2258                 += (1.0) * i0data[i5+x5.size()*(i0+x0.size()*(i3+x3.size()*(i2)))] * fdata[i3+x3.size()*(i2)];
2259             }
2260           }
2261         }
2262       }
2263     }
2264   }
2265   if (x3 == x4 && x1 == x2) {
2266     std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0);
2267     for (int i0 = 0; i0 != x0.size(); ++i0) {
2268       for (int i5 = 0; i5 != x5.size(); ++i5) {
2269         for (int i4 = 0; i4 != x4.size(); ++i4) {
2270           for (int i2 = 0; i2 != x2.size(); ++i2) {
2271             odata[i5+x5.size()*(i4+x4.size()*(i2+x1.size()*(i0)))]
2272               += (1.0) * i0data[i5+x5.size()*(i0)] * fdata[i4+x3.size()*(i2)];
2273           }
2274         }
2275       }
2276     }
2277   }
2278   if (x1 == x2) {
2279     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x4, x3, x0);
2280     for (int i0 = 0; i0 != x0.size(); ++i0) {
2281       for (int i3 = 0; i3 != x3.size(); ++i3) {
2282         for (int i4 = 0; i4 != x4.size(); ++i4) {
2283           for (int i5 = 0; i5 != x5.size(); ++i5) {
2284             for (int i2 = 0; i2 != x2.size(); ++i2) {
2285               odata[i5+x5.size()*(i4+x4.size()*(i2+x1.size()*(i0)))]
2286                 += (1.0) * i0data[i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i0)))] * fdata[i3+x3.size()*(i2)];
2287             }
2288           }
2289         }
2290       }
2291     }
2292   }
2293   if (x3 == x4) {
2294     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x2, x1, x0);
2295     for (int i0 = 0; i0 != x0.size(); ++i0) {
2296       for (int i1 = 0; i1 != x1.size(); ++i1) {
2297         for (int i2 = 0; i2 != x2.size(); ++i2) {
2298           for (int i5 = 0; i5 != x5.size(); ++i5) {
2299             for (int i4 = 0; i4 != x4.size(); ++i4) {
2300               odata[i5+x5.size()*(i4+x4.size()*(i1+x1.size()*(i0)))]
2301                 += (1.0) * i0data[i5+x5.size()*(i2+x2.size()*(i1+x1.size()*(i0)))] * fdata[i4+x3.size()*(i2)];
2302             }
2303           }
2304         }
2305       }
2306     }
2307   }
2308   {
2309     std::unique_ptr<double[]> i0data = in(2)->get_block(x5, x4, x3, x2, x1, x0);
2310     for (int i0 = 0; i0 != x0.size(); ++i0) {
2311       for (int i1 = 0; i1 != x1.size(); ++i1) {
2312         for (int i2 = 0; i2 != x2.size(); ++i2) {
2313           for (int i3 = 0; i3 != x3.size(); ++i3) {
2314             for (int i4 = 0; i4 != x4.size(); ++i4) {
2315               for (int i5 = 0; i5 != x5.size(); ++i5) {
2316                 odata[i5+x5.size()*(i4+x4.size()*(i1+x1.size()*(i0)))]
2317                   += (1.0) * i0data[i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2+x2.size()*(i1+x1.size()*(i0)))))] * fdata[i3+x3.size()*(i2)];
2318               }
2319             }
2320           }
2321         }
2322       }
2323     }
2324   }
2325   out()->add_block(odata, x5, x4, x1, x0);
2326 }
2327 
compute()2328 void Task19::Task_local::compute() {
2329   const Index x5 = b(0);
2330   const Index x0 = b(1);
2331   const Index x4 = b(2);
2332   const Index x3 = b(3);
2333   const Index x1 = b(4);
2334   const Index x2 = b(5);
2335   // tensor label: Gamma37
2336   std::unique_ptr<double[]> odata(new double[out()->get_size(x5, x0, x4, x3, x1, x2)]);
2337   std::fill_n(odata.get(), out()->get_size(x5, x0, x4, x3, x1, x2), 0.0);
2338   {
2339     if (x1 == x2) {
2340       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0, x4, x3);
2341       for (int i2 = 0; i2 != x2.size(); ++i2) {
2342         for (int i3 = 0; i3 != x3.size(); ++i3) {
2343           for (int i4 = 0; i4 != x4.size(); ++i4) {
2344             for (int i0 = 0; i0 != x0.size(); ++i0) {
2345               for (int i5 = 0; i5 != x5.size(); ++i5) {
2346                 odata[i5+x5.size()*(i0+x0.size()*(i4+x4.size()*(i3+x3.size()*(i2+x1.size()*(i2)))))]
2347                   += (2.0) * i0data[i5+x5.size()*(i0+x0.size()*(i4+x4.size()*(i3)))];
2348               }
2349             }
2350           }
2351         }
2352       }
2353     }
2354   }
2355   {
2356     if (x1 == x3) {
2357       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0, x4, x2);
2358       for (int i2 = 0; i2 != x2.size(); ++i2) {
2359         for (int i3 = 0; i3 != x3.size(); ++i3) {
2360           for (int i4 = 0; i4 != x4.size(); ++i4) {
2361             for (int i0 = 0; i0 != x0.size(); ++i0) {
2362               for (int i5 = 0; i5 != x5.size(); ++i5) {
2363                 odata[i5+x5.size()*(i0+x0.size()*(i4+x4.size()*(i3+x3.size()*(i3+x1.size()*(i2)))))]
2364                   += (-1.0) * i0data[i5+x5.size()*(i0+x0.size()*(i4+x4.size()*(i2)))];
2365               }
2366             }
2367           }
2368         }
2369       }
2370     }
2371   }
2372   {
2373     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x0, x4, x3, x1, x2);
2374     sort_indices<0,1,2,3,4,5,1,1,-1,1>(i0data, odata, x5.size(), x0.size(), x4.size(), x3.size(), x1.size(), x2.size());
2375   }
2376   out()->add_block(odata, x5, x0, x4, x3, x1, x2);
2377 }
2378 
compute()2379 void Task20::Task_local::compute() {
2380   const Index x1 = b(0);
2381   const Index x0 = b(1);
2382   // tensor label: Gamma38
2383   std::unique_ptr<double[]> odata(new double[out()->get_size(x1, x0)]);
2384   std::fill_n(odata.get(), out()->get_size(x1, x0), 0.0);
2385   {
2386     std::unique_ptr<double[]> i0data = in(0)->get_block(x1, x0);
2387     sort_indices<0,1,1,1,1,1>(i0data, odata, x1.size(), x0.size());
2388   }
2389   out()->add_block(odata, x1, x0);
2390 }
2391 
compute()2392 void Task21::Task_local::compute() {
2393   const Index x5 = b(0);
2394   const Index x2 = b(1);
2395   const Index x4 = b(2);
2396   const Index x3 = b(3);
2397   const Index x1 = b(4);
2398   const Index x0 = b(5);
2399   // tensor label: Gamma51
2400   std::unique_ptr<double[]> odata(new double[out()->get_size(x5, x2, x4, x3, x1, x0)]);
2401   std::fill_n(odata.get(), out()->get_size(x5, x2, x4, x3, x1, x0), 0.0);
2402   {
2403     if (x1 == x2) {
2404       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0, x4, x3);
2405       for (int i0 = 0; i0 != x0.size(); ++i0) {
2406         for (int i3 = 0; i3 != x3.size(); ++i3) {
2407           for (int i4 = 0; i4 != x4.size(); ++i4) {
2408             for (int i2 = 0; i2 != x2.size(); ++i2) {
2409               for (int i5 = 0; i5 != x5.size(); ++i5) {
2410                 odata[i5+x5.size()*(i2+x2.size()*(i4+x4.size()*(i3+x3.size()*(i2+x1.size()*(i0)))))]
2411                   += (1.0) * i0data[i5+x5.size()*(i0+x0.size()*(i4+x4.size()*(i3)))];
2412               }
2413             }
2414           }
2415         }
2416       }
2417     }
2418   }
2419   {
2420     if (x1 == x3) {
2421       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x2, x4, x0);
2422       for (int i0 = 0; i0 != x0.size(); ++i0) {
2423         for (int i3 = 0; i3 != x3.size(); ++i3) {
2424           for (int i4 = 0; i4 != x4.size(); ++i4) {
2425             for (int i2 = 0; i2 != x2.size(); ++i2) {
2426               for (int i5 = 0; i5 != x5.size(); ++i5) {
2427                 odata[i5+x5.size()*(i2+x2.size()*(i4+x4.size()*(i3+x3.size()*(i3+x1.size()*(i0)))))]
2428                   += (1.0) * i0data[i5+x5.size()*(i2+x2.size()*(i4+x4.size()*(i0)))];
2429               }
2430             }
2431           }
2432         }
2433       }
2434     }
2435   }
2436   {
2437     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x2, x4, x3, x1, x0);
2438     sort_indices<0,1,2,3,4,5,1,1,1,1>(i0data, odata, x5.size(), x2.size(), x4.size(), x3.size(), x1.size(), x0.size());
2439   }
2440   out()->add_block(odata, x5, x2, x4, x3, x1, x0);
2441 }
2442 
compute()2443 void Task22::Task_local::compute() {
2444   const Index x5 = b(0);
2445   const Index x0 = b(1);
2446   const Index x3 = b(2);
2447   const Index x4 = b(3);
2448   const Index x2 = b(4);
2449   const Index x1 = b(5);
2450   // tensor label: Gamma56
2451   std::unique_ptr<double[]> odata(new double[out()->get_size(x5, x0, x3, x4, x2, x1)]);
2452   std::fill_n(odata.get(), out()->get_size(x5, x0, x3, x4, x2, x1), 0.0);
2453   {
2454     if (x2 == x4) {
2455       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0, x3, x1);
2456       for (int i1 = 0; i1 != x1.size(); ++i1) {
2457         for (int i4 = 0; i4 != x4.size(); ++i4) {
2458           for (int i3 = 0; i3 != x3.size(); ++i3) {
2459             for (int i0 = 0; i0 != x0.size(); ++i0) {
2460               for (int i5 = 0; i5 != x5.size(); ++i5) {
2461                 odata[i5+x5.size()*(i0+x0.size()*(i3+x3.size()*(i4+x4.size()*(i4+x2.size()*(i1)))))]
2462                   += (-1.0) * i0data[i5+x5.size()*(i0+x0.size()*(i3+x3.size()*(i1)))];
2463               }
2464             }
2465           }
2466         }
2467       }
2468     }
2469   }
2470   {
2471     if (x3 == x4) {
2472       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0, x2, x1);
2473       for (int i1 = 0; i1 != x1.size(); ++i1) {
2474         for (int i2 = 0; i2 != x2.size(); ++i2) {
2475           for (int i4 = 0; i4 != x4.size(); ++i4) {
2476             for (int i0 = 0; i0 != x0.size(); ++i0) {
2477               for (int i5 = 0; i5 != x5.size(); ++i5) {
2478                 odata[i5+x5.size()*(i0+x0.size()*(i4+x3.size()*(i4+x4.size()*(i2+x2.size()*(i1)))))]
2479                   += (2.0) * i0data[i5+x5.size()*(i0+x0.size()*(i2+x2.size()*(i1)))];
2480               }
2481             }
2482           }
2483         }
2484       }
2485     }
2486   }
2487   {
2488     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x0, x3, x4, x2, x1);
2489     sort_indices<0,1,2,3,4,5,1,1,-1,1>(i0data, odata, x5.size(), x0.size(), x3.size(), x4.size(), x2.size(), x1.size());
2490   }
2491   out()->add_block(odata, x5, x0, x3, x4, x2, x1);
2492 }
2493 
compute()2494 void Task23::Task_local::compute() {
2495   const Index x5 = b(0);
2496   const Index x4 = b(1);
2497   const Index x3 = b(2);
2498   const Index x0 = b(3);
2499   const Index x2 = b(4);
2500   const Index x1 = b(5);
2501   // tensor label: Gamma57
2502   std::unique_ptr<double[]> odata(new double[out()->get_size(x5, x4, x3, x0, x2, x1)]);
2503   std::fill_n(odata.get(), out()->get_size(x5, x4, x3, x0, x2, x1), 0.0);
2504   {
2505     if (x2 == x4) {
2506       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x1, x3, x0);
2507       for (int i1 = 0; i1 != x1.size(); ++i1) {
2508         for (int i0 = 0; i0 != x0.size(); ++i0) {
2509           for (int i3 = 0; i3 != x3.size(); ++i3) {
2510             for (int i4 = 0; i4 != x4.size(); ++i4) {
2511               for (int i5 = 0; i5 != x5.size(); ++i5) {
2512                 odata[i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i0+x0.size()*(i4+x2.size()*(i1)))))]
2513                   += (1.0) * i0data[i5+x5.size()*(i1+x1.size()*(i3+x3.size()*(i0)))];
2514               }
2515             }
2516           }
2517         }
2518       }
2519     }
2520   }
2521   {
2522     if (x3 == x4) {
2523       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0, x2, x1);
2524       for (int i1 = 0; i1 != x1.size(); ++i1) {
2525         for (int i2 = 0; i2 != x2.size(); ++i2) {
2526           for (int i0 = 0; i0 != x0.size(); ++i0) {
2527             for (int i4 = 0; i4 != x4.size(); ++i4) {
2528               for (int i5 = 0; i5 != x5.size(); ++i5) {
2529                 odata[i5+x5.size()*(i4+x4.size()*(i4+x3.size()*(i0+x0.size()*(i2+x2.size()*(i1)))))]
2530                   += (1.0) * i0data[i5+x5.size()*(i0+x0.size()*(i2+x2.size()*(i1)))];
2531               }
2532             }
2533           }
2534         }
2535       }
2536     }
2537   }
2538   {
2539     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x4, x3, x0, x2, x1);
2540     sort_indices<0,1,2,3,4,5,1,1,1,1>(i0data, odata, x5.size(), x4.size(), x3.size(), x0.size(), x2.size(), x1.size());
2541   }
2542   out()->add_block(odata, x5, x4, x3, x0, x2, x1);
2543 }
2544 
compute()2545 void Task24::Task_local::compute() {
2546   const Index x7 = b(0);
2547   const Index x0 = b(1);
2548   const Index x6 = b(2);
2549   const Index x5 = b(3);
2550   const Index x2 = b(4);
2551   const Index x1 = b(5);
2552   const Index x4 = b(6);
2553   const Index x3 = b(7);
2554   // tensor label: Gamma58
2555   std::unique_ptr<double[]> odata(new double[out()->get_size(x7, x0, x6, x5, x2, x1)]);
2556   std::fill_n(odata.get(), out()->get_size(x7, x0, x6, x5, x2, x1), 0.0);
2557   // associated with merged
2558   std::unique_ptr<double[]> fdata = in(3)->get_block(x4, x3);
2559   if (x2 == x5) {
2560     std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x0, x6, x1, x4, x3);
2561     for (int i3 = 0; i3 != x3.size(); ++i3) {
2562       for (int i4 = 0; i4 != x4.size(); ++i4) {
2563         for (int i1 = 0; i1 != x1.size(); ++i1) {
2564           for (int i6 = 0; i6 != x6.size(); ++i6) {
2565             for (int i0 = 0; i0 != x0.size(); ++i0) {
2566               for (int i7 = 0; i7 != x7.size(); ++i7) {
2567                 for (int i5 = 0; i5 != x5.size(); ++i5) {
2568                   odata[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i5+x5.size()*(i5+x2.size()*(i1)))))]
2569                     += (1.0) * i0data[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i1+x1.size()*(i4+x4.size()*(i3)))))] * fdata[i4+x4.size()*(i3)];
2570                 }
2571               }
2572             }
2573           }
2574         }
2575       }
2576     }
2577   }
2578   if (x4 == x5 && x2 == x3) {
2579     std::unique_ptr<double[]> i0data = in(0)->get_block(x7, x0, x6, x1);
2580     for (int i1 = 0; i1 != x1.size(); ++i1) {
2581       for (int i6 = 0; i6 != x6.size(); ++i6) {
2582         for (int i0 = 0; i0 != x0.size(); ++i0) {
2583           for (int i7 = 0; i7 != x7.size(); ++i7) {
2584             for (int i5 = 0; i5 != x5.size(); ++i5) {
2585               for (int i3 = 0; i3 != x3.size(); ++i3) {
2586                 odata[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i5+x5.size()*(i3+x2.size()*(i1)))))]
2587                   += (1.0) * i0data[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i1)))] * fdata[i5+x4.size()*(i3)];
2588               }
2589             }
2590           }
2591         }
2592       }
2593     }
2594   }
2595   if (x2 == x3) {
2596     std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x0, x6, x5, x4, x1);
2597     for (int i1 = 0; i1 != x1.size(); ++i1) {
2598       for (int i4 = 0; i4 != x4.size(); ++i4) {
2599         for (int i5 = 0; i5 != x5.size(); ++i5) {
2600           for (int i6 = 0; i6 != x6.size(); ++i6) {
2601             for (int i0 = 0; i0 != x0.size(); ++i0) {
2602               for (int i7 = 0; i7 != x7.size(); ++i7) {
2603                 for (int i3 = 0; i3 != x3.size(); ++i3) {
2604                   odata[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i5+x5.size()*(i3+x2.size()*(i1)))))]
2605                     += (1.0) * i0data[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i5+x5.size()*(i4+x4.size()*(i1)))))] * fdata[i4+x4.size()*(i3)];
2606                 }
2607               }
2608             }
2609           }
2610         }
2611       }
2612     }
2613   }
2614   if (x4 == x5) {
2615     std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x0, x6, x3, x2, x1);
2616     for (int i1 = 0; i1 != x1.size(); ++i1) {
2617       for (int i2 = 0; i2 != x2.size(); ++i2) {
2618         for (int i3 = 0; i3 != x3.size(); ++i3) {
2619           for (int i6 = 0; i6 != x6.size(); ++i6) {
2620             for (int i0 = 0; i0 != x0.size(); ++i0) {
2621               for (int i7 = 0; i7 != x7.size(); ++i7) {
2622                 for (int i5 = 0; i5 != x5.size(); ++i5) {
2623                   odata[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i5+x5.size()*(i2+x2.size()*(i1)))))]
2624                     += (1.0) * i0data[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i3+x3.size()*(i2+x2.size()*(i1)))))] * fdata[i5+x4.size()*(i3)];
2625                 }
2626               }
2627             }
2628           }
2629         }
2630       }
2631     }
2632   }
2633   {
2634     std::unique_ptr<double[]> i0data = in(2)->get_block(x7, x0, x6, x5, x2, x1);
2635     for (int i1 = 0; i1 != x1.size(); ++i1) {
2636       for (int i2 = 0; i2 != x2.size(); ++i2) {
2637         for (int i5 = 0; i5 != x5.size(); ++i5) {
2638           for (int i6 = 0; i6 != x6.size(); ++i6) {
2639             for (int i0 = 0; i0 != x0.size(); ++i0) {
2640               for (int i7 = 0; i7 != x7.size(); ++i7) {
2641                 odata[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i5+x5.size()*(i2+x2.size()*(i1)))))]
2642                   += (1.0) * i0data[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i5+x5.size()*(i2+x2.size()*(i1)))))];
2643               }
2644             }
2645           }
2646         }
2647       }
2648     }
2649   }
2650   out()->add_block(odata, x7, x0, x6, x5, x2, x1);
2651 }
2652 
compute()2653 void Task25::Task_local::compute() {
2654   const Index x5 = b(0);
2655   const Index x0 = b(1);
2656   const Index x4 = b(2);
2657   const Index x3 = b(3);
2658   const Index x2 = b(4);
2659   const Index x1 = b(5);
2660   // tensor label: Gamma59
2661   std::unique_ptr<double[]> odata(new double[out()->get_size(x5, x0, x4, x3, x2, x1)]);
2662   std::fill_n(odata.get(), out()->get_size(x5, x0, x4, x3, x2, x1), 0.0);
2663   {
2664     if (x2 == x3) {
2665       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0, x4, x1);
2666       for (int i1 = 0; i1 != x1.size(); ++i1) {
2667         for (int i3 = 0; i3 != x3.size(); ++i3) {
2668           for (int i4 = 0; i4 != x4.size(); ++i4) {
2669             for (int i0 = 0; i0 != x0.size(); ++i0) {
2670               for (int i5 = 0; i5 != x5.size(); ++i5) {
2671                 odata[i5+x5.size()*(i0+x0.size()*(i4+x4.size()*(i3+x3.size()*(i3+x2.size()*(i1)))))]
2672                   += (1.0) * i0data[i5+x5.size()*(i0+x0.size()*(i4+x4.size()*(i1)))];
2673               }
2674             }
2675           }
2676         }
2677       }
2678     }
2679   }
2680   {
2681     std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x0, x4, x3, x2, x1);
2682     sort_indices<0,1,2,3,4,5,1,1,1,1>(i0data, odata, x5.size(), x0.size(), x4.size(), x3.size(), x2.size(), x1.size());
2683   }
2684   out()->add_block(odata, x5, x0, x4, x3, x2, x1);
2685 }
2686 
compute()2687 void Task26::Task_local::compute() {
2688   const Index x3 = b(0);
2689   const Index x0 = b(1);
2690   const Index x2 = b(2);
2691   const Index x1 = b(3);
2692   // tensor label: Gamma60
2693   std::unique_ptr<double[]> odata(new double[out()->get_size(x3, x0, x2, x1)]);
2694   std::fill_n(odata.get(), out()->get_size(x3, x0, x2, x1), 0.0);
2695   {
2696     std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x0, x2, x1);
2697     sort_indices<0,1,2,3,1,1,1,1>(i0data, odata, x3.size(), x0.size(), x2.size(), x1.size());
2698   }
2699   out()->add_block(odata, x3, x0, x2, x1);
2700 }
2701 
compute()2702 void Task27::Task_local::compute() {
2703   const Index x3 = b(0);
2704   const Index x0 = b(1);
2705   const Index x2 = b(2);
2706   const Index x1 = b(3);
2707   // tensor label: Gamma79
2708   std::unique_ptr<double[]> odata(new double[out()->get_size(x3, x0)]);
2709   std::fill_n(odata.get(), out()->get_size(x3, x0), 0.0);
2710   // associated with merged
2711   std::unique_ptr<double[]> fdata = in(1)->get_block(x2, x1);
2712   {
2713     std::unique_ptr<double[]> i0data = in(0)->get_block(x3, x0, x2, x1);
2714     for (int i1 = 0; i1 != x1.size(); ++i1) {
2715       for (int i2 = 0; i2 != x2.size(); ++i2) {
2716         for (int i0 = 0; i0 != x0.size(); ++i0) {
2717           for (int i3 = 0; i3 != x3.size(); ++i3) {
2718             odata[i3+x3.size()*(i0)]
2719               += (1.0) * i0data[i3+x3.size()*(i0+x0.size()*(i2+x2.size()*(i1)))] * fdata[i2+x2.size()*(i1)];
2720           }
2721         }
2722       }
2723     }
2724   }
2725   out()->add_block(odata, x3, x0);
2726 }
2727 
compute()2728 void Task28::Task_local::compute() {
2729   const Index x5 = b(0);
2730   const Index x0 = b(1);
2731   const Index x4 = b(2);
2732   const Index x1 = b(3);
2733   const Index x3 = b(4);
2734   const Index x2 = b(5);
2735   // tensor label: Gamma90
2736   std::unique_ptr<double[]> odata(new double[out()->get_size(x5, x0, x4, x1)]);
2737   std::fill_n(odata.get(), out()->get_size(x5, x0, x4, x1), 0.0);
2738   // associated with merged
2739   std::unique_ptr<double[]> fdata = in(1)->get_block(x3, x2);
2740   {
2741     std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0, x4, x1, x3, x2);
2742     for (int i2 = 0; i2 != x2.size(); ++i2) {
2743       for (int i3 = 0; i3 != x3.size(); ++i3) {
2744         for (int i1 = 0; i1 != x1.size(); ++i1) {
2745           for (int i4 = 0; i4 != x4.size(); ++i4) {
2746             for (int i0 = 0; i0 != x0.size(); ++i0) {
2747               for (int i5 = 0; i5 != x5.size(); ++i5) {
2748                 odata[i5+x5.size()*(i0+x0.size()*(i4+x4.size()*(i1)))]
2749                   += (1.0) * i0data[i5+x5.size()*(i0+x0.size()*(i4+x4.size()*(i1+x1.size()*(i3+x3.size()*(i2)))))] * fdata[i3+x3.size()*(i2)];
2750               }
2751             }
2752           }
2753         }
2754       }
2755     }
2756   }
2757   out()->add_block(odata, x5, x0, x4, x1);
2758 }
2759 
compute()2760 void Task29::Task_local::compute() {
2761   const Index x2 = b(0);
2762   const Index x5 = b(1);
2763   const Index x4 = b(2);
2764   const Index x3 = b(3);
2765   const Index x1 = b(4);
2766   const Index x0 = b(5);
2767   // tensor label: Gamma105
2768   std::unique_ptr<double[]> odata(new double[out()->get_size(x2, x5, x4, x3, x1, x0)]);
2769   std::fill_n(odata.get(), out()->get_size(x2, x5, x4, x3, x1, x0), 0.0);
2770   {
2771     if (x2 == x5 && x1 == x3) {
2772       std::unique_ptr<double[]> i0data = in(0)->get_block(x4, x0);
2773       for (int i0 = 0; i0 != x0.size(); ++i0) {
2774         for (int i3 = 0; i3 != x3.size(); ++i3) {
2775           for (int i4 = 0; i4 != x4.size(); ++i4) {
2776             for (int i5 = 0; i5 != x5.size(); ++i5) {
2777               odata[i5+x2.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i3+x1.size()*(i0)))))]
2778                 += (2.0) * i0data[i4+x4.size()*(i0)];
2779             }
2780           }
2781         }
2782       }
2783     }
2784   }
2785   {
2786     if (x2 == x3 && x1 == x5) {
2787       std::unique_ptr<double[]> i0data = in(0)->get_block(x4, x0);
2788       for (int i0 = 0; i0 != x0.size(); ++i0) {
2789         for (int i3 = 0; i3 != x3.size(); ++i3) {
2790           for (int i4 = 0; i4 != x4.size(); ++i4) {
2791             for (int i5 = 0; i5 != x5.size(); ++i5) {
2792               odata[i3+x2.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i5+x1.size()*(i0)))))]
2793                 += (-1.0) * i0data[i4+x4.size()*(i0)];
2794             }
2795           }
2796         }
2797       }
2798     }
2799   }
2800   {
2801     if (x1 == x5) {
2802       std::unique_ptr<double[]> i0data = in(1)->get_block(x4, x3, x2, x0);
2803       for (int i0 = 0; i0 != x0.size(); ++i0) {
2804         for (int i3 = 0; i3 != x3.size(); ++i3) {
2805           for (int i4 = 0; i4 != x4.size(); ++i4) {
2806             for (int i5 = 0; i5 != x5.size(); ++i5) {
2807               for (int i2 = 0; i2 != x2.size(); ++i2) {
2808                 odata[i2+x2.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i5+x1.size()*(i0)))))]
2809                   += (-1.0) * i0data[i4+x4.size()*(i3+x3.size()*(i2+x2.size()*(i0)))];
2810               }
2811             }
2812           }
2813         }
2814       }
2815     }
2816   }
2817   {
2818     if (x2 == x5) {
2819       std::unique_ptr<double[]> i0data = in(1)->get_block(x4, x3, x1, x0);
2820       for (int i0 = 0; i0 != x0.size(); ++i0) {
2821         for (int i1 = 0; i1 != x1.size(); ++i1) {
2822           for (int i3 = 0; i3 != x3.size(); ++i3) {
2823             for (int i4 = 0; i4 != x4.size(); ++i4) {
2824               for (int i5 = 0; i5 != x5.size(); ++i5) {
2825                 odata[i5+x2.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i1+x1.size()*(i0)))))]
2826                   += (2.0) * i0data[i4+x4.size()*(i3+x3.size()*(i1+x1.size()*(i0)))];
2827               }
2828             }
2829           }
2830         }
2831       }
2832     }
2833   }
2834   {
2835     if (x4 == x5 && x1 == x3) {
2836       std::unique_ptr<double[]> i0data = in(0)->get_block(x2, x0);
2837       for (int i0 = 0; i0 != x0.size(); ++i0) {
2838         for (int i3 = 0; i3 != x3.size(); ++i3) {
2839           for (int i5 = 0; i5 != x5.size(); ++i5) {
2840             for (int i2 = 0; i2 != x2.size(); ++i2) {
2841               odata[i2+x2.size()*(i5+x5.size()*(i5+x4.size()*(i3+x3.size()*(i3+x1.size()*(i0)))))]
2842                 += (-1.0) * i0data[i2+x2.size()*(i0)];
2843             }
2844           }
2845         }
2846       }
2847     }
2848   }
2849   {
2850     if (x1 == x3) {
2851       std::unique_ptr<double[]> i0data = in(1)->get_block(x2, x5, x4, x0);
2852       for (int i0 = 0; i0 != x0.size(); ++i0) {
2853         for (int i3 = 0; i3 != x3.size(); ++i3) {
2854           for (int i4 = 0; i4 != x4.size(); ++i4) {
2855             for (int i5 = 0; i5 != x5.size(); ++i5) {
2856               for (int i2 = 0; i2 != x2.size(); ++i2) {
2857                 odata[i2+x2.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i3+x1.size()*(i0)))))]
2858                   += (-1.0) * i0data[i2+x2.size()*(i5+x5.size()*(i4+x4.size()*(i0)))];
2859               }
2860             }
2861           }
2862         }
2863       }
2864     }
2865   }
2866   {
2867     if (x2 == x3 && x4 == x5) {
2868       std::unique_ptr<double[]> i0data = in(0)->get_block(x1, x0);
2869       for (int i0 = 0; i0 != x0.size(); ++i0) {
2870         for (int i1 = 0; i1 != x1.size(); ++i1) {
2871           for (int i3 = 0; i3 != x3.size(); ++i3) {
2872             for (int i5 = 0; i5 != x5.size(); ++i5) {
2873               odata[i3+x2.size()*(i5+x5.size()*(i5+x4.size()*(i3+x3.size()*(i1+x1.size()*(i0)))))]
2874                 += (2.0) * i0data[i1+x1.size()*(i0)];
2875             }
2876           }
2877         }
2878       }
2879     }
2880   }
2881   {
2882     if (x2 == x3) {
2883       std::unique_ptr<double[]> i0data = in(1)->get_block(x4, x5, x1, x0);
2884       for (int i0 = 0; i0 != x0.size(); ++i0) {
2885         for (int i1 = 0; i1 != x1.size(); ++i1) {
2886           for (int i3 = 0; i3 != x3.size(); ++i3) {
2887             for (int i4 = 0; i4 != x4.size(); ++i4) {
2888               for (int i5 = 0; i5 != x5.size(); ++i5) {
2889                 odata[i3+x2.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i1+x1.size()*(i0)))))]
2890                   += (-1.0) * i0data[i4+x4.size()*(i5+x5.size()*(i1+x1.size()*(i0)))];
2891               }
2892             }
2893           }
2894         }
2895       }
2896     }
2897   }
2898   {
2899     if (x4 == x5) {
2900       std::unique_ptr<double[]> i0data = in(1)->get_block(x2, x3, x1, x0);
2901       for (int i0 = 0; i0 != x0.size(); ++i0) {
2902         for (int i1 = 0; i1 != x1.size(); ++i1) {
2903           for (int i3 = 0; i3 != x3.size(); ++i3) {
2904             for (int i5 = 0; i5 != x5.size(); ++i5) {
2905               for (int i2 = 0; i2 != x2.size(); ++i2) {
2906                 odata[i2+x2.size()*(i5+x5.size()*(i5+x4.size()*(i3+x3.size()*(i1+x1.size()*(i0)))))]
2907                   += (-1.0) * i0data[i2+x2.size()*(i3+x3.size()*(i1+x1.size()*(i0)))];
2908               }
2909             }
2910           }
2911         }
2912       }
2913     }
2914   }
2915   {
2916     std::unique_ptr<double[]> i0data = in(2)->get_block(x2, x5, x4, x3, x1, x0);
2917     sort_indices<0,1,2,3,4,5,1,1,-1,1>(i0data, odata, x2.size(), x5.size(), x4.size(), x3.size(), x1.size(), x0.size());
2918   }
2919   out()->add_block(odata, x2, x5, x4, x3, x1, x0);
2920 }
2921 
compute()2922 void Task30::Task_local::compute() {
2923   const Index x0 = b(0);
2924   const Index x5 = b(1);
2925   const Index x1 = b(2);
2926   const Index x4 = b(3);
2927   const Index x3 = b(4);
2928   const Index x2 = b(5);
2929   // tensor label: Gamma138
2930   std::unique_ptr<double[]> odata(new double[out()->get_size(x0, x5, x1, x4, x3, x2)]);
2931   std::fill_n(odata.get(), out()->get_size(x0, x5, x1, x4, x3, x2), 0.0);
2932   {
2933     if (x1 == x5 && x0 == x4) {
2934       std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x2);
2935       for (int i2 = 0; i2 != x2.size(); ++i2) {
2936         for (int i3 = 0; i3 != x3.size(); ++i3) {
2937           for (int i4 = 0; i4 != x4.size(); ++i4) {
2938             for (int i5 = 0; i5 != x5.size(); ++i5) {
2939               odata[i4+x0.size()*(i5+x5.size()*(i5+x1.size()*(i4+x4.size()*(i3+x3.size()*(i2)))))]
2940                 += (-2.0) * i0data[i3+x3.size()*(i2)];
2941             }
2942           }
2943         }
2944       }
2945     }
2946   }
2947   {
2948     if (x1 == x4 && x0 == x5) {
2949       std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x2);
2950       for (int i2 = 0; i2 != x2.size(); ++i2) {
2951         for (int i3 = 0; i3 != x3.size(); ++i3) {
2952           for (int i4 = 0; i4 != x4.size(); ++i4) {
2953             for (int i5 = 0; i5 != x5.size(); ++i5) {
2954               odata[i5+x0.size()*(i5+x5.size()*(i4+x1.size()*(i4+x4.size()*(i3+x3.size()*(i2)))))]
2955                 += (4.0) * i0data[i3+x3.size()*(i2)];
2956             }
2957           }
2958         }
2959       }
2960     }
2961   }
2962   {
2963     // rdm0 non-merged case
2964     if (x0 == x2 && x1 == x4 && x3 == x5) {
2965       std::unique_ptr<double[]> i0data = in(0)->get_block();
2966       for (int i2 = 0; i2 != x2.size(); ++i2) {
2967         for (int i4 = 0; i4 != x4.size(); ++i4) {
2968           for (int i5 = 0; i5 != x5.size(); ++i5) {
2969             odata[i2+x0.size()*(i5+x5.size()*(i4+x1.size()*(i4+x4.size()*(i5+x3.size()*(i2)))))]  += 4.0 * i0data[0];
2970           }
2971         }
2972       }
2973     }
2974   }
2975   {
2976     if (x1 == x4 && x0 == x2) {
2977       std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x5);
2978       for (int i2 = 0; i2 != x2.size(); ++i2) {
2979         for (int i3 = 0; i3 != x3.size(); ++i3) {
2980           for (int i4 = 0; i4 != x4.size(); ++i4) {
2981             for (int i5 = 0; i5 != x5.size(); ++i5) {
2982               odata[i2+x0.size()*(i5+x5.size()*(i4+x1.size()*(i4+x4.size()*(i3+x3.size()*(i2)))))]
2983                 += (-2.0) * i0data[i3+x3.size()*(i5)];
2984             }
2985           }
2986         }
2987       }
2988     }
2989   }
2990   {
2991     // rdm0 non-merged case
2992     if (x0 == x2 && x1 == x5 && x3 == x4) {
2993       std::unique_ptr<double[]> i0data = in(0)->get_block();
2994       for (int i2 = 0; i2 != x2.size(); ++i2) {
2995         for (int i4 = 0; i4 != x4.size(); ++i4) {
2996           for (int i5 = 0; i5 != x5.size(); ++i5) {
2997             odata[i2+x0.size()*(i5+x5.size()*(i5+x1.size()*(i4+x4.size()*(i4+x3.size()*(i2)))))]  += -2.0 * i0data[0];
2998           }
2999         }
3000       }
3001     }
3002   }
3003   {
3004     if (x1 == x5 && x0 == x2) {
3005       std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x4);
3006       for (int i2 = 0; i2 != x2.size(); ++i2) {
3007         for (int i3 = 0; i3 != x3.size(); ++i3) {
3008           for (int i4 = 0; i4 != x4.size(); ++i4) {
3009             for (int i5 = 0; i5 != x5.size(); ++i5) {
3010               odata[i2+x0.size()*(i5+x5.size()*(i5+x1.size()*(i4+x4.size()*(i3+x3.size()*(i2)))))]
3011                 += (1.0) * i0data[i3+x3.size()*(i4)];
3012             }
3013           }
3014         }
3015       }
3016     }
3017   }
3018   {
3019     if (x3 == x4 && x0 == x2) {
3020       std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x5);
3021       for (int i2 = 0; i2 != x2.size(); ++i2) {
3022         for (int i4 = 0; i4 != x4.size(); ++i4) {
3023           for (int i1 = 0; i1 != x1.size(); ++i1) {
3024             for (int i5 = 0; i5 != x5.size(); ++i5) {
3025               odata[i2+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4+x4.size()*(i4+x3.size()*(i2)))))]
3026                 += (1.0) * i0data[i1+x1.size()*(i5)];
3027             }
3028           }
3029         }
3030       }
3031     }
3032   }
3033   {
3034     if (x3 == x5 && x0 == x2) {
3035       std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x4);
3036       for (int i2 = 0; i2 != x2.size(); ++i2) {
3037         for (int i4 = 0; i4 != x4.size(); ++i4) {
3038           for (int i1 = 0; i1 != x1.size(); ++i1) {
3039             for (int i5 = 0; i5 != x5.size(); ++i5) {
3040               odata[i2+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4+x4.size()*(i5+x3.size()*(i2)))))]
3041                 += (-2.0) * i0data[i1+x1.size()*(i4)];
3042             }
3043           }
3044         }
3045       }
3046     }
3047   }
3048   {
3049     if (x0 == x2) {
3050       std::unique_ptr<double[]> i0data = in(2)->get_block(x3, x5, x1, x4);
3051       for (int i2 = 0; i2 != x2.size(); ++i2) {
3052         for (int i3 = 0; i3 != x3.size(); ++i3) {
3053           for (int i4 = 0; i4 != x4.size(); ++i4) {
3054             for (int i1 = 0; i1 != x1.size(); ++i1) {
3055               for (int i5 = 0; i5 != x5.size(); ++i5) {
3056                 odata[i2+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4+x4.size()*(i3+x3.size()*(i2)))))]
3057                   += (1.0) * i0data[i3+x3.size()*(i5+x5.size()*(i1+x1.size()*(i4)))];
3058               }
3059             }
3060           }
3061         }
3062       }
3063     }
3064   }
3065   {
3066     // rdm0 non-merged case
3067     if (x3 == x5 && x1 == x2 && x0 == x4) {
3068       std::unique_ptr<double[]> i0data = in(0)->get_block();
3069       for (int i2 = 0; i2 != x2.size(); ++i2) {
3070         for (int i4 = 0; i4 != x4.size(); ++i4) {
3071           for (int i5 = 0; i5 != x5.size(); ++i5) {
3072             odata[i4+x0.size()*(i5+x5.size()*(i2+x1.size()*(i4+x4.size()*(i5+x3.size()*(i2)))))]  += -2.0 * i0data[0];
3073           }
3074         }
3075       }
3076     }
3077   }
3078   {
3079     if (x1 == x2 && x0 == x4) {
3080       std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x5);
3081       for (int i2 = 0; i2 != x2.size(); ++i2) {
3082         for (int i3 = 0; i3 != x3.size(); ++i3) {
3083           for (int i4 = 0; i4 != x4.size(); ++i4) {
3084             for (int i5 = 0; i5 != x5.size(); ++i5) {
3085               odata[i4+x0.size()*(i5+x5.size()*(i2+x1.size()*(i4+x4.size()*(i3+x3.size()*(i2)))))]
3086                 += (1.0) * i0data[i3+x3.size()*(i5)];
3087             }
3088           }
3089         }
3090       }
3091     }
3092   }
3093   {
3094     if (x3 == x5 && x0 == x4) {
3095       std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x2);
3096       for (int i2 = 0; i2 != x2.size(); ++i2) {
3097         for (int i4 = 0; i4 != x4.size(); ++i4) {
3098           for (int i1 = 0; i1 != x1.size(); ++i1) {
3099             for (int i5 = 0; i5 != x5.size(); ++i5) {
3100               odata[i4+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4+x4.size()*(i5+x3.size()*(i2)))))]
3101                 += (1.0) * i0data[i1+x1.size()*(i2)];
3102             }
3103           }
3104         }
3105       }
3106     }
3107   }
3108   {
3109     if (x0 == x4) {
3110       std::unique_ptr<double[]> i0data = in(2)->get_block(x1, x5, x3, x2);
3111       for (int i2 = 0; i2 != x2.size(); ++i2) {
3112         for (int i3 = 0; i3 != x3.size(); ++i3) {
3113           for (int i4 = 0; i4 != x4.size(); ++i4) {
3114             for (int i1 = 0; i1 != x1.size(); ++i1) {
3115               for (int i5 = 0; i5 != x5.size(); ++i5) {
3116                 odata[i4+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4+x4.size()*(i3+x3.size()*(i2)))))]
3117                   += (1.0) * i0data[i1+x1.size()*(i5+x5.size()*(i3+x3.size()*(i2)))];
3118               }
3119             }
3120           }
3121         }
3122       }
3123     }
3124   }
3125   {
3126     // rdm0 non-merged case
3127     if (x3 == x4 && x0 == x5 && x1 == x2) {
3128       std::unique_ptr<double[]> i0data = in(0)->get_block();
3129       for (int i2 = 0; i2 != x2.size(); ++i2) {
3130         for (int i4 = 0; i4 != x4.size(); ++i4) {
3131           for (int i5 = 0; i5 != x5.size(); ++i5) {
3132             odata[i5+x0.size()*(i5+x5.size()*(i2+x1.size()*(i4+x4.size()*(i4+x3.size()*(i2)))))]  += 4.0 * i0data[0];
3133           }
3134         }
3135       }
3136     }
3137   }
3138   {
3139     if (x0 == x5 && x1 == x2) {
3140       std::unique_ptr<double[]> i0data = in(1)->get_block(x3, x4);
3141       for (int i2 = 0; i2 != x2.size(); ++i2) {
3142         for (int i3 = 0; i3 != x3.size(); ++i3) {
3143           for (int i4 = 0; i4 != x4.size(); ++i4) {
3144             for (int i5 = 0; i5 != x5.size(); ++i5) {
3145               odata[i5+x0.size()*(i5+x5.size()*(i2+x1.size()*(i4+x4.size()*(i3+x3.size()*(i2)))))]
3146                 += (-2.0) * i0data[i3+x3.size()*(i4)];
3147             }
3148           }
3149         }
3150       }
3151     }
3152   }
3153   {
3154     if (x3 == x4 && x0 == x5) {
3155       std::unique_ptr<double[]> i0data = in(1)->get_block(x1, x2);
3156       for (int i2 = 0; i2 != x2.size(); ++i2) {
3157         for (int i4 = 0; i4 != x4.size(); ++i4) {
3158           for (int i1 = 0; i1 != x1.size(); ++i1) {
3159             for (int i5 = 0; i5 != x5.size(); ++i5) {
3160               odata[i5+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4+x4.size()*(i4+x3.size()*(i2)))))]
3161                 += (-2.0) * i0data[i1+x1.size()*(i2)];
3162             }
3163           }
3164         }
3165       }
3166     }
3167   }
3168   {
3169     if (x0 == x5) {
3170       std::unique_ptr<double[]> i0data = in(2)->get_block(x1, x4, x3, x2);
3171       for (int i2 = 0; i2 != x2.size(); ++i2) {
3172         for (int i3 = 0; i3 != x3.size(); ++i3) {
3173           for (int i4 = 0; i4 != x4.size(); ++i4) {
3174             for (int i1 = 0; i1 != x1.size(); ++i1) {
3175               for (int i5 = 0; i5 != x5.size(); ++i5) {
3176                 odata[i5+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4+x4.size()*(i3+x3.size()*(i2)))))]
3177                   += (-2.0) * i0data[i1+x1.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
3178               }
3179             }
3180           }
3181         }
3182       }
3183     }
3184   }
3185   {
3186     if (x3 == x4 && x1 == x2) {
3187       std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x5);
3188       for (int i2 = 0; i2 != x2.size(); ++i2) {
3189         for (int i4 = 0; i4 != x4.size(); ++i4) {
3190           for (int i5 = 0; i5 != x5.size(); ++i5) {
3191             for (int i0 = 0; i0 != x0.size(); ++i0) {
3192               odata[i0+x0.size()*(i5+x5.size()*(i2+x1.size()*(i4+x4.size()*(i4+x3.size()*(i2)))))]
3193                 += (-2.0) * i0data[i0+x0.size()*(i5)];
3194             }
3195           }
3196         }
3197       }
3198     }
3199   }
3200   {
3201     if (x3 == x5 && x1 == x2) {
3202       std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x4);
3203       for (int i2 = 0; i2 != x2.size(); ++i2) {
3204         for (int i4 = 0; i4 != x4.size(); ++i4) {
3205           for (int i5 = 0; i5 != x5.size(); ++i5) {
3206             for (int i0 = 0; i0 != x0.size(); ++i0) {
3207               odata[i0+x0.size()*(i5+x5.size()*(i2+x1.size()*(i4+x4.size()*(i5+x3.size()*(i2)))))]
3208                 += (1.0) * i0data[i0+x0.size()*(i4)];
3209             }
3210           }
3211         }
3212       }
3213     }
3214   }
3215   {
3216     if (x1 == x2) {
3217       std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x5, x3, x4);
3218       for (int i2 = 0; i2 != x2.size(); ++i2) {
3219         for (int i3 = 0; i3 != x3.size(); ++i3) {
3220           for (int i4 = 0; i4 != x4.size(); ++i4) {
3221             for (int i5 = 0; i5 != x5.size(); ++i5) {
3222               for (int i0 = 0; i0 != x0.size(); ++i0) {
3223                 odata[i0+x0.size()*(i5+x5.size()*(i2+x1.size()*(i4+x4.size()*(i3+x3.size()*(i2)))))]
3224                   += (1.0) * i0data[i0+x0.size()*(i5+x5.size()*(i3+x3.size()*(i4)))];
3225               }
3226             }
3227           }
3228         }
3229       }
3230     }
3231   }
3232   {
3233     if (x3 == x5 && x1 == x4) {
3234       std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x2);
3235       for (int i2 = 0; i2 != x2.size(); ++i2) {
3236         for (int i4 = 0; i4 != x4.size(); ++i4) {
3237           for (int i5 = 0; i5 != x5.size(); ++i5) {
3238             for (int i0 = 0; i0 != x0.size(); ++i0) {
3239               odata[i0+x0.size()*(i5+x5.size()*(i4+x1.size()*(i4+x4.size()*(i5+x3.size()*(i2)))))]
3240                 += (-2.0) * i0data[i0+x0.size()*(i2)];
3241             }
3242           }
3243         }
3244       }
3245     }
3246   }
3247   {
3248     if (x1 == x4) {
3249       std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x5, x3, x2);
3250       for (int i2 = 0; i2 != x2.size(); ++i2) {
3251         for (int i3 = 0; i3 != x3.size(); ++i3) {
3252           for (int i4 = 0; i4 != x4.size(); ++i4) {
3253             for (int i5 = 0; i5 != x5.size(); ++i5) {
3254               for (int i0 = 0; i0 != x0.size(); ++i0) {
3255                 odata[i0+x0.size()*(i5+x5.size()*(i4+x1.size()*(i4+x4.size()*(i3+x3.size()*(i2)))))]
3256                   += (-2.0) * i0data[i0+x0.size()*(i5+x5.size()*(i3+x3.size()*(i2)))];
3257               }
3258             }
3259           }
3260         }
3261       }
3262     }
3263   }
3264   {
3265     if (x3 == x4 && x1 == x5) {
3266       std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x2);
3267       for (int i2 = 0; i2 != x2.size(); ++i2) {
3268         for (int i4 = 0; i4 != x4.size(); ++i4) {
3269           for (int i5 = 0; i5 != x5.size(); ++i5) {
3270             for (int i0 = 0; i0 != x0.size(); ++i0) {
3271               odata[i0+x0.size()*(i5+x5.size()*(i5+x1.size()*(i4+x4.size()*(i4+x3.size()*(i2)))))]
3272                 += (1.0) * i0data[i0+x0.size()*(i2)];
3273             }
3274           }
3275         }
3276       }
3277     }
3278   }
3279   {
3280     if (x1 == x5) {
3281       std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x4, x3, x2);
3282       for (int i2 = 0; i2 != x2.size(); ++i2) {
3283         for (int i3 = 0; i3 != x3.size(); ++i3) {
3284           for (int i4 = 0; i4 != x4.size(); ++i4) {
3285             for (int i5 = 0; i5 != x5.size(); ++i5) {
3286               for (int i0 = 0; i0 != x0.size(); ++i0) {
3287                 odata[i0+x0.size()*(i5+x5.size()*(i5+x1.size()*(i4+x4.size()*(i3+x3.size()*(i2)))))]
3288                   += (1.0) * i0data[i0+x0.size()*(i4+x4.size()*(i3+x3.size()*(i2)))];
3289               }
3290             }
3291           }
3292         }
3293       }
3294     }
3295   }
3296   {
3297     if (x3 == x4) {
3298       std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x5, x1, x2);
3299       for (int i2 = 0; i2 != x2.size(); ++i2) {
3300         for (int i4 = 0; i4 != x4.size(); ++i4) {
3301           for (int i1 = 0; i1 != x1.size(); ++i1) {
3302             for (int i5 = 0; i5 != x5.size(); ++i5) {
3303               for (int i0 = 0; i0 != x0.size(); ++i0) {
3304                 odata[i0+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4+x4.size()*(i4+x3.size()*(i2)))))]
3305                   += (1.0) * i0data[i0+x0.size()*(i5+x5.size()*(i1+x1.size()*(i2)))];
3306               }
3307             }
3308           }
3309         }
3310       }
3311     }
3312   }
3313   {
3314     if (x3 == x5) {
3315       std::unique_ptr<double[]> i0data = in(2)->get_block(x1, x4, x0, x2);
3316       for (int i2 = 0; i2 != x2.size(); ++i2) {
3317         for (int i4 = 0; i4 != x4.size(); ++i4) {
3318           for (int i1 = 0; i1 != x1.size(); ++i1) {
3319             for (int i5 = 0; i5 != x5.size(); ++i5) {
3320               for (int i0 = 0; i0 != x0.size(); ++i0) {
3321                 odata[i0+x0.size()*(i5+x5.size()*(i1+x1.size()*(i4+x4.size()*(i5+x3.size()*(i2)))))]
3322                   += (1.0) * i0data[i1+x1.size()*(i4+x4.size()*(i0+x0.size()*(i2)))];
3323               }
3324             }
3325           }
3326         }
3327       }
3328     }
3329   }
3330   {
3331     std::unique_ptr<double[]> i0data = in(3)->get_block(x0, x5, x1, x4, x3, x2);
3332     sort_indices<0,1,2,3,4,5,1,1,1,1>(i0data, odata, x0.size(), x5.size(), x1.size(), x4.size(), x3.size(), x2.size());
3333   }
3334   out()->add_block(odata, x0, x5, x1, x4, x3, x2);
3335 }
3336 
compute()3337 void Task31::Task_local::compute() {
3338   const Index x5 = b(0);
3339   const Index x0 = b(1);
3340   const Index x1 = b(2);
3341   const Index x4 = b(3);
3342   const Index x3 = b(4);
3343   const Index x2 = b(5);
3344   // tensor label: Gamma169
3345   std::unique_ptr<double[]> odata(new double[out()->get_size(x5, x0, x1, x4, x3, x2)]);
3346   std::fill_n(odata.get(), out()->get_size(x5, x0, x1, x4, x3, x2), 0.0);
3347   {
3348     if (x1 == x4) {
3349       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x0, x3, x2);
3350       for (int i2 = 0; i2 != x2.size(); ++i2) {
3351         for (int i3 = 0; i3 != x3.size(); ++i3) {
3352           for (int i4 = 0; i4 != x4.size(); ++i4) {
3353             for (int i0 = 0; i0 != x0.size(); ++i0) {
3354               for (int i5 = 0; i5 != x5.size(); ++i5) {
3355                 odata[i5+x5.size()*(i0+x0.size()*(i4+x1.size()*(i4+x4.size()*(i3+x3.size()*(i2)))))]
3356                   += (2.0) * i0data[i5+x5.size()*(i0+x0.size()*(i3+x3.size()*(i2)))];
3357               }
3358             }
3359           }
3360         }
3361       }
3362     }
3363   }
3364   {
3365     if (x3 == x4 && x1 == x2) {
3366       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0);
3367       for (int i2 = 0; i2 != x2.size(); ++i2) {
3368         for (int i4 = 0; i4 != x4.size(); ++i4) {
3369           for (int i0 = 0; i0 != x0.size(); ++i0) {
3370             for (int i5 = 0; i5 != x5.size(); ++i5) {
3371               odata[i5+x5.size()*(i0+x0.size()*(i2+x1.size()*(i4+x4.size()*(i4+x3.size()*(i2)))))]
3372                 += (2.0) * i0data[i5+x5.size()*(i0)];
3373             }
3374           }
3375         }
3376       }
3377     }
3378   }
3379   {
3380     if (x1 == x2) {
3381       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x0, x3, x4);
3382       for (int i2 = 0; i2 != x2.size(); ++i2) {
3383         for (int i3 = 0; i3 != x3.size(); ++i3) {
3384           for (int i4 = 0; i4 != x4.size(); ++i4) {
3385             for (int i0 = 0; i0 != x0.size(); ++i0) {
3386               for (int i5 = 0; i5 != x5.size(); ++i5) {
3387                 odata[i5+x5.size()*(i0+x0.size()*(i2+x1.size()*(i4+x4.size()*(i3+x3.size()*(i2)))))]
3388                   += (-1.0) * i0data[i5+x5.size()*(i0+x0.size()*(i3+x3.size()*(i4)))];
3389               }
3390             }
3391           }
3392         }
3393       }
3394     }
3395   }
3396   {
3397     if (x3 == x4) {
3398       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x0, x1, x2);
3399       for (int i2 = 0; i2 != x2.size(); ++i2) {
3400         for (int i4 = 0; i4 != x4.size(); ++i4) {
3401           for (int i1 = 0; i1 != x1.size(); ++i1) {
3402             for (int i0 = 0; i0 != x0.size(); ++i0) {
3403               for (int i5 = 0; i5 != x5.size(); ++i5) {
3404                 odata[i5+x5.size()*(i0+x0.size()*(i1+x1.size()*(i4+x4.size()*(i4+x3.size()*(i2)))))]
3405                   += (-1.0) * i0data[i5+x5.size()*(i0+x0.size()*(i1+x1.size()*(i2)))];
3406               }
3407             }
3408           }
3409         }
3410       }
3411     }
3412   }
3413   {
3414     std::unique_ptr<double[]> i0data = in(2)->get_block(x5, x0, x1, x4, x3, x2);
3415     sort_indices<0,1,2,3,4,5,1,1,-1,1>(i0data, odata, x5.size(), x0.size(), x1.size(), x4.size(), x3.size(), x2.size());
3416   }
3417   out()->add_block(odata, x5, x0, x1, x4, x3, x2);
3418 }
3419 
compute()3420 void Task32::Task_local::compute() {
3421   const Index x5 = b(0);
3422   const Index x4 = b(1);
3423   const Index x3 = b(2);
3424   const Index x2 = b(3);
3425   const Index x1 = b(4);
3426   const Index x0 = b(5);
3427   // tensor label: Gamma172
3428   std::unique_ptr<double[]> odata(new double[out()->get_size(x5, x4, x3, x2, x1, x0)]);
3429   std::fill_n(odata.get(), out()->get_size(x5, x4, x3, x2, x1, x0), 0.0);
3430   {
3431     if (x1 == x4) {
3432       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x0, x3, x2);
3433       for (int i0 = 0; i0 != x0.size(); ++i0) {
3434         for (int i2 = 0; i2 != x2.size(); ++i2) {
3435           for (int i3 = 0; i3 != x3.size(); ++i3) {
3436             for (int i4 = 0; i4 != x4.size(); ++i4) {
3437               for (int i5 = 0; i5 != x5.size(); ++i5) {
3438                 odata[i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2+x2.size()*(i4+x1.size()*(i0)))))]
3439                   += (1.0) * i0data[i5+x5.size()*(i0+x0.size()*(i3+x3.size()*(i2)))];
3440               }
3441             }
3442           }
3443         }
3444       }
3445     }
3446   }
3447   {
3448     if (x3 == x4 && x1 == x2) {
3449       std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0);
3450       for (int i0 = 0; i0 != x0.size(); ++i0) {
3451         for (int i2 = 0; i2 != x2.size(); ++i2) {
3452           for (int i4 = 0; i4 != x4.size(); ++i4) {
3453             for (int i5 = 0; i5 != x5.size(); ++i5) {
3454               odata[i5+x5.size()*(i4+x4.size()*(i4+x3.size()*(i2+x2.size()*(i2+x1.size()*(i0)))))]
3455                 += (1.0) * i0data[i5+x5.size()*(i0)];
3456             }
3457           }
3458         }
3459       }
3460     }
3461   }
3462   {
3463     if (x1 == x2) {
3464       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x4, x3, x0);
3465       for (int i0 = 0; i0 != x0.size(); ++i0) {
3466         for (int i2 = 0; i2 != x2.size(); ++i2) {
3467           for (int i3 = 0; i3 != x3.size(); ++i3) {
3468             for (int i4 = 0; i4 != x4.size(); ++i4) {
3469               for (int i5 = 0; i5 != x5.size(); ++i5) {
3470                 odata[i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i2+x2.size()*(i2+x1.size()*(i0)))))]
3471                   += (1.0) * i0data[i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i0)))];
3472               }
3473             }
3474           }
3475         }
3476       }
3477     }
3478   }
3479   {
3480     if (x3 == x4) {
3481       std::unique_ptr<double[]> i0data = in(1)->get_block(x5, x2, x1, x0);
3482       for (int i0 = 0; i0 != x0.size(); ++i0) {
3483         for (int i1 = 0; i1 != x1.size(); ++i1) {
3484           for (int i2 = 0; i2 != x2.size(); ++i2) {
3485             for (int i4 = 0; i4 != x4.size(); ++i4) {
3486               for (int i5 = 0; i5 != x5.size(); ++i5) {
3487                 odata[i5+x5.size()*(i4+x4.size()*(i4+x3.size()*(i2+x2.size()*(i1+x1.size()*(i0)))))]
3488                   += (1.0) * i0data[i5+x5.size()*(i2+x2.size()*(i1+x1.size()*(i0)))];
3489               }
3490             }
3491           }
3492         }
3493       }
3494     }
3495   }
3496   {
3497     std::unique_ptr<double[]> i0data = in(2)->get_block(x5, x4, x3, x2, x1, x0);
3498     sort_indices<0,1,2,3,4,5,1,1,1,1>(i0data, odata, x5.size(), x4.size(), x3.size(), x2.size(), x1.size(), x0.size());
3499   }
3500   out()->add_block(odata, x5, x4, x3, x2, x1, x0);
3501 }
3502 
compute()3503 void Task33::Task_local::compute() {
3504   const Index x5 = b(0);
3505   const Index x0 = b(1);
3506   const Index x4 = b(2);
3507   const Index x1 = b(3);
3508   const Index x3 = b(4);
3509   const Index x2 = b(5);
3510   // tensor label: Gamma230
3511   std::unique_ptr<double[]> odata(new double[out()->get_size(x5, x0, x4, x1, x3, x2)]);
3512   std::fill_n(odata.get(), out()->get_size(x5, x0, x4, x1, x3, x2), 0.0);
3513   {
3514     std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x0, x4, x1, x3, x2);
3515     sort_indices<0,1,2,3,4,5,1,1,1,1>(i0data, odata, x5.size(), x0.size(), x4.size(), x1.size(), x3.size(), x2.size());
3516   }
3517   out()->add_block(odata, x5, x0, x4, x1, x3, x2);
3518 }
3519 
compute()3520 void Task34::Task_local::compute() {
3521   const Index x7 = b(0);
3522   const Index x6 = b(1);
3523   const Index x2 = b(2);
3524   const Index x5 = b(3);
3525   const Index x4 = b(4);
3526   const Index x3 = b(5);
3527   const Index x1 = b(6);
3528   const Index x0 = b(7);
3529   // tensor label: Gamma143
3530   std::unique_ptr<double[]> odata(new double[out()->get_size(x7, x6, x2, x5, x4, x3, x1, x0)]);
3531   std::fill_n(odata.get(), out()->get_size(x7, x6, x2, x5, x4, x3, x1, x0), 0.0);
3532   {
3533     if (x2 == x6 && x1 == x5) {
3534       std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x0, x4, x3);
3535       for (int i0 = 0; i0 != x0.size(); ++i0) {
3536         for (int i3 = 0; i3 != x3.size(); ++i3) {
3537           for (int i4 = 0; i4 != x4.size(); ++i4) {
3538             for (int i5 = 0; i5 != x5.size(); ++i5) {
3539               for (int i6 = 0; i6 != x6.size(); ++i6) {
3540                 for (int i7 = 0; i7 != x7.size(); ++i7) {
3541                   odata[i7+x7.size()*(i6+x6.size()*(i6+x2.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i5+x1.size()*(i0)))))))]
3542                     += (-1.0) * i0data[i7+x7.size()*(i0+x0.size()*(i4+x4.size()*(i3)))];
3543                 }
3544               }
3545             }
3546           }
3547         }
3548       }
3549     }
3550   }
3551   {
3552     if (x2 == x5 && x1 == x6) {
3553       std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x0, x4, x3);
3554       for (int i0 = 0; i0 != x0.size(); ++i0) {
3555         for (int i3 = 0; i3 != x3.size(); ++i3) {
3556           for (int i4 = 0; i4 != x4.size(); ++i4) {
3557             for (int i5 = 0; i5 != x5.size(); ++i5) {
3558               for (int i6 = 0; i6 != x6.size(); ++i6) {
3559                 for (int i7 = 0; i7 != x7.size(); ++i7) {
3560                   odata[i7+x7.size()*(i6+x6.size()*(i5+x2.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i6+x1.size()*(i0)))))))]
3561                     += (2.0) * i0data[i7+x7.size()*(i0+x0.size()*(i4+x4.size()*(i3)))];
3562                 }
3563               }
3564             }
3565           }
3566         }
3567       }
3568     }
3569   }
3570   {
3571     if (x1 == x3 && x2 == x5 && x4 == x6) {
3572       std::unique_ptr<double[]> i0data = in(0)->get_block(x7, x0);
3573       for (int i0 = 0; i0 != x0.size(); ++i0) {
3574         for (int i3 = 0; i3 != x3.size(); ++i3) {
3575           for (int i5 = 0; i5 != x5.size(); ++i5) {
3576             for (int i6 = 0; i6 != x6.size(); ++i6) {
3577               for (int i7 = 0; i7 != x7.size(); ++i7) {
3578                 odata[i7+x7.size()*(i6+x6.size()*(i5+x2.size()*(i5+x5.size()*(i6+x4.size()*(i3+x3.size()*(i3+x1.size()*(i0)))))))]
3579                   += (2.0) * i0data[i7+x7.size()*(i0)];
3580               }
3581             }
3582           }
3583         }
3584       }
3585     }
3586   }
3587   {
3588     if (x2 == x5 && x1 == x3) {
3589       std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x6, x4, x0);
3590       for (int i0 = 0; i0 != x0.size(); ++i0) {
3591         for (int i3 = 0; i3 != x3.size(); ++i3) {
3592           for (int i4 = 0; i4 != x4.size(); ++i4) {
3593             for (int i5 = 0; i5 != x5.size(); ++i5) {
3594               for (int i6 = 0; i6 != x6.size(); ++i6) {
3595                 for (int i7 = 0; i7 != x7.size(); ++i7) {
3596                   odata[i7+x7.size()*(i6+x6.size()*(i5+x2.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i3+x1.size()*(i0)))))))]
3597                     += (2.0) * i0data[i7+x7.size()*(i6+x6.size()*(i4+x4.size()*(i0)))];
3598                 }
3599               }
3600             }
3601           }
3602         }
3603       }
3604     }
3605   }
3606   {
3607     if (x4 == x5 && x2 == x6 && x1 == x3) {
3608       std::unique_ptr<double[]> i0data = in(0)->get_block(x7, x0);
3609       for (int i0 = 0; i0 != x0.size(); ++i0) {
3610         for (int i3 = 0; i3 != x3.size(); ++i3) {
3611           for (int i5 = 0; i5 != x5.size(); ++i5) {
3612             for (int i6 = 0; i6 != x6.size(); ++i6) {
3613               for (int i7 = 0; i7 != x7.size(); ++i7) {
3614                 odata[i7+x7.size()*(i6+x6.size()*(i6+x2.size()*(i5+x5.size()*(i5+x4.size()*(i3+x3.size()*(i3+x1.size()*(i0)))))))]
3615                   += (-1.0) * i0data[i7+x7.size()*(i0)];
3616               }
3617             }
3618           }
3619         }
3620       }
3621     }
3622   }
3623   {
3624     if (x2 == x6 && x1 == x3) {
3625       std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x5, x4, x0);
3626       for (int i0 = 0; i0 != x0.size(); ++i0) {
3627         for (int i3 = 0; i3 != x3.size(); ++i3) {
3628           for (int i4 = 0; i4 != x4.size(); ++i4) {
3629             for (int i5 = 0; i5 != x5.size(); ++i5) {
3630               for (int i6 = 0; i6 != x6.size(); ++i6) {
3631                 for (int i7 = 0; i7 != x7.size(); ++i7) {
3632                   odata[i7+x7.size()*(i6+x6.size()*(i6+x2.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i3+x1.size()*(i0)))))))]
3633                     += (-1.0) * i0data[i7+x7.size()*(i5+x5.size()*(i4+x4.size()*(i0)))];
3634                 }
3635               }
3636             }
3637           }
3638         }
3639       }
3640     }
3641   }
3642   {
3643     if (x4 == x5 && x1 == x3) {
3644       std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x6, x2, x0);
3645       for (int i0 = 0; i0 != x0.size(); ++i0) {
3646         for (int i3 = 0; i3 != x3.size(); ++i3) {
3647           for (int i5 = 0; i5 != x5.size(); ++i5) {
3648             for (int i2 = 0; i2 != x2.size(); ++i2) {
3649               for (int i6 = 0; i6 != x6.size(); ++i6) {
3650                 for (int i7 = 0; i7 != x7.size(); ++i7) {
3651                   odata[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i5+x4.size()*(i3+x3.size()*(i3+x1.size()*(i0)))))))]
3652                     += (-1.0) * i0data[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i0)))];
3653                 }
3654               }
3655             }
3656           }
3657         }
3658       }
3659     }
3660   }
3661   {
3662     if (x4 == x6 && x1 == x3) {
3663       std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x0, x2, x5);
3664       for (int i0 = 0; i0 != x0.size(); ++i0) {
3665         for (int i3 = 0; i3 != x3.size(); ++i3) {
3666           for (int i5 = 0; i5 != x5.size(); ++i5) {
3667             for (int i2 = 0; i2 != x2.size(); ++i2) {
3668               for (int i6 = 0; i6 != x6.size(); ++i6) {
3669                 for (int i7 = 0; i7 != x7.size(); ++i7) {
3670                   odata[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i6+x4.size()*(i3+x3.size()*(i3+x1.size()*(i0)))))))]
3671                     += (-1.0) * i0data[i7+x7.size()*(i0+x0.size()*(i2+x2.size()*(i5)))];
3672                 }
3673               }
3674             }
3675           }
3676         }
3677       }
3678     }
3679   }
3680   {
3681     if (x1 == x3) {
3682       std::unique_ptr<double[]> i0data = in(2)->get_block(x7, x6, x2, x5, x4, x0);
3683       for (int i0 = 0; i0 != x0.size(); ++i0) {
3684         for (int i3 = 0; i3 != x3.size(); ++i3) {
3685           for (int i4 = 0; i4 != x4.size(); ++i4) {
3686             for (int i5 = 0; i5 != x5.size(); ++i5) {
3687               for (int i2 = 0; i2 != x2.size(); ++i2) {
3688                 for (int i6 = 0; i6 != x6.size(); ++i6) {
3689                   for (int i7 = 0; i7 != x7.size(); ++i7) {
3690                     odata[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i3+x1.size()*(i0)))))))]
3691                       += (-1.0) * i0data[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i4+x4.size()*(i0)))))];
3692                   }
3693                 }
3694               }
3695             }
3696           }
3697         }
3698       }
3699     }
3700   }
3701   {
3702     if (x4 == x6 && x2 == x3 && x1 == x5) {
3703       std::unique_ptr<double[]> i0data = in(0)->get_block(x7, x0);
3704       for (int i0 = 0; i0 != x0.size(); ++i0) {
3705         for (int i3 = 0; i3 != x3.size(); ++i3) {
3706           for (int i5 = 0; i5 != x5.size(); ++i5) {
3707             for (int i6 = 0; i6 != x6.size(); ++i6) {
3708               for (int i7 = 0; i7 != x7.size(); ++i7) {
3709                 odata[i7+x7.size()*(i6+x6.size()*(i3+x2.size()*(i5+x5.size()*(i6+x4.size()*(i3+x3.size()*(i5+x1.size()*(i0)))))))]
3710                   += (-1.0) * i0data[i7+x7.size()*(i0)];
3711               }
3712             }
3713           }
3714         }
3715       }
3716     }
3717   }
3718   {
3719     if (x2 == x3 && x1 == x5) {
3720       std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x6, x4, x0);
3721       for (int i0 = 0; i0 != x0.size(); ++i0) {
3722         for (int i3 = 0; i3 != x3.size(); ++i3) {
3723           for (int i4 = 0; i4 != x4.size(); ++i4) {
3724             for (int i5 = 0; i5 != x5.size(); ++i5) {
3725               for (int i6 = 0; i6 != x6.size(); ++i6) {
3726                 for (int i7 = 0; i7 != x7.size(); ++i7) {
3727                   odata[i7+x7.size()*(i6+x6.size()*(i3+x2.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i5+x1.size()*(i0)))))))]
3728                     += (-1.0) * i0data[i7+x7.size()*(i6+x6.size()*(i4+x4.size()*(i0)))];
3729                 }
3730               }
3731             }
3732           }
3733         }
3734       }
3735     }
3736   }
3737   {
3738     if (x4 == x6 && x1 == x5) {
3739       std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x3, x2, x0);
3740       for (int i0 = 0; i0 != x0.size(); ++i0) {
3741         for (int i3 = 0; i3 != x3.size(); ++i3) {
3742           for (int i5 = 0; i5 != x5.size(); ++i5) {
3743             for (int i2 = 0; i2 != x2.size(); ++i2) {
3744               for (int i6 = 0; i6 != x6.size(); ++i6) {
3745                 for (int i7 = 0; i7 != x7.size(); ++i7) {
3746                   odata[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i6+x4.size()*(i3+x3.size()*(i5+x1.size()*(i0)))))))]
3747                     += (-1.0) * i0data[i7+x7.size()*(i3+x3.size()*(i2+x2.size()*(i0)))];
3748                 }
3749               }
3750             }
3751           }
3752         }
3753       }
3754     }
3755   }
3756   {
3757     if (x1 == x5) {
3758       std::unique_ptr<double[]> i0data = in(2)->get_block(x7, x6, x4, x3, x2, x0);
3759       for (int i0 = 0; i0 != x0.size(); ++i0) {
3760         for (int i3 = 0; i3 != x3.size(); ++i3) {
3761           for (int i4 = 0; i4 != x4.size(); ++i4) {
3762             for (int i5 = 0; i5 != x5.size(); ++i5) {
3763               for (int i2 = 0; i2 != x2.size(); ++i2) {
3764                 for (int i6 = 0; i6 != x6.size(); ++i6) {
3765                   for (int i7 = 0; i7 != x7.size(); ++i7) {
3766                     odata[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i5+x1.size()*(i0)))))))]
3767                       += (-1.0) * i0data[i7+x7.size()*(i6+x6.size()*(i4+x4.size()*(i3+x3.size()*(i2+x2.size()*(i0)))))];
3768                   }
3769                 }
3770               }
3771             }
3772           }
3773         }
3774       }
3775     }
3776   }
3777   {
3778     if (x4 == x5 && x2 == x3 && x1 == x6) {
3779       std::unique_ptr<double[]> i0data = in(0)->get_block(x7, x0);
3780       for (int i0 = 0; i0 != x0.size(); ++i0) {
3781         for (int i3 = 0; i3 != x3.size(); ++i3) {
3782           for (int i5 = 0; i5 != x5.size(); ++i5) {
3783             for (int i6 = 0; i6 != x6.size(); ++i6) {
3784               for (int i7 = 0; i7 != x7.size(); ++i7) {
3785                 odata[i7+x7.size()*(i6+x6.size()*(i3+x2.size()*(i5+x5.size()*(i5+x4.size()*(i3+x3.size()*(i6+x1.size()*(i0)))))))]
3786                   += (2.0) * i0data[i7+x7.size()*(i0)];
3787               }
3788             }
3789           }
3790         }
3791       }
3792     }
3793   }
3794   {
3795     if (x2 == x3 && x1 == x6) {
3796       std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x0, x4, x5);
3797       for (int i0 = 0; i0 != x0.size(); ++i0) {
3798         for (int i3 = 0; i3 != x3.size(); ++i3) {
3799           for (int i4 = 0; i4 != x4.size(); ++i4) {
3800             for (int i5 = 0; i5 != x5.size(); ++i5) {
3801               for (int i6 = 0; i6 != x6.size(); ++i6) {
3802                 for (int i7 = 0; i7 != x7.size(); ++i7) {
3803                   odata[i7+x7.size()*(i6+x6.size()*(i3+x2.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i6+x1.size()*(i0)))))))]
3804                     += (-1.0) * i0data[i7+x7.size()*(i0+x0.size()*(i4+x4.size()*(i5)))];
3805                 }
3806               }
3807             }
3808           }
3809         }
3810       }
3811     }
3812   }
3813   {
3814     if (x4 == x5 && x1 == x6) {
3815       std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x0, x2, x3);
3816       for (int i0 = 0; i0 != x0.size(); ++i0) {
3817         for (int i3 = 0; i3 != x3.size(); ++i3) {
3818           for (int i5 = 0; i5 != x5.size(); ++i5) {
3819             for (int i2 = 0; i2 != x2.size(); ++i2) {
3820               for (int i6 = 0; i6 != x6.size(); ++i6) {
3821                 for (int i7 = 0; i7 != x7.size(); ++i7) {
3822                   odata[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i5+x4.size()*(i3+x3.size()*(i6+x1.size()*(i0)))))))]
3823                     += (-1.0) * i0data[i7+x7.size()*(i0+x0.size()*(i2+x2.size()*(i3)))];
3824                 }
3825               }
3826             }
3827           }
3828         }
3829       }
3830     }
3831   }
3832   {
3833     if (x1 == x6) {
3834       std::unique_ptr<double[]> i0data = in(2)->get_block(x7, x0, x2, x5, x4, x3);
3835       for (int i0 = 0; i0 != x0.size(); ++i0) {
3836         for (int i3 = 0; i3 != x3.size(); ++i3) {
3837           for (int i4 = 0; i4 != x4.size(); ++i4) {
3838             for (int i5 = 0; i5 != x5.size(); ++i5) {
3839               for (int i2 = 0; i2 != x2.size(); ++i2) {
3840                 for (int i6 = 0; i6 != x6.size(); ++i6) {
3841                   for (int i7 = 0; i7 != x7.size(); ++i7) {
3842                     odata[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i6+x1.size()*(i0)))))))]
3843                       += (-1.0) * i0data[i7+x7.size()*(i0+x0.size()*(i2+x2.size()*(i5+x5.size()*(i4+x4.size()*(i3)))))];
3844                   }
3845                 }
3846               }
3847             }
3848           }
3849         }
3850       }
3851     }
3852   }
3853   {
3854     if (x4 == x5 && x2 == x3) {
3855       std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x6, x1, x0);
3856       for (int i0 = 0; i0 != x0.size(); ++i0) {
3857         for (int i1 = 0; i1 != x1.size(); ++i1) {
3858           for (int i3 = 0; i3 != x3.size(); ++i3) {
3859             for (int i5 = 0; i5 != x5.size(); ++i5) {
3860               for (int i6 = 0; i6 != x6.size(); ++i6) {
3861                 for (int i7 = 0; i7 != x7.size(); ++i7) {
3862                   odata[i7+x7.size()*(i6+x6.size()*(i3+x2.size()*(i5+x5.size()*(i5+x4.size()*(i3+x3.size()*(i1+x1.size()*(i0)))))))]
3863                     += (2.0) * i0data[i7+x7.size()*(i6+x6.size()*(i1+x1.size()*(i0)))];
3864                 }
3865               }
3866             }
3867           }
3868         }
3869       }
3870     }
3871   }
3872   {
3873     if (x4 == x6 && x2 == x3) {
3874       std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x5, x1, x0);
3875       for (int i0 = 0; i0 != x0.size(); ++i0) {
3876         for (int i1 = 0; i1 != x1.size(); ++i1) {
3877           for (int i3 = 0; i3 != x3.size(); ++i3) {
3878             for (int i5 = 0; i5 != x5.size(); ++i5) {
3879               for (int i6 = 0; i6 != x6.size(); ++i6) {
3880                 for (int i7 = 0; i7 != x7.size(); ++i7) {
3881                   odata[i7+x7.size()*(i6+x6.size()*(i3+x2.size()*(i5+x5.size()*(i6+x4.size()*(i3+x3.size()*(i1+x1.size()*(i0)))))))]
3882                     += (-1.0) * i0data[i7+x7.size()*(i5+x5.size()*(i1+x1.size()*(i0)))];
3883                 }
3884               }
3885             }
3886           }
3887         }
3888       }
3889     }
3890   }
3891   {
3892     if (x2 == x3) {
3893       std::unique_ptr<double[]> i0data = in(2)->get_block(x7, x6, x4, x5, x1, x0);
3894       for (int i0 = 0; i0 != x0.size(); ++i0) {
3895         for (int i1 = 0; i1 != x1.size(); ++i1) {
3896           for (int i3 = 0; i3 != x3.size(); ++i3) {
3897             for (int i4 = 0; i4 != x4.size(); ++i4) {
3898               for (int i5 = 0; i5 != x5.size(); ++i5) {
3899                 for (int i6 = 0; i6 != x6.size(); ++i6) {
3900                   for (int i7 = 0; i7 != x7.size(); ++i7) {
3901                     odata[i7+x7.size()*(i6+x6.size()*(i3+x2.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i1+x1.size()*(i0)))))))]
3902                       += (-1.0) * i0data[i7+x7.size()*(i6+x6.size()*(i4+x4.size()*(i5+x5.size()*(i1+x1.size()*(i0)))))];
3903                   }
3904                 }
3905               }
3906             }
3907           }
3908         }
3909       }
3910     }
3911   }
3912   {
3913     if (x4 == x6 && x2 == x5) {
3914       std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x3, x1, x0);
3915       for (int i0 = 0; i0 != x0.size(); ++i0) {
3916         for (int i1 = 0; i1 != x1.size(); ++i1) {
3917           for (int i3 = 0; i3 != x3.size(); ++i3) {
3918             for (int i5 = 0; i5 != x5.size(); ++i5) {
3919               for (int i6 = 0; i6 != x6.size(); ++i6) {
3920                 for (int i7 = 0; i7 != x7.size(); ++i7) {
3921                   odata[i7+x7.size()*(i6+x6.size()*(i5+x2.size()*(i5+x5.size()*(i6+x4.size()*(i3+x3.size()*(i1+x1.size()*(i0)))))))]
3922                     += (2.0) * i0data[i7+x7.size()*(i3+x3.size()*(i1+x1.size()*(i0)))];
3923                 }
3924               }
3925             }
3926           }
3927         }
3928       }
3929     }
3930   }
3931   {
3932     if (x2 == x5) {
3933       std::unique_ptr<double[]> i0data = in(2)->get_block(x7, x6, x4, x3, x1, x0);
3934       for (int i0 = 0; i0 != x0.size(); ++i0) {
3935         for (int i1 = 0; i1 != x1.size(); ++i1) {
3936           for (int i3 = 0; i3 != x3.size(); ++i3) {
3937             for (int i4 = 0; i4 != x4.size(); ++i4) {
3938               for (int i5 = 0; i5 != x5.size(); ++i5) {
3939                 for (int i6 = 0; i6 != x6.size(); ++i6) {
3940                   for (int i7 = 0; i7 != x7.size(); ++i7) {
3941                     odata[i7+x7.size()*(i6+x6.size()*(i5+x2.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i1+x1.size()*(i0)))))))]
3942                       += (2.0) * i0data[i7+x7.size()*(i6+x6.size()*(i4+x4.size()*(i3+x3.size()*(i1+x1.size()*(i0)))))];
3943                   }
3944                 }
3945               }
3946             }
3947           }
3948         }
3949       }
3950     }
3951   }
3952   {
3953     if (x4 == x5 && x2 == x6) {
3954       std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x3, x1, x0);
3955       for (int i0 = 0; i0 != x0.size(); ++i0) {
3956         for (int i1 = 0; i1 != x1.size(); ++i1) {
3957           for (int i3 = 0; i3 != x3.size(); ++i3) {
3958             for (int i5 = 0; i5 != x5.size(); ++i5) {
3959               for (int i6 = 0; i6 != x6.size(); ++i6) {
3960                 for (int i7 = 0; i7 != x7.size(); ++i7) {
3961                   odata[i7+x7.size()*(i6+x6.size()*(i6+x2.size()*(i5+x5.size()*(i5+x4.size()*(i3+x3.size()*(i1+x1.size()*(i0)))))))]
3962                     += (-1.0) * i0data[i7+x7.size()*(i3+x3.size()*(i1+x1.size()*(i0)))];
3963                 }
3964               }
3965             }
3966           }
3967         }
3968       }
3969     }
3970   }
3971   {
3972     if (x2 == x6) {
3973       std::unique_ptr<double[]> i0data = in(2)->get_block(x7, x5, x4, x3, x1, x0);
3974       for (int i0 = 0; i0 != x0.size(); ++i0) {
3975         for (int i1 = 0; i1 != x1.size(); ++i1) {
3976           for (int i3 = 0; i3 != x3.size(); ++i3) {
3977             for (int i4 = 0; i4 != x4.size(); ++i4) {
3978               for (int i5 = 0; i5 != x5.size(); ++i5) {
3979                 for (int i6 = 0; i6 != x6.size(); ++i6) {
3980                   for (int i7 = 0; i7 != x7.size(); ++i7) {
3981                     odata[i7+x7.size()*(i6+x6.size()*(i6+x2.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i1+x1.size()*(i0)))))))]
3982                       += (-1.0) * i0data[i7+x7.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i1+x1.size()*(i0)))))];
3983                   }
3984                 }
3985               }
3986             }
3987           }
3988         }
3989       }
3990     }
3991   }
3992   {
3993     if (x4 == x5) {
3994       std::unique_ptr<double[]> i0data = in(2)->get_block(x7, x6, x2, x3, x1, x0);
3995       for (int i0 = 0; i0 != x0.size(); ++i0) {
3996         for (int i1 = 0; i1 != x1.size(); ++i1) {
3997           for (int i3 = 0; i3 != x3.size(); ++i3) {
3998             for (int i5 = 0; i5 != x5.size(); ++i5) {
3999               for (int i2 = 0; i2 != x2.size(); ++i2) {
4000                 for (int i6 = 0; i6 != x6.size(); ++i6) {
4001                   for (int i7 = 0; i7 != x7.size(); ++i7) {
4002                     odata[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i5+x4.size()*(i3+x3.size()*(i1+x1.size()*(i0)))))))]
4003                       += (-1.0) * i0data[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i3+x3.size()*(i1+x1.size()*(i0)))))];
4004                   }
4005                 }
4006               }
4007             }
4008           }
4009         }
4010       }
4011     }
4012   }
4013   {
4014     if (x4 == x6) {
4015       std::unique_ptr<double[]> i0data = in(2)->get_block(x7, x3, x2, x5, x1, x0);
4016       for (int i0 = 0; i0 != x0.size(); ++i0) {
4017         for (int i1 = 0; i1 != x1.size(); ++i1) {
4018           for (int i3 = 0; i3 != x3.size(); ++i3) {
4019             for (int i5 = 0; i5 != x5.size(); ++i5) {
4020               for (int i2 = 0; i2 != x2.size(); ++i2) {
4021                 for (int i6 = 0; i6 != x6.size(); ++i6) {
4022                   for (int i7 = 0; i7 != x7.size(); ++i7) {
4023                     odata[i7+x7.size()*(i6+x6.size()*(i2+x2.size()*(i5+x5.size()*(i6+x4.size()*(i3+x3.size()*(i1+x1.size()*(i0)))))))]
4024                       += (-1.0) * i0data[i7+x7.size()*(i3+x3.size()*(i2+x2.size()*(i5+x5.size()*(i1+x1.size()*(i0)))))];
4025                   }
4026                 }
4027               }
4028             }
4029           }
4030         }
4031       }
4032     }
4033   }
4034   {
4035     std::unique_ptr<double[]> i0data = in(3)->get_block(x7, x6, x2, x5, x4, x3, x1, x0);
4036     sort_indices<0,1,2,3,4,5,6,7,1,1,-1,1>(i0data, odata, x7.size(), x6.size(), x2.size(), x5.size(), x4.size(), x3.size(), x1.size(), x0.size());
4037   }
4038   out()->add_block(odata, x7, x6, x2, x5, x4, x3, x1, x0);
4039 }
4040 
compute()4041 void Task35::Task_local::compute() {
4042   const Index x7 = b(0);
4043   const Index x0 = b(1);
4044   const Index x6 = b(2);
4045   const Index x5 = b(3);
4046   const Index x4 = b(4);
4047   const Index x3 = b(5);
4048   const Index x2 = b(6);
4049   const Index x1 = b(7);
4050   // tensor label: Gamma196
4051   std::unique_ptr<double[]> odata(new double[out()->get_size(x7, x0, x6, x5, x4, x3, x2, x1)]);
4052   std::fill_n(odata.get(), out()->get_size(x7, x0, x6, x5, x4, x3, x2, x1), 0.0);
4053   {
4054     if (x2 == x5) {
4055       std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x0, x6, x1, x4, x3);
4056       for (int i1 = 0; i1 != x1.size(); ++i1) {
4057         for (int i3 = 0; i3 != x3.size(); ++i3) {
4058           for (int i4 = 0; i4 != x4.size(); ++i4) {
4059             for (int i5 = 0; i5 != x5.size(); ++i5) {
4060               for (int i6 = 0; i6 != x6.size(); ++i6) {
4061                 for (int i0 = 0; i0 != x0.size(); ++i0) {
4062                   for (int i7 = 0; i7 != x7.size(); ++i7) {
4063                     odata[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i5+x2.size()*(i1)))))))]
4064                       += (1.0) * i0data[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i1+x1.size()*(i4+x4.size()*(i3)))))];
4065                   }
4066                 }
4067               }
4068             }
4069           }
4070         }
4071       }
4072     }
4073   }
4074   {
4075     if (x4 == x5 && x2 == x3) {
4076       std::unique_ptr<double[]> i0data = in(0)->get_block(x7, x0, x6, x1);
4077       for (int i1 = 0; i1 != x1.size(); ++i1) {
4078         for (int i3 = 0; i3 != x3.size(); ++i3) {
4079           for (int i5 = 0; i5 != x5.size(); ++i5) {
4080             for (int i6 = 0; i6 != x6.size(); ++i6) {
4081               for (int i0 = 0; i0 != x0.size(); ++i0) {
4082                 for (int i7 = 0; i7 != x7.size(); ++i7) {
4083                   odata[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i5+x5.size()*(i5+x4.size()*(i3+x3.size()*(i3+x2.size()*(i1)))))))]
4084                     += (1.0) * i0data[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i1)))];
4085                 }
4086               }
4087             }
4088           }
4089         }
4090       }
4091     }
4092   }
4093   {
4094     if (x2 == x3) {
4095       std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x0, x6, x5, x4, x1);
4096       for (int i1 = 0; i1 != x1.size(); ++i1) {
4097         for (int i3 = 0; i3 != x3.size(); ++i3) {
4098           for (int i4 = 0; i4 != x4.size(); ++i4) {
4099             for (int i5 = 0; i5 != x5.size(); ++i5) {
4100               for (int i6 = 0; i6 != x6.size(); ++i6) {
4101                 for (int i0 = 0; i0 != x0.size(); ++i0) {
4102                   for (int i7 = 0; i7 != x7.size(); ++i7) {
4103                     odata[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i5+x5.size()*(i4+x4.size()*(i3+x3.size()*(i3+x2.size()*(i1)))))))]
4104                       += (1.0) * i0data[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i5+x5.size()*(i4+x4.size()*(i1)))))];
4105                   }
4106                 }
4107               }
4108             }
4109           }
4110         }
4111       }
4112     }
4113   }
4114   {
4115     if (x4 == x5) {
4116       std::unique_ptr<double[]> i0data = in(1)->get_block(x7, x0, x6, x3, x2, x1);
4117       for (int i1 = 0; i1 != x1.size(); ++i1) {
4118         for (int i2 = 0; i2 != x2.size(); ++i2) {
4119           for (int i3 = 0; i3 != x3.size(); ++i3) {
4120             for (int i5 = 0; i5 != x5.size(); ++i5) {
4121               for (int i6 = 0; i6 != x6.size(); ++i6) {
4122                 for (int i0 = 0; i0 != x0.size(); ++i0) {
4123                   for (int i7 = 0; i7 != x7.size(); ++i7) {
4124                     odata[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i5+x5.size()*(i5+x4.size()*(i3+x3.size()*(i2+x2.size()*(i1)))))))]
4125                       += (1.0) * i0data[i7+x7.size()*(i0+x0.size()*(i6+x6.size()*(i3+x3.size()*(i2+x2.size()*(i1)))))];
4126                   }
4127                 }
4128               }
4129             }
4130           }
4131         }
4132       }
4133     }
4134   }
4135   {
4136     std::unique_ptr<double[]> i0data = in(2)->get_block(x7, x0, x6, x5, x4, x3, x2, x1);
4137     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(), x3.size(), x2.size(), x1.size());
4138   }
4139   out()->add_block(odata, x7, x0, x6, x5, x4, x3, x2, x1);
4140 }
4141 
compute()4142 void Task36::Task_local::compute() {
4143   const Index x0 = b(0);
4144   const Index x3 = b(1);
4145   const Index x2 = b(2);
4146   const Index x1 = b(3);
4147   // tensor label: Gamma152
4148   std::unique_ptr<double[]> odata(new double[out()->get_size(x0, x3, x2, x1)]);
4149   std::fill_n(odata.get(), out()->get_size(x0, x3, x2, x1), 0.0);
4150   {
4151     if (x0 == x3) {
4152       std::unique_ptr<double[]> i0data = in(1)->get_block(x2, x1);
4153       for (int i1 = 0; i1 != x1.size(); ++i1) {
4154         for (int i2 = 0; i2 != x2.size(); ++i2) {
4155           for (int i3 = 0; i3 != x3.size(); ++i3) {
4156             odata[i3+x0.size()*(i3+x3.size()*(i2+x2.size()*(i1)))]
4157               += (2.0) * i0data[i2+x2.size()*(i1)];
4158           }
4159         }
4160       }
4161     }
4162   }
4163   {
4164     // rdm0 non-merged case
4165     if (x2 == x3 && x0 == x1) {
4166       std::unique_ptr<double[]> i0data = in(0)->get_block();
4167       for (int i1 = 0; i1 != x1.size(); ++i1) {
4168         for (int i3 = 0; i3 != x3.size(); ++i3) {
4169           odata[i1+x0.size()*(i3+x3.size()*(i3+x2.size()*(i1)))]  += 2.0 * i0data[0];
4170         }
4171       }
4172     }
4173   }
4174   {
4175     if (x0 == x1) {
4176       std::unique_ptr<double[]> i0data = in(1)->get_block(x2, x3);
4177       for (int i1 = 0; i1 != x1.size(); ++i1) {
4178         for (int i2 = 0; i2 != x2.size(); ++i2) {
4179           for (int i3 = 0; i3 != x3.size(); ++i3) {
4180             odata[i1+x0.size()*(i3+x3.size()*(i2+x2.size()*(i1)))]
4181               += (-1.0) * i0data[i2+x2.size()*(i3)];
4182           }
4183         }
4184       }
4185     }
4186   }
4187   {
4188     if (x2 == x3) {
4189       std::unique_ptr<double[]> i0data = in(1)->get_block(x0, x1);
4190       for (int i1 = 0; i1 != x1.size(); ++i1) {
4191         for (int i3 = 0; i3 != x3.size(); ++i3) {
4192           for (int i0 = 0; i0 != x0.size(); ++i0) {
4193             odata[i0+x0.size()*(i3+x3.size()*(i3+x2.size()*(i1)))]
4194               += (-1.0) * i0data[i0+x0.size()*(i1)];
4195           }
4196         }
4197       }
4198     }
4199   }
4200   {
4201     std::unique_ptr<double[]> i0data = in(2)->get_block(x0, x3, x2, x1);
4202     sort_indices<0,1,2,3,1,1,-1,1>(i0data, odata, x0.size(), x3.size(), x2.size(), x1.size());
4203   }
4204   out()->add_block(odata, x0, x3, x2, x1);
4205 }
4206 
compute()4207 void Task38::Task_local::compute() {
4208   const Index c2 = b(0);
4209   const Index x1 = b(1);
4210   const Index c1 = b(2);
4211   const Index x0 = b(3);
4212   // tensor label: r
4213   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, x1, c1, x0)]);
4214   std::fill_n(odata.get(), out()->get_size(c2, x1, c1, x0), 0.0);
4215   {
4216     // tensor label: I0
4217     std::unique_ptr<double[]> i0data = in(0)->get_block(c1, c2, x0, x1);
4218     sort_indices<1,3,0,2,1,1,1,1>(i0data, odata, c1.size(), c2.size(), x0.size(), x1.size());
4219   }
4220   out()->add_block(odata, c2, x1, c1, x0);
4221 }
4222 
compute()4223 void Task39::Task_local::compute() {
4224   const Index c1 = b(0);
4225   const Index c2 = b(1);
4226   const Index x0 = b(2);
4227   const Index x1 = b(3);
4228   // tensor label: I0
4229   std::unique_ptr<double[]> odata(new double[out()->get_size(c1, c2, x0, x1)]);
4230   std::fill_n(odata.get(), out()->get_size(c1, c2, x0, x1), 0.0);
4231   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c1, c2, x0, x1)]);
4232   std::fill_n(odata_sorted.get(), out()->get_size(c1, c2, x0, x1), 0.0);
4233   for (auto& x5 : *range_[1]) {
4234     for (auto& x4 : *range_[1]) {
4235       // tensor label: Gamma0
4236       std::unique_ptr<double[]> i0data = in(0)->get_block(x0, x5, x1, x4);
4237       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x0, x5, x1, x4)]);
4238       sort_indices<1,3,0,2,0,1,1,1>(i0data, i0data_sorted, x0.size(), x5.size(), x1.size(), x4.size());
4239       // tensor label: t2
4240       std::unique_ptr<double[]> i1data = in(1)->get_block(c1, x5, c2, x4);
4241       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c1, x5, c2, x4)]);
4242       sort_indices<1,3,0,2,0,1,2,1>(i1data, i1data_sorted, c1.size(), x5.size(), c2.size(), x4.size());
4243       dgemm_("T", "N", x0.size()*x1.size(), c1.size()*c2.size(), x5.size()*x4.size(),
4244              1.0, i0data_sorted, x5.size()*x4.size(), i1data_sorted, x5.size()*x4.size(),
4245              1.0, odata_sorted, x0.size()*x1.size());
4246     }
4247   }
4248   sort_indices<2,3,0,1,1,1,1,1>(odata_sorted, odata, x0.size(), x1.size(), c1.size(), c2.size());
4249   out()->add_block(odata, c1, c2, x0, x1);
4250 }
4251 
compute()4252 void Task40::Task_local::compute() {
4253   const Index c1 = b(0);
4254   const Index c2 = b(1);
4255   const Index x0 = b(2);
4256   const Index x1 = b(3);
4257   // tensor label: I0
4258   std::unique_ptr<double[]> odata(new double[out()->get_size(c1, c2, x0, x1)]);
4259   std::fill_n(odata.get(), out()->get_size(c1, c2, x0, x1), 0.0);
4260   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c1, c2, x0, x1)]);
4261   std::fill_n(odata_sorted.get(), out()->get_size(c1, c2, x0, x1), 0.0);
4262   for (auto& x3 : *range_[1]) {
4263     for (auto& x2 : *range_[1]) {
4264       // tensor label: Gamma92
4265       std::unique_ptr<double[]> i0data = in(0)->get_block(x0, x3, x1, x2);
4266       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x0, x3, x1, x2)]);
4267       sort_indices<1,3,0,2,0,1,1,1>(i0data, i0data_sorted, x0.size(), x3.size(), x1.size(), x2.size());
4268       // tensor label: t2
4269       std::unique_ptr<double[]> i1data = in(1)->get_block(c1, x3, c2, x2);
4270       dscal_(c1.size()*x3.size()*c2.size()*x2.size(), e0_, i1data.get(), 1);
4271       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c1, x3, c2, x2)]);
4272       sort_indices<1,3,0,2,0,1,-2,1>(i1data, i1data_sorted, c1.size(), x3.size(), c2.size(), x2.size());
4273       dgemm_("T", "N", x0.size()*x1.size(), c1.size()*c2.size(), x3.size()*x2.size(),
4274              1.0, i0data_sorted, x3.size()*x2.size(), i1data_sorted, x3.size()*x2.size(),
4275              1.0, odata_sorted, x0.size()*x1.size());
4276     }
4277   }
4278   sort_indices<2,3,0,1,1,1,1,1>(odata_sorted, odata, x0.size(), x1.size(), c1.size(), c2.size());
4279   out()->add_block(odata, c1, c2, x0, x1);
4280 }
4281 
compute()4282 void Task41::Task_local::compute() {
4283   const Index c2 = b(0);
4284   const Index x1 = b(1);
4285   const Index c1 = b(2);
4286   const Index x0 = b(3);
4287   // tensor label: r
4288   std::unique_ptr<double[]> odata(new double[out()->get_size(c2, x1, c1, x0)]);
4289   std::fill_n(odata.get(), out()->get_size(c2, x1, c1, x0), 0.0);
4290   {
4291     // tensor label: I2
4292     std::unique_ptr<double[]> i0data = in(0)->get_block(c1, x0, x1, c2);
4293     sort_indices<3,2,0,1,1,1,1,1>(i0data, odata, c1.size(), x0.size(), x1.size(), c2.size());
4294   }
4295   {
4296     // tensor label: I2
4297     std::unique_ptr<double[]> i0data = in(0)->get_block(c2, x1, x0, c1);
4298     sort_indices<0,1,3,2,1,1,1,1>(i0data, odata, c2.size(), x1.size(), x0.size(), c1.size());
4299   }
4300   out()->add_block(odata, c2, x1, c1, x0);
4301 }
4302 
compute()4303 void Task42::Task_local::compute() {
4304   const Index c1 = b(0);
4305   const Index x0 = b(1);
4306   const Index x1 = b(2);
4307   const Index c2 = b(3);
4308   // tensor label: I2
4309   std::unique_ptr<double[]> odata(new double[out()->get_size(c1, x0, x1, c2)]);
4310   std::fill_n(odata.get(), out()->get_size(c1, x0, x1, c2), 0.0);
4311   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c1, x0, x1, c2)]);
4312   std::fill_n(odata_sorted.get(), out()->get_size(c1, x0, x1, c2), 0.0);
4313   for (auto& c3 : *range_[0]) {
4314     // tensor label: f1
4315     std::unique_ptr<double[]> i0data = in(0)->get_block(c2, c3);
4316     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c2, c3)]);
4317     sort_indices<1,0,0,1,1,1>(i0data, i0data_sorted, c2.size(), c3.size());
4318     // tensor label: I3
4319     std::unique_ptr<double[]> i1data = in(1)->get_block(c1, c3, x0, x1);
4320     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c1, c3, x0, x1)]);
4321     sort_indices<1,0,2,3,0,1,1,1>(i1data, i1data_sorted, c1.size(), c3.size(), x0.size(), x1.size());
4322     dgemm_("T", "N", c2.size(), c1.size()*x0.size()*x1.size(), c3.size(),
4323            1.0, i0data_sorted, c3.size(), i1data_sorted, c3.size(),
4324            1.0, odata_sorted, c2.size());
4325   }
4326   sort_indices<1,2,3,0,1,1,1,1>(odata_sorted, odata, c2.size(), c1.size(), x0.size(), x1.size());
4327   out()->add_block(odata, c1, x0, x1, c2);
4328 }
4329 
compute()4330 void Task43::Task_local::compute() {
4331   const Index c1 = b(0);
4332   const Index c3 = b(1);
4333   const Index x0 = b(2);
4334   const Index x1 = b(3);
4335   // tensor label: I3
4336   std::unique_ptr<double[]> odata(new double[out()->get_size(c1, c3, x0, x1)]);
4337   std::fill_n(odata.get(), out()->get_size(c1, c3, x0, x1), 0.0);
4338   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c1, c3, x0, x1)]);
4339   std::fill_n(odata_sorted.get(), out()->get_size(c1, c3, x0, x1), 0.0);
4340   for (auto& x3 : *range_[1]) {
4341     for (auto& x2 : *range_[1]) {
4342       // tensor label: Gamma92
4343       std::unique_ptr<double[]> i0data = in(0)->get_block(x0, x3, x1, x2);
4344       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x0, x3, x1, x2)]);
4345       sort_indices<1,3,0,2,0,1,1,1>(i0data, i0data_sorted, x0.size(), x3.size(), x1.size(), x2.size());
4346       // tensor label: t2
4347       std::unique_ptr<double[]> i1data = in(1)->get_block(c1, x3, c3, x2);
4348       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c1, x3, c3, x2)]);
4349       sort_indices<1,3,0,2,0,1,-2,1>(i1data, i1data_sorted, c1.size(), x3.size(), c3.size(), x2.size());
4350       dgemm_("T", "N", x0.size()*x1.size(), c1.size()*c3.size(), x3.size()*x2.size(),
4351              1.0, i0data_sorted, x3.size()*x2.size(), i1data_sorted, x3.size()*x2.size(),
4352              1.0, odata_sorted, x0.size()*x1.size());
4353     }
4354   }
4355   sort_indices<2,3,0,1,1,1,1,1>(odata_sorted, odata, x0.size(), x1.size(), c1.size(), c3.size());
4356   out()->add_block(odata, c1, c3, x0, x1);
4357 }
4358 
compute()4359 void Task44::Task_local::compute() {
4360   const Index c1 = b(0);
4361   const Index x0 = b(1);
4362   const Index x1 = b(2);
4363   const Index c2 = b(3);
4364   // tensor label: I2
4365   std::unique_ptr<double[]> odata(new double[out()->get_size(c1, x0, x1, c2)]);
4366   std::fill_n(odata.get(), out()->get_size(c1, x0, x1, c2), 0.0);
4367   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c1, x0, x1, c2)]);
4368   std::fill_n(odata_sorted.get(), out()->get_size(c1, x0, x1, c2), 0.0);
4369   for (auto& x2 : *range_[1]) {
4370     // tensor label: f1
4371     std::unique_ptr<double[]> i0data = in(0)->get_block(c2, x2);
4372     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(c2, x2)]);
4373     sort_indices<1,0,0,1,1,1>(i0data, i0data_sorted, c2.size(), x2.size());
4374     // tensor label: I6
4375     std::unique_ptr<double[]> i1data = in(1)->get_block(c1, x0, x1, x2);
4376     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c1, x0, x1, x2)]);
4377     sort_indices<3,0,1,2,0,1,1,1>(i1data, i1data_sorted, c1.size(), x0.size(), x1.size(), x2.size());
4378     dgemm_("T", "N", c2.size(), c1.size()*x0.size()*x1.size(), x2.size(),
4379            1.0, i0data_sorted, x2.size(), i1data_sorted, x2.size(),
4380            1.0, odata_sorted, c2.size());
4381   }
4382   sort_indices<1,2,3,0,1,1,1,1>(odata_sorted, odata, c2.size(), c1.size(), x0.size(), x1.size());
4383   out()->add_block(odata, c1, x0, x1, c2);
4384 }
4385 
compute()4386 void Task45::Task_local::compute() {
4387   const Index c1 = b(0);
4388   const Index x0 = b(1);
4389   const Index x1 = b(2);
4390   const Index x2 = b(3);
4391   // tensor label: I6
4392   std::unique_ptr<double[]> odata(new double[out()->get_size(c1, x0, x1, x2)]);
4393   std::fill_n(odata.get(), out()->get_size(c1, x0, x1, x2), 0.0);
4394   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c1, x0, x1, x2)]);
4395   std::fill_n(odata_sorted.get(), out()->get_size(c1, x0, x1, x2), 0.0);
4396   for (auto& x5 : *range_[1]) {
4397     for (auto& x4 : *range_[1]) {
4398       for (auto& x3 : *range_[1]) {
4399         // tensor label: Gamma2
4400         std::unique_ptr<double[]> i0data = in(0)->get_block(x5, x4, x0, x3, x1, x2);
4401         std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x5, x4, x0, x3, x1, x2)]);
4402         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());
4403         // tensor label: t2
4404         std::unique_ptr<double[]> i1data = in(1)->get_block(x5, x4, c1, x3);
4405         std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(x5, x4, c1, x3)]);
4406         sort_indices<0,1,3,2,0,1,1,1>(i1data, i1data_sorted, x5.size(), x4.size(), c1.size(), x3.size());
4407         dgemm_("T", "N", x0.size()*x1.size()*x2.size(), c1.size(), x5.size()*x4.size()*x3.size(),
4408                1.0, i0data_sorted, x5.size()*x4.size()*x3.size(), i1data_sorted, x5.size()*x4.size()*x3.size(),
4409                1.0, odata_sorted, x0.size()*x1.size()*x2.size());
4410       }
4411     }
4412   }
4413   sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, x0.size(), x1.size(), x2.size(), c1.size());
4414   out()->add_block(odata, c1, x0, x1, x2);
4415 }
4416 
compute()4417 void Task46::Task_local::compute() {
4418   const Index c1 = b(0);
4419   const Index x0 = b(1);
4420   const Index x1 = b(2);
4421   const Index c2 = b(3);
4422   // tensor label: I2
4423   std::unique_ptr<double[]> odata(new double[out()->get_size(c1, x0, x1, c2)]);
4424   std::fill_n(odata.get(), out()->get_size(c1, x0, x1, c2), 0.0);
4425   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c1, x0, x1, c2)]);
4426   std::fill_n(odata_sorted.get(), out()->get_size(c1, x0, x1, c2), 0.0);
4427   for (auto& x3 : *range_[1]) {
4428     for (auto& x2 : *range_[1]) {
4429       // tensor label: Gamma3
4430       std::unique_ptr<double[]> i0data = in(0)->get_block(x1, x3, x0, x2);
4431       std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x1, x3, x0, x2)]);
4432       sort_indices<1,3,0,2,0,1,1,1>(i0data, i0data_sorted, x1.size(), x3.size(), x0.size(), x2.size());
4433       // tensor label: I9
4434       std::unique_ptr<double[]> i1data = in(1)->get_block(c1, c2, x3, x2);
4435       std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c1, c2, x3, x2)]);
4436       sort_indices<2,3,0,1,0,1,1,1>(i1data, i1data_sorted, c1.size(), c2.size(), x3.size(), x2.size());
4437       dgemm_("T", "N", x1.size()*x0.size(), c1.size()*c2.size(), x3.size()*x2.size(),
4438              1.0, i0data_sorted, x3.size()*x2.size(), i1data_sorted, x3.size()*x2.size(),
4439              1.0, odata_sorted, x1.size()*x0.size());
4440     }
4441   }
4442   sort_indices<2,1,0,3,1,1,1,1>(odata_sorted, odata, x1.size(), x0.size(), c1.size(), c2.size());
4443   out()->add_block(odata, c1, x0, x1, c2);
4444 }
4445 
compute()4446 void Task47::Task_local::compute() {
4447   const Index c1 = b(0);
4448   const Index c2 = b(1);
4449   const Index x3 = b(2);
4450   const Index x2 = b(3);
4451   // tensor label: I9
4452   std::unique_ptr<double[]> odata(new double[out()->get_size(c1, c2, x3, x2)]);
4453   std::fill_n(odata.get(), out()->get_size(c1, c2, x3, x2), 0.0);
4454   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c1, c2, x3, x2)]);
4455   std::fill_n(odata_sorted.get(), out()->get_size(c1, c2, x3, x2), 0.0);
4456   for (auto& a3 : *range_[2]) {
4457     // tensor label: f1
4458     std::unique_ptr<double[]> i0data = in(0)->get_block(a3, x2);
4459     std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(a3, x2)]);
4460     sort_indices<0,1,0,1,1,1>(i0data, i0data_sorted, a3.size(), x2.size());
4461     // tensor label: t2
4462     std::unique_ptr<double[]> i1data = in(1)->get_block(c1, a3, c2, x3);
4463     std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c1, a3, c2, x3)]);
4464     sort_indices<1,0,2,3,0,1,-1,1>(i1data, i1data_sorted, c1.size(), a3.size(), c2.size(), x3.size());
4465     dgemm_("T", "N", x2.size(), c1.size()*c2.size()*x3.size(), a3.size(),
4466            1.0, i0data_sorted, a3.size(), i1data_sorted, a3.size(),
4467            1.0, odata_sorted, x2.size());
4468   }
4469   sort_indices<1,2,3,0,1,1,1,1>(odata_sorted, odata, x2.size(), c1.size(), c2.size(), x3.size());
4470   out()->add_block(odata, c1, c2, x3, x2);
4471 }
4472 
compute()4473 void Task48::Task_local::compute() {
4474   const Index c1 = b(0);
4475   const Index x2 = b(1);
4476   const Index x0 = b(2);
4477   const Index x1 = b(3);
4478   // tensor label: r
4479   std::unique_ptr<double[]> odata(new double[out()->get_size(c1, x2, x0, x1)]);
4480   std::fill_n(odata.get(), out()->get_size(c1, x2, x0, x1), 0.0);
4481   {
4482     // tensor label: I11
4483     std::unique_ptr<double[]> i0data = in(0)->get_block(c1, x2, x1, x0);
4484     sort_indices<0,1,3,2,1,1,1,1>(i0data, odata, c1.size(), x2.size(), x1.size(), x0.size());
4485   }
4486   out()->add_block(odata, c1, x2, x0, x1);
4487 }
4488 
compute()4489 void Task49::Task_local::compute() {
4490   const Index c1 = b(0);
4491   const Index x2 = b(1);
4492   const Index x1 = b(2);
4493   const Index x0 = b(3);
4494   // tensor label: I11
4495   std::unique_ptr<double[]> odata(new double[out()->get_size(c1, x2, x1, x0)]);
4496   std::fill_n(odata.get(), out()->get_size(c1, x2, x1, x0), 0.0);
4497   std::unique_ptr<double[]> odata_sorted(new double[out()->get_size(c1, x2, x1, x0)]);
4498   std::fill_n(odata_sorted.get(), out()->get_size(c1, x2, x1, x0), 0.0);
4499   for (auto& x5 : *range_[1]) {
4500     for (auto& x3 : *range_[1]) {
4501       for (auto& x4 : *range_[1]) {
4502         // tensor label: Gamma4
4503         std::unique_ptr<double[]> i0data = in(0)->get_block(x2, x5, x3, x4, x1, x0);
4504         std::unique_ptr<double[]> i0data_sorted(new double[in(0)->get_size(x2, x5, x3, x4, x1, x0)]);
4505         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());
4506         // tensor label: I12
4507         std::unique_ptr<double[]> i1data = in(1)->get_block(c1, x5, x4, x3);
4508         std::unique_ptr<double[]> i1data_sorted(new double[in(1)->get_size(c1, x5, x4, x3)]);
4509         sort_indices<1,3,2,0,0,1,1,1>(i1data, i1data_sorted, c1.size(), x5.size(), x4.size(), x3.size());
4510         dgemm_("T", "N", x2.size()*x1.size()*x0.size(), c1.size(), x5.size()*x4.size()*x3.size(),
4511                1.0, i0data_sorted, x5.size()*x4.size()*x3.size(), i1data_sorted, x5.size()*x4.size()*x3.size(),
4512                1.0, odata_sorted, x2.size()*x1.size()*x0.size());
4513       }
4514     }
4515   }
4516   sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, x2.size(), x1.size(), x0.size(), c1.size());
4517   out()->add_block(odata, c1, x2, x1, x0);
4518 }
4519 
4520 #endif
4521