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