12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562(* File: impl_SDCZ.ml
Copyright (C) 2001-
Markus Mottl
email: markus.mottl@gmail.com
WWW: http://www.ocaml.info
Liam Stewart
email: liam@cs.toronto.edu
WWW: http://www.cs.toronto.edu/~liam
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
*)openPrintfopenBigarrayopenFloat32openCommonopenUtilsmoduleVec=Vec4_SmoduleMat=Mat4_SmoduleRVec=Vec4_S(* BLAS-1 *)(* SWAP *)externaldirect_swap:n:(int[@untagged])->ofsx:(int[@untagged])->incx:(int[@untagged])->x:vec->ofsy:(int[@untagged])->incy:(int[@untagged])->y:vec->unit="lacaml_Sswap_stub_bc""lacaml_Sswap_stub"letswap?n?ofsx?incxx?ofsy?incyy=letloc="Lacaml.S.swap"inletofsx,incx=get_vec_geomlocx_strofsxincxinletofsy,incy=get_vec_geomlocy_strofsyincyinletn=get_dim_veclocx_strofsxincxxn_strnincheck_veclocy_stry(ofsy+(n-1)*absincy);direct_swap~n~ofsx~incx~x~ofsy~incy~y(* SCAL *)externaldirect_scal:n:(int[@untagged])->alpha:(float[@unboxed])->ofsx:(int[@untagged])->incx:(int[@untagged])->x:vec->unit="lacaml_Sscal_stub_bc""lacaml_Sscal_stub"letscal?nalpha?ofsx?incxx=letloc="Lacaml.S.scal"inletofsx,incx=get_vec_geomlocx_strofsxincxinletn=get_dim_veclocx_strofsxincxxn_strnindirect_scal~n~alpha~ofsx~incx~x(* COPY *)externaldirect_copy:n:(int[@untagged])->ofsy:(int[@untagged])->incy:(int[@untagged])->y:vec->ofsx:(int[@untagged])->incx:(int[@untagged])->x:vec->unit="lacaml_Scopy_stub_bc""lacaml_Scopy_stub"letcopy?n?ofsy?incy?y?ofsx?incxx=letloc="Lacaml.S.copy"inletofsx,incx=get_vec_geomlocx_strofsxincxinletofsy,incy=get_vec_geomlocy_strofsyincyinletn=get_dim_veclocx_strofsxincxxn_strninlety=letmin_dim_y=ofsy+(n-1)*absincyinmatchywith|Somey->check_veclocy_strymin_dim_y;y|None->Vec.createmin_dim_yindirect_copy~n~ofsy~incy~y~ofsx~incx~x;y(* NRM2 *)externaldirect_nrm2:n:(int[@untagged])->ofsx:(int[@untagged])->incx:(int[@untagged])->x:vec->(float[@unboxed])="lacaml_Snrm2_stub_bc""lacaml_Snrm2_stub"letnrm2?n?ofsx?incxx=letloc="Lacaml.S.nrm2"inletofsx,incx=get_vec_geomlocx_strofsxincxinletn=get_dim_veclocx_strofsxincxxn_strnindirect_nrm2~n~ofsx~incx~x(* AXPY *)externaldirect_axpy:alpha:(float[@unboxed])->n:(int[@untagged])->ofsx:(int[@untagged])->incx:(int[@untagged])->x:vec->ofsy:(int[@untagged])->incy:(int[@untagged])->y:vec->unit="lacaml_Saxpy_stub_bc""lacaml_Saxpy_stub"letaxpy?(alpha=one)?n?ofsx?incxx?ofsy?incyy=letloc="Lacaml.S.axpy"inletofsx,incx=get_vec_geomlocx_strofsxincxinletofsy,incy=get_vec_geomlocy_strofsyincyinletn=get_dim_veclocx_strofsxincxxn_strnincheck_veclocy_stry(ofsy+(n-1)*absincy);direct_axpy~alpha~n~ofsx~incx~x~ofsy~incy~y(* AMAX *)externaldirect_iamax:n:(int[@untagged])->ofsx:(int[@untagged])->incx:(int[@untagged])->x:vec->(int[@untagged])="lacaml_Siamax_stub_bc""lacaml_Siamax_stub"letiamax?n?ofsx?incxx=letloc="Lacaml.S.iamax"inletofsx,incx=get_vec_geomlocx_strofsxincxinletn=get_dim_veclocx_strofsxincxxn_strnindirect_iamax~n~ofsx~incx~xletamax?n?ofsx?incxx=letloc="Lacaml.S.amax"inletofsx,incx=get_vec_geomlocx_strofsxincxinletn=get_dim_veclocx_strofsxincxxn_strninifn=0theninvalid_arg(sprintf"%s: n = 0"loc)elsex.{direct_iamax~n~ofsx~incx~x}(* BLAS-2 *)(* GEMV *)externaldirect_gemv:ofsy:(int[@untagged])->incy:(int[@untagged])->y:vec->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->m:(int[@untagged])->n:(int[@untagged])->trans:char->alpha:(float[@unboxed])->beta:(float[@unboxed])->ofsx:(int[@untagged])->incx:(int[@untagged])->x:vec->unit="lacaml_Sgemv_stub_bc""lacaml_Sgemv_stub"letgemv?m?n?(beta=zero)?ofsy?incy?y?(trans=`N)?(alpha=one)?(ar=1)?(ac=1)a?ofsx?incxx=letloc="Lacaml.S.gemv"inletm=get_dim1_matloca_straarm_strminletn=get_dim2_matloca_straacn_strninletofsx,incx,ofsy,incy,y,trans=gXmv_get_paramslocVec.createmnofsxincxxofsyincyytransindirect_gemv~ofsy~incy~y~ar~ac~a~m~n~trans~alpha~beta~ofsx~incx~x;y(* GBMV *)externaldirect_gbmv:ofsy:(int[@untagged])->incy:(int[@untagged])->y:vec->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->m:(int[@untagged])->n:(int[@untagged])->kl:(int[@untagged])->ku:(int[@untagged])->trans:char->alpha:(float[@unboxed])->beta:(float[@unboxed])->ofsx:(int[@untagged])->incx:(int[@untagged])->x:vec->unit="lacaml_Sgbmv_stub_bc""lacaml_Sgbmv_stub"letgbmv?m?n?(beta=zero)?ofsy?incy?y?(trans=`N)?(alpha=one)?(ar=1)?(ac=1)aklku?ofsx?incxx=letloc="Lacaml.S.gbmv"incheck_var_lt0~loc~name:kl_strkl;check_var_lt0~loc~name:ku_strku;check_dim1_matloca_straar"kl + ku + 1 for "(kl+ku+1);letn=get_dim2_matloca_straacn_strninletm=matchmwith|None->n|Somem->check_var_lt0~loc~name:m_strm;minletofsx,incx,ofsy,incy,y,trans=gXmv_get_paramslocVec.createmnofsxincxxofsyincyytransindirect_gbmv~ofsy~incy~y~ar~ac~a~m~n~kl~ku~trans~alpha~beta~ofsx~incx~x;y(* SYMV *)externaldirect_symv:ofsy:(int[@untagged])->incy:(int[@untagged])->y:vec->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->n:(int[@untagged])->uplo:char->alpha:(float[@unboxed])->beta:(float[@unboxed])->ofsx:(int[@untagged])->incx:(int[@untagged])->x:vec->unit="lacaml_Ssymv_stub_bc""lacaml_Ssymv_stub"letsymv?n?(beta=zero)?ofsy?incy?y?(up=true)?(alpha=one)?(ar=1)?(ac=1)a?ofsx?incxx=letloc="Lacaml.S.symv"incheck_mat_empty~loc~mat_name:a_str~dim1:(Mat.dim1a)~dim2:(Mat.dim2a);check_vec_empty~loc~vec_name:x_str~dim:(Vec.dimx);letn,ofsx,incx,ofsy,incy,y,uplo=symv_get_paramslocVec.createaracanofsxincxxofsyincyyupindirect_symv~ofsy~incy~y~ar~ac~a~n~uplo~alpha~beta~ofsx~incx~x;y(* TRMV *)externaldirect_trmv:ar:(int[@untagged])->ac:(int[@untagged])->a:mat->n:(int[@untagged])->uplo:char->trans:char->diag:char->ofsx:(int[@untagged])->incx:(int[@untagged])->x:vec->unit="lacaml_Strmv_stub_bc""lacaml_Strmv_stub"lettrmv?n?(trans=`N)?(diag=`N)?(up=true)?(ar=1)?(ac=1)a?ofsx?incxx=letloc="Lacaml.S.trmv"incheck_mat_empty~loc~mat_name:a_str~dim1:(Mat.dim1a)~dim2:(Mat.dim2a);check_vec_empty~loc~vec_name:x_str~dim:(Vec.dimx);letn,ofsx,incx,uplo,trans,diag=trXv_get_paramslocaracanofsxincxxuptransdiagindirect_trmv~ar~ac~a~n~uplo~trans~diag~ofsx~incx~x(* TRSV *)externaldirect_trsv:ar:(int[@untagged])->ac:(int[@untagged])->a:mat->n:(int[@untagged])->uplo:char->trans:char->diag:char->ofsx:(int[@untagged])->incx:(int[@untagged])->x:vec->unit="lacaml_Strsv_stub_bc""lacaml_Strsv_stub"lettrsv?n?(trans=`N)?(diag=`N)?(up=true)?(ar=1)?(ac=1)a?ofsx?incxx=letloc="Lacaml.S.trsv"incheck_mat_empty~loc~mat_name:a_str~dim1:(Mat.dim1a)~dim2:(Mat.dim2a);check_vec_empty~loc~vec_name:x_str~dim:(Vec.dimx);letn,ofsx,incx,uplo,trans,diag=trXv_get_paramslocaracanofsxincxxuptransdiagindirect_trsv~ar~ac~a~n~uplo~trans~diag~ofsx~incx~x(* TPMV *)externaldirect_tpmv:ofsap:(int[@untagged])->ap:vec->n:(int[@untagged])->uplo:char->trans:char->diag:char->ofsx:(int[@untagged])->incx:(int[@untagged])->x:vec->unit="lacaml_Stpmv_stub_bc""lacaml_Stpmv_stub"lettpmv?n?(trans=`N)?(diag=`N)?(up=true)?ofsapap?ofsx?incxx=letloc="Lacaml.S.tpmv"inletn,ofsap,ofsx,incx,uplo,trans,diag=tpXv_get_paramslocofsapap?nofsxincxxuptransdiagindirect_tpmv~ofsap~ap~n~uplo~trans~diag~ofsx~incx~x(* TPSV *)externaldirect_tpsv:ofsap:(int[@untagged])->ap:vec->n:(int[@untagged])->uplo:char->trans:char->diag:char->ofsx:(int[@untagged])->incx:(int[@untagged])->x:vec->unit="lacaml_Stpsv_stub_bc""lacaml_Stpsv_stub"lettpsv?n?(trans=`N)?(diag=`N)?(up=true)?ofsapap?ofsx?incxx=letloc="Lacaml.S.tpsv"inletn,ofsap,ofsx,incx,uplo,trans,diag=tpXv_get_paramslocofsapap?nofsxincxxuptransdiagindirect_tpsv~ofsap~ap~n~uplo~trans~diag~ofsx~incx~x(* BLAS-3 *)(* GEMM *)externaldirect_gemm:transa:char->transb:char->m:(int[@untagged])->n:(int[@untagged])->k:(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->alpha:(float[@unboxed])->beta:(float[@unboxed])->unit="lacaml_Sgemm_stub_bc""lacaml_Sgemm_stub"letgemm?m?n?k?beta?(cr=1)?(cc=1)?c?(transa=`N)?(alpha=one)?(ar=1)?(ac=1)a?(transb=`N)?(br=1)?(bc=1)b=letloc="Lacaml.S.gemm"incheck_mat_empty~loc~mat_name:a_str~dim1:(Mat.dim1a)~dim2:(Mat.dim2a);check_mat_empty~loc~mat_name:b_str~dim1:(Mat.dim1b)~dim2:(Mat.dim2b);letbeta=matchbeta,cwith|None,_->zero|Somebeta,Some_c->beta|Some_beta,None->failwith(sprintf"%s: providing [beta] without [c] not allowed"loc)inletm,n,k,transa,transb,c=gemm_get_paramslocMat.createaracatransabrbcbcrtransbcccmnkincheck_mat_empty~loc~mat_name:c_str~dim1:(Mat.dim1c)~dim2:(Mat.dim2c);direct_gemm~transa~transb~m~n~k~ar~ac~a~br~bc~b~cr~cc~c~alpha~beta;c(* SYMM *)externaldirect_symm:side:char->uplo:char->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->alpha:(float[@unboxed])->beta:(float[@unboxed])->unit="lacaml_Ssymm_stub_bc""lacaml_Ssymm_stub"letsymm?m?n?(side=`L)?(up=true)?(beta=zero)?(cr=1)?(cc=1)?c?(alpha=one)?(ar=1)?(ac=1)a?(br=1)?(bc=1)b=letloc="Lacaml.S.symm"incheck_mat_empty~loc~mat_name:a_str~dim1:(Mat.dim1a)~dim2:(Mat.dim2a);check_mat_empty~loc~mat_name:b_str~dim1:(Mat.dim1b)~dim2:(Mat.dim2b);letm,n,side,uplo,c=symm_get_paramslocMat.createaracabrbcbcrcccmnsideupincheck_mat_empty~loc~mat_name:c_str~dim1:(Mat.dim1c)~dim2:(Mat.dim2c);direct_symm~side~uplo~m~n~ar~ac~a~br~bc~b~cr~cc~c~alpha~beta;c(* TRMM *)externaldirect_trmm:side:char->uplo:char->transa:char->diag:char->m:(int[@untagged])->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->br:(int[@untagged])->bc:(int[@untagged])->b:mat->alpha:(float[@unboxed])->unit="lacaml_Strmm_stub_bc""lacaml_Strmm_stub"lettrmm?m?n?(side=`L)?(up=true)?(transa=`N)?(diag=`N)?(alpha=one)?(ar=1)?(ac=1)a?(br=1)?(bc=1)b=letloc="Lacaml.S.trmm"incheck_mat_empty~loc~mat_name:a_str~dim1:(Mat.dim1a)~dim2:(Mat.dim2a);check_mat_empty~loc~mat_name:b_str~dim1:(Mat.dim1b)~dim2:(Mat.dim2b);letm,n,side,uplo,transa,diag=trXm_get_paramslocaracabrbcbmnsideuptransadiagindirect_trmm~side~uplo~transa~diag~m~n~ar~ac~a~br~bc~b~alpha(* TRSM *)externaldirect_trsm:side:char->uplo:char->transa:char->diag:char->m:(int[@untagged])->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->br:(int[@untagged])->bc:(int[@untagged])->b:mat->alpha:(float[@unboxed])->unit="lacaml_Strsm_stub_bc""lacaml_Strsm_stub"lettrsm?m?n?(side=`L)?(up=true)?(transa=`N)?(diag=`N)?(alpha=one)?(ar=1)?(ac=1)a?(br=1)?(bc=1)b=letloc="Lacaml.S.trsm"incheck_mat_empty~loc~mat_name:a_str~dim1:(Mat.dim1a)~dim2:(Mat.dim2a);check_mat_empty~loc~mat_name:b_str~dim1:(Mat.dim1b)~dim2:(Mat.dim2b);letm,n,side,uplo,transa,diag=trXm_get_paramslocaracabrbcbmnsideuptransadiagindirect_trsm~side~uplo~transa~diag~m~n~ar~ac~a~br~bc~b~alpha(* SYRK *)externaldirect_syrk:uplo:char->trans:char->n:(int[@untagged])->k:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->cr:(int[@untagged])->cc:(int[@untagged])->c:mat->alpha:(float[@unboxed])->beta:(float[@unboxed])->unit="lacaml_Ssyrk_stub_bc""lacaml_Ssyrk_stub"letsyrk?n?k?(up=true)?(beta=zero)?(cr=1)?(cc=1)?c?(trans=`N)?(alpha=one)?(ar=1)?(ac=1)a=letloc="Lacaml.S.syrk"incheck_mat_empty~loc~mat_name:a_str~dim1:(Mat.dim1a)~dim2:(Mat.dim2a);letn,k,uplo,trans,c=syrk_get_paramslocMat.createaracacrcccnkuptransincheck_mat_empty~loc~mat_name:c_str~dim1:(Mat.dim1c)~dim2:(Mat.dim2c);direct_syrk~uplo~trans~n~k~ar~ac~a~cr~cc~c~alpha~beta;c(* SYR2K *)externaldirect_syr2k:uplo:char->trans:char->n:(int[@untagged])->k:(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->alpha:(float[@unboxed])->beta:(float[@unboxed])->unit="lacaml_Ssyr2k_stub_bc""lacaml_Ssyr2k_stub"letsyr2k?n?k?(up=true)?(beta=zero)?(cr=1)?(cc=1)?c?(trans=`N)?(alpha=one)?(ar=1)?(ac=1)a?(br=1)?(bc=1)b=letloc="Lacaml.S.syr2k"incheck_mat_empty~loc~mat_name:a_str~dim1:(Mat.dim1a)~dim2:(Mat.dim2a);check_mat_empty~loc~mat_name:b_str~dim1:(Mat.dim1b)~dim2:(Mat.dim2b);letn,k,uplo,trans,c=syr2k_get_paramslocMat.createaracabrbcbcrcccnkuptransincheck_mat_empty~loc~mat_name:c_str~dim1:(Mat.dim1c)~dim2:(Mat.dim2c);direct_syr2k~uplo~trans~n~k~ar~ac~a~br~bc~b~cr~cc~c~alpha~beta;c(* LAPACK *)(* Auxiliary routines *)(* LACPY *)externaldirect_lacpy:pkind:Mat_patt.kind->pinit:(int[@untagged])->uplo:char->m:(int[@untagged])->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->br:(int[@untagged])->bc:(int[@untagged])->b:mat->unit="lacaml_Slacpy_stub_bc""lacaml_Slacpy_stub"letlacpy?uplo?patt?m?n?(br=1)?(bc=1)?b?(ar=1)?(ac=1)a=letloc="Lacaml.S.lacpy"inletm=get_dim1_matloca_straarm_strminletn=get_dim2_matloca_straacn_strninletb=matchbwith|Someb->check_dim_matlocb_strbrbcbmn;b|None->check_var_lt0~loc~name:br_strbr;check_var_lt0~loc~name:bc_strbc;letmin_bm=m+br-1inletmin_bn=n+bc-1inMat.createmin_bmmin_bninletpkind,pinit,uplo=matchpatt,uplowith|Some_,Some_->failwith(sprintf"%s: only one of [patt] and [uplo] are allowed"loc)|(None|Some`Full),None->Mat_patt.Upper,-1,'A'|Some`Utr,None|None,Some`U->Mat_patt.Upper,-1,'U'|Some`Ltr,None|None,Some`L->Mat_patt.Lower,-1,'L'|Some`Upentpinit,None->Mat_patt.Upper,pinit,'?'|Some`Lpentpinit,None->Mat_patt.Lower,pinit,'?'indirect_lacpy~pkind~pinit~uplo~m~n~ar~ac~a~br~bc~b;b(* LASWP *)externaldirect_laswp:n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->k1:(int[@untagged])->k2:(int[@untagged])->ipiv:int32_vec->incx:(int[@untagged])->unit="lacaml_Slaswp_stub_bc""lacaml_Slaswp_stub"letlaswp?n?(ar=1)?(ac=1)a?(k1=1)?k2?(incx=1)ipiv=letloc="Lacaml.S.laswp"inletn=get_dim2_matloca_straacn_strninletipiv_n=Array1.dimipivincheck_var_withinlock1_strk11ipiv_nstring_of_int;letk2=matchk2with|None->ipiv_n|Somek2v->check_var_withinlock2_strk2v1ipiv_nstring_of_int;k2vincheck_veclocipiv_stripiv(k2*absincx);letub=Int32.of_int(Array2.dim1a)infori=1toipiv_ndoletr=ipiv.{i}incheck_var_withinloc(sprintf"%s(%d)"ipiv_stri)r1lubInt32.to_stringdone;direct_laswp~n~ar~ac~a~k1~k2~ipiv~incx(* LAPMT *)externaldirect_lapmt:forward:bool->m:(int[@untagged])->n:(int[@untagged])->k:int32_vec->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->unit="lacaml_Slapmt_stub_bc""lacaml_Slapmt_stub"letlapmt?(forward=true)?m?n?(ar=1)?(ac=1)ak=letloc="Lacaml.S.lapmt"inletm=get_dim1_matloca_straarm_strminletn=get_dim2_matloca_straacn_strnincheck_vec_is_permlock_strkn;direct_lapmt~forward~m~n~k~ar~ac~a(* LASSQ *)externaldirect_lassq:n:(int[@untagged])->ofsx:(int[@untagged])->incx:(int[@untagged])->x:vec->scale:(float[@unboxed])->sumsq:(float[@unboxed])->float*float="lacaml_Slassq_stub_bc""lacaml_Slassq_stub"letlassq?n?(scale=0.)?(sumsq=1.)?ofsx?incxx=letloc="Lacaml.S.lassq"inletofsx,incx=get_vec_geomlocx_strofsxincxinletn=get_dim_veclocx_strofsxincxxn_strnindirect_lassq~n~ofsx~incx~x~scale~sumsq(* LARNV *)externaldirect_larnv:idist:(int[@untagged])->iseed:int32_vec->n:(int[@untagged])->ofsx:(int[@untagged])->x:vec->unit="lacaml_Slarnv_stub_bc""lacaml_Slarnv_stub"letlarnv?idist?iseed?n?ofsx?x()=letloc="Lacaml.S.larnv"inletidist=matchidistwith|Some`Uniform0->1|Some`Uniform1->2|None|Some`Normal->3inletofsiseed=1inletiseed=matchiseedwith|None->letiseed=create_int32_vec(ofsiseed+3)infori=ofsiseedtoofsiseed+3doiseed.{i}<-1ldone;iseed|Someiseed->ifArray1.dimiseed-ofsiseed<3theninvalid_arg(sprintf"%s: iseed needs at least four available elements"loc);fori=ofsiseedtoofsiseed+3doifiseed.{i}<0l||iseed.{i}>4095ltheninvalid_arg(sprintf"%s: iseed entries must be between 0 and 4095"loc)done;ifInt32.logandiseed.{ofsiseed+3}1l=1ltheniseedelseinvalid_arg(sprintf"%s: last iseed entry must be odd"loc)inletofsx=get_vec_ofslocx_strofsxinletn,x=matchn,xwith|None,None->1,Vec.createofsx|Somen,None->check_var_lt0~loc~name:n_strn;n,Vec.create(ofsx-1+n)|None,Somex->Vec.dimx-ofsx+1,x|Somen,Somex->check_var_lt0~loc~name:n_strn;letmin_dim=ofsx-1+nincheck_veclocx_strxmin_dim;n,xindirect_larnv~idist~iseed~n~ofsx~x;x(* LANGE *)externaldirect_lange:norm:char->m:(int[@untagged])->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->work:rvec->(float[@unboxed])="lacaml_Slange_stub_bc""lacaml_Slange_stub"letlange_min_lworkm=function`I->m|_->0letlange?m?n?(norm=`O)?work?(ar=1)?(ac=1)a=letloc="Lacaml.S.lange"inletm,n=xlange_get_paramslocmnaracainletwork=matchworkwith|Somework->letlwork=Array1.dimworkinletmin_lwork=lange_min_lworkmnorminiflwork<min_lworktheninvalid_arg(sprintf"%s: lwork: valid=[%d..[ got=%d"locmin_lworklwork)elsework|None->letlwork=lange_min_lworkmnorminRVec.createlworkinletnorm=get_norm_charnormindirect_lange~norm~m~n~ar~ac~a~work(* DLAUUM *)externaldirect_lauum:uplo:char->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->unit="lacaml_Slauum_stub_bc""lacaml_Slauum_stub"letlauum?(up=true)?n?(ar=1)?(ac=1)a=letloc="Lacaml.S.lauum"incheck_mat_empty~loc~mat_name:a_str~dim1:(Mat.dim1a)~dim2:(Mat.dim2a);letn=get_n_of_alocaracaninletuplo=get_uplo_charupindirect_lauum~uplo~n~ar~ac~a(* Linear equations (computational routines) *)(* GETRF *)externaldirect_getrf:m:(int[@untagged])->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->ipiv:int32_vec->(int[@untagged])="lacaml_Sgetrf_stub_bc""lacaml_Sgetrf_stub"letgetrf?m?n?ipiv?(ar=1)?(ac=1)a=letloc="Lacaml.S.getrf"inletm,n=geXrf_get_paramslocmnaracainletipiv=getrf_get_ipivlocipivmninletinfo=direct_getrf~m~n~ar~ac~a~ipivinifinfo=0thenipivelseifinfo>0thengetrf_lu_errlocinfoelsegetrf_errlocmnainfo(* GETRS *)externaldirect_getrs:trans:char->n:(int[@untagged])->nrhs:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->br:(int[@untagged])->bc:(int[@untagged])->b:mat->ipiv:int32_vec->(int[@untagged])="lacaml_Sgetrs_stub_bc""lacaml_Sgetrs_stub"letgetrs?n?ipiv?(trans=`N)?(ar=1)?(ac=1)a?nrhs?(br=1)?(bc=1)b=letloc="Lacaml.S.getrs"inlettrans=get_trans_chartransinletn,nrhs=xxtrs_get_paramslocaracanbrbcbnrhsinletipiv=ifipiv=Nonethengetrf~m:n~n~ar~acaelsegetrf_get_ipivlocipivnninletinfo=direct_getrs~trans~n~nrhs~ar~ac~a~br~bc~b~ipivinifinfo<>0thenxxtrs_errlocnnrhsabinfo(* GETRI *)externaldirect_getri:n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->ipiv:int32_vec->work:vec->lwork:(int[@untagged])->(int[@untagged])="lacaml_Sgetri_stub_bc""lacaml_Sgetri_stub"letgetri_min_lworkn=max1nletgetri_get_opt_lworklocnaraca=letwork=Vec.create1inletinfo=direct_getri~n~ar~ac~a~ipiv:empty_int32_vec~work~lwork:~-1inifinfo=0thenint_of_float32work.{1}elsegetri_errlocgetri_min_lworkna1infoletgetri_opt_lwork?n?(ar=1)?(ac=1)a=letloc="Lacaml.S.getri_opt_lwork"inletn=get_n_of_alocaracaningetri_get_opt_lworklocnaracaletgetri?n?ipiv?work?(ar=1)?(ac=1)a=letloc="Lacaml.S.getri"inletn=get_n_of_alocaracaninletwork,lwork=get_worklocVec.creatework(getri_min_lworkn)(getri_get_opt_lworklocnaraca)"lwork"inletipiv=ifipiv=Nonethengetrf~m:n~n~ar~acaelsegetrf_get_ipivlocipivnninletinfo=direct_getri~n~ar~ac~a~ipiv~work~lworkinifinfo<>0thenifinfo>0thenxxtri_singular_errlocinfoelsegetri_errlocgetri_min_lworknalworkinfo(* SYTRF *)externaldirect_sytrf:uplo:char->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->ipiv:int32_vec->work:vec->lwork:(int[@untagged])->(int[@untagged])="lacaml_Ssytrf_stub_bc""lacaml_Ssytrf_stub"letsytrf_get_opt_lworklocuplonaraca=letwork=Vec.create1inletinfo=direct_sytrf~uplo~n~ar~ac~a~ipiv:empty_int32_vec~work~lwork:~-1inifinfo=0thenint_of_float32work.{1}elsesytrf_errlocnainfoletsytrf_opt_lwork?n?(up=true)?(ar=1)?(ac=1)a=letloc="Lacaml.S.sytrf_opt_lwork"inletuplo=get_uplo_charupinletn=get_n_of_alocaracaninsytrf_get_opt_lworklocuplonaracaletsytrf_min_lwork()=1letsytrf?n?(up=true)?ipiv?work?(ar=1)?(ac=1)a=letloc="Lacaml.S.sytrf"inletuplo=get_uplo_charupinletn=get_n_of_alocaracaninletipiv=sytrf_get_ipivlocipivninletwork,lwork=get_worklocVec.creatework(sytrf_min_lwork())(sytrf_get_opt_lworklocuplonaraca)"lwork"inletinfo=direct_sytrf~uplo~n~ar~ac~a~ipiv~work~lworkinifinfo=0thenipivelseifinfo>0thensytrf_fact_errlocinfoelsesytrf_errlocnainfo(* SYTRS *)externaldirect_sytrs:uplo:char->n:(int[@untagged])->nrhs:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->br:(int[@untagged])->bc:(int[@untagged])->b:mat->ipiv:int32_vec->(int[@untagged])="lacaml_Ssytrs_stub_bc""lacaml_Ssytrs_stub"letsytrs?n?(up=true)?ipiv?(ar=1)?(ac=1)a?nrhs?(br=1)?(bc=1)b=letloc="Lacaml.S.sytrs"inletuplo=get_uplo_charupinletn,nrhs=xxtrs_get_paramslocaracanbrbcbnrhsinletipiv=ifipiv=Nonethensytrf~n~up~ar~acaelsesytrf_get_ipivlocipivninletinfo=direct_sytrs~uplo~n~nrhs~ar~ac~a~br~bc~b~ipivinifinfo<>0thenxxtrs_errlocnnrhsabinfo(* SYTRI *)externaldirect_sytri:uplo:char->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->ipiv:int32_vec->work:vec->(int[@untagged])="lacaml_Ssytri_stub_bc""lacaml_Ssytri_stub"letsytri_min_lworkn=nletsytri?n?(up=true)?ipiv?work?(ar=1)?(ac=1)a=letloc="Lacaml.S.sytri"inletuplo=get_uplo_charupinletn=get_n_of_alocaracaninletwork,_lwork=get_worklocVec.creatework(sytri_min_lworkn)(sytri_min_lworkn)"lwork"inletipiv=ifipiv=Nonethensytrf~n~up~ar~acaelsesytrf_get_ipivlocipivninletinfo=direct_sytri~uplo~n~ar~ac~a~ipiv~workinifinfo<>0thenifinfo>0thenxxtri_singular_errlocinfoelsexxtri_errlocnainfo(* POTRF *)externaldirect_potrf:uplo:char->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->(int[@untagged])="lacaml_Spotrf_stub_bc""lacaml_Spotrf_stub"letmaybe_add_jitter~loc?jitter~ar~ac~na=matchjitterwith|None->()|Somejitterwhenjitter<zero->invalid_arg(sprintf"%s: jitter < zero"loc)|Somejitterwhenjitter=zero->()|Somejitter->fori=0ton-1doletari=ar+iinletaci=ac+iina.{ari,aci}<-adda.{ari,aci}jitterdoneletpotrf?n?(up=true)?(ar=1)?(ac=1)?jittera=letloc="Lacaml.S.potrf"inletuplo=get_uplo_charupinletn=get_n_of_alocaracaninmaybe_add_jitter~loc?jitter~ar~ac~na;letinfo=direct_potrf~uplo~n~ar~ac~ainifinfo<>0thenifinfo>0thenpotrf_chol_errlocinfoelsepotrf_errlocnainfo(* POTRS *)externaldirect_potrs:uplo:char->n:(int[@untagged])->nrhs:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->br:(int[@untagged])->bc:(int[@untagged])->b:mat->(int[@untagged])="lacaml_Spotrs_stub_bc""lacaml_Spotrs_stub"letpotrs?n?(up=true)?(ar=1)?(ac=1)a?nrhs?(br=1)?(bc=1)?(factorize=true)?jitterb=letloc="Lacaml.S.potrs"inletuplo=get_uplo_charupinletn,nrhs=xxtrs_get_paramslocaracanbrbcbnrhsiniffactorizethenpotrf~n~up~ar~ac?jittera;letinfo=direct_potrs~uplo~n~nrhs~ar~ac~a~br~bc~binifinfo<>0thenpotrs_errlocnnrhsabinfo(* POTRI *)externaldirect_potri:uplo:char->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->(int[@untagged])="lacaml_Spotri_stub_bc""lacaml_Spotri_stub"letpotri?n?(up=true)?(ar=1)?(ac=1)?(factorize=true)?jittera=letloc="Lacaml.S.potri"inletn=get_n_of_alocaracaninletuplo=get_uplo_charupiniffactorizethenpotrf~n~up~ar~ac?jittera;letinfo=direct_potri~uplo~n~ar~ac~ainifinfo<>0thenifinfo>0thenxxtri_singular_errlocinfoelsexxtri_errlocnainfo(* TRTRS *)externaldirect_trtrs:uplo:char->trans:char->diag:char->n:(int[@untagged])->nrhs:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->br:(int[@untagged])->bc:(int[@untagged])->b:mat->(int[@untagged])="lacaml_Strtrs_stub_bc""lacaml_Strtrs_stub"lettrtrs?n?(up=true)?(trans=`N)?(diag=`N)?(ar=1)?(ac=1)a?nrhs?(br=1)?(bc=1)b=letloc="Lacaml.S.trtrs"inletuplo=get_uplo_charupinlettrans=get_trans_chartransinletdiag=get_diag_chardiaginletn,nrhs=xxtrs_get_paramslocaracanbrbcbnrhsinletinfo=direct_trtrs~uplo~trans~diag~n~nrhs~ar~ac~a~br~bc~binifinfo<>0thentrtrs_errlocnnrhsabinfo(* TRTRI *)externaldirect_trtri:uplo:char->diag:char->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->(int[@untagged])="lacaml_Strtri_stub_bc""lacaml_Strtri_stub"lettrtri?n?(up=true)?(diag=`N)?(ar=1)?(ac=1)a=letloc="Lacaml.S.trtri"inletn=get_n_of_alocaracaninletuplo=get_uplo_charupinletdiag=get_diag_chardiaginletinfo=direct_trtri~uplo~diag~n~ar~ac~ainifinfo<>0thenifinfo>0thenxxtri_singular_errlocinfoelsetrtri_errlocnainfo(* TBTRS *)externaldirect_tbtrs:uplo:char->trans:char->diag:char->n:(int[@untagged])->kd:(int[@untagged])->nrhs:(int[@untagged])->abr:(int[@untagged])->abc:(int[@untagged])->ab:mat->br:(int[@untagged])->bc:(int[@untagged])->b:mat->(int[@untagged])="lacaml_Stbtrs_stub_bc""lacaml_Stbtrs_stub"lettbtrs?n?kd?(up=true)?(trans=`N)?(diag=`N)?(abr=1)?(abc=1)ab?nrhs?(br=1)?(bc=1)b=letloc="Lacaml.S.tbtrs"inletuplo=get_uplo_charupinlettrans=get_trans_chartransinletdiag=get_diag_chardiaginletn=get_dim2_matlocab_strababcn_strninletnrhs=get_nrhs_of_blocnbrbcbnrhsinletkd=get_k_mat_sblocab_strababrkd_strkdinletinfo=direct_tbtrs~uplo~trans~diag~n~kd~nrhs~abr~abc~ab~br~bc~binifinfo<>0thentbtrs_errlocnnrhskdabbinfo(* GEQRF *)externaldirect_geqrf:m:(int[@untagged])->n:(int[@untagged])->ar:(int[@untagged])->ac:(int[@untagged])->a:mat->tau:vec->work:vec->lwork:(int[@untagged])->(int[@untagged])="lacaml_Sgeqrf_stub_bc""lacaml_Sgeqrf_stub"letgeqrf_get_opt_lworklocmnaraca=letwork=Vec.create1inletinfo=direct_geqrf~m~n~ar~ac~a~tau:work~work~lwork:~-1inifinfo=0thenint_of_float32work.{1}elsegeqrf_errlocmnainfoletgeqrf_opt_lwork?m?n?(ar=1)?(ac=1)a=letloc="Lacaml.S.geqrf_opt_lwork"inletm,n=geXrf_get_paramslocmnaracaingeqrf_get_opt_lworklocmnaracaletgeqrf_min_lwork~n=max1nletgeqrf?m?n?work?tau?(ar=1)?(ac=1)a=letloc="Lacaml.S.geqrf"inletm,n=geXrf_get_paramslocmnaracainlettau=letmin_m_n=minmninmatchtauwith|None->Vec.createmin_m_n|Sometau->ifVec.dimtau<min_m_ntheninvalid_arg(sprintf"%s: dim(tau): valid=[1..[ got=%d"locmin_m_n)elsetauinletwork,lwork=get_worklocVec.creatework(geqrf_min_lwork~n)(geqrf_get_opt_lworklocmnaraca)"lwork"inletinfo=direct_geqrf~m~n~ar~ac~a~tau~work~lworkinifinfo=0thentauelsegeqrf_errlocmnainfo(* Linear equations (simple drivers) *)(* GESV *)externaldirect_gesv:ar:(int[@untagged])->ac:(int[@untagged])->a:mat->n:(int[@untagged])->ipiv:int32_vec->nrhs:(int[@untagged])->br:(int[@untagged])->bc:(int[@untagged])->b:mat->(int[@untagged])="lacaml_Sgesv_stub_bc""lacaml_Sgesv_stub"letgesv?n?ipiv?(ar=1)?(ac=1)a?nrhs?(br=1)?(bc=1)b=letloc="Lacaml.S.gesv"inletn,nrhs=xxsv_get_paramslocaracanbrbcbnrhsinletipiv=xxsv_get_ipivlocipivninletinfo=direct_gesv~ar~ac~a~n~ipiv~nrhs~br~bc~binmatchinfowith|0->()|iwheni>0->xxsv_lu_errlocinfo|-4->xxsv_a_errlocan|_->xxsv_errlocnnrhsbinfo(* GBSV *)externaldirect_gbsv:abr:(int[@untagged])->abc:(int[@untagged])->ab:mat->n:(int[@untagged])->kl:(int[@untagged])->ku:(int[@untagged])->ipiv:int32_vec->nrhs:(int[@untagged])->br:(int[@untagged])->bc:(int[@untagged])->b:mat->(int[@untagged])="lacaml_Sgbsv_stub_bc""lacaml_Sgbsv_stub"letgbsv?n?ipiv?(abr=1)?(abc=1)abklku?nrhs?(br=1)?(bc=1)b=letloc="Lacaml.S.gbsv"inletn=get_dim2_matlocab_strababcn_strninletmin_dim1=2*kl+ku+1in(* kl >= 0, ku >= 0: tested by the FORTRAN routine. *)check_dim1_matlocab_strababr"2*kl + ku + 1 for "min_dim1;letnrhs=get_nrhs_of_blocnbrbcbnrhsinletipiv=xxsv_get_ipivlocipivninletinfo=direct_gbsv~abr~abc~ab~n~kl~ku~ipiv~nrhs~br~bc~binmatchinfowith|0->()|iwheni>0->xxsv_lu_errlocinfo|-1->xxsv_errlocnnrhsbinfo|-2->invalid_arg(sprintf"%s: kl: valid=[0..[ got=%d"lockl)|-3->invalid_arg(sprintf"%s: ku: valid=[0..[ got=%d"locku)|-6->letmsg=sprintf"%s: dim1(ab): valid=[%d..[ got=%d"locmin_dim1(Mat.dim1ab)ininvalid_argmsg|_->xxsv_errlocnnrhsb(info+2)(* GTSV *)externaldirect_gtsv:ofsdl:(int[@untagged])->dl:vec->ofsd:(int[@untagged])->d:vec->ofsdu:(int[@untagged])->du:vec->n:(int[@untagged])->nrhs:(int[@untagged])->br:(int[@untagged])->bc:(int[@untagged])->b:mat->(int[@untagged])="lacaml_Sgtsv_stub_bc""lacaml_Sgtsv_stub"letgtsv?n?ofsdldl?ofsdd?ofsdudu?nrhs?(br=1)?(bc=1)b=letloc="Lacaml.S.gtsv"inletofsdl=get_vec_ofslocdl_strofsdlinletofsd=get_vec_ofslocd_strofsdinletofsdu=get_vec_ofslocdu_strofsduinletn=get_dim_veclocd_strofsd1dn_strninletnrhs=get_nrhs_of_blocnbrbcbnrhsincheck_veclocdl_strdl(ofsdl+n-2);check_veclocdu_strdu(ofsdu+n-2);letinfo=direct_gtsv~ofsdl~dl~ofsd~d~ofsdu~du~n~nrhs~br~bc~binifinfo<>0then(ifinfo>0thenxxsv_lu_errlocinfoelsexxsv_errlocnnrhsbinfo)(* POSV *)externaldirect_posv:ar:(int[@untagged])->ac:(int[@untagged])->a:mat->n:(int[@untagged])->uplo:char->nrhs:(int[@untagged])->br:(int[@untagged])->bc:(int[@untagged])->b:mat->(int[@untagged])="lacaml_Sposv_stub_bc""lacaml_Sposv_stub"letposv?n?(up=true)?(ar=1)?(ac=1)a?nrhs?(br=1)?(bc=1)b=letloc="Lacaml.S.posv"inletn,nrhs=xxsv_get_paramslocaracanbrbcbnrhsinletinfo=direct_posv~ar~ac~a~n~uplo:(get_uplo_charup)~nrhs~br~bc~binmatchinfowith|0->()|iwheni>0->xxsv_pos_errlocinfo|-5->xxsv_a_errlocan|_->xxsv_errlocnnrhsb(info+1)(* PPSV *)externaldirect_ppsv:ofsap:(int[@untagged])->ap:vec->n:(int[@untagged])->uplo:char->nrhs:(int[@untagged])->br:(int[@untagged])->bc:(int[@untagged])->b:mat->(int[@untagged])="lacaml_Sppsv_stub_bc""lacaml_Sppsv_stub"letppsv?n?(up=true)?ofsapap?nrhs?(br=1)?(bc=1)b=letloc="Lacaml.S.ppsv"inletofsap=get_vec_ofslocap_strofsapinletn=get_dim_mat_packedlocap_strofsapapn_strninletnrhs=get_nrhs_of_blocnbrbcbnrhsinletinfo=direct_ppsv~ofsap~ap~n~uplo:(get_uplo_charup)~nrhs~br~bc~binifinfo<>0thenifinfo>0thenxxsv_pos_errlocinfoelsexxsv_errlocnnrhsb(info-1)(* only: LDB *)(* PBSV *)externaldirect_pbsv:abr:(int[@untagged])->abc:(int[@untagged])->ab:mat->n:(int[@untagged])->kd:(int[@untagged])->uplo:char->nrhs:(int[@untagged])->br:(int[@untagged])->bc:(int[@untagged])->b:mat->(int[@untagged])="lacaml_Spbsv_stub_bc""lacaml_Spbsv_stub"letpbsv?n?(up=true)?kd?(abr=1)?(abc=1)ab?nrhs?(br=1)?(bc=1)b=letloc="Lacaml.S.pbsv"in(* [a] is a band matrix of size [k+1]*[n]. *)letn=get_dim2_matlocab_strababcn_strninletkd=get_k_mat_sblocab_strababrkd_strkdinletnrhs=get_nrhs_of_blocnbrbcbnrhsinletinfo=direct_pbsv~abr~abc~ab~n~kd~uplo:(get_uplo_charup)~nrhs~br~bc~binmatchinfowith|0->()|iwheni>0->xxsv_pos_errlocinfo|-2->xxsv_errlocnnrhsbinfo|-3->invalid_arg(sprintf"%s: kd: valid=[0..[ got=%d"lockd)|-6->letmsg=sprintf"%s: dim1(ab): valid=[%d..[ got=%d"loc(kd+1)(Mat.dim1ab)ininvalid_argmsg|_->xxsv_errlocnnrhsb(info+2)(* PTSV *)externaldirect_ptsv:ofsd:(int[@untagged])->d:vec->ofse:(int[@untagged])->e:vec->n:(int[@untagged])->nrhs:(int[@untagged])->br:(int[@untagged])->bc:(int[@untagged])->b:mat->(int[@untagged])="lacaml_Sptsv_stub_bc""lacaml_Sptsv_stub"letptsv?n?ofsdd?ofsee?nrhs?(br=1)?(bc=1)b=letloc="Lacaml.S.ptsv"inletofsd=get_vec_ofslocd_strofsdinletofse=get_vec_ofsloce_strofseinletn=get_dim_veclocd_strofsd1dn_strninletnrhs=get_nrhs_of_blocnbrbcbnrhsincheck_vecloce_stre(ofse+n-2);letinfo=direct_ptsv~ofsd~d~ofse~e~n~nrhs~br~bc~binifinfo<>0thenifinfo>0thenxxsv_pos_errlocinfoelsexxsv_errlocnnrhsb(info-1)(* SYSV *)externaldirect_sysv:ar:(int[@untagged])->ac:(int[@untagged])->a:mat->n:(int[@untagged])->uplo:char->ipiv:int32_vec->work:vec->lwork:(int[@untagged])->nrhs:(int[@untagged])->br:(int[@untagged])->bc:(int[@untagged])->b:mat->(int[@untagged])="lacaml_Ssysv_stub_bc""lacaml_Ssysv_stub"letsysv_get_opt_lworklocaracanuplonrhsbrbcb=letwork=Vec.create1inletinfo=direct_sysv~ar~ac~a~n~uplo~ipiv:empty_int32_vec~work~lwork:~-1~nrhs~br~bc~binifinfo=0thenint_of_float32work.{1}elsexxsv_errlocnnrhsb(info+1)letsysv_opt_lwork?n?(up=true)?(ar=1)?(ac=1)a?nrhs?(br=1)?(bc=1)b=letloc="Lacaml.S.sysv_opt_lwork"inletn,nrhs=xxsv_get_paramslocaracanbrbcbnrhsinletuplo=get_uplo_charupinsysv_get_opt_lworklocaracanuplonrhsbrbcbletsysv?n?(up=true)?ipiv?work?(ar=1)?(ac=1)a?nrhs?(br=1)?(bc=1)b=letloc="Lacaml.S.sysv"inletn,nrhs=xxsv_get_paramslocaracanbrbcbnrhsinletuplo=get_uplo_charupinletipiv=xxsv_get_ipivlocipivninletwork,lwork=matchworkwith|Somework->work,Array1.dimwork|None->letlwork=sysv_get_opt_lworklocaracanuplonrhsbrbcbinVec.createlwork,lworkinletinfo=direct_sysv~ar~ac~a~n~uplo~ipiv~work~lwork~nrhs~br~bc~binmatchinfowith|0->()|iwheni>0->xxsv_ind_errlocinfo|-10->xxsv_work_errloclwork|_->xxsv_errlocnnrhsb(info+1)(* SPSV *)externaldirect_spsv:ofsap:(int[@untagged])->ap:vec->n:(int[@untagged])->uplo:char->ipiv:int32_vec->nrhs:(int[@untagged])->br:(int[@untagged])->bc:(int[@untagged])->b:mat->(int[@untagged])="lacaml_Sspsv_stub_bc""lacaml_Sspsv_stub"letspsv?n?(up=true)?ipiv?ofsapap?nrhs?(br=1)?(bc=1)b=letloc="Lacaml.S.spsv"inletofsap=get_vec_ofslocap_strofsapinletn=get_dim_mat_packedlocap_strofsapapn_strninletnrhs=get_nrhs_of_blocnbrbcbnrhsinletipiv=xxsv_get_ipivlocipivninletinfo=direct_spsv~ofsap~ap~n~uplo:(get_uplo_charup)~ipiv~nrhs~br~bc~binifinfo<>0thenifinfo>0thenxxsv_ind_errlocinfoelsexxsv_errlocnnrhsb(info-1)(* only possibility: LDB *)(* Linear Equations (expert drivers) *)(* TODO: GESVX *)(* TODO: GBSVX *)(* TODO: GTSVX *)(* TODO: POSVX *)(* TODO: PPSVX *)(* TODO: PBSVX *)(* TODO: PTSVX *)(* TODO: SYSVX *)(* TODO: SPSVX *)(* Least squares (simple drivers) *)(* GELS *)externaldirect_gels:ar:(int[@untagged])->ac:(int[@untagged])->a:mat->m:(int[@untagged])->n:(int[@untagged])->trans:char->work:vec->lwork:(int[@untagged])->nrhs:(int[@untagged])->br:(int[@untagged])->bc:(int[@untagged])->b:mat->(int[@untagged])="lacaml_Sgels_stub_bc""lacaml_Sgels_stub"letgels_min_lwork~m~n~nrhs=letmin_dim=minmninmax1(min_dim+maxmin_dimnrhs)letgels_errlocaramnlworknrhsbrberr=letgelsX_err_code=iferr=-10then-12elseerr+1ingelsX_errlocgels_min_lworkaramnlworknrhsbrbgelsX_err_codeletgels_get_opt_lworklocaracamntransnrhsbrbcb=letwork=Vec.create1inletinfo=direct_gels~ar~ac~a~m~n~trans~work~lwork:~-1~nrhs~br~bc~binifinfo=0thenint_of_float32work.{1}elsegels_errlocaramn1nrhsbrbinfoletgels_opt_lwork?m?n?(trans=`N)?(ar=1)?(ac=1)a?nrhs?(br=1)?(bc=1)b=letloc="Lacaml.S.gels_opt_lwork"inletm,n,nrhs=gelsX_get_paramslocaracamnnrhsbrbcbingels_get_opt_lworklocaracamn(get_trans_chartrans)nrhsbrbcbletgels?m?n?work?(trans=`N)?(ar=1)?(ac=1)a?nrhs?(br=1)?(bc=1)b=letloc="Lacaml.S.gels"inletm,n,nrhs=gelsX_get_paramslocaracamnnrhsbrbcbinlettrans=get_trans_chartransinletwork,lwork=matchworkwith|Somework->work,Array1.dimwork|None->letlwork=gels_get_opt_lworklocaracamntransnrhsbrbcbinVec.createlwork,lworkinletinfo=direct_gels~ar~ac~a~m~n~trans~work~lwork~nrhs~br~bc~binifinfo<>0thengels_errlocaramnlworknrhsbrbinfo