Minsky
minsky.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 
20 #ifndef MINSKY_H
21 #define MINSKY_H
22 
23 #include "stringKeyMap.h"
24 #include "intrusiveMap.h"
25 #include "bookmark.h"
26 #include "cairoItems.h"
27 #include "canvas.h"
28 #include "clipboard.h"
29 #include "dimension.h"
30 #include "evalOp.h"
31 #include "equationDisplay.h"
32 #include "equations.h"
33 #include "fontDisplay.h"
34 #include "godleyIcon.h"
35 #include "intrusiveMap.h"
36 #include "latexMarkup.h"
37 #include "variableValues.h"
38 #include "canvas.h"
39 #include "lock.h"
40 #include "operation.h"
41 #include "pannableTab.h"
42 #include "phillipsDiagram.h"
43 #include "plotWidget.h"
44 #include "progress.h"
45 #include "pubTab.h"
46 #include "ravelWrap.h"
47 #include "rungeKutta.h"
48 #include "saver.h"
49 #include "stringKeyMap.h"
50 #include "variablePane.h"
51 #include "version.h"
52 
53 #include <vector>
54 #include <string>
55 #include <set>
56 #include <deque>
57 #include <cstdio>
58 
59 #include <ecolab.h>
60 #include <xml_pack_base.h>
61 #include <xml_unpack_base.h>
62 
63 namespace minsky
64 {
65  using namespace std;
66  using classdesc::shared_ptr;
67  using namespace civita;
68  using namespace boost::posix_time;
69 
70  struct CallableFunction;
71  class VariableInstanceList;
72 
73  class SaveThread;
74 
75  // a place to put working variables of the Minsky class that needn't
76  // be serialised.
78  {
79  shared_ptr<ofstream> outputDataFile;
80  unique_ptr<BackgroundSaver> autoSaver;
81 
82  enum StateFlags {is_edited=1, reset_needed=2, fullEqnDisplay_needed=4};
83  int flags=reset_needed;
84 
86  static constexpr std::chrono::milliseconds resetNowThreshold{500};
89  static constexpr std::chrono::milliseconds resetPostponedThreshold{1500};
90  std::chrono::time_point<std::chrono::system_clock> resetAt=std::chrono::time_point<std::chrono::system_clock>::max();
91  std::chrono::milliseconds resetDuration;
92 
94  int busyCursorStack=0;
95 
96  std::vector<int> flagStack;
97 
99 
100  // make copy operations just dummies, as assignment of Minsky's
101  // doesn't need to change this
102  MinskyExclude(): historyPtr(0) {}
103  MinskyExclude(const MinskyExclude&): historyPtr(0) {}
104  MinskyExclude& operator=(const MinskyExclude&) {return *this;}
105 
107  std::set<RenderNativeWindow*> nativeWindowsToRedraw;
108 
109  protected:
111  /*
112  TODO: it should be sufficient to add move semantics to pack_t,
113  but for some reason copy semantics are required, requiring the
114  use of shared_ptr
115  */
116  std::deque<classdesc::pack_t> history;
117  std::size_t historyPtr;
118  bool undone=false; //< flag indicating undo() was previous command
119  };
120 
122 
123  struct Minsky_multipleEquities: public ecolab::TCLAccessor<Minsky,bool>
124  {
125  Minsky_multipleEquities(const std::string& name, ecolab::TCLAccessor<Minsky,bool>::Getter g,
126  ecolab::TCLAccessor<Minsky,bool>::Setter s):
127  ecolab::TCLAccessor<Minsky,bool>(name,g,s) {}
128  };
129 
130 
131  class Minsky: public Exclude<MinskyExclude>, public RungeKutta, public Minsky_multipleEquities
132  {
134 
137  std::string diagnoseNonFinite() const;
138 
140  void logVariables() const;
141 
142  Exclude<ptime> lastRedraw;
143 
144  bool m_multipleEquities=false;
145 
147  void balanceColumns(const GodleyIcon& srcGodley, int srcCol, GodleyIcon& destGodley, int destCol) const;
148 
150  void removeItems(Wire& wire);
151 
152  public:
156  std::vector<PubTab> publicationTabs;
157 
158  void addNewPublicationTab(const std::string& name) {publicationTabs.emplace_back(name);}
160  if (canvas.item && i<publicationTabs.size())
161  publicationTabs[i].items.emplace_back(canvas.item);
162  }
163 
164  // Allow multiple equity columns.
165  bool multipleEquities() const {return m_multipleEquities;}
166  bool multipleEquities(const bool& m);
167 
169  bool edited() const {return flags & is_edited;}
171  bool reset_flag() const {return flags & reset_needed;}
173  void markEdited() {
174  flags |= is_edited | fullEqnDisplay_needed;
175  if (!running) flags|=reset_needed; // don't reset when running
176  variablePane.update();
177  canvas.requestRedraw();
178  canvas.model.updateTimestamp();
179  }
180  void requestReset();
182  void requestRedraw();
183 
185  void pushFlags() {flagStack.push_back(flags);}
186  void popFlags() {
187  if (!flagStack.empty()) {
188  flags=flagStack.back();
189  flagStack.pop_back();
190  }
191  }
193 
194  bool resetIfFlagged() override {
195  if (reset_flag())
196  reset();
197  return reset_flag();
198  }
199 
201  Dimensions dimensions;
202  Conversions conversions;
204  std::map<Units, double> maxValue;
205  std::map<Units, double> maxFlowValue; // max flow values along wires
207  void populateMissingDimensions();
210  void populateMissingDimensionsFromVariable(const VariableValue&, bool& incompatibleMessageDisplayed);
212  {bool dummy; populateMissingDimensionsFromVariable(v,dummy);}
213  void renameDimension(const std::string& oldName, const std::string& newName);
214 
215  void setGodleyIconResource(const string& s)
217  void setGroupIconResource(const string& s)
219  void setLockIconResource(const string& locked, const string& unlocked) {
222  }
223  void setRavelIconResource(const string& s)
226 
229  // @param ac type of column we wish matches for
230  std::set<string> matchingTableColumns(const GodleyIcon& currTable, GodleyAssetClass::AssetClass ac);
231 
233  void importDuplicateColumn(GodleyTable& srcTable, int srcCol);
234 
236  void balanceDuplicateColumns(const GodleyIcon& srcTable, int srcCol);
237 
238  std::vector<std::string> allGodleyFlowVars() const;
239 
240  // reset m_edited as the GodleyIcon constructor calls markEdited
242  ECOLAB_ACESSOR_INIT(Minsky, multipleEquities),
243  equationDisplay(*this) {
244  lastRedraw=boost::posix_time::microsec_clock::local_time();
245  model->iHeight(std::numeric_limits<float>::max());
246  model->iWidth(std::numeric_limits<float>::max());
247  model->self=model;
248  publicationTabs.emplace_back("Publication");
249  }
250  ~Minsky();
251 
252  // needs to be declared after variableValues
253  Exclude<std::map<std::string, std::shared_ptr<CallableFunction>>> userFunctions;
254 
255  GroupPtr model{new Group};
256  Canvas canvas{model};
257 
258  void clearAllMaps(bool clearHistory);
259  void clearAllMaps() {clearAllMaps(true);}
260  // for TCL use
261  void clearAllMapsTCL() {clearAllMaps(true);}
262 
264  VariablePtr definingVar(const std::string& valueId) const;
265 
266  static void saveGroupAsFile(const Group&, const string& fileName);
267  void saveCanvasItemAsFile(const string& fileName) const
268  {if (auto g=dynamic_cast<Group*>(canvas.item.get())) saveGroupAsFile(*g,fileName);}
269 
270  void initGodleys();
271 
273  void cut();
275  void copy() const;
278  void paste();
280  bool clipboardEmpty() const {return clipboard.getClipboard().empty();}
281  void saveSelectionAsFile(const string& fileName) const {saveGroupAsFile(canvas.selection,fileName);}
282 
283  void insertGroupFromFile(const string& file);
284 
285  void makeVariablesConsistent();
286 
287  void imposeDimensions();
288 
289  // runs over all ports and variables removing those not in use
290  void garbageCollect();
291 
294  bool cycleCheck() const;
295 
298  void openLogFile(const string&);
300  void closeLogFile() {outputDataFile.reset();}
302  std::set<string> logVarList;
304  bool loggingEnabled() const {return outputDataFile.get();}
305 
308  void constructEquations();
310  void dimensionalAnalysis() const;
312  void deleteAllUnits();
313 
317  bool checkEquationOrder() const;
318 
319 
320  double lastT{0};
321  double deltaT() const {return t-lastT;}
322  void reset();
323  std::vector<double> step();
324 
325  int numBackups=1;
326  void save(const std::string& filename);
329  void load(const std::string& filename);
330 
331  /*static*/ void exportSchema(const std::string& filename, int schemaLevel=1);
332 
334  void displayErrorItem(const Item& op) const;
335 
337  static const std::string minskyVersion;
338  /*static*/ std::string ecolabVersion() const {return VERSION;}
339  /*static*/ std::string ravelVersion() const {
340  if (ravel::Ravel::available())
341  {
342  int d=ravel::Ravel::daysUntilExpired();
343  return ravel::Ravel::version() + ": "+((d>=0)?("Expires in "+std::to_string(d)+" day"+(d!=1?"s":"")): "Expired");
344  }
345  else return "unavailable";
346  }
347  static bool ravelAvailable() {return ravel::Ravel::available();}
348  static bool ravelExpired() {return ravel::Ravel::available() && ravel::Ravel::daysUntilExpired()<0;}
349  static int daysUntilRavelExpires() {return ravel::Ravel::daysUntilExpired();}
350 
351  std::string fileVersion;
352 
353  unsigned maxHistory{100};
354  int maxWaitMS=100;
355 
357  std::string autoSaveFile() const {return autoSaver? autoSaver->fileName: std::string();}
360  void setAutoSaveFile(const std::string& file);
361 
363  void clearHistory() {history.clear(); historyPtr=0;}
365  void checkPushHistory() {if (historyPtr==history.size()) pushHistory();}
366 
368  bool pushHistory();
369 
374  bool commandHook(const std::string& command, unsigned nargs);
375 
376  enum CmdData {no_command, is_const, is_setterGetter, generic};
377 
379  virtual CmdData getCommandData(const std::string& command) const {return generic;}
380 
384  bool doPushHistory=true;
385 
388  long undo(int changes=1);
389 
392  void convertVarType(const std::string& name, VariableType::Type type);
393 
396  void addIntegral();
397 
399  bool inputWired(const std::string& name) const {return definingVar(name).get();}
400 
402  void renderCanvasToPS(const std::string& filename) {canvas.renderToPS(filename);}
404  void renderCanvasToPDF(const std::string& filename) {canvas.renderToPDF(filename);}
406  void renderCanvasToSVG(const std::string& filename) {canvas.renderToSVG(filename);}
408  void renderCanvasToPNG(const std::string& filename) {canvas.renderToPNG(filename);}
409 
410 
414  void renderCanvasToPNG(const std::string& filename, const Canvas::ZoomCrop& z)
415  {canvas.renderToPNGCropped(filename,z);}
416 
418  void renderCanvasToEMF(const std::string& filename) {canvas.renderToEMF(filename);}
419 
421  void renderAllPlotsAsSVG(const string& prefix) const;
423  void exportAllPlotsAsCSV(const string& prefix) const;
424 
426  void setAllDEmode(bool);
428  void srand(int seed) {::srand(seed);}
429 
430  // godley table display values preferences
431  bool displayValues=false;
433 
435  void setGodleyDisplayValue(bool displayValues, GodleyTable::DisplayStyle displayStyle);
436 
438  void importVensim(const std::string&);
439 
441  void redrawAllGodleyTables();
442 
444  virtual void setBusyCursor() {}
445  virtual void clearBusyCursor() {}
447  virtual void progress(const std::string& title,int) {}
448 
450  virtual void bookmarkRefresh() {}
451 
453  virtual void resetScroll() {}
454 
456  virtual void message(const std::string&) {}
457 
459  virtual void runItemDeletedCallback(const Item&) {}
460 
463  enum MemCheckResult {OK, proceed, abort};
464  virtual MemCheckResult checkMemAllocation(size_t bytes) const {return OK;}
465 
467  /*static*/ std::size_t physicalMem() const;
468 
469  vector<string> listFonts() const {
470  vector<string> r;
471 #ifdef PANGO
472  PangoFontFamily **families;
473  int num;
474  pango_font_map_list_families(pango_cairo_font_map_get_default(),
475  &families,&num);
476  for (int i=0; i<num; ++i)
477  r.push_back(pango_font_family_get_name(families[i]));
478  g_free(families);
479  std::sort(r.begin(),r.end());
480 #endif
481  return r;
482  }
483 
485  /*static*/ std::string defaultFont();
486  /*static*/ std::string defaultFont(const std::string& x);
488 
490  /*static*/ double fontScale();
491  /*static*/ double fontScale(double);
493 
494  /*static*/ int numOpArgs(OperationType::Type o);
496 
497  void latex(const std::string& filename, bool wrapLaTeXLines);
498 
499  void matlab(const std::string& filename) {
500  if (cycleCheck()) throw error("cyclic network detected");
501  ofstream f(filename);
503  }
504 
505  // for testing purposes
506  string latex2pango(const std::string& x) {return latexToPango(x.c_str());}
507 
509  /*static*/ std::vector<std::string> availableOperations();
510  using AvailableOperationsMapping=classdesc::StringKeyMap<std::vector<OperationType::Type>>;
511  /*static*/ Minsky::AvailableOperationsMapping availableOperationsMapping() const;
512 
514  /*static*/ std::vector<std::string> variableTypes();
516  /*static*/ std::vector<std::string> assetClasses();
517 
518  void autoLayout();
519  void randomLayout();
520  void openGroupInCanvas() {canvas.openGroupInCanvas(canvas.item);}
523  void openModelInCanvas() {canvas.openGroupInCanvas(model);}
524 
526  std::shared_ptr<VariableInstanceList> variableInstanceList;
527  void listAllInstances();
528 
529  std::map<std::string,std::weak_ptr<Item>> namedItems;
530  void nameCurrentItem(const std::string& name) {namedItems[name]=canvas.item;}
531  void itemFromNamedItem(const std::string& name) {canvas.item=namedItems[name].lock();}
532 
535  {return checkMemAllocation(std::numeric_limits<size_t>::max());}
536 
538 
540  char getc() const {return std::getc(stdin);}
541 
543  void setDefinition(const std::string& valueId, const std::string& definition);
544  };
545 
547  Minsky& minsky();
549  inline const Minsky& cminsky() {return minsky();}
551  struct LocalMinsky
552  {
553  LocalMinsky(Minsky& m);
554  ~LocalMinsky();
555  };
556 
557 
558 
559 }
560 
561 #ifdef _CLASSDESC
562 #pragma omit pack minsky::MinskyExclude
563 #pragma omit unpack minsky::MinskyExclude
564 #pragma omit TCL_obj minsky::MinskyExclude
565 #pragma omit xml_pack minsky::MinskyExclude
566 #pragma omit xml_unpack minsky::MinskyExclude
567 #pragma omit xsd_generate minsky::MinskyExclude
568 
569 #pragma omit xml_pack minsky::Integral
570 #pragma omit xml_unpack minsky::Integral
571 
572 #pragma omit pack minsky::MinskyMatrix
573 #pragma omit unpack minsky::MinskyMatrix
574 #pragma omit xml_pack minsky::MinskyMatrix
575 #pragma omit xml_unpack minsky::MinskyMatrix
576 #pragma omit xsd_generate minsky::MinskyMatrix
577 #endif
578 
579 #include "minsky.cd"
580 #endif
virtual void message(const std::string &)
display a message in a popup box on the GUI
Definition: minsky.h:456
static SVGRenderer svgRenderer
Definition: group.h:259
function f
Definition: canvas.m:1
std::set< RenderNativeWindow * > nativeWindowsToRedraw
record nativeWindows that have requested redrawing
Definition: minsky.h:107
PannableTab< EquationDisplay > equationDisplay
Definition: minsky.h:153
void matlab(const std::string &filename)
Definition: minsky.h:499
std::string latexToPango(const char *s)
Definition: latexMarkup.h:30
string latex2pango(const std::string &x)
Definition: minsky.h:506
void pushFlags()
push and pop state of the flags
Definition: minsky.h:185
void setGodleyIconResource(const string &s)
Definition: minsky.h:215
vector< string > listFonts() const
Definition: minsky.h:469
char getc() const
Used to implement a pause until return pressed for attaching debugger purposes.
Definition: minsky.h:540
virtual void setBusyCursor()
set/clear busy cursor in GUI
Definition: minsky.h:444
static bool ravelExpired()
Definition: minsky.h:348
std::set< string > logVarList
set of variables (valueIds) to log
Definition: minsky.h:302
Clipboard clipboard
clipboard manager
Definition: minsky.h:98
virtual void clearBusyCursor()
Definition: minsky.h:445
MinskyExclude & operator=(const MinskyExclude &)
Definition: minsky.h:104
variablePane
Definition: variablePane.tcl:4
OperationType::Group classifyOp(OperationType::Type o) const
Definition: minsky.h:495
void closeLogFile()
closes log file
Definition: minsky.h:300
bool inputWired(const std::string &name) const
returns true if any variable of name name has a wired input
Definition: minsky.h:399
reset
Definition: minsky.tcl:1325
VariableValues variableValues
Definition: minsky.h:200
std::string ecolabVersion() const
Definition: minsky.h:338
virtual void runItemDeletedCallback(const Item &)
run callback attached to item
Definition: minsky.h:459
std::vector< int > flagStack
Definition: minsky.h:96
std::map< Units, double > maxValue
stash the maximum absolute value obtained by a dimensioned quantity
Definition: minsky.h:204
void checkPushHistory()
called periodically to ensure history up to date
Definition: minsky.h:365
virtual MemCheckResult checkMemAllocation(size_t bytes) const
Definition: minsky.h:464
MemCheckResult
check whether to proceed or abort, given a request to allocate bytes of memory. Implemented in Minsky...
Definition: minsky.h:463
bool edited() const
reflects whether the model has been changed since last save
Definition: minsky.h:169
STL namespace.
std::map< Units, double > maxFlowValue
Definition: minsky.h:205
void renderCanvasToEMF(const std::string &filename)
render canvas to a EMF image file (Windows only)
Definition: minsky.h:418
void setResource(const std::string &resource)
initialise object from an SVG file
Definition: SVGItem.cc:57
void addNewPublicationTab(const std::string &name)
Definition: minsky.h:158
static SVGRenderer svgRenderer
SVG icon to display when not in editor mode.
Definition: ravelWrap.h:83
static int daysUntilRavelExpires()
Definition: minsky.h:349
bool loggingEnabled() const
returns true if logging is in operation
Definition: minsky.h:304
void setLockIconResource(const string &locked, const string &unlocked)
Definition: minsky.h:219
ItemType
Definition: minsky.h:121
void nameCurrentItem(const std::string &name)
Definition: minsky.h:530
string valueId(const string &name)
construct a valueId from fully qualified name @ name should not be canonicalised
Definition: valueId.cc:75
void renderCanvasToSVG(const std::string &filename)
render canvas to an SVG file
Definition: minsky.h:406
undodelta
Definition: minsky.tcl:747
bool resetIfFlagged() override
checks whether a reset is required, and resets the simulation if so
Definition: minsky.h:194
bool clipboardEmpty() const
return true if nothing available in clipboard
Definition: minsky.h:280
void markEdited()
indicate model has been changed since last saved
Definition: minsky.h:173
void renderCanvasToPS(const std::string &filename)
render canvas to a postscript file
Definition: minsky.h:402
static bool ravelAvailable()
Definition: minsky.h:347
virtual CmdData getCommandData(const std::string &command) const
return meta information on a given command
Definition: minsky.h:379
bool reset_flag() const
true if reset needs to be called prior to numerical integration
Definition: minsky.h:171
std::size_t historyPtr
Definition: minsky.h:117
VariablePane variablePane
Definition: minsky.h:537
classdesc::StringKeyMap< std::vector< OperationType::Type > > AvailableOperationsMapping
Definition: minsky.h:510
static SVGRenderer svgRenderer
SVG icon to display when not in editor mode.
Definition: godleyIcon.h:62
void populateMissingDimensionsFromVariable(const VariableValue &v)
Definition: minsky.h:211
std::string autoSaveFile() const
name of an auto save file
Definition: minsky.h:357
bool triggerCheckMemAllocationCallback() const
trigger checkMem callback for testing purposes
Definition: minsky.h:534
std::deque< classdesc::pack_t > history
save history of model for undo
Definition: minsky.h:116
void renderCanvasToPNG(const std::string &filename)
render canvas to a PNG image file
Definition: minsky.h:408
Exclude< ptime > lastRedraw
Definition: minsky.h:142
static SVGRenderer lockedIcon
Definition: lock.h:42
Creation and access to the minskyTCL_obj object, which has code to record whenever Minsky&#39;s state cha...
Definition: constMap.h:22
An RAII wrapper around jtanx&#39;s libclipboard (https://github.com/jtanx/libclipboard) ...
Definition: clipboard.h:28
void setRavelIconResource(const string &s)
Definition: minsky.h:223
std::vector< PubTab > publicationTabs
Definition: minsky.h:156
void clearAllMapsTCL()
Definition: minsky.h:261
Mixin implementing common panning functionality in tabs.
Definition: pannableTab.h:36
double deltaT() const
Definition: minsky.h:321
virtual void bookmarkRefresh()
refresh the bookmark menu after changes
Definition: minsky.h:450
shared_ptr< ofstream > outputDataFile
Definition: minsky.h:79
#define CLASSDESC_ACCESS(type)
std::shared_ptr< VariableInstanceList > variableInstanceList
supports navigation to all instances of current variable
Definition: minsky.h:526
void addCanvasItemToPublicationTab(size_t i)
Definition: minsky.h:159
const Minsky & cminsky()
const version to help in const correctness
Definition: minsky.h:549
step
Definition: minsky.tcl:1289
ostream & matlab(ostream &) const
render as MatLab code create equations suitable for Runge-Kutta solver
Definition: equations.cc:963
Progress progressState
Definition: minsky.h:93
bool multipleEquities() const
Definition: minsky.h:165
SVGRenderer histogramResource
Definition: minsky.h:225
std::string ravelVersion() const
Definition: minsky.h:339
void setGroupIconResource(const string &s)
Definition: minsky.h:217
static const std::string minskyVersion
return the AEGIS assigned version number
Definition: minsky.h:337
void saveCanvasItemAsFile(const string &fileName) const
Definition: minsky.h:267
Exclude< std::map< std::string, std::shared_ptr< CallableFunction > > > userFunctions
Definition: minsky.h:253
virtual void resetScroll()
reset main window scroll bars after model has been panned
Definition: minsky.h:453
static SVGRenderer unlockedIcon
Definition: lock.h:43
virtual void progress(const std::string &title, int)
set progress bar, out of 100, labelling the progress bar with title
Definition: minsky.h:447
std::map< std::string, std::weak_ptr< Item > > namedItems
Definition: minsky.h:529
void openModelInCanvas()
reinitialises canvas to the toplevel group
Definition: minsky.h:523
MinskyExclude(const MinskyExclude &)
Definition: minsky.h:103
std::shared_ptr< Group > GroupPtr
Definition: port.h:32
void itemFromNamedItem(const std::string &name)
Definition: minsky.h:531
PhillipsDiagram phillipsDiagram
Definition: minsky.h:155
cut
Definition: minsky.tcl:756
RAII set the minsky object to a different one for the current scope.
Definition: minsky.h:551
void clearAllMaps()
Definition: minsky.h:259
string latex(double)
convert double to a LaTeX string representing that value
Definition: node_latex.cc:28
string to_string(CONST84 char *x)
Definition: minskyTCLObj.h:33
void renderCanvasToPDF(const std::string &filename)
render canvas to a PDF file
Definition: minsky.h:404
Minsky & minsky()
global minsky object
Definition: minskyTCL.cc:51
FontDisplay fontSampler
Definition: minsky.h:154
void popFlags()
push and pop state of the flags
Definition: minsky.h:186
Conversions conversions
Definition: minsky.h:202
void srand(int seed)
set std library RNG seed
Definition: minsky.h:428
Minsky_multipleEquities(const std::string &name, ecolab::TCLAccessor< Minsky, bool >::Getter g, ecolab::TCLAccessor< Minsky, bool >::Setter s)
Definition: minsky.h:125
void saveSelectionAsFile(const string &fileName) const
Definition: minsky.h:281
save
Definition: minsky.tcl:1469
std::chrono::milliseconds resetDuration
Definition: minsky.h:91
Dimensions dimensions
Definition: minsky.h:201
void renderCanvasToPNG(const std::string &filename, const Canvas::ZoomCrop &z)
Render canvas to a PNG file filename, scaling the canvas temporarily by zoom, shifts it to left...
Definition: minsky.h:414
static Group classify(Type t)
std::string fileVersion
Minsky version file was saved under.
Definition: minsky.h:351
unique_ptr< BackgroundSaver > autoSaver
Definition: minsky.h:80
void clearHistory()
clear history
Definition: minsky.h:363