12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697(* Code under Apache License 2.0 but without owner.
* I believe owner is Jane Street Group, LLC <opensource@janestreet.com>
*)leterror_msgffmt=Format.kasprintf(funerr->Error(`Msgerr))fmtletcol_normacolumn=letacc=ref0.infori=0toArray.lengtha-1doletentry=a.(i).(column)inacc:=!acc+.(entry*.entry)done;sqrt!accletcol_inner_prodtj1j2=letacc=ref0.infori=0toArray.lengtht-1doacc:=!acc+.(t.(i).(j1)*.t.(i).(j2))done;!accletqr_in_placea=letm=Array.lengthainifm=0then([||],[||])elseletn=Array.lengtha.(0)inletr=Array.make_matrixnn0.inforj=0ton-1doletalpha=col_normajinr.(j).(j)<-alpha;letone_over_alpha=1./.alphainfori=0tom-1doa.(i).(j)<-a.(i).(j)*.one_over_alphadone;forj2=j+1ton-1doletc=col_inner_prodajj2inr.(j).(j2)<-c;fori=0tom-1doa.(i).(j2)<-a.(i).(j2)-.(c*.a.(i).(j))donedonedone;(a,r)letqr?(in_place=false)a=leta=ifin_placethenaelseArray.mapArray.copyainqr_in_placealetmul_mv?(trans=false)ax=letrows=Array.lengthainifrows=0then[||]elseletcols=Array.lengtha.(0)inletm,n,get=iftransthenletgetij=a.(j).(i)in(cols,rows,get)elseletgetij=a.(i).(j)in(rows,cols,get)inifn<>Array.lengthxthenfailwith"Dimension mismatch";letresult=Array.makem0.infori=0tom-1doletv,_=Array.fold_left(fun(acc,j)x->(acc+.(getij*.x),succj))(0.,0)xinresult.(i)<-vdone;resultletis_nanv=matchclassify_floatvwithFP_nan->true|_->falselettriu_solverb=letm=Array.lengthbinifm<>Array.lengthrthenerror_msgf"triu_solve R b requires R to be square with same number of rows as b"elseifm=0thenOk[||]elseifm<>Array.lengthr.(0)thenerror_msgf"triu_solve R b requires R to be a square"elseletsol=Array.copybinfori=m-1downto0dosol.(i)<-sol.(i)/.r.(i).(i);forj=0toi-1dosol.(j)<-sol.(j)-.(r.(j).(i)*.sol.(i))donedone;ifArray.existsis_nansolthenerror_msgf"triu_solve detected NaN result"elseOksolletols?(in_place=false)ab=letq,r=qr~in_placeaintriu_solver(mul_mv~trans:trueqb)