sig
  module Spec :
    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
  type t
  val create :
    ?max_memory:int ->
    Gpr_interfaces.Sigs.Optimizer.Optimizer.Spec.Eval.Kernel.t ->
    Gpr_interfaces.Sigs.Optimizer.Optimizer.t
  val learn :
    Gpr_interfaces.Sigs.Optimizer.Optimizer.t ->
    (Gpr_interfaces.Sigs.Optimizer.Optimizer.Spec.Eval.Input.t * float) array ->
    Gpr_interfaces.Sigs.Optimizer.Optimizer.t
  val calc_mpi_criterion :
    Gpr_interfaces.Sigs.Optimizer.Optimizer.t ->
    Gpr_interfaces.Sigs.Optimizer.Optimizer.Spec.Eval.Input.t -> float
  val calc_mpi_deriv :
    Gpr_interfaces.Sigs.Optimizer.Optimizer.t ->
    Gpr_interfaces.Sigs.Optimizer.Optimizer.Spec.Eval.Input.t
end