32 bool operator()(
char c)
const {
return !isalnum(c) && c!=
'_';}
37 name.erase(remove_if(name.begin(), name.end(),
InvalidChar()), name.end());
38 if (name.empty() || isdigit(name[0]))
47 if (
init.empty())
return "0";
54 case 0:
return str(t[0]);
56 for (
auto i: t) r+=
str(i)+
",";
60 for (
size_t i=0; i<t.hypercube().xvectors[1].size(); ++i)
62 for (
size_t j=0; j<t.hypercube().xvectors[0].size(); ++j)
63 r+=
str(t[i*t.hypercube().xvectors[0].size()+j])+
",";
68 throw error(
"high rank tensors not supported in Matlab");
72 ostream& VariableDAG::matlab(ostream& o)
const 88 if (arguments.empty()||
89 (arguments[0].empty() &&
90 (arguments.size()<2||arguments[1].empty())))
92 for (
size_t i=0; i<arguments[0].size(); ++i)
96 o<<arguments[0][i]->matlab();
98 if (arguments.size()>1)
100 if (!arguments[0].empty() && !arguments[1].empty()) o<<
"+";
101 for (
size_t i=0; i<arguments[1].size(); ++i)
105 o<<arguments[1][i]->matlab();
114 if (arguments.empty()||
115 (arguments[0].empty() &&
116 (arguments.size()<2||arguments[1].empty())))
118 for (
size_t i=0; i<arguments[0].size(); ++i)
122 o<<arguments[0][i]->matlab();
124 if (arguments.size()>1 && !arguments[1].empty()>0)
127 for (
size_t i=0; i<arguments[1].size(); ++i)
131 o<<arguments[1][i]->matlab();
141 if (arguments.empty()||
142 (arguments[0].empty() &&
143 (arguments.size()<2||arguments[1].empty())))
145 for (
size_t i=0; i<arguments[0].size(); ++i)
149 o<<
"("<<arguments[0][i]->matlab()<<
")";
151 if (!arguments[0].empty() && !arguments[1].empty()) o<<
"*";
152 for (
size_t i=0; i<arguments[1].size(); ++i)
156 o<<
"("<<arguments[1][i]->matlab()<<
")";
164 if (arguments.empty()||
165 (arguments[0].empty() &&
166 (arguments.size()<2||arguments[1].empty())))
168 if (arguments[0].empty())
170 for (
size_t i=0; i<arguments[0].size(); ++i)
174 o<<
"("<<arguments[0][i]->matlab()<<
")";
176 if (arguments.size()>1 && !arguments[1].empty())
179 for (
size_t i=0; i<arguments[1].size(); ++i)
183 o<<
"("<<arguments[1][i]->matlab()<<
")";
193 checkArg(0,0); checkArg(1,0);
194 return o<<
"log("<<arguments[0][0]->matlab()<<
")/log("<<
195 arguments[1][0]->matlab()<<
")";
201 checkArg(0,0); checkArg(1,0);
202 return o<<
"("<<arguments[0][0]->matlab()<<
")^("<<arguments[1][0]->matlab()<<
")";
208 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
209 o<<
"(("<<arguments[0][0]->matlab()<<
")";
212 if (arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
213 o<<
"<("<<arguments[1][0]->matlab()<<
")";
222 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
223 o<<
"(("<<arguments[0][0]->matlab()<<
")";
226 if (arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
227 o<<
"<=("<<arguments[1][0]->matlab()<<
")";
236 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
237 o<<
"(("<<arguments[0][0]->matlab()<<
")";
240 if (arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
241 o<<
"==("<<arguments[1][0]->matlab()<<
")";
250 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
251 if (arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
252 o<<
"min("<<arguments[0][0]->matlab()<<
"," <<
253 arguments[1][0]->
matlab()<<
")";
255 o<<
"min("<<arguments[0][0]->matlab()<<
",0)";
257 if (arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
258 o<<
"min(0,"<<arguments[1][0]->matlab()<<
")";
267 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
268 if (arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
269 o<<
"max("<<arguments[0][0]->matlab()<<
"," <<
270 arguments[1][0]->
matlab()<<
")";
272 o<<
"max("<<arguments[0][0]->matlab()<<
",0)";
274 if (arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
275 o<<
"max(0,"<<arguments[1][0]->matlab()<<
")";
284 if (arguments.size()>1 && !arguments[0].empty() && arguments[0][0] &&
285 !arguments[1].empty() && arguments[1][0])
286 o<<
"(("<<arguments[0][0]->matlab()<<
")>=0.5 && (" <<
287 arguments[1][0]->
matlab()<<
")>=0.5)";
296 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
297 if (arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
298 o<<
"(("<<arguments[0][0]->matlab()<<
")>=0.5 || (" <<
299 arguments[1][0]->
matlab()<<
")>=0.5)";
301 o<<
"(("<<arguments[0][0]->matlab()<<
")>=0.5)";
303 if (arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
304 o<<
"(("<<arguments[1][0]->matlab()<<
")>=0.5)";
313 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
314 o<<
"(("<<arguments[0][0]->matlab()<<
")<0.5)";
327 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0] &&
328 arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
329 return o<<
"cov("<<arguments[0][0]->matlab()<<
"," <<
330 arguments[1][0]->
matlab()<<
")";
337 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0] &&
338 arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
339 return o<<
"corr("<<arguments[0][0]->matlab()<<
"," <<
340 arguments[1][0]->
matlab()<<
")";
347 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0] &&
348 arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
349 return o<<
"linReg("<<arguments[0][0]->matlab()<<
"," <<
350 arguments[1][0]->
matlab()<<
")";
357 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
359 size_t dim=numeric_limits<size_t>::max();
360 if (
auto op=dynamic_cast<OperationBase*>(state.get()))
361 if (
auto vv=arguments[0][0]->result)
363 for (
auto& i: vv->hypercube().xvectors)
364 if (i.name==
op->axis)
366 dim=&i-&vv->hypercube().xvectors.front();
370 return o<<
"size("<<arguments[0][0]->matlab()<<
","<<dim<<
")";
372 return o<<
"prod(size("<<arguments[0][0]->matlab()<<
"))";
380 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
382 return o<<
"size("<<arguments[0][0]->
matlab()<<
")";
390 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
392 return o<<
"mean("<<arguments[0][0]->
matlab()<<
")";
400 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
402 return o<<
"median("<<arguments[0][0]->
matlab()<<
")";
410 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
412 return o<<
"std("<<arguments[0][0]->
matlab()<<
")";
420 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
423 if (
auto op=dynamic_cast<OperationBase*>(state.get()))
425 return o<<
"moment("<<arguments[0][0]->matlab()<<
","<<exponent<<
")";
434 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
437 if (
auto op=dynamic_cast<OperationBase*>(state.get()))
439 return o<<
"histogram("<<arguments[0][0]->matlab()<<
","<<nBins<<
")";
484 return o<<
"100*("<<arguments[0][0]->matlab()<<
")";
490 if (!arguments.empty() && !arguments[0].empty())
492 assert(arguments[0][0]);
493 o<<arguments[0][0]->matlab();
501 throw error(
"shouldn't be executed");
507 throw error(
"derivative operator should not appear in matlab output");
513 throw error(
"Data blocks are not yet supported in Matlab mode");
520 throw error(
"Ravels are not yet supported in Matlab mode");
528 return o<<
"sqrt("<<arguments[0][0]->matlab()<<
")";
535 return o<<
"exp("<<arguments[0][0]->matlab()<<
")";
542 return o<<
"log("<<arguments[0][0]->matlab()<<
")";
549 return o<<
"sin("<<arguments[0][0]->matlab()<<
")";
556 return o<<
"cos("<<arguments[0][0]->matlab()<<
")";
563 return o<<
"tan("<<arguments[0][0]->matlab()<<
")";
570 return o<<
"asin("<<arguments[0][0]->matlab()<<
")";
577 return o<<
"acos("<<arguments[0][0]->matlab()<<
")";
584 return o<<
"atan("<<arguments[0][0]->matlab()<<
")";
591 return o<<
"sinh("<<arguments[0][0]->matlab()<<
")";
598 return o<<
"cosh("<<arguments[0][0]->matlab()<<
")";
605 return o<<
"tanh("<<arguments[0][0]->matlab()<<
")";
612 return o<<
"abs("<<arguments[0][0]->matlab()<<
")";
619 return o<<
"floor("<<arguments[0][0]->matlab()<<
")";
626 return o<<
"frac("<<arguments[0][0]->matlab()<<
")";
633 return o<<
"gamma("<<arguments[0][0]->matlab()<<
")";
639 checkArg(0,0); checkArg(1,0);
640 return o<<
"psi(floor("<<arguments[1][0]->matlab()<<
"),("<<arguments[0][0]->matlab()<<
"))";
647 return o<<
"gamma(1+("<<arguments[0][0]->matlab()<<
"))";
653 if (arguments.empty() || arguments[0].empty())
654 return o<<dynamic_cast<UserFunction*>(state.get())->name()<<
"()";
655 if (arguments.size()<2 || arguments[1].empty())
656 return o<<dynamic_cast<UserFunction*>(state.get())->name()<<
"("<<arguments[0][0]->
matlab()<<
")";
657 return o<<dynamic_cast<UserFunction*>(state.get())->name()<<
"("<<arguments[0][0]->matlab()<<
","<<arguments[1][0]->matlab()<<
")";
665 return o<<
"sum("<<arguments[0][0]->matlab()<<
")";
671 return o<<
"prod("<<arguments[0][0]->matlab()<<
")";
677 return o<<
"max("<<arguments[0][0]->matlab()<<
")";
683 return o<<
"min("<<arguments[0][0]->matlab()<<
")";
689 return o<<
"find(("<<arguments[0][0]->matlab()<<
")==max("<<arguments[0][0]->matlab()<<
"))";
695 return o<<
"find(("<<arguments[0][0]->matlab()<<
")==min("<<arguments[0][0]->matlab()<<
"))";
701 return o<<
"any(("<<arguments[0][0]->matlab()<<
")>0.5)";
707 return o<<
"all(("<<arguments[0][0]->matlab()<<
")>0.5)";
713 return o<<
"cumsum("<<arguments[0][0]->matlab()<<
")";
719 return o<<
"cumprod("<<arguments[0][0]->matlab()<<
")";
725 return o<<
"diff("<<arguments[0][0]->matlab()<<
")";
732 return o<<
"diff("<<arguments[0][0]->matlab()<<
")";
739 return o<<
"("<<arguments[0][0]->matlab()<<
")*("<<arguments[1][0]->matlab()<<
")";
747 return o<<
"("<<arguments[0][0]->matlab()<<
").*transpose("<<arguments[1][0]->matlab()<<
")";
753 return o<<
"find(("<<arguments[0][0]->matlab()<<
")>0.5)";
758 checkArg(0,0);checkArg(1,0);
759 return o<<
"("<<arguments[0][0]->matlab()<<
")("<<arguments[1][0]->matlab()<<
")";
764 checkArg(0,0);checkArg(1,0);
765 return o<<
"meld("<<arguments[0][0]->matlab()<<
","<<arguments[1][0]->matlab()<<
")";
770 checkArg(0,0);checkArg(1,0);
771 return o<<
"meld("<<arguments[0][0]->matlab()<<
","<<arguments[1][0]->matlab()<<
")";
776 checkArg(0,0);checkArg(1,0);
779 if (
auto o=state->operationCast())
781 return o<<
"slice("<<arguments[0][0]->matlab()<<
","<<slice<<
")";
ostream & matlab(ostream &o) const override
writes a matlab representation of this DAG to the stream
TensorVal initValue(const VariableValue &, std::set< std::string > &visited) const
evaluates the initial value of a given variableValue in the context given by this. visited is used to check for circular definitions
VariableValues variableValues
const std::string & init() const
string validMatlabIdentifier(string name)
struct TCLcmd::trap::init_t init
Creation and access to the minskyTCL_obj object, which has code to record whenever Minsky's state cha...
string matlabInit(const string &)
convert an initialisation string into a matlab expression
std::string str(T x)
utility function to create a string representation of a numeric type
const Minsky & cminsky()
const version to help in const correctness
bool operator()(char c) const