sig
  module Eval :
    sig
      module Kernel :
        sig
          type t = Eval.Spec.Kernel.t
          type params = Eval.Spec.Kernel.params
          val create : params -> t
          val get_params : t -> params
        end
      module Inducing :
        sig
          type t = Eval.Spec.Inducing.t
          val get_n_points : t -> int
          val calc_upper : Kernel.t -> t -> Lacaml.D.mat
        end
      module Input :
        sig
          type t = Eval.Spec.Input.t
          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 = Eval.Spec.Inputs.t
          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 Var : sig type t end
  module Input :
    sig
      val get_vars : Eval.Input.t -> Var.t array
      val get_value : Eval.Input.t -> Var.t -> float
      val set_values :
        Eval.Input.t -> Var.t array -> Lacaml.D.vec -> Eval.Input.t
    end
  module Inputs :
    sig
      val get_vars : Eval.Inputs.t -> Var.t array
      val get_value : Eval.Inputs.t -> Var.t -> float
      val set_values :
        Eval.Inputs.t -> Var.t array -> Lacaml.D.vec -> Eval.Inputs.t
    end
end