escript  Revision_Unversioneddirectory
DataLazy.h
Go to the documentation of this file.
1 
2 /*****************************************************************************
3 *
4 * Copyright (c) 2003-2016 by The University of Queensland
5 * http://www.uq.edu.au
6 *
7 * Primary Business: Queensland, Australia
8 * Licensed under the Apache License, version 2.0
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Development until 2012 by Earth Systems Science Computational Center (ESSCC)
12 * Development 2012-2013 by School of Earth Sciences
13 * Development from 2014 by Centre for Geoscience Computing (GeoComp)
14 *
15 *****************************************************************************/
16 
17 
18 #if !defined escript_DataLazy_20081008_H
19 #define escript_DataLazy_20081008_H
20 #include "system_dep.h"
21 
22 #include "DataAbstract.h"
23 
24 #include <string>
25 #include <functional>
26 
27 #include "LocalOps.h" // for tensor_binary_op
28 #include "DataVector.h" // for ElementType
29 
30 
31 //#define LAZY_NODE_STORAGE
32 
33 namespace escript {
34 
35 // For the purposes of unit testing and maintaining sanity, it is important that this enum be contiguous
37 {
40  ADD=2,
41  SUB=3,
42  MUL=4,
43  DIV=5,
44  POW=6,
45  SIN=POW+1,
46  COS=SIN+1,
47  TAN=SIN+2,
48  ASIN=SIN+3,
49  ACOS=SIN+4,
50  ATAN=SIN+5,
51  SINH=SIN+6,
52  COSH=SIN+7,
53  TANH=SIN+8,
54  ERF=SIN+9,
55  ASINH=SIN+10,
56  ACOSH=SIN+11,
57  ATANH=SIN+12,
67  GZ=RECIP+1,
68  LZ=GZ+1,
69  GEZ=GZ+2,
70  LEZ=GZ+3,
71  NEZ=GZ+4,
72  EZ=GZ+5,
73  SYM=EZ+1,
74  NSYM=SYM+1,
82 };
83 
85 const std::string&
87 
97 class DataLazy;
98 
101 
102 class DataLazy : public DataAbstract
103 {
104 
105 typedef DataAbstract parent;
108 
109 public:
117 
118 
128 
138  DataLazy(DataAbstract_ptr left, ES_optype op, double tol);
139 
149  DataLazy(DataAbstract_ptr left, ES_optype op, int axis_offset);
150 
151 
161 
172  DataLazy(DataAbstract_ptr left, DataAbstract_ptr right, ES_optype op, int axis_offset, int transpose);
173 
184  DataLazy(DataAbstract_ptr left, ES_optype op, const int axis0, const int axis1);
185 
193  DataLazy(DataAbstract_ptr mask, DataAbstract_ptr left, DataAbstract_ptr right/*, double tol*/);
194 
196  ~DataLazy();
197 
204  resolve();
205 
207  std::string
208  toString() const;
209 
211  DataAbstract*
212  deepCopy();
213 
214 
221  getLength() const;
222 
223 
225  DataAbstract*
226  getSlice(const DataTypes::RegionType& region) const;
227 
228 
230  getPointOffset(int sampleNo,
231  int dataPointNo) const;
232 
234  getPointOffset(int sampleNo,
235  int dataPointNo);
236 
241  size_t
242  getMaxSampleSize() const;
243 
253  const ValueType*
254  resolveSample(int sampleNo, size_t& roffset) const;
255 
260  bool
261  actsExpanded() const;
262 
268  virtual void
269  setToZero();
270 
271 
273  void
274  resolveGroupWorker(std::vector<DataLazy*>& dats);
275 
276 
277 private:
278  mutable DataReady_ptr m_id; // For IDENTITY nodes, stores a wrapped value.
279  mutable DataLazy_ptr m_left, m_right, m_mask; // operands for operation.
280  mutable ES_optype m_op; // operation to perform.
281 
282  size_t m_samplesize; // number of values required to store a sample
283 
284  char m_readytype; // E for expanded, T for tagged, C for constant
285 
286  int m_axis_offset; // required extra info for general tensor product
287  int m_transpose; // offset and transpose are used for swapaxes as well
288  int m_SL, m_SM, m_SR; // computed properties used in general tensor product
289 
290 
291  double m_tol; // required extra info for <>0 and ==0
292 
293  size_t m_children;
294  size_t m_height;
295 
296  int* m_sampleids; // may be NULL
298 
302  void LazyNodeSetup();
303 
304 
305  const DataTypes::ValueType*
306  resolveNodeUnary(int tid, int sampleNo, size_t& roffset) const;
307 
308 
309  const DataTypes::ValueType*
310  resolveNodeReduction(int tid, int sampleNo, size_t& roffset) const;
311 
312  const DataTypes::ValueType*
313  resolveNodeSample(int tid, int sampleNo, size_t& roffset) const;
314 
315  const DataTypes::ValueType*
316  resolveNodeBinary(int tid, int sampleNo, size_t& roffset) const;
317 
318  const DataTypes::ValueType*
319  resolveNodeNP1OUT(int tid, int sampleNo, size_t& roffset) const;
320 
321  const DataTypes::ValueType*
322  resolveNodeNP1OUT_P(int tid, int sampleNo, size_t& roffset) const;
323 
324  const DataTypes::ValueType*
325  resolveNodeTProd(int tid, int sampleNo, size_t& roffset) const;
326 
327  const DataTypes::ValueType*
328  resolveNodeNP1OUT_2P(int tid, int sampleNo, size_t& roffset) const;
329 
330  const DataTypes::ValueType*
331  resolveNodeCondEval(int tid, int sampleNo, size_t& roffset) const;
332 
336  void
337  intoString(std::ostringstream& oss) const;
338 
342  void
343  intoTreeString(std::ostringstream& oss,std::string indent) const;
344 
351  void
352  collapse() const; // converts the node into an IDENTITY node
353 
354 
361  collapseToReady() const;
362 
367  void
368  resolveToIdentity();
369 
373  void
374  makeIdentity(const DataReady_ptr& p);
375 
376 
381  resolveNodeWorker();
382 
383 };
384 
385 }
386 #endif
DataVector implements an arbitrarily long vector of data values. DataVector is the underlying data co...
Definition: DataVector.h:44
Definition: DataLazy.h:55
Definition: DataLazy.h:74
#define POINTER_WRAPPER_CLASS(x)
Definition: Pointers.h:32
Definition: DataLazy.h:49
const std::string & opToString(ES_optype op)
Definition: DataLazy.cpp:443
int m_axis_offset
Definition: DataLazy.h:286
ES_optype m_op
Definition: DataLazy.h:280
Definition: DataLazy.h:48
Definition: DataLazy.h:52
size_t m_height
Definition: DataLazy.h:294
DataReady_ptr m_id
Definition: DataLazy.h:278
Definition: DataLazy.h:57
Definition: DataLazy.h:51
Definition: DataLazy.h:66
std::vector< std::pair< int, int > > RegionType
Definition: DataTypes.h:39
Definition: AbstractContinuousDomain.cpp:24
int getLength(const escript::Data *data)
Definition: DataC.cpp:92
Definition: DataLazy.h:80
Definition: DataLazy.h:58
Definition: DataLazy.h:76
void transpose(const DataTypes::ValueType &in, const DataTypes::ShapeType &inShape, DataTypes::ValueType::size_type inOffset, DataTypes::ValueType &ev, const DataTypes::ShapeType &evShape, DataTypes::ValueType::size_type evOffset, int axis_offset)
Transpose each data point of this Data object around the given axis.
Definition: DataMaths.h:394
Definition: DataLazy.h:40
DataVector m_samples
Definition: DataLazy.h:297
char m_readytype
Definition: DataLazy.h:284
Definition: DataLazy.h:61
Definition: DataLazy.h:42
Definition: DataLazy.h:47
Definition: DataLazy.h:72
std::vector< int > ShapeType
The shape of a single datapoint.
Definition: DataTypes.h:38
Definition: DataLazy.h:43
boost::shared_ptr< DataAbstract > DataAbstract_ptr
Definition: DataAbstract.h:51
Definition: DataLazy.h:50
Definition: DataLazy.h:70
Describes binary operations performed on double*.
DataLazy_ptr m_right
Definition: DataLazy.h:279
Definition: DataLazy.h:59
Definition: DataLazy.h:81
Definition: DataLazy.h:67
Definition: DataLazy.h:64
Definition: DataLazy.h:73
Definition: DataLazy.h:39
DataAbstract parent
Definition: DataLazy.h:105
ES_optype
Definition: DataLazy.h:36
Definition: DataLazy.h:65
size_t m_children
Definition: DataLazy.h:293
DataTypes::ShapeType ShapeType
Definition: DataLazy.h:107
Definition: DataLazy.h:56
boost::shared_ptr< const DataLazy > const_DataLazy_ptr
Definition: DataLazy.h:100
Definition: DataLazy.h:71
Definition: DataLazy.h:63
int m_transpose
Definition: DataLazy.h:287
size_t m_samplesize
Definition: DataLazy.h:282
Definition: DataLazy.h:68
Wraps an expression tree of other DataObjects. The data will be evaluated when required.
Definition: DataLazy.h:102
Definition: DataLazy.h:45
Definition: DataLazy.h:46
#define ESCRIPT_DLL_API
Definition: escriptcore/src/system_dep.h:54
DataTypes::ValueType ValueType
Definition: DataLazy.h:106
Definition: DataLazy.h:62
Definition: DataLazy.h:54
int m_SR
Definition: DataLazy.h:288
Definition: DataLazy.h:53
Definition: DataAbstract.h:61
Definition: DataLazy.h:44
boost::shared_ptr< DataReady > DataReady_ptr
Definition: DataAbstract.h:56
Definition: DataLazy.h:78
int * m_sampleids
Definition: DataLazy.h:296
long size_type
Definition: DataVector.h:60
Definition: DataLazy.h:69
Definition: DataLazy.h:79
Definition: DataLazy.h:60
Definition: DataLazy.h:77
Definition: DataLazy.h:41
boost::shared_ptr< DataLazy > DataLazy_ptr
Definition: DataLazy.h:97
double m_tol
Definition: DataLazy.h:291
Definition: DataLazy.h:75
Definition: DataLazy.h:38