Minsky
variable.h
Go to the documentation of this file.
1 /*
2  @copyright Steve Keen 2012
3  @author Russell Standish
4  This file is part of Minsky.
5 
6  Minsky is free software: you can redistribute it and/or modify it
7  under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  Minsky is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with Minsky. If not, see <http://www.gnu.org/licenses/>.
18 */
19 #ifndef VARIABLE_H
20 #define VARIABLE_H
21 
22 #include "slider.h"
23 #include "str.h"
24 #include "CSVParser.h"
25 
26 #include <ecolab.h>
27 #include <arrays.h>
28 
29 #include <vector>
30 #include <map>
31 // override EcoLab's default CLASSDESC_ACCESS macro
32 #include "classdesc_access.h"
33 
34 #include "engNotation.h"
35 
36 #include "polyBase.h"
37 #include <polyPackBase.h>
38 #include "variableType.h"
39 #include "itemT.h"
40 #include <accessor.h>
41 #include <cairo/cairo.h>
42 
43 namespace ecolab {
44  class Pango;
45  class Plot;
46 }
47 
48 namespace minsky
49 {
50  class VariablePtr;
51  struct SchemaHelper;
52  class GodleyIcon;
53  class RenderVariable;
54 
57  {
58  int& ctr;
59  IncrDecrCounter(int& ctr): ctr(ctr) {++ctr;}
61  };
62 
63  namespace VarAccessors
64  {
65  // constructors defined below once member functions available
66  struct NameAccessor: ecolab::TCLAccessor<minsky::VariableBase,std::string,0> {NameAccessor();};
67  struct InitAccessor: ecolab::TCLAccessor<minsky::VariableBase,std::string,1> {InitAccessor();};
68  struct ValueAccessor: ecolab::TCLAccessor<minsky::VariableBase,double> {ValueAccessor();};
69  }
70 
73  {
75  protected:
77  mutable classdesc::Exclude<std::shared_ptr<RenderVariable>> cachedNameRender;
78  mutable classdesc::Exclude<std::shared_ptr<ecolab::Pango>> cachedMantissa;
79  mutable classdesc::Exclude<std::shared_ptr<ecolab::Pango>> cachedExponent;
80  mutable double cachedValue, cachedTime;
81  public:
82  VariableCaches()=default;
84  VariableCaches& operator=(const VariableCaches&) {return *this;}
85  };
86 
87  class VariableBase: virtual public classdesc::PolyPackBase,
89  public VariableType,
93  public VariableCaches
94  {
95  public:
97  friend struct minsky::SchemaHelper;
98 
99  private:
101  std::string m_name;
102  std::string m_canonicalName;
103  std::pair<std::string,std::string> m_dimLabelsPicked;
104  mutable int unitsCtr=0;
105  static int stockVarsPassed;
106 
107  void insertControlled(Selection& selection) override;
108 
110  classdesc::Exclude<std::shared_ptr<ecolab::Plot>> miniPlot;
111 
112  protected:
113  void addPorts();
114 
115  public:
116  static int varsPassed;
117  static VariableBase* create(Type type);
119 
120  virtual std::size_t numPorts() const=0;
121  virtual Type type() const=0;
122 
126 
127 
129  classdesc::Exclude<std::weak_ptr<Item>> controller;
130  bool visible() const override;
131 
132  const VariableBase* variableCast() const override {return this;}
133  VariableBase* variableCast() override {return this;}
134 
135  float zoomFactor() const override;
136 
138  bool local() const;
140  void toggleLocal() {name(m_name[0]==':'? m_name.substr(1): ':'+m_name);}
141 
143  virtual std::string name() const;
144  virtual std::string name(const std::string& nm);
145  const std::string& canonicalName() const {return m_canonicalName;}
147 
150  const std::string& rawName() const {return m_name;}
151 
152  bool ioVar() const override;
153 
155  void ensureValueExists(VariableValue* vv, const std::string& name) const;
156 
158  virtual std::string valueId() const;
161  std::string valueIdInCurrentScope(const std::string& nm) const;
163  std::shared_ptr<VariableValue> vValue() const;
165  std::vector<unsigned> dims() const;
167  std::vector<std::string> dimLabels() const;
168 
169  std::pair<std::string,std::string> getDimLabelsPicked() const {return m_dimLabelsPicked;}
170  std::pair<std::string,std::string> setDimLabelsPicked(const std::string& dimLabel1, const std::string& dimLabel2) {
171  m_dimLabelsPicked=std::make_pair(dimLabel1,dimLabel2);
172  return m_dimLabelsPicked;
173  }
174 
176  std::string init() const;
177  std::string init(const std::string&);
178 
181  virtual double value(const double&);
182  virtual double value() const override;
184 
185  const std::string& detailedText() const override;
186  const std::string& detailedText(const std::string& x) override;
187  const std::string& tooltip() const override;
188  const std::string& tooltip(const std::string& x) override;
189 
191  bool sliderVisible() const;
192 
194  Units units(bool check) const override;
195  Units units() const {return units(false);}
196  void setUnits(const std::string&) const;
197  std::string unitsStr() const {return units().str();}
198 
199  bool onKeyPress(int, const std::string&, int) override;
200 
202  bool lhs() const {return type()==flow || type()==tempFlow;}
204  bool temp() const {return type()==tempFlow || type()==undefined;}
205  virtual VariableBase* clone() const override=0;
206  bool isStock() const {return type()==stock || type()==integral;}
207 
209  std::string definition() const;
210 
214  void draw(cairo_t*) const override;
215  void resize(const LassoBox& b) override;
216  ClickType::Type clickType(float x, float y) const override;
217 
219  bool defined() const {return inputWired() || (isStock() && controller.lock());}
220 
221  bool inputWired() const;
222 
224  std::vector<std::string> accessibleVars() const;
225 
228  {return minsky::engExp(value());}
229  std::string mantissa(const EngNotation& e, int digits=3) const
230  {return minsky::mantissa(value(),e, digits);}
231 
234  void exportAsCSV(const std::string& filename, bool tabular) const;
236  void importFromCSV(const std::vector<std::string>& filenames,
237  const DataSpecSchema& spec) const;
238 
240  void destroyFrame() override;
241 
242  bool miniPlotEnabled() const {return bool(miniPlot);}
243  bool miniPlotEnabled(bool);
244  void resetMiniPlot();
245 
246  bool onMouseMotion(float x, float y) override;
247 
248  void adjustSliderBounds();
249 
251  double sliderMin() const;
252  double sliderMin(double) const;
253  double sliderMax() const;
254  double sliderMax(double) const;
255  double sliderStep() const;
256  double sliderStep(double) const;
257  bool sliderStepRel() const;
258  bool sliderStepRel(bool) const;
259  bool enableSlider() const;
260  bool enableSlider(bool);
262  };
263 
264  template <minsky::VariableType::Type T>
265  class Variable: public ItemT<Variable<T>, VariableBase>,
266  public classdesc::PolyPack<Variable<T> >
267  {
268  public:
270  Type type() const override {return T;}
271  std::size_t numPorts() const override;
272 
276  this->controller.reset(); // copy is not controlled by same object
277  this->addPorts();
278  return *this;
279  }
283  this->addPorts();
284  return *this;
285  }
286  Variable(const std::string& name="") {VariableBase::name(name); this->addPorts();}
287  std::string classType() const override
288  {return "Variable:"+VariableType::typeName(type());}
289  Variable* clone() const override {
291  v->controller.reset(); // cloned variables are not controlled by this's controller
292  // v is a Variable*, but C++ covariant return types rule prevent it being declared as such
293  assert(dynamic_cast<Variable*>(v));
294  return static_cast<Variable*>(v);
295  }
296  };
297 
298  struct VarConstant: public Variable<VariableType::constant>
299  {
300  int id;
301  static int nextId;
302  VarConstant(): id(nextId++) {ensureValueExists(nullptr,"");}
303  std::string valueId() const override {return "constant:"+str(id);}
304  std::string name() const override {return init();}
305  std::string name(const std::string& nm) override {ensureValueExists(nullptr,""); return name();}
306  using VariableBase::value;
307  double value(const double& x) override {init(str(x)); return x;}
308  VarConstant* clone() const override {auto r=new VarConstant(*this); r->group.reset(); return r;}
309  std::string classType() const override {return "VarConstant";}
310  void TCL_obj(classdesc::TCL_obj_t& t, const classdesc::string& d) override
311  {::TCL_obj(t,d,*this);}
312  };
313 
314  class VariablePtr:
315  public classdesc::shared_ptr<VariableBase>
316  {
317  typedef classdesc::shared_ptr<VariableBase> PtrBase;
318  public:
319  virtual int id() const {return -1;}
321  const std::string& name=""):
322  PtrBase(VariableBase::create(type)) {get()->name(name);}
323  virtual ~VariablePtr() {}
324  template <class P>
325  VariablePtr(P* var): PtrBase(dynamic_cast<VariableBase*>(var))
326  {
327  // check for incorrect type assignment
328  assert(!var || *this);
329  }
330  VariablePtr(const classdesc::shared_ptr<VariableBase>& x): PtrBase(x) {}
331  VariablePtr(const VariableBase& x): PtrBase(x.clone()) {}
333  void retype(VariableBase::Type type);
334  VariablePtr(const ItemPtr& x):
335  PtrBase(std::dynamic_pointer_cast<VariableBase>(x)) {}
338  };
339 }
340 
341 namespace classdesc
342 {
343  template <> struct is_smart_ptr<minsky::VariablePtr>: public true_type {};
344  }
345 
346 #include "variable.cd"
347 #include "variable.xcd"
348 #endif
represents items that have been selected
Definition: selection.h:32
virtual int id() const
Definition: variable.h:319
Variable(const Variable &x)
Definition: variable.h:273
bool onKeyPress(int, const std::string &, int) override
respond to key press events
Definition: variable.cc:561
bool miniPlotEnabled() const
Definition: variable.h:242
Units units() const
Definition: variable.h:195
const std::string & rawName() const
accessor for the name member (may differ from name() with top level variables)
Definition: variable.h:150
classdesc::Exclude< std::shared_ptr< ecolab::Pango > > cachedExponent
Definition: variable.h:79
EngNotation engExp(double value)
return formatted mantissa and exponent in engineering format
std::pair< std::string, std::string > m_dimLabelsPicked
Definition: variable.h:103
std::string str() const
Definition: variableType.cc:33
virtual std::size_t numPorts() const =0
std::pair< std::string, std::string > getDimLabelsPicked() const
Definition: variable.h:169
void destroyFrame() override
clean up popup window structures on window close
Definition: variable.cc:492
virtual float x() const
Definition: item.cc:107
std::string valueIdInCurrentScope(const std::string &nm) const
returns valueId for nm. If nm is not qualified, this variable&#39;s scope is used
Definition: variable.cc:191
static int stockVarsPassed
for detecting reentrancy in units()
Definition: variable.h:105
virtual float y() const
Definition: item.cc:114
void makeConsistentWithValue()
make variable&#39;s type consistent with the type of the valueId
Definition: variable.cc:883
exception-safe increment/decrement of a counter in a block
Definition: variable.h:56
represents rectangular region of a lasso operation
Definition: lasso.h:28
Type type() const override
Definition: variable.h:270
STL namespace.
VarConstant * clone() const override
Definition: variable.h:308
virtual double value() const override
< set the initial value for this variable
Definition: variable.cc:332
std::vector< std::string > accessibleVars() const
return a list of existing variables this could be connected to
Definition: variable.cc:89
void retype(VariableBase::Type type)
changes type of variable to type
Definition: variable.cc:516
std::string name() const override
variable displayed name
Definition: variable.h:304
std::shared_ptr< Item > ItemPtr
Definition: item.h:57
std::string name(const std::string &nm) override
variable displayed name
Definition: variable.h:305
Variable(Variable &&x)
Definition: variable.h:280
std::size_t numPorts() const override
std::string unitsStr() const
Definition: variable.h:197
double sliderMax() const
slider parameters
Definition: variable.cc:647
bool inputWired() const
Definition: variable.cc:82
const std::string & tooltip() const override
Definition: variable.cc:367
VariablePtr(const VariableBase &x)
Definition: variable.h:331
VariablePtr(VariableBase::Type type=VariableBase::undefined, const std::string &name="")
Definition: variable.h:320
virtual Type type() const =0
void exportAsCSV(const std::string &filename, bool tabular) const
export this variable as a CSV file
Definition: variable.cc:472
void resize(const LassoBox &b) override
resize this item on the canvas
Definition: variable.cc:875
virtual VariableBase * clone() const override=0
static VariableBase * create(Type type)
Definition: variable.cc:116
int unitsCtr
for detecting reentrancy in units()
Definition: variable.h:104
bool sliderVisible() const
returns true if slider is to be drawn
Definition: variable.cc:544
float zoomFactor() const override
Definition: variable.cc:150
bool visible() const override
whether this item is visible on the canvas.
Definition: variable.cc:535
Creation and access to the minskyTCL_obj object, which has code to record whenever Minsky&#39;s state cha...
Definition: constMap.h:22
classdesc::Exclude< std::weak_ptr< Item > > controller
reference to a controlling item - eg GodleyIcon, IntOp or a Group if an IOVar.
Definition: variable.h:129
VariableCaches & operator=(const VariableCaches &)
Definition: variable.h:84
void insertControlled(Selection &selection) override
Definition: variable.cc:498
bool ioVar() const override
indicates this is a group I/O variable
Definition: variable.cc:258
std::pair< std::string, std::string > setDimLabelsPicked(const std::string &dimLabel1, const std::string &dimLabel2)
Definition: variable.h:170
static int varsPassed
for caching units calculation factory method
Definition: variable.h:116
Variable & operator=(const Variable &x)
Definition: variable.h:274
Variable(const std::string &name="")
Definition: variable.h:286
VariablePtr(P *var)
Definition: variable.h:325
std::vector< unsigned > dims() const
variable&#39;s tensor shape
Definition: variable.cc:169
std::vector< std::string > dimLabels() const
labels along each axis
Definition: variable.cc:179
virtual std::string valueId() const
string used to link to the VariableValue associated with this
Definition: variable.cc:186
const VariableBase * variableCast() const override
Definition: variable.h:132
void TCL_obj(classdesc::TCL_obj_t &t, const classdesc::string &d) override
Definition: variable.h:310
represents the units (in sense of dimensional analysis) of a variable.
Definition: units.h:34
bool defined() const
Definition: variable.h:219
void adjustSliderBounds()
Definition: variable.cc:555
void ensureValueExists(VariableValue *vv, const std::string &name) const
ensure an associated variableValue exists
Definition: variable.cc:262
double value(const double &x) override
< set the initial value for this variable
Definition: variable.h:307
std::string valueId() const override
string used to link to the VariableValue associated with this
Definition: variable.h:303
static std::string typeName(int t)
Definition: variableType.cc:30
std::string str(T x)
utility function to create a string representation of a numeric type
Definition: str.h:33
std::string m_canonicalName
latex processed and active stripped version of name
Definition: variable.h:102
std::string definition() const
formula defining this variable
Definition: variable.cc:578
std::string mantissa(double value, const EngNotation &, int digits=3)
EngNotation engExp() const
return formatted mantissa and exponent in engineering format
Definition: variable.h:227
const std::string & detailedText() const override
Definition: variable.cc:353
Variable & operator=(Variable &&x)
Definition: variable.h:281
void toggleLocal()
toggle local status
Definition: variable.h:140
void importFromCSV(const std::vector< std::string > &filenames, const DataSpecSchema &spec) const
import CSV files, using spec
Definition: variable.cc:479
CLASSDESC_ACCESS(VariableCaches)
IncrDecrCounter(int &ctr)
Definition: variable.h:59
bool isStock() const
Definition: variable.h:206
std::string init() const
the initial value of this variable
Definition: variable.cc:285
ClickType::Type clickType(float x, float y) const override
returns the clicktype given a mouse click at x, y.
Definition: variable.cc:97
virtual std::string name() const
variable displayed name
Definition: variable.cc:201
bool enableSlider() const
slider parameters
Definition: variable.cc:689
std::string mantissa(const EngNotation &e, int digits=3) const
Definition: variable.h:229
bool sliderStepRel() const
slider parameters
Definition: variable.cc:675
classdesc::Exclude< std::shared_ptr< ecolab::Pango > > cachedMantissa
Definition: variable.h:78
std::string m_name
Definition: variable.h:101
classdesc::Exclude< std::shared_ptr< RenderVariable > > cachedNameRender
cached Pango objects
Definition: variable.h:77
caches need copy operations to be nobbled, because they hold a reference to the derived variable ...
Definition: variable.h:72
CLASSDESC_ACCESS(VariableBase)
bool local() const
Definition: variable.cc:196
VariablePtr(const ItemPtr &x)
Definition: variable.h:334
double sliderStep() const
slider parameters
Definition: variable.cc:661
VariableBase::Type Type
Definition: variable.h:269
void draw(cairo_t *) const override
Definition: variable.cc:704
std::string classType() const override
Definition: variable.h:309
VariableType::Type Type
Definition: variable.h:96
bool temp() const
variable is temporary
Definition: variable.h:204
bool lhs() const
variable is on left hand side of flow calculation
Definition: variable.h:202
std::shared_ptr< VariableValue > vValue() const
variableValue associated with this. nullptr if not associated with a variableValue ...
Definition: variable.cc:161
classdesc::shared_ptr< VariableBase > PtrBase
Definition: variable.h:317
classdesc::Exclude< std::shared_ptr< ecolab::Plot > > miniPlot
miniature plot feature
Definition: variable.h:110
std::string id() const
return an id uniquely identifying this item
Definition: item.h:236
VariablePtr(const classdesc::shared_ptr< VariableBase > &x)
Definition: variable.h:330
virtual ~VariablePtr()
Definition: variable.h:323
static int nextId
Definition: variable.h:301
double sliderMin() const
slider parameters
Definition: variable.cc:632
void retype(VariableType::Type type)
attempt to replace this variable with variable of type.
Definition: variable.cc:132
VariableCaches(const VariableCaches &)
Definition: variable.h:83
void setUnits(const std::string &) const
Definition: variable.cc:464
std::string classType() const override
Definition: variable.h:287
const std::string & canonicalName() const
variable displayed name
Definition: variable.h:145
Variable * clone() const override
Definition: variable.h:289
VariableBase * variableCast() override
Definition: variable.h:133
bool onMouseMotion(float x, float y) override
respond to mouse motion events with button pressed
Definition: variable.cc:613