OpendTect  6.3
mathformula.h
Go to the documentation of this file.
1 #pragma once
2 
3 /*+
4 ________________________________________________________________________
5 
6  (C) dGB Beheer B.V.; (LICENSE) http://opendtect.org/OpendTect_license.txt
7  Author: Bert
8  Date: Apr 2014
9 ________________________________________________________________________
10 
11 -*/
12 
13 #include "generalmod.h"
14 #include "typeset.h"
15 #include "ranges.h"
16 #include "uistrings.h"
17 class UnitOfMeasure;
18 
19 
20 namespace Math
21 {
22 
23 class SpecVarSet;
24 class Expression;
25 
26 
27 
65 {
66 public:
67 
68  Formula(bool inputsareseries=true,const char* txt=0);
69  Formula(bool inputsareseries,const SpecVarSet&,
70  const char* txt=0);
71  Formula(const Formula&);
72  ~Formula();
73  Formula& operator =(const Formula&);
74 
75  // 0. Specify the formula text. Will construct a new Expression
76 
77  void setText(const char*);
78 
79  // 1. Things known after construction or setText()
80 
81  bool isOK() const { return expr_; }
82  bool isBad() const { return !expr_
83  && !text_.isEmpty(); }
84  const uiString errMsg() const { return errmsg_; }
85 
86  const char* text() const { return text_; }
87  int nrInputs() const { return inps_.size(); }
88  const char* variableName( int iinp ) const
89  { return inps_[iinp].varname_; }
90  bool isConst( int iinp ) const
91  { return inps_[iinp].isConst();}
92  bool isSpec( int iinp ) const
93  { return inps_[iinp].isSpec(); }
94  int specIdx(int) const;
95  const TypeSet<int>& getShifts( int iinp ) const
96  { return inps_[iinp].shifts_; }
97  Interval<int> shiftRange( int iinp ) const
98  { return inps_[iinp].shftRg(); }
99  bool isRecursive() const { return maxRecShift() > 0; }
100  int maxRecShift() const { return recstartvals_.size(); }
101 
102  // 2. Things to set before calculation or store
103 
104  void setInputDef(int,const char*);
105  void setInputUnit(int,const UnitOfMeasure*);
106  void setOutputUnit( const UnitOfMeasure* uom )
107  { outputunit_ = uom; }
108  TypeSet<double>& recStartVals() { return recstartvals_; }
109  void clearInputDefs();
110 
111  // 3. Things you have set yourself or that were retrieved
112 
113  const UnitOfMeasure* outputUnit() const { return outputunit_; }
114  const char* inputDef( int iinp ) const
115  { return inps_[iinp].inpdef_; }
116  const UnitOfMeasure* inputUnit( int iinp ) const
117  { return inps_[iinp].unit_; }
118  double getConstVal(int) const;
120 
121  // 4. To get an output value
122 
123  int nrValues2Provide() const;
124  void startNewSeries() const; // resets recursive values
125  float getValue(const float*,bool internal_units=true) const;
126  double getValue(const double*,bool internal_units=true) const;
127 
128  // 5. store/retrieve to/from IOPar
129 
130  void fillPar(IOPar&) const;
131  void usePar(const IOPar&);
132 
133 
134  const Expression* expression() const { return expr_; };
135  const SpecVarSet& specVars() const { return *specvars_; }
136  bool inputsAreSeries() const { return inputsareseries_; }
137  int nrConsts() const;
138  const char* userDispText() const;
139  int nrExternalInputs() const;
140 
141  static const char* sKeyExpression() { return "Expression"; }
142  static const char* sKeyRecStartVals() { return "Recursion start"; }
143  static const char* sKeyFileType() { return "Math Formula"; }
144 
145 protected:
146 
147  class InpDef
148  {
149  public:
150 
151  enum Type { Var, Const, Spec };
152 
153  InpDef( const char* nm, Type t )
154  : varname_(nm), unit_(0), type_(t) {}
155  bool operator==( const InpDef& id ) const
156  { return varname_ == id.varname_; }
157 
158  BufferString varname_; // from Expression
159  Type type_; // from Expression
160  TypeSet<int> shifts_; // from Expression
161  BufferString inpdef_; // filled by class user
162  const UnitOfMeasure* unit_; // filled by class user
163 
164  Interval<int> shftRg() const;
165  bool isConst() const { return type_ == Const; }
166  bool isSpec() const { return type_ == Spec; }
167 
168  };
169 
175  const bool inputsareseries_;
176 
178 
179  // length: expr_->nrVariables()
183 
185  mutable uiString errmsg_;
186 
187  int varNameIdx(const char* varnm) const;
188  void addShift(int,int,int&,TypeSet< TypeSet<int> >&);
189 
190 };
191 
192 
193 } // namespace Math
#define mExpClass(module)
Definition: commondefs.h:157
int maxRecShift() const
Definition: mathformula.h:100
Type
Definition: mathformula.h:151
TypeSet< int > validxs_
Definition: mathformula.h:182
InpDef(const char *nm, Type t)
Definition: mathformula.h:153
const char * variableName(int iinp) const
Definition: mathformula.h:88
bool isRecursive() const
Definition: mathformula.h:99
void setOutputUnit(const UnitOfMeasure *uom)
Definition: mathformula.h:106
Interval< int > shiftRange(int iinp) const
Definition: mathformula.h:97
void usePar(const IOPar &iop, ODPolygon< T > &poly, const char *inpkey)
Definition: polygon.h:200
Type type_
Definition: mathformula.h:159
TypeSet< double > recstartvals_
Definition: mathformula.h:173
const SpecVarSet * specvars_
Definition: mathformula.h:174
static const char * sKeyRecStartVals()
Definition: mathformula.h:142
TypeSet< double > & recStartVals()
Definition: mathformula.h:108
Definition: uistring.h:88
const Expression * expression() const
Definition: mathformula.h:134
static const char * sKeyFileType()
Definition: mathformula.h:143
BufferString varname_
Definition: mathformula.h:158
Set of special variables for Math Formulae/Expressions.
Definition: mathspecvars.h:45
bool isConst() const
Definition: mathformula.h:165
bool isBad() const
Definition: mathformula.h:82
TypeSet< double > prevvals_
Definition: mathformula.h:184
Math formula: (expression, inputs, units, calculation, storage).
Definition: mathformula.h:64
const UnitOfMeasure * outputunit_
Definition: mathformula.h:172
Generalized set of parameters of the keyword-value type.
Definition: iopar.h:53
BufferString inpdef_
Definition: mathformula.h:161
bool isOK() const
Definition: mathformula.h:81
TypeSet< int > inpidxs_
Definition: mathformula.h:180
const TypeSet< int > & getShifts(int iinp) const
Definition: mathformula.h:95
static const char * sKeyExpression()
Definition: mathformula.h:141
void fillPar(IOPar &iop, const ODPolygon< T > &poly, const char *inpkey)
Definition: polygon.h:187
BufferString text_
Definition: mathformula.h:170
Expression * expr_
Definition: mathformula.h:177
TypeSet< int > shifts_
Definition: mathformula.h:160
bool isSpec(int iinp) const
Definition: mathformula.h:92
bool operator==(const InpDef &id) const
Definition: mathformula.h:155
Parsed Math expression.
Definition: mathexpression.h:31
Definition: mathformula.h:151
const UnitOfMeasure * inputUnit(int iinp) const
Definition: mathformula.h:116
TypeSet< int > recshifts_
Definition: mathformula.h:181
bool isConst(int iinp) const
Definition: mathformula.h:90
OD::String with its own variable length buffer. The buffer has a guaranteed minimum size...
Definition: bufstring.h:38
BufferString errmsg_
Definition: horizontracker.h:117
const uiString errMsg() const
Definition: mathformula.h:84
const SpecVarSet & specVars() const
Definition: mathformula.h:135
Definition: math2.h:27
const UnitOfMeasure * outputUnit() const
Definition: mathformula.h:113
bool isSpec() const
Definition: mathformula.h:166
const char * inputDef(int iinp) const
Definition: mathformula.h:114
const bool inputsareseries_
Definition: mathformula.h:175
TypeSet< InpDef > inps_
Definition: mathformula.h:171
const UnitOfMeasure * unit_
Definition: mathformula.h:162
const char * text() const
Definition: mathformula.h:86
Unit of Measure.
Definition: unitofmeasure.h:33
bool inputsAreSeries() const
Definition: mathformula.h:136
Definition: mathformula.h:147
uiString errmsg_
Definition: mathformula.h:185
int nrInputs() const
Definition: mathformula.h:87

Generated at for the OpendTect seismic interpretation project. Copyright (C): dGB Beheer B. V. 2017