sig
  module NoDeriv :
    sig
      type kind = HYBRIDS | HYBRID | DNEWTON | BROYDEN
      type t
      val make :
        Multiroot.NoDeriv.kind ->
        int -> Fun.multi_fun -> Vector.vector -> Multiroot.NoDeriv.t
      external name : Multiroot.NoDeriv.t -> string
        = "ml_gsl_multiroot_fsolver_name"
      external iterate : Multiroot.NoDeriv.t -> unit
        = "ml_gsl_multiroot_fsolver_iterate"
      external root : Multiroot.NoDeriv.t -> Vector.vector -> unit
        = "ml_gsl_multiroot_fsolver_root"
      external get_state :
        Multiroot.NoDeriv.t ->
        ?x:Vector.vector ->
        ?f:Vector.vector -> ?dx:Vector.vector -> unit -> unit
        = "ml_gsl_multiroot_fsolver_get_state"
      external test_delta :
        Multiroot.NoDeriv.t -> epsabs:float -> epsrel:float -> bool
        = "ml_gsl_multiroot_test_delta_f"
      external test_residual : Multiroot.NoDeriv.t -> epsabs:float -> bool
        = "ml_gsl_multiroot_test_residual_f"
    end
  module Deriv :
    sig
      type kind = HYBRIDSJ | HYBRIDJ | NEWTON | GNEWTON
      type t
      val make :
        Multiroot.Deriv.kind ->
        int -> Fun.multi_fun_fdf -> Vector.vector -> Multiroot.Deriv.t
      external name : Multiroot.Deriv.t -> string
        = "ml_gsl_multiroot_fdfsolver_name"
      external iterate : Multiroot.Deriv.t -> unit
        = "ml_gsl_multiroot_fdfsolver_iterate"
      external root : Multiroot.Deriv.t -> Vector.vector -> unit
        = "ml_gsl_multiroot_fdfsolver_root"
      external get_state :
        Multiroot.Deriv.t ->
        ?x:Vector.vector ->
        ?f:Vector.vector ->
        ?j:Matrix.matrix -> ?dx:Vector.vector -> unit -> unit
        = "ml_gsl_multiroot_fdfsolver_get_state_bc"
        "ml_gsl_multiroot_fdfsolver_get_state"
      external test_delta :
        Multiroot.Deriv.t -> epsabs:float -> epsrel:float -> bool
        = "ml_gsl_multiroot_test_delta_fdf"
      external test_residual : Multiroot.Deriv.t -> epsabs:float -> bool
        = "ml_gsl_multiroot_test_residual_fdf"
    end
end