12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770# 1 "src/owl/lapacke/owl_lapacke.ml"(*
* OWL - an OCaml numerical library for scientific computing
* Copyright (c) 2016-2018 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
*)openCtypesopenBigarrayopenOwl_typesmoduleL=Owl_lapacke_generatedtype('a,'b)t=('a,'b,c_layout)Genarray.ttypes_t=(float,Bigarray.float32_elt)ttyped_t=(float,Bigarray.float64_elt)ttypec_t=(Complex.t,Bigarray.complex32_elt)ttypez_t=(Complex.t,Bigarray.complex64_elt)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|Lowerletlapacke_uplo=functionUpper->121|Lower->122typelapacke_diag=NonUnit|Unitletlapacke_diag=functionNonUnit->131|Unit->132typelapacke_side=Left|Rightletlapacke_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)letgbtrf: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=Pervasives.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.sgbtrflayoutmnklku_abldab_ipiv|Float64->L.dgbtrflayoutmnklku_abldab_ipiv|Complex32->L.cgbtrflayoutmnklku_abldab_ipiv|Complex64->L.zgbtrflayoutmnklku_abldab_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.sgbtrslayouttransnklkunrhs_abldab_ipiv_bldb|Float64->L.dgbtrslayouttransnklkunrhs_abldab_ipiv_bldb|Complex32->L.cgbtrslayouttransnklkunrhs_abldab_ipiv_bldb|Complex64->L.zgbtrslayouttransnklkunrhs_abldab_ipiv_bldb|_->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.sgeballayoutjobn_alda_ilo_ihi_scaleinscale:=scale';r)|Float64->(letscale'=Genarray.createfloat64_layout[|1;n|]inlet_scale=bigarray_startCtypes_static.Genarrayscale'inletr=L.dgeballayoutjobn_alda_ilo_ihi_scaleinscale:=scale';r)|Complex32->(letscale'=Genarray.createfloat32_layout[|1;n|]inlet_scale=bigarray_startCtypes_static.Genarrayscale'inletr=L.cgeballayoutjobn_alda_ilo_ihi_scaleinscale:=Owl_dense_matrix_generic.cast_s2cscale';r)|Complex64->(letscale'=Genarray.createfloat64_layout[|1;n|]inlet_scale=bigarray_startCtypes_static.Genarrayscale'inletr=L.zgeballayoutjobn_alda_ilo_ihi_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.sgebaklayoutjobsideniloihiscalem_vldv|Float64->L.dgebaklayoutjobsideniloihiscalem_vldv|Complex32->L.cgebaklayoutjobsideniloihiscalem_vldv|Complex64->L.zgebaklayoutjobsideniloihiscalem_vldv|_->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=Pervasives.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.sgebrdlayoutmn_alda_d_e_tauq_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.dgebrdlayoutmn_alda_d_e_tauq_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.cgebrdlayoutmn_alda_d_e_tauq_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.zgebrdlayoutmn_alda_d_e_tauq_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=Pervasives.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.sgelqflayoutmn_alda_tau|Float64->L.dgelqflayoutmn_alda_tau|Complex32->L.cgelqflayoutmn_alda_tau|Complex64->L.zgelqflayoutmn_alda_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=Pervasives.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.sgeqlflayoutmn_alda_tau|Float64->L.dgeqlflayoutmn_alda_tau|Complex32->L.cgeqlflayoutmn_alda_tau|Complex64->L.zgeqlflayoutmn_alda_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=Pervasives.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.sgeqrflayoutmn_alda_tau|Float64->L.dgeqrflayoutmn_alda_tau|Complex32->L.cgeqrflayoutmn_alda_tau|Complex64->L.zgeqrflayoutmn_alda_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=Pervasives.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.sgerqflayoutmn_alda_tau|Float64->L.dgerqflayoutmn_alda_tau|Complex32->L.cgerqflayoutmn_alda_tau|Complex64->L.zgerqflayoutmn_alda_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=Pervasives.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.sgeqp3layoutmn_alda_jpvt_tau|Float64->L.dgeqp3layoutmn_alda_jpvt_tau|Complex32->L.cgeqp3layoutmn_alda_jpvt_tau|Complex64->L.zgeqp3layoutmn_alda_jpvt_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=Pervasives.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=Pervasives.max1(_stridea)inletldt=Pervasives.max1(_stridet)inletret=match_kindwith|Float32->L.sgeqrtlayoutmnnb_alda_tldt|Float64->(Genarray.fillt0.7;L.dgeqrtlayoutmnnb_alda_tldt)|Complex32->L.cgeqrtlayoutmnnb_alda_tldt|Complex64->L.zgeqrtlayoutmnnb_alda_tldt|_->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=Pervasives.max1(_stridea)inletldt=Pervasives.max1(_stridet)inletret=match_kindwith|Float32->L.sgeqrt3layoutmn_alda_tldt|Float64->L.dgeqrt3layoutmn_alda_tldt|Complex32->L.cgeqrt3layoutmn_alda_tldt|Complex64->L.zgeqrt3layoutmn_alda_tldt|_->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=Pervasives.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=Pervasives.max1(_stridea)inletret=match_kindwith|Float32->L.sgetrflayoutmn_alda_ipiv|Float64->L.dgetrflayoutmn_alda_ipiv|Complex32->L.cgetrflayoutmn_alda_ipiv|Complex64->L.zgetrflayoutmn_alda_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=Pervasives.max1(_stridea)inletret=match_kindwith|Float32->L.stzrzflayoutmn_alda_tau|Float64->L.dtzrzflayoutmn_alda_tau|Complex32->L.ctzrzflayoutmn_alda_tau|Complex64->L.ztzrzflayoutmn_alda_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=Pervasives.max1(_stridea)inletldc=Pervasives.max1(_stridec)inletret=match_kindwith|Float32->L.sormrzlayoutsidetransmnkl_alda_tau_cldc|Float64->L.dormrzlayoutsidetransmnkl_alda_tau_cldcincheck_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=Pervasives.maxmninletb=matchmb<lwith|true->Owl_dense_matrix_generic.resizeb[|l;nb|]|false->binletnrhs=nbinlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinletlda=Pervasives.max1(_stridea)inletldb=Pervasives.max1(_strideb)inletret=match_kindwith|Float32->L.sgelslayouttransmnnrhs_alda_bldb|Float64->L.dgelslayouttransmnnrhs_alda_bldb|Complex32->L.cgelslayouttransmnnrhs_alda_bldb|Complex64->L.zgelslayouttransmnnrhs_alda_bldb|_->failwith"lapacke:gels"incheck_lapack_errorret;letk=Pervasives.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=Pervasives.max1(_stridea)inletldb=Pervasives.max1(_strideb)inletipiv=Genarray.createint32_layout[|1;n|]inlet_ipiv=bigarray_startCtypes_static.Genarrayipivinletret=match_kindwith|Float32->L.sgesvlayoutnnrhs_alda_ipiv_bldb|Float64->L.dgesvlayoutnnrhs_alda_ipiv_bldb|Complex32->L.cgesvlayoutnnrhs_alda_ipiv_bldb|Complex64->L.zgesvlayoutnnrhs_alda_ipiv_bldb|_->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=Pervasives.max1(_stridea)inletldb=Pervasives.max1(_strideb)inletret=match_kindwith|Float32->L.sgetrslayouttransnnrhs_alda_ipiv_bldb|Float64->L.dgetrslayouttransnnrhs_alda_ipiv_bldb|Complex32->L.cgetrslayouttransnnrhs_alda_ipiv_bldb|Complex64->L.zgetrslayouttransnnrhs_alda_ipiv_bldb|_->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=Pervasives.max1(_stridea)inletret=match_kindwith|Float32->L.sgetrilayoutn_alda_ipiv|Float64->L.dgetrilayoutn_alda_ipiv|Complex32->L.cgetrilayoutn_alda_ipiv|Complex64->L.zgetrilayoutn_alda_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=Pervasives.max1(_stridea)inletldb=Pervasives.max1(_strideb)inletldaf=Pervasives.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=Pervasives.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.sgesvxlayoutfacttransnnrhs_alda_afldaf_ipiv_equed_r_c_bldb_xldx_rcond_ferr_berr_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.dgesvxlayoutfacttransnnrhs_alda_afldaf_ipiv_equed_r_c_bldb_xldx_rcond_ferr_berr_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.cgesvxlayoutfacttransnnrhs_alda_afldaf_ipiv_equed_r_c_bldb_xldx_rcond_ferr_berr_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.zgesvxlayoutfacttransnnrhs_alda_afldaf_ipiv_equed_r_c_bldb_xldx_rcond_ferr_berr_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=Pervasives.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=Pervasives.max1(_stridea)inletldb=Pervasives.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.sgelsdlayoutmnnrhs_alda_bldb_srcond_rank)|Float64->(lets=Genarray.createfloat64_layout[|1;minmn|]inlet_s=bigarray_startCtypes_static.GenarraysinL.dgelsdlayoutmnnrhs_alda_bldb_srcond_rank)|Complex32->(lets=Genarray.createfloat32_layout[|1;minmn|]inlet_s=bigarray_startCtypes_static.GenarraysinL.cgelsdlayoutmnnrhs_alda_bldb_srcond_rank)|Complex64->(lets=Genarray.createfloat64_layout[|1;minmn|]inlet_s=bigarray_startCtypes_static.GenarraysinL.zgelsdlayoutmnnrhs_alda_bldb_srcond_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=Pervasives.max1(_stridea)inletldb=Pervasives.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.sgelsylayoutmnnrhs_alda_bldb_jpvtrcond_rank|Float64->L.dgelsylayoutmnnrhs_alda_bldb_jpvtrcond_rank|Complex32->L.cgelsylayoutmnnrhs_alda_bldb_jpvtrcond_rank|Complex64->L.zgelsylayoutmnnrhs_alda_bldb_jpvtrcond_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=Pervasives.max1(_stridea)inletldb=Pervasives.max1(_strideb)inletret=match_kindwith|Float32->L.sgglselayoutmnp_alda_bldb_c_d_x|Float64->L.dgglselayoutmnp_alda_bldb_c_d_x|Complex32->L.cgglselayoutmnp_alda_bldb_c_d_x|Complex64->L.zgglselayoutmnp_alda_bldb_c_d_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=Pervasives.max1(_stridea)inletldvl=Pervasives.max1(_stridevl)inletldvr=Pervasives.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.sgeevlayoutjobvljobvrn_alda_wr_wi_vlldvl_vrldvrinwr:=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.dgeevlayoutjobvljobvrn_alda_wr_wi_vlldvl_vrldvrinwr:=wr';wi:=wi';r)|Complex32->(letw'=Genarray.create_kind_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarrayw'inletr=L.cgeevlayoutjobvljobvrn_alda_w_vlldvl_vrldvrinwr:=w';wi:=w';r)|Complex64->(letw'=Genarray.create_kind_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarrayw'inletr=L.cgeevlayoutjobvljobvrn_alda_w_vlldvl_vrldvrinwr:=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=Pervasives.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=Pervasives.max1(_stridea)inletldu=Pervasives.max1(_strideu)inletldvt=Pervasives.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.sgesddlayoutjobzmn_alda_s_uldu_vtldvtins:=s';r)|Float64->(lets'=Genarray.createfloat64_layout[|1;minmn|]inlet_s=bigarray_startCtypes_static.Genarrays'inletr=L.dgesddlayoutjobzmn_alda_s_uldu_vtldvtins:=s';r)|Complex32->(lets'=Genarray.createfloat32_layout[|1;minmn|]inlet_s=bigarray_startCtypes_static.Genarrays'inletr=L.cgesddlayoutjobzmn_alda_s_uldu_vtldvtins:=Owl_dense_matrix_generic.cast_s2cs';r)|Complex64->(lets'=Genarray.createfloat64_layout[|1;minmn|]inlet_s=bigarray_startCtypes_static.Genarrays'inletr=L.zgesddlayoutjobzmn_alda_s_uldu_vtldvtins:=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=Pervasives.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=Pervasives.max1(_stridea)inletldu=Pervasives.max1(_strideu)inletldvt=Pervasives.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.sgesvdlayoutjobujobvtmn_alda_s_uldu_vtldvtsuperbins:=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.dgesvdlayoutjobujobvtmn_alda_s_uldu_vtldvtsuperbins:=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.cgesvdlayoutjobujobvtmn_alda_s_uldu_vtldvtsuperbins:=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.zgesvdlayoutjobujobvtmn_alda_s_uldu_vtldvtsuperbins:=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=Pervasives.max1(_stridea)inletldb=Pervasives.max1(_strideb)inletldu=Pervasives.max1minletldv=Pervasives.max1pinletldq=Pervasives.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.sggsvd3layoutjobujobvjobqmnp_k_l_alda_bldb_alpha_beta_uldu_vldv_qldq_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.dggsvd3layoutjobujobvjobqmnp_k_l_alda_bldb_alpha_beta_uldu_vldv_qldq_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.cggsvd3layoutjobujobvjobqmnp_k_l_alda_bldb_alpha_beta_uldu_vldv_qldq_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.zggsvd3layoutjobujobvjobqmnp_k_l_alda_bldb_alpha_beta_uldu_vldv_qldq_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=Pervasives.max1(_stridevl)inletldvr=Pervasives.max1(_stridevr)inlet_ilo=Ctypes.(allocateint32_t0l)inlet_ihi=Ctypes.(allocateint32_t0l)inletlda=Pervasives.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.sgeevxlayoutbalancjobvljobvrsensen_alda_wr_wi_vlldvl_vrldvr_ilo_ihi_scale_abnrm_rconde_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.dgeevxlayoutbalancjobvljobvrsensen_alda_wr_wi_vlldvl_vrldvr_ilo_ihi_scale_abnrm_rconde_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.cgeevxlayoutbalancjobvljobvrsensen_alda_w_vlldvl_vrldvr_ilo_ihi_scale_abnrm_rconde_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.zgeevxlayoutbalancjobvljobvrsensen_alda_w_vlldvl_vrldvr_ilo_ihi_scale_abnrm_rconde_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=Pervasives.max1(_stridea)inletldb=Pervasives.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.sggevlayoutjobvljobvrn_alda_bldb_alphar_alphai_beta_vlldvl_vrldvrinalphar:=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.dggevlayoutjobvljobvrn_alda_bldb_alphar_alphai_beta_vlldvl_vrldvrinalphar:=alphar';alphai:=alphai';r)|Complex32->(letalpha'=Genarray.create_kind_layout[|1;n|]inlet_alpha=bigarray_startCtypes_static.Genarrayalpha'inletr=L.cggevlayoutjobvljobvrn_alda_bldb_alpha_beta_vlldvl_vrldvrinalphar:=alpha';alphai:=alpha';r)|Complex64->(letalpha'=Genarray.create_kind_layout[|1;n|]inlet_alpha=bigarray_startCtypes_static.Genarrayalpha'inletr=L.cggevlayoutjobvljobvrn_alda_bldb_alpha_beta_vlldvl_vrldvrinalphar:=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=Pervasives.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.sgtsvlayoutnnrhs_dl_d_du_bldb|Float64->L.dgtsvlayoutnnrhs_dl_d_du_bldb|Complex32->L.cgtsvlayoutnnrhs_dl_d_du_bldb|Complex64->L.zgtsvlayoutnnrhs_dl_d_du_bldb|_->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.sgttrfn_dl_d_du_du2_ipiv|Float64->L.dgttrfn_dl_d_du_du2_ipiv|Complex32->L.cgttrfn_dl_d_du_du2_ipiv|Complex64->L.zgttrfn_dl_d_du_du2_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=Pervasives.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.sgttrslayouttransnnrhs_dl_d_du_du2_ipiv_bldb|Float64->L.dgttrslayouttransnnrhs_dl_d_du_du2_ipiv_bldb|Complex32->L.cgttrslayouttransnnrhs_dl_d_du_du2_ipiv_bldb|Complex64->L.zgttrslayouttransnnrhs_dl_d_du_du2_ipiv_bldb|_->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=Pervasives.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=Pervasives.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainlet_tau=bigarray_startCtypes_static.Genarraytauinletret=match_kindwith|Float32->L.sorglqlayoutminmnnk_alda_tau|Float64->L.dorglqlayoutminmnnk_alda_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=Pervasives.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=Pervasives.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainlet_tau=bigarray_startCtypes_static.Genarraytauinletret=match_kindwith|Complex32->L.cunglqlayoutminmnnk_alda_tau|Complex64->L.zunglqlayoutminmnnk_alda_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=Pervasives.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=Pervasives.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainlet_tau=bigarray_startCtypes_static.Genarraytauinletret=match_kindwith|Float32->L.sorgqrlayoutmminmnk_alda_tau|Float64->L.dorgqrlayoutmminmnk_alda_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=Pervasives.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=Pervasives.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainlet_tau=bigarray_startCtypes_static.Genarraytauinletret=match_kindwith|Complex32->L.cungqrlayoutmminmnk_alda_tau|Complex64->L.zungqrlayoutmminmnk_alda_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=Pervasives.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=Pervasives.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainlet_tau=bigarray_startCtypes_static.Genarraytauinletret=match_kindwith|Float32->L.sorgqllayoutmminmnk_alda_tau|Float64->L.dorgqllayoutmminmnk_alda_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=Pervasives.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=Pervasives.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainlet_tau=bigarray_startCtypes_static.Genarraytauinletret=match_kindwith|Float32->L.sorgrqlayoutmminmnk_alda_tau|Float64->L.dorgrqlayoutmminmnk_alda_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=Pervasives.max1(_stridea)inletldc=Pervasives.max1(_stridec)inlet_a=bigarray_startCtypes_static.Genarrayainlet_c=bigarray_startCtypes_static.Genarraycinlet_tau=bigarray_startCtypes_static.Genarraytauinletret=match_kindwith|Float32->L.sormlqlayoutsidetransmnk_alda_tau_cldc|Float64->L.dormlqlayoutsidetransmnk_alda_tau_cldcincheck_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=Pervasives.max1(_stridea)inletldc=Pervasives.max1(_stridec)inlet_a=bigarray_startCtypes_static.Genarrayainlet_c=bigarray_startCtypes_static.Genarraycinlet_tau=bigarray_startCtypes_static.Genarraytauinletret=match_kindwith|Float32->L.sormqrlayoutsidetransmnk_alda_tau_cldc|Float64->L.dormqrlayoutsidetransmnk_alda_tau_cldcincheck_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=Pervasives.max1(_stridea)inletldc=Pervasives.max1(_stridec)inlet_a=bigarray_startCtypes_static.Genarrayainlet_c=bigarray_startCtypes_static.Genarraycinlet_tau=bigarray_startCtypes_static.Genarraytauinletret=match_kindwith|Float32->L.sormqllayoutsidetransmnk_alda_tau_cldc|Float64->L.dormqllayoutsidetransmnk_alda_tau_cldcincheck_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=Pervasives.max1(_stridea)inletldc=Pervasives.max1(_stridec)inlet_a=bigarray_startCtypes_static.Genarrayainlet_c=bigarray_startCtypes_static.Genarraycinlet_tau=bigarray_startCtypes_static.Genarraytauinletret=match_kindwith|Float32->L.sormrqlayoutsidetransmnk_alda_tau_cldc|Float64->L.dormrqlayoutsidetransmnk_alda_tau_cldcincheck_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=Pervasives.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=Pervasives.max1(_stridet)inletldc=Pervasives.max1(_stridec)inlet_v=bigarray_startCtypes_static.Genarrayvinlet_t=bigarray_startCtypes_static.Genarraytinlet_c=bigarray_startCtypes_static.Genarraycinletret=match_kindwith|Float32->L.sgemqrtlayoutsidetransmnknb_vldv_tldt_cldc|Float64->L.dgemqrtlayoutsidetransmnknb_vldv_tldt_cldc|Complex32->L.cgemqrtlayoutsidetransmnknb_vldv_tldt_cldc|Complex64->L.zgemqrtlayoutsidetransmnknb_vldv_tldt_cldc|_->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=Pervasives.max1(_stridea)inletldb=Pervasives.max1(_strideb)inlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinletret=match_kindwith|Float32->L.sposvlayoutuplonnrhs_alda_bldb|Float64->L.dposvlayoutuplonnrhs_alda_bldb|Complex32->L.cposvlayoutuplonnrhs_alda_bldb|Complex64->L.zposvlayoutuplonnrhs_alda_bldb|_->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=Pervasives.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainletret=match_kindwith|Float32->L.spotrflayoutuplon_alda|Float64->L.dpotrflayoutuplon_alda|Complex32->L.cpotrflayoutuplon_alda|Complex64->L.zpotrflayoutuplon_alda|_->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=Pervasives.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainletret=match_kindwith|Float32->L.spotrilayoutuplon_alda|Float64->L.dpotrilayoutuplon_alda|Complex32->L.cpotrilayoutuplon_alda|Complex64->L.zpotrilayoutuplon_alda|_->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=Pervasives.max1(_stridea)inletldb=Pervasives.max1(_strideb)inlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinletret=match_kindwith|Float32->L.spotrslayoutuplonnrhs_alda_bldb|Float64->L.dpotrslayoutuplonnrhs_alda_bldb|Complex32->L.cpotrslayoutuplonnrhs_alda_bldb|Complex64->L.zpotrslayoutuplonnrhs_alda_bldb|_->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=Pervasives.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.spstrflayoutuplon_alda_piv_ranktol|Float64->L.dpstrflayoutuplon_alda_piv_ranktol|Complex32->L.cpstrflayoutuplon_alda_piv_rankComplex.(tol.re)|Complex64->L.zpstrflayoutuplon_alda_piv_rankComplex.(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=Pervasives.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.sptsvlayoutnnrhs_d_e_bldb)|Float64->(let_d=bigarray_startCtypes_static.GenarraydinL.dptsvlayoutnnrhs_d_e_bldb)|Complex32->(letd'=Owl_dense_matrix_c.redinlet_d=bigarray_startCtypes_static.Genarrayd'inL.cptsvlayoutnnrhs_d_e_bldb)|Complex64->(letd'=Owl_dense_matrix_z.redinlet_d=bigarray_startCtypes_static.Genarrayd'inL.zptsvlayoutnnrhs_d_e_bldb)|_->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->(let_d=bigarray_startCtypes_static.GenarraydinL.spttrfn_d_e)|Float64->(let_d=bigarray_startCtypes_static.GenarraydinL.dpttrfn_d_e)|Complex32->(letd'=Owl_dense_matrix_c.redinlet_d=bigarray_startCtypes_static.Genarrayd'inL.cpttrfn_d_e)|Complex64->(letd'=Owl_dense_matrix_z.redinlet_d=bigarray_startCtypes_static.Genarrayd'inL.zpttrfn_d_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=Pervasives.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.spttrslayoutnnrhs_d_e_bldb)|Float64->(let_d=bigarray_startCtypes_static.GenarraydinL.dpttrslayoutnnrhs_d_e_bldb)|Complex32->(letd'=Owl_dense_matrix_c.redinlet_d=bigarray_startCtypes_static.Genarrayd'inL.cpttrslayoutuplonnrhs_d_e_bldb)|Complex64->(letd'=Owl_dense_matrix_z.redinlet_d=bigarray_startCtypes_static.Genarrayd'inL.zpttrslayoutuplonnrhs_d_e_bldb)|_->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=Pervasives.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainletret=match_kindwith|Float32->L.strtrilayoutuplodiagn_alda|Float64->L.dtrtrilayoutuplodiagn_alda|Complex32->L.ctrtrilayoutuplodiagn_alda|Complex64->L.ztrtrilayoutuplodiagn_alda|_->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=Pervasives.max1(_stridea)inletldb=Pervasives.max1(_strideb)inlet_a=bigarray_startCtypes_static.Genarrayainlet_b=bigarray_startCtypes_static.Genarraybinletret=match_kindwith|Float32->L.strtrslayoutuplotransdiagnnrhs_alda_bldb|Float64->L.dtrtrslayoutuplotransdiagnnrhs_alda_bldb|Complex32->L.ctrtrslayoutuplotransdiagnnrhs_alda_bldb|Complex64->L.ztrtrslayoutuplotransdiagnnrhs_alda_bldb|_->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=Pervasives.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainletrcond=ref0.inletret=match_kindwith|Float32->(let_rcond=Ctypes.(allocatefloat0.)inletr=L.strconlayoutnormuplodiagn_alda_rcondinrcond:=!@_rcond;r)|Float64->(let_rcond=Ctypes.(allocatedouble0.)inletr=L.dtrconlayoutnormuplodiagn_alda_rcondinrcond:=!@_rcond;r)|Complex32->(let_rcond=Ctypes.(allocatefloat0.)inletr=L.ctrconlayoutnormuplodiagn_alda_rcondinrcond:=!@_rcond;r)|Complex64->(let_rcond=Ctypes.(allocatedouble0.)inletr=L.ztrconlayoutnormuplodiagn_alda_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.strevclayoutsidehowmny_selectn_tldt_vlldvl_vrldvrmm_m|Float64->L.dtrevclayoutsidehowmny_selectn_tldt_vlldvl_vrldvrmm_m|Complex32->L.ctrevclayoutsidehowmny_selectn_tldt_vlldvl_vrldvrmm_m|Complex64->L.ztrevclayoutsidehowmny_selectn_tldt_vlldvl_vrldvrmm_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=Pervasives.max1(_stridea)inletldb=Pervasives.max1(_strideb)inletldx=Pervasives.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.strrfslayoutuplotransdiagnnrhs_alda_bldb_xldx_ferr_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.dtrrfslayoutuplotransdiagnnrhs_alda_bldb_xldx_ferr_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.ctrrfslayoutuplotransdiagnnrhs_alda_bldb_xldx_ferr_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.ctrrfslayoutuplotransdiagnnrhs_alda_bldb_xldx_ferr_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=Pervasives.max1(_stridez)inlet_d=bigarray_startCtypes_static.Genarraydinlet_e=bigarray_startCtypes_static.Genarrayeinlet_z=bigarray_startCtypes_static.Genarrayzinletret=match_kindwith|Float32->L.sstevlayoutjobzn_d_e_zldz|Float64->L.dstevlayoutjobzn_d_e_zldzincheck_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.sstebzrangeordernvlvuiliuabstol_d_e_m_nsplit_w_iblock_isplit|Float64->L.dstebzrangeordernvlvuiliuabstol_d_e_m_nsplit_w_iblock_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.sstegrlayoutjobzrangen_d_evlvuiliuabstol_m_w_zldz_isuppzinw:=w';r)|Float64->(letw'=Genarray.createfloat64_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarrayw'inletr=L.dstegrlayoutjobzrangen_d_evlvuiliuabstol_m_w_zldz_isuppzinw:=w';r)|Complex32->(letw'=Genarray.createfloat32_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarrayw'inletr=L.cstegrlayoutjobzrangen_d_evlvuiliuabstol_m_w_zldz_isuppzinw:=Owl_dense_matrix_generic.cast_s2cw';r)|Complex64->(letw'=Genarray.createfloat64_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarrayw'inletr=L.zstegrlayoutjobzrangen_d_evlvuiliuabstol_m_w_zldz_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=Pervasives.max1minletz=Genarray.create_kind_layout[|n;m|]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.ssteinlayoutn_d_em_w_iblock_isplit_zldz_ifailv|Float64->L.dsteinlayoutn_d_em_w_iblock_isplit_zldz_ifailv|Complex32->L.csteinlayoutn_d_em_w_iblock_isplit_zldz_ifailv|Complex64->L.zsteinlayoutn_d_em_w_iblock_isplit_zldz_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=Pervasives.max1(_stridea)inletret=match_kindwith|Float32->L.ssyconvlayoutuplowayn_alda_ipiv_e|Float64->L.dsyconvlayoutuplowayn_alda_ipiv_e|Complex32->L.csyconvlayoutuplowayn_alda_ipiv_e|Complex64->L.zsyconvlayoutuplowayn_alda_ipiv_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=Pervasives.max1(_stridea)inletldb=Pervasives.max1(_strideb)inletret=match_kindwith|Float32->L.ssysvlayoutuplonnrhs_alda_ipiv_bldb|Float64->L.dsysvlayoutuplonnrhs_alda_ipiv_bldb|Complex32->L.csysvlayoutuplonnrhs_alda_ipiv_bldb|Complex64->L.zsysvlayoutuplonnrhs_alda_ipiv_bldb|_->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=Pervasives.max1(_stridea)inletret=match_kindwith|Float32->L.ssytrflayoutuplon_alda_ipiv|Float64->L.dsytrflayoutuplon_alda_ipiv|Complex32->L.csytrflayoutuplon_alda_ipiv|Complex64->L.zsytrflayoutuplon_alda_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=Pervasives.max1(_stridea)inletret=match_kindwith|Float32->L.ssytrf_rooklayoutuplon_alda_ipiv|Float64->L.dsytrf_rooklayoutuplon_alda_ipiv|Complex32->L.csytrf_rooklayoutuplon_alda_ipiv|Complex64->L.zsytrf_rooklayoutuplon_alda_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=Pervasives.max1(_stridea)inletret=match_kindwith|Float32->L.ssytrilayoutuplon_alda_ipiv|Float64->L.dsytrilayoutuplon_alda_ipiv|Complex32->L.csytrilayoutuplon_alda_ipiv|Complex64->L.zsytrilayoutuplon_alda_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=Pervasives.max1(_stridea)inletldb=Pervasives.max1(_strideb)inletret=match_kindwith|Float32->L.ssytrslayoutuplonnrhs_alda_ipiv_bldb|Float64->L.dsytrslayoutuplonnrhs_alda_ipiv_bldb|Complex32->L.csytrslayoutuplonnrhs_alda_ipiv_bldb|Complex64->L.zsytrslayoutuplonnrhs_alda_ipiv_bldb|_->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=Pervasives.max1(_stridea)inletldb=Pervasives.max1(_strideb)inletret=match_kindwith|Complex32->L.chesvlayoutuplonnrhs_alda_ipiv_bldb|Complex64->L.zhesvlayoutuplonnrhs_alda_ipiv_bldbincheck_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=Pervasives.max1(_stridea)inletret=match_kindwith|Complex32->L.chetrflayoutuplon_alda_ipiv|Complex64->L.zhetrflayoutuplon_alda_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=Pervasives.max1(_stridea)inletret=match_kindwith|Complex32->L.chetrf_rooklayoutuplon_alda_ipiv|Complex64->L.zhetrf_rooklayoutuplon_alda_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=Pervasives.max1(_stridea)inletret=match_kindwith|Complex32->L.chetrilayoutuplon_alda_ipiv|Complex64->L.zhetrilayoutuplon_alda_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=Pervasives.max1(_stridea)inletldb=Pervasives.max1(_strideb)inletret=match_kindwith|Complex32->L.chetrslayoutuplonnrhs_alda_ipiv_bldb|Complex64->L.zhetrslayoutuplonnrhs_alda_ipiv_bldbincheck_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=Pervasives.max1(_stridea)inletret=match_kindwith|Float32->L.ssyevlayoutjobzuplon_alda_w|Float64->L.dsyevlayoutjobzuplon_alda_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=Pervasives.max1ninletldz=matchjobzwith|'V'->Pervasives.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.ssyevrlayoutjobzrangeuplon_aldavlvuiliuabstol_m_w_zldz_isuppz|Float64->L.dsyevrlayoutjobzrangeuplon_aldavlvuiliuabstol_m_w_zldz_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=Pervasives.max1(_stridea)inletldb=Pervasives.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.ssygvdlayoutitypjobzuplon_alda_bldb_w|Float64->L.dsygvdlayoutitypjobzuplon_alda_bldb_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=Pervasives.max1(_stridevt)inletldu=Pervasives.max1(_strideu)inletldc=Pervasives.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.sbdsqrlayoutuplonncvtnruncc_d_e_vtldvt_uldu_cldc|Float64->L.dbdsqrlayoutuplonncvtnruncc_d_e_vtldvt_uldu_cldc|Complex32->L.cbdsqrlayoutuplonncvtnruncc_d_e_vtldvt_uldu_cldc|Complex64->L.zbdsqrlayoutuplonncvtnruncc_d_e_vtldvt_uldu_cldc|_->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;(Pervasives.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;(Pervasives.max0(int_of_floatldiq))|])|_->Genarray.createint32_layout[|0;n|]inletldu=Pervasives.max1(_strideu)inletldvt=Pervasives.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.sbdsdclayoutuplocompqn_d_e_uldu_vtldvt_q_iq|Float64->L.dbdsdclayoutuplocompqn_d_e_uldu_vtldvt_q_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=Pervasives.max1(_stridea)inlet_a=bigarray_startCtypes_static.Genarrayainletrcond=ref0.inletret=match_kindwith|Float32->(let_rcond=Ctypes.(allocatefloat0.)inletr=L.sgeconlayoutnormn_aldaanorm_rcondinrcond:=!@_rcond;r)|Float64->(let_rcond=Ctypes.(allocatedouble0.)inletr=L.dgeconlayoutnormn_aldaanorm_rcondinrcond:=!@_rcond;r)|Complex32->(let_rcond=Ctypes.(allocatefloat0.)inletr=L.cgeconlayoutnormn_aldaanorm_rcondinrcond:=!@_rcond;r)|Complex64->(let_rcond=Ctypes.(allocatedouble0.)inletr=L.zgeconlayoutnormn_aldaanorm_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;(Pervasives.max1(n-1))|]inlet_tau=bigarray_startCtypes_static.Genarraytauinlet_a=bigarray_startCtypes_static.Genarrayainletlda=Pervasives.max1(_stridea)inletret=match_kindwith|Float32->L.sgehrdlayoutniloihi_alda_tau|Float64->L.dgehrdlayoutniloihi_alda_tau|Complex32->L.cgehrdlayoutniloihi_alda_tau|Complex64->L.zgehrdlayoutniloihi_alda_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=Pervasives.max1(_stridea)inletret=match_kindwith|Float32->L.sorghrlayoutniloihi_alda_tau|Float64->L.dorghrlayoutniloihi_alda_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=Pervasives.max1(_stridea)inletret=match_kindwith|Complex32->L.cunghrlayoutniloihi_alda_tau|Complex64->L.zunghrlayoutniloihi_alda_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=Pervasives.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=Pervasives.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.sgeeslayoutjobvssort_selectn_alda_sdim_wr_wi_vsldvsinwr:=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.dgeeslayoutjobvssort_selectn_alda_sdim_wr_wi_vsldvsinwr:=wr';wi:=wi';r)|Complex32->(letw'=Genarray.create_kind_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarrayw'inletr=L.cgeeslayoutjobvssort_selectn_alda_sdim_w_vsldvsinwr:=w';wi:=w';r)|Complex64->(letw'=Genarray.create_kind_layout[|1;n|]inlet_w=bigarray_startCtypes_static.Genarrayw'inletr=L.zgeeslayoutjobvssort_selectn_alda_sdim_w_vsldvsinwr:=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=Pervasives.max1(_stridevsl)inletldvsr=Pervasives.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=Pervasives.max1(_stridea)inletldb=Pervasives.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.sggeslayoutjobvsljobvsrsort_selctgn_alda_bldb_sdim_alphar_alphai_beta_vslldvsl_vsrldvsrinalphar:=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.dggeslayoutjobvsljobvsrsort_selctgn_alda_bldb_sdim_alphar_alphai_beta_vslldvsl_vsrldvsrinalphar:=alphar';alphai:=alphai';r)|Complex32->(letalpha'=Genarray.create_kind_layout[|1;n|]inlet_alpha=bigarray_startCtypes_static.Genarrayalpha'inletr=L.cggeslayoutjobvsljobvsrsort_selctgn_alda_bldb_sdim_alpha_beta_vslldvsl_vsrldvsrinalphar:=alpha';alphai:=alpha';r)|Complex64->(letalpha'=Genarray.create_kind_layout[|1;n|]inlet_alpha=bigarray_startCtypes_static.Genarrayalpha'inletr=L.zggeslayoutjobvsljobvsrsort_selctgn_alda_bldb_sdim_alpha_beta_vslldvsl_vsrldvsrinalphar:=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=Pervasives.max1(_stridet)inletldq=Pervasives.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.strexclayoutcompqn_tldt_qldq_ifst_ilst|Float64->L.dtrexclayoutcompqn_tldt_qldq_ifst_ilst|Complex32->L.ctrexclayoutcompqn_tldt_qldqifstilst|Complex64->L.ztrexclayoutcompqn_tldt_qldqifstilst|_->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=Pervasives.max1(_stridet)inletldq=Pervasives.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.strsenlayoutjobcompq_selectn_tldt_qldq_wr_wi_m_s_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.dtrsenlayoutjobcompq_selectn_tldt_qldq_wr_wi_m_s_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.ctrsenlayoutjobcompq_selectn_tldt_qldq_w_m_s_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.ztrsenlayoutjobcompq_selectn_tldt_qldq_w_m_s_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=Pervasives.max1(_stridea)inletldb=Pervasives.max1(_strideb)inletldq=Pervasives.max1(_strideq)inletldz=Pervasives.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.stgsenlayoutijobwantqwantz_selectn_alda_bldb_alphar_alphai_beta_qldq_zldz_m_pl_pr_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.dtgsenlayoutijobwantqwantz_selectn_alda_bldb_alphar_alphai_beta_qldq_zldz_m_pl_pr_difinalphar:=alphar';alphai:=alphai';r)|Complex32->(letalpha'=Genarray.create_kind_layout[|1;n|]inlet_alpha=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.ctgsenlayoutijobwantqwantz_selectn_alda_bldb_alpha_beta_qldq_zldz_m_pl_pr_difinalphar:=alpha';alphai:=alpha';r)|Complex64->(letalpha'=Genarray.create_kind_layout[|1;n|]inlet_alpha=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.ztgsenlayoutijobwantqwantz_selectn_alda_bldb_alpha_beta_qldq_zldz_m_pl_pr_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=Pervasives.max1(_stridea)inletldb=Pervasives.max1(_strideb)inletldc=Pervasives.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.strsyllayouttranatranbisgnmn_alda_bldb_cldc_scaleinscale:=!@_scale;r)|Float64->(let_scale=Ctypes.(allocatedouble0.)inletr=L.dtrsyllayouttranatranbisgnmn_alda_bldb_cldc_scaleinscale:=!@_scale;r)|Complex32->(let_scale=Ctypes.(allocatefloat0.)inletr=L.ctrsyllayouttranatranbisgnmn_alda_bldb_cldc_scaleinscale:=!@_scale;r)|Complex64->(let_scale=Ctypes.(allocatedouble0.)inletr=L.ztrsyllayouttranatranbisgnmn_alda_bldb_cldc_scaleinscale:=!@_scale;r)|_->failwith"lapacke:trsyl"incheck_lapack_errorret;c,!scale(* ends here *)