source: XIOS/dev/dev_trunk_omp/src/parse_expr/filter_expr_node.cpp @ 1677

Last change on this file since 1677 was 1677, checked in by yushan, 5 years ago

MARK: Dynamic workflow graph developement. Branch up to date with trunk @1663.

File size: 14.5 KB
Line 
1#include "filter_expr_node.hpp"
2#include "unary_arithmetic_filter.hpp"
3#include "binary_arithmetic_filter.hpp"
4#include "ternary_arithmetic_filter.hpp"
5#include "field.hpp"
6
7namespace xios
8{
9  CFilterFieldExprNode::CFilterFieldExprNode(const std::string& fieldId)
10    : fieldId(fieldId)
11  { /* Nothing to do */ }
12
13 
14  std::shared_ptr<COutputPin> CFilterFieldExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
15  {
16    std::shared_ptr<COutputPin> outputPin;
17
18    if (fieldId == "this") outputPin = thisField.getSelfReference(gc);
19    else
20    {
21      string id ;
22
23      if (fieldId == "this_ref")
24      {
25        if (thisField.field_ref.isEmpty())
26        {
27          ERROR("shared_ptr<COutputPin> CFilterFieldExprNode::reduce(CGarbageCollector& gc, CField& thisField) const",
28                << "field_ref attribute is empty.");
29        }
30        else id = thisField.field_ref ;
31      }
32      else id= fieldId ;
33       
34      if (CField::has(id))
35      {
36        CField* field = CField::get(id);
37        if (field == &thisField)
38          ERROR("shared_ptr<COutputPin> CFilterFieldExprNode::reduce(CGarbageCollector& gc, CField& thisField) const",
39                << "The field " << id << " has an invalid reference to itself. "
40                << "Use the keyword \"this\" if you want to reference the input data sent to this field.");
41
42        field->buildFilterGraph(gc, false);
43        outputPin = field->getInstantDataFilter();
44      }
45      else ERROR("boost::shared_ptr<COutputPin> CFilterFieldExprNode::reduce(CGarbageCollector& gc, CField& thisField) const",
46                  << "The field " << id << " does not exist.");
47    }
48    return outputPin;
49  }
50
51
52  CFilterTemporalFieldExprNode::CFilterTemporalFieldExprNode(const std::string& fieldId)
53    : fieldId(fieldId)
54  { /* Nothing to do */ }
55
56
57  std::shared_ptr<COutputPin> CFilterTemporalFieldExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
58  {
59    std::shared_ptr<COutputPin> outputPin;
60
61    if (fieldId == "this")
62      outputPin = thisField.getSelfTemporalDataFilter(gc, thisField.freq_op.isEmpty() ? TimeStep : thisField.freq_op);
63    else
64    {
65      string id ;
66
67      if (fieldId == "this_ref")
68      {
69        if (thisField.field_ref.isEmpty())
70        {
71          ERROR("shared_ptr<COutputPin> CFilterFieldExprNode::reduce(CGarbageCollector& gc, CField& thisField) const",
72                << "field_ref attribute is empty.");
73        }
74        else id = thisField.field_ref ;
75      }
76      else id = fieldId ;
77
78      if (CField::has(id))
79      {
80        CField* field = CField::get(id);
81        if (field == &thisField)
82          ERROR("shared_ptr<COutputPin> CFilterTemporalFieldExprNode::reduce(CGarbageCollector& gc, CField& thisField) const",
83                << "The field " << fieldId << " has an invalid reference to itself. "
84                << "Use the keyword \"this\" if you want to reference the input data sent to this field.");
85
86        field->buildFilterGraph(gc, false);
87        outputPin = field->getTemporalDataFilter(gc, thisField.freq_op.isEmpty() ? TimeStep : thisField.freq_op);
88      }
89      else
90        ERROR("shared_ptr<COutputPin> CFilterTemporalFieldExprNode::reduce(CGarbageCollector& gc, CField& thisField) const",
91              << "The field " << fieldId << " does not exist.");
92    }
93    return outputPin;
94  }
95
96
97  CFilterUnaryOpExprNode::CFilterUnaryOpExprNode(const std::string& opId, IFilterExprNode* child)
98    : opId(opId)
99    , child(child)
100  {
101    if (!child)
102      ERROR("CFilterUnaryOpExprNode::CFilterUnaryOpExprNode(const std::string& opId, IFilterExprNode* child)",
103            "Impossible to create the new expression node, an invalid child node was provided.");
104  }
105
106  std::shared_ptr<COutputPin> CFilterUnaryOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
107  {
108    std::shared_ptr<CUnaryArithmeticFilter> filter(new CUnaryArithmeticFilter(gc, opId));
109    child->reduce(gc, thisField)->connectOutput(filter, 0);
110
111    (filter->parent_filters).resize(1);
112    (filter->parent_filters)[0] = child->reduce(gc, thisField);
113
114    return filter;
115  }
116
117  CFilterScalarFieldOpExprNode::CFilterScalarFieldOpExprNode(IScalarExprNode* child1, const std::string& opId, IFilterExprNode* child2)
118    : child1(child1)
119    , opId(opId)
120    , child2(child2)
121  {
122    if (!child1 || !child2)
123      ERROR("CFilterScalarFieldOpExprNode::CFilterScalarFieldOpExprNode(IScalarExprNode* child1, const std::string& opId, IFilterExprNode* child2)",
124            "Impossible to create the new expression node, an invalid child node was provided.");
125  }
126
127  std::shared_ptr<COutputPin> CFilterScalarFieldOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
128  {
129    std::shared_ptr<CScalarFieldArithmeticFilter> filter(new CScalarFieldArithmeticFilter(gc, opId, child1->reduce()));
130    child2->reduce(gc, thisField)->connectOutput(filter, 0);
131   
132    (filter->parent_filters).resize(1);
133    (filter->parent_filters)[0] = child2->reduce(gc, thisField);
134
135    return filter;
136  }
137
138  CFilterFieldScalarOpExprNode::CFilterFieldScalarOpExprNode(IFilterExprNode* child1, const std::string& opId, IScalarExprNode* child2)
139    : child1(child1)
140    , opId(opId)
141    , child2(child2)
142  {
143    if (!child1 || !child2)
144      ERROR("CFilterFieldScalarOpExprNode::CFilterFieldScalarOpExprNode(IFilterExprNode* child1, const std::string& opId, IScalarExprNode* child2)",
145            "Impossible to create the new expression node, an invalid child node was provided.");
146  }
147
148  std::shared_ptr<COutputPin> CFilterFieldScalarOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
149  {
150    std::shared_ptr<CFieldScalarArithmeticFilter> filter(new CFieldScalarArithmeticFilter(gc, opId, child2->reduce()));
151    child1->reduce(gc, thisField)->connectOutput(filter, 0);
152
153    (filter->parent_filters).resize(1);
154    (filter->parent_filters)[0] = child1->reduce(gc, thisField);
155    return filter;
156  }
157
158  CFilterFieldFieldOpExprNode::CFilterFieldFieldOpExprNode(IFilterExprNode* child1, const std::string& opId, IFilterExprNode* child2)
159    : child1(child1)
160    , opId(opId)
161    , child2(child2)
162  {
163    if (!child1 || !child2)
164      ERROR("CFilterFieldFieldOpExprNode::CFilterFieldFieldOpExprNode(IFilterExprNode* child1, const std::string& opId, IFilterExprNode* child2)",
165            "Impossible to create the new expression node, an invalid child node was provided.");
166  }
167
168  std::shared_ptr<COutputPin> CFilterFieldFieldOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
169  {
170    std::shared_ptr<CFieldFieldArithmeticFilter> filter(new CFieldFieldArithmeticFilter(gc, opId));
171    child1->reduce(gc, thisField)->connectOutput(filter, 0);
172    child2->reduce(gc, thisField)->connectOutput(filter, 1); 
173
174    (filter->parent_filters).resize(2);
175    (filter->parent_filters)[0] = child1->reduce(gc, thisField);
176    (filter->parent_filters)[1] = child2->reduce(gc, thisField);
177    return filter;
178  }
179
180
181
182
183  CFilterScalarScalarFieldOpExprNode::CFilterScalarScalarFieldOpExprNode(IScalarExprNode* child1, const std::string& opId, IScalarExprNode* child2, IFilterExprNode* child3)
184    : child1(child1)
185    , opId(opId)
186    , child2(child2)
187    , child3(child3)
188  {
189    if (!child1 || !child2 || !child3)
190      ERROR("  CFilterScalarScalarFieldOpExprNode::CFilterScalarScalarFieldOpExprNode(IScalarExprNode* child1, const std::string& opId, IScalarExprNode* child2, IFilterExprNode* child3)",
191            "Impossible to create the new expression node, an invalid child node was provided.");
192  }
193
194  std::shared_ptr<COutputPin> CFilterScalarScalarFieldOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
195  {
196    std::shared_ptr<CScalarScalarFieldArithmeticFilter> filter(new CScalarScalarFieldArithmeticFilter(gc, opId, child1->reduce(),child2->reduce()));
197    child3->reduce(gc, thisField)->connectOutput(filter, 0);
198   
199    (filter->parent_filters).resize(1);
200    (filter->parent_filters)[0] = child3->reduce(gc, thisField);
201
202    return filter;
203  }
204
205
206  CFilterScalarFieldScalarOpExprNode::CFilterScalarFieldScalarOpExprNode(IScalarExprNode* child1, const std::string& opId, IFilterExprNode* child2, IScalarExprNode* child3)
207    : child1(child1)
208    , opId(opId)
209    , child2(child2)
210    , child3(child3)
211  {
212    if (!child1 || !child2 || !child3)
213      ERROR("  CFilterScalarFieldScalarOpExprNode::CFilterScalarFieldScalarOpExprNode(IScalarExprNode* child1, const std::string& opId, IFilterExprNode* child2, IScalarExprNode* child3)",
214            "Impossible to create the new expression node, an invalid child node was provided.");
215  }
216
217  std::shared_ptr<COutputPin> CFilterScalarFieldScalarOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
218  {
219    std::shared_ptr<CScalarFieldScalarArithmeticFilter> filter(new CScalarFieldScalarArithmeticFilter(gc, opId, child1->reduce(),child3->reduce()));
220    child2->reduce(gc, thisField)->connectOutput(filter, 0);
221
222    (filter->parent_filters).resize(1);
223    (filter->parent_filters)[0] = child2->reduce(gc, thisField);
224    return filter;
225  }
226
227
228  CFilterScalarFieldFieldOpExprNode::CFilterScalarFieldFieldOpExprNode(IScalarExprNode* child1, const std::string& opId, IFilterExprNode* child2, IFilterExprNode* child3)
229    : child1(child1)
230    , opId(opId)
231    , child2(child2)
232    , child3(child3)
233  {
234    if (!child1 || !child2 || !child3)
235      ERROR("  CFilterScalarFieldFieldOpExprNode::CFilterScalarFieldFieldOpExprNode(IScalarExprNode* child1, const std::string& opId, IFilterExprNode* child2, IFilterExprNode* child3)",
236            "Impossible to create the new expression node, an invalid child node was provided.");
237  }
238
239  std::shared_ptr<COutputPin> CFilterScalarFieldFieldOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
240  {
241    std::shared_ptr<CScalarFieldFieldArithmeticFilter> filter(new CScalarFieldFieldArithmeticFilter(gc, opId, child1->reduce()));
242    child2->reduce(gc, thisField)->connectOutput(filter, 0);
243    child3->reduce(gc, thisField)->connectOutput(filter, 1);
244
245    (filter->parent_filters).resize(2);
246    (filter->parent_filters)[0] = child2->reduce(gc, thisField);
247    (filter->parent_filters)[1] = child3->reduce(gc, thisField);
248
249    return filter;
250  }
251
252
253
254  CFilterFieldScalarScalarOpExprNode::CFilterFieldScalarScalarOpExprNode(IFilterExprNode* child1, const std::string& opId, IScalarExprNode* child2, IScalarExprNode* child3)
255    : child1(child1)
256    , opId(opId)
257    , child2(child2)
258    , child3(child3)
259  {
260    if (!child1 || !child2 || !child3)
261      ERROR("  CFilterFieldScalarScalarOpExprNode::CFilterFieldScalarScalarOpExprNode(IFilterExprNode* child1, const std::string& opId, IScalarExprNode* child2, IScalarExprNode* child3)",
262            "Impossible to create the new expression node, an invalid child node was provided.");
263  }
264
265  std::shared_ptr<COutputPin> CFilterFieldScalarScalarOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
266  {
267    std::shared_ptr<CFieldScalarScalarArithmeticFilter> filter(new CFieldScalarScalarArithmeticFilter(gc, opId, child2->reduce(),child3->reduce()));
268    child1->reduce(gc, thisField)->connectOutput(filter, 0);
269
270    (filter->parent_filters).resize(1);
271    (filter->parent_filters)[0] = child1->reduce(gc, thisField);
272    return filter;
273  }
274
275
276
277  CFilterFieldScalarFieldOpExprNode::CFilterFieldScalarFieldOpExprNode(IFilterExprNode* child1, const std::string& opId, IScalarExprNode* child2, IFilterExprNode* child3)
278    : child1(child1)
279    , opId(opId)
280    , child2(child2)
281    , child3(child3)
282  {
283    if (!child1 || !child2 || !child3)
284      ERROR("  CFilterFieldScalarFieldOpExprNode::CFilterFieldScalarFieldOpExprNode(IFilterExprNode* child1, const std::string& opId, IScalarExprNode* child2, IFilterExprNode* child3)",
285            "Impossible to create the new expression node, an invalid child node was provided.");
286  }
287
288  std::shared_ptr<COutputPin> CFilterFieldScalarFieldOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
289  {
290    std::shared_ptr<CFieldScalarFieldArithmeticFilter> filter(new CFieldScalarFieldArithmeticFilter(gc, opId, child2->reduce()));
291    child1->reduce(gc, thisField)->connectOutput(filter, 0);
292    child3->reduce(gc, thisField)->connectOutput(filter, 1);
293
294    (filter->parent_filters).resize(2);
295    (filter->parent_filters)[0] = child1->reduce(gc, thisField);
296    (filter->parent_filters)[1] = child3->reduce(gc, thisField);
297
298    return filter;
299  }
300
301
302
303  CFilterFieldFieldScalarOpExprNode::CFilterFieldFieldScalarOpExprNode(IFilterExprNode* child1, const std::string& opId, IFilterExprNode* child2, IScalarExprNode* child3)
304    : child1(child1)
305    , opId(opId)
306    , child2(child2)
307    , child3(child3)
308  {
309    if (!child1 || !child2 || !child3)
310      ERROR("  CFilterFieldFieldScalarOpExprNode::CFilterFieldFieldScalarOpExprNode(IFilterExprNode* child1, const std::string& opId, IFilterExprNode* child2, IScalarExprNode* child3)",
311            "Impossible to create the new expression node, an invalid child node was provided.");
312  }
313
314  std::shared_ptr<COutputPin> CFilterFieldFieldScalarOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
315  {
316    std::shared_ptr<CFieldFieldScalarArithmeticFilter> filter(new CFieldFieldScalarArithmeticFilter(gc, opId, child3->reduce()));
317    child1->reduce(gc, thisField)->connectOutput(filter, 0);
318    child2->reduce(gc, thisField)->connectOutput(filter, 1);
319
320    (filter->parent_filters).resize(2);
321    (filter->parent_filters)[0] = child1->reduce(gc, thisField);
322    (filter->parent_filters)[1] = child2->reduce(gc, thisField);
323    return filter;
324  }
325
326
327  CFilterFieldFieldFieldOpExprNode::CFilterFieldFieldFieldOpExprNode(IFilterExprNode* child1, const std::string& opId, IFilterExprNode* child2, IFilterExprNode* child3)
328    : child1(child1)
329    , opId(opId)
330    , child2(child2)
331    , child3(child3)
332  {
333    if (!child1 || !child2 || !child3)
334      ERROR("  CFilterFieldFieldFieldOpExprNode::CFilterFieldFieldFieldOpExprNode(IFilterExprNode* child1, const std::string& opId, IFilterExprNode* child2, IFilterExprNode* child3)",
335            "Impossible to create the new expression node, an invalid child node was provided.");
336  }
337
338  std::shared_ptr<COutputPin> CFilterFieldFieldFieldOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
339  {
340    std::shared_ptr<CFieldFieldFieldArithmeticFilter> filter(new CFieldFieldFieldArithmeticFilter(gc, opId));
341    child1->reduce(gc, thisField)->connectOutput(filter, 0);
342    child2->reduce(gc, thisField)->connectOutput(filter, 1);
343    child3->reduce(gc, thisField)->connectOutput(filter, 2);
344
345    (filter->parent_filters).resize(3);
346    (filter->parent_filters)[0] = child1->reduce(gc, thisField);
347    (filter->parent_filters)[1] = child2->reduce(gc, thisField);
348    (filter->parent_filters)[2] = child3->reduce(gc, thisField);
349
350    return filter;
351  }
352 
353}
Note: See TracBrowser for help on using the repository browser.