sig
  type system
  val make_system :
    (float -> float array -> float array -> unit) ->
    ?jac:(float -> float array -> Matrix.matrix -> float array -> unit) ->
    int -> Odeiv.system
  type step
  type step_kind =
      RK2
    | RK4
    | RKF45
    | RKCK
    | RK8PD
    | RK2IMP
    | RK2SIMP
    | RK4IMP
    | BSIMP
    | GEAR1
    | GEAR2
  val make_step : Odeiv.step_kind -> dim:int -> Odeiv.step
  external step_reset : Odeiv.step -> unit = "ml_gsl_odeiv_step_reset"
  external step_name : Odeiv.step -> string = "ml_gsl_odeiv_step_name"
  external step_order : Odeiv.step -> int = "ml_gsl_odeiv_step_order"
  external step_apply :
    Odeiv.step ->
    t:float ->
    h:float ->
    y:float array ->
    yerr:float array ->
    ?dydt_in:float array -> ?dydt_out:float array -> Odeiv.system -> unit
    = "ml_gsl_odeiv_step_apply_bc" "ml_gsl_odeiv_step_apply"
  type control
  val make_control_standard_new :
    eps_abs:float ->
    eps_rel:float -> a_y:float -> a_dydt:float -> Odeiv.control
  val make_control_y_new : eps_abs:float -> eps_rel:float -> Odeiv.control
  val make_control_yp_new : eps_abs:float -> eps_rel:float -> Odeiv.control
  val make_control_scaled_new :
    eps_abs:float ->
    eps_rel:float ->
    a_y:float -> a_dydt:float -> scale_abs:float array -> Odeiv.control
  external control_name : Odeiv.control -> string
    = "ml_gsl_odeiv_control_name"
  type hadjust = HADJ_DEC | HADJ_NIL | HADJ_INC
  external control_hadjust :
    Odeiv.control ->
    Odeiv.step ->
    y:float array ->
    yerr:float array -> dydt:float array -> h:float -> Odeiv.hadjust * float
    = "ml_gsl_odeiv_control_hadjust_bc" "ml_gsl_odeiv_control_hadjust"
  type evolve
  val make_evolve : int -> Odeiv.evolve
  external evolve_reset : Odeiv.evolve -> unit = "ml_gsl_odeiv_evolve_reset"
  external evolve_apply :
    Odeiv.evolve ->
    Odeiv.control ->
    Odeiv.step ->
    Odeiv.system ->
    t:float -> t1:float -> h:float -> y:float array -> float * float
    = "ml_gsl_odeiv_evolve_apply_bc" "ml_gsl_odeiv_evolve_apply"
end