12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845# 1 "src/owl/lapacke/owl_lapacke.ml"(*
* OWL - OCaml Scientific and Engineering Computing
* Copyright (c) 2016-2019 Liang Wang <liang.wang@cl.cam.ac.uk>
*)(** LAPACKE interface: high-level interface between Owl and LAPACKE *)(** Please refer to the documentation of Intel Math Kernel Library on the
LAPACKE Interface. The interface implemented here is compatible the those
documented on their website.
url: https://software.intel.com/en-us/mkl-developer-reference-c
*)openCtypesopenBigarraymoduleL=Owl_lapacke_generatedtype('a,'b)t=('a,'b,c_layout)Genarray.ttypelapacke_layout=RowMajor|ColMajorletlapacke_layout:typea.alayout->int=function|C_layout->101|Fortran_layout->102typelapacke_transpose=NoTrans|Trans|ConjTransletlapacke_transpose=functionNoTrans->'N'|Trans->'T'|ConjTrans->'C'typelapacke_uplo=Upper|Lowerlet_lapacke_uplo=functionUpper->121|Lower->122typelapacke_diag=NonUnit|Unitlet_lapacke_diag=functionNonUnit->131|Unit->132typelapacke_side=Left|Rightlet_lapacke_side=functionLeft->141|Right->142letcheck_lapack_errorret=ifret=0then()elseifret<0thenraise(Invalid_argument(string_of_intret))elsefailwith(Printf.sprintf"LAPACKE: %i"ret)(* calculate the leading dimension of a ~matrix *)let_stride:typeabc.(a,b,c)Genarray.t->int=funx->match(Genarray.layoutx)with|C_layout->(Genarray.dimsx).(1)|Fortran_layout->(Genarray.dimsx).(0)let_row_numx=(Genarray.dimsx).(0)let_col_numx=(Genarray.dimsx).(1)let_gbtrf:typeab.kl:int->ku:int->m:int->ab:(a,b)t->(a,b)t*(int32,int32_elt)t=fun~kl~ku~m~ab->letn=Owl_dense_matrix_generic.col_numabinletminmn=Stdlib.minmninlet_kind=Genarray.kindabinlet_layout=Genarray.layoutabinletlayout=lapacke_layout_layoutinassert(kl>=0&&ku>=0&&m>=0&&n>=0);letipiv=Genarray.createint32_layout[|minmn|]inlet_ipiv=bigarray_startCtypes_static.Genarrayipivinlet_ab=bigarray_startCtypes_static.Genarrayabinletldab=_strideabinletret=match_kindwith|Float32->L.sgbtrf~layout~m~n~kl~ku~ab:_ab~ldab~ipiv:_ipiv|Float64->L.dgbtrf~layout~m~n~kl~ku~ab:_ab~ldab~ipiv:_ipiv|Complex32->L.cgbtrf~layout~m~n~kl~ku~ab:_ab~ldab~ipiv:_ipiv|Complex64->L.zgbtrf~layout~m~n~kl~ku~ab:_ab~ldab~ipiv:_ipiv|_->failwith"lapacke:gbtrf"incheck_lapack_errorret;ab,ipivletgbtrs:typeab.trans:lapacke_transpose->kl:int->ku:int->n:int->ab:(a,b)t->ipiv:(int32,int32_elt)t->b:(a,b)t->unit=fun~trans~kl~ku~n~ab~ipiv~b->letm=Owl_dense_matrix_generic.col_numabinassert(n=m&&n=Owl_dense_matrix_generic.row_numb);letnrhs=Owl_dense_matrix_generic.col_numbinlet_kind=Genarray.kindabinlet_layout=Genarray.layoutabinletlayout=lapacke_layout_layoutinlettrans=lapacke_transposetransinlet_ipiv=bigarray_startCtypes_static.Genarrayipivinlet_ab=bigarray_startCtypes_static.Genarrayabinlet_b=bigarray_startCtypes_static.Genarraybinletldab=_strideabinletldb=_stridebinletret=match_kindwith|Float32->L.sgbtrs~layout~trans~n~kl~ku~nrhs~ab:_ab~ldab~ipiv:_ipiv~b:_b~ldb|Float64->L.dgbtrs~layout~trans~n~kl~ku~nrhs~ab:_ab~ldab~ipiv:_ipiv~b:_b~ldb|Complex32->L.cgbtrs~layout~trans~n~kl~ku~nrhs~ab:_ab~ldab~ipiv:_ipiv~b:_b~ldb|Complex64->L.zgbtrs~layout~trans~n~kl~ku~nrhs~ab:_ab~ldab~ipiv:_ipiv~b:_b~ldb|_->failwith"lapacke:gbtrs"incheck_lapack_errorretletgebal:typeab.?job:char->a:(a,b)t->int*int*(a,b)t=fun?(job='B')~a->assert(job='N'||job='P'||job='S'||job='B');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinlet_ilo=Ctypes.(allocateint32_t0l)inlet_ihi=Ctypes.(allocateint32_t0l)inlet_a=bigarray_startCtypes_static.Genarrayainletlda=_strideainletscale=ref(Genarray.create_kind_layout[|0;0|])inletret=match_kindwith|Float32->(letscale'=Genarray.createfloat32_layout[|1;n|]inlet_scale=bigarray_startCtypes_static.Genarrayscale'inletr=L.sgebal~layout~job~n~a:_a~lda~ilo:_ilo~ihi:_ihi~scale:_scaleinscale:=scale';r)|Float64->(letscale'=Genarray.createfloat64_layout[|1;n|]inlet_scale=bigarray_startCtypes_static.Genarrayscale'inletr=L.dgebal~layout~job~n~a:_a~lda~ilo:_ilo~ihi:_ihi~scale:_scaleinscale:=scale';r)|Complex32->(letscale'=Genarray.createfloat32_layout[|1;n|]inlet_scale=bigarray_startCtypes_static.Genarrayscale'inletr=L.cgebal~layout~job~n~a:_a~lda~ilo:_ilo~ihi:_ihi~scale:_scaleinscale:=Owl_dense_matrix_generic.cast_s2cscale';r)|Complex64->(letscale'=Genarray.createfloat64_layout[|1;n|]inlet_scale=bigarray_startCtypes_static.Genarrayscale'inletr=L.zgebal~layout~job~n~a:_a~lda~ilo:_ilo~ihi:_ihi~scale:_scaleinscale:=Owl_dense_matrix_generic.cast_d2zscale';r)|_->failwith"lapacke:gebal"incheck_lapack_errorret;letilo=Int32.to_int!@_iloinletihi=Int32.to_int!@_ihiinilo,ihi,!scale(* TODO: need a solution for scale parameter *)letgebak:typeab.job:char->side:char->ilo:int->ihi:int->scale:(floatptr)->v:(a,b)t->unit=fun~job~side~ilo~ihi~scale~v->assert(side='L'||side='R');assert(job='N'||job='P'||job='S'||job='B');letm=Owl_dense_matrix_generic.row_numvinletn=Owl_dense_matrix_generic.col_numvinassert(m=n);let_kind=Genarray.kindvinlet_layout=Genarray.layoutvinletlayout=lapacke_layout_layoutinlet_v=bigarray_startCtypes_static.Genarrayvinletldv=_stridevinletret=match_kindwith|Float32->L.sgebak~layout~job~side~n~ilo~ihi~scale~m~v:_v~ldv|Float64->L.dgebak~layout~job~side~n~ilo~ihi~scale~m~v:_v~ldv|Complex32->L.cgebak~layout~job~side~n~ilo~ihi~scale~m~v:_v~ldv|Complex64->L.zgebak~layout~job~side~n~ilo~ihi~scale~m~v:_v~ldv|_->failwith"lapacke:gebak"incheck_lapack_errorretletgebrd:typeab.a:(a,b)t->(a,b)t*(a,b)t*(a,b)t*(a,b)t*(a,b)t=fun~a->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletk=Stdlib.minmninlet_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletd=ref(Genarray.create_kind_layout[|0;k|])inlete=ref(Genarray.create_kind_layout[|0;k|])inlettauq=Genarray.create_kind_layout[|1;k|]inlettaup=Genarray.create_kind_layout[|1;k|]inlet_a=bigarray_startCtypes_static.Genarrayainlet_tauq=bigarray_startCtypes_static.Genarraytauqinlet_taup=bigarray_startCtypes_static.Genarraytaupinletlda=_strideainletret=match_kindwith|Float32->(letd'=Genarray.createfloat32_layout[|1;k|]inlet_d=bigarray_startCtypes_static.Genarrayd'inlete'=Genarray.createfloat32_layout[|1;k|]inlet_e=bigarray_startCtypes_static.Genarraye'inletr=L.sgebrd~layout~m~n~a:_a~lda~d:_d~e:_e~tauq:_tauq~taup:_taupind:=d';e:=e';r)|Float64->(letd'=Genarray.createfloat64_layout[|1;k|]inlet_d=bigarray_startCtypes_static.Genarrayd'inlete'=Genarray.createfloat64_layout[|1;k|]inlet_e=bigarray_startCtypes_static.Genarraye'inletr=L.dgebrd~layout~m~n~a:_a~lda~d:_d~e:_e~tauq:_tauq~taup:_taupind:=d';e:=e';r)|Complex32->(letd'=Genarray.createfloat32_layout[|1;k|]inlet_d=bigarray_startCtypes_static.Genarrayd'inlete'=Genarray.createfloat32_layout[|1;k|]inlet_e=bigarray_startCtypes_static.Genarraye'inletr=L.cgebrd~layout~m~n~a:_a~lda~d:_d~e:_e~tauq:_tauq~taup:_taupind:=Owl_dense_matrix_generic.cast_s2cd';e:=Owl_dense_matrix_generic.cast_s2ce';r)|Complex64->(letd'=Genarray.createfloat64_layout[|1;k|]inlet_d=bigarray_startCtypes_static.Genarrayd'inlete'=Genarray.createfloat64_layout[|1;k|]inlet_e=bigarray_startCtypes_static.Genarraye'inletr=L.zgebrd~layout~m~n~a:_a~lda~d:_d~e:_e~tauq:_tauq~taup:_taupind:=Owl_dense_matrix_generic.cast_d2zd';e:=Owl_dense_matrix_generic.cast_d2ze';r)|_->failwith"lapacke:gebrd"incheck_lapack_errorret;a,!d,!e,tauq,taupletgelqf:typeab.a:(a,b)t->(a,b)t*(a,b)t=fun~a->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletk=Stdlib.minmninlet_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinlettau=Genarray.create_kind_layout[|1;k|]inlet_tau=bigarray_startCtypes_static.Genarraytauinlet_a=bigarray_startCtypes_static.Genarrayainletlda=_strideainletret=match_kindwith|Float32->L.sgelqf~layout~m~n~a:_a~lda~tau:_tau|Float64->L.dgelqf~layout~m~n~a:_a~lda~tau:_tau|Complex32->L.cgelqf~layout~m~n~a:_a~lda~tau:_tau|Complex64->L.zgelqf~layout~m~n~a:_a~lda~tau:_tau|_->failwith"lapacke:gelqf"incheck_lapack_errorret;a,tauletgeqlf:typeab.a:(a,b)t->(a,b)t*(a,b)t=fun~a->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletk=Stdlib.minmninlet_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinlettau=Genarray.create_kind_layout[|1;k|]inlet_tau=bigarray_startCtypes_static.Genarraytauinlet_a=bigarray_startCtypes_static.Genarrayainletlda=_strideainletret=match_kindwith|Float32->L.sgeqlf~layout~m~n~a:_a~lda~tau:_tau|Float64->L.dgeqlf~layout~m~n~a:_a~lda~tau:_tau|Complex32->L.cgeqlf~layout~m~n~a:_a~lda~tau:_tau|Complex64->L.zgeqlf~layout~m~n~a:_a~lda~tau:_tau|_->failwith"lapacke:geqlf"incheck_lapack_errorret;a,tauletgeqrf:typeab.a:(a,b)t->(a,b)t*(a,b)t=fun~a->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletk=Stdlib.minmninlet_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinlettau=Genarray.create_kind_layout[|1;k|]inlet_tau=bigarray_startCtypes_static.Genarraytauinlet_a=bigarray_startCtypes_static.Genarrayainletlda=_strideainletret=match_kindwith|Float32->L.sgeqrf~layout~m~n~a:_a~lda~tau:_tau|Float64->L.dgeqrf~layout~m~n~a:_a~lda~tau:_tau|Complex32->L.cgeqrf~layout~m~n~a:_a~lda~tau:_tau|Complex64->L.zgeqrf~layout~m~n~a:_a~lda~tau:_tau|_->failwith"lapacke:geqrf"incheck_lapack_errorret;a,tauletgerqf:typeab.a:(a,b)t->(a,b)t*(a,b)t=fun~a->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletk=Stdlib.minmninlet_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinlettau=Genarray.create_kind_layout[|1;k|]inlet_tau=bigarray_startCtypes_static.Genarraytauinlet_a=bigarray_startCtypes_static.Genarrayainletlda=_strideainletret=match_kindwith|Float32->L.sgerqf~layout~m~n~a:_a~lda~tau:_tau|Float64->L.dgerqf~layout~m~n~a:_a~lda~tau:_tau|Complex32->L.cgerqf~layout~m~n~a:_a~lda~tau:_tau|Complex64->L.zgerqf~layout~m~n~a:_a~lda~tau:_tau|_->failwith"lapacke:gerqf"incheck_lapack_errorret;a,tauletgeqp3:typeab.?jpvt:(int32,int32_elt)t->a:(a,b)t->(a,b)t*(a,b)t*(int32,int32_elt)t=fun?jpvt~a->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletk=Stdlib.minmninlet_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletjpvt=matchjpvtwith|Somejpvt->jpvt|None->(letjpvt=Genarray.createint32_layout[|1;n|]inGenarray.filljpvt0l;jpvt)inassert(n=Owl_dense_matrix_generic.col_numjpvt);lettau=Genarray.create_kind_layout[|1;k|]inlet_tau=bigarray_startCtypes_static.Genarraytauinlet_jpvt=bigarray_startCtypes_static.Genarrayjpvtinlet_a=bigarray_startCtypes_static.Genarrayainletlda=_strideainletret=match_kindwith|Float32->L.sgeqp3~layout~m~n~a:_a~lda~jpvt:_jpvt~tau:_tau|Float64->L.dgeqp3~layout~m~n~a:_a~lda~jpvt:_jpvt~tau:_tau|Complex32->L.cgeqp3~layout~m~n~a:_a~lda~jpvt:_jpvt~tau:_tau|Complex64->L.zgeqp3~layout~m~n~a:_a~lda~jpvt:_jpvt~tau:_tau|_->failwith"lapacke:geqp3"incheck_lapack_errorret;a,tau,jpvtletgeqrt:typeab.nb:int->a:(a,b)t->(a,b)t*(a,b)t=fun~nb~a->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletminmn=Stdlib.minmninassert(nb<=minmn);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinlet_a=bigarray_startCtypes_static.Genarrayain(* FIXME: there ~might be something wrong with the lapacke interface. The
behaviour of this function is not consistent with what has been documented
on Intel's MKL website. I.e., if we allocate [nb x minmn] space for t, it
is likely there will be ~memory fault. The lapacke code turns out to use
[minmn x minmn] space actually.
*)lett=Genarray.create_kind_layout[|minmn;minmn|]inlet_t=bigarray_startCtypes_static.Genarraytinletlda=Stdlib.max1(_stridea)inletldt=Stdlib.max1(_stridet)inletret=match_kindwith|Float32->L.sgeqrt~layout~m~n~nb~a:_a~lda~t:_t~ldt|Float64->(Genarray.fillt0.7;L.dgeqrt~layout~m~n~nb~a:_a~lda~t:_t~ldt)|Complex32->L.cgeqrt~layout~m~n~nb~a:_a~lda~t:_t~ldt|Complex64->L.zgeqrt~layout~m~n~nb~a:_a~lda~t:_t~ldt|_->failwith"lapacke:geqrt"incheck_lapack_errorret;(* resize to the shape of [t] to that is supposed to be *)lett=Owl_dense_matrix_generic.resizet[|nb;minmn|]ina,tletgeqrt3:typeab.a:(a,b)t->(a,b)t*(a,b)t=fun~a->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m>=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinlet_a=bigarray_startCtypes_static.Genarrayainlett=Genarray.create_kind_layout[|n;n|]inlet_t=bigarray_startCtypes_static.Genarraytinletlda=Stdlib.max1(_stridea)inletldt=Stdlib.max1(_stridet)inletret=match_kindwith|Float32->L.sgeqrt3~layout~m~n~a:_a~lda~t:_t~ldt|Float64->L.dgeqrt3~layout~m~n~a:_a~lda~t:_t~ldt|Complex32->L.cgeqrt3~layout~m~n~a:_a~lda~t:_t~ldt|Complex64->L.zgeqrt3~layout~m~n~a:_a~lda~t:_t~ldt|_->failwith"lapacke:geqrt3"incheck_lapack_errorret;a,tletgetrf:typeab.a:(a,b)t->(a,b)t*(int32,int32_elt)t=fun~a->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletminmn=Stdlib.minmninlet_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletipiv=Genarray.createint32_layout[|1;minmn|]inlet_ipiv=bigarray_startCtypes_static.Genarrayipivinlet_a=bigarray_startCtypes_static.Genarrayainletlda=Stdlib.max1(_stridea)inletret=match_kindwith|Float32->L.sgetrf~layout~m~n~a:_a~lda~ipiv:_ipiv|Float64->L.dgetrf~layout~m~n~a:_a~lda~ipiv:_ipiv|Complex32->L.cgetrf~layout~m~n~a:_a~lda~ipiv:_ipiv|Complex64->L.zgetrf~layout~m~n~a:_a~lda~ipiv:_ipiv|_->failwith"lapacke:getrf"incheck_lapack_errorret;a,ipivlettzrzf:typeab.a:(a,b)t->(a,b)t*(a,b)t=fun~a->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m<=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinlettau=Genarray.create_kind_layout[|1;m|]inlet_tau=bigarray_startCtypes_static.Genarraytauinlet_a=bigarray_startCtypes_static.Genarrayainletlda=Stdlib.max1(_stridea)inletret=match_kindwith|Float32->L.stzrzf~layout~m~n~a:_a~lda~tau:_tau|Float64->L.dtzrzf~layout~m~n~a:_a~lda~tau:_tau|Complex32->L.ctzrzf~layout~m~n~a:_a~lda~tau:_tau|Complex64->L.ztzrzf~layout~m~n~a:_a~lda~tau:_tau|_->failwith"lapacke:tzrzf"incheck_lapack_errorret;a,tauletormrz:typea.side:char->trans:char->a:(float,a)t->tau:(float,a)t->c:(float,a)t->(float,a)t=fun~side~trans~a~tau~c->assert(side='L'||side='R');assert(trans='N'||trans='T');letm=Owl_dense_matrix_generic.row_numcinletn=Owl_dense_matrix_generic.col_numcinletk=Owl_dense_matrix_generic.((row_numtau)*(col_numtau))inletl=Owl_dense_matrix_generic.((col_numa)-(row_numa))inlet_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinlet_a=bigarray_startCtypes_static.Genarrayainlet_c=bigarray_startCtypes_static.Genarraycinlet_tau=bigarray_startCtypes_static.Genarraytauinletlda=Stdlib.max1(_stridea)inletldc=Stdlib.max1(_stridec)inletret=match_kindwith|Float32->L.sormrz~layout~side~trans~m~n~k~l~a:_a~lda~tau:_tau~c:_c~ldc|Float64->L.dormrz~layout~side~trans~m~n~k~l~a:_a~lda~tau:_tau~c:_c~ldcincheck_lapack_errorret;cletgels:typeab.trans:char->a:(a,b)t->b:(a,b)t->(a,b)t*(a,b)t*(a,b)t=fun~trans~a~b->assert(trans='N'||trans='T'||trans='C');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletmb=Owl_dense_matrix_generic.row_numbinletnb=Owl_dense_matrix_generic.col_numbinlet_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutiniftrans='N'thenassert(mb=m)elseassert(mb=n);letl=Stdlib.maxmninletb=matchmb<lwith|true->Owl_dense_matrix_generic.resizeb[|l;nb|]|false->binletnrhs=nbinlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinletlda=Stdlib.max1(_stridea)inletldb=Stdlib.max1(_strideb)inletret=match_kindwith|Float32->L.sgels~layout~trans~m~n~nrhs~a:_a~lda~b:_b~ldb|Float64->L.dgels~layout~trans~m~n~nrhs~a:_a~lda~b:_b~ldb|Complex32->L.cgels~layout~trans~m~n~nrhs~a:_a~lda~b:_b~ldb|Complex64->L.zgels~layout~trans~m~n~nrhs~a:_a~lda~b:_b~ldb|_->failwith"lapacke:gels"incheck_lapack_errorret;letk=Stdlib.minmninleta'=Owl_dense_matrix_generic.get_slice[[0;k-1];[0;k-1]]ainletf=matchm<nwith|true->Owl_dense_matrix_generic.trila'|false->Owl_dense_matrix_generic.triua'inletsol=matchtrans='N'with|true->Owl_dense_matrix_generic.resizeb[|n;nb|]|false->Owl_dense_matrix_generic.resizeb[|m;nb|]inletssr=matchtrans='N'with|true->ifmb>nthenOwl_dense_matrix_generic.resize~head:falseb[|mb-n;nb|]elseGenarray.create_kind_layout[|0;0|]|false->ifmb>mthenOwl_dense_matrix_generic.resize~head:falseb[|mb-m;nb|]elseGenarray.create_kind_layout[|0;0|]inf,sol,ssrletgesv:typeab.a:(a,b)t->b:(a,b)t->(a,b)t*(a,b)t*(int32,int32_elt)t=fun~a~b->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletmb=Owl_dense_matrix_generic.row_numbinletnb=Owl_dense_matrix_generic.col_numbinassert(m=n&&mb=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletnrhs=nbinlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinletlda=Stdlib.max1(_stridea)inletldb=Stdlib.max1(_strideb)inletipiv=Genarray.createint32_layout[|1;n|]inlet_ipiv=bigarray_startCtypes_static.Genarrayipivinletret=match_kindwith|Float32->L.sgesv~layout~n~nrhs~a:_a~lda~ipiv:_ipiv~b:_b~ldb|Float64->L.dgesv~layout~n~nrhs~a:_a~lda~ipiv:_ipiv~b:_b~ldb|Complex32->L.cgesv~layout~n~nrhs~a:_a~lda~ipiv:_ipiv~b:_b~ldb|Complex64->L.zgesv~layout~n~nrhs~a:_a~lda~ipiv:_ipiv~b:_b~ldb|_->failwith"lapacke:gesv"incheck_lapack_errorret;a,b,ipivletgetrs:typeab.trans:char->a:(a,b)t->ipiv:(int32,int32_elt)t->b:(a,b)t->(a,b)t=fun~trans~a~ipiv~b->assert(trans='N'||trans='T'||trans='C');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletmb=Owl_dense_matrix_generic.row_numbinletnb=Owl_dense_matrix_generic.col_numbinassert(m=n&&mb=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletnrhs=nbinlet_ipiv=bigarray_startCtypes_static.Genarrayipivinlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinletlda=Stdlib.max1(_stridea)inletldb=Stdlib.max1(_strideb)inletret=match_kindwith|Float32->L.sgetrs~layout~trans~n~nrhs~a:_a~lda~ipiv:_ipiv~b:_b~ldb|Float64->L.dgetrs~layout~trans~n~nrhs~a:_a~lda~ipiv:_ipiv~b:_b~ldb|Complex32->L.cgetrs~layout~trans~n~nrhs~a:_a~lda~ipiv:_ipiv~b:_b~ldb|Complex64->L.zgetrs~layout~trans~n~nrhs~a:_a~lda~ipiv:_ipiv~b:_b~ldb|_->failwith"lapacke:getrs"incheck_lapack_errorret;bletgetri:typeab.a:(a,b)t->ipiv:(int32,int32_elt)t->(a,b)t=fun~a~ipiv->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletk=Owl_dense_matrix_generic.((row_numipiv)*(col_numipiv))inassert(m=n&&n=k);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinlet_ipiv=bigarray_startCtypes_static.Genarrayipivinlet_a=bigarray_startCtypes_static.Genarrayainletlda=Stdlib.max1(_stridea)inletret=match_kindwith|Float32->L.sgetri~layout~n~a:_a~lda~ipiv:_ipiv|Float64->L.dgetri~layout~n~a:_a~lda~ipiv:_ipiv|Complex32->L.cgetri~layout~n~a:_a~lda~ipiv:_ipiv|Complex64->L.zgetri~layout~n~a:_a~lda~ipiv:_ipiv|_->failwith"lapacke:getri"incheck_lapack_errorret;aletgesvx:typeab.fact:char->trans:char->a:(a,b)t->af:(a,b)t->ipiv:(int32,int32_elt)t->equed:char->r:(a,b)t->c:(a,b)t->b:(a,b)t->(a,b)t*char*(a,b)t*(a,b)t*(a,b)t*a*(a,b)t*(a,b)t*a=fun~fact~trans~a~af~ipiv~equed~r~c~b->assert(fact='E'||fact='N'||fact='T'||fact='C');assert(trans='N'||trans='T'||trans='C');assert(equed='N'||equed='R'||equed='C'||equed='B');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);assert(Owl_dense_matrix_generic.row_numaf=n&&Owl_dense_matrix_generic.col_numaf=n);letnrhs=Owl_dense_matrix_generic.col_numbinlet_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inletldb=Stdlib.max1(_strideb)inletldaf=Stdlib.max1(_strideaf)inlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinlet_af=bigarray_startCtypes_static.Genarrayafinlet_ipiv=bigarray_startCtypes_static.Genarrayipivinlet_equed=Ctypes.(allocatecharequed)inletx=Genarray.create_kind_layout[|n;nrhs|]inlet_x=bigarray_startCtypes_static.Genarrayxinletldx=Stdlib.max1(_stridex)inletr_ref=ref(Genarray.create_kind_layout[|0;0|])inletc_ref=ref(Genarray.create_kind_layout[|0;0|])inletrcond=ref(Genarray.create_kind_layout[|0;0|])inletferr=ref(Genarray.create_kind_layout[|0;0|])inletberr=ref(Genarray.create_kind_layout[|0;0|])inletrpivot=ref(Genarray.create_kind_layout[|0;0|])inletret=match_kindwith|Float32->(letrcond'=Genarray.createfloat32_layout[|1;1|]inletferr'=Genarray.createfloat32_layout[|1;nrhs|]inletberr'=Genarray.createfloat32_layout[|1;nrhs|]inletrpivot'=Genarray.createfloat32_layout[|1;1|]inlet_rcond=bigarray_startCtypes_static.Genarrayrcond'inlet_ferr=bigarray_startCtypes_static.Genarrayferr'inlet_berr=bigarray_startCtypes_static.Genarrayberr'inlet_rpivot=bigarray_startCtypes_static.Genarrayrpivot'inlet_r=bigarray_startCtypes_static.Genarrayrinlet_c=bigarray_startCtypes_static.Genarraycinletret=L.sgesvx~layout~fact~trans~n~nrhs~a:_a~lda~af:_af~ldaf~ipiv:_ipiv~equed:_equed~r:_r~c:_c~b:_b~ldb~x:_x~ldx~rcond:_rcond~ferr:_ferr~berr:_berr~rpivot:_rpivotinr_ref:=r;c_ref:=c;rcond:=rcond';ferr:=ferr';berr:=berr';rpivot:=rpivot';ret)|Float64->(letrcond'=Genarray.createfloat64_layout[|1;1|]inletferr'=Genarray.createfloat64_layout[|1;nrhs|]inletberr'=Genarray.createfloat64_layout[|1;nrhs|]inletrpivot'=Genarray.createfloat64_layout[|1;1|]inlet_rcond=bigarray_startCtypes_static.Genarrayrcond'inlet_ferr=bigarray_startCtypes_static.Genarrayferr'inlet_berr=bigarray_startCtypes_static.Genarrayberr'inlet_rpivot=bigarray_startCtypes_static.Genarrayrpivot'inlet_r=bigarray_startCtypes_static.Genarrayrinlet_c=bigarray_startCtypes_static.Genarraycinletret=L.dgesvx~layout~fact~trans~n~nrhs~a:_a~lda~af:_af~ldaf~ipiv:_ipiv~equed:_equed~r:_r~c:_c~b:_b~ldb~x:_x~ldx~rcond:_rcond~ferr:_ferr~berr:_berr~rpivot:_rpivotinr_ref:=r;c_ref:=c;rcond:=rcond';ferr:=ferr';berr:=berr';rpivot:=rpivot';ret)|Complex32->(letrcond'=Genarray.createfloat32_layout[|1;1|]inletferr'=Genarray.createfloat32_layout[|1;nrhs|]inletberr'=Genarray.createfloat32_layout[|1;nrhs|]inletrpivot'=Genarray.createfloat32_layout[|1;1|]inlet_rcond=bigarray_startCtypes_static.Genarrayrcond'inlet_ferr=bigarray_startCtypes_static.Genarrayferr'inlet_berr=bigarray_startCtypes_static.Genarrayberr'inlet_rpivot=bigarray_startCtypes_static.Genarrayrpivot'inletr'=Owl_dense_matrix_c.rerinletc'=Owl_dense_matrix_c.recinlet_r=bigarray_startCtypes_static.Genarrayr'inlet_c=bigarray_startCtypes_static.Genarrayc'inletret=L.cgesvx~layout~fact~trans~n~nrhs~a:_a~lda~af:_af~ldaf~ipiv:_ipiv~equed:_equed~r:_r~c:_c~b:_b~ldb~x:_x~ldx~rcond:_rcond~ferr:_ferr~berr:_berr~rpivot:_rpivotinr_ref:=Owl_dense_matrix_generic.cast_s2cr';c_ref:=Owl_dense_matrix_generic.cast_s2cc';rcond:=Owl_dense_matrix_generic.cast_s2crcond';ferr:=Owl_dense_matrix_generic.cast_s2cferr';berr:=Owl_dense_matrix_generic.cast_s2cberr';rpivot:=Owl_dense_matrix_generic.cast_s2crpivot';ret)|Complex64->(let_rpivot=Ctypes.(allocatedouble0.)inletrcond'=Genarray.createfloat64_layout[|1;1|]inletferr'=Genarray.createfloat64_layout[|1;nrhs|]inletberr'=Genarray.createfloat64_layout[|1;nrhs|]inletrpivot'=Genarray.createfloat64_layout[|1;1|]inlet_rcond=bigarray_startCtypes_static.Genarrayrcond'inlet_ferr=bigarray_startCtypes_static.Genarrayferr'inlet_berr=bigarray_startCtypes_static.Genarrayberr'inlet_rpivot=bigarray_startCtypes_static.Genarrayrpivot'inletr'=Owl_dense_matrix_z.rerinletc'=Owl_dense_matrix_z.recinlet_r=bigarray_startCtypes_static.Genarrayr'inlet_c=bigarray_startCtypes_static.Genarrayc'inletret=L.zgesvx~layout~fact~trans~n~nrhs~a:_a~lda~af:_af~ldaf~ipiv:_ipiv~equed:_equed~r:_r~c:_c~b:_b~ldb~x:_x~ldx~rcond:_rcond~ferr:_ferr~berr:_berr~rpivot:_rpivotinr_ref:=Owl_dense_matrix_generic.cast_d2zr';c_ref:=Owl_dense_matrix_generic.cast_d2zc';rcond:=Owl_dense_matrix_generic.cast_d2zrcond';ferr:=Owl_dense_matrix_generic.cast_d2zferr';berr:=Owl_dense_matrix_generic.cast_d2zberr';rpivot:=Owl_dense_matrix_generic.cast_d2zrpivot';ret)|_->failwith"lapacke:gesvx"incheck_lapack_errorret;ifret=n+1thenOwl_log.warn"matrix is singular to working precision.";letrcond=Owl_dense_matrix_generic.get!rcond00inletrpivot=Owl_dense_matrix_generic.get!rpivot00inx,!@_equed,!r_ref,!c_ref,b,rcond,!ferr,!berr,rpivotletgelsd:typeab.a:(a,b)t->b:(a,b)t->rcond:float->(a,b)t*int=fun~a~b~rcond->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletminmn=Stdlib.minmninletmb=Owl_dense_matrix_generic.row_numbinletnrhs=Owl_dense_matrix_generic.col_numbinassert(mb=m);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletb=matchmb<nwith|true->Owl_dense_matrix_generic.resizeb[|n;nrhs|]|false->binletlda=Stdlib.max1(_stridea)inletldb=Stdlib.max1(_strideb)inlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinlet_rank=Ctypes.(allocateint32_t0l)inletret=match_kindwith|Float32->(lets=Genarray.createfloat32_layout[|1;minmn|]inlet_s=bigarray_startCtypes_static.GenarraysinL.sgelsd~layout~m~n~nrhs~a:_a~lda~b:_b~ldb~s:_s~rcond~rank:_rank)|Float64->(lets=Genarray.createfloat64_layout[|1;minmn|]inlet_s=bigarray_startCtypes_static.GenarraysinL.dgelsd~layout~m~n~nrhs~a:_a~lda~b:_b~ldb~s:_s~rcond~rank:_rank)|Complex32->(lets=Genarray.createfloat32_layout[|1;minmn|]inlet_s=bigarray_startCtypes_static.GenarraysinL.cgelsd~layout~m~n~nrhs~a:_a~lda~b:_b~ldb~s:_s~rcond~rank:_rank)|Complex64->(lets=Genarray.createfloat64_layout[|1;minmn|]inlet_s=bigarray_startCtypes_static.GenarraysinL.zgelsd~layout~m~n~nrhs~a:_a~lda~b:_b~ldb~s:_s~rcond~rank:_rank)|_->failwith"lapacke:gelsd"incheck_lapack_errorret;letb=Owl_dense_matrix_generic.resizeb[|n;nrhs|]inb,Int32.to_int!@_rankletgelsy:typeab.a:(a,b)t->b:(a,b)t->rcond:float->(a,b)t*int=fun~a~b~rcond->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletmb=Owl_dense_matrix_generic.row_numbinletnrhs=Owl_dense_matrix_generic.col_numbinassert(mb=m);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletb=matchmb<nwith|true->Owl_dense_matrix_generic.resizeb[|n;nrhs|]|false->binletlda=Stdlib.max1(_stridea)inletldb=Stdlib.max1(_strideb)inlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinlet_rank=Ctypes.(allocateint32_t0l)inletjpvt=Genarray.createint32_layout[|1;n|]inGenarray.filljpvt0l;let_jpvt=bigarray_startCtypes_static.Genarrayjpvtinletret=match_kindwith|Float32->L.sgelsy~layout~m~n~nrhs~a:_a~lda~b:_b~ldb~jpvt:_jpvt~rcond~rank:_rank|Float64->L.dgelsy~layout~m~n~nrhs~a:_a~lda~b:_b~ldb~jpvt:_jpvt~rcond~rank:_rank|Complex32->L.cgelsy~layout~m~n~nrhs~a:_a~lda~b:_b~ldb~jpvt:_jpvt~rcond~rank:_rank|Complex64->L.zgelsy~layout~m~n~nrhs~a:_a~lda~b:_b~ldb~jpvt:_jpvt~rcond~rank:_rank|_->failwith"lapacke:gelsy"incheck_lapack_errorret;letb=Owl_dense_matrix_generic.resizeb[|n;nrhs|]inb,Int32.to_int!@_rankletgglse:typeab.a:(a,b)t->b:(a,b)t->c:(a,b)t->d:(a,b)t->(a,b)t*a=fun~a~b~c~d->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletp=Owl_dense_matrix_generic.row_numbinassert(n=Owl_dense_matrix_generic.col_numb);assert(m=Owl_dense_matrix_generic.((row_numc)*(col_numc)));assert(p=Owl_dense_matrix_generic.((row_numd)*(col_numd)));let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletx=Genarray.create_kind_layout[|1;n|]inlet_x=bigarray_startCtypes_static.Genarrayxinlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinlet_c=bigarray_startCtypes_static.Genarraycinlet_d=bigarray_startCtypes_static.Genarraydinletlda=Stdlib.max1(_stridea)inletldb=Stdlib.max1(_strideb)inletret=match_kindwith|Float32->L.sgglse~layout~m~n~p~a:_a~lda~b:_b~ldb~c:_c~d:_d~x:_x|Float64->L.dgglse~layout~m~n~p~a:_a~lda~b:_b~ldb~c:_c~d:_d~x:_x|Complex32->L.cgglse~layout~m~n~p~a:_a~lda~b:_b~ldb~c:_c~d:_d~x:_x|Complex64->L.zgglse~layout~m~n~p~a:_a~lda~b:_b~ldb~c:_c~d:_d~x:_x|_->failwith"lapacke:gglse"incheck_lapack_errorret;letc'=Owl_dense_matrix_generic.resize~head:falsec[|1;m-n+p|]inletres=Owl_dense_matrix_generic.(mulc'c'|>sum')inx,resletgeev:typeab.jobvl:char->jobvr:char->a:(a,b)t->(a,b)t*(a,b)t*(a,b)t*(a,b)t=fun~jobvl~jobvr~a->assert(jobvl='N'||jobvl='V');assert(jobvr='N'||jobvr='V');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletvl=matchjobvlwith|'V'->Genarray.create_kind_layout[|n;n|]|_->Genarray.create_kind_layout[|0;n|]inletvr=matchjobvrwith|'V'->Genarray.create_kind_layout[|n;n|]|_->Genarray.create_kind_layout[|0;n|]inlet_a=bigarray_startCtypes_static.Genarrayainlet_vl=bigarray_startCtypes_static.Genarrayvlinlet_vr=bigarray_startCtypes_static.Genarrayvrinletlda=Stdlib.max1(_stridea)inletldvl=Stdlib.max1(_stridevl)inletldvr=Stdlib.max1(_stridevr)inletwr=ref(Genarray.create_kind_layout[|0;0|])inletwi=ref(Genarray.create_kind_layout[|0;0|])inletret=match_kindwith|Float32->(letwr'=Genarray.create_kind_layout[|1;n|]inletwi'=Genarray.create_kind_layout[|1;n|]inlet_wr=bigarray_startCtypes_static.Genarraywr'inlet_wi=bigarray_startCtypes_static.Genarraywi'inletr=L.sgeev~layout~jobvl~jobvr~n~a:_a~lda~wr:_wr~wi:_wi~vl:_vl~ldvl~vr:_vr~ldvrinwr:=wr';wi:=wi';r)|Float64->(letwr'=Genarray.create_kind_layout[|1;n|]inletwi'=Genarray.create_kind_layout[|1;n|]inlet_wr=bigarray_startCtypes_static.Genarraywr'inlet_wi=bigarray_startCtypes_static.Genarraywi'inletr=L.dgeev~layout~jobvl~jobvr~n~a:_a~lda~wr:_wr~wi:_wi~vl:_vl~ldvl~vr:_vr~ldvrinwr:=wr';wi:=wi';r)|Complex32->(letw'=Genarray.create_kind_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarrayw'inletr=L.cgeev~layout~jobvl~jobvr~n~a:_a~lda~w:_w~vl:_vl~ldvl~vr:_vr~ldvrinwr:=w';wi:=w';r)|Complex64->(letw'=Genarray.create_kind_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarrayw'inletr=L.cgeev~layout~jobvl~jobvr~n~a:_a~lda~w:_w~vl:_vl~ldvl~vr:_vr~ldvrinwr:=w';wi:=w';r)|_->failwith"lapacke:geev"incheck_lapack_errorret;!wr,!wi,vl,vrletgesdd:typeab.?jobz:char->a:(a,b)t->(a,b)t*(a,b)t*(a,b)t=fun?(jobz='A')~a->assert(jobz='A'||jobz='S'||jobz='O'||jobz='N');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletminmn=Stdlib.minmninlet_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinassert(m>0&&n>0);lets=ref(Genarray.create_kind_layout[|0;0|])inletu=matchjobzwith|'A'->Genarray.create_kind_layout[|m;m|]|'S'->Genarray.create_kind_layout[|m;minmn|]|'O'->Genarray.create_kind_layout[|m;ifm>=nthen0elsem|]|_->Genarray.create_kind_layout[|m;0|]inletvt=matchjobzwith|'A'->Genarray.create_kind_layout[|n;n|]|'S'->Genarray.create_kind_layout[|minmn;n|]|'O'->Genarray.create_kind_layout[|n;ifm>=nthennelse0|]|_->Genarray.create_kind_layout[|0;n|]inletlda=Stdlib.max1(_stridea)inletldu=Stdlib.max1(_strideu)inletldvt=Stdlib.max1(_stridevt)inlet_a=bigarray_startCtypes_static.Genarrayainlet_u=bigarray_startCtypes_static.Genarrayuinlet_vt=bigarray_startCtypes_static.Genarrayvtinletret=match_kindwith|Float32->(lets'=Genarray.createfloat32_layout[|1;minmn|]inlet_s=bigarray_startCtypes_static.Genarrays'inletr=L.sgesdd~layout~jobz~m~n~a:_a~lda~s:_s~u:_u~ldu~vt:_vt~ldvtins:=s';r)|Float64->(lets'=Genarray.createfloat64_layout[|1;minmn|]inlet_s=bigarray_startCtypes_static.Genarrays'inletr=L.dgesdd~layout~jobz~m~n~a:_a~lda~s:_s~u:_u~ldu~vt:_vt~ldvtins:=s';r)|Complex32->(lets'=Genarray.createfloat32_layout[|1;minmn|]inlet_s=bigarray_startCtypes_static.Genarrays'inletr=L.cgesdd~layout~jobz~m~n~a:_a~lda~s:_s~u:_u~ldu~vt:_vt~ldvtins:=Owl_dense_matrix_generic.cast_s2cs';r)|Complex64->(lets'=Genarray.createfloat64_layout[|1;minmn|]inlet_s=bigarray_startCtypes_static.Genarrays'inletr=L.zgesdd~layout~jobz~m~n~a:_a~lda~s:_s~u:_u~ldu~vt:_vt~ldvtins:=Owl_dense_matrix_generic.cast_d2zs';r)|_->failwith"lapacke:gesdd"incheck_lapack_errorret;matchjobz,m>=nwith|'O',true->a,!s,vt|'O',false->u,!s,a|_,_->u,!s,vtletgesvd:typeab.?jobu:char->?jobvt:char->a:(a,b)t->(a,b)t*(a,b)t*(a,b)t=fun?(jobu='A')?(jobvt='A')~a->assert(jobu='A'||jobu='S'||jobu='O'||jobu='N');assert(jobvt='A'||jobvt='S'||jobvt='O'||jobvt='N');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletminmn=Stdlib.minmninlet_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinassert(jobu<>'O'||jobvt<>'O');assert(m>0&&n>0);lets=ref(Genarray.create_kind_layout[|0;0|])inletu=matchjobuwith|'A'->Genarray.create_kind_layout[|m;m|]|'S'->Genarray.create_kind_layout[|m;minmn|]|_->Genarray.create_kind_layout[|m;0|]inletvt=matchjobvtwith|'A'->Genarray.create_kind_layout[|n;n|]|'S'->Genarray.create_kind_layout[|minmn;n|]|_->Genarray.create_kind_layout[|0;n|]inletlda=Stdlib.max1(_stridea)inletldu=Stdlib.max1(_strideu)inletldvt=Stdlib.max1(_stridevt)inlet_a=bigarray_startCtypes_static.Genarrayainlet_u=bigarray_startCtypes_static.Genarrayuinlet_vt=bigarray_startCtypes_static.Genarrayvtinletret=match_kindwith|Float32->(lets'=Genarray.createfloat32_layout[|1;minmn|]inlet_s=bigarray_startCtypes_static.Genarrays'inletsuperb=Genarray.createfloat32_layout[|minmn-1|]|>bigarray_startCtypes_static.Genarrayinletr=L.sgesvd~layout~jobu~jobvt~m~n~a:_a~lda~s:_s~u:_u~ldu~vt:_vt~ldvt~superbins:=s';r)|Float64->(lets'=Genarray.createfloat64_layout[|1;minmn|]inlet_s=bigarray_startCtypes_static.Genarrays'inletsuperb=Genarray.createfloat64_layout[|minmn-1|]|>bigarray_startCtypes_static.Genarrayinletr=L.dgesvd~layout~jobu~jobvt~m~n~a:_a~lda~s:_s~u:_u~ldu~vt:_vt~ldvt~superbins:=s';r)|Complex32->(lets'=Genarray.createfloat32_layout[|1;minmn|]inlet_s=bigarray_startCtypes_static.Genarrays'inletsuperb=Genarray.createfloat32_layout[|minmn-1|]|>bigarray_startCtypes_static.Genarrayinletr=L.cgesvd~layout~jobu~jobvt~m~n~a:_a~lda~s:_s~u:_u~ldu~vt:_vt~ldvt~superbins:=Owl_dense_matrix_generic.cast_s2cs';r)|Complex64->(lets'=Genarray.createfloat64_layout[|1;minmn|]inlet_s=bigarray_startCtypes_static.Genarrays'inletsuperb=Genarray.createfloat64_layout[|minmn-1|]|>bigarray_startCtypes_static.Genarrayinletr=L.zgesvd~layout~jobu~jobvt~m~n~a:_a~lda~s:_s~u:_u~ldu~vt:_vt~ldvt~superbins:=Owl_dense_matrix_generic.cast_d2zs';r)|_->failwith"lapacke:gesvd"incheck_lapack_errorret;matchjobu,jobvtwith|'O',_->a,!s,vt|_,'O'->u,!s,a|_,_->u,!s,vtletggsvd3:typeab.?jobu:char->?jobv:char->?jobq:char->a:(a,b)t->b:(a,b)t->(a,b)t*(a,b)t*(a,b)t*(a,b)t*(a,b)t*int*int*(a,b)t=fun?(jobu='U')?(jobv='V')?(jobq='Q')~a~b->assert(jobu='U'||jobu='N');assert(jobv='V'||jobu='N');assert(jobq='Q'||jobu='N');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletp=Owl_dense_matrix_generic.row_numbinassert(n=Owl_dense_matrix_generic.col_numb);letlda=Stdlib.max1(_stridea)inletldb=Stdlib.max1(_strideb)inletldu=Stdlib.max1minletldv=Stdlib.max1pinletldq=Stdlib.max1ninlet_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletalpha=ref(Genarray.create_kind_layout[|0;0|])inletbeta=ref(Genarray.create_kind_layout[|0;0|])inletu=matchjobuwith|'U'->Genarray.create_kind_layout[|ldu;m|]|_->Genarray.create_kind_layout[|0;m|]inletv=matchjobvwith|'V'->Genarray.create_kind_layout[|ldv;p|]|_->Genarray.create_kind_layout[|0;p|]inletq=matchjobqwith|'Q'->Genarray.create_kind_layout[|ldq;n|]|_->Genarray.create_kind_layout[|0;n|]inletiwork=Genarray.createint32_layout[|n|]inlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinlet_u=bigarray_startCtypes_static.Genarrayuinlet_v=bigarray_startCtypes_static.Genarrayvinlet_q=bigarray_startCtypes_static.Genarrayqinlet_iwork=bigarray_startCtypes_static.Genarrayiworkinlet_k=Ctypes.(allocateint32_t0l)inlet_l=Ctypes.(allocateint32_t0l)inletret=match_kindwith|Float32->(letalpha'=Genarray.createfloat32_layout[|1;n|]inletbeta'=Genarray.createfloat32_layout[|1;n|]inlet_alpha=bigarray_startCtypes_static.Genarrayalpha'inlet_beta=bigarray_startCtypes_static.Genarraybeta'inletr=L.sggsvd3~layout~jobu~jobv~jobq~m~n~p~k:_k~l:_l~a:_a~lda~b:_b~ldb~alpha:_alpha~beta:_beta~u:_u~ldu~v:_v~ldv~q:_q~ldq~iwork:_iworkinalpha:=alpha';beta:=beta';r)|Float64->(letalpha'=Genarray.createfloat64_layout[|1;n|]inletbeta'=Genarray.createfloat64_layout[|1;n|]inlet_alpha=bigarray_startCtypes_static.Genarrayalpha'inlet_beta=bigarray_startCtypes_static.Genarraybeta'inletr=L.dggsvd3~layout~jobu~jobv~jobq~m~n~p~k:_k~l:_l~a:_a~lda~b:_b~ldb~alpha:_alpha~beta:_beta~u:_u~ldu~v:_v~ldv~q:_q~ldq~iwork:_iworkinalpha:=alpha';beta:=beta';r)|Complex32->(letalpha'=Genarray.createfloat32_layout[|1;n|]inletbeta'=Genarray.createfloat32_layout[|1;n|]inlet_alpha=bigarray_startCtypes_static.Genarrayalpha'inlet_beta=bigarray_startCtypes_static.Genarraybeta'inletr=L.cggsvd3~layout~jobu~jobv~jobq~m~n~p~k:_k~l:_l~a:_a~lda~b:_b~ldb~alpha:_alpha~beta:_beta~u:_u~ldu~v:_v~ldv~q:_q~ldq~iwork:_iworkinalpha:=Owl_dense_matrix_generic.cast_s2calpha';beta:=Owl_dense_matrix_generic.cast_s2cbeta';r)|Complex64->(letalpha'=Genarray.createfloat64_layout[|1;n|]inletbeta'=Genarray.createfloat64_layout[|1;n|]inlet_alpha=bigarray_startCtypes_static.Genarrayalpha'inlet_beta=bigarray_startCtypes_static.Genarraybeta'inletr=L.zggsvd3~layout~jobu~jobv~jobq~m~n~p~k:_k~l:_l~a:_a~lda~b:_b~ldb~alpha:_alpha~beta:_beta~u:_u~ldu~v:_v~ldv~q:_q~ldq~iwork:_iworkinalpha:=Owl_dense_matrix_generic.cast_d2zalpha';beta:=Owl_dense_matrix_generic.cast_d2zbeta';r)|_->failwith"lapacke:ggsvd3"incheck_lapack_errorret;(* construct R from a and b *)letk=Int32.to_int!@_kinletl=Int32.to_int!@_linletr=matchm-k-l>=0with|true->(letr=Owl_dense_matrix_generic.get_slice[[0;k+l-1];[n-k-l;n-1]]ainOwl_dense_matrix_generic.triur)|false->(letra=Owl_dense_matrix_generic.get_slice[[];[n-k-l;n-1]]ainletrb=Owl_dense_matrix_generic.get_slice[[m-k;l-1];[n-k-l;n-1]]binletr=Owl_dense_matrix_generic.concat_verticalrarbinOwl_dense_matrix_generic.triur)inu,v,q,!alpha,!beta,k,l,rletgeevx:typeab.balanc:char->jobvl:char->jobvr:char->sense:char->a:(a,b)t->(a,b)t*(a,b)t*(a,b)t*(a,b)t*(a,b)t*int*int*(a,b)t*float*(a,b)t*(a,b)t=fun~balanc~jobvl~jobvr~sense~a->assert(balanc='N'||balanc='P'||balanc='S'||balanc='B');assert(sense='N'||sense='E'||sense='V'||sense='B');assert(jobvl='N'||jobvl='V');assert(jobvr='N'||jobvr='V');ifsense='E'||sense='B'thenassert(jobvl='V'&&jobvr='V');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletvl=matchjobvlwith|'V'->Genarray.create_kind_layout[|n;n|]|_->Genarray.create_kind_layout[|0;n|]inletvr=matchjobvrwith|'V'->Genarray.create_kind_layout[|n;n|]|_->Genarray.create_kind_layout[|0;n|]inletldvl=Stdlib.max1(_stridevl)inletldvr=Stdlib.max1(_stridevr)inlet_ilo=Ctypes.(allocateint32_t0l)inlet_ihi=Ctypes.(allocateint32_t0l)inletlda=Stdlib.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainlet_vl=bigarray_startCtypes_static.Genarrayvlinlet_vr=bigarray_startCtypes_static.Genarrayvrinletwr=ref(Genarray.create_kind_layout[|0;0|])inletwi=ref(Genarray.create_kind_layout[|0;0|])inletscale=ref(Genarray.create_kind_layout[|0;0|])inletabnrm=ref0.inletrconde=ref(Genarray.create_kind_layout[|0;0|])inletrcondv=ref(Genarray.create_kind_layout[|0;0|])inletret=match_kindwith|Float32->(letwr'=Genarray.create_kind_layout[|1;n|]inlet_wr=bigarray_startCtypes_static.Genarraywr'inletwi'=Genarray.create_kind_layout[|1;n|]inlet_wi=bigarray_startCtypes_static.Genarraywi'inletscale'=Genarray.create_kind_layout[|1;n|]inlet_scale=bigarray_startCtypes_static.Genarrayscale'inletrconde'=Genarray.create_kind_layout[|1;n|]inlet_rconde=bigarray_startCtypes_static.Genarrayrconde'inletrcondv'=Genarray.create_kind_layout[|1;n|]inlet_rcondv=bigarray_startCtypes_static.Genarrayrcondv'inlet_abnrm=Ctypes.(allocatefloat0.)inletr=L.sgeevx~layout~balanc~jobvl~jobvr~sense~n~a:_a~lda~wr:_wr~wi:_wi~vl:_vl~ldvl~vr:_vr~ldvr~ilo:_ilo~ihi:_ihi~scale:_scale~abnrm:_abnrm~rconde:_rconde~rcondv:_rcondvinwr:=wr';wi:=wi';scale:=scale';abnrm:=!@_abnrm;rconde:=rconde';rcondv:=rcondv';r)|Float64->(letwr'=Genarray.create_kind_layout[|1;n|]inlet_wr=bigarray_startCtypes_static.Genarraywr'inletwi'=Genarray.create_kind_layout[|1;n|]inlet_wi=bigarray_startCtypes_static.Genarraywi'inletscale'=Genarray.create_kind_layout[|1;n|]inlet_scale=bigarray_startCtypes_static.Genarrayscale'inletrconde'=Genarray.create_kind_layout[|1;n|]inlet_rconde=bigarray_startCtypes_static.Genarrayrconde'inletrcondv'=Genarray.create_kind_layout[|1;n|]inlet_rcondv=bigarray_startCtypes_static.Genarrayrcondv'inlet_abnrm=Ctypes.(allocatedouble0.)inletr=L.dgeevx~layout~balanc~jobvl~jobvr~sense~n~a:_a~lda~wr:_wr~wi:_wi~vl:_vl~ldvl~vr:_vr~ldvr~ilo:_ilo~ihi:_ihi~scale:_scale~abnrm:_abnrm~rconde:_rconde~rcondv:_rcondvinwr:=wr';wi:=wi';scale:=scale';abnrm:=!@_abnrm;rconde:=rconde';rcondv:=rcondv';r)|Complex32->(letw'=Genarray.create_kind_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarrayw'inletscale'=Genarray.createfloat32_layout[|1;n|]inlet_scale=bigarray_startCtypes_static.Genarrayscale'inletrconde'=Genarray.createfloat32_layout[|1;n|]inlet_rconde=bigarray_startCtypes_static.Genarrayrconde'inletrcondv'=Genarray.createfloat32_layout[|1;n|]inlet_rcondv=bigarray_startCtypes_static.Genarrayrcondv'inlet_abnrm=Ctypes.(allocatefloat0.)inletr=L.cgeevx~layout~balanc~jobvl~jobvr~sense~n~a:_a~lda~w:_w~vl:_vl~ldvl~vr:_vr~ldvr~ilo:_ilo~ihi:_ihi~scale:_scale~abnrm:_abnrm~rconde:_rconde~rcondv:_rcondvinwr:=w';wi:=w';scale:=Owl_dense_matrix_generic.cast_s2cscale';abnrm:=!@_abnrm;rconde:=Owl_dense_matrix_generic.cast_s2crconde';rcondv:=Owl_dense_matrix_generic.cast_s2crcondv';r)|Complex64->(letw'=Genarray.create_kind_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarrayw'inletscale'=Genarray.createfloat64_layout[|1;n|]inlet_scale=bigarray_startCtypes_static.Genarrayscale'inletrconde'=Genarray.createfloat64_layout[|1;n|]inlet_rconde=bigarray_startCtypes_static.Genarrayrconde'inletrcondv'=Genarray.createfloat64_layout[|1;n|]inlet_rcondv=bigarray_startCtypes_static.Genarrayrcondv'inlet_abnrm=Ctypes.(allocatedouble0.)inletr=L.zgeevx~layout~balanc~jobvl~jobvr~sense~n~a:_a~lda~w:_w~vl:_vl~ldvl~vr:_vr~ldvr~ilo:_ilo~ihi:_ihi~scale:_scale~abnrm:_abnrm~rconde:_rconde~rcondv:_rcondvinwr:=w';wi:=w';scale:=Owl_dense_matrix_generic.cast_d2zscale';abnrm:=!@_abnrm;rconde:=Owl_dense_matrix_generic.cast_d2zrconde';rcondv:=Owl_dense_matrix_generic.cast_d2zrcondv';r)|_->failwith"lapacke:geevx"incheck_lapack_errorret;(* return all the results ~modified in-place *)letilo=Int32.to_int!@_iloinletihi=Int32.to_int!@_ihiina,!wr,!wi,vl,vr,ilo,ihi,!scale,!abnrm,!rconde,!rcondvletggev:typeab.jobvl:char->jobvr:char->a:(a,b)t->b:(a,b)t->(a,b)t*(a,b)t*(a,b)t*(a,b)t*(a,b)t=fun~jobvl~jobvr~a~b->assert(jobvl='N'||jobvl='V');assert(jobvr='N'||jobvr='V');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletmb=Owl_dense_matrix_generic.row_numbinletnb=Owl_dense_matrix_generic.col_numbinassert(m=n&&mb=n&&mb=nb);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletldvl=matchjobvlwith|'V'->n|_->1inletldvr=matchjobvrwith|'V'->n|_->1inletvl=Genarray.create_kind_layout[|n;ldvl|]inletvr=Genarray.create_kind_layout[|n;ldvr|]inletalphar=ref(Genarray.create_kind_layout[|0;0|])inletalphai=ref(Genarray.create_kind_layout[|0;0|])inletbeta=Genarray.create_kind_layout[|1;n|]inlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinlet_vl=bigarray_startCtypes_static.Genarrayvlinlet_vr=bigarray_startCtypes_static.Genarrayvrinlet_beta=bigarray_startCtypes_static.Genarraybetainletlda=Stdlib.max1(_stridea)inletldb=Stdlib.max1(_strideb)inletret=match_kindwith|Float32->(letalphar'=Genarray.create_kind_layout[|1;n|]inlet_alphar=bigarray_startCtypes_static.Genarrayalphar'inletalphai'=Genarray.create_kind_layout[|1;n|]inlet_alphai=bigarray_startCtypes_static.Genarrayalphai'inletr=L.sggev~layout~jobvl~jobvr~n~a:_a~lda~b:_b~ldb~alphar:_alphar~alphai:_alphai~beta:_beta~vl:_vl~ldvl~vr:_vr~ldvrinalphar:=alphar';alphai:=alphai';r)|Float64->(letalphar'=Genarray.create_kind_layout[|1;n|]inlet_alphar=bigarray_startCtypes_static.Genarrayalphar'inletalphai'=Genarray.create_kind_layout[|1;n|]inlet_alphai=bigarray_startCtypes_static.Genarrayalphai'inletr=L.dggev~layout~jobvl~jobvr~n~a:_a~lda~b:_b~ldb~alphar:_alphar~alphai:_alphai~beta:_beta~vl:_vl~ldvl~vr:_vr~ldvrinalphar:=alphar';alphai:=alphai';r)|Complex32->(letalpha'=Genarray.create_kind_layout[|1;n|]inletalpha=bigarray_startCtypes_static.Genarrayalpha'inletr=L.cggev~layout~jobvl~jobvr~n~a:_a~lda~b:_b~ldb~alpha~beta:_beta~vl:_vl~ldvl~vr:_vr~ldvrinalphar:=alpha';alphai:=alpha';r)|Complex64->(letalpha'=Genarray.create_kind_layout[|1;n|]inletalpha=bigarray_startCtypes_static.Genarrayalpha'inletr=L.cggev~layout~jobvl~jobvr~n~a:_a~lda~b:_b~ldb~alpha~beta:_beta~vl:_vl~ldvl~vr:_vr~ldvrinalphar:=alpha';alphai:=alpha';r)|_->failwith"lapacke:ggev"incheck_lapack_errorret;(* note alphar and alphai are the same for complex flavour *)!alphar,!alphai,beta,vl,vrletgtsv:typeab.dl:(a,b)t->d:(a,b)t->du:(a,b)t->b:(a,b)t->(a,b)t=fun~dl~d~du~b->letn=Owl_dense_matrix_generic.numeldinletn_dl=Owl_dense_matrix_generic.numeldlinletn_du=Owl_dense_matrix_generic.numelduinassert(n_dl=n||n_dl=n-1);assert(n_du=n||n_du=n-1);letmb=Owl_dense_matrix_generic.row_numbinletnrhs=Owl_dense_matrix_generic.col_numbinassert(mb=n);let_kind=Genarray.kindbinlet_layout=Genarray.layoutbinletlayout=lapacke_layout_layoutinletldb=Stdlib.max1(_strideb)inlet_b=bigarray_startCtypes_static.Genarraybinlet_d=bigarray_startCtypes_static.Genarraydinlet_dl=bigarray_startCtypes_static.Genarraydlinlet_du=bigarray_startCtypes_static.Genarrayduinletret=match_kindwith|Float32->L.sgtsv~layout~n~nrhs~dl:_dl~d:_d~du:_du~b:_b~ldb|Float64->L.dgtsv~layout~n~nrhs~dl:_dl~d:_d~du:_du~b:_b~ldb|Complex32->L.cgtsv~layout~n~nrhs~dl:_dl~d:_d~du:_du~b:_b~ldb|Complex64->L.zgtsv~layout~n~nrhs~dl:_dl~d:_d~du:_du~b:_b~ldb|_->failwith"lapacke:gtsv"incheck_lapack_errorret;bletgttrf:typeab.dl:(a,b)t->d:(a,b)t->du:(a,b)t->(a,b)t*(a,b)t*(a,b)t*(a,b)t*(int32,int32_elt)t=fun~dl~d~du->letn=Owl_dense_matrix_generic.numeldinletn_dl=Owl_dense_matrix_generic.numeldlinletn_du=Owl_dense_matrix_generic.numelduinassert(n_dl=n-1&&n_du=n-1);let_kind=Genarray.kinddinlet_layout=Genarray.layoutdinletdu2=Genarray.create_kind_layout[|1;n-2|]inletipiv=Genarray.createint32_layout[|1;n|]inlet_d=bigarray_startCtypes_static.Genarraydinlet_dl=bigarray_startCtypes_static.Genarraydlinlet_du=bigarray_startCtypes_static.Genarrayduinlet_du2=bigarray_startCtypes_static.Genarraydu2inlet_ipiv=bigarray_startCtypes_static.Genarrayipivinletret=match_kindwith|Float32->L.sgttrf~n~dl:_dl~d:_d~du:_du~du2:_du2~ipiv:_ipiv|Float64->L.dgttrf~n~dl:_dl~d:_d~du:_du~du2:_du2~ipiv:_ipiv|Complex32->L.cgttrf~n~dl:_dl~d:_d~du:_du~du2:_du2~ipiv:_ipiv|Complex64->L.zgttrf~n~dl:_dl~d:_d~du:_du~du2:_du2~ipiv:_ipiv|_->failwith"lapacke:gttrf"incheck_lapack_errorret;dl,d,du,du2,ipivletgttrs:typeab.trans:char->dl:(a,b)t->d:(a,b)t->du:(a,b)t->du2:(a,b)t->ipiv:(int32,int32_elt)t->b:(a,b)t->(a,b)t=fun~trans~dl~d~du~du2~ipiv:_~b->assert(trans='N'||trans='T'||trans='C');letn=Owl_dense_matrix_generic.numeldinletn_dl=Owl_dense_matrix_generic.numeldlinletn_du=Owl_dense_matrix_generic.numelduinassert(n_dl=n-1&&n_du=n-1);letmb=Owl_dense_matrix_generic.row_numbinletnrhs=Owl_dense_matrix_generic.col_numbinassert(mb=n);let_kind=Genarray.kinddinlet_layout=Genarray.layoutdinletlayout=lapacke_layout_layoutinletipiv=Genarray.createint32_layout[|1;n|]inletldb=Stdlib.max1(_strideb)inlet_b=bigarray_startCtypes_static.Genarraybinlet_d=bigarray_startCtypes_static.Genarraydinlet_dl=bigarray_startCtypes_static.Genarraydlinlet_du=bigarray_startCtypes_static.Genarrayduinlet_du2=bigarray_startCtypes_static.Genarraydu2inlet_ipiv=bigarray_startCtypes_static.Genarrayipivinletret=match_kindwith|Float32->L.sgttrs~layout~trans~n~nrhs~dl:_dl~d:_d~du:_du~du2:_du2~ipiv:_ipiv~b:_b~ldb|Float64->L.dgttrs~layout~trans~n~nrhs~dl:_dl~d:_d~du:_du~du2:_du2~ipiv:_ipiv~b:_b~ldb|Complex32->L.cgttrs~layout~trans~n~nrhs~dl:_dl~d:_d~du:_du~du2:_du2~ipiv:_ipiv~b:_b~ldb|Complex64->L.zgttrs~layout~trans~n~nrhs~dl:_dl~d:_d~du:_du~du2:_du2~ipiv:_ipiv~b:_b~ldb|_->failwith"lapacke:gttrs"incheck_lapack_errorret;bletorglq:typea.?k:int->a:(float,a)t->tau:(float,a)t->(float,a)t=fun?k~a~tau->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletminmn=Stdlib.minmninletk=matchkwith|Somek->k|None->Owl_dense_matrix_generic.numeltauinassert(k<=minmn);assert(k<=Owl_dense_matrix_generic.numeltau);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainlet_tau=bigarray_startCtypes_static.Genarraytauinletret=match_kindwith|Float32->L.sorglq~layout~m:minmn~n~k~a:_a~lda~tau:_tau|Float64->L.dorglq~layout~m:minmn~n~k~a:_a~lda~tau:_tauincheck_lapack_errorret;(* extract the first leading rows if necessary *)matchminmn<mwith|true->Owl_dense_matrix_generic.get_slice[[0;minmn-1];[]]a|false->aletunglq:typea.?k:int->a:(Complex.t,a)t->tau:(Complex.t,a)t->(Complex.t,a)t=fun?k~a~tau->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletminmn=Stdlib.minmninletk=matchkwith|Somek->k|None->Owl_dense_matrix_generic.numeltauinassert(k<=minmn);assert(k<=Owl_dense_matrix_generic.numeltau);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainlet_tau=bigarray_startCtypes_static.Genarraytauinletret=match_kindwith|Complex32->L.cunglq~layout~m:minmn~n~k~a:_a~lda~tau:_tau|Complex64->L.zunglq~layout~m:minmn~n~k~a:_a~lda~tau:_tauincheck_lapack_errorret;(* extract the first leading rows if necessary *)matchminmn<mwith|true->Owl_dense_matrix_generic.get_slice[[0;minmn-1];[]]a|false->aletorgqr:typea.?k:int->a:(float,a)t->tau:(float,a)t->(float,a)t=fun?k~a~tau->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletminmn=Stdlib.minmninletk=matchkwith|Somek->k|None->Owl_dense_matrix_generic.numeltauinassert(k<=minmn);assert(k<=Owl_dense_matrix_generic.numeltau);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainlet_tau=bigarray_startCtypes_static.Genarraytauinletret=match_kindwith|Float32->L.sorgqr~layout~m~n:minmn~k~a:_a~lda~tau:_tau|Float64->L.dorgqr~layout~m~n:minmn~k~a:_a~lda~tau:_tauincheck_lapack_errorret;(* extract the first leading columns if necessary *)matchminmn<nwith|true->Owl_dense_matrix_generic.get_slice[[];[0;minmn-1]]a|false->aletungqr:typea.?k:int->a:(Complex.t,a)t->tau:(Complex.t,a)t->(Complex.t,a)t=fun?k~a~tau->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletminmn=Stdlib.minmninletk=matchkwith|Somek->k|None->Owl_dense_matrix_generic.numeltauinassert(k<=minmn);assert(k<=Owl_dense_matrix_generic.numeltau);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainlet_tau=bigarray_startCtypes_static.Genarraytauinletret=match_kindwith|Complex32->L.cungqr~layout~m~n:minmn~k~a:_a~lda~tau:_tau|Complex64->L.zungqr~layout~m~n:minmn~k~a:_a~lda~tau:_tauincheck_lapack_errorret;(* extract the first leading columns if necessary *)matchminmn<nwith|true->Owl_dense_matrix_generic.get_slice[[];[0;minmn-1]]a|false->aletorgql:typea.?k:int->a:(float,a)t->tau:(float,a)t->(float,a)t=fun?k~a~tau->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletminmn=Stdlib.minmninletk=matchkwith|Somek->k|None->Owl_dense_matrix_generic.numeltauinassert(k<=minmn);assert(k<=Owl_dense_matrix_generic.numeltau);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainlet_tau=bigarray_startCtypes_static.Genarraytauinletret=match_kindwith|Float32->L.sorgql~layout~m~n:minmn~k~a:_a~lda~tau:_tau|Float64->L.dorgql~layout~m~n:minmn~k~a:_a~lda~tau:_tauincheck_lapack_errorret;(* extract the first leading columns if necessary *)matchminmn<nwith|true->Owl_dense_matrix_generic.get_slice[[];[0;minmn-1]]a|false->aletorgrq:typea.?k:int->a:(float,a)t->tau:(float,a)t->(float,a)t=fun?k~a~tau->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletminmn=Stdlib.minmninletk=matchkwith|Somek->k|None->Owl_dense_matrix_generic.numeltauinassert(k<=minmn);assert(k<=Owl_dense_matrix_generic.numeltau);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainlet_tau=bigarray_startCtypes_static.Genarraytauinletret=match_kindwith|Float32->L.sorgrq~layout~m~n:minmn~k~a:_a~lda~tau:_tau|Float64->L.dorgrq~layout~m~n:minmn~k~a:_a~lda~tau:_tauincheck_lapack_errorret;(* extract the first leading columns if necessary *)matchminmn<nwith|true->Owl_dense_matrix_generic.get_slice[[];[0;minmn-1]]a|false->aletormlq:typea.side:char->trans:char->a:(float,a)t->tau:(float,a)t->c:(float,a)t->(float,a)t=fun~side~trans~a~tau~c->assert(side='L'||side='R');assert(trans='N'||trans='T');letm=Owl_dense_matrix_generic.row_numcinletn=Owl_dense_matrix_generic.col_numcinletma=Owl_dense_matrix_generic.row_numainletna=Owl_dense_matrix_generic.col_numainletk=Owl_dense_matrix_generic.numeltauinifside='L'thenassert(ma=k&&na=m&&k<=m)else(* if side = 'R' *)assert(ma=k&&na=n&&k<=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inletldc=Stdlib.max1(_stridec)inlet_a=bigarray_startCtypes_static.Genarrayainlet_c=bigarray_startCtypes_static.Genarraycinlet_tau=bigarray_startCtypes_static.Genarraytauinletret=match_kindwith|Float32->L.sormlq~layout~side~trans~m~n~k~a:_a~lda~tau:_tau~c:_c~ldc|Float64->L.dormlq~layout~side~trans~m~n~k~a:_a~lda~tau:_tau~c:_c~ldcincheck_lapack_errorret;cletormqr:typea.side:char->trans:char->a:(float,a)t->tau:(float,a)t->c:(float,a)t->(float,a)t=fun~side~trans~a~tau~c->assert(side='L'||side='R');assert(trans='N'||trans='T');letm=Owl_dense_matrix_generic.row_numcinletn=Owl_dense_matrix_generic.col_numcinletma=Owl_dense_matrix_generic.row_numainletna=Owl_dense_matrix_generic.col_numainletk=Owl_dense_matrix_generic.numeltauinifside='L'thenassert(ma=m&&na=k&&k<=m)else(* if side = 'R' *)assert(ma=n&&na=k&&k<=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inletldc=Stdlib.max1(_stridec)inlet_a=bigarray_startCtypes_static.Genarrayainlet_c=bigarray_startCtypes_static.Genarraycinlet_tau=bigarray_startCtypes_static.Genarraytauinletret=match_kindwith|Float32->L.sormqr~layout~side~trans~m~n~k~a:_a~lda~tau:_tau~c:_c~ldc|Float64->L.dormqr~layout~side~trans~m~n~k~a:_a~lda~tau:_tau~c:_c~ldcincheck_lapack_errorret;cletormql:typea.side:char->trans:char->a:(float,a)t->tau:(float,a)t->c:(float,a)t->(float,a)t=fun~side~trans~a~tau~c->assert(side='L'||side='R');assert(trans='N'||trans='T');letm=Owl_dense_matrix_generic.row_numcinletn=Owl_dense_matrix_generic.col_numcinletma=Owl_dense_matrix_generic.row_numainletna=Owl_dense_matrix_generic.col_numainletk=Owl_dense_matrix_generic.numeltauinifside='L'thenassert(ma=m&&na=k&&k<=m)else(* if side = 'R' *)assert(ma=n&&na=k&&k<=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inletldc=Stdlib.max1(_stridec)inlet_a=bigarray_startCtypes_static.Genarrayainlet_c=bigarray_startCtypes_static.Genarraycinlet_tau=bigarray_startCtypes_static.Genarraytauinletret=match_kindwith|Float32->L.sormql~layout~side~trans~m~n~k~a:_a~lda~tau:_tau~c:_c~ldc|Float64->L.dormql~layout~side~trans~m~n~k~a:_a~lda~tau:_tau~c:_c~ldcincheck_lapack_errorret;cletormrq:typea.side:char->trans:char->a:(float,a)t->tau:(float,a)t->c:(float,a)t->(float,a)t=fun~side~trans~a~tau~c->assert(side='L'||side='R');assert(trans='N'||trans='T');letm=Owl_dense_matrix_generic.row_numcinletn=Owl_dense_matrix_generic.col_numcinletma=Owl_dense_matrix_generic.row_numainletna=Owl_dense_matrix_generic.col_numainletk=Owl_dense_matrix_generic.numeltauinifside='L'thenassert(ma=k&&na=m&&k<=m)else(* if side = 'R' *)assert(ma=k&&na=n&&k<=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inletldc=Stdlib.max1(_stridec)inlet_a=bigarray_startCtypes_static.Genarrayainlet_c=bigarray_startCtypes_static.Genarraycinlet_tau=bigarray_startCtypes_static.Genarraytauinletret=match_kindwith|Float32->L.sormrq~layout~side~trans~m~n~k~a:_a~lda~tau:_tau~c:_c~ldc|Float64->L.dormrq~layout~side~trans~m~n~k~a:_a~lda~tau:_tau~c:_c~ldcincheck_lapack_errorret;cletgemqrt:typeab.side:char->trans:char->v:(a,b)t->t:(a,b)t->c:(a,b)t->(a,b)t=fun~side~trans~v~t~c->assert(side='L'||side='R');assert(trans='N'||trans='T'||trans='C');letm=Owl_dense_matrix_generic.row_numcinletn=Owl_dense_matrix_generic.col_numcinletnb=Owl_dense_matrix_generic.row_numtinletk=Owl_dense_matrix_generic.col_numtinletmv=Owl_dense_matrix_generic.row_numvinletldv=Stdlib.max1(_stridev)inassert(k>=nb);ifside='L'thenassert(mv=m&&ldv=k&&k<=m)else(* if side = 'R' *)assert(mv=n&&ldv=k&&k<=n);let_kind=Genarray.kindcinlet_layout=Genarray.layoutcinletlayout=lapacke_layout_layoutinletldt=Stdlib.max1(_stridet)inletldc=Stdlib.max1(_stridec)inlet_v=bigarray_startCtypes_static.Genarrayvinlet_t=bigarray_startCtypes_static.Genarraytinlet_c=bigarray_startCtypes_static.Genarraycinletret=match_kindwith|Float32->L.sgemqrt~layout~side~trans~m~n~k~nb~v:_v~ldv~t:_t~ldt~c:_c~ldc|Float64->L.dgemqrt~layout~side~trans~m~n~k~nb~v:_v~ldv~t:_t~ldt~c:_c~ldc|Complex32->L.cgemqrt~layout~side~trans~m~n~k~nb~v:_v~ldv~t:_t~ldt~c:_c~ldc|Complex64->L.zgemqrt~layout~side~trans~m~n~k~nb~v:_v~ldv~t:_t~ldt~c:_c~ldc|_->failwith"lapacke:gemqrt"incheck_lapack_errorret;cletposv:typeab.uplo:char->a:(a,b)t->b:(a,b)t->(a,b)t*(a,b)t=fun~uplo~a~b->assert(uplo='U'||uplo='L');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);letnrhs=_stridebinlet_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inletldb=Stdlib.max1(_strideb)inlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinletret=match_kindwith|Float32->L.sposv~layout~uplo~n~nrhs~a:_a~lda~b:_b~ldb|Float64->L.dposv~layout~uplo~n~nrhs~a:_a~lda~b:_b~ldb|Complex32->L.cposv~layout~uplo~n~nrhs~a:_a~lda~b:_b~ldb|Complex64->L.zposv~layout~uplo~n~nrhs~a:_a~lda~b:_b~ldb|_->failwith"lapacke:posv"incheck_lapack_errorret;a,bletpotrf:typeab.uplo:char->a:(a,b)t->(a,b)t=fun~uplo~a->assert(uplo='U'||uplo='L');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainletret=match_kindwith|Float32->L.spotrf~layout~uplo~n~a:_a~lda|Float64->L.dpotrf~layout~uplo~n~a:_a~lda|Complex32->L.cpotrf~layout~uplo~n~a:_a~lda|Complex64->L.zpotrf~layout~uplo~n~a:_a~lda|_->failwith"lapacke:potrf"incheck_lapack_errorret;aletpotri:typeab.uplo:char->a:(a,b)t->(a,b)t=fun~uplo~a->assert(uplo='U'||uplo='L');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainletret=match_kindwith|Float32->L.spotri~layout~uplo~n~a:_a~lda|Float64->L.dpotri~layout~uplo~n~a:_a~lda|Complex32->L.cpotri~layout~uplo~n~a:_a~lda|Complex64->L.zpotri~layout~uplo~n~a:_a~lda|_->failwith"lapacke:potri"incheck_lapack_errorret;aletpotrs:typeab.uplo:char->a:(a,b)t->b:(a,b)t->(a,b)t=fun~uplo~a~b->assert(uplo='U'||uplo='L');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);letnrhs=_stridebinlet_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inletldb=Stdlib.max1(_strideb)inlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinletret=match_kindwith|Float32->L.spotrs~layout~uplo~n~nrhs~a:_a~lda~b:_b~ldb|Float64->L.dpotrs~layout~uplo~n~nrhs~a:_a~lda~b:_b~ldb|Complex32->L.cpotrs~layout~uplo~n~nrhs~a:_a~lda~b:_b~ldb|Complex64->L.zpotrs~layout~uplo~n~nrhs~a:_a~lda~b:_b~ldb|_->failwith"lapacke:potrs"incheck_lapack_errorret;bletpstrf:typeab.uplo:char->a:(a,b)t->tol:a->(a,b)t*(int32,int32_elt)t*int*int=fun~uplo~a~tol->assert(uplo='U'||uplo='L');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainletpiv=Genarray.createint32_layout[|1;n|]inlet_piv=bigarray_startCtypes_static.Genarraypivinlet_rank=Ctypes.(allocateint32_t0l)inletret=match_kindwith|Float32->L.spstrf~layout~uplo~n~a:_a~lda~piv:_piv~rank:_rank~tol|Float64->L.dpstrf~layout~uplo~n~a:_a~lda~piv:_piv~rank:_rank~tol|Complex32->L.cpstrf~layout~uplo~n~a:_a~lda~piv:_piv~rank:_rank~tol:Complex.(tol.re)|Complex64->L.zpstrf~layout~uplo~n~a:_a~lda~piv:_piv~rank:_rank~tol:Complex.(tol.re)|_->failwith"lapacke:pstrf"incheck_lapack_errorret;letrank=Int32.to_int!@_rankina,piv,rank,retletptsv:typeab.d:(a,b)t->e:(a,b)t->b:(a,b)t->(a,b)t=fun~d~e~b->letn=Owl_dense_matrix_generic.numeldinletn_e=Owl_dense_matrix_generic.numeleinletmb=Owl_dense_matrix_generic.row_numbinletnrhs=Owl_dense_matrix_generic.col_numbinassert(n_e=n-1);assert(mb=n);let_kind=Genarray.kinddinlet_layout=Genarray.layoutdinletlayout=lapacke_layout_layoutinletldb=Stdlib.max1(_strideb)inlet_e=bigarray_startCtypes_static.Genarrayeinlet_b=bigarray_startCtypes_static.Genarraybin(* NOTE: only use the real part of d *)letret=match_kindwith|Float32->(let_d=bigarray_startCtypes_static.GenarraydinL.sptsv~layout~n~nrhs~d:_d~e:_e~b:_b~ldb)|Float64->(let_d=bigarray_startCtypes_static.GenarraydinL.dptsv~layout~n~nrhs~d:_d~e:_e~b:_b~ldb)|Complex32->(letd'=Owl_dense_matrix_c.redinlet_d=bigarray_startCtypes_static.Genarrayd'inL.cptsv~layout~n~nrhs~d:_d~e:_e~b:_b~ldb)|Complex64->(letd'=Owl_dense_matrix_z.redinlet_d=bigarray_startCtypes_static.Genarrayd'inL.zptsv~layout~n~nrhs~d:_d~e:_e~b:_b~ldb)|_->failwith"lapacke:ptsv"incheck_lapack_errorret;bletpttrf:typeab.d:(a,b)t->e:(a,b)t->(a,b)t*(a,b)t=fun~d~e->letn=Owl_dense_matrix_generic.numeldinletn_e=Owl_dense_matrix_generic.numeleinassert(n_e=n-1);let_kind=Genarray.kinddinlet_e=bigarray_startCtypes_static.Genarrayein(* NOTE: only use the real part of d *)letret=match_kindwith|Float32->(letd=bigarray_startCtypes_static.GenarraydinL.spttrf~n~d~e:_e)|Float64->(letd=bigarray_startCtypes_static.GenarraydinL.dpttrf~n~d~e:_e)|Complex32->(letd'=Owl_dense_matrix_c.redinletd=bigarray_startCtypes_static.Genarrayd'inL.cpttrf~n~d~e:_e)|Complex64->(letd'=Owl_dense_matrix_z.redinletd=bigarray_startCtypes_static.Genarrayd'inL.zpttrf~n~d~e:_e)|_->failwith"lapacke:pttrf"incheck_lapack_errorret;d,eletpttrs:typeab.?uplo:char->d:(a,b)t->e:(a,b)t->b:(a,b)t->(a,b)t=fun?uplo~d~e~b->(* NOTE: ~uplo is only for complex flavour *)letuplo=matchuplowith|Someuplo->uplo|None->'U'inassert(uplo='U'||uplo='L');letn=Owl_dense_matrix_generic.numeldinletn_e=Owl_dense_matrix_generic.numeleinletmb=Owl_dense_matrix_generic.row_numbinletnrhs=Owl_dense_matrix_generic.col_numbinassert(n_e=n-1);assert(mb=n);let_kind=Genarray.kinddinlet_layout=Genarray.layoutdinletlayout=lapacke_layout_layoutinletldb=Stdlib.max1(_strideb)inlet_e=bigarray_startCtypes_static.Genarrayeinlet_b=bigarray_startCtypes_static.Genarraybin(* NOTE: only use the real part of d *)letret=match_kindwith|Float32->(let_d=bigarray_startCtypes_static.GenarraydinL.spttrs~layout~n~nrhs~d:_d~e:_e~b:_b~ldb)|Float64->(let_d=bigarray_startCtypes_static.GenarraydinL.dpttrs~layout~n~nrhs~d:_d~e:_e~b:_b~ldb)|Complex32->(letd'=Owl_dense_matrix_c.redinlet_d=bigarray_startCtypes_static.Genarrayd'inL.cpttrs~layout~uplo~n~nrhs~d:_d~e:_e~b:_b~ldb)|Complex64->(letd'=Owl_dense_matrix_z.redinlet_d=bigarray_startCtypes_static.Genarrayd'inL.zpttrs~layout~uplo~n~nrhs~d:_d~e:_e~b:_b~ldb)|_->failwith"lapacke:pttrs"incheck_lapack_errorret;blettrtri:typeab.uplo:char->diag:char->a:(a,b)t->(a,b)t=fun~uplo~diag~a->assert(uplo='U'||uplo='L');assert(diag='N'||diag='U');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainletret=match_kindwith|Float32->L.strtri~layout~uplo~diag~n~a:_a~lda|Float64->L.dtrtri~layout~uplo~diag~n~a:_a~lda|Complex32->L.ctrtri~layout~uplo~diag~n~a:_a~lda|Complex64->L.ztrtri~layout~uplo~diag~n~a:_a~lda|_->failwith"lapacke:trtri"incheck_lapack_errorret;alettrtrs:typeab.uplo:char->trans:char->diag:char->a:(a,b)t->b:(a,b)t->(a,b)t=fun~uplo~trans~diag~a~b->assert(uplo='U'||uplo='L');assert(diag='N'||diag='U');assert(trans='N'||trans='T'||trans='C');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);letmb=Owl_dense_matrix_generic.row_numbinletnrhs=Owl_dense_matrix_generic.col_numbinassert(mb=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inletldb=Stdlib.max1(_strideb)inlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinletret=match_kindwith|Float32->L.strtrs~layout~uplo~trans~diag~n~nrhs~a:_a~lda~b:_b~ldb|Float64->L.dtrtrs~layout~uplo~trans~diag~n~nrhs~a:_a~lda~b:_b~ldb|Complex32->L.ctrtrs~layout~uplo~trans~diag~n~nrhs~a:_a~lda~b:_b~ldb|Complex64->L.ztrtrs~layout~uplo~trans~diag~n~nrhs~a:_a~lda~b:_b~ldb|_->failwith"lapacke:trtrs"incheck_lapack_errorret;blettrcon:typeab.norm:char->uplo:char->diag:char->a:(a,b)t->float=fun~norm~uplo~diag~a->assert(uplo='U'||uplo='L');assert(diag='N'||diag='U');assert(norm='1'||norm='O'||norm='I');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainletrcond=ref0.inletret=match_kindwith|Float32->(let_rcond=Ctypes.(allocatefloat0.)inletr=L.strcon~layout~norm~uplo~diag~n~a:_a~lda~rcond:_rcondinrcond:=!@_rcond;r)|Float64->(let_rcond=Ctypes.(allocatedouble0.)inletr=L.dtrcon~layout~norm~uplo~diag~n~a:_a~lda~rcond:_rcondinrcond:=!@_rcond;r)|Complex32->(let_rcond=Ctypes.(allocatefloat0.)inletr=L.ctrcon~layout~norm~uplo~diag~n~a:_a~lda~rcond:_rcondinrcond:=!@_rcond;r)|Complex64->(let_rcond=Ctypes.(allocatedouble0.)inletr=L.ztrcon~layout~norm~uplo~diag~n~a:_a~lda~rcond:_rcondinrcond:=!@_rcond;r)|_->failwith"lapacke:trcon"incheck_lapack_errorret;!rcondlettrevc:typeab.side:char->howmny:char->select:(int32,int32_elt)t->t:(a,b)t->(int32,int32_elt)t*(a,b)t*(a,b)t=fun~side~howmny~select~t->assert(side='L'||side='R'||side='B');assert(howmny='A'||howmny='B'||howmny='S');letmt=Owl_dense_matrix_generic.row_numtinletn=Owl_dense_matrix_generic.col_numtinassert(mt=n);let_kind=Genarray.kindtinlet_layout=Genarray.layouttinletlayout=lapacke_layout_layoutin(* NOTE: I ~might allocate too ~much ~memory for vl and vr, please refer to Intel
MKL documentation for ~more detailed ~memory allocation strategy. Fix later.
url: https://software.intel.com/en-us/mkl-developer-reference-c-trevc
*)letvl=Genarray.create_kind_layout[|n;n|]inletvr=Genarray.create_kind_layout[|n;n|]inletmm=Owl_dense_matrix_generic.col_numvlinletldt=_stridetinletldvl=_stridevlinletldvr=_stridevrinlet_m=Ctypes.(allocateint32_t0l)inlet_t=bigarray_startCtypes_static.Genarraytinlet_vl=bigarray_startCtypes_static.Genarrayvlinlet_vr=bigarray_startCtypes_static.Genarrayvrinlet_select=bigarray_startCtypes_static.Genarrayselectinletret=match_kindwith|Float32->L.strevc~layout~side~howmny~select:_select~n~t:_t~ldt~vl:_vl~ldvl~vr:_vr~ldvr~mm~m:_m|Float64->L.dtrevc~layout~side~howmny~select:_select~n~t:_t~ldt~vl:_vl~ldvl~vr:_vr~ldvr~mm~m:_m|Complex32->L.ctrevc~layout~side~howmny~select:_select~n~t:_t~ldt~vl:_vl~ldvl~vr:_vr~ldvr~mm~m:_m|Complex64->L.ztrevc~layout~side~howmny~select:_select~n~t:_t~ldt~vl:_vl~ldvl~vr:_vr~ldvr~mm~m:_m|_->failwith"lapacke:trevc"incheck_lapack_errorret;letm=Int32.to_int!@_minlet_empty=Genarray.create_kind_layout[|0;0|]inifhowmny='S'then((* return selected eigenvectors *)ifside='L'then(* left eigenvectors only *)select,Owl_dense_matrix_generic.get_slice[[];[0;m-1]]vl,_emptyelseifside='R'then(* right eigenvectors only *)select,Owl_dense_matrix_generic.get_slice[[];[0;m-1]]vr,_emptyelse(* both eigenvectors *)select,Owl_dense_matrix_generic.get_slice[[];[0;m-1]]vl,Owl_dense_matrix_generic.get_slice[[];[0;m-1]]vr)else((* return all eigenvectors *)ifside='L'then(* left eigenvectors only *)select,Owl_dense_matrix_generic.get_slice[[];[0;m-1]]vl,_emptyelseifside='R'then(* right eigenvectors only *)select,Owl_dense_matrix_generic.get_slice[[];[0;m-1]]vr,_emptyelse(* both eigenvectors *)select,Owl_dense_matrix_generic.get_slice[[];[0;m-1]]vl,Owl_dense_matrix_generic.get_slice[[];[0;m-1]]vr)lettrrfs:typeab.uplo:char->trans:char->diag:char->a:(a,b)t->b:(a,b)t->x:(a,b)t->(a,b)t*(a,b)t=fun~uplo~trans~diag~a~b~x->assert(uplo='U'||uplo='L');assert(diag='N'||diag='U');assert(trans='N'||trans='T'||trans='C');letn=Owl_dense_matrix_generic.col_numainassert(Owl_dense_matrix_generic.row_numb=n);letnrhs=Owl_dense_matrix_generic.col_numbinassert(Owl_dense_matrix_generic.col_numx=nrhs);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inletldb=Stdlib.max1(_strideb)inletldx=Stdlib.max1(_stridex)inlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinlet_x=bigarray_startCtypes_static.Genarrayxinletferr=ref(Genarray.create_kind_layout[|0;0|])inletberr=ref(Genarray.create_kind_layout[|0;0|])inletret=match_kindwith|Float32->(letferr'=Genarray.create_kind_layout[|1;nrhs|]inlet_ferr=bigarray_startCtypes_static.Genarrayferr'inletberr'=Genarray.create_kind_layout[|1;nrhs|]inlet_berr=bigarray_startCtypes_static.Genarrayberr'inletr=L.strrfs~layout~uplo~trans~diag~n~nrhs~a:_a~lda~b:_b~ldb~x:_x~ldx~ferr:_ferr~berr:_berrinferr:=ferr';berr:=berr';r)|Float64->(letferr'=Genarray.create_kind_layout[|1;nrhs|]inlet_ferr=bigarray_startCtypes_static.Genarrayferr'inletberr'=Genarray.create_kind_layout[|1;nrhs|]inlet_berr=bigarray_startCtypes_static.Genarrayberr'inletr=L.dtrrfs~layout~uplo~trans~diag~n~nrhs~a:_a~lda~b:_b~ldb~x:_x~ldx~ferr:_ferr~berr:_berrinferr:=ferr';berr:=berr';r)|Complex32->(letferr'=Genarray.createfloat32_layout[|1;nrhs|]inlet_ferr=bigarray_startCtypes_static.Genarrayferr'inletberr'=Genarray.createfloat32_layout[|1;nrhs|]inlet_berr=bigarray_startCtypes_static.Genarrayberr'inletr=L.ctrrfs~layout~uplo~trans~diag~n~nrhs~a:_a~lda~b:_b~ldb~x:_x~ldx~ferr:_ferr~berr:_berrinferr:=Owl_dense_matrix_generic.cast_s2cferr';berr:=Owl_dense_matrix_generic.cast_s2cberr';r)|Complex64->(letferr'=Genarray.createfloat64_layout[|1;nrhs|]inlet_ferr=bigarray_startCtypes_static.Genarrayferr'inletberr'=Genarray.createfloat64_layout[|1;nrhs|]inlet_berr=bigarray_startCtypes_static.Genarrayberr'inletr=L.ctrrfs~layout~uplo~trans~diag~n~nrhs~a:_a~lda~b:_b~ldb~x:_x~ldx~ferr:_ferr~berr:_berrinferr:=Owl_dense_matrix_generic.cast_d2zferr';berr:=Owl_dense_matrix_generic.cast_d2zberr';r)|_->failwith"lapacke:trrfs"incheck_lapack_errorret;!ferr,!berrletstev:typea.jobz:char->d:(float,a)t->e:(float,a)t->(float,a)t*(float,a)t=fun~jobz~d~e->assert(jobz='N'&&jobz='V');letn=Owl_dense_matrix_generic.numeldinletn_e=Owl_dense_matrix_generic.numeleinassert(n_e=n-1);let_kind=Genarray.kinddinlet_layout=Genarray.layoutdinletlayout=lapacke_layout_layoutinletz=matchjobzwith|'V'->Genarray.create_kind_layout[|n;n|]|_->Genarray.create_kind_layout[|0;n|]inletldz=Stdlib.max1(_stridez)inlet_d=bigarray_startCtypes_static.Genarraydinlet_e=bigarray_startCtypes_static.Genarrayeinlet_z=bigarray_startCtypes_static.Genarrayzinletret=match_kindwith|Float32->L.sstev~layout~jobz~n~d:_d~e:_e~z:_z~ldz|Float64->L.dstev~layout~jobz~n~d:_d~e:_e~z:_z~ldzincheck_lapack_errorret;d,zletstebz:typea.range:char->order:char->vl:float->vu:float->il:int->iu:int->abstol:float->d:(float,a)t->e:(float,a)t->(float,a)t*(int32,int32_elt)t*(int32,int32_elt)t=fun~range~order~vl~vu~il~iu~abstol~d~e->assert(range='A'||range='V'&&range='I');assert(order='B'||order='E');letn=Owl_dense_matrix_generic.numeldinletn_e=Owl_dense_matrix_generic.numeleinassert(n_e=n-1);let_kind=Genarray.kinddinlet_layout=Genarray.layoutdinlet_m=Ctypes.(allocateint32_t0l)inlet_nsplit=Ctypes.(allocateint32_t0l)inletw=Genarray.create_kind_layout[|1;n|]inletiblock=Genarray.createint32_layout[|1;n|]inletisplit=Genarray.createint32_layout[|1;n|]inlet_d=bigarray_startCtypes_static.Genarraydinlet_e=bigarray_startCtypes_static.Genarrayeinlet_w=bigarray_startCtypes_static.Genarraywinlet_iblock=bigarray_startCtypes_static.Genarrayiblockinlet_isplit=bigarray_startCtypes_static.Genarrayisplitinletret=match_kindwith|Float32->L.sstebz~range~order~n~vl~vu~il~iu~abstol~d:_d~e:_e~m:_m~nsplit:_nsplit~w:_w~iblock:_iblock~isplit:_isplit|Float64->L.dstebz~range~order~n~vl~vu~il~iu~abstol~d:_d~e:_e~m:_m~nsplit:_nsplit~w:_w~iblock:_iblock~isplit:_isplitincheck_lapack_errorret;letm=Int32.to_int!@_minletw=Owl_dense_matrix_generic.resizew[|1;m|]inletiblock=Owl_dense_matrix_generic.resizeiblock[|1;m|]inletisplit=Owl_dense_matrix_generic.resizeisplit[|1;m|]inw,iblock,isplitletstegr:typeab.kind:(a,b)kind->jobz:char->range:char->d:(float,b)t->e:(float,b)t->vl:float->vu:float->il:int->iu:int->(a,b)t*(a,b)t=fun~kind~jobz~range~d~e~vl~vu~il~iu->assert(jobz='N'&&jobz='V');assert(range='A'||range='V'&&range='I');letn=Owl_dense_matrix_generic.numeldinletn_e=Owl_dense_matrix_generic.numeleinassert(n_e=n-1);let_kind=kindinlet_layout=Genarray.layoutdinletlayout=lapacke_layout_layoutinletabstol=1.in(* note that ~abstol is unused. *)lete=Owl_dense_matrix_generic.resizee[|1;n|]inletldz=matchjobzwith'N'->1|_->ninletz=matchrangewith|'I'->Genarray.create_kind_layout[|(iu-il+1);ldz|]|_->Genarray.create_kind_layout[|n;ldz|]inletisuppz=Genarray.createint32_layout[|1;(Owl_dense_matrix_generic.row_numz)|]inletw=ref(Genarray.create_kind_layout[|0;0|])inlet_m=Ctypes.(allocateint32_t0l)inlet_d=bigarray_startCtypes_static.Genarraydinlet_e=bigarray_startCtypes_static.Genarrayeinlet_z=bigarray_startCtypes_static.Genarrayzinlet_isuppz=bigarray_startCtypes_static.Genarrayisuppzinletret=match_kindwith|Float32->(letw'=Genarray.createfloat32_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarrayw'inletr=L.sstegr~layout~jobz~range~n~d:_d~e:_e~vl~vu~il~iu~abstol~m:_m~w:_w~z:_z~ldz~isuppz:_isuppzinw:=w';r)|Float64->(letw'=Genarray.createfloat64_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarrayw'inletr=L.dstegr~layout~jobz~range~n~d:_d~e:_e~vl~vu~il~iu~abstol~m:_m~w:_w~z:_z~ldz~isuppz:_isuppzinw:=w';r)|Complex32->(letw'=Genarray.createfloat32_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarrayw'inletr=L.cstegr~layout~jobz~range~n~d:_d~e:_e~vl~vu~il~iu~abstol~m:_m~w:_w~z:_z~ldz~isuppz:_isuppzinw:=Owl_dense_matrix_generic.cast_s2cw';r)|Complex64->(letw'=Genarray.createfloat64_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarrayw'inletr=L.zstegr~layout~jobz~range~n~d:_d~e:_e~vl~vu~il~iu~abstol~m:_m~w:_w~z:_z~ldz~isuppz:_isuppzinw:=Owl_dense_matrix_generic.cast_d2zw';r)|_->failwith"lapacke:stegr"incheck_lapack_errorret;letm=Int32.to_int!@_minletw=matchm<Owl_dense_matrix_generic.col_num!wwith|true->Owl_dense_matrix_generic.resize!w[|1;m|]|false->!winletz=matchm<Owl_dense_matrix_generic.col_numzwith|true->Owl_dense_matrix_generic.get_slice[[];[0;m-1]]z|false->zinw,zletstein:typeab.kind:(a,b)kind->d:(float,b)t->e:(float,b)t->w:(float,b)t->iblock:(int32,int32_elt)t->isplit:(int32,int32_elt)t->(a,b)t*(int32,int32_elt)t=fun~kind~d~e~w~iblock:_~isplit:_->letn=Owl_dense_matrix_generic.numeldinletn_e=Owl_dense_matrix_generic.numeleinassert(n_e=n-1);letm=Owl_dense_matrix_generic.numelwinassert(n<=m);let_kind=kindinlet_layout=Genarray.layoutdinletlayout=lapacke_layout_layoutinlete=Owl_dense_matrix_generic.resizee[|1;n|]inletldz=Stdlib.max1minletz=Genarray.create_kind_layout[|n;|]inletifailv=Genarray.createint32_layout[|1;m|]in(* TODO: cases where inputs are invalid, refer to julia implementation *)letiblock=Genarray.createint32_layout[|1;n|]inletisplit=Genarray.createint32_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarraywinlet_d=bigarray_startCtypes_static.Genarraydinlet_e=bigarray_startCtypes_static.Genarrayeinlet_z=bigarray_startCtypes_static.Genarrayzinlet_iblock=bigarray_startCtypes_static.Genarrayiblockinlet_isplit=bigarray_startCtypes_static.Genarrayisplitinlet_ifailv=bigarray_startCtypes_static.Genarrayifailvinletret=match_kindwith|Float32->L.sstein~layout~n~d:_d~e:_e~m~w:_w~iblock:_iblock~isplit:_isplit~z:_z~ldz~ifailv:_ifailv|Float64->L.dstein~layout~n~d:_d~e:_e~m~w:_w~iblock:_iblock~isplit:_isplit~z:_z~ldz~ifailv:_ifailv|Complex32->L.cstein~layout~n~d:_d~e:_e~m~w:_w~iblock:_iblock~isplit:_isplit~z:_z~ldz~ifailv:_ifailv|Complex64->L.zstein~layout~n~d:_d~e:_e~m~w:_w~iblock:_iblock~isplit:_isplit~z:_z~ldz~ifailv:_ifailv|_->failwith"lapacke:stein"incheck_lapack_errorret;z,ifailvletsyconv:typeab.uplo:char->way:char->a:(a,b)t->ipiv:(int32,int32_elt)t->(a,b)t=fun~uplo~way~a~ipiv->assert(uplo='U'||uplo='L');assert(way='C'||way='R');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinlete=Genarray.create_kind_layout[|1;n|]inlet_e=bigarray_startCtypes_static.Genarrayeinlet_a=bigarray_startCtypes_static.Genarrayainlet_ipiv=bigarray_startCtypes_static.Genarrayipivinletlda=Stdlib.max1(_stridea)inletret=match_kindwith|Float32->L.ssyconv~layout~uplo~way~n~a:_a~lda~ipiv:_ipiv~e:_e|Float64->L.dsyconv~layout~uplo~way~n~a:_a~lda~ipiv:_ipiv~e:_e|Complex32->L.csyconv~layout~uplo~way~n~a:_a~lda~ipiv:_ipiv~e:_e|Complex64->L.zsyconv~layout~uplo~way~n~a:_a~lda~ipiv:_ipiv~e:_e|_->failwith"lapacke:syconv"incheck_lapack_errorret;eletsysv:typeab.uplo:char->a:(a,b)t->b:(a,b)t->(a,b)t*(a,b)t*(int32,int32_elt)t=fun~uplo~a~b->assert(uplo='U'||uplo='L');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);assert(n=Owl_dense_matrix_generic.row_numb);letnrhs=Owl_dense_matrix_generic.col_numbinlet_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletipiv=Genarray.createint32_layout[|1;n|]inlet_ipiv=bigarray_startCtypes_static.Genarrayipivinlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinletlda=Stdlib.max1(_stridea)inletldb=Stdlib.max1(_strideb)inletret=match_kindwith|Float32->L.ssysv~layout~uplo~n~nrhs~a:_a~lda~ipiv:_ipiv~b:_b~ldb|Float64->L.dsysv~layout~uplo~n~nrhs~a:_a~lda~ipiv:_ipiv~b:_b~ldb|Complex32->L.csysv~layout~uplo~n~nrhs~a:_a~lda~ipiv:_ipiv~b:_b~ldb|Complex64->L.zsysv~layout~uplo~n~nrhs~a:_a~lda~ipiv:_ipiv~b:_b~ldb|_->failwith"lapacke:sysv"incheck_lapack_errorret;b,a,ipivletsytrf:typeab.uplo:char->a:(a,b)t->(a,b)t*(int32,int32_elt)t*int=fun~uplo~a->assert(uplo='U'||uplo='L');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletipiv=Genarray.createint32_layout[|1;n|]inlet_ipiv=bigarray_startCtypes_static.Genarrayipivinlet_a=bigarray_startCtypes_static.Genarrayainletlda=Stdlib.max1(_stridea)inletret=match_kindwith|Float32->L.ssytrf~layout~uplo~n~a:_a~lda~ipiv:_ipiv|Float64->L.dsytrf~layout~uplo~n~a:_a~lda~ipiv:_ipiv|Complex32->L.csytrf~layout~uplo~n~a:_a~lda~ipiv:_ipiv|Complex64->L.zsytrf~layout~uplo~n~a:_a~lda~ipiv:_ipiv|_->failwith"lapacke:sytrf"incheck_lapack_errorret;a,ipiv,retletsytrf_rook:typeab.uplo:char->a:(a,b)t->(a,b)t*(int32,int32_elt)t*int=fun~uplo~a->assert(uplo='U'||uplo='L');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletipiv=Genarray.createint32_layout[|1;n|]inlet_ipiv=bigarray_startCtypes_static.Genarrayipivinlet_a=bigarray_startCtypes_static.Genarrayainletlda=Stdlib.max1(_stridea)inletret=match_kindwith|Float32->L.ssytrf_rook~layout~uplo~n~a:_a~lda~ipiv:_ipiv|Float64->L.dsytrf_rook~layout~uplo~n~a:_a~lda~ipiv:_ipiv|Complex32->L.csytrf_rook~layout~uplo~n~a:_a~lda~ipiv:_ipiv|Complex64->L.zsytrf_rook~layout~uplo~n~a:_a~lda~ipiv:_ipiv|_->failwith"lapacke:sytrf_rook"incheck_lapack_errorret;a,ipiv,retletsytri:typeab.uplo:char->a:(a,b)t->(a,b)t=fun~uplo~a->assert(uplo='U'||uplo='L');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletipiv=Genarray.createint32_layout[|1;n|]inlet_ipiv=bigarray_startCtypes_static.Genarrayipivinlet_a=bigarray_startCtypes_static.Genarrayainletlda=Stdlib.max1(_stridea)inletret=match_kindwith|Float32->L.ssytri~layout~uplo~n~a:_a~lda~ipiv:_ipiv|Float64->L.dsytri~layout~uplo~n~a:_a~lda~ipiv:_ipiv|Complex32->L.csytri~layout~uplo~n~a:_a~lda~ipiv:_ipiv|Complex64->L.zsytri~layout~uplo~n~a:_a~lda~ipiv:_ipiv|_->failwith"lapacke:sytri"incheck_lapack_errorret;aletsytrs:typeab.uplo:char->a:(a,b)t->ipiv:(int32,int32_elt)t->b:(a,b)t->(a,b)t=fun~uplo~a~ipiv~b->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);assert(n=Owl_dense_matrix_generic.row_numb);letnrhs=Owl_dense_matrix_generic.col_numbinlet_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinlet_ipiv=bigarray_startCtypes_static.Genarrayipivinlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinletlda=Stdlib.max1(_stridea)inletldb=Stdlib.max1(_strideb)inletret=match_kindwith|Float32->L.ssytrs~layout~uplo~n~nrhs~a:_a~lda~ipiv:_ipiv~b:_b~ldb|Float64->L.dsytrs~layout~uplo~n~nrhs~a:_a~lda~ipiv:_ipiv~b:_b~ldb|Complex32->L.csytrs~layout~uplo~n~nrhs~a:_a~lda~ipiv:_ipiv~b:_b~ldb|Complex64->L.zsytrs~layout~uplo~n~nrhs~a:_a~lda~ipiv:_ipiv~b:_b~ldb|_->failwith"lapacke:sytrs"incheck_lapack_errorret;blethesv:typea.uplo:char->a:(Complex.t,a)t->b:(Complex.t,a)t->(Complex.t,a)t*(Complex.t,a)t*(int32,int32_elt)t=fun~uplo~a~b->assert(uplo='U'||uplo='L');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);assert(n=Owl_dense_matrix_generic.row_numb);letnrhs=Owl_dense_matrix_generic.col_numbinlet_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletipiv=Genarray.createint32_layout[|1;n|]inlet_ipiv=bigarray_startCtypes_static.Genarrayipivinlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinletlda=Stdlib.max1(_stridea)inletldb=Stdlib.max1(_strideb)inletret=match_kindwith|Complex32->L.chesv~layout~uplo~n~nrhs~a:_a~lda~ipiv:_ipiv~b:_b~ldb|Complex64->L.zhesv~layout~uplo~n~nrhs~a:_a~lda~ipiv:_ipiv~b:_b~ldbincheck_lapack_errorret;b,a,ipivlethetrf:typeab.uplo:char->a:(a,b)t->(a,b)t*(int32,int32_elt)t*int=fun~uplo~a->assert(uplo='U'||uplo='L');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletipiv=Genarray.createint32_layout[|1;n|]inlet_ipiv=bigarray_startCtypes_static.Genarrayipivinlet_a=bigarray_startCtypes_static.Genarrayainletlda=Stdlib.max1(_stridea)inletret=match_kindwith|Complex32->L.chetrf~layout~uplo~n~a:_a~lda~ipiv:_ipiv|Complex64->L.zhetrf~layout~uplo~n~a:_a~lda~ipiv:_ipiv|_->failwith"lapacke:hetrf"incheck_lapack_errorret;a,ipiv,retlethetrf_rook:typeab.uplo:char->a:(a,b)t->(a,b)t*(int32,int32_elt)t*int=fun~uplo~a->assert(uplo='U'||uplo='L');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletipiv=Genarray.createint32_layout[|1;n|]inlet_ipiv=bigarray_startCtypes_static.Genarrayipivinlet_a=bigarray_startCtypes_static.Genarrayainletlda=Stdlib.max1(_stridea)inletret=match_kindwith|Complex32->L.chetrf_rook~layout~uplo~n~a:_a~lda~ipiv:_ipiv|Complex64->L.zhetrf_rook~layout~uplo~n~a:_a~lda~ipiv:_ipiv|_->failwith"lapacke:hetrf_rook"incheck_lapack_errorret;a,ipiv,retlethetri:typea.uplo:char->a:(Complex.t,a)t->ipiv:(int32,int32_elt)t->(Complex.t,a)t=fun~uplo~a~ipiv->assert(uplo='U'||uplo='L');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinlet_ipiv=bigarray_startCtypes_static.Genarrayipivinlet_a=bigarray_startCtypes_static.Genarrayainletlda=Stdlib.max1(_stridea)inletret=match_kindwith|Complex32->L.chetri~layout~uplo~n~a:_a~lda~ipiv:_ipiv|Complex64->L.zhetri~layout~uplo~n~a:_a~lda~ipiv:_ipivincheck_lapack_errorret;alethetrs:typea.uplo:char->a:(Complex.t,a)t->ipiv:(int32,int32_elt)t->b:(Complex.t,a)t->(Complex.t,a)t=fun~uplo~a~ipiv~b->assert(uplo='U'||uplo='L');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);assert(n=Owl_dense_matrix_generic.row_numb);letnrhs=Owl_dense_matrix_generic.col_numbinlet_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinlet_ipiv=bigarray_startCtypes_static.Genarrayipivinlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinletlda=Stdlib.max1(_stridea)inletldb=Stdlib.max1(_strideb)inletret=match_kindwith|Complex32->L.chetrs~layout~uplo~n~nrhs~a:_a~lda~ipiv:_ipiv~b:_b~ldb|Complex64->L.zhetrs~layout~uplo~n~nrhs~a:_a~lda~ipiv:_ipiv~b:_b~ldbincheck_lapack_errorret;bletsyev:typea.jobz:char->uplo:char->a:(float,a)t->(float,a)t*(float,a)t=fun~jobz~uplo~a->assert(jobz='N'||jobz='V');assert(uplo='U'||uplo='L');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletw=Genarray.create_kind_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarraywinlet_a=bigarray_startCtypes_static.Genarrayainletlda=Stdlib.max1(_stridea)inletret=match_kindwith|Float32->L.ssyev~layout~jobz~uplo~n~a:_a~lda~w:_w|Float64->L.dsyev~layout~jobz~uplo~n~a:_a~lda~w:_wincheck_lapack_errorret;matchjobzwith|'V'->w,a|_->w,Genarray.create_kind_layout[|0;0|]letsyevr:typea.jobz:char->range:char->uplo:char->a:(float,a)t->vl:float->vu:float->il:int->iu:int->abstol:float->(float,a)t*(float,a)t=fun~jobz~range~uplo~a~vl~vu~il~iu~abstol->assert(jobz='N'||jobz='V');assert(range='A'||range='V'&&range='I');assert(uplo='U'||uplo='L');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinlet_=matchrangewith|'I'->assert(1<=il&&il<=iu&&iu<=n)|'V'->assert(vu<=vl)|_->()inletlda=Stdlib.max1ninletldz=matchjobzwith|'V'->Stdlib.max1m|_->1inletz=Genarray.create_kind_layout[|n;ldz|]inletw=Genarray.create_kind_layout[|1;n|]inletisuppz=Genarray.createint32_layout[|1;(2*m)|]inlet_m=Ctypes.(allocateint32_t0l)inlet_a=bigarray_startCtypes_static.Genarrayainlet_z=bigarray_startCtypes_static.Genarrayzinlet_w=bigarray_startCtypes_static.Genarraywinlet_isuppz=bigarray_startCtypes_static.Genarrayisuppzinletret=match_kindwith|Float32->L.ssyevr~layout~jobz~range~uplo~n~a:_a~lda~vl~vu~il~iu~abstol~m:_m~w:_w~z:_z~ldz~isuppz:_isuppz|Float64->L.dsyevr~layout~jobz~range~uplo~n~a:_a~lda~vl~vu~il~iu~abstol~m:_m~w:_w~z:_z~ldz~isuppz:_isuppzincheck_lapack_errorret;letm=Int32.to_int!@_minletw=Owl_dense_matrix_generic.resizew[|1;m|]inmatchjobzwith|'V'->w,Owl_dense_matrix_generic.get_slice[[];[0;m-1]]z|_->w,Genarray.create_kind_layout[|0;0|]letsygvd:typea.ityp:int->jobz:char->uplo:char->a:(float,a)t->b:(float,a)t->(float,a)t*(float,a)t*(float,a)t=fun~ityp~jobz~uplo~a~b->assert(ityp>0&&ityp<4);assert(jobz='N'||jobz='V');assert(uplo='U'||uplo='L');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletmb=Owl_dense_matrix_generic.row_numbinletnb=Owl_dense_matrix_generic.col_numbinassert(m=n&&n=mb&&n=nb);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inletldb=Stdlib.max1(_strideb)inletw=Genarray.create_kind_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarraywinlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinletret=match_kindwith|Float32->L.ssygvd~layout~ityp~jobz~uplo~n~a:_a~lda~b:_b~ldb~w:_w|Float64->L.dsygvd~layout~ityp~jobz~uplo~n~a:_a~lda~b:_b~ldb~w:_wincheck_lapack_errorret;w,a,bletbdsqr:typeab.uplo:char->d:(float,b)t->e:(float,b)t->vt:(a,b)t->u:(a,b)t->c:(a,b)t->(float,b)t*(a,b)t*(a,b)t*(a,b)t=fun~uplo~d~e~vt~u~c->assert(uplo='U'||uplo='L');letn=Owl_dense_matrix_generic.numeldinletncvt=Owl_dense_matrix_generic.col_numvtinletnru=Owl_dense_matrix_generic.row_numuinletncc=Owl_dense_matrix_generic.col_numcinassert(Owl_dense_matrix_generic.row_numvt=n);assert(Owl_dense_matrix_generic.row_numc=n);letn_e=Owl_dense_matrix_generic.numeleinassert(n_e=n-1);let_kind=Genarray.kindvtinlet_layout=Genarray.layoutvtinletlayout=lapacke_layout_layoutinletldvt=Stdlib.max1(_stridevt)inletldu=Stdlib.max1(_strideu)inletldc=Stdlib.max1nccinassert(ldvt>=ncvt);assert(ldu>=n);assert(ldc>=ncc);let_d=bigarray_startCtypes_static.Genarraydinlet_e=bigarray_startCtypes_static.Genarrayeinlet_vt=bigarray_startCtypes_static.Genarrayvtinlet_u=bigarray_startCtypes_static.Genarrayuinlet_c=bigarray_startCtypes_static.Genarraycinletret=match_kindwith|Float32->L.sbdsqr~layout~uplo~n~ncvt~nru~ncc~d:_d~e:_e~vt:_vt~ldvt~u:_u~ldu~c:_c~ldc|Float64->L.dbdsqr~layout~uplo~n~ncvt~nru~ncc~d:_d~e:_e~vt:_vt~ldvt~u:_u~ldu~c:_c~ldc|Complex32->L.cbdsqr~layout~uplo~n~ncvt~nru~ncc~d:_d~e:_e~vt:_vt~ldvt~u:_u~ldu~c:_c~ldc|Complex64->L.zbdsqr~layout~uplo~n~ncvt~nru~ncc~d:_d~e:_e~vt:_vt~ldvt~u:_u~ldu~c:_c~ldc|_->failwith"lapacke:bdsqr"incheck_lapack_errorret;d,vt,u,cletbdsdc:typea.uplo:char->compq:char->d:(float,a)t->e:(float,a)t->(float,a)t*(float,a)t*(float,a)t*(float,a)t*(float,a)t*(int32,int32_elt)t=fun~uplo~compq~d~e->assert(uplo='U'||uplo='L');assert(compq='N'||compq='P'||compq='I');letn=Owl_dense_matrix_generic.numeldinlet_kind=Genarray.kinddinlet_layout=Genarray.layoutdinletlayout=lapacke_layout_layoutinletu=matchcompqwith|'I'->Genarray.create_kind_layout[|n;n|]|_->Genarray.create_kind_layout[|0;n|]inletvt=matchcompqwith|'I'->Genarray.create_kind_layout[|n;n|]|_->Genarray.create_kind_layout[|0;n|]inletq=matchcompqwith|'P'->(letsmlsiz=100.inletn=float_of_intninletldq=Owl_maths.(n*.(11.+.2.*.smlsiz+.8.*.round(log((n/.(smlsiz+.1.)))/.(log2.))))inGenarray.create_kind_layout[|1;(Stdlib.max0(int_of_floatldq))|])|_->Genarray.create_kind_layout[|0;n|]inletiq=matchcompqwith|'P'->(letsmlsiz=100.inletn=float_of_intninletldiq=Owl_maths.(n*.(3.+.3.*.round(log(n/.(smlsiz+.1.))/.(log2.))))inGenarray.createint32_layout[|1;(Stdlib.max0(int_of_floatldiq))|])|_->Genarray.createint32_layout[|0;n|]inletldu=Stdlib.max1(_strideu)inletldvt=Stdlib.max1(_stridevt)inlet_d=bigarray_startCtypes_static.Genarraydinlet_e=bigarray_startCtypes_static.Genarrayeinlet_u=bigarray_startCtypes_static.Genarrayuinlet_vt=bigarray_startCtypes_static.Genarrayvtinlet_q=bigarray_startCtypes_static.Genarrayqinlet_iq=bigarray_startCtypes_static.Genarrayiqinletret=match_kindwith|Float32->L.sbdsdc~layout~uplo~compq~n~d:_d~e:_e~u:_u~ldu~vt:_vt~ldvt~q:_q~iq:_iq|Float64->L.dbdsdc~layout~uplo~compq~n~d:_d~e:_e~u:_u~ldu~vt:_vt~ldvt~q:_q~iq:_iqincheck_lapack_errorret;d,e,u,vt,q,iqletgecon:typeab.norm:char->a:(a,b)t->anorm:float->float=fun~norm~a~anorm->assert(norm='1'||norm='O'||norm='I');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainletrcond=ref0.inletret=match_kindwith|Float32->(let_rcond=Ctypes.(allocatefloat0.)inletr=L.sgecon~layout~norm~n~a:_a~lda~anorm~rcond:_rcondinrcond:=!@_rcond;r)|Float64->(let_rcond=Ctypes.(allocatedouble0.)inletr=L.dgecon~layout~norm~n~a:_a~lda~anorm~rcond:_rcondinrcond:=!@_rcond;r)|Complex32->(let_rcond=Ctypes.(allocatefloat0.)inletr=L.cgecon~layout~norm~n~a:_a~lda~anorm~rcond:_rcondinrcond:=!@_rcond;r)|Complex64->(let_rcond=Ctypes.(allocatedouble0.)inletr=L.zgecon~layout~norm~n~a:_a~lda~anorm~rcond:_rcondinrcond:=!@_rcond;r)|_->failwith"lapacke:gecon"incheck_lapack_errorret;!rcondletgehrd:typeab.ilo:int->ihi:int->a:(a,b)t->(a,b)t*(a,b)t=fun~ilo~ihi~a->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinlettau=Genarray.create_kind_layout[|1;(Stdlib.max1(n-1))|]inlet_tau=bigarray_startCtypes_static.Genarraytauinlet_a=bigarray_startCtypes_static.Genarrayainletlda=Stdlib.max1(_stridea)inletret=match_kindwith|Float32->L.sgehrd~layout~n~ilo~ihi~a:_a~lda~tau:_tau|Float64->L.dgehrd~layout~n~ilo~ihi~a:_a~lda~tau:_tau|Complex32->L.cgehrd~layout~n~ilo~ihi~a:_a~lda~tau:_tau|Complex64->L.zgehrd~layout~n~ilo~ihi~a:_a~lda~tau:_tau|_->failwith"lapacke:gehrd"incheck_lapack_errorret;a,tauletorghr:typea.ilo:int->ihi:int->a:(float,a)t->tau:(float,a)t->(float,a)t=fun~ilo~ihi~a~tau->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);letn_tau=Owl_dense_matrix_generic.numeltauinassert(n_tau=n-1);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinlet_tau=bigarray_startCtypes_static.Genarraytauinlet_a=bigarray_startCtypes_static.Genarrayainletlda=Stdlib.max1(_stridea)inletret=match_kindwith|Float32->L.sorghr~layout~n~ilo~ihi~a:_a~lda~tau:_tau|Float64->L.dorghr~layout~n~ilo~ihi~a:_a~lda~tau:_tauincheck_lapack_errorret;aletunghr:typea.ilo:int->ihi:int->a:(Complex.t,a)t->tau:(Complex.t,a)t->(Complex.t,a)t=fun~ilo~ihi~a~tau->letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);letn_tau=Owl_dense_matrix_generic.numeltauinassert(n_tau=n-1);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinlet_tau=bigarray_startCtypes_static.Genarraytauinlet_a=bigarray_startCtypes_static.Genarrayainletlda=Stdlib.max1(_stridea)inletret=match_kindwith|Complex32->L.cunghr~layout~n~ilo~ihi~a:_a~lda~tau:_tau|Complex64->L.zunghr~layout~n~ilo~ihi~a:_a~lda~tau:_tauincheck_lapack_errorret;aletgees:typeab.jobvs:char->a:(a,b)t->(a,b)t*(a,b)t*(a,b)t*(a,b)t=fun~jobvs~a->letsort='N'inassert(jobvs='N'||jobvs='V');assert(sort='N'||sort='S');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(m=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletvs=matchjobvswith|'V'->Genarray.create_kind_layout[|n;n|]|_->Genarray.create_kind_layout[|0;n|]inletldvs=Stdlib.max1(_stridevs)inletwr=ref(Genarray.create_kind_layout[|0;0|])inletwi=ref(Genarray.create_kind_layout[|0;0|])inlet_select=Ctypes.nullinlet_sdim=Ctypes.(allocateint32_t0l)inlet_vs=bigarray_startCtypes_static.Genarrayvsinlet_a=bigarray_startCtypes_static.Genarrayainletlda=Stdlib.max1(_stridea)inletret=match_kindwith|Float32->(letwr'=Genarray.create_kind_layout[|1;n|]inlet_wr=bigarray_startCtypes_static.Genarraywr'inletwi'=Genarray.create_kind_layout[|1;n|]inlet_wi=bigarray_startCtypes_static.Genarraywi'inletr=L.sgees~layout~jobvs~sort~select:_select~n~a:_a~lda~sdim:_sdim~wr:_wr~wi:_wi~vs:_vs~ldvsinwr:=wr';wi:=wi';r)|Float64->(letwr'=Genarray.create_kind_layout[|1;n|]inlet_wr=bigarray_startCtypes_static.Genarraywr'inletwi'=Genarray.create_kind_layout[|1;n|]inlet_wi=bigarray_startCtypes_static.Genarraywi'inletr=L.dgees~layout~jobvs~sort~select:_select~n~a:_a~lda~sdim:_sdim~wr:_wr~wi:_wi~vs:_vs~ldvsinwr:=wr';wi:=wi';r)|Complex32->(letw'=Genarray.create_kind_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarrayw'inletr=L.cgees~layout~jobvs~sort~select:_select~n~a:_a~lda~sdim:_sdim~w:_w~vs:_vs~ldvsinwr:=w';wi:=w';r)|Complex64->(letw'=Genarray.create_kind_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarrayw'inletr=L.zgees~layout~jobvs~sort~select:_select~n~a:_a~lda~sdim:_sdim~w:_w~vs:_vs~ldvsinwr:=w';wi:=w';r)|_->failwith"lapacke:gees"incheck_lapack_errorret;(* NOTE: wr and wi are the same for complex flavour *)a,vs,!wr,!wiletgges:typeab.jobvsl:char->jobvsr:char->a:(a,b)t->b:(a,b)t->(a,b)t*(a,b)t*(a,b)t*(a,b)t*(a,b)t*(a,b)t*(a,b)t=fun~jobvsl~jobvsr~a~b->letsort='N'inassert(jobvsl='N'||jobvsl='V');assert(jobvsr='N'||jobvsr='V');assert(sort='N'||sort='S');letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletmb=Owl_dense_matrix_generic.row_numbinletnb=Owl_dense_matrix_generic.col_numbinassert(m=n&&n=mb&&mb=nb);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletvsl=matchjobvslwith|'V'->Genarray.create_kind_layout[|n;n|]|_->Genarray.create_kind_layout[|0;n|]inletvsr=matchjobvsrwith|'V'->Genarray.create_kind_layout[|n;n|]|_->Genarray.create_kind_layout[|0;n|]inletldvsl=Stdlib.max1(_stridevsl)inletldvsr=Stdlib.max1(_stridevsr)inletalphar=ref(Genarray.create_kind_layout[|0;0|])inletalphai=ref(Genarray.create_kind_layout[|0;0|])inletbeta=Genarray.create_kind_layout[|1;n|]inletlda=Stdlib.max1(_stridea)inletldb=Stdlib.max1(_strideb)inlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinlet_vsl=bigarray_startCtypes_static.Genarrayvslinlet_vsr=bigarray_startCtypes_static.Genarrayvsrinlet_beta=bigarray_startCtypes_static.Genarraybetainlet_selctg=Ctypes.nullinlet_sdim=Ctypes.(allocateint32_t0l)inletret=match_kindwith|Float32->(letalphar'=Genarray.create_kind_layout[|1;n|]inlet_alphar=bigarray_startCtypes_static.Genarrayalphar'inletalphai'=Genarray.create_kind_layout[|1;n|]inlet_alphai=bigarray_startCtypes_static.Genarrayalphai'inletr=L.sgges~layout~jobvsl~jobvsr~sort~selctg:_selctg~n~a:_a~lda~b:_b~ldb~sdim:_sdim~alphar:_alphar~alphai:_alphai~beta:_beta~vsl:_vsl~ldvsl~vsr:_vsr~ldvsrinalphar:=alphar';alphai:=alphai';r)|Float64->(letalphar'=Genarray.create_kind_layout[|1;n|]inlet_alphar=bigarray_startCtypes_static.Genarrayalphar'inletalphai'=Genarray.create_kind_layout[|1;n|]inlet_alphai=bigarray_startCtypes_static.Genarrayalphai'inletr=L.dgges~layout~jobvsl~jobvsr~sort~selctg:_selctg~n~a:_a~lda~b:_b~ldb~sdim:_sdim~alphar:_alphar~alphai:_alphai~beta:_beta~vsl:_vsl~ldvsl~vsr:_vsr~ldvsrinalphar:=alphar';alphai:=alphai';r)|Complex32->(letalpha'=Genarray.create_kind_layout[|1;n|]inletalpha=bigarray_startCtypes_static.Genarrayalpha'inletr=L.cgges~layout~jobvsl~jobvsr~sort~selctg:_selctg~n~a:_a~lda~b:_b~ldb~sdim:_sdim~alpha~beta:_beta~vsl:_vsl~ldvsl~vsr:_vsr~ldvsrinalphar:=alpha';alphai:=alpha';r)|Complex64->(letalpha'=Genarray.create_kind_layout[|1;n|]inletalpha=bigarray_startCtypes_static.Genarrayalpha'inletr=L.zgges~layout~jobvsl~jobvsr~sort~selctg:_selctg~n~a:_a~lda~b:_b~ldb~sdim:_sdim~alpha~beta:_beta~vsl:_vsl~ldvsl~vsr:_vsr~ldvsrinalphar:=alpha';alphai:=alpha';r)|_->failwith"lapacke:gges"incheck_lapack_errorret;(* NOTE: alphar and alphai are the same for complex flavour *)a,b,!alphar,!alphai,beta,vsl,vsrlettrexc:typeab.compq:char->t:(a,b)t->q:(a,b)t->ifst:int->ilst:int->(a,b)t*(a,b)t=fun~compq~t~q~ifst~ilst->assert(compq='N'||compq='V');letm=Owl_dense_matrix_generic.row_numtinletn=Owl_dense_matrix_generic.col_numtinassert(m=n);assert(1<=ifst&&ifst<=n);assert(1<=ilst&&ilst<=n);let_kind=Genarray.kindtinlet_layout=Genarray.layouttinletlayout=lapacke_layout_layoutinletldt=Stdlib.max1(_stridet)inletldq=Stdlib.max1(_strideq)inlet_t=bigarray_startCtypes_static.Genarraytinlet_q=bigarray_startCtypes_static.Genarrayqinlet_ifst=Ctypes.(allocateint32_t(Int32.of_intifst))inlet_ilst=Ctypes.(allocateint32_t(Int32.of_intilst))inletret=match_kindwith|Float32->L.strexc~layout~compq~n~t:_t~ldt~q:_q~ldq~ifst:_ifst~ilst:_ilst|Float64->L.dtrexc~layout~compq~n~t:_t~ldt~q:_q~ldq~ifst:_ifst~ilst:_ilst|Complex32->L.ctrexc~layout~compq~n~t:_t~ldt~q:_q~ldq~ifst~ilst|Complex64->L.ztrexc~layout~compq~n~t:_t~ldt~q:_q~ldq~ifst~ilst|_->failwith"lapacke:trexc"incheck_lapack_errorret;t,qlettrsen:typeab.job:char->compq:char->select:(int32,int32_elt)t->t:(a,b)t->q:(a,b)t->(a,b)t*(a,b)t*(a,b)t*(a,b)t=fun~job~compq~select~t~q->assert(job='N'||job='E'||job='V'||job='B');assert(compq='N'||compq='V');letmt=Owl_dense_matrix_generic.row_numtinletn=Owl_dense_matrix_generic.col_numtinassert(mt=n);let_kind=Genarray.kindtinlet_layout=Genarray.layouttinletlayout=lapacke_layout_layoutinletldt=Stdlib.max1(_stridet)inletldq=Stdlib.max1(_strideq)inlet_t=bigarray_startCtypes_static.Genarraytinlet_q=bigarray_startCtypes_static.Genarrayqinletwr=ref(Genarray.create_kind_layout[|0;0|])inletwi=ref(Genarray.create_kind_layout[|0;0|])inlet_select=bigarray_startCtypes_static.Genarrayselectinlet_m=Ctypes.(allocateint32_t0l)inletret=match_kindwith|Float32->(letwr'=Genarray.create_kind_layout[|1;n|]inlet_wr=bigarray_startCtypes_static.Genarraywr'inletwi'=Genarray.create_kind_layout[|1;n|]inlet_wi=bigarray_startCtypes_static.Genarraywi'inlet_s=Ctypes.(allocatefloat0.)inlet_sep=Ctypes.(allocatefloat0.)inletr=L.strsen~layout~job~compq~select:_select~n~t:_t~ldt~q:_q~ldq~wr:_wr~wi:_wi~m:_m~s:_s~sep:_sepinwr:=wr';wi:=wi';r)|Float64->(letwr'=Genarray.create_kind_layout[|1;n|]inlet_wr=bigarray_startCtypes_static.Genarraywr'inletwi'=Genarray.create_kind_layout[|1;n|]inlet_wi=bigarray_startCtypes_static.Genarraywi'inlet_s=Ctypes.(allocatedouble0.)inlet_sep=Ctypes.(allocatedouble0.)inletr=L.dtrsen~layout~job~compq~select:_select~n~t:_t~ldt~q:_q~ldq~wr:_wr~wi:_wi~m:_m~s:_s~sep:_sepinwr:=wr';wi:=wi';r)|Complex32->(letw'=Genarray.create_kind_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarrayw'inlet_s=Ctypes.(allocatefloat0.)inlet_sep=Ctypes.(allocatefloat0.)inletr=L.ctrsen~layout~job~compq~select:_select~n~t:_t~ldt~q:_q~ldq~w:_w~m:_m~s:_s~sep:_sepinwr:=w';wi:=w';r)|Complex64->(letw'=Genarray.create_kind_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarrayw'inlet_s=Ctypes.(allocatefloat0.)inlet_sep=Ctypes.(allocatefloat0.)inletr=L.ztrsen~layout~job~compq~select:_select~n~t:_t~ldt~q:_q~ldq~w:_w~m:_m~s:_s~sep:_sepinwr:=w';wi:=w';r)|_->failwith"lapacke:trsen"incheck_lapack_errorret;(* NOTE: wr and wi are the same for complex flavour *)t,q,!wr,!wilettgsen:typeab.select:(int32,int32_elt)t->a:(a,b)t->b:(a,b)t->q:(a,b)t->z:(a,b)t->(a,b)t*(a,b)t*(a,b)t*(a,b)t*(a,b)t*(a,b)t*(a,b)t=fun~select~a~b~q~z->(* set these values by default *)letijob=0inletwantq=1inletwantz=1inassert(0<=ijob&&ijob<=5);assert(wantq=0||wantq=1);assert(wantz=0||wantz=1);letma=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainassert(ma=n);letmb=Owl_dense_matrix_generic.row_numbinletnb=Owl_dense_matrix_generic.col_numbinassert(mb=nb);letmq=Owl_dense_matrix_generic.row_numqinletnq=Owl_dense_matrix_generic.col_numqinassert(mq=nq);letmz=Owl_dense_matrix_generic.row_numzinletnz=Owl_dense_matrix_generic.col_numzinassert(mz=nz);assert(n=nb);assert(n=nq);assert(n=nz);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inletldb=Stdlib.max1(_strideb)inletldq=Stdlib.max1(_strideq)inletldz=Stdlib.max1(_stridez)inlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinlet_q=bigarray_startCtypes_static.Genarrayqinlet_z=bigarray_startCtypes_static.Genarrayzinletalphar=ref(Genarray.create_kind_layout[|0;0|])inletalphai=ref(Genarray.create_kind_layout[|0;0|])inletbeta=Genarray.create_kind_layout[|1;n|]inlet_beta=bigarray_startCtypes_static.Genarraybetainlet_select=bigarray_startCtypes_static.Genarrayselectin(* FIXME: not sure summation is really needed *)letm=ref0linfori=0toOwl_dense_matrix_generic.col_numselect-1dom:=Int32.add!m(Owl_dense_matrix_generic.getselect0i)done;let_m=Ctypes.(allocateint32_t!m)inletret=match_kindwith|Float32->(letalphar'=Genarray.create_kind_layout[|1;n|]inlet_alphar=bigarray_startCtypes_static.Genarrayalphar'inletalphai'=Genarray.create_kind_layout[|1;n|]inlet_alphai=bigarray_startCtypes_static.Genarrayalphai'inlet_pl=Ctypes.(allocatefloat0.)inlet_pr=Ctypes.(allocatefloat0.)inletdif=Genarray.createfloat32_layout[|1;2|]inlet_dif=bigarray_startCtypes_static.Genarraydifinletr=L.stgsen~layout~ijob~wantq~wantz~select:_select~n~a:_a~lda~b:_b~ldb~alphar:_alphar~alphai:_alphai~beta:_beta~q:_q~ldq~z:_z~ldz~m:_m~pl:_pl~pr:_pr~dif:_difinalphar:=alphar';alphai:=alphai';r)|Float64->(letalphar'=Genarray.create_kind_layout[|1;n|]inlet_alphar=bigarray_startCtypes_static.Genarrayalphar'inletalphai'=Genarray.create_kind_layout[|1;n|]inlet_alphai=bigarray_startCtypes_static.Genarrayalphai'inlet_pl=Ctypes.(allocatedouble0.)inlet_pr=Ctypes.(allocatedouble0.)inletdif=Genarray.createfloat64_layout[|1;2|]inlet_dif=bigarray_startCtypes_static.Genarraydifinletr=L.dtgsen~layout~ijob~wantq~wantz~select:_select~n~a:_a~lda~b:_b~ldb~alphar:_alphar~alphai:_alphai~beta:_beta~q:_q~ldq~z:_z~ldz~m:_m~pl:_pl~pr:_pr~dif:_difinalphar:=alphar';alphai:=alphai';r)|Complex32->(letalpha'=Genarray.create_kind_layout[|1;n|]inletalpha=bigarray_startCtypes_static.Genarrayalpha'inlet_pl=Ctypes.(allocatefloat0.)inlet_pr=Ctypes.(allocatefloat0.)inletdif=Genarray.createfloat32_layout[|1;2|]inlet_dif=bigarray_startCtypes_static.Genarraydifinletr=L.ctgsen~layout~ijob~wantq~wantz~select:_select~n~a:_a~lda~b:_b~ldb~alpha~beta:_beta~q:_q~ldq~z:_z~ldz~m:_m~pl:_pl~pr:_pr~dif:_difinalphar:=alpha';alphai:=alpha';r)|Complex64->(letalpha'=Genarray.create_kind_layout[|1;n|]inletalpha=bigarray_startCtypes_static.Genarrayalpha'inlet_pl=Ctypes.(allocatedouble0.)inlet_pr=Ctypes.(allocatedouble0.)inletdif=Genarray.createfloat64_layout[|1;2|]inlet_dif=bigarray_startCtypes_static.Genarraydifinletr=L.ztgsen~layout~ijob~wantq~wantz~select:_select~n~a:_a~lda~b:_b~ldb~alpha~beta:_beta~q:_q~ldq~z:_z~ldz~m:_m~pl:_pl~pr:_pr~dif:_difinalphar:=alpha';alphai:=alpha';r)|_->failwith"lapacke:tgsen"incheck_lapack_errorret;(* NOTE: alphar and alphai are the same for complex flavour *)a,b,!alphar,!alphai,beta,q,zlettrsyl:typeab.trana:char->tranb:char->isgn:int->a:(a,b)t->b:(a,b)t->c:(a,b)t->(a,b)t*float=fun~trana~tranb~isgn~a~b~c->assert(trana='N'||trana='T'||trana='C');assert(tranb='N'||tranb='T'||tranb='C');assert(isgn=-1||isgn=+1);letm=Owl_dense_matrix_generic.row_numainletn=Owl_dense_matrix_generic.col_numainletmb=Owl_dense_matrix_generic.row_numbinletnb=Owl_dense_matrix_generic.col_numbinletmc=Owl_dense_matrix_generic.row_numcinletnc=Owl_dense_matrix_generic.col_numcinassert(m=n);assert(mb=nb);assert(mc=m&&nc=n);let_kind=Genarray.kindainlet_layout=Genarray.layoutainletlayout=lapacke_layout_layoutinletlda=Stdlib.max1(_stridea)inletldb=Stdlib.max1(_strideb)inletldc=Stdlib.max1(_stridec)inlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinlet_c=bigarray_startCtypes_static.Genarraycinletscale=ref0.inletret=match_kindwith|Float32->(let_scale=Ctypes.(allocatefloat0.)inletr=L.strsyl~layout~trana~tranb~isgn~m~n~a:_a~lda~b:_b~ldb~c:_c~ldc~scale:_scaleinscale:=!@_scale;r)|Float64->(let_scale=Ctypes.(allocatedouble0.)inletr=L.dtrsyl~layout~trana~tranb~isgn~m~n~a:_a~lda~b:_b~ldb~c:_c~ldc~scale:_scaleinscale:=!@_scale;r)|Complex32->(let_scale=Ctypes.(allocatefloat0.)inletr=L.ctrsyl~layout~trana~tranb~isgn~m~n~a:_a~lda~b:_b~ldb~c:_c~ldc~scale:_scaleinscale:=!@_scale;r)|Complex64->(let_scale=Ctypes.(allocatedouble0.)inletr=L.ztrsyl~layout~trana~tranb~isgn~m~n~a:_a~lda~b:_b~ldb~c:_c~ldc~scale:_scaleinscale:=!@_scale;r)|_->failwith"lapacke:trsyl"incheck_lapack_errorret;c,!scale(* ends here *)