sig
  module Params :
    sig
      type params = {
        d : int;
        log_sf2 : float;
        tproj : Lacaml.D.mat option;
        log_hetero_skedasticity : Lacaml.D.vec option;
        log_multiscales_m05 : Lacaml.D.mat option;
      }
      type t = private Gpr_cov_se_fat.Params.params
      val create : Gpr_cov_se_fat.Params.params -> Gpr_cov_se_fat.Params.t
    end
  module Eval :
    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 = Lacaml.D.mat
          val get_n_points : t -> int
          val calc_upper : Kernel.t -> t -> Lacaml.D.mat
        end
      module Input :
        sig
          type t = Lacaml.D.vec
          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 = Lacaml.D.mat
          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
  module Proj_hyper : sig type t = { big_dim : int; small_dim : int; } end
  module Dim_hyper : sig type t = int end
  module Inducing_hyper : sig type t = { ind : int; dim : int; } end
  module Hyper_repr :
    sig
      type t =
          [ `Inducing_hyper of Gpr_cov_se_fat.Inducing_hyper.t
          | `Log_hetero_skedasticity of Gpr_cov_se_fat.Dim_hyper.t
          | `Log_multiscale_m05 of Gpr_cov_se_fat.Inducing_hyper.t
          | `Log_sf2
          | `Proj of Gpr_cov_se_fat.Proj_hyper.t ]
    end
  module Deriv :
    sig
      module Eval :
        sig
          module Kernel :
            sig
              type t = Eval.Kernel.t
              type params = Params.t
              val create : params -> t
              val get_params : t -> params
            end
          module Inducing :
            sig
              type t = Lacaml.D.mat
              val get_n_points : t -> int
              val calc_upper : Kernel.t -> t -> Lacaml.D.mat
            end
          module Input :
            sig
              type t = Lacaml.D.vec
              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 = Lacaml.D.mat
              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
      module Hyper :
        sig
          type t = Hyper_repr.t
          val get_all :
            Eval.Kernel.t -> Eval.Inducing.t -> Eval.Inputs.t -> t array
          val get_value :
            Eval.Kernel.t -> Eval.Inducing.t -> Eval.Inputs.t -> t -> float
          val set_values :
            Eval.Kernel.t ->
            Eval.Inducing.t ->
            Eval.Inputs.t ->
            t array ->
            Lacaml.D.vec -> Eval.Kernel.t * Eval.Inducing.t * Eval.Inputs.t
        end
      module Inducing :
        sig
          type upper
          val calc_shared_upper :
            Eval.Kernel.t -> Eval.Inducing.t -> Lacaml.D.mat * upper
          val calc_deriv_upper :
            upper -> Hyper.t -> Gpr_interfaces.symm_mat_deriv
        end
      module Inputs :
        sig
          type diag
          type cross
          val calc_shared_diag :
            Eval.Kernel.t -> Eval.Inputs.t -> Lacaml.D.vec * diag
          val calc_shared_cross :
            Eval.Kernel.t ->
            inputs:Eval.Inputs.t ->
            inducing:Eval.Inducing.t -> Lacaml.D.mat * cross
          val calc_deriv_diag : diag -> Hyper.t -> Gpr_interfaces.diag_deriv
          val calc_deriv_cross : cross -> Hyper.t -> Gpr_interfaces.mat_deriv
        end
    end
end