Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file owl_ext_dense_ndarray.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879# 1 "src/owl/ext/owl_ext_dense_ndarray.ml"(*
* OWL - an OCaml numerical library for scientific computing
* Copyright (c) 2016-2018 Liang Wang <liang.wang@cl.cam.ac.uk>
*)openOwl_typesopenOwl_ext_types(* modules for packing and unpacking *)moduletypePackSig=sigtypearrtypeelttypecast_arrvalpack_box:arr->ext_typvalunpack_box:ext_typ->arrvalpack_elt:elt->ext_typvalunpack_elt:ext_typ->eltvalpack_cast_box:cast_arr->ext_typendmodulePack_DAS=structtypearr=dastypeelt=floattypecast_arr=dasletpack_boxx=DASxletunpack_box=functionDASx->x|_->failwith"Pack_DAS:unpack_das"letpack_eltx=Fxletunpack_elt=functionFx->x|_->failwith"Pack_DAS:unpack_elt"letpack_cast_boxx=DASxendmodulePack_DAD=structtypearr=dadtypeelt=floattypecast_arr=dadletpack_boxx=DADxletunpack_box=functionDADx->x|_->failwith"Pack_DAD:unpack_dad"letpack_eltx=Fxletunpack_elt=functionFx->x|_->failwith"Pack_DAD:unpack_elt"letpack_cast_boxx=DADxendmodulePack_DAC=structtypearr=dactypeelt=Complex.ttypecast_arr=dasletpack_boxx=DACxletunpack_box=functionDACx->x|_->failwith"Pack_DAC:unpack_dac"letpack_eltx=Cxletunpack_elt=functionCx->x|_->failwith"Pack_DAC:unpack_elt"letpack_cast_boxx=DASxendmodulePack_DAZ=structtypearr=daztypeelt=Complex.ttypecast_arr=dadletpack_boxx=DAZxletunpack_box=functionDAZx->x|_->failwith"Pack_DAZ:unpack_daz"letpack_eltx=Cxletunpack_elt=functionCx->x|_->failwith"Pack_DAZ:unpack_elt"letpack_cast_boxx=DADxend(* module for basic ndarray operations *)moduletypeBasicSig=sigtypearrtypeeltvalempty:intarray->arrvalempty:intarray->arrvalcreate:intarray->elt->arrvalzeros:intarray->arrvalones:intarray->arrvaluniform:?a:elt->?b:elt->intarray->arrvalsequential:?a:elt->?step:elt->intarray->arrvallinspace:elt->elt->int->arrvallogspace:?base:float->elt->elt->int->arrvalshape:arr->intarrayvalnum_dims:arr->intvalnth_dim:arr->int->intvalnumel:arr->intvalnnz:arr->intvaldensity:arr->floatvalsize_in_bytes:arr->intvalsame_shape:arr->arr->boolvalget:arr->intarray->eltvalset:arr->intarray->elt->unitvalget_fancy:indexlist->arr->arrvalset_fancy:indexlist->arr->arr->unitvalsub_left:arr->int->int->arrvalslice_left:arr->intarray->arrvalcopy_to:arr->arr->unitvalreset:arr->unitvalfill:arr->elt->unitvalcopy:arr->arrvalreshape:arr->intarray->arrvalflatten:arr->arrvalreverse:arr->arrvaltranspose:?axis:intarray->arr->arrvalswap:int->int->arr->arrvaltile:arr->intarray->arrvalrepeat:?axis:int->arr->int->arrvalsqueeze:?axis:intarray->arr->arrvaliteri:(int->elt->unit)->arr->unitvaliter:(elt->unit)->arr->unitvalmapi:(int->elt->elt)->arr->arrvalmap:(elt->elt)->arr->arrvalfilteri:(int->elt->bool)->arr->intarrayvalfilter:(elt->bool)->arr->intarrayvalfoldi:?axis:int->(int->elt->elt->elt)->elt->arr->arrvalfold:?axis:int->(elt->elt->elt)->elt->arr->arrvaliter2i:(int->elt->elt->unit)->arr->arr->unitvaliter2:(elt->elt->unit)->arr->arr->unitvalmap2i:(int->elt->elt->elt)->arr->arr->arrvalmap2:(elt->elt->elt)->arr->arr->arrvalexists:(elt->bool)->arr->boolvalnot_exists:(elt->bool)->arr->boolvalfor_all:(elt->bool)->arr->boolvalis_zero:arr->boolvalis_positive:arr->boolvalis_negative:arr->boolvalis_nonpositive:arr->boolvalis_nonnegative:arr->boolvalequal:arr->arr->boolvalnot_equal:arr->arr->boolvalgreater:arr->arr->boolvalless:arr->arr->boolvalgreater_equal:arr->arr->boolvalless_equal:arr->arr->boolvalelt_equal:arr->arr->arrvalelt_not_equal:arr->arr->arrvalelt_less:arr->arr->arrvalelt_greater:arr->arr->arrvalelt_less_equal:arr->arr->arrvalelt_greater_equal:arr->arr->arrvalequal_scalar:arr->elt->boolvalnot_equal_scalar:arr->elt->boolvalless_scalar:arr->elt->boolvalgreater_scalar:arr->elt->boolvalless_equal_scalar:arr->elt->boolvalgreater_equal_scalar:arr->elt->boolvalelt_equal_scalar:arr->elt->arrvalelt_not_equal_scalar:arr->elt->arrvalelt_less_scalar:arr->elt->arrvalelt_greater_scalar:arr->elt->arrvalelt_less_equal_scalar:arr->elt->arrvalelt_greater_equal_scalar:arr->elt->arrvalprint:?max_row:int->?max_col:int->?header:bool->?fmt:(elt->string)->arr->unitvalsave:arr->string->unitvalload:string->arrvalsum':arr->eltvalprod':arr->eltvaladd:arr->arr->arrvalsub:arr->arr->arrvalmul:arr->arr->arrvaldiv:arr->arr->arrvaladd_scalar:arr->elt->arrvalsub_scalar:arr->elt->arrvalmul_scalar:arr->elt->arrvaldiv_scalar:arr->elt->arrvalscalar_add:elt->arr->arrvalscalar_sub:elt->arr->arrvalscalar_mul:elt->arr->arrvalscalar_div:elt->arr->arrendmoduleMake_Basic(P:PackSig)(M:BasicSigwithtypearr:=P.arrandtypeelt:=P.elt)=structopenPletemptyi=M.emptyi|>pack_boxletcreateia=M.createi(unpack_elta)|>pack_boxletzerosi=M.zerosi|>pack_boxletonesi=M.onesi|>pack_boxletuniform?a?bi=M.uniform?a?bi|>pack_boxletsequential?a?stepi=M.sequential?a?stepi|>pack_boxletlinspaceabn=M.linspaceabn|>pack_boxletlogspace?baseabn=M.logspaceabn|>pack_boxletshapex=M.shape(unpack_boxx)letnum_dimsx=M.num_dims(unpack_boxx)letnth_dimx=M.nth_dim(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_shapex=M.same_shape(unpack_boxx)letgetxi=M.get(unpack_boxx)i|>pack_eltletsetxia=M.set(unpack_boxx)i(unpack_elta)letget_fancyaxisx=M.get_fancyaxis(unpack_boxx)|>pack_boxletset_fancyaxisxy=M.set_fancyaxis(unpack_boxx)(unpack_boxy)letsub_leftxsl=M.sub_left(unpack_boxx)sl|>pack_boxletslice_leftxi=M.slice_left(unpack_boxx)i|>pack_boxletcopy_tosrcdst=M.copy_to(unpack_boxsrc)(unpack_boxdst)letfillxa=M.fill(unpack_boxx)(unpack_elta)letcopyx=M.copy(unpack_boxx)|>pack_boxletreshapexs=M.reshape(unpack_boxx)s|>pack_boxletflattenx=M.flatten(unpack_boxx)|>pack_boxletreversex=M.reverse(unpack_boxx)|>pack_boxlettranspose?axisx=M.transpose?axis(unpack_boxx)|>pack_boxletswapa0a1x=M.swapa0a1(unpack_boxx)|>pack_boxlettilexreps=M.tile(unpack_boxx)repsletrepeat?axisxreps=M.repeat?axis(unpack_boxx)repsletsqueeze?(axis=[||])x=M.squeeze~axis(unpack_boxx)|>pack_boxletiterifx=M.iterif(unpack_boxx)letiterfx=M.iterf(unpack_boxx)letmapifx=M.mapif(unpack_boxx)|>pack_boxletmapfx=M.mapf(unpack_boxx)|>pack_boxletfilterifx=M.filterif(unpack_boxx)letfilterfx=M.filterf(unpack_boxx)letfoldi?axisfax=M.foldi?axisfa(unpack_boxx)letfoldfax=M.foldfa(unpack_boxx)letiter2ifxy=M.iter2if(unpack_boxx)(unpack_boxy)letiter2fxy=M.iter2f(unpack_boxx)(unpack_boxy)letmap2ifxy=M.map2if(unpack_boxx)(unpack_boxy)|>pack_boxletmap2fxy=M.map2if(unpack_boxx)(unpack_boxy)|>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_boxletprintx=M.print(unpack_boxx)letsavexf=M.save(unpack_boxx)fletloadf=M.loadf|>pack_boxletsum'x=M.sum'(unpack_boxx)|>pack_eltletprod'x=M.prod'(unpack_boxx)|>pack_eltletaddxy=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_boxend(* module for float32 and float64 ndarray *)moduletypeSD_Sig=sigtypearrtypeeltvalmin':arr->eltvalmax':arr->eltvalminmax':arr->elt*eltvalmin_i:arr->elt*intarrayvalmax_i:arr->elt*intarrayvalminmax_i:arr->(elt*(intarray))*(elt*(intarray))valabs:arr->arrvalabs2:arr->arrvalneg:arr->arrvalreci:arr->arrvalsignum:arr->arrvalsqr:arr->arrvalsqrt:arr->arrvalcbrt:arr->arrvalexp:arr->arrvalexp2:arr->arrvalexpm1:arr->arrvallog:arr->arrvallog10:arr->arrvallog2:arr->arrvallog1p:arr->arrvalsin:arr->arrvalcos:arr->arrvaltan:arr->arrvalasin:arr->arrvalacos:arr->arrvalatan:arr->arrvalsinh:arr->arrvalcosh:arr->arrvaltanh:arr->arrvalasinh:arr->arrvalacosh:arr->arrvalatanh:arr->arrvalfloor:arr->arrvalceil:arr->arrvalround:arr->arrvaltrunc:arr->arrvalerf:arr->arrvalerfc:arr->arrvallogistic:arr->arrvalrelu:arr->arrvalsoftplus:arr->arrvalsoftsign:arr->arrvalsoftmax:arr->arrvalsigmoid:arr->arrvallog_sum_exp':arr->eltvall1norm':arr->eltvall2norm':arr->eltvall2norm_sqr':arr->eltvalpow:arr->arr->arrvalscalar_pow:elt->arr->arrvalpow_scalar:arr->elt->arrvalatan2:arr->arr->arrvalscalar_atan2:elt->arr->arrvalatan2_scalar:arr->elt->arrvalhypot:arr->arr->arrvalmin2:arr->arr->arrvalmax2:arr->arr->arrvalfmod:arr->arr->arrvalfmod_scalar:arr->elt->arrvalscalar_fmod:elt->arr->arrvalssqr':arr->elt->eltvalssqr_diff':arr->arr->eltvalcross_entropy':arr->arr->eltendmoduleMake_SD(P:PackSig)(M:SD_Sigwithtypearr:=P.arrandtypeelt:=P.elt)=structopenPletmin'x=M.min'(unpack_boxx)|>pack_eltletmax'x=M.max'(unpack_boxx)|>pack_eltletminmax'x=leta,b=M.minmax'(unpack_boxx)in(pack_elta,pack_eltb)letmin_ix=leta,i=M.min_i(unpack_boxx)in(pack_elta,i)letmax_ix=leta,i=M.max_i(unpack_boxx)in(pack_elta,i)letminmax_ix=let(a,i),(b,j)=M.minmax_i(unpack_boxx)in(pack_elta,i),(pack_eltb,i)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_boxletsoftmaxx=M.softmax(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_eltletcross_entropy'xy=M.cross_entropy'(unpack_boxx)(unpack_boxy)|>pack_eltend(* module for complex32 and complex64 ndarray *)moduletypeCZ_Sig=sigtypearrtypeelttypecast_arrvalre:arr->cast_arrvalim:arr->cast_arrvalsum':arr->eltvalprod':arr->eltvalabs:arr->arrvalabs2:arr->arrvalconj:arr->arrvalneg:arr->arrvalreci:arr->arrvall1norm':arr->eltvall2norm':arr->eltvall2norm_sqr':arr->eltvalssqr':arr->elt->eltvalssqr_diff':arr->arr->eltendmoduleMake_CZ(P:PackSig)(M:CZ_Sigwithtypearr:=P.arrandtypeelt:=P.eltandtypecast_arr:=P.cast_arr)=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_boxletsum'x=M.sum'(unpack_boxx)|>pack_eltletprod'x=M.prod'(unpack_boxx)|>pack_eltletnegx=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(* ndarray modules of four types *)moduleS=structincludeMake_Basic(Pack_DAS)(Owl_dense_ndarray.S)includeMake_SD(Pack_DAS)(Owl_dense_ndarray.S)endmoduleD=structincludeMake_Basic(Pack_DAD)(Owl_dense_ndarray.D)includeMake_SD(Pack_DAD)(Owl_dense_ndarray.D)endmoduleC=structincludeMake_Basic(Pack_DAC)(Owl_dense_ndarray.C)includeMake_CZ(Pack_DAC)(Owl_dense_ndarray.C)endmoduleZ=structincludeMake_Basic(Pack_DAZ)(Owl_dense_ndarray.Z)includeMake_CZ(Pack_DAZ)(Owl_dense_ndarray.Z)end