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