sig
  module Gsl :
    sig
      exception Optim_exception of exn
      val train :
        ?step:float ->
        ?tol:float ->
        ?epsabs:float ->
        ?report_trained_model:(iter:int ->
                               Gpr_interfaces.Sigs.Eval.Trained.t -> unit) ->
        ?report_gradient_norm:(iter:int -> float -> unit) ->
        ?kernel:Eval.Spec.Kernel.t ->
        ?sigma2:float ->
        ?inducing:Eval.Spec.Inducing.t ->
        ?n_rand_inducing:int ->
        ?learn_sigma2:bool ->
        ?hypers:Gpr_interfaces.Sigs.Deriv.Deriv.Spec.Hyper.t array ->
        inputs:Eval.Spec.Inputs.t ->
        targets:Lacaml.D.vec -> unit -> Gpr_interfaces.Sigs.Eval.Trained.t
    end
  module SGD :
    sig
      type t
      val create :
        ?tau:float ->
        ?eta0:float ->
        ?step:int ->
        ?kernel:Eval.Spec.Kernel.t ->
        ?sigma2:float ->
        ?inducing:Eval.Spec.Inducing.t ->
        ?n_rand_inducing:int ->
        ?learn_sigma2:bool ->
        ?hypers:Gpr_interfaces.Sigs.Deriv.Deriv.Spec.Hyper.t array ->
        inputs:Eval.Spec.Inputs.t ->
        targets:Lacaml.D.vec ->
        unit -> Gpr_interfaces.Sigs.Deriv.Deriv.Optim.SGD.t
      val step :
        Gpr_interfaces.Sigs.Deriv.Deriv.Optim.SGD.t ->
        Gpr_interfaces.Sigs.Deriv.Deriv.Optim.SGD.t
      val gradient_norm :
        Gpr_interfaces.Sigs.Deriv.Deriv.Optim.SGD.t -> float
      val get_trained :
        Gpr_interfaces.Sigs.Deriv.Deriv.Optim.SGD.t ->
        Gpr_interfaces.Sigs.Eval.Trained.t
      val get_eta : Gpr_interfaces.Sigs.Deriv.Deriv.Optim.SGD.t -> float
      val get_step : Gpr_interfaces.Sigs.Deriv.Deriv.Optim.SGD.t -> int
      val test :
        ?epsabs:float ->
        ?max_iter:int ->
        ?report:(Gpr_interfaces.Sigs.Deriv.Deriv.Optim.SGD.t -> unit) ->
        Gpr_interfaces.Sigs.Deriv.Deriv.Optim.SGD.t ->
        Gpr_interfaces.Sigs.Deriv.Deriv.Optim.SGD.t
    end
  module SMD :
    sig
      type t
      val create :
        ?eps:float ->
        ?lambda:float ->
        ?mu:float ->
        ?eta0:Lacaml.D.vec ->
        ?nu0:Lacaml.D.vec ->
        ?kernel:Eval.Spec.Kernel.t ->
        ?sigma2:float ->
        ?inducing:Eval.Spec.Inducing.t ->
        ?n_rand_inducing:int ->
        ?learn_sigma2:bool ->
        ?hypers:Gpr_interfaces.Sigs.Deriv.Deriv.Spec.Hyper.t array ->
        inputs:Eval.Spec.Inputs.t ->
        targets:Lacaml.D.vec ->
        unit -> Gpr_interfaces.Sigs.Deriv.Deriv.Optim.SMD.t
      val step :
        Gpr_interfaces.Sigs.Deriv.Deriv.Optim.SMD.t ->
        Gpr_interfaces.Sigs.Deriv.Deriv.Optim.SMD.t
      val gradient_norm :
        Gpr_interfaces.Sigs.Deriv.Deriv.Optim.SMD.t -> float
      val get_trained :
        Gpr_interfaces.Sigs.Deriv.Deriv.Optim.SMD.t ->
        Gpr_interfaces.Sigs.Eval.Trained.t
      val get_eta :
        Gpr_interfaces.Sigs.Deriv.Deriv.Optim.SMD.t -> Lacaml.D.vec
      val get_nu :
        Gpr_interfaces.Sigs.Deriv.Deriv.Optim.SMD.t -> Lacaml.D.vec
      val test :
        ?epsabs:float ->
        ?max_iter:int ->
        ?report:(Gpr_interfaces.Sigs.Deriv.Deriv.Optim.SMD.t -> unit) ->
        Gpr_interfaces.Sigs.Deriv.Deriv.Optim.SMD.t ->
        Gpr_interfaces.Sigs.Deriv.Deriv.Optim.SMD.t
    end
end