Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file owl_ext_dense_matrix.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116# 1 "src/owl/ext/owl_ext_dense_matrix.ml"(*
* OWL - OCaml Scientific and Engineering Computing
* Copyright (c) 2016-2020 Liang Wang <liang.wang@cl.cam.ac.uk>
*)openOwl_typesopenOwl_ext_types(* modules for packing and unpacking *)moduletypePackSig=sigtypemattypeelttypecast_matvalpack_box:mat->ext_typvalunpack_box:ext_typ->matvalpack_elt:elt->ext_typvalunpack_elt:ext_typ->eltvalpack_cast_box:cast_mat->ext_typendmodulePack_DMS=structtypemat=dmstypeelt=floattypecast_mat=dmsletpack_boxx=DMSxletunpack_box=function|DMSx->x|_->failwith"Pack_DMS:unpack_box"letpack_eltx=Fxletunpack_elt=function|Fx->x|_->failwith"Pack_DMS:unpack_elt"letpack_cast_boxx=DMSxendmodulePack_DMD=structtypemat=dmdtypeelt=floattypecast_mat=dmdletpack_boxx=DMDxletunpack_box=function|DMDx->x|_->failwith"Pack_DMD:unpack_dmd:"letpack_eltx=Fxletunpack_elt=function|Fx->x|_->failwith"Pack_DMD:unpack_elt"letpack_cast_boxx=DMDxendmodulePack_DMC=structtypemat=dmctypeelt=Complex.ttypecast_mat=dmsletpack_boxx=DMCxletunpack_box=function|DMCx->x|_->failwith"Pack_DMC:unpack_dmc"letpack_eltx=Cxletunpack_elt=function|Cx->x|_->failwith"Pack_DMC:unpack_elt"letpack_cast_boxx=DMSxendmodulePack_DMZ=structtypemat=dmztypeelt=Complex.ttypecast_mat=dmdletpack_boxx=DMZxletunpack_box=function|DMZx->x|_->failwith"Pack_DMZ:unpack_dmz"letpack_eltx=Cxletunpack_elt=function|Cx->x|_->failwith"Pack_DMZ:unpack_elt"letpack_cast_boxx=DMDxend(* module for basic matrix operations *)moduletypeBasicSig=sigtypemattypeeltvalempty:int->int->matvalcreate:int->int->elt->matvalzeros:int->int->matvalones:int->int->matvaleye:int->matvalsequential:?a:elt->?step:elt->int->int->matvaluniform:?a:elt->?b:elt->int->int->matvalgaussian:?mu:elt->?sigma:elt->int->int->matvallinspace:elt->elt->int->matvalmeshgrid:elt->elt->elt->elt->int->int->mat*matvalmeshup:mat->mat->mat*matvalshape:mat->int*intvalrow_num:mat->intvalcol_num:mat->intvalnumel:mat->intvalnnz:mat->intvaldensity:mat->floatvalsize_in_bytes:mat->intvalsame_shape:mat->mat->boolvalget:mat->int->int->eltvalset:mat->int->int->elt->unitvalget_fancy:indexlist->mat->matvalset_fancy:indexlist->mat->mat->unitvalrow:mat->int->matvalcol:mat->int->matvalrows:mat->intarray->matvalcols:mat->intarray->matvalreshape:mat->intarray->matvalflatten:mat->matvalreverse:mat->matvalreset:mat->unitvalfill:mat->elt->unitvalcopy:mat->matvalcopy_:out:mat->mat->unitvalcopy_row_to:mat->mat->int->unitvalcopy_col_to:mat->mat->int->unitvalconcat_vertical:mat->mat->matvalconcat_horizontal:mat->mat->matvaltranspose:mat->matvaldiag:?k:int->mat->matvalswap_rows:mat->int->int->unitvalswap_cols:mat->int->int->unitvaltile:mat->intarray->matvalrepeat:mat->intarray->matvaliteri:(int->elt->unit)->mat->unitvaliter:(elt->unit)->mat->unitvalmapi:(int->elt->elt)->mat->matvalmap:(elt->elt)->mat->matvalmap2i:(int->elt->elt->elt)->mat->mat->matvalmap2:(elt->elt->elt)->mat->mat->matvalfoldi:?axis:int->(int->elt->elt->elt)->elt->mat->matvalfold:?axis:int->(elt->elt->elt)->elt->mat->matvalfilteri:(int->elt->bool)->mat->intarrayvalfilter:(elt->bool)->mat->intarrayvaliteri_rows:(int->mat->unit)->mat->unitvaliter_rows:(mat->unit)->mat->unitvaliter2i_rows:(int->mat->mat->unit)->mat->mat->unitvaliter2_rows:(mat->mat->unit)->mat->mat->unitvaliteri_cols:(int->mat->unit)->mat->unitvaliter_cols:(mat->unit)->mat->unitvalfilteri_rows:(int->mat->bool)->mat->intarrayvalfilter_rows:(mat->bool)->mat->intarrayvalfilteri_cols:(int->mat->bool)->mat->intarrayvalfilter_cols:(mat->bool)->mat->intarrayvalfold_rows:('a->mat->'a)->'a->mat->'avalfold_cols:('a->mat->'a)->'a->mat->'avalmapi_rows:(int->mat->'a)->mat->'aarrayvalmap_rows:(mat->'a)->mat->'aarrayvalmapi_cols:(int->mat->'a)->mat->'aarrayvalmap_cols:(mat->'a)->mat->'aarrayvalmapi_by_row:int->(int->mat->mat)->mat->matvalmap_by_row:int->(mat->mat)->mat->matvalmapi_by_col:int->(int->mat->mat)->mat->matvalmap_by_col:int->(mat->mat)->mat->matvalmapi_at_row:(int->elt->elt)->mat->int->matvalmap_at_row:(elt->elt)->mat->int->matvalmapi_at_col:(int->elt->elt)->mat->int->matvalmap_at_col:(elt->elt)->mat->int->matvalexists:(elt->bool)->mat->boolvalnot_exists:(elt->bool)->mat->boolvalfor_all:(elt->bool)->mat->boolvalis_zero:mat->boolvalis_positive:mat->boolvalis_negative:mat->boolvalis_nonpositive:mat->boolvalis_nonnegative:mat->boolvalequal:mat->mat->boolvalnot_equal:mat->mat->boolvalgreater:mat->mat->boolvalless:mat->mat->boolvalgreater_equal:mat->mat->boolvalless_equal:mat->mat->boolvalelt_equal:mat->mat->matvalelt_not_equal:mat->mat->matvalelt_less:mat->mat->matvalelt_greater:mat->mat->matvalelt_less_equal:mat->mat->matvalelt_greater_equal:mat->mat->matvalequal_scalar:mat->elt->boolvalnot_equal_scalar:mat->elt->boolvalless_scalar:mat->elt->boolvalgreater_scalar:mat->elt->boolvalless_equal_scalar:mat->elt->boolvalgreater_equal_scalar:mat->elt->boolvalelt_equal_scalar:mat->elt->matvalelt_not_equal_scalar:mat->elt->matvalelt_less_scalar:mat->elt->matvalelt_greater_scalar:mat->elt->matvalelt_less_equal_scalar:mat->elt->matvalelt_greater_equal_scalar:mat->elt->matvaldraw_rows:?replacement:bool->mat->int->mat*intarrayvaldraw_cols:?replacement:bool->mat->int->mat*intarrayvaldraw_rows2:?replacement:bool->mat->mat->int->mat*mat*intarrayvaldraw_cols2:?replacement:bool->mat->mat->int->mat*mat*intarrayvalshuffle_rows:mat->matvalshuffle_cols:mat->matvalshuffle:mat->matvalto_array:mat->eltarrayvalof_array:eltarray->int->int->matvalto_arrays:mat->eltarrayarrayvalof_arrays:eltarrayarray->matvalto_rows:mat->matarrayvalof_rows:matarray->matvalto_cols:mat->matarrayvalof_cols:matarray->matvalprint:?max_row:int->?max_col:int->?header:bool->?fmt:(elt->string)->mat->unitvalsave:out:string->mat->unitvalload:string->matvalinv:mat->matvaltrace:mat->eltvalsum':mat->eltvalprod':mat->eltvalmean':mat->eltvalsum_rows:?keep_dims:bool->mat->matvalsum_cols:?keep_dims:bool->mat->matvalmean_rows:?keep_dims:bool->mat->matvalmean_cols:?keep_dims:bool->mat->matvaladd:mat->mat->matvalsub:mat->mat->matvalmul:mat->mat->matvaldiv:mat->mat->matvaladd_scalar:mat->elt->matvalsub_scalar:mat->elt->matvalmul_scalar:mat->elt->matvaldiv_scalar:mat->elt->matvalscalar_add:elt->mat->matvalscalar_sub:elt->mat->matvalscalar_mul:elt->mat->matvalscalar_div:elt->mat->matvaldot:mat->mat->matendmoduleMake_Basic(P:PackSig)(M:BasicSigwithtypemat:=P.matandtypeelt:=P.elt)=structopenPletemptymn=M.emptymn|>pack_boxletzerosmn=M.zerosmn|>pack_boxletonesmn=M.onesmn|>pack_boxleteyem=M.eyem|>pack_boxletsequential?a?stepmn=M.sequential?a?stepmn|>pack_boxletuniform?a?bmn=M.uniform?a?bmn|>pack_boxletgaussian?mu?sigmamn=M.gaussian?mu?sigmamn|>pack_boxletlinspaceabn=M.linspaceabn|>pack_boxletmeshgridxaxbyaybxnyn=letu,v=M.meshgridxaxbyaybxnyninpack_boxu,pack_boxvletmeshupxy=letu,v=M.meshup(unpack_boxx)(unpack_boxy)inpack_boxu,pack_boxvletshapex=M.shape(unpack_boxx)letrow_numx=M.row_num(unpack_boxx)letcol_numx=M.col_num(unpack_boxx)letnumelx=M.numel(unpack_boxx)letnnzx=M.nnz(unpack_boxx)letdensityx=M.density(unpack_boxx)letsize_in_bytesx=M.size_in_bytes(unpack_boxx)letsame_shapexy=M.same_shape(unpack_boxx)(unpack_boxy)letgetxij=M.get(unpack_boxx)ij|>pack_eltletsetxija=M.set(unpack_boxx)ij(unpack_elta)letget_fancyaxisx=M.get_fancyaxis(unpack_boxx)|>pack_boxletset_fancyaxisxy=M.set_fancyaxis(unpack_boxx)(unpack_boxy)letrowxi=M.row(unpack_boxx)i|>pack_boxletcolxj=M.col(unpack_boxx)j|>pack_boxletrowsxl=M.rows(unpack_boxx)l|>pack_boxletcolsxl=M.cols(unpack_boxx)l|>pack_boxletreshapexs=M.reshape(unpack_boxx)s|>pack_boxletflattenx=M.flatten(unpack_boxx)|>pack_boxletreversex=M.reverse(unpack_boxx)|>pack_boxletfillxa=M.fill(unpack_boxx)(unpack_elta)letcopyx=M.copy(unpack_boxx)|>pack_boxletcopy_~outsrc=M.copy_~out:(unpack_boxout)(unpack_boxsrc)letcopy_row_tovxi=M.copy_row_to(unpack_boxv)(unpack_boxx)iletcopy_col_tovxi=M.copy_col_to(unpack_boxv)(unpack_boxx)iletconcat_verticalxy=M.concat_vertical(unpack_boxx)(unpack_boxy)|>pack_boxletconcat_horizontalxy=M.concat_horizontal(unpack_boxx)(unpack_boxy)|>pack_boxlettransposex=M.transpose(unpack_boxx)|>pack_boxletdiagx=M.diag(unpack_boxx)|>pack_boxletswap_rowsxii'=M.swap_rows(unpack_boxx)ii'letswap_colsxjj'=M.swap_cols(unpack_boxx)jj'lettilexreps=M.tile(unpack_boxx)reps|>pack_boxletrepeatxreps=M.repeat(unpack_boxx)reps|>pack_boxletiterifx=M.iterif(unpack_boxx)letiterfx=M.iterf(unpack_boxx)letmapifx=M.mapif(unpack_boxx)|>pack_boxletmapfx=M.mapif(unpack_boxx)|>pack_boxletmap2ifxy=M.map2if(unpack_boxx)(unpack_boxy)|>pack_boxletmap2fxy=M.map2f(unpack_boxx)(unpack_boxy)|>pack_boxletfoldifax=M.foldifa(unpack_boxx)letfoldfax=M.foldfa(unpack_boxx)letfilterifx=M.filterif(unpack_boxx)letfilterfx=M.filterf(unpack_boxx)letiteri_rowsfx=M.iteri_rowsf(unpack_boxx)letiter_rowsfx=M.iter_rowsf(unpack_boxx)letiteri_colsfx=M.iteri_colsf(unpack_boxx)letiter_colsfx=M.iter_colsf(unpack_boxx)letfilteri_rowsfx=M.filteri_rowsf(unpack_boxx)letfilter_rowsfx=M.filter_rowsf(unpack_boxx)letfilteri_colsfx=M.filteri_colsf(unpack_boxx)letfilter_colsfx=M.filter_colsf(unpack_boxx)letfold_rowsfax=M.fold_rowsfa(unpack_boxx)letfold_colsfax=M.fold_colsfa(unpack_boxx)letmapi_rowsfx=M.mapi_rowsf(unpack_boxx)letmap_rowsfx=M.map_rowsf(unpack_boxx)letmapi_colsfx=M.mapi_colsf(unpack_boxx)letmap_colsfx=M.map_colsf(unpack_boxx)letmapi_by_rowdfx=M.mapi_by_rowdf(unpack_boxx)|>pack_boxletmap_by_rowdfx=M.map_by_rowdf(unpack_boxx)|>pack_boxletmapi_by_coldfx=M.mapi_by_coldf(unpack_boxx)|>pack_boxletmap_by_coldfx=M.map_by_coldf(unpack_boxx)|>pack_boxletmapi_at_rowfxi=M.mapi_at_rowf(unpack_boxx)i|>pack_boxletmap_at_rowfxi=M.map_at_rowf(unpack_boxx)i|>pack_boxletmapi_at_colfxj=M.mapi_at_colf(unpack_boxx)j|>pack_boxletmap_at_colfxj=M.map_at_colf(unpack_boxx)j|>pack_boxletexistsfx=M.existsf(unpack_boxx)letnot_existsfx=M.not_existsf(unpack_boxx)letfor_allfx=M.for_allf(unpack_boxx)letis_zerox=M.is_zero(unpack_boxx)letis_positivex=M.is_positive(unpack_boxx)letis_negativex=M.is_negative(unpack_boxx)letis_nonpositivex=M.is_nonpositive(unpack_boxx)letis_nonnegativex=M.is_nonnegative(unpack_boxx)letequalxy=M.equal(unpack_boxx)(unpack_boxy)letnot_equalxy=M.not_equal(unpack_boxx)(unpack_boxy)letgreaterxy=M.greater(unpack_boxx)(unpack_boxy)letlessxy=M.less(unpack_boxx)(unpack_boxy)letgreater_equalxy=M.greater_equal(unpack_boxx)(unpack_boxy)letless_equalxy=M.less_equal(unpack_boxx)(unpack_boxy)letelt_equalxy=M.elt_equal(unpack_boxx)(unpack_boxy)|>pack_boxletelt_not_equalxy=M.elt_not_equal(unpack_boxx)(unpack_boxy)|>pack_boxletelt_lessxy=M.elt_less(unpack_boxx)(unpack_boxy)|>pack_boxletelt_greaterxy=M.elt_greater(unpack_boxx)(unpack_boxy)|>pack_boxletelt_less_equalxy=M.elt_less_equal(unpack_boxx)(unpack_boxy)|>pack_boxletelt_greater_equalxy=M.elt_greater_equal(unpack_boxx)(unpack_boxy)|>pack_boxletequal_scalarxa=M.equal_scalar(unpack_boxx)(unpack_elta)letnot_equal_scalarxa=M.not_equal_scalar(unpack_boxx)(unpack_elta)letless_scalarxa=M.less_scalar(unpack_boxx)(unpack_elta)letgreater_scalarxa=M.greater_scalar(unpack_boxx)(unpack_elta)letless_equal_scalarxa=M.less_equal_scalar(unpack_boxx)(unpack_elta)letgreater_equal_scalarxa=M.greater_equal_scalar(unpack_boxx)(unpack_elta)letelt_equal_scalarxa=M.elt_equal_scalar(unpack_boxx)(unpack_elta)|>pack_boxletelt_not_equal_scalarxa=M.elt_not_equal_scalar(unpack_boxx)(unpack_elta)|>pack_boxletelt_less_scalarxa=M.elt_less_scalar(unpack_boxx)(unpack_elta)|>pack_boxletelt_greater_scalarxa=M.elt_greater_scalar(unpack_boxx)(unpack_elta)|>pack_boxletelt_less_equal_scalarxa=M.elt_less_equal_scalar(unpack_boxx)(unpack_elta)|>pack_boxletelt_greater_equal_scalarxa=M.elt_greater_equal_scalar(unpack_boxx)(unpack_elta)|>pack_boxletdraw_rows?(replacement=true)xc=letr,i=M.draw_rows~replacement(unpack_boxx)cinpack_boxr,iletdraw_cols?(replacement=true)xc=letr,i=M.draw_cols~replacement(unpack_boxx)cinpack_boxr,iletshuffle_rowsx=M.shuffle_rows(unpack_boxx)letshuffle_colsx=M.shuffle_cols(unpack_boxx)letshufflex=M.shuffle(unpack_boxx)letto_arrayx=M.to_array(unpack_boxx)letof_arrayxmn=M.of_arrayxmn|>pack_boxletto_arraysx=M.to_arrays(unpack_boxx)letof_arraysx=M.of_arraysx|>pack_boxletprintx=M.print(unpack_boxx)letsave~outx=M.save(unpack_boxx)~outletloadf=M.loadf|>pack_boxletinvx=M.inv(unpack_boxx)|>pack_boxlettracex=M.trace(unpack_boxx)|>pack_eltletsum'x=M.sum'(unpack_boxx)|>pack_eltletprod'x=M.prod'(unpack_boxx)|>pack_eltletmean'x=M.mean'(unpack_boxx)|>pack_eltletsum_rowsx=M.sum_rows(unpack_boxx)|>pack_boxletsum_colsx=M.sum_rows(unpack_boxx)|>pack_boxletmean_rowsx=M.sum_rows(unpack_boxx)|>pack_boxletmean_colsx=M.sum_rows(unpack_boxx)|>pack_boxletaddxy=M.add(unpack_boxx)(unpack_boxy)|>pack_boxletsubxy=M.sub(unpack_boxx)(unpack_boxy)|>pack_boxletmulxy=M.mul(unpack_boxx)(unpack_boxy)|>pack_boxletdivxy=M.div(unpack_boxx)(unpack_boxy)|>pack_boxletadd_scalarxa=M.add_scalar(unpack_boxx)(unpack_elta)|>pack_boxletsub_scalarxa=M.sub_scalar(unpack_boxx)(unpack_elta)|>pack_boxletmul_scalarxa=M.mul_scalar(unpack_boxx)(unpack_elta)|>pack_boxletdiv_scalarxa=M.div_scalar(unpack_boxx)(unpack_elta)|>pack_boxletscalar_addax=M.scalar_add(unpack_elta)(unpack_boxx)|>pack_boxletscalar_subax=M.scalar_sub(unpack_elta)(unpack_boxx)|>pack_boxletscalar_mulax=M.scalar_mul(unpack_elta)(unpack_boxx)|>pack_boxletscalar_divax=M.scalar_div(unpack_elta)(unpack_boxx)|>pack_boxletdotxy=M.dot(unpack_boxx)(unpack_boxy)|>pack_boxend(* module for float32 and float64 matrices *)moduletypeSD_Sig=sigtypemattypeeltvalmin':mat->eltvalmax':mat->eltvalminmax':mat->elt*eltvalmin_i:mat->elt*intarrayvalmax_i:mat->elt*intarrayvalminmax_i:mat->(elt*intarray)*(elt*intarray)valabs:mat->matvalabs2:mat->matvalneg:mat->matvalreci:mat->matvalsignum:mat->matvalsqr:mat->matvalsqrt:mat->matvalcbrt:mat->matvalexp:mat->matvalexp2:mat->matvalexpm1:mat->matvallog:mat->matvallog10:mat->matvallog2:mat->matvallog1p:mat->matvalsin:mat->matvalcos:mat->matvaltan:mat->matvalasin:mat->matvalacos:mat->matvalatan:mat->matvalsinh:mat->matvalcosh:mat->matvaltanh:mat->matvalasinh:mat->matvalacosh:mat->matvalatanh:mat->matvalfloor:mat->matvalceil:mat->matvalround:mat->matvaltrunc:mat->matvalerf:mat->matvalerfc:mat->matvallogistic:mat->matvalrelu:mat->matvalsoftplus:mat->matvalsoftsign:mat->matvalsoftmax:?axis:int->mat->matvalsigmoid:mat->matvallog_sum_exp':mat->eltvall1norm':mat->eltvall2norm':mat->eltvall2norm_sqr':mat->eltvalpow:mat->mat->matvalscalar_pow:elt->mat->matvalpow_scalar:mat->elt->matvalatan2:mat->mat->matvalscalar_atan2:elt->mat->matvalatan2_scalar:mat->elt->matvalhypot:mat->mat->matvalmin2:mat->mat->matvalmax2:mat->mat->matvalfmod:mat->mat->matvalfmod_scalar:mat->elt->matvalscalar_fmod:elt->mat->matvalssqr':mat->elt->eltvalssqr_diff':mat->mat->eltendmoduleMake_SD(P:PackSig)(M:SD_Sigwithtypemat:=P.matandtypeelt:=P.elt)=structopenPletmin'x=M.min'(unpack_boxx)|>pack_eltletmax'x=M.max'(unpack_boxx)|>pack_eltletminmax'x=leta,b=M.minmax'(unpack_boxx)inpack_elta,pack_eltbletmin_ix=leta,i=M.min_i(unpack_boxx)inpack_elta,iletmax_ix=leta,i=M.max_i(unpack_boxx)inpack_elta,iletminmax_ix=let(a,i),(b,j)=M.minmax_i(unpack_boxx)in(pack_elta,i),(pack_eltb,j)letabsx=M.abs(unpack_boxx)|>pack_boxletabs2x=M.abs2(unpack_boxx)|>pack_boxletnegx=M.neg(unpack_boxx)|>pack_boxletrecix=M.reci(unpack_boxx)|>pack_boxletsignumx=M.signum(unpack_boxx)|>pack_boxletsqrx=M.sqr(unpack_boxx)|>pack_boxletsqrtx=M.sqrt(unpack_boxx)|>pack_boxletcbrtx=M.cbrt(unpack_boxx)|>pack_boxletexpx=M.exp(unpack_boxx)|>pack_boxletexp2x=M.exp2(unpack_boxx)|>pack_boxletexpm1x=M.expm1(unpack_boxx)|>pack_boxletlogx=M.log(unpack_boxx)|>pack_boxletlog10x=M.log10(unpack_boxx)|>pack_boxletlog2x=M.log2(unpack_boxx)|>pack_boxletlog1px=M.log1p(unpack_boxx)|>pack_boxletsinx=M.sin(unpack_boxx)|>pack_boxletcosx=M.cos(unpack_boxx)|>pack_boxlettanx=M.tan(unpack_boxx)|>pack_boxletasinx=M.asin(unpack_boxx)|>pack_boxletacosx=M.acos(unpack_boxx)|>pack_boxletatanx=M.atan(unpack_boxx)|>pack_boxletsinhx=M.sinh(unpack_boxx)|>pack_boxletcoshx=M.cosh(unpack_boxx)|>pack_boxlettanhx=M.tanh(unpack_boxx)|>pack_boxletasinhx=M.asinh(unpack_boxx)|>pack_boxletacoshx=M.acosh(unpack_boxx)|>pack_boxletatanhx=M.atanh(unpack_boxx)|>pack_boxletfloorx=M.floor(unpack_boxx)|>pack_boxletceilx=M.ceil(unpack_boxx)|>pack_boxletroundx=M.round(unpack_boxx)|>pack_boxlettruncx=M.trunc(unpack_boxx)|>pack_boxleterfx=M.erf(unpack_boxx)|>pack_boxleterfcx=M.erfc(unpack_boxx)|>pack_boxletlogisticx=M.logistic(unpack_boxx)|>pack_boxletrelux=M.relu(unpack_boxx)|>pack_boxletsoftplusx=M.softplus(unpack_boxx)|>pack_boxletsoftsignx=M.softsign(unpack_boxx)|>pack_boxletsoftmax?axisx=M.softmax?axis(unpack_boxx)|>pack_boxletsigmoidx=M.sigmoid(unpack_boxx)|>pack_boxletlog_sum_exp'x=M.log_sum_exp'(unpack_boxx)|>pack_eltletl1norm'x=M.l1norm'(unpack_boxx)|>pack_eltletl2norm'x=M.l2norm'(unpack_boxx)|>pack_eltletl2norm_sqr'x=M.l2norm_sqr'(unpack_boxx)|>pack_eltletpowxy=M.pow(unpack_boxx)(unpack_boxy)|>pack_boxletscalar_powax=M.scalar_pow(unpack_elta)(unpack_boxx)|>pack_boxletpow_scalarxa=M.pow_scalar(unpack_boxx)(unpack_elta)|>pack_boxletatan2xy=M.atan2(unpack_boxx)(unpack_boxy)|>pack_boxletscalar_atan2ax=M.scalar_atan2(unpack_elta)(unpack_boxx)|>pack_boxletatan2_scalarxa=M.atan2_scalar(unpack_boxx)(unpack_elta)|>pack_boxlethypotxy=M.hypot(unpack_boxx)(unpack_boxy)|>pack_boxletmin2xy=M.min2(unpack_boxx)(unpack_boxy)|>pack_boxletmax2xy=M.max2(unpack_boxx)(unpack_boxy)|>pack_boxletfmodxy=M.fmod(unpack_boxx)(unpack_boxy)|>pack_boxletfmod_scalarxa=M.fmod_scalar(unpack_boxx)(unpack_elta)|>pack_boxletscalar_fmodax=M.scalar_fmod(unpack_elta)(unpack_boxx)|>pack_boxletssqr'xa=M.ssqr'(unpack_boxx)(unpack_elta)|>pack_eltletssqr_diff'xy=M.ssqr_diff'(unpack_boxx)(unpack_boxy)|>pack_eltend(* module for complex32 and complex64 matrices *)moduletypeCZ_Sig=sigtypemattypeelttypecast_matvalre:mat->cast_matvalim:mat->cast_matvalabs:mat->matvalabs2:mat->matvalconj:mat->matvalneg:mat->matvalreci:mat->matvall1norm':mat->eltvall2norm':mat->eltvall2norm_sqr':mat->eltvalssqr':mat->elt->eltvalssqr_diff':mat->mat->eltendmoduleMake_CZ(P:PackSig)(M:CZ_Sigwithtypemat:=P.matandtypeelt:=P.eltandtypecast_mat:=P.cast_mat)=structopenPletrex=M.re(unpack_boxx)|>pack_cast_boxletimx=M.im(unpack_boxx)|>pack_cast_boxletabsx=M.abs(unpack_boxx)|>pack_boxletabs2x=M.abs2(unpack_boxx)|>pack_boxletconjx=M.conj(unpack_boxx)|>pack_boxletnegx=M.neg(unpack_boxx)|>pack_boxletrecix=M.reci(unpack_boxx)|>pack_boxletl1norm'x=M.l1norm'(unpack_boxx)|>pack_eltletl2norm'x=M.l2norm'(unpack_boxx)|>pack_eltletl2norm_sqr'x=M.l2norm_sqr'(unpack_boxx)|>pack_eltletssqr'xa=M.ssqr'(unpack_boxx)(unpack_elta)|>pack_eltletssqr_diff'xy=M.ssqr_diff'(unpack_boxx)(unpack_boxy)|>pack_eltend(* matrix modules of four types *)moduleS=structincludeMake_Basic(Pack_DMS)(Owl_dense_matrix.S)includeMake_SD(Pack_DMS)(Owl_dense_matrix.S)endmoduleD=structincludeMake_Basic(Pack_DMD)(Owl_dense_matrix.D)includeMake_SD(Pack_DMD)(Owl_dense_matrix.D)endmoduleC=structincludeMake_Basic(Pack_DMC)(Owl_dense_matrix.C)includeMake_CZ(Pack_DMC)(Owl_dense_matrix.C)endmoduleZ=structincludeMake_Basic(Pack_DMZ)(Owl_dense_matrix.Z)includeMake_CZ(Pack_DMZ)(Owl_dense_matrix.Z)end