Minsky
schema3.h
Go to the documentation of this file.
1 /*
2  @copyright Steve Keen 2020
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 
25 #ifndef SCHEMA_3_H
26 #define SCHEMA_3_H
27 
28 #include "model/minsky.h"
29 #include "model/ravelWrap.h"
30 #include "model/sheet.h"
31 #include "dataSpecSchema.h"
32 #include "schema/schema2.h"
33 #include "schemaHelper.h"
34 #include "zStream.h"
35 #include "classdesc.h"
36 #include "polyXMLBase.h"
37 #include "polyJsonBase.h"
38 #include "simulation.h"
39 #include "showSlice.h"
40 
41 #include <xsd_generate_base.h>
42 #include <vector>
43 #include <string>
44 
45 
46 
47 namespace schema3
48 {
49 
51  using namespace std;
52  using namespace classdesc;
53  using classdesc::shared_ptr;
54  using minsky::Optional;
55  using minsky::HandleLockInfo; //for Ravel lock groups
56 
57  struct Note
58  {
60  Note() {}
61  Note(const minsky::NoteBase& x): detailedText(x.detailedText()), tooltip(x.tooltip()) {}
62  Note(const schema2::Note& x): detailedText(x.detailedText), tooltip(x.tooltip) {}
63  };
64 
65  // attribute common to all items
66  struct ItemBase: public minsky::PlotOptions<Note>
67  {
68  int id=-1;
69  std::string type;
70  float x=0, y=0;
71  float itemTabX=nan(""), itemTabY=nan("");
72  float scaleFactor=1;
73  double rotation=0;
74  float width=10, height=10;
75  std::vector<int> ports;
76  bool bookmark=false;
77  ItemBase() {}
78  ItemBase(int id, const minsky::Item& it, const std::vector<int>& ports):
79  minsky::PlotOptions<Note>(Note(it)), id(id), type(it.classType()),
80  x(it.m_x), y(it.m_y), scaleFactor(it.m_sf),
81  rotation(it.rotation()), width(it.iWidth()), height(it.iHeight()), ports(ports), bookmark(it.bookmark) {}
82  ItemBase(const schema2::Item& it, const std::string& type="Item"):
83  minsky::PlotOptions<Note>(it), id(it.id), type(type), x(it.x), y(it.y),
84  rotation(it.rotation), width(it.width? *it.width: 0), height(it.height?*it.height:0),
85  ports(it.ports) {}
86  };
87 
88  struct Slider
89  {
90  bool stepRel=false, visible=true;
91  double min, max, step;
92  Slider() {}
93  Slider(bool stepRel, bool visible, double min, double max, double step):
94  stepRel(stepRel), visible(visible), min(min), max(max), step(step) {}
96  stepRel(s.stepRel), visible(s.visible), max(s.max), step(s.step) {}
97  };
98 
99  struct LockGroup
100  {
101  vector<int> ravels;
102  vector<HandleLockInfo> handleLockInfo;
103  };
104 
105  struct Item: public ItemBase
106  {
110  bool miniPlot=false; // miniature plots on variables
112  Optional<std::string> url; //file or url of CSV import data
121  // Operation tensor parameters
124  // Godley Icon specific fields
127  Optional<bool> editorMode, buttonDisplay, variableDisplay;
129  // sheet specific fields
132  // group specific fields
134  Optional<classdesc::CDATA> tensorData; // used for saving tensor data attached to parameters
136 
137  void packTensorInit(const minsky::VariableBase&);
138 
139  Item() {}
140  Item(int id, const minsky::Item& it, const std::vector<int>& ports): ItemBase(id,it,ports) {}
141  // minsky object importers
142  Item(int id, const minsky::VariableBase& v, const std::vector<int>& ports):
143  ItemBase(id,static_cast<const minsky::Item&>(v),ports),
144  init(v.init()), miniPlot(v.miniPlotEnabled()) {
145  name=v.rawName();
146  slider.reset(new Slider(v.sliderStepRel(),v.enableSlider(),v.sliderMin(),v.sliderMax(),v.sliderStep()));
147  if (auto vv=v.vValue())
148  {
149  units=vv->units.str();
150  if (!vv->csvDialog.url.empty())
151  csvDataSpec=vv->csvDialog.spec.toSchema();
152  url=vv->csvDialog.url;
153  }
154  }
155  Item(int id, const minsky::OperationBase& o, const std::vector<int>& ports):
156  ItemBase(id,static_cast<const minsky::Item&>(o),ports),
157  axis(o.axis), arg(o.arg) {}
158  Item(int id, const minsky::GodleyIcon& g, const std::vector<int>& ports):
159  ItemBase(id,static_cast<const minsky::Item&>(g),ports),
160  data(g.table.getData()), assetClasses(g.table._assetClass()),
161  editorMode(g.editorMode()), buttonDisplay(g.buttonDisplay()),
162  variableDisplay(g.variableDisplay()), currency(g.currency)
163  {name=g.table.title;}
164  Item(int id, const minsky::PlotWidget& p, const std::vector<int>& ports):
165  ItemBase(id,static_cast<const minsky::Item&>(p),ports),
166  palette(p.palette)
167  {
168  static_cast<PlotOptions&>(*this)=p;
169  }
170  Item(int id, const minsky::SwitchIcon& s, const std::vector<int>& ports):
171  ItemBase(id, static_cast<const minsky::Item&>(s),ports)
172  {if (s.flipped) rotation=180;}
173  Item(int id, const minsky::Group& g, const std::vector<int>& ports):
174  ItemBase(id, static_cast<const minsky::Item&>(g),ports),
175  bookmarks(std::vector<minsky::Bookmark>(g.bookmarks.begin(), g.bookmarks.end()))
176  {name=g.title;}
177 
178  static Optional<classdesc::CDATA> convertTensorDataFromSchema2(const Optional<classdesc::CDATA>&);
179 
180  Item(const schema2::Item& it):
181  ItemBase(it,it.type), init(it.init), units(it.units),
182  slider(it.slider), intVar(it.intVar), dataOpData(it.dataOpData), filename(it.filename),
183  ravelState(it.ravelState), lockGroup(it.lockGroup), dimensions(it.dimensions),
184  axis(it.axis), arg(it.arg), data(it.data), assetClasses(it.assetClasses),
185  bookmarks(it.bookmarks), tensorData(convertTensorDataFromSchema2(it.tensorData)),
186  palette(it.palette)
187  {name=it.name;}
188 
189 
190  };
191 
192 
193  struct Wire: public Note
194  {
195  int id=-1;
196  int from=-1, to=-1;
198  Wire() {}
199  Wire(int id, const minsky::Wire& w): Note(w), id(id) {
200  if (w.coords().size()>4)
201  coords.reset(new std::vector<float>(w.coords()));
202  }
203  Wire(const schema2::Wire& w): Note(w), id(w.id), from(w.from), to(w.to), coords(w.coords) {}
204  };
205 
206  struct Group: public Item
207  {
208  vector<int> items;
209  int displayPlot=-1;
211  Group() {}
212  Group(int id, const minsky::Group& g): Item(id,g,std::vector<int>()) {}
213 
215  Item(g), items(g.items), inVariables(g.inVariables), outVariables(g.outVariables) {}
216  };
217 
218  struct PhillipsFlow: public Wire
219  {
220  PhillipsFlow()=default;
221  PhillipsFlow(int id, const minsky::Wire& w): Wire(id, w) {}
222  vector<pair<double, Item>> terms;
223  };
224 
226  {
227  std::vector<Item> stocks;
228  std::vector<PhillipsFlow> flows;
229  PhillipsDiagram()=default;
232  void populatePhillipsDiagram(minsky::PhillipsDiagram&) const;
233  };
234 
235  struct MinskyImpl;
236 
238  {
239  std::shared_ptr<MinskyImpl> impl;
240  };
241 
242  class Minsky: public Exclude<ExcludedMinsky>
243  {
245  public:
246  static const int version=3;
247  int schemaVersion=Minsky::version;
248  std::string minskyVersion="unknown";
249  vector<Wire> wires;
250  vector<Item> items;
252  vector<Group> groups;
253  vector<LockGroup> lockGroups;
255  double zoomFactor=1;
256  vector<minsky::Bookmark> bookmarks;
257  minsky::Dimensions dimensions;
258  minsky::ConversionsMap conversions;
260  std::vector<PublicationTab> publicationTabs;
261  std::vector<Item> publicationItems;
262 
263  Minsky(): schemaVersion(0) {makeImpl();} // schemaVersion defined on read in
264  ~Minsky();
265  Minsky(const minsky::Group& g, bool packTensorData=true);
266  Minsky(const minsky::Minsky& m, bool packTensorData=true):
267  Minsky(*m.model,packTensorData) {
268  minskyVersion=m.minskyVersion;
269  rungeKutta=m;
270  zoomFactor=m.model->zoomFactor();
271  bookmarks.insert(bookmarks.end(), m.model->bookmarks.begin(), m.model->bookmarks.end());
272  dimensions=m.dimensions;
273  conversions=m.conversions;
274  phillipsDiagram=PhillipsDiagram(m.phillipsDiagram);
275  populateSchemaPublicationTabs(m.publicationTabs);
276  }
277 
278  void makeImpl(); // creates the impl.
279 
281  Minsky(classdesc::xml_unpack_t& data): schemaVersion(0)
282  {makeImpl(); minsky::loadSchema<schema2::Minsky>(*this,data,"Minsky");}
283 
285  schemaVersion(m.schemaVersion),
286  wires(m.wires.begin(), m.wires.end()),
287  items(m.items.begin(), m.items.end()),
288  groups(m.groups.begin(), m.groups.end()), rungeKutta(m.rungeKutta),
289  zoomFactor(m.zoomFactor), bookmarks(m.bookmarks), dimensions(m.dimensions),
290  conversions(m.conversions) {makeImpl();}
291 
292  void populateSchemaPublicationTabs(const std::vector<minsky::PubTab>&);
293  void populatePublicationTabs(std::vector<minsky::PubTab>&) const;
294 
296  void populateMinsky(minsky::Minsky&) const;
297 
301  void populateGroup(minsky::Group& g) const;
302 
303  };
304 
305 
306 }
307 
309 using classdesc::xml_pack;
310 
311 #include "schema3.cd"
312 #include "schema3.xcd"
313 #include "handleLockInfo.xcd"
314 
315 #endif
vector< minsky::Bookmark > bookmarks
Definition: schema3.h:256
Optional< std::map< double, double > > dataOpData
Definition: schema3.h:114
vector< LockGroup > lockGroups
Definition: schema3.h:253
Optional< minsky::ShowSlice > showSlice
Definition: schema3.h:130
ItemBase(int id, const minsky::Item &it, const std::vector< int > &ports)
Definition: schema3.h:78
const std::string & rawName() const
accessor for the name member (may differ from name() with top level variables)
Definition: variable.h:150
Item(int id, const minsky::PlotWidget &p, const std::vector< int > &ports)
Definition: schema3.h:164
minsky::Dimensions dimensions
Definition: schema3.h:257
Wire(int id, const minsky::Wire &w)
Definition: schema3.h:199
Optional< std::string > axis
Definition: schema3.h:122
Optional< std::string > expression
Definition: schema3.h:115
Optional< std::string > init
Definition: schema3.h:107
vector< Group > groups
Definition: schema3.h:252
std::vector< int > ports
Definition: schema3.h:75
std::vector< Item > stocks
Definition: schema3.h:227
Optional< std::string > url
Definition: schema3.h:112
Optional< int > lockGroup
Definition: schema3.h:118
Optional< string > currency
Definition: schema3.h:128
STL namespace.
Optional< vector< int > > outVariables
Definition: schema3.h:210
PhillipsDiagram phillipsDiagram
Definition: schema3.h:259
double step
Definition: schema3.h:91
void xsd_generate(xsd_generate_t &g, const string &d, const minsky::Optional< T > &a)
Definition: optional.h:77
Optional< Slider > slider
Definition: schema3.h:109
Item(int id, const minsky::SwitchIcon &s, const std::vector< int > &ports)
Definition: schema3.h:170
Slider(bool stepRel, bool visible, double min, double max, double step)
Definition: schema3.h:93
Optional< minsky::ShowSlice > showColSlice
Definition: schema3.h:131
vector< Item > items
Definition: schema3.h:250
double sliderMax() const
slider parameters
Definition: variable.cc:647
Item(int id, const minsky::Item &it, const std::vector< int > &ports)
Definition: schema3.h:140
Optional< std::vector< ecolab::Plot::LineStyle > > palette
Definition: schema3.h:135
std::shared_ptr< MinskyImpl > impl
Definition: schema3.h:239
convenience class to omit writing XML records when data absent or empty
Definition: optional.h:39
std::vector< PhillipsFlow > flows
Definition: schema3.h:228
vector< int > ravels
Definition: schema3.h:101
Slider(const schema2::Slider &s)
Definition: schema3.h:95
GodleyTable table
table data. Must be declared before editor
Definition: godleyIcon.h:80
Optional< schema2::RavelState > ravelState
Definition: schema3.h:117
struct TCLcmd::trap::init_t init
Wire(const schema2::Wire &w)
Definition: schema3.h:203
Optional< std::vector< minsky::Bookmark > > bookmarks
Definition: schema3.h:133
Item(int id, const minsky::VariableBase &v, const std::vector< int > &ports)
Definition: schema3.h:142
vector< int > items
Definition: schema3.h:208
Optional< std::vector< std::vector< std::string > > > data
Definition: schema3.h:125
Creation and access to the minskyTCL_obj object, which has code to record whenever Minsky&#39;s state cha...
Definition: constMap.h:22
Item(int id, const minsky::GodleyIcon &g, const std::vector< int > &ports)
Definition: schema3.h:158
Item(int id, const minsky::OperationBase &o, const std::vector< int > &ports)
Definition: schema3.h:155
Optional< std::set< std::string > > lockGroupHandles
Definition: schema3.h:119
Item(const schema2::Item &it)
Definition: schema3.h:180
Optional< bool > variableDisplay
Definition: schema3.h:127
Note(const minsky::NoteBase &x)
Definition: schema3.h:61
Note(const schema2::Note &x)
Definition: schema3.h:62
Group(int id, const minsky::Group &g)
Definition: schema3.h:212
Optional< classdesc::CDATA > tensorData
Definition: schema3.h:134
Optional< vector< int > > outVariables
Definition: schema3.h:251
Optional< std::vector< float > > coords
Definition: schema3.h:197
std::vector< PubTab > publicationTabs
Definition: minsky.h:156
working structure, not serialised
Definition: schema3.h:237
Group(const schema2::Group &g)
Definition: schema3.h:214
Optional< std::vector< minsky::GodleyAssetClass::AssetClass > > assetClasses
Definition: schema3.h:126
minsky::ConversionsMap conversions
Definition: schema3.h:258
std::string title
Definition: group.h:240
#define CLASSDESC_ACCESS(type)
Optional< minsky::Dimensions > dimensions
Definition: schema3.h:120
Minsky(const schema2::Minsky &m)
Definition: schema3.h:284
vector< pair< double, Item > > terms
Definition: schema3.h:222
Optional< std::string > tooltip
Definition: schema3.h:59
Item(int id, const minsky::Group &g, const std::vector< int > &ports)
Definition: schema3.h:173
Optional< std::string > filename
Definition: schema3.h:116
step
Definition: minsky.tcl:1289
Minsky(const minsky::Minsky &m, bool packTensorData=true)
Definition: schema3.h:266
vector< HandleLockInfo > handleLockInfo
Definition: schema3.h:102
ItemBase(const schema2::Item &it, const std::string &type="Item")
Definition: schema3.h:82
minsky::Simulation rungeKutta
Definition: schema3.h:254
Optional< minsky::DataSpecSchema > csvDataSpec
Definition: schema3.h:113
std::string title
Definition: godleyTable.h:60
static const std::string minskyVersion
return the AEGIS assigned version number
Definition: minsky.h:337
Optional< std::string > name
Definition: schema2.h:97
void xml_pack(xml_pack_t &t, const string &d, minsky::Optional< T > &a)
Definition: optional.h:84
bool enableSlider() const
slider parameters
Definition: variable.cc:689
vector< Wire > wires
Definition: schema3.h:249
bool sliderStepRel() const
slider parameters
Definition: variable.cc:675
PhillipsDiagram phillipsDiagram
Definition: minsky.h:155
Optional< double > arg
Definition: schema3.h:123
GroupPtr model
Definition: minsky.h:255
double sliderStep() const
slider parameters
Definition: variable.cc:661
PhillipsFlow(int id, const minsky::Wire &w)
Definition: schema3.h:221
Minsky(classdesc::xml_unpack_t &data)
populate schema from XML data
Definition: schema3.h:281
a container item for a plot widget
Definition: plotWidget.h:46
std::vector< Item > publicationItems
Definition: schema3.h:261
Conversions conversions
Definition: minsky.h:202
std::shared_ptr< VariableValue > vValue() const
variableValue associated with this. nullptr if not associated with a variableValue ...
Definition: variable.cc:161
std::string type
Definition: schema3.h:69
Optional< int > intVar
Definition: schema3.h:111
double sliderMin() const
slider parameters
Definition: variable.cc:632
std::vector< PublicationTab > publicationTabs
Definition: schema3.h:260
Dimensions dimensions
Definition: minsky.h:201
Optional< std::string > units
Definition: schema3.h:108
static const int version
Definition: schema3.h:246