123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178(* File: cov_lin_ard.ml
OCaml-GPR - Gaussian Processes for OCaml
Copyright (C) 2009- Markus Mottl
email: markus.mottl@gmail.com
WWW: http://www.ocaml.info
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this library; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*)openCoreopenLacaml.DmoduleParams=structtypet={log_ells:vec}endmoduleEval=structmoduleKernel=structtypeparams=Params.ttypet={params:params;consts:vec}letcreateparams=letlog_ells=params.Params.log_ellsinletd=Vec.dimlog_ellsinletconsts=Vec.createdinfori=1toddoconsts.{i}<-exp(-.log_ells.{i})done;{params;consts}letget_paramsk=k.paramsendmoduleInducing=structtypet=matletget_n_points=Mat.dim2letcalc_upper_kinducing=syrk~trans:`TinducingendmoduleInput=structtypet=vecletcalc_ard_input{Kernel.consts}input=letd=Vec.diminputinletard_input=Vec.createdinfori=1toddoard_input.{i}<-consts.{i}*.input.{i}done;ard_inputletevalkinputinducing=gemv~trans:`Tinducing(calc_ard_inputkinput)letweighted_evalkinputinducing~coeffs=dotcoeffs(evalkinputinducing)leteval_one{Kernel.consts}input=letrecloopresi=ifi=0thenreselseletx=consts.{i}*.input.{i}inloop(res+.x*.x)(i-1)inloop0.(Vec.diminput)endmoduleInputs=structtypet=matletcreate=Mat.of_col_vecsletget_n_points=Mat.dim2letchoose_subsetinputsindexes=Utils.choose_colsinputsindexesletcalc_ard_inputs{Kernel.consts}inputs=letres=lacpyinputsinMat.scal_rowsconstsres;resletcreate_inducing=calc_ard_inputsletcreate_default_kernel_paramsinputs~n_inducing:_={Params.log_ells=Vec.make(Mat.dim1inputs)0.}letcalc_upperkinputs=syrk~trans:`T(calc_ard_inputskinputs)letcalc_diagkinputs=Mat.syrk_diag~trans:`T(calc_ard_inputskinputs)letcalc_crossk~inputs~inducing=gemm~transa:`T(calc_ard_inputskinputs)inducingletweighted_evalk~inputs~inducing~coeffs=gemv(calc_crossk~inputs~inducing)coeffsendendmoduleDeriv=structmoduleEval=EvalmoduleHyper=structtypet=[`Log_ellofint]letget_all{Eval.Kernel.params}_inducing_inputs=Array.init(Vec.dimparams.Params.log_ells)~f:(fund->`Log_ell(d+1))letget_value{Eval.Kernel.params}_inducing_inputs=function|`Log_elli->params.Params.log_ells.{i}letset_valueskinducinginputshypersvalues=let{Eval.Kernel.params}=kinletlog_ells_lazy=lazy(copyparams.Params.log_ells)infori=1toArray.lengthhypersdomatchhypers.(i-1)with|`Log_elld->(Lazy.forcelog_ells_lazy).{d}<-values.{i}done;letnew_kernel=ifLazy.is_vallog_ells_lazythenEval.Kernel.create{Params.log_ells=Lazy.forcelog_ells_lazy}elsekinnew_kernel,inducing,inputsendmoduleInducing=structtypeupper=Eval.Inducing.tletcalc_shared_upperkeval_inducing=letupper=Eval.Inducing.calc_upperkeval_inducinginupper,eval_inducingletcalc_deriv_upper_inducing=function|`Log_ell_->`Const0.endmoduleInputs=structtypediag=Eval.Kernel.t*Eval.Inputs.ttypecross=Eval.Kernel.t*Eval.Inputs.t*Eval.Inducing.tletcalc_shared_diagkeval_inputs=Eval.Inputs.calc_diagkeval_inputs,(k,eval_inputs)letcalc_shared_crossk~inputs~inducing=(Eval.Inputs.calc_crossk~inputs~inducing,(k,inputs,inducing))letcalc_deriv_diag(k,inputs)(`Log_elld)=letn=Mat.dim2inputsinletres=Vec.createninletconst=-2.*.k.Eval.Kernel.consts.{d}infori=1tondoletel=inputs.{d,i}inres.{i}<-(const*.el)*.eldone;`Vecresletcalc_deriv_cross(k,inputs,inducing)(`Log_elld)=letm=Mat.dim2inducinginletn=Mat.dim2inputsinletres=Mat.createnminletconst=-.k.Eval.Kernel.consts.{d}inforc=1tomdoforr=1tondores.{r,c}<-const*.inducing.{d,c}*.inputs.{d,r}donedone;`Denseresendend