Minsky: 3.17.0
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 <arrays.h>
27 
28 #include <vector>
29 #include <map>
30 // override EcoLab's default CLASSDESC_ACCESS macro
31 #include "classdesc_access.h"
32 
33 #include "engNotation.h"
34 
35 #include "polyBase.h"
36 #include <polyPackBase.h>
37 #include "variableType.h"
38 #include "itemT.h"
39 #include <cairo/cairo.h>
40 
41 namespace ecolab {
42  class Pango;
43  class Plot;
44 }
45 
46 namespace minsky
47 {
48  class VariablePtr;
49  struct SchemaHelper;
50  class GodleyIcon;
51  class RenderVariable;
52 
55  {
56  int& ctr;
57  IncrDecrCounter(int& ctr): ctr(ctr) {++ctr;}
59  };
60 
63  {
65  protected:
67  mutable classdesc::Exclude<std::shared_ptr<RenderVariable>> cachedNameRender;
68  mutable classdesc::Exclude<std::shared_ptr<ecolab::Pango>> cachedMantissa;
69  mutable classdesc::Exclude<std::shared_ptr<ecolab::Pango>> cachedExponent;
70  mutable double cachedValue, cachedTime;
71  public:
72  VariableCaches()=default;
74  VariableCaches& operator=(const VariableCaches&) {return *this;}
75  };
76 
77  class VariableBase: virtual public classdesc::PolyPackBase,
79  public VariableType,
80  public VariableCaches
81  {
82  public:
84  friend struct minsky::SchemaHelper;
85 
86  private:
88  std::string m_name;
89  std::string m_canonicalName;
90  std::pair<std::string,std::string> m_dimLabelsPicked;
91  mutable int unitsCtr=0;
92  static int stockVarsPassed;
93 
94  void insertControlled(Selection& selection) override;
95 
97  classdesc::Exclude<std::shared_ptr<ecolab::Plot>> miniPlot;
98 
99  protected:
100  void addPorts();
101 
102  public:
103  static int varsPassed;
104  static VariableBase* create(Type type);
106 
107  virtual std::size_t numPorts() const=0;
108  virtual Type type() const=0;
109 
113 
114 
116  classdesc::Exclude<std::weak_ptr<Item>> controller;
117  bool visible() const override;
118 
119  const VariableBase* variableCast() const override {return this;}
120  VariableBase* variableCast() override {return this;}
121 
122  float zoomFactor() const override;
123 
125  bool local() const;
127  void toggleLocal() {name(m_name[0]==':'? m_name.substr(1): ':'+m_name);}
128 
130  virtual std::string name() const;
131  virtual std::string name(const std::string& nm);
132  const std::string& canonicalName() const {return m_canonicalName;}
134 
137  const std::string& rawName() const {return m_name;}
138 
139  bool ioVar() const override;
140 
142  void ensureValueExists(VariableValue* vv, const std::string& name) const;
143 
145  virtual std::string valueId() const;
148  std::string valueIdInCurrentScope(const std::string& nm) const;
150  std::shared_ptr<VariableValue> vValue() const;
152  std::vector<unsigned> dims() const;
154  std::vector<std::string> dimLabels() const;
155 
156  std::pair<std::string,std::string> getDimLabelsPicked() const {return m_dimLabelsPicked;}
157  std::pair<std::string,std::string> setDimLabelsPicked(const std::string& dimLabel1, const std::string& dimLabel2) {
158  m_dimLabelsPicked=std::make_pair(dimLabel1,dimLabel2);
159  return m_dimLabelsPicked;
160  }
161 
163  std::string init() const;
164  std::string init(const std::string&);
165 
168  virtual double value(const double&);
169  virtual double value() const override;
171 
172  const std::string& detailedText() const override;
173  const std::string& detailedText(const std::string& x) override;
174  const std::string& tooltip() const override;
175  const std::string& tooltip(const std::string& x) override;
176 
178  bool sliderVisible() const;
179 
181  Units units(bool check) const override;
182  Units units() const {return units(false);}
183  void setUnits(const std::string&) const;
184  std::string unitsStr() const {return units().str();}
185 
186  bool onKeyPress(int, const std::string&, int) override;
187 
189  bool lhs() const {return type()==flow || type()==tempFlow;}
191  bool temp() const {return type()==tempFlow || type()==undefined;}
192  virtual VariableBase* clone() const override=0;
193  bool isStock() const {return type()==stock || type()==integral;}
194 
196  std::string definition() const;
197 
201  void draw(cairo_t*) const override;
202  void resize(const LassoBox& b) override;
203  ClickType::Type clickType(float x, float y) const override;
204 
206  bool defined() const {return inputWired() || (isStock() && controller.lock());}
207 
208  bool inputWired() const;
209 
211  std::vector<std::string> accessibleVars() const;
212 
215  {return minsky::engExp(value());}
216  std::string mantissa(const EngNotation& e, int digits=3) const
217  {return minsky::mantissa(value(),e, digits);}
218 
221  void exportAsCSV(const std::string& filename, bool tabular) const;
223  void importFromCSV(const std::vector<std::string>& filenames,
224  const DataSpecSchema& spec) const;
226  void reloadCSV();
227 
229  void destroyFrame() override;
230 
231  bool miniPlotEnabled() const {return bool(miniPlot);}
232  bool miniPlotEnabled(bool);
233  void resetMiniPlot();
234 
235  bool onMouseMotion(float x, float y) override;
236 
237  void adjustSliderBounds() const;
238 
240  double sliderMin() const;
241  double sliderMin(double) const;
242  double sliderMax() const;
243  double sliderMax(double) const;
244  double sliderStep() const;
245  double sliderStep(double) const;
246  bool sliderStepRel() const;
247  bool sliderStepRel(bool) const;
248  bool enableSlider() const;
249  bool enableSlider(bool) const;
251 
252  };
253 
254  template <minsky::VariableType::Type T>
255  class Variable: public ItemT<Variable<T>, VariableBase>,
256  public classdesc::PolyPack<Variable<T> >
257  {
258  public:
260  Type type() const override {return T;}
261  std::size_t numPorts() const override;
262 
266  this->controller.reset(); // copy is not controlled by same object
267  this->addPorts();
268  return *this;
269  }
273  this->addPorts();
274  return *this;
275  }
276  Variable(const std::string& name="") {VariableBase::name(name); this->addPorts();}
277  std::string classType() const override
278  {return "Variable:"+VariableType::typeName(type());}
279  Variable* clone() const override {
281  v->controller.reset(); // cloned variables are not controlled by this's controller
282  // v is a Variable*, but C++ covariant return types rule prevent it being declared as such
283  assert(dynamic_cast<Variable*>(v));
284  return static_cast<Variable*>(v);
285  }
286  };
287 
288  struct VarConstant: public Variable<VariableType::constant>
289  {
290  int id;
291  static int nextId;
292  VarConstant(): id(nextId++) {ensureValueExists(nullptr,"");}
293  std::string valueId() const override {return "constant:"+str(id);}
294  std::string name() const override {return init();}
295  std::string name(const std::string& nm) override {ensureValueExists(nullptr,""); return name();}
296  using VariableBase::value;
297  double value(const double& x) override {init(str(x)); return x;}
298  VarConstant* clone() const override {auto r=new VarConstant(*this); r->group.reset(); return r;}
299  std::string classType() const override {return "VarConstant";}
300  };
301 
302  class VariablePtr:
303  public classdesc::shared_ptr<VariableBase>
304  {
305  typedef classdesc::shared_ptr<VariableBase> PtrBase;
306  public:
307  virtual int id() const {return -1;}
309  const std::string& name=""):
310  PtrBase(VariableBase::create(type)) {get()->name(name);}
311  virtual ~VariablePtr() {}
312  template <class P>
313  VariablePtr(P* var): PtrBase(dynamic_cast<VariableBase*>(var))
314  {
315  // check for incorrect type assignment
316  assert(!var || *this);
317  }
318  VariablePtr(const classdesc::shared_ptr<VariableBase>& x): PtrBase(x) {}
319  VariablePtr(const VariableBase& x): PtrBase(x.clone()) {}
321  void retype(VariableBase::Type type);
322  VariablePtr(const ItemPtr& x):
323  PtrBase(std::dynamic_pointer_cast<VariableBase>(x)) {}
326  };
327 }
328 
329 namespace classdesc
330 {
331  template <> struct is_smart_ptr<minsky::VariablePtr>: public true_type {};
332  }
333 
334 #include "variable.cd"
335 #include "variable.xcd"
336 #endif
represents items that have been selected
Definition: selection.h:32
virtual int id() const
Definition: variable.h:307
Variable(const Variable &x)
Definition: variable.h:263
bool onKeyPress(int, const std::string &, int) override
respond to key press events
Definition: variable.cc:555
bool miniPlotEnabled() const
Definition: variable.h:231
Units units() const
Definition: variable.h:182
const std::string & rawName() const
accessor for the name member (may differ from name() with top level variables)
Definition: variable.h:137
classdesc::Exclude< std::shared_ptr< ecolab::Pango > > cachedExponent
Definition: variable.h:69
EngNotation engExp(double value)
return formatted mantissa and exponent in engineering format
std::pair< std::string, std::string > m_dimLabelsPicked
Definition: variable.h:90
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:156
void destroyFrame() override
clean up popup window structures on window close
Definition: variable.cc:486
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:176
static int stockVarsPassed
for detecting reentrancy in units()
Definition: variable.h:92
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:877
exception-safe increment/decrement of a counter in a block
Definition: variable.h:54
represents rectangular region of a lasso operation
Definition: lasso.h:28
Type type() const override
Definition: variable.h:260
STL namespace.
VarConstant * clone() const override
Definition: variable.h:298
virtual double value() const override
< set the initial value for this variable
Definition: variable.cc:317
std::vector< std::string > accessibleVars() const
return a list of existing variables this could be connected to
Definition: variable.cc:74
void retype(VariableBase::Type type)
changes type of variable to type
Definition: variable.cc:510
std::string name() const override
variable displayed name
Definition: variable.h:294
std::shared_ptr< Item > ItemPtr
Definition: item.h:55
void reloadCSV()
reload CSV file if previously imported
Definition: variable.cc:478
std::string name(const std::string &nm) override
variable displayed name
Definition: variable.h:295
Variable(Variable &&x)
Definition: variable.h:270
std::size_t numPorts() const override
std::string unitsStr() const
Definition: variable.h:184
double sliderMax() const
slider parameters
Definition: variable.cc:641
bool inputWired() const
Definition: variable.cc:67
const std::string & tooltip() const override
Definition: variable.cc:352
VariablePtr(const VariableBase &x)
Definition: variable.h:319
VariablePtr(VariableBase::Type type=VariableBase::undefined, const std::string &name="")
Definition: variable.h:308
virtual Type type() const =0
void exportAsCSV(const std::string &filename, bool tabular) const
export this variable as a CSV file
Definition: variable.cc:457
void resize(const LassoBox &b) override
resize this item on the canvas
Definition: variable.cc:869
virtual VariableBase * clone() const override=0
void adjustSliderBounds() const
Definition: variable.cc:549
static VariableBase * create(Type type)
Definition: variable.cc:101
int unitsCtr
for detecting reentrancy in units()
Definition: variable.h:91
bool sliderVisible() const
returns true if slider is to be drawn
Definition: variable.cc:538
float zoomFactor() const override
Definition: variable.cc:135
bool visible() const override
whether this item is visible on the canvas.
Definition: variable.cc:529
classdesc::Exclude< std::weak_ptr< Item > > controller
reference to a controlling item - eg GodleyIcon, IntOp or a Group if an IOVar.
Definition: variable.h:116
VariableCaches & operator=(const VariableCaches &)
Definition: variable.h:74
void insertControlled(Selection &selection) override
Definition: variable.cc:492
bool ioVar() const override
indicates this is a group I/O variable
Definition: variable.cc:243
std::pair< std::string, std::string > setDimLabelsPicked(const std::string &dimLabel1, const std::string &dimLabel2)
Definition: variable.h:157
static int varsPassed
for caching units calculation factory method
Definition: variable.h:103
Variable & operator=(const Variable &x)
Definition: variable.h:264
Variable(const std::string &name="")
Definition: variable.h:276
VariablePtr(P *var)
Definition: variable.h:313
std::vector< unsigned > dims() const
variable&#39;s tensor shape
Definition: variable.cc:154
std::vector< std::string > dimLabels() const
labels along each axis
Definition: variable.cc:164
virtual std::string valueId() const
string used to link to the VariableValue associated with this
Definition: variable.cc:171
const VariableBase * variableCast() const override
Definition: variable.h:119
represents the units (in sense of dimensional analysis) of a variable.
Definition: units.h:34
bool defined() const
Definition: variable.h:206
void ensureValueExists(VariableValue *vv, const std::string &name) const
ensure an associated variableValue exists
Definition: variable.cc:247
double value(const double &x) override
< set the initial value for this variable
Definition: variable.h:297
std::string valueId() const override
string used to link to the VariableValue associated with this
Definition: variable.h:293
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:89
std::string definition() const
formula defining this variable
Definition: variable.cc:572
std::string mantissa(double value, const EngNotation &, int digits=3)
EngNotation engExp() const
return formatted mantissa and exponent in engineering format
Definition: variable.h:214
const std::string & detailedText() const override
Definition: variable.cc:338
Variable & operator=(Variable &&x)
Definition: variable.h:271
void toggleLocal()
toggle local status
Definition: variable.h:127
void importFromCSV(const std::vector< std::string > &filenames, const DataSpecSchema &spec) const
import CSV files, using spec
Definition: variable.cc:464
CLASSDESC_ACCESS(VariableCaches)
IncrDecrCounter(int &ctr)
Definition: variable.h:57
bool isStock() const
Definition: variable.h:193
std::string init() const
the initial value of this variable
Definition: variable.cc:270
ClickType::Type clickType(float x, float y) const override
returns the clicktype given a mouse click at x, y.
Definition: variable.cc:82
virtual std::string name() const
variable displayed name
Definition: variable.cc:186
bool enableSlider() const
slider parameters
Definition: variable.cc:683
std::string mantissa(const EngNotation &e, int digits=3) const
Definition: variable.h:216
bool sliderStepRel() const
slider parameters
Definition: variable.cc:669
classdesc::Exclude< std::shared_ptr< ecolab::Pango > > cachedMantissa
Definition: variable.h:68
std::string m_name
Definition: variable.h:88
classdesc::Exclude< std::shared_ptr< RenderVariable > > cachedNameRender
cached Pango objects
Definition: variable.h:67
caches need copy operations to be nobbled, because they hold a reference to the derived variable ...
Definition: variable.h:62
CLASSDESC_ACCESS(VariableBase)
bool local() const
Definition: variable.cc:181
VariablePtr(const ItemPtr &x)
Definition: variable.h:322
double sliderStep() const
slider parameters
Definition: variable.cc:655
VariableBase::Type Type
Definition: variable.h:259
void draw(cairo_t *) const override
Definition: variable.cc:698
std::string classType() const override
Definition: variable.h:299
VariableType::Type Type
Definition: variable.h:83
bool temp() const
variable is temporary
Definition: variable.h:191
bool lhs() const
variable is on left hand side of flow calculation
Definition: variable.h:189
std::shared_ptr< VariableValue > vValue() const
variableValue associated with this. nullptr if not associated with a variableValue ...
Definition: variable.cc:146
classdesc::shared_ptr< VariableBase > PtrBase
Definition: variable.h:305
classdesc::Exclude< std::shared_ptr< ecolab::Plot > > miniPlot
miniature plot feature
Definition: variable.h:97
std::string id() const
return an id uniquely identifying this item
Definition: item.h:233
VariablePtr(const classdesc::shared_ptr< VariableBase > &x)
Definition: variable.h:318
virtual ~VariablePtr()
Definition: variable.h:311
static int nextId
Definition: variable.h:291
double sliderMin() const
slider parameters
Definition: variable.cc:626
void retype(VariableType::Type type)
attempt to replace this variable with variable of type.
Definition: variable.cc:117
VariableCaches(const VariableCaches &)
Definition: variable.h:73
void setUnits(const std::string &) const
Definition: variable.cc:449
std::string classType() const override
Definition: variable.h:277
const std::string & canonicalName() const
variable displayed name
Definition: variable.h:132
Variable * clone() const override
Definition: variable.h:279
VariableBase * variableCast() override
Definition: variable.h:120
bool onMouseMotion(float x, float y) override
respond to mouse motion events with button pressed
Definition: variable.cc:607