1 //
2 // BAGEL - Brilliantly Advanced General Electronic Structure Library
3 // Filename: CASPT2_gen4.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_tasks4.h>
29 
30 using namespace std;
31 using namespace bagel;
32 using namespace bagel::SMITH;
33 using namespace bagel::SMITH::CASPT2;
34 
Task150(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)35 Task150::Task150(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
36   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
37   out_ = t[0];
38   in_ = in;
39   subtasks_.reserve(range[2]->nblock()*range[1]->nblock());
40   for (auto& a1 : *range[2])
41     for (auto& x3 : *range[1])
42       if (t[0]->is_local(x3, a1))
43         subtasks_.push_back(make_shared<Task_local>(array<const Index,2>{{x3, a1}}, in, t[0], range));
44 }
45 
Task151(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)46 Task151::Task151(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
47   array<shared_ptr<const Tensor>,1> in = {{t[1]}};
48   out_ = t[0];
49   in_ = in;
50   subtasks_.reserve(range[2]->nblock()*range[0]->nblock()*range[2]->nblock()*range[1]->nblock());
51   for (auto& a1 : *range[2])
52     for (auto& c2 : *range[0])
53       for (auto& a3 : *range[2])
54         for (auto& x3 : *range[1])
55           if (t[0]->is_local(x3, a3, c2, a1))
56             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{x3, a3, c2, a1}}, in, t[0], range));
57 }
58 
Task152(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)59 Task152::Task152(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
60   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
61   out_ = t[0];
62   in_ = in;
63   subtasks_.reserve(range[1]->nblock()*range[1]->nblock()*range[1]->nblock()*range[2]->nblock());
64   for (auto& x1 : *range[1])
65     for (auto& x2 : *range[1])
66       for (auto& x0 : *range[1])
67         for (auto& a1 : *range[2])
68           if (t[0]->is_local(a1, x0, x2, x1))
69             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a1, x0, x2, x1}}, in, t[0], range));
70 }
71 
Task153(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range,const double e)72 Task153::Task153(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range, const double e) {
73   array<shared_ptr<const Tensor>,1> in = {{t[1]}};
74   out_ = t[0];
75   in_ = in;
76   subtasks_.reserve(range[1]->nblock()*range[1]->nblock()*range[2]->nblock()*range[1]->nblock());
77   for (auto& x3 : *range[1])
78     for (auto& x4 : *range[1])
79       for (auto& a1 : *range[2])
80         for (auto& x5 : *range[1])
81           if (t[0]->is_local(x5, a1, x4, x3))
82             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{x5, a1, x4, x3}}, in, t[0], range, e));
83 }
84 
Task154(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)85 Task154::Task154(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
86   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
87   out_ = t[0];
88   in_ = in;
89   subtasks_.reserve(range[1]->nblock()*range[1]->nblock()*range[2]->nblock()*range[1]->nblock());
90   for (auto& x3 : *range[1])
91     for (auto& x4 : *range[1])
92       for (auto& a1 : *range[2])
93         for (auto& x5 : *range[1])
94           if (t[0]->is_local(x5, a1, x4, x3))
95             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{x5, a1, x4, x3}}, in, t[0], range));
96 }
97 
Task155(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)98 Task155::Task155(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
99   array<shared_ptr<const Tensor>,1> in = {{t[1]}};
100   out_ = t[0];
101   in_ = in;
102   subtasks_.reserve(range[2]->nblock()*range[0]->nblock()*range[2]->nblock()*range[0]->nblock());
103   for (auto& a2 : *range[2])
104     for (auto& c1 : *range[0])
105       for (auto& a4 : *range[2])
106         for (auto& c3 : *range[0])
107           if (t[0]->is_local(c3, a4, c1, a2))
108             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{c3, a4, c1, a2}}, in, t[0], range));
109 }
110 
Task156(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)111 Task156::Task156(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
112   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
113   out_ = t[0];
114   in_ = in;
115   subtasks_.reserve(range[0]->nblock()*range[2]->nblock()*range[0]->nblock()*range[2]->nblock());
116   for (auto& c3 : *range[0])
117     for (auto& a4 : *range[2])
118       for (auto& c1 : *range[0])
119         for (auto& a2 : *range[2])
120           if (t[0]->is_local(a2, c1, a4, c3))
121             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a2, c1, a4, c3}}, in, t[0], range));
122 }
123 
Task157(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)124 Task157::Task157(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
125   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
126   out_ = t[0];
127   in_ = in;
128   subtasks_.reserve(range[1]->nblock()*range[2]->nblock());
129   for (auto& x1 : *range[1])
130     for (auto& a2 : *range[2])
131       if (t[0]->is_local(a2, x1))
132         subtasks_.push_back(make_shared<Task_local>(array<const Index,2>{{a2, x1}}, in, t[0], range));
133 }
134 
Task158(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)135 Task158::Task158(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
136   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
137   out_ = t[0];
138   in_ = in;
139   subtasks_.reserve(range[0]->nblock()*range[2]->nblock()*range[0]->nblock()*range[2]->nblock());
140   for (auto& c3 : *range[0])
141     for (auto& a4 : *range[2])
142       for (auto& c1 : *range[0])
143         for (auto& a2 : *range[2])
144           if (t[0]->is_local(a2, c1, a4, c3))
145             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a2, c1, a4, c3}}, in, t[0], range));
146 }
147 
Task159(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)148 Task159::Task159(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
149   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
150   out_ = t[0];
151   in_ = in;
152   subtasks_.reserve(range[1]->nblock()*range[2]->nblock());
153   for (auto& x1 : *range[1])
154     for (auto& a4 : *range[2])
155       if (t[0]->is_local(a4, x1))
156         subtasks_.push_back(make_shared<Task_local>(array<const Index,2>{{a4, x1}}, in, t[0], range));
157 }
158 
Task160(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)159 Task160::Task160(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
160   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
161   out_ = t[0];
162   in_ = in;
163   subtasks_.reserve(range[0]->nblock()*range[2]->nblock()*range[0]->nblock()*range[2]->nblock());
164   for (auto& c3 : *range[0])
165     for (auto& a4 : *range[2])
166       for (auto& c1 : *range[0])
167         for (auto& a2 : *range[2])
168           if (t[0]->is_local(a2, c1, a4, c3))
169             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a2, c1, a4, c3}}, in, t[0], range));
170 }
171 
Task161(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)172 Task161::Task161(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
173   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
174   out_ = t[0];
175   in_ = in;
176   subtasks_.reserve(range[0]->nblock()*range[2]->nblock());
177   for (auto& c1 : *range[0])
178     for (auto& a4 : *range[2])
179       if (t[0]->is_local(a4, c1))
180         subtasks_.push_back(make_shared<Task_local>(array<const Index,2>{{a4, c1}}, in, t[0], range));
181 }
182 
Task162(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)183 Task162::Task162(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
184   array<shared_ptr<const Tensor>,1> in = {{t[1]}};
185   out_ = t[0];
186   in_ = in;
187   subtasks_.reserve(range[1]->nblock()*range[0]->nblock()*range[2]->nblock()*range[1]->nblock());
188   for (auto& x0 : *range[1])
189     for (auto& c1 : *range[0])
190       for (auto& a4 : *range[2])
191         for (auto& x1 : *range[1])
192           if (t[0]->is_local(x1, a4, c1, x0))
193             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{x1, a4, c1, x0}}, in, t[0], range));
194 }
195 
Task163(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)196 Task163::Task163(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
197   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
198   out_ = t[0];
199   in_ = in;
200   subtasks_.reserve(range[0]->nblock()*range[2]->nblock()*range[0]->nblock()*range[2]->nblock());
201   for (auto& c3 : *range[0])
202     for (auto& a4 : *range[2])
203       for (auto& c1 : *range[0])
204         for (auto& a2 : *range[2])
205           if (t[0]->is_local(a2, c1, a4, c3))
206             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a2, c1, a4, c3}}, in, t[0], range));
207 }
208 
Task164(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)209 Task164::Task164(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
210   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
211   out_ = t[0];
212   in_ = in;
213   subtasks_.reserve(range[0]->nblock()*range[2]->nblock());
214   for (auto& c1 : *range[0])
215     for (auto& a2 : *range[2])
216       if (t[0]->is_local(a2, c1))
217         subtasks_.push_back(make_shared<Task_local>(array<const Index,2>{{a2, c1}}, in, t[0], range));
218 }
219 
Task165(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)220 Task165::Task165(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
221   array<shared_ptr<const Tensor>,1> in = {{t[1]}};
222   out_ = t[0];
223   in_ = in;
224   subtasks_.reserve(range[1]->nblock()*range[0]->nblock()*range[2]->nblock()*range[1]->nblock());
225   for (auto& x0 : *range[1])
226     for (auto& c1 : *range[0])
227       for (auto& a2 : *range[2])
228         for (auto& x1 : *range[1])
229           if (t[0]->is_local(x1, a2, c1, x0))
230             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{x1, a2, c1, x0}}, in, t[0], range));
231 }
232 
Task166(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)233 Task166::Task166(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
234   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
235   out_ = t[0];
236   in_ = in;
237   subtasks_.reserve(range[0]->nblock()*range[2]->nblock()*range[0]->nblock()*range[2]->nblock());
238   for (auto& c3 : *range[0])
239     for (auto& a4 : *range[2])
240       for (auto& c1 : *range[0])
241         for (auto& a2 : *range[2])
242           if (t[0]->is_local(a2, c1, a4, c3))
243             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a2, c1, a4, c3}}, in, t[0], range));
244 }
245 
Task167(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)246 Task167::Task167(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
247   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
248   out_ = t[0];
249   in_ = in;
250   subtasks_.reserve(range[1]->nblock()*range[0]->nblock());
251   for (auto& x1 : *range[1])
252     for (auto& c3 : *range[0])
253       if (t[0]->is_local(c3, x1))
254         subtasks_.push_back(make_shared<Task_local>(array<const Index,2>{{c3, x1}}, in, t[0], range));
255 }
256 
Task168(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)257 Task168::Task168(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
258   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
259   out_ = t[0];
260   in_ = in;
261   subtasks_.reserve(range[0]->nblock()*range[2]->nblock()*range[0]->nblock()*range[2]->nblock());
262   for (auto& c3 : *range[0])
263     for (auto& a4 : *range[2])
264       for (auto& c1 : *range[0])
265         for (auto& a2 : *range[2])
266           if (t[0]->is_local(a2, c1, a4, c3))
267             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a2, c1, a4, c3}}, in, t[0], range));
268 }
269 
Task169(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)270 Task169::Task169(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
271   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
272   out_ = t[0];
273   in_ = in;
274   subtasks_.reserve(range[1]->nblock()*range[0]->nblock());
275   for (auto& x1 : *range[1])
276     for (auto& c3 : *range[0])
277       if (t[0]->is_local(c3, x1))
278         subtasks_.push_back(make_shared<Task_local>(array<const Index,2>{{c3, x1}}, in, t[0], range));
279 }
280 
Task170(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)281 Task170::Task170(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
282   array<shared_ptr<const Tensor>,1> in = {{t[1]}};
283   out_ = t[0];
284   in_ = in;
285   subtasks_.reserve(range[2]->nblock()*range[1]->nblock()*range[2]->nblock()*range[0]->nblock());
286   for (auto& a1 : *range[2])
287     for (auto& x0 : *range[1])
288       for (auto& a3 : *range[2])
289         for (auto& c2 : *range[0])
290           if (t[0]->is_local(c2, a3, x0, a1))
291             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{c2, a3, x0, a1}}, in, t[0], range));
292 }
293 
Task171(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)294 Task171::Task171(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
295   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
296   out_ = t[0];
297   in_ = in;
298   subtasks_.reserve(range[2]->nblock()*range[1]->nblock()*range[0]->nblock()*range[2]->nblock());
299   for (auto& a1 : *range[2])
300     for (auto& x0 : *range[1])
301       for (auto& c2 : *range[0])
302         for (auto& a3 : *range[2])
303           if (t[0]->is_local(a3, c2, x0, a1))
304             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a3, c2, x0, a1}}, in, t[0], range));
305 }
306 
Task172(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)307 Task172::Task172(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
308   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
309   out_ = t[0];
310   in_ = in;
311   subtasks_.reserve(range[1]->nblock()*range[1]->nblock()*range[0]->nblock()*range[2]->nblock());
312   for (auto& x0 : *range[1])
313     for (auto& x1 : *range[1])
314       for (auto& c2 : *range[0])
315         for (auto& a3 : *range[2])
316           if (t[0]->is_local(a3, c2, x1, x0))
317             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a3, c2, x1, x0}}, in, t[0], range));
318 }
319 
Task173(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)320 Task173::Task173(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
321   array<shared_ptr<const Tensor>,1> in = {{t[1]}};
322   out_ = t[0];
323   in_ = in;
324   subtasks_.reserve(range[1]->nblock()*range[0]->nblock()*range[2]->nblock()*range[1]->nblock());
325   for (auto& x2 : *range[1])
326     for (auto& c2 : *range[0])
327       for (auto& a3 : *range[2])
328         for (auto& x3 : *range[1])
329           if (t[0]->is_local(x3, a3, c2, x2))
330             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{x3, a3, c2, x2}}, in, t[0], range));
331 }
332 
Task174(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)333 Task174::Task174(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
334   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
335   out_ = t[0];
336   in_ = in;
337   subtasks_.reserve(range[2]->nblock()*range[1]->nblock()*range[0]->nblock()*range[2]->nblock());
338   for (auto& a1 : *range[2])
339     for (auto& x0 : *range[1])
340       for (auto& c2 : *range[0])
341         for (auto& a3 : *range[2])
342           if (t[0]->is_local(a3, c2, x0, a1))
343             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a3, c2, x0, a1}}, in, t[0], range));
344 }
345 
Task175(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)346 Task175::Task175(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
347   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
348   out_ = t[0];
349   in_ = in;
350   subtasks_.reserve(range[1]->nblock()*range[1]->nblock()*range[0]->nblock()*range[2]->nblock());
351   for (auto& x1 : *range[1])
352     for (auto& x0 : *range[1])
353       for (auto& c2 : *range[0])
354         for (auto& a1 : *range[2])
355           if (t[0]->is_local(a1, c2, x0, x1))
356             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a1, c2, x0, x1}}, in, t[0], range));
357 }
358 
Task176(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)359 Task176::Task176(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
360   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
361   out_ = t[0];
362   in_ = in;
363   subtasks_.reserve(range[1]->nblock()*range[1]->nblock()*range[0]->nblock()*range[2]->nblock());
364   for (auto& x1 : *range[1])
365     for (auto& x0 : *range[1])
366       for (auto& c2 : *range[0])
367         for (auto& a1 : *range[2])
368           if (t[0]->is_local(a1, c2, x0, x1))
369             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a1, c2, x0, x1}}, in, t[0], range));
370 }
371 
Task177(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)372 Task177::Task177(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
373   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
374   out_ = t[0];
375   in_ = in;
376   subtasks_.reserve(range[2]->nblock()*range[1]->nblock()*range[0]->nblock()*range[2]->nblock());
377   for (auto& a1 : *range[2])
378     for (auto& x0 : *range[1])
379       for (auto& c2 : *range[0])
380         for (auto& a3 : *range[2])
381           if (t[0]->is_local(a3, c2, x0, a1))
382             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a3, c2, x0, a1}}, in, t[0], range));
383 }
384 
Task178(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)385 Task178::Task178(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
386   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
387   out_ = t[0];
388   in_ = in;
389   subtasks_.reserve(range[1]->nblock()*range[2]->nblock());
390   for (auto& x0 : *range[1])
391     for (auto& a3 : *range[2])
392       if (t[0]->is_local(a3, x0))
393         subtasks_.push_back(make_shared<Task_local>(array<const Index,2>{{a3, x0}}, in, t[0], range));
394 }
395 
Task179(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)396 Task179::Task179(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
397   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
398   out_ = t[0];
399   in_ = in;
400   subtasks_.reserve(range[2]->nblock()*range[1]->nblock()*range[0]->nblock()*range[2]->nblock());
401   for (auto& a1 : *range[2])
402     for (auto& x0 : *range[1])
403       for (auto& c2 : *range[0])
404         for (auto& a3 : *range[2])
405           if (t[0]->is_local(a3, c2, x0, a1))
406             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a3, c2, x0, a1}}, in, t[0], range));
407 }
408 
Task180(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)409 Task180::Task180(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
410   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
411   out_ = t[0];
412   in_ = in;
413   subtasks_.reserve(range[1]->nblock()*range[2]->nblock());
414   for (auto& x0 : *range[1])
415     for (auto& a1 : *range[2])
416       if (t[0]->is_local(a1, x0))
417         subtasks_.push_back(make_shared<Task_local>(array<const Index,2>{{a1, x0}}, in, t[0], range));
418 }
419 
Task181(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)420 Task181::Task181(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
421   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
422   out_ = t[0];
423   in_ = in;
424   subtasks_.reserve(range[2]->nblock()*range[1]->nblock()*range[0]->nblock()*range[2]->nblock());
425   for (auto& a1 : *range[2])
426     for (auto& x0 : *range[1])
427       for (auto& c2 : *range[0])
428         for (auto& a3 : *range[2])
429           if (t[0]->is_local(a3, c2, x0, a1))
430             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a3, c2, x0, a1}}, in, t[0], range));
431 }
432 
Task182(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)433 Task182::Task182(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
434   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
435   out_ = t[0];
436   in_ = in;
437   subtasks_.reserve(range[1]->nblock()*range[0]->nblock());
438   for (auto& x0 : *range[1])
439     for (auto& c4 : *range[0])
440       if (t[0]->is_local(c4, x0))
441         subtasks_.push_back(make_shared<Task_local>(array<const Index,2>{{c4, x0}}, in, t[0], range));
442 }
443 
Task183(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)444 Task183::Task183(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
445   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
446   out_ = t[0];
447   in_ = in;
448   subtasks_.reserve(range[2]->nblock()*range[1]->nblock()*range[0]->nblock()*range[2]->nblock());
449   for (auto& a1 : *range[2])
450     for (auto& x0 : *range[1])
451       for (auto& c2 : *range[0])
452         for (auto& a3 : *range[2])
453           if (t[0]->is_local(a3, c2, x0, a1))
454             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a3, c2, x0, a1}}, in, t[0], range));
455 }
456 
Task184(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)457 Task184::Task184(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
458   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
459   out_ = t[0];
460   in_ = in;
461   subtasks_.reserve(range[1]->nblock()*range[0]->nblock());
462   for (auto& x0 : *range[1])
463     for (auto& c4 : *range[0])
464       if (t[0]->is_local(c4, x0))
465         subtasks_.push_back(make_shared<Task_local>(array<const Index,2>{{c4, x0}}, in, t[0], range));
466 }
467 
Task185(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)468 Task185::Task185(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
469   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
470   out_ = t[0];
471   in_ = in;
472   subtasks_.reserve(range[2]->nblock()*range[1]->nblock()*range[0]->nblock()*range[2]->nblock());
473   for (auto& a1 : *range[2])
474     for (auto& x0 : *range[1])
475       for (auto& c2 : *range[0])
476         for (auto& a3 : *range[2])
477           if (t[0]->is_local(a3, c2, x0, a1))
478             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a3, c2, x0, a1}}, in, t[0], range));
479 }
480 
Task186(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)481 Task186::Task186(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
482   array<shared_ptr<const Tensor>,1> in = {{t[1]}};
483   out_ = t[0];
484   in_ = in;
485   subtasks_.reserve(range[2]->nblock()*range[0]->nblock()*range[2]->nblock()*range[1]->nblock());
486   for (auto& a1 : *range[2])
487     for (auto& c2 : *range[0])
488       for (auto& a3 : *range[2])
489         for (auto& x3 : *range[1])
490           if (t[0]->is_local(x3, a3, c2, a1))
491             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{x3, a3, c2, a1}}, in, t[0], range));
492 }
493 
Task187(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)494 Task187::Task187(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
495   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
496   out_ = t[0];
497   in_ = in;
498   subtasks_.reserve(range[2]->nblock()*range[1]->nblock()*range[0]->nblock()*range[2]->nblock());
499   for (auto& a1 : *range[2])
500     for (auto& x0 : *range[1])
501       for (auto& c2 : *range[0])
502         for (auto& a3 : *range[2])
503           if (t[0]->is_local(a3, c2, x0, a1))
504             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a3, c2, x0, a1}}, in, t[0], range));
505 }
506 
Task188(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)507 Task188::Task188(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
508   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
509   out_ = t[0];
510   in_ = in;
511   subtasks_.reserve(range[1]->nblock()*range[2]->nblock()*range[0]->nblock()*range[2]->nblock());
512   for (auto& x0 : *range[1])
513     for (auto& a1 : *range[2])
514       for (auto& c4 : *range[0])
515         for (auto& a3 : *range[2])
516           if (t[0]->is_local(a3, c4, a1, x0))
517             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a3, c4, a1, x0}}, in, t[0], range));
518 }
519 
Task189(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)520 Task189::Task189(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
521   array<shared_ptr<const Tensor>,1> in = {{t[1]}};
522   out_ = t[0];
523   in_ = in;
524   subtasks_.reserve(range[2]->nblock()*range[0]->nblock()*range[2]->nblock()*range[1]->nblock());
525   for (auto& a1 : *range[2])
526     for (auto& c4 : *range[0])
527       for (auto& a3 : *range[2])
528         for (auto& x1 : *range[1])
529           if (t[0]->is_local(x1, a3, c4, a1))
530             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{x1, a3, c4, a1}}, in, t[0], range));
531 }
532 
Task190(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)533 Task190::Task190(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
534   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
535   out_ = t[0];
536   in_ = in;
537   subtasks_.reserve(range[2]->nblock()*range[1]->nblock()*range[0]->nblock()*range[2]->nblock());
538   for (auto& a1 : *range[2])
539     for (auto& x0 : *range[1])
540       for (auto& c2 : *range[0])
541         for (auto& a3 : *range[2])
542           if (t[0]->is_local(a3, c2, x0, a1))
543             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a3, c2, x0, a1}}, in, t[0], range));
544 }
545 
Task191(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)546 Task191::Task191(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
547   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
548   out_ = t[0];
549   in_ = in;
550   subtasks_.reserve(range[1]->nblock()*range[2]->nblock()*range[0]->nblock()*range[2]->nblock());
551   for (auto& x0 : *range[1])
552     for (auto& a3 : *range[2])
553       for (auto& c2 : *range[0])
554         for (auto& a4 : *range[2])
555           if (t[0]->is_local(a4, c2, a3, x0))
556             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a4, c2, a3, x0}}, in, t[0], range));
557 }
558 
Task192(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)559 Task192::Task192(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
560   array<shared_ptr<const Tensor>,1> in = {{t[1]}};
561   out_ = t[0];
562   in_ = in;
563   subtasks_.reserve(range[2]->nblock()*range[0]->nblock()*range[2]->nblock()*range[1]->nblock());
564   for (auto& a3 : *range[2])
565     for (auto& c2 : *range[0])
566       for (auto& a4 : *range[2])
567         for (auto& x1 : *range[1])
568           if (t[0]->is_local(x1, a4, c2, a3))
569             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{x1, a4, c2, a3}}, in, t[0], range));
570 }
571 
Task193(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)572 Task193::Task193(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
573   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
574   out_ = t[0];
575   in_ = in;
576   subtasks_.reserve(range[2]->nblock()*range[1]->nblock()*range[0]->nblock()*range[2]->nblock());
577   for (auto& a1 : *range[2])
578     for (auto& x0 : *range[1])
579       for (auto& c2 : *range[0])
580         for (auto& a3 : *range[2])
581           if (t[0]->is_local(a3, c2, x0, a1))
582             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a3, c2, x0, a1}}, in, t[0], range));
583 }
584 
Task194(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)585 Task194::Task194(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
586   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
587   out_ = t[0];
588   in_ = in;
589   subtasks_.reserve(range[1]->nblock()*range[2]->nblock()*range[0]->nblock()*range[2]->nblock());
590   for (auto& x0 : *range[1])
591     for (auto& a1 : *range[2])
592       for (auto& c2 : *range[0])
593         for (auto& a4 : *range[2])
594           if (t[0]->is_local(a4, c2, a1, x0))
595             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a4, c2, a1, x0}}, in, t[0], range));
596 }
597 
Task195(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)598 Task195::Task195(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
599   array<shared_ptr<const Tensor>,1> in = {{t[1]}};
600   out_ = t[0];
601   in_ = in;
602   subtasks_.reserve(range[2]->nblock()*range[0]->nblock()*range[2]->nblock()*range[1]->nblock());
603   for (auto& a1 : *range[2])
604     for (auto& c2 : *range[0])
605       for (auto& a4 : *range[2])
606         for (auto& x1 : *range[1])
607           if (t[0]->is_local(x1, a4, c2, a1))
608             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{x1, a4, c2, a1}}, in, t[0], range));
609 }
610 
Task196(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)611 Task196::Task196(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
612   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
613   out_ = t[0];
614   in_ = in;
615   subtasks_.reserve(range[2]->nblock()*range[1]->nblock()*range[0]->nblock()*range[2]->nblock());
616   for (auto& a1 : *range[2])
617     for (auto& x0 : *range[1])
618       for (auto& c2 : *range[0])
619         for (auto& a3 : *range[2])
620           if (t[0]->is_local(a3, c2, x0, a1))
621             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a3, c2, x0, a1}}, in, t[0], range));
622 }
623 
Task197(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)624 Task197::Task197(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
625   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
626   out_ = t[0];
627   in_ = in;
628   subtasks_.reserve(range[1]->nblock()*range[1]->nblock()*range[2]->nblock()*range[2]->nblock());
629   for (auto& x1 : *range[1])
630     for (auto& x0 : *range[1])
631       for (auto& a3 : *range[2])
632         for (auto& a1 : *range[2])
633           if (t[0]->is_local(a1, a3, x0, x1))
634             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a1, a3, x0, x1}}, in, t[0], range));
635 }
636 
Task198(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range)637 Task198::Task198(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range) {
638   array<shared_ptr<const Tensor>,2> in = {{t[1], t[2]}};
639   out_ = t[0];
640   in_ = in;
641   subtasks_.reserve(range[2]->nblock()*range[1]->nblock()*range[0]->nblock()*range[2]->nblock());
642   for (auto& a1 : *range[2])
643     for (auto& x0 : *range[1])
644       for (auto& c2 : *range[0])
645         for (auto& a3 : *range[2])
646           if (t[0]->is_local(a3, c2, x0, a1))
647             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{a3, c2, x0, a1}}, in, t[0], range));
648 }
649 
Task199(vector<shared_ptr<Tensor>> t,array<shared_ptr<const IndexRange>,3> range,const double e)650 Task199::Task199(vector<shared_ptr<Tensor>> t, array<shared_ptr<const IndexRange>,3> range, const double e) {
651   array<shared_ptr<const Tensor>,1> in = {{t[1]}};
652   out_ = t[0];
653   in_ = in;
654   subtasks_.reserve(range[2]->nblock()*range[0]->nblock()*range[2]->nblock()*range[1]->nblock());
655   for (auto& a1 : *range[2])
656     for (auto& c2 : *range[0])
657       for (auto& a3 : *range[2])
658         for (auto& x1 : *range[1])
659           if (t[0]->is_local(x1, a3, c2, a1))
660             subtasks_.push_back(make_shared<Task_local>(array<const Index,4>{{x1, a3, c2, a1}}, in, t[0], range, e));
661 }
662 
663 #endif
664