123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812(* File: mat_SDCZ.ml
Copyright (C) 2002-
Markus Mottl
email: markus.mottl@gmail.com
WWW: http://www.ocaml.info
Christophe Troestler
email: Christophe.Troestler@umons.ac.be
WWW: http://math.umh.ac.be/an/
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*)openBigarrayopenFloat64openUtils(* Creation of matrices *)letcreatemn=Array2.createprecfortran_layoutmnletmakemnx=letmat=createmninArray2.fillmatx;matletmake0mn=makemnzeroletof_arrayar=Array2.of_arrayprecfortran_layoutarletinit_rowsmnf=letmat=createmninforrow=1tomdoforcol=1tondomat.{row,col}<-frowcoldonedone;matletinit_colsmnf=letmat=createmninforcol=1tondoforrow=1tomdomat.{row,col}<-frowcoldonedone;matletcreate_mvecm=createm1letmake_mvecmx=makem1xletmvec_of_arrayar=letn=Array.lengtharinletmat=create_mvecninforrow=1tondomat.{row,1}<-ar.(row-1)done;matletdim1(mat:mat)=Array2.dim1matletdim2(mat:mat)=Array2.dim2matlethas_zero_dim(mat:mat)=dim1mat=0||dim2mat=0letmvec_to_arraymat=ifdim2mat<>1thenfailwith"mvec_to_array: more than one column"elseletn=dim1matinifn=0then[||]elseletar=Array.makenmat.{1,1}inforrow=2tondoar.(row-1)<-mat.{row,1}done;arletfrom_col_vecvec=reshape_2(genarray_of_array1vec)(Array1.dimvec)1letfrom_row_vecvec=reshape_2(genarray_of_array1vec)1(Array1.dimvec)letempty=create00letidentityn=letmat=makennzeroinfori=1tondomat.{i,i}<-onedone;matletof_diag?n?(br=1)?(bc=1)?b?ofsx?incx(x:vec)=letloc="Lacaml.D.Mat.of_diag"inletofsx,incx=get_vec_geomlocx_strofsxincxinletn=get_dim_veclocx_strofsxincxxn_strninletb=get_matlocb_strmake0brbcbnninletofsx_ref=refofsxinfori=0ton-1dob.{br+i,bc+i}<-x.{!ofsx_ref};ofsx_ref:=!ofsx_ref+incxdone;bletto_arraymat=letm=dim1matinletn=dim2matinifm=0then[||]elseifn=0thenArray.makem[||]elseletar=Array.make_matrixmnmat.{1,1}inforrow=1tomdoletrow_ar=ar.(row-1)inforcol=1tondorow_ar.(col-1)<-mat.{row,col}done;done;arletcol(mat:mat)c=Array2.slice_rightmatcletcopy_row?vecmatr=letn=dim2matinletvec=matchvecwith|Somevec->ifArray1.dimvec<nthenfailwith("copy_row: dim(vec) < "^string_of_intn);vec|None->Array1.createprecfortran_layoutninforc=1tondovec.{c}<-mat.{r,c}done;vecexternaldirect_copy:n:(int[@untagged])->ofsy:(int[@untagged])->incy:(int[@untagged])->y:vec->ofsx:(int[@untagged])->incx:(int[@untagged])->x:vec->unit="lacaml_Dcopy_stub_bc""lacaml_Dcopy_stub"letof_col_vecsar=letn=Array.lengtharinifn=0thenemptyelseletm=Array1.dimar.(0)inletmat=createmninforc=1tondoletvec=ar.(c-1)inifArray1.dimvec<>mthenfailwith"of_col_vecs: vectors not of same length";ifm>0thendirect_copy~n:m~ofsy:1~incy:1~y:(colmatc)~ofsx:1~incx:1~x:vecdone;matletto_col_vecsmat=letn=dim2matinifn=0then[||]elseletar=Array.maken(colmat1)infori=2tondoar.(i-1)<-colmatidone;arletof_col_vecs_list=function|[]->empty|(vec::_)aslst->letn=List.lengthlstinletm=Array1.dimvecinletmat=createmninletrecloopi=function|[]->mat|vec::t->ifArray1.dimvec<>mthenfailwith"of_col_vecs_list: vectors not of same length";ifm>0thendirect_copy~n:m~ofsy:1~incy:1~y:(colmati)~ofsx:1~incx:1~x:vec;loop(i+1)tinloop1lstletto_col_vecs_listmat=letrecloopiacc=ifi<1thenaccelseloop(i-1)(colmati::acc)inloop(dim2mat)[]letof_list=function|[]->empty|(h::t)aslst->letm=List.lengthlstinletn=List.lengthhinList.iter(funl->ifList.lengthl<>nthenfailwith"of_list: vectors not of same length")t;letmat=createmninletrecloop_colsij=function|[]->()|el::cols->mat.{i,j}<-el;loop_colsi(j+1)colsinletrecloop_rowsi=function|[]->mat|cols::rows->loop_colsi1cols;loop_rows(i+1)rowsinloop_rows1lstletto_listmat=letm=dim1matinletn=dim2matinletrow_to_listr=letreclja=ifj<1thenaelsel(j-1)(mat.{r,j}::a)inln[]inletrecloopiacc=ifi<1thenaccelseloop(i-1)(row_to_listi::acc)inloopm[]letas_vecmat=letgen=genarray_of_array2matinreshape_1gen(dim1mat*dim2mat)externaldirect_swap:pkind:Mat_patt.kind->pinit:(int[@untagged])->m:(int[@untagged])->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->br:(int[@untagged])->bc:(int[@untagged])->b:mat->unit="lacaml_Dswap_mat_stub_bc""lacaml_Dswap_mat_stub"letswap?patt?m?n?(ar=1)?(ac=1)a?(br=1)?(bc=1)b=letloc="Lacaml.D.Mat.swap"inletm=get_dim1_matloca_straarm_strminletn=get_dim2_matloca_straacn_strnincheck_dim_matlocb_strbrbcbmn;letpkind,pinit=Mat_patt.normalize_args~loc~m~npattindirect_swap~pkind~pinit~m~n~ar~ac~a~br~bc~bexternaldirect_transpose_copy:m:(int[@untagged])->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->br:(int[@untagged])->bc:(int[@untagged])->b:mat->unit="lacaml_Dtranspose_copy_stub_bc""lacaml_Dtranspose_copy_stub"lettranspose_copy?m?n?(br=1)?(bc=1)?b?(ar=1)?(ac=1)a=letloc="Lacaml.D.Mat.transpose_copy"inletm=get_dim1_matloca_straarm_strminletn=get_dim2_matloca_straacn_strninletb=get_matlocb_strcreatebrbcbnmindirect_transpose_copy~m~n~ar~ac~a~br~bc~b;bletdetri?(up=true)?n?(ar=1)?(ac=1)(a:mat)=letloc="Lacaml.D.Mat.detri"inletn=get_n_of_squareloca_straracaninifupthenforc=1ton-1doletar_c=ar+cinletac_c=ac+cinforr=0toc-1doa.{ar_c,ac+r}<-a.{ar+r,ac_c}donedoneelseforc=1ton-1doletar_c=ar+cinletac_c=ac+cinforr=0toc-1doa.{ar+r,ac_c}<-a.{ar_c,ac+r}donedoneletpacked?(up=true)?n?(ar=1)?(ac=1)(a:mat)=letloc="Lacaml.D.Mat.packed"inletn=get_n_of_squareloca_straracaninletdst=Array1.createprecfortran_layout((n*n+n)/2)inletpos_ref=ref1inifupthenforc=1tondoforr=1tocdoletpos=!pos_refindst.{pos}<-a.{r,c};pos_ref:=pos+1;donedoneelseforc=1tondoforr=ctondoletpos=!pos_refindst.{pos}<-a.{r,c};pos_ref:=pos+1;donedone;dstletunpacked?(up=true)?n(src:vec)=letloc="Lacaml.D.Mat.unpacked"inletn=get_unpacked_dimloc?n(Array1.dimsrc)inleta=make0nninletpos_ref=ref1inifupthenforc=1tondoforr=1tocdoletpos=!pos_refina.{r,c}<-src.{pos};pos_ref:=pos+1;donedoneelseforc=1tondoforr=ctondoletpos=!pos_refina.{r,c}<-src.{pos};pos_ref:=pos+1;donedone;aletcopy_diag?n?(ofsy=1)?(incy=1)?y?(ar=1)?(ac=1)a=letloc="Lacaml.D.Mat.copy_diag"inletn1=get_dim1_matloca_straarn_strninletn2=get_dim2_matloca_straacn_strninletn_diag=minn1n2inlety=get_veclocy_stryofsyincyn_diagvec_createinletofsy_ref=refofsyinfori=0ton_diag-1doy.{!ofsy_ref}<-a.{ar+i,ac+i};ofsy_ref:=!ofsy_ref+incydone;ylettracemat=letm=dim1matinletn=dim2matinletn_diag=minmninletrecloopitrace=ifi=0thentraceelseloop(i-1)(addtracemat.{i,i})inloopn_diagzeroexternaldirect_scal_mat:pkind:Mat_patt.kind->pinit:(int[@untagged])->m:(int[@untagged])->n:(int[@untagged])->alpha:(float[@unboxed])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->unit="lacaml_Dscal_mat_stub_bc""lacaml_Dscal_mat_stub"letscal?patt?m?nalpha?(ar=1)?(ac=1)a=letloc="Lacaml.D.Mat.scal"inletm=get_dim1_matloca_straarm_strminletn=get_dim2_matloca_straacn_strninletpkind,pinit=Mat_patt.normalize_args~loc~m~npattindirect_scal_mat~pkind~pinit~m~n~alpha~ar~ac~aexternaldirect_scal_cols:pkind:Mat_patt.kind->pinit:(int[@untagged])->m:(int[@untagged])->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->ofs:(int[@untagged])->alphas:vec->unit="lacaml_Dscal_cols_stub_bc""lacaml_Dscal_cols_stub"letscal_cols?patt?m?n?(ar=1)?(ac=1)a?ofsalphas=letloc="Lacaml.D.Mat.scal_cols"inletm=get_dim1_matloca_straarm_strminletn=get_dim2_matloca_straacn_strninletofs=get_vec_ofslocalphas_strofsinignore(get_dim_veclocalphas_strofs1alphasn_str(Somen));letpkind,pinit=Mat_patt.normalize_args~loc~m~npattindirect_scal_cols~pkind~pinit~m~n~ar~ac~a~ofs~alphasexternaldirect_scal_rows:pkind:Mat_patt.kind->pinit:(int[@untagged])->m:(int[@untagged])->n:(int[@untagged])->ofs:(int[@untagged])->alphas:vec->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->unit="lacaml_Dscal_rows_stub_bc""lacaml_Dscal_rows_stub"letscal_rows?patt?m?n?ofsalphas?(ar=1)?(ac=1)a=letloc="Lacaml.D.Mat.scal_rows"inletm=get_dim1_matloca_straarm_strminletn=get_dim2_matloca_straacn_strninletofs=get_vec_ofslocalphas_strofsinignore(get_dim_veclocalphas_strofs1alphasn_str(Somem));letpkind,pinit=Mat_patt.normalize_args~loc~m~npattindirect_scal_rows~pkind~pinit~m~n~ofs~alphas~ar~ac~aletvec_createn=Array1.createprecfortran_layoutnexternaldirect_syrk_trace:n:(int[@untagged])->k:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->(float[@unboxed])="lacaml_Dsyrk_trace_stub_bc""lacaml_Dsyrk_trace_stub"letsyrk_trace?n?k?(ar=1)?(ac=1)a=letloc="Lacaml.D.Mat.syrk_trace"inletn=get_dim1_matloca_straarn_strninletk=get_dim2_matloca_straack_strkindirect_syrk_trace~n~k~ar~ac~a(* Operations on one matrix *)externaldirect_fill:pkind:Mat_patt.kind->pinit:(int[@untagged])->m:(int[@untagged])->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->x:(float[@unboxed])->unit="lacaml_Dfill_mat_stub_bc""lacaml_Dfill_mat_stub"letfill?patt?m?n?(ar=1)?(ac=1)ax=letloc="Lacaml.D.Mat.fill"inletm=get_dim1_matloca_straarm_strminletn=get_dim2_matloca_straacn_strninletpkind,pinit=Mat_patt.normalize_args~loc~m~npattindirect_fill~pkind~pinit~m~n~ar~ac~a~xexternaldirect_sum:pkind:Mat_patt.kind->pinit:(int[@untagged])->m:(int[@untagged])->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->(float[@unboxed])="lacaml_Dsum_mat_stub_bc""lacaml_Dsum_mat_stub"letsum?patt?m?n?(ar=1)?(ac=1)a=letloc="Lacaml.D.Mat.sum"inletm=get_dim1_matloca_straarm_strminletn=get_dim2_matloca_straacn_strninletpkind,pinit=Mat_patt.normalize_args~loc~m~npattindirect_sum~pkind~pinit~m~n~ar~ac~aexternaldirect_add_const:c:(float[@unboxed])->pkind:Mat_patt.kind->pinit:(int[@untagged])->m:(int[@untagged])->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->br:(int[@untagged])->bc:(int[@untagged])->b:mat->unit="lacaml_Dadd_const_mat_stub_bc""lacaml_Dadd_const_mat_stub"letadd_constc?patt?m?n?(br=1)?(bc=1)?b?(ar=1)?(ac=1)a=letloc="Lacaml.D.Mat.add_const"inletm=get_dim1_matloca_straarm_strminletn=get_dim2_matloca_straacn_strninletpkind,pinit=Mat_patt.normalize_args~loc~m~npattinletb=get_matlocb_strcreatebrbcbmnindirect_add_const~c~pkind~pinit~m~n~ar~ac~a~br~bc~b;bexternaldirect_neg:pkind:Mat_patt.kind->pinit:(int[@untagged])->m:(int[@untagged])->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->br:(int[@untagged])->bc:(int[@untagged])->b:mat->unit="lacaml_Dneg_mat_stub_bc""lacaml_Dneg_mat_stub"letneg?patt?m?n?(br=1)?(bc=1)?b?(ar=1)?(ac=1)a=letloc="Lacaml.D.Mat.neg"inletm=get_dim1_matloca_straarm_strminletn=get_dim2_matloca_straacn_strninletpkind,pinit=Mat_patt.normalize_args~loc~m~npattinletb=get_matlocb_strcreatebrbcbmnindirect_neg~pkind~pinit~m~n~ar~ac~a~br~bc~b;bexternaldirect_reci:pkind:Mat_patt.kind->pinit:(int[@untagged])->m:(int[@untagged])->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->br:(int[@untagged])->bc:(int[@untagged])->b:mat->unit="lacaml_Dreci_mat_stub_bc""lacaml_Dreci_mat_stub"letreci?patt?m?n?(br=1)?(bc=1)?b?(ar=1)?(ac=1)a=letloc="Lacaml.D.Mat.reci"inletm=get_dim1_matloca_straarm_strminletn=get_dim2_matloca_straacn_strninletpkind,pinit=Mat_patt.normalize_args~loc~m~npattinletb=get_matlocb_strcreatebrbcbmnindirect_reci~pkind~pinit~m~n~ar~ac~a~br~bc~b;bexternaldirect_syrk_diag:trans:char->n:(int[@untagged])->k:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->ofsy:(int[@untagged])->y:vec->alpha:(float[@unboxed])->beta:(float[@unboxed])->unit="lacaml_Dsyrk_diag_stub_bc""lacaml_Dsyrk_diag_stub"letsyrk_diag?n?k?(beta=zero)?(ofsy=1)?y?(trans=`N)?(alpha=one)?(ar=1)?(ac=1)a=letloc="Lacaml.D.Mat.syrk_diag"inletn=get_rows_mat_trloca_straaractransn_strninletk=get_cols_mat_trloca_straaractransk_strkinlety=get_veclocy_stryofsy1nvec_createinlettrans=get_trans_chartransindirect_syrk_diag~trans~n~k~ar~ac~a~ofsy~y~alpha~beta;y(* Operations on two matrices *)externaldirect_mat_add:pkind:Mat_patt.kind->pinit:(int[@untagged])->m:(int[@untagged])->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->br:(int[@untagged])->bc:(int[@untagged])->b:mat->cr:(int[@untagged])->cc:(int[@untagged])->c:mat->unit="lacaml_Dadd_mat_stub_bc""lacaml_Dadd_mat_stub"letadd?patt?m?n?(cr=1)?(cc=1)?c?(ar=1)?(ac=1)a?(br=1)?(bc=1)b=letloc="Lacaml.D.Mat.add"inletm=get_dim1_matloca_straarm_strminletn=get_dim2_matloca_straacn_strnincheck_dim_matlocb_strbrbcbmn;letpkind,pinit=Mat_patt.normalize_args~loc~m~npattinletc=get_matlocc_strcreatecrcccmnindirect_mat_add~pkind~pinit~m~n~ar~ac~a~br~bc~b~cr~cc~c;cexternaldirect_mat_sub:pkind:Mat_patt.kind->pinit:(int[@untagged])->m:(int[@untagged])->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->br:(int[@untagged])->bc:(int[@untagged])->b:mat->cr:(int[@untagged])->cc:(int[@untagged])->c:mat->unit="lacaml_Dsub_mat_stub_bc""lacaml_Dsub_mat_stub"letsub?patt?m?n?(cr=1)?(cc=1)?c?(ar=1)?(ac=1)a?(br=1)?(bc=1)b=letloc="Lacaml.D.Mat.sub"inletm=get_dim1_matloca_straarm_strminletn=get_dim2_matloca_straacn_strnincheck_dim_matlocb_strbrbcbmn;letpkind,pinit=Mat_patt.normalize_args~loc~m~npattinletc=get_matlocc_strcreatecrcccmnindirect_mat_sub~pkind~pinit~m~n~ar~ac~a~br~bc~b~cr~cc~c;cexternaldirect_mat_mul:pkind:Mat_patt.kind->pinit:(int[@untagged])->m:(int[@untagged])->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->br:(int[@untagged])->bc:(int[@untagged])->b:mat->cr:(int[@untagged])->cc:(int[@untagged])->c:mat->unit="lacaml_Dmul_mat_stub_bc""lacaml_Dmul_mat_stub"letmul?patt?m?n?(cr=1)?(cc=1)?c?(ar=1)?(ac=1)a?(br=1)?(bc=1)b=letloc="Lacaml.D.Mat.mul"inletm=get_dim1_matloca_straarm_strminletn=get_dim2_matloca_straacn_strnincheck_dim_matlocb_strbrbcbmn;letpkind,pinit=Mat_patt.normalize_args~loc~m~npattinletc=get_matlocc_strcreatecrcccmnindirect_mat_mul~pkind~pinit~m~n~ar~ac~a~br~bc~b~cr~cc~c;cexternaldirect_mat_div:pkind:Mat_patt.kind->pinit:(int[@untagged])->m:(int[@untagged])->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->br:(int[@untagged])->bc:(int[@untagged])->b:mat->cr:(int[@untagged])->cc:(int[@untagged])->c:mat->unit="lacaml_Ddiv_mat_stub_bc""lacaml_Ddiv_mat_stub"letdiv?patt?m?n?(cr=1)?(cc=1)?c?(ar=1)?(ac=1)a?(br=1)?(bc=1)b=letloc="Lacaml.D.Mat.div"inletm=get_dim1_matloca_straarm_strminletn=get_dim2_matloca_straacn_strnincheck_dim_matlocb_strbrbcbmn;letpkind,pinit=Mat_patt.normalize_args~loc~m~npattinletc=get_matlocc_strcreatecrcccmnindirect_mat_div~pkind~pinit~m~n~ar~ac~a~br~bc~b~cr~cc~c;cexternaldirect_axpy_mat:alpha:(float[@unboxed])->pkind:Mat_patt.kind->pinit:(int[@untagged])->m:(int[@untagged])->n:(int[@untagged])->xr:(int[@untagged])->xc:(int[@untagged])->x:mat->yr:(int[@untagged])->yc:(int[@untagged])->y:mat->unit="lacaml_Daxpy_mat_stub_bc""lacaml_Daxpy_mat_stub"letaxpy?(alpha=one)?patt?m?n?(xr=1)?(xc=1)x?(yr=1)?(yc=1)y=letloc="Lacaml.D.Mat.axpy"inletm=get_dim1_matlocx_strxxrm_strminletn=get_dim2_matlocx_strxxcn_strnincheck_dim_matlocy_stryrycymn;letpkind,pinit=Mat_patt.normalize_args~loc~m~npattindirect_axpy_mat~alpha~pkind~pinit~m~n~xr~xc~x~yr~yc~yexternaldirect_gemm_diag:transa:char->transb:char->n:(int[@untagged])->k:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->br:(int[@untagged])->bc:(int[@untagged])->b:mat->ofsy:(int[@untagged])->y:vec->alpha:(float[@unboxed])->beta:(float[@unboxed])->unit="lacaml_Dgemm_diag_stub_bc""lacaml_Dgemm_diag_stub"letgemm_diag?n?k?(beta=zero)?(ofsy=1)?y?(transa=`N)?(alpha=one)?(ar=1)?(ac=1)a?(transb=`N)?(br=1)?(bc=1)b=letloc="Lacaml.D.Mat.gemm_diag"inletn=get_rows_mat_trloca_straaractransan_strninletn=get_cols_mat_trlocb_strbbrbctransbn_str(Somen)inletk=get_inner_dimloca_straaractransab_strbbrbctransbk_strkinlettransa=get_trans_chartransainlettransb=get_trans_chartransbinlety=get_veclocy_stryofsy1nvec_createindirect_gemm_diag~transa~transb~n~k~ar~ac~a~br~bc~b~ofsy~y~alpha~beta;yexternaldirect_gemm_trace:transa:char->transb:char->n:(int[@untagged])->k:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->br:(int[@untagged])->bc:(int[@untagged])->b:mat->(float[@unboxed])="lacaml_Dgemm_trace_stub_bc""lacaml_Dgemm_trace_stub"letgemm_trace?n?k?(transa=`N)?(ar=1)?(ac=1)a?(transb=`N)?(br=1)?(bc=1)b=letloc="Lacaml.D.Mat.gemm_trace"inletn=get_rows_mat_trloca_straaractransan_strninletn=get_cols_mat_trlocb_strbbrbctransbn_str(Somen)inletk=get_inner_dimloca_straaractransab_strbbrbctransbk_strkinlettransa=get_trans_chartransainlettransb=get_trans_chartransbindirect_gemm_trace~transa~transb~n~k~ar~ac~a~br~bc~bexternaldirect_symm2_trace:n:(int[@untagged])->uploa:char->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->uplob:char->br:(int[@untagged])->bc:(int[@untagged])->b:mat->(float[@unboxed])="lacaml_Dsymm2_trace_stub_bc""lacaml_Dsymm2_trace_stub"letsymm2_trace?n?(upa=true)?(ar=1)?(ac=1)a?(upb=true)?(br=1)?(bc=1)b=letloc="Lacaml.D.Mat.symm2_trace"inletn=get_n_of_squareloca_straracaninletn=get_n_of_squarelocb_strbrbcb(Somen)inletuploa=get_uplo_charupainletuplob=get_uplo_charupbindirect_symm2_trace~n~uploa~ar~ac~a~uplob~br~bc~bexternaldirect_ssqr_diff:pkind:Mat_patt.kind->pinit:(int[@untagged])->m:(int[@untagged])->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->br:(int[@untagged])->bc:(int[@untagged])->b:mat->(float[@unboxed])="lacaml_Dssqr_diff_mat_stub_bc""lacaml_Dssqr_diff_mat_stub"letssqr_diff?patt?m?n?(ar=1)?(ac=1)a?(br=1)?(bc=1)b=letloc="Lacaml.D.Mat.ssqr_diff"inletm=get_dim1_matloca_straarm_strminletn=get_dim2_matloca_straacn_strnincheck_dim_matlocb_strbrbcbmn;letpkind,pinit=Mat_patt.normalize_args~loc~m~npattindirect_ssqr_diff~pkind~pinit~m~n~ar~ac~a~br~bc~b(* Iterators over matrices *)letmapf?m?n?(br=1)?(bc=1)?b?(ar=1)?(ac=1)(a:mat)=letloc="Lacaml.D.Mat.map"inletm=get_dim1_matloca_straarm_strminletn=get_dim2_matloca_straacn_strninletb=get_matlocb_strcreatebrbcbmninletmax_row=m-1infori=0ton-1doforj=0tomax_rowdob.{br+j,bc+i}<-fa.{ar+j,ac+i}done;done;bletfold_colscoll?n?(ac=1)acca=letloc="Lacaml.D.Mat.fold_cols"inletn=get_dim2_matloca_straacn_strninletrecloopiacc=ifi=nthenaccelseloop(i+1)(collacc(cola(ac+i)))inloop0acc