30 const int Minsky::version;
37 void insert(
int id) {ids.insert(
id);}
39 return ids.contains(v.
id);
42 return l && ids.contains(l->id);
47 void Minsky::removeIntVarOrphans()
50 for (vector<Operation>::const_iterator o=model.operations.begin();
51 o!=model.operations.end(); ++o)
53 intNames.insert(o->name);
56 for (vector<Variable>::const_iterator v=model.variables.begin();
57 v!=model.variables.end(); ++v)
60 isOrphan.insert(v->id);
63 (remove_if(model.variables.begin(), model.variables.end(), isOrphan),
64 model.variables.end());
66 (remove_if(layout.begin(), layout.end(), isOrphan), layout.end());
73 map<int,int> newPortIds;
74 map<int,int> newOpIds;
75 map<int,int> newVarIds;
77 for (
auto& i: m.
ports)
78 newPortIds[i.first]=nextId++;
79 for (
auto& i: m.
wires)
81 model.wires.emplace_back(nextId, newPortIds[i.second.from], newPortIds[i.second.to]);
82 layout.emplace_back(
new WireLayout(nextId++, i.second));
86 newVarIds[v.first]=nextId;
87 v.second.m_outPort=newPortIds[v.second.m_outPort];
88 if (v.second.m_inPort>=0)
89 v.second.m_inPort=newPortIds[v.second.m_inPort];
93 v.second.init=value->second.init;
94 model.variables.emplace_back(nextId, v.second);
95 layout.emplace_back(
new ItemLayout(nextId++, v.second));
99 newOpIds[i.first]=nextId;
100 for (
auto& j: i.second.m_ports)
102 if (i.second.intVar>-1) i.second.intVar=newVarIds[i.second.intVar];
103 model.operations.emplace_back(nextId, i.second);
104 layout.emplace_back(
new ItemLayout(nextId++, i.second));
109 for (
auto& j: i.second.ports)
113 i.second.ports=(pcoord(6)+nextId)<<
114 i.second.ports[pcoord(8)+4]<<
115 i.second.ports[pcoord(4)]<<
116 (pcoord(4)+nextId+6);
118 model.plots.emplace_back(nextId, i.second);
119 layout.emplace_back(
new PlotLayout(nextId++, i.second));
124 for (
auto& i: g.second.operations)
126 for (
auto& i: g.second.variables)
128 for (
auto& j: g.second.m_ports)
131 model.groups.emplace_back(nextId, g.second);
132 layout.emplace_back(
new GroupLayout(nextId++, g.second));
138 for (
auto& v: g.second.flowVars)
139 v.m_inPort=newPortIds[v.m_inPort];
140 for (
auto& v: g.second.stockVars)
141 v.m_outPort=newPortIds[v.m_outPort];
142 model.godleys.emplace_back(nextId, g.second);
143 layout.emplace_back(
new PositionLayout(nextId++, g.second.x, g.second.y));
146 model.rungeKutta.stepMin=m.
stepMin;
147 model.rungeKutta.stepMax=m.
stepMax;
148 model.rungeKutta.nSteps=m.
nSteps;
149 model.rungeKutta.epsAbs=m.
epsAbs;
150 model.rungeKutta.epsRel=m.
epsRel;
151 removeIntVarOrphans();
158 template<> Factory<schema1::Item,string>::Factory() {}
159 template<> Factory<schema1::Layout,string>::Factory()
165 using classdesc::Factory;
170 using Factory<schema1::Item,string>::registerType;
173 {registerType<T>(classdesc::typeName<T>());}
represent objects whose layouts just have a position (ports, plots, godleyIcons)
bool operator()(const shared_ptr< Layout > &l) const
int nSteps
number of steps per GUI update
VariableValues values
map of ports to variables
void enumerateRegisterItems(F &f)
utilities to call registerType for these class heirarchies, for different factory types ...
double epsAbs
absolute error
Factory< schema1::Layout, string > factoryForLayout
represents layouts of objects like variables and operators
represents layouts of wires
group layouts also have a width & height
double stepMin
Runge-Kutta parameters.
double epsRel
relative error
double stepMax
maximum step size
void enumerateRegisterLayout(Factory &f)
VariableManager variables
bool operator()(const Variable &v) const