123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545# 1 "src/base/compute/owl_computation_operator.ml"(*
* OWL - OCaml Scientific and Engineering Computing
* Copyright (c) 2016-2018 Liang Wang <liang.wang@cl.cam.ac.uk>
*)openOwl_types(* Functor of making Lazy module of different number types *)moduleMake(Symbol:Owl_computation_symbol_sig.Sig)=structmoduleSymbol=SymbolopenSymbolopenSymbol.Shape.TypeopenSymbol.Shape.Type.Device(* mathematical functions *)letnoopx=make_then_connectNoop[|arr_to_nodex|]|>node_to_arrletemptyshape=make_node~shape:[|Someshape|](Emptyshape)|>node_to_arrletzerosshape=make_node~shape:[|Someshape|](Zerosshape)|>node_to_arrletonesshape=make_node~shape:[|Someshape|](Onesshape)|>node_to_arrletcreateshapev=make_then_connect~shape:[|Someshape|](Createshape)[|elt_to_nodev|]|>node_to_arrletsequential?a?stepshape=leta=matchawith|Somea->a|None->const_elt"sequential_a"(A.float_to_elt0.)inletb=matchstepwith|Someb->b|None->const_elt"sequential_step"(A.float_to_elt1.)inmake_then_connect~shape:[|Someshape|](Sequentialshape)[|elt_to_nodea;elt_to_nodeb|]|>node_to_arrletuniform?a?bshape=leta=matchawith|Somea->a|None->const_elt"uniform_a"(A.float_to_elt0.)inletb=matchbwith|Someb->b|None->const_elt"uniform_b"(A.float_to_elt1.)inmake_then_connect~shape:[|Someshape|](Uniformshape)[|elt_to_nodea;elt_to_nodeb|]|>node_to_arrletgaussian?mu?sigmashape=leta=matchmuwith|Somea->a|None->const_elt"sequential_a"(A.float_to_elt0.)inletb=matchsigmawith|Someb->b|None->const_elt"sequential_step"(A.float_to_elt1.)inmake_then_connect~shape:[|Someshape|](Gaussianshape)[|elt_to_nodea;elt_to_nodeb|]|>node_to_arrletbernoulli?pshape=letp=matchpwith|Somep->p|None->const_elt"bernoulli_p"(A.float_to_elt0.5)inmake_then_connect~shape:[|Someshape|](Bernoullishape)[|elt_to_nodep|]|>node_to_arrletinitshapef=make_node~shape:[|Someshape|](Init(shape,f))|>node_to_arrletshapex=arr_to_nodex|>node_shapeletnumelx=Array.fold_left(*)1(shapex)letgetxi=make_then_connect(Geti)[|arr_to_nodex|]|>node_to_eltletsetxiv=make_then_connect(Seti)[|arr_to_nodex;elt_to_nodev|]|>ignoreletget_sliceslicex=make_then_connect(GetSliceslice)[|arr_to_nodex|]|>node_to_arrletset_sliceslicexy=make_then_connect(SetSliceslice)[|arr_to_nodex;arr_to_nodey|]|>ignoreletcopyx=make_then_connectCopy[|arr_to_nodex|]|>node_to_arrletcopy_~out_x=failwith"Owl_computation_operator:copy_: not implemented"[@@warning"-27"]letresetx=make_then_connectReset[|arr_to_nodex|]|>node_to_arr|>ignoreletreshapexshape=letn_old=numelxinletn_new=Array.fold_left(*)1shapeinassert(n_old=n_new);make_then_connect(Reshapeshape)[|arr_to_nodex|]|>node_to_arrletreversex=make_then_connectReverse[|arr_to_nodex|]|>node_to_arrlettilexaxises=make_then_connect(Tileaxises)[|arr_to_nodex|]|>node_to_arrletrepeatxrepeats=make_then_connect(Repeatrepeats)[|arr_to_nodex|]|>node_to_arrletconcatenate?(axis=0)xs=make_then_connect(Concatenateaxis)(Array.maparr_to_nodexs)|>node_to_arrletsplit?(axis=0)_parts_x=failwith"split: not implemented"[@@warning"-27"]letdraw?(axis=0)xn=lety=make_then_connect(Draw(axis,n))[|arr_to_nodex|]|>node_to_arriny,[||]letmapfx=make_then_connect(Mapf)[|arr_to_nodex|]|>node_to_arrletfold?(axis=(-1))fax=make_then_connect(Fold(axis,f))[|arr_to_nodex;elt_to_nodea|]|>node_to_arrletscan?(axis=(-1))fx=make_then_connect(Scan(axis,f))[|arr_to_nodex|]|>node_to_arrletone_hotdepthx=make_then_connect(OneHotdepth)[|arr_to_nodex|]|>node_to_arrletprint?max_row?max_col?header?fmtx=()[@@warning"-27"]letabsx=make_then_connectAbs[|arr_to_nodex|]|>node_to_arrletnegx=make_then_connectNeg[|arr_to_nodex|]|>node_to_arrletfloorx=make_then_connectFloor[|arr_to_nodex|]|>node_to_arrletceilx=make_then_connectCeil[|arr_to_nodex|]|>node_to_arrletroundx=make_then_connectRound[|arr_to_nodex|]|>node_to_arrletsqrx=make_then_connectSqr[|arr_to_nodex|]|>node_to_arrletsqrtx=make_then_connectSqrt[|arr_to_nodex|]|>node_to_arrletlogx=make_then_connectLog[|arr_to_nodex|]|>node_to_arrletlog2x=make_then_connectLog2[|arr_to_nodex|]|>node_to_arrletlog10x=make_then_connectLog10[|arr_to_nodex|]|>node_to_arrletexpx=make_then_connectExp[|arr_to_nodex|]|>node_to_arrletsinx=make_then_connectSin[|arr_to_nodex|]|>node_to_arrletcosx=make_then_connectCos[|arr_to_nodex|]|>node_to_arrlettanx=make_then_connectTan[|arr_to_nodex|]|>node_to_arrletsinhx=make_then_connectSinh[|arr_to_nodex|]|>node_to_arrletcoshx=make_then_connectCosh[|arr_to_nodex|]|>node_to_arrlettanhx=make_then_connectTanh[|arr_to_nodex|]|>node_to_arrletasinx=make_then_connectAsin[|arr_to_nodex|]|>node_to_arrletacosx=make_then_connectAcos[|arr_to_nodex|]|>node_to_arrletatanx=make_then_connectAtan[|arr_to_nodex|]|>node_to_arrletasinhx=make_then_connectAsinh[|arr_to_nodex|]|>node_to_arrletacoshx=make_then_connectAcosh[|arr_to_nodex|]|>node_to_arrletatanhx=make_then_connectAtanh[|arr_to_nodex|]|>node_to_arrletmin?(axis=(-1))x=make_then_connect(Minaxis)[|arr_to_nodex|]|>node_to_arrletmax?(axis=(-1))x=make_then_connect(Maxaxis)[|arr_to_nodex|]|>node_to_arrletsum?(axis=(-1))x=make_then_connect(Sumaxis)[|arr_to_nodex|]|>node_to_arrletsum_reduce?(axis=[|-1|])x=make_then_connect(SumReduceaxis)[|arr_to_nodex|]|>node_to_arrletsignumx=make_then_connectSignum[|arr_to_nodex|]|>node_to_arrletsigmoidx=make_then_connectSigmoid[|arr_to_nodex|]|>node_to_arrletrelux=make_then_connectRelu[|arr_to_nodex|]|>node_to_arrletmin'x=make_then_connectMin'[|arr_to_nodex|]|>node_to_eltletmax'x=make_then_connectMax'[|arr_to_nodex|]|>node_to_eltletsum'x=make_then_connectSum'[|arr_to_nodex|]|>node_to_eltletl1norm'x=make_then_connectL1norm'[|arr_to_nodex|]|>node_to_eltletl2norm'x=make_then_connectL2norm'[|arr_to_nodex|]|>node_to_eltletl2norm_sqr'x=make_then_connectL2NormSqr'[|arr_to_nodex|]|>node_to_eltletclip_by_value?amin?amaxx=leta=matchaminwith|Somea->a|None->const_elt"clip_by_value_amin"(A.float_to_eltneg_infinity)inletb=matchamaxwith|Someb->b|None->const_elt"clip_by_value_amax"(A.float_to_eltinfinity)inmake_then_connectClipByValue[|arr_to_nodex;elt_to_nodea;elt_to_nodeb|]|>node_to_arrletclip_by_l2normax=make_then_connectClipByL2norm[|arr_to_nodex;elt_to_nodea|]|>node_to_arrletpowxy=make_then_connectPow[|arr_to_nodex;arr_to_nodey|]|>node_to_arrletscalar_powax=make_then_connectScalarPow[|elt_to_nodea;arr_to_nodex|]|>node_to_arrletpow_scalarxa=make_then_connectPowScalar[|arr_to_nodex;elt_to_nodea|]|>node_to_arrletatan2xy=make_then_connectAtan2[|arr_to_nodex;arr_to_nodey|]|>node_to_arrletscalar_atan2ax=make_then_connectScalarAtan2[|elt_to_nodea;arr_to_nodex|]|>node_to_arrletatan2_scalarxa=make_then_connectAtan2Scalar[|arr_to_nodex;elt_to_nodea|]|>node_to_arrlethypotxy=make_then_connectHypot[|arr_to_nodex;arr_to_nodey|]|>node_to_arrletmin2xy=make_then_connectMin2[|arr_to_nodex;arr_to_nodey|]|>node_to_arrletmax2xy=make_then_connectMax2[|arr_to_nodex;arr_to_nodey|]|>node_to_arrletaddxy=make_then_connectAdd[|arr_to_nodex;arr_to_nodey|]|>node_to_arrletsubxy=make_then_connectSub[|arr_to_nodex;arr_to_nodey|]|>node_to_arrletmulxy=make_then_connectMul[|arr_to_nodex;arr_to_nodey|]|>node_to_arrletdivxy=make_then_connectDiv[|arr_to_nodex;arr_to_nodey|]|>node_to_arrletadd_scalarxa=make_then_connectAddScalar[|arr_to_nodex;elt_to_nodea|]|>node_to_arrletsub_scalarxa=make_then_connectSubScalar[|arr_to_nodex;elt_to_nodea|]|>node_to_arrletmul_scalarxa=make_then_connectMulScalar[|arr_to_nodex;elt_to_nodea|]|>node_to_arrletdiv_scalarxa=make_then_connectDivScalar[|arr_to_nodex;elt_to_nodea|]|>node_to_arrletscalar_addax=make_then_connectScalarAdd[|elt_to_nodea;arr_to_nodex|]|>node_to_arrletscalar_subax=make_then_connectScalarSub[|elt_to_nodea;arr_to_nodex|]|>node_to_arrletscalar_mulax=make_then_connectScalarMul[|elt_to_nodea;arr_to_nodex|]|>node_to_arrletscalar_divax=make_then_connectScalarDiv[|elt_to_nodea;arr_to_nodex|]|>node_to_arrletfmaxyz=make_then_connectFMA[|arr_to_nodex;arr_to_nodey;arr_to_nodez|]|>node_to_arrletelt_equalxy=make_then_connectEltEqual[|arr_to_nodex;arr_to_nodey|]|>node_to_arrletelt_not_equalxy=make_then_connectEltNotEqual[|arr_to_nodex;arr_to_nodey|]|>node_to_arrletelt_lessxy=make_then_connectEltLess[|arr_to_nodex;arr_to_nodey|]|>node_to_arrletelt_greaterxy=make_then_connectEltGreater[|arr_to_nodex;arr_to_nodey|]|>node_to_arrletelt_less_equalxy=make_then_connectEltLessEqual[|arr_to_nodex;arr_to_nodey|]|>node_to_arrletelt_greater_equalxy=make_then_connectEltGreaterEqual[|arr_to_nodex;arr_to_nodey|]|>node_to_arrletelt_equal_scalarxa=make_then_connectEltEqualScalar[|arr_to_nodex;elt_to_nodea|]|>node_to_arrletelt_not_equal_scalarxa=make_then_connectEltNotEqualScalar[|arr_to_nodex;elt_to_nodea|]|>node_to_arrletelt_less_scalarxa=make_then_connectEltLessScalar[|arr_to_nodex;elt_to_nodea|]|>node_to_arrletelt_greater_scalarxa=make_then_connectEltGreaterScalar[|arr_to_nodex;elt_to_nodea|]|>node_to_arrletelt_less_equal_scalarxa=make_then_connectEltLessEqualScalar[|arr_to_nodex;elt_to_nodea|]|>node_to_arrletelt_greater_equal_scalarxa=make_then_connectEltGreaterEqualScalar[|arr_to_nodex;elt_to_nodea|]|>node_to_arrletconv1d?(padding=SAME)inputkernelstride=make_then_connect(Conv1d(padding,stride))[|arr_to_nodeinput;arr_to_nodekernel|]|>node_to_arrletconv2d?(padding=SAME)inputkernelstride=make_then_connect(Conv2d(padding,stride))[|arr_to_nodeinput;arr_to_nodekernel|]|>node_to_arrletconv3d?(padding=SAME)inputkernelstride=make_then_connect(Conv3d(padding,stride))[|arr_to_nodeinput;arr_to_nodekernel|]|>node_to_arrlettranspose_conv1d?(padding=SAME)inputkernelstride=make_then_connect(TransposeConv1d(padding,stride))[|arr_to_nodeinput;arr_to_nodekernel|]|>node_to_arrlettranspose_conv2d?(padding=SAME)inputkernelstride=make_then_connect(TransposeConv2d(padding,stride))[|arr_to_nodeinput;arr_to_nodekernel|]|>node_to_arrlettranspose_conv3d?(padding=SAME)inputkernelstride=make_then_connect(TransposeConv3d(padding,stride))[|arr_to_nodeinput;arr_to_nodekernel|]|>node_to_arrletdilated_conv1d?(padding=SAME)inputkernelstriderate=make_then_connect(DilatedConv1d(padding,stride,rate))[|arr_to_nodeinput;arr_to_nodekernel|]|>node_to_arrletdilated_conv2d?(padding=SAME)inputkernelstriderate=make_then_connect(DilatedConv2d(padding,stride,rate))[|arr_to_nodeinput;arr_to_nodekernel|]|>node_to_arrletdilated_conv3d?(padding=SAME)inputkernelstriderate=make_then_connect(DilatedConv3d(padding,stride,rate))[|arr_to_nodeinput;arr_to_nodekernel|]|>node_to_arrletmax_pool1d?(padding=SAME)inputkernelstride=make_then_connect(MaxPool1d(padding,kernel,stride))[|arr_to_nodeinput|]|>node_to_arrletmax_pool2d?(padding=SAME)inputkernelstride=make_then_connect(MaxPool2d(padding,kernel,stride))[|arr_to_nodeinput|]|>node_to_arrletmax_pool3d?(padding=SAME)inputkernelstride=make_then_connect(MaxPool3d(padding,kernel,stride))[|arr_to_nodeinput|]|>node_to_arrletavg_pool1d?(padding=SAME)inputkernelstride=make_then_connect(AvgPool1d(padding,kernel,stride))[|arr_to_nodeinput|]|>node_to_arrletavg_pool2d?(padding=SAME)inputkernelstride=make_then_connect(AvgPool2d(padding,kernel,stride))[|arr_to_nodeinput|]|>node_to_arrletavg_pool3d?(padding=SAME)inputkernelstride=make_then_connect(AvgPool3d(padding,kernel,stride))[|arr_to_nodeinput|]|>node_to_arrletconv1d_backward_inputinputkernelstrideoutput'=make_then_connect(Conv1dBackwardInputstride)[|arr_to_nodeinput;arr_to_nodekernel;arr_to_nodeoutput'|]|>node_to_arrletconv1d_backward_kernelinputkernelstrideoutput'=make_then_connect(Conv1dBackwardKernelstride)[|arr_to_nodeinput;arr_to_nodekernel;arr_to_nodeoutput'|]|>node_to_arrletconv2d_backward_inputinputkernelstrideoutput'=make_then_connect(Conv2dBackwardInputstride)[|arr_to_nodeinput;arr_to_nodekernel;arr_to_nodeoutput'|]|>node_to_arrletconv2d_backward_kernelinputkernelstrideoutput'=make_then_connect(Conv2dBackwardKernelstride)[|arr_to_nodeinput;arr_to_nodekernel;arr_to_nodeoutput'|]|>node_to_arrletconv3d_backward_inputinputkernelstrideoutput'=make_then_connect(Conv3dBackwardInputstride)[|arr_to_nodeinput;arr_to_nodekernel;arr_to_nodeoutput'|]|>node_to_arrletconv3d_backward_kernelinputkernelstrideoutput'=make_then_connect(Conv3dBackwardKernelstride)[|arr_to_nodeinput;arr_to_nodekernel;arr_to_nodeoutput'|]|>node_to_arrlettranspose_conv1d_backward_inputinputkernelstrideoutput'=make_then_connect(TransposeConv1dBackwardInputstride)[|arr_to_nodeinput;arr_to_nodekernel;arr_to_nodeoutput'|]|>node_to_arrlettranspose_conv1d_backward_kernelinputkernelstrideoutput'=make_then_connect(TransposeConv1dBackwardKernelstride)[|arr_to_nodeinput;arr_to_nodekernel;arr_to_nodeoutput'|]|>node_to_arrlettranspose_conv2d_backward_inputinputkernelstrideoutput'=make_then_connect(TransposeConv2dBackwardInputstride)[|arr_to_nodeinput;arr_to_nodekernel;arr_to_nodeoutput'|]|>node_to_arrlettranspose_conv2d_backward_kernelinputkernelstrideoutput'=make_then_connect(TransposeConv2dBackwardKernelstride)[|arr_to_nodeinput;arr_to_nodekernel;arr_to_nodeoutput'|]|>node_to_arrlettranspose_conv3d_backward_inputinputkernelstrideoutput'=make_then_connect(TransposeConv3dBackwardInputstride)[|arr_to_nodeinput;arr_to_nodekernel;arr_to_nodeoutput'|]|>node_to_arrlettranspose_conv3d_backward_kernelinputkernelstrideoutput'=make_then_connect(TransposeConv3dBackwardKernelstride)[|arr_to_nodeinput;arr_to_nodekernel;arr_to_nodeoutput'|]|>node_to_arrletdilated_conv1d_backward_inputinputkernelstriderateoutput'=make_then_connect(DilatedConv1dBackwardInput(stride,rate))[|arr_to_nodeinput;arr_to_nodekernel;arr_to_nodeoutput'|]|>node_to_arrletdilated_conv1d_backward_kernelinputkernelstriderateoutput'=make_then_connect(DilatedConv1dBackwardKernel(stride,rate))[|arr_to_nodeinput;arr_to_nodekernel;arr_to_nodeoutput'|]|>node_to_arrletdilated_conv2d_backward_inputinputkernelstriderateoutput'=make_then_connect(DilatedConv2dBackwardInput(stride,rate))[|arr_to_nodeinput;arr_to_nodekernel;arr_to_nodeoutput'|]|>node_to_arrletdilated_conv2d_backward_kernelinputkernelstriderateoutput'=make_then_connect(DilatedConv2dBackwardKernel(stride,rate))[|arr_to_nodeinput;arr_to_nodekernel;arr_to_nodeoutput'|]|>node_to_arrletdilated_conv3d_backward_inputinputkernelstriderateoutput'=make_then_connect(DilatedConv3dBackwardInput(stride,rate))[|arr_to_nodeinput;arr_to_nodekernel;arr_to_nodeoutput'|]|>node_to_arrletdilated_conv3d_backward_kernelinputkernelstriderateoutput'=make_then_connect(DilatedConv3dBackwardKernel(stride,rate))[|arr_to_nodeinput;arr_to_nodekernel;arr_to_nodeoutput'|]|>node_to_arrletmax_pool1d_backwardpaddinginputkernelstrideoutput'=make_then_connect(MaxPool1dBackward(padding,kernel,stride))[|arr_to_nodeinput;arr_to_nodeoutput'|]|>node_to_arrletmax_pool2d_backwardpaddinginputkernelstrideoutput'=make_then_connect(MaxPool2dBackward(padding,kernel,stride))[|arr_to_nodeinput;arr_to_nodeoutput'|]|>node_to_arrletmax_pool3d_backwardpaddinginputkernelstrideoutput'=make_then_connect(MaxPool3dBackward(padding,kernel,stride))[|arr_to_nodeinput;arr_to_nodeoutput'|]|>node_to_arrletavg_pool1d_backwardpaddinginputkernelstrideoutput'=make_then_connect(AvgPool1dBackward(padding,kernel,stride))[|arr_to_nodeinput;arr_to_nodeoutput'|]|>node_to_arrletavg_pool2d_backwardpaddinginputkernelstrideoutput'=make_then_connect(AvgPool2dBackward(padding,kernel,stride))[|arr_to_nodeinput;arr_to_nodeoutput'|]|>node_to_arrletavg_pool3d_backwardpaddinginputkernelstrideoutput'=make_then_connect(AvgPool3dBackward(padding,kernel,stride))[|arr_to_nodeinput;arr_to_nodeoutput'|]|>node_to_arrletrow_numx=lets=shapexinassert(Array.lengths=2);s.(0)letcol_numx=lets=shapexinassert(Array.lengths=2);s.(1)letrowx_i=make_then_connectRow[|arr_to_nodex|]|>node_to_arrletrowsxi=make_then_connect(Rowsi)[|arr_to_nodex|]|>node_to_arrletcopy_row_tox_y_i=make_then_connectCopyRowTo[|arr_to_nodex|]|>ignoreletcopy_col_tox_y_j=make_then_connectCopyColTo[|arr_to_nodex|]|>ignoreletinvx=make_then_connectInv[|arr_to_nodex|]|>node_to_arrlettracex=make_then_connectTrace[|arr_to_nodex|]|>node_to_eltletdotxy=lettransa=falseinlettransb=falseinletalpha=A.float_to_elt1.|>pack_eltinletbeta=A.float_to_elt0.|>pack_eltinletop=Dot(transa,transb,alpha,beta)inmake_then_connectop[|arr_to_nodex;arr_to_nodey|]|>node_to_arrlettranspose?axisx=letd=Array.length(shapex)inletaxis=matchaxiswith|Somea->a|None->Array.initd(funi->d-i-1)inmake_then_connect(Transposeaxis)[|arr_to_nodex|]|>node_to_arrletto_rowsx=let_=make_then_connectToRows[|arr_to_nodex|]in(* FIXME: wrong shape *)[||]letof_rowsxs=make_then_connectOfRows(Array.maparr_to_nodexs)|>node_to_arrletof_array_x_shape=raiseOwl_exception.NOT_IMPLEMENTEDletof_arrays_x=raiseOwl_exception.NOT_IMPLEMENTED(** Scalar maths *)moduleScalar=structletaddxy=make_then_connectScalar_Add[|elt_to_nodex;elt_to_nodey|]|>node_to_eltletsubxy=make_then_connectScalar_Sub[|elt_to_nodex;elt_to_nodey|]|>node_to_eltletmulxy=make_then_connectScalar_Mul[|elt_to_nodex;elt_to_nodey|]|>node_to_eltletdivxy=make_then_connectScalar_Div[|elt_to_nodex;elt_to_nodey|]|>node_to_eltletpowxy=make_then_connectScalar_Pow[|elt_to_nodex;elt_to_nodey|]|>node_to_eltletatan2xy=make_then_connectScalar_Atan2[|elt_to_nodex;elt_to_nodey|]|>node_to_eltletabsx=make_then_connectScalar_Abs[|elt_to_nodex|]|>node_to_eltletnegx=make_then_connectScalar_Neg[|elt_to_nodex|]|>node_to_eltletsqrx=make_then_connectScalar_Sqr[|elt_to_nodex|]|>node_to_eltletsqrtx=make_then_connectScalar_Sqrt[|elt_to_nodex|]|>node_to_eltletexpx=make_then_connectScalar_Exp[|elt_to_nodex|]|>node_to_eltletlogx=make_then_connectScalar_Log[|elt_to_nodex|]|>node_to_eltletlog2x=make_then_connectScalar_Log2[|elt_to_nodex|]|>node_to_eltletlog10x=make_then_connectScalar_Log10[|elt_to_nodex|]|>node_to_eltletsignumx=make_then_connectScalar_Signum[|elt_to_nodex|]|>node_to_eltletfloorx=make_then_connectScalar_Floor[|elt_to_nodex|]|>node_to_eltletceilx=make_then_connectScalar_Ceil[|elt_to_nodex|]|>node_to_eltletroundx=make_then_connectScalar_Round[|elt_to_nodex|]|>node_to_eltletsinx=make_then_connectScalar_Sin[|elt_to_nodex|]|>node_to_eltletcosx=make_then_connectScalar_Cos[|elt_to_nodex|]|>node_to_eltlettanx=make_then_connectScalar_Tan[|elt_to_nodex|]|>node_to_eltletsinhx=make_then_connectScalar_Sinh[|elt_to_nodex|]|>node_to_eltletcoshx=make_then_connectScalar_Cosh[|elt_to_nodex|]|>node_to_eltlettanhx=make_then_connectScalar_Tanh[|elt_to_nodex|]|>node_to_eltletasinx=make_then_connectScalar_Asin[|elt_to_nodex|]|>node_to_eltletacosx=make_then_connectScalar_Acos[|elt_to_nodex|]|>node_to_eltletatanx=make_then_connectScalar_Atan[|elt_to_nodex|]|>node_to_eltletasinhx=make_then_connectScalar_Asinh[|elt_to_nodex|]|>node_to_eltletacoshx=make_then_connectScalar_Acosh[|elt_to_nodex|]|>node_to_eltletatanhx=make_then_connectScalar_Atanh[|elt_to_nodex|]|>node_to_eltletrelux=make_then_connectScalar_Relu[|elt_to_nodex|]|>node_to_eltletsigmoidx=make_then_connectScalar_Sigmoid[|elt_to_nodex|]|>node_to_eltendend(* Make functor ends *)