sig
  module Kernel :
    sig
      type t
      type params = Params.t
      val create : params -> t
      val get_params : t -> params
    end
  module Inducing :
    sig
      type t = int
      val get_n_points : t -> int
      val calc_upper : Kernel.t -> t -> Lacaml.D.mat
    end
  module Input :
    sig
      type t = unit
      val eval : Kernel.t -> t -> Inducing.t -> Lacaml.D.vec
      val weighted_eval :
        Kernel.t -> t -> Inducing.t -> coeffs:Lacaml.D.vec -> float
      val eval_one : Kernel.t -> t -> float
    end
  module Inputs :
    sig
      type t = int
      val create : Input.t array -> t
      val get_n_points : t -> int
      val choose_subset : t -> Gpr_utils.Int_vec.t -> t
      val create_inducing : Kernel.t -> t -> Inducing.t
      val create_default_kernel_params : t -> n_inducing:int -> Kernel.params
      val calc_upper : Kernel.t -> t -> Lacaml.D.mat
      val calc_diag : Kernel.t -> t -> Lacaml.D.vec
      val calc_cross :
        Kernel.t -> inputs:t -> inducing:Inducing.t -> Lacaml.D.mat
      val weighted_eval :
        Kernel.t ->
        inputs:t ->
        inducing:Inducing.t -> coeffs:Lacaml.D.vec -> Lacaml.D.vec
    end
end