sig
  module Deriv :
    sig
      type kind =
          CONJUGATE_FR
        | CONJUGATE_PR
        | VECTOR_BFGS
        | VECTOR_BFGS2
        | STEEPEST_DESCENT
      type t
      val make :
        Gsl_multimin.Deriv.kind ->
        int ->
        Gsl_fun.multim_fun_fdf ->
        x:Gsl_vector.vector ->
        step:float -> tol:float -> Gsl_multimin.Deriv.t
      external name : Gsl_multimin.Deriv.t -> string
        = "ml_gsl_multimin_fdfminimizer_name"
      external iterate : Gsl_multimin.Deriv.t -> unit
        = "ml_gsl_multimin_fdfminimizer_iterate"
      external restart : Gsl_multimin.Deriv.t -> unit
        = "ml_gsl_multimin_fdfminimizer_restart"
      external minimum :
        ?x:Gsl_vector.vector ->
        ?dx:Gsl_vector.vector ->
        ?g:Gsl_vector.vector -> Gsl_multimin.Deriv.t -> float
        = "ml_gsl_multimin_fdfminimizer_minimum"
      external test_gradient : Gsl_multimin.Deriv.t -> float -> bool
        = "ml_gsl_multimin_test_gradient"
    end
  module NoDeriv :
    sig
      type kind = NM_SIMPLEX
      type t
      val make :
        Gsl_multimin.NoDeriv.kind ->
        int ->
        Gsl_fun.multim_fun ->
        x:Gsl_vector.vector ->
        step_size:Gsl_vector.vector -> Gsl_multimin.NoDeriv.t
      external name : Gsl_multimin.NoDeriv.t -> string
        = "ml_gsl_multimin_fminimizer_name"
      external iterate : Gsl_multimin.NoDeriv.t -> unit
        = "ml_gsl_multimin_fminimizer_iterate"
      external minimum :
        ?x:Gsl_vector.vector -> Gsl_multimin.NoDeriv.t -> float
        = "ml_gsl_multimin_fminimizer_minimum"
      external size : Gsl_multimin.NoDeriv.t -> float
        = "ml_gsl_multimin_fminimizer_size"
      external test_size : Gsl_multimin.NoDeriv.t -> float -> bool
        = "ml_gsl_multimin_test_size"
    end
end