30 if (abs(x)>0 && (abs(x)>=1e5 || abs(x)<=1e-4))
32 int exponent=
static_cast<int>(log10(abs(x)));
33 if (exponent<0) exponent++;
34 return str(x/
pow(10.0,exponent))+
"\\times10^{"+
str(exponent)+
"}";
45 if ((ss=nm.find_first_of(
"_^"))!=string::npos)
46 return mathrm(nm.substr(0, ss)) + nm[ss] +
"{"+
mathrm(nm.substr(ss+1))+
"}";
50 if ((pc=nm.find_first_of(
'%'))!=string::npos)
51 if (pc>0 && nm[pc-1]!=
'\\')
52 return mathrm(nm.substr(0, pc)) +
"\\" + nm[pc] +
mathrm(nm.substr(pc+1));
55 if (nm.length()==1 || nm.find(
'\\')!=string::npos)
57 return "\\mathrm{"+nm+
"}";
68 ParenIf(ostream& o,
bool c): o(o), c(c) {
if (c) o<<
"\\left(";}
75 if (
init.empty())
return "0";
82 case 0:
return str(t[0]);
84 for (
size_t i=0; i<5 && i<t.size(); ++i)
115 return o<<
mathrm(name)<<
"("<<arguments[0][0]->latex()<<
")";
122 if (!arguments.empty() && !arguments[0].empty())
123 return o<<
"("<<arguments[0][0]->
latex()<<
")";
130 for (
size_t i=0; !arguments.empty() && i<arguments[0].size(); ++i)
134 o<<arguments[0][i]->latex();
136 if (arguments.size()>1 && !arguments[0].empty() && !arguments[1].empty()) o<<
"+";
137 for (
size_t i=0; arguments.size()>1 && i<arguments[1].size(); ++i)
141 o<<arguments[1][i]->latex();
149 for (
size_t i=0; !arguments.empty() && i<arguments[0].size(); ++i)
153 o<<arguments[0][i]->latex();
155 if (arguments.size()>1 && !arguments[1].empty())
159 const ParenIf p(o, (arguments[1].size()>1 ||
160 BODMASlevel() == arguments[1][0]->BODMASlevel()));
161 for (
size_t i=0; i<arguments[1].size(); ++i)
165 o<<arguments[1][i]->latex();
174 for (
size_t i=0; !arguments.empty() && i<arguments[0].size(); ++i)
177 if (i>0) o<<
"\\times ";
178 const ParenIf p(o, arguments[0][i]->BODMASlevel()>BODMASlevel());
179 o<<arguments[0][i]->latex();
181 if (arguments.size()>1 && !arguments[0].empty() && !arguments[1].empty()) o<<
"\\times ";
182 for (
size_t i=0; arguments.size()>1 && i<arguments[1].size(); ++i)
185 if (i>0) o<<
"\\times ";
186 const ParenIf p(o, arguments[1][i]->BODMASlevel()>BODMASlevel());
187 o<<arguments[1][i]->latex();
195 if (arguments.empty())
return o;
196 if (arguments.size()>1) o<<
"\\frac{";
197 if (arguments[0].empty()) o<<
"1";
198 for (
size_t i=0; i<arguments[0].size(); ++i)
201 if (i>0) o<<
"\\times ";
202 const ParenIf p(o, i>0 && arguments[0][i]->BODMASlevel()>BODMASlevel());
203 o<<arguments[0][i]->latex();
205 if (arguments.size()>1)
208 if (arguments[1].empty()) o<<
"1";
209 for (
size_t i=0; i<arguments[1].size(); ++i)
212 if (i>0) o<<
"\\times ";
213 const ParenIf p(o, i>0 && arguments[1][i]->BODMASlevel()>BODMASlevel());
214 o<<arguments[1][i]->latex();
224 checkArg(0,0); checkArg(1,0);
225 return o<<
"\\log_{"<<arguments[1][0]->latex()<<
"}\\left("<<
226 arguments[0][0]->latex()<<
"\\right)";
232 checkArg(0,0); checkArg(1,0);
234 const ParenIf p(o, arguments[0][0]->BODMASlevel()>BODMASlevel());
235 o<<arguments[0][0]->latex();
237 return o<<
"^{"<<arguments[1][0]->latex()<<
"}";
243 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
246 if (arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
247 o<<arguments[1][0]->
latex()<<
"-";
251 const ParenIf p(o, arguments[0][0]->BODMASlevel()>1);
252 o<<arguments[0][0]->latex();
257 if (arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
258 o<<
"\\theta\\left("<<arguments[1][0]->
latex()<<
"\\right)";
267 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
268 if (arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
270 o<<
"\\delta\\left("<<arguments[0][0]->latex()<<
"-";
272 const ParenIf p(o, arguments[1][0]->BODMASlevel()>BODMASlevel());
273 o<<arguments[1][0]->latex();
278 o<<
"\\delta\\left("<<arguments[0][0]->latex()<<
"\\right)";
280 if (arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
281 o<<
"\\delta\\left("<<arguments[1][0]->
latex()<<
"\\right)";
290 if ((!arguments.empty() && !arguments[0].empty() && arguments[0][0]) ||
291 (arguments.size()>1 && !arguments[1].empty() && arguments[1][0]))
306 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
307 if (arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
308 o<<
"\\min\\left("<<arguments[0][0]->
latex()<<
"," <<
309 arguments[1][0]->latex()<<
"\\right)";
311 o<<
"\\min\\left("<<arguments[0][0]->latex()<<
",0\\right)";
313 if (arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
314 o<<
"\\min\\left("<<arguments[1][0]->
latex()<<
",0\\right)";
323 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
324 if (arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
325 o<<
"\\max\\left("<<arguments[0][0]->
latex()<<
"," <<
326 arguments[1][0]->latex()<<
"\\right)";
328 o<<
"\\max\\left("<<arguments[0][0]->latex()<<
",0\\right)";
330 if (arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
331 o<<
"\\max\\left("<<arguments[1][0]->
latex()<<
",0\\right)";
340 if (arguments.size()>1 && !arguments[0].empty() && arguments[0][0] &&
341 !arguments[1].empty() && arguments[1][0])
342 o<<
"\\theta\\left("<<arguments[0][0]->
latex()<<
"-0.5\\right)\\theta\\left(" <<
343 arguments[1][0]->latex()<<
"-0.5\\right)";
352 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
353 if (arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
354 o<<
"\\max\\left(\\theta\\left("<<arguments[0][0]->
latex()<<
"-0.5\\right)," <<
355 "\\theta\\left("<<arguments[1][0]->latex()<<
"\\right)\\right)";
357 o<<
"\\theta\\left("<<arguments[0][0]->latex()<<
"-0.5\\right)";
359 if (arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
360 o<<
"\\theta\\left("<<arguments[1][0]->
latex()<<
"-0.5\\right)";
369 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
370 o<<
"\\left(1-\\theta\\left(0.5-"<<arguments[0][0]->
latex()<<
"\\right)\\right)";
379 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0] &&
380 arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
381 return o<<
"{\\mathrm cov}\\left("<<arguments[0][0]->
latex()<<
382 ","<<arguments[1][0]<<
"\\right)";
389 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0] &&
390 arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
391 return o<<
"\\rho\\left("<<arguments[0][0]->
latex()<<
392 ","<<arguments[1][0]<<
"\\right)";
399 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0] &&
400 arguments.size()>1 && !arguments[1].empty() && arguments[1][0])
401 return o<<
"{\\mathrm{linReg}\\left("<<arguments[0][0]->
latex()<<
402 ","<<arguments[1][0]<<
"\\right)";
411 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
413 size_t dim=numeric_limits<size_t>::max();
414 if (
auto op=dynamic_cast<OperationBase*>(state.get()))
415 if (
auto vv=arguments[0][0]->result)
417 for (
auto& i: vv->hypercube().xvectors)
418 if (i.name==
op->axis)
420 dim=&i-&vv->hypercube().xvectors.front();
424 return o<<
"\\dim\\left("<<arguments[0][0]->latex()<<
","<<dim<<
"\\right)";
426 return o<<
"\\prod_i(\\dim("<<arguments[0][0]->latex()<<
",i))";
434 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
436 return o<<
"shape("<<arguments[0][0]->latex()<<
")";
444 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
446 return o<<
"\\left\\langle"<<arguments[0][0]->latex()<<
"\\right\\rangle";
454 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
456 return o<<
"{\\mathrm median}\\left("<<arguments[0][0]->latex()<<
"\\right)";
464 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
466 return o<<
"\\sigma("<<arguments[0][0]->latex()<<
")";
474 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
477 if (
auto op=dynamic_cast<OperationBase*>(state.get()))
479 return o<<
"\\left\\langle\\Delta\\left("<<arguments[0][0]->latex()<<
"\\right)^"<<exponent<<
"\\right\\rangle";
487 if (!arguments.empty() && !arguments[0].empty() && arguments[0][0])
490 if (
auto op=dynamic_cast<OperationBase*>(state.get()))
492 return o<<
"{\\mathrm histogram}\\left("<<arguments[0][0]->latex()<<
","<<nBins<<
"\\right)";
531 return o<<
"\\infty ";
538 return o<<
"\\left("<<arguments[0][0]->latex()<<
"\\right)\\%";
551 throw error(
"shouldn't be executed");
557 throw error(
"derivative operator should not appear in LaTeX output");
564 return o<<
"\\sqrt{"<<arguments[0][0]->latex()<<
"}";
571 o<<
"\\exp\\left("<<arguments[0][0]->latex()<<
"\\right)";
579 return o<<
"\\ln\\left("<<arguments[0][0]->latex()<<
"\\right)";
586 return o<<
"\\sin\\left("<<arguments[0][0]->latex()<<
"\\right)";
593 return o<<
"\\cos\\left("<<arguments[0][0]->latex()<<
"\\right)";
600 return o<<
"\\tan\\left("<<arguments[0][0]->latex()<<
"\\right)";
607 return o<<
"\\arcsin\\left("<<arguments[0][0]->latex()<<
"\\right)";
614 return o<<
"\\arccos\\left("<<arguments[0][0]->latex()<<
"\\right)";
621 return o<<
"\\arctan\\left("<<arguments[0][0]->latex()<<
"\\right)";
628 return o<<
"\\sinh\\left("<<arguments[0][0]->latex()<<
"\\right)";
635 return o<<
"\\cosh\\left("<<arguments[0][0]->latex()<<
"\\right)";
642 return o<<
"\\tanh\\left("<<arguments[0][0]->latex()<<
"\\right)";
649 return o<<
"\\left|"<<arguments[0][0]->latex()<<
"\\right|";
656 return o<<
"\\left\\lfloor"<<arguments[0][0]->latex()<<
"\\right\\rfloor)";
663 return o<<
"\\mathrm{frac}("<<arguments[0][0]->latex()<<
")";
670 return o<<
"\\Gamma\\left("<<arguments[0][0]->latex()<<
"\\right)";
677 return o<<
"\\psi^{\\left("<<arguments[1][0]->latex()<<
"\\right)}\\left("<<arguments[0][0]->latex()<<
"\\right)";
684 return o<<
"\\left("<<arguments[0][0]->latex()<<
"\\right)!";
690 auto desc=
mathrm(dynamic_cast<UserFunction&>(*state).description());
691 if (arguments.empty() || arguments[0].empty())
692 return o<<desc<<
"()";
693 if (arguments.size()<2 || arguments[1].empty())
694 return o<<desc<<
"\\left("<<arguments[0][0]->
latex()<<
"\\right)";
695 return o<<desc<<
"\\left("<<arguments[0][0]->latex()<<
","<<arguments[1][0]->latex()<<
"\\right)";
702 return o<<
"\\sum_i("<<arguments[0][0]->latex()<<
")_i";
709 return o<<
"\\prod_i("<<arguments[0][0]->latex()<<
")_i";
716 return o<<
"\\min_i("<<arguments[0][0]->latex()<<
")_i";
723 return o<<
"\\max_i("<<arguments[0][0]->latex()<<
")_i";
730 return o<<
"\\mathrm{indexOf}(\\min_i("<<arguments[0][0]->latex()<<
")_i)";
737 return o<<
"\\mathrm{indexOf}(\\max_i("<<arguments[0][0]->latex()<<
")_i)";
744 return o<<
"\\theta\\left(\\sum_i\\theta\\left(\\left("<<arguments[0][0]->latex()<<
"\\right)_i-0.5\\right)\\right)";
751 return o<<
"\\prod_i\\theta\\left(\\left("<<arguments[0][0]->latex()<<
"\\right)_i-0.5\\right)";
758 return o<<
"\\left[\\sum_{j=0}^i\\left("<<arguments[0][0]->latex()<<
"\\right)_i\\right])";
765 return o<<
"\\left[\\prod_{j=0}^i\\left("<<arguments[0][0]->latex()<<
"\\right)_i\\right])";
772 return o<<
"\\left[\\Delta^-\\left("<<arguments[0][0]->latex()<<
"\\right)_i\\right])";
779 return o<<
"\\left[\\Delta^+\\left("<<arguments[0][0]->latex()<<
"\\right)_i\\right])";
785 checkArg(0,0); checkArg(1,0);
786 return o<<arguments[0][0]->latex()<<
"\\cdot"<<arguments[1][0]->latex();
792 checkArg(0,0); checkArg(1,0);
793 return o<<arguments[0][0]->latex()<<
"\\otimes"<<arguments[1][0]->latex();
800 return o<<
"\\left\\{i: \\left("<<arguments[0][0]->latex()<<
"\\right)_i>0.5\\right\\}";
806 checkArg(0,0); checkArg(1,0);
807 return o<<
"\\left[\\left("<<arguments[0][0]->latex()<<
"\\right)_j : j=\\left("<<arguments[1][0]->latex()<<
"\\right)_i\\right]";
812 checkArg(0,0); checkArg(1,0);
813 return o<<
"\\mathrm{meld}\\left("<<arguments[0][0]->latex()<<
","<<arguments[1][0]->latex()<<
"\\right)";
818 checkArg(0,0); checkArg(1,0);
819 return o<<
"\\mathrm{merge}\\left("<<arguments[0][0]->latex()<<
","<<arguments[1][0]->latex()<<
"\\right)";
825 checkArg(0,0); checkArg(1,0);
828 if (
auto o=state->operationCast())
830 return o<<
"\\mathrm{slice}\\left("<<arguments[0][0]->latex()<<
","<<slice<<
"\\right)";
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
UnitsExpressionWalker pow(const UnitsExpressionWalker &x, const UnitsExpressionWalker &y)
VariableValues variableValues
const std::string & init() const
string latexInit(const string &)
convert an initialisation string into a matlab expression
struct TCLcmd::trap::init_t init
Creation and access to the minskyTCL_obj object, which has code to record whenever Minsky's state cha...
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
ParenIf(ostream &o, bool c)
vector< vector< WeakNodePtr > > arguments
string latex(double)
convert double to a LaTeX string representing that value
ostream & latex(ostream &) const override
writes LaTeX representation of this DAG to the stream
string mathrm(const string &nm)
wraps in if nm has more than one letter - and also takes into account LaTeX subscript/superscripts ...