sig
  module Config = Sundials_Config
  module Index = Sundials_Index
  module Logfile :
    sig
      type t = Sundials_impl.Logfile.t
      val stderr : Sundials.Logfile.t
      val stdout : Sundials.Logfile.t
      val openfile : ?trunc:bool -> string -> Sundials.Logfile.t
      val output_string : Sundials.Logfile.t -> string -> unit
      val output_bytes : Sundials.Logfile.t -> bytes -> unit
      val flush : Sundials.Logfile.t -> unit
      val close : Sundials.Logfile.t -> unit
    end
  module Profiler :
    sig
      type t = Sundials_impl.Profiler.t
      val enabled : bool
      val make : string -> Sundials.Profiler.t
      external start : Sundials.Profiler.t -> string -> unit
        = "sunml_profiler_begin" [@@noalloc]
      external finish : Sundials.Profiler.t -> string -> unit
        = "sunml_profiler_end" [@@noalloc]
      val print : Sundials.Profiler.t -> Sundials.Logfile.t -> unit
    end
  module Context :
    sig
      type t = Sundials_impl.Context.t
      val default : unit -> Sundials.Context.t
      val make : ?profiler:Sundials.Profiler.t -> unit -> Sundials.Context.t
      exception ExternalProfilerInUse
      val get_profiler : Sundials.Context.t -> Sundials.Profiler.t
      val set_profiler : Sundials.Context.t -> Sundials.Profiler.t -> unit
    end
  exception RecoverableFailure
  exception NonPositiveEwt
  type 'f cfun = 'Sundials_impl.Callback.cfun
  val invoke : 'Sundials.cfun -> 'f
  module RealArray = Sundials_RealArray
  module RealArray2 = Sundials_RealArray2
  module LintArray = Sundials_LintArray
  module ROArray = Sundials_ROArray
  module Roots :
    sig
      type t
      type r = NoRoot | Rising | Falling
      val create : int -> Sundials.Roots.t
      val make : int -> Sundials.Roots.r -> Sundials.Roots.t
      val init : int -> (int -> Sundials.Roots.r) -> Sundials.Roots.t
      val length : Sundials.Roots.t -> int
      val pp : Stdlib.Format.formatter -> Sundials.Roots.t -> unit
      val ppi :
        ?start:string ->
        ?stop:string ->
        ?sep:string ->
        ?item:(Stdlib.Format.formatter -> int -> Sundials.Roots.r -> unit) ->
        unit -> Stdlib.Format.formatter -> Sundials.Roots.t -> unit
      val detected : Sundials.Roots.t -> int -> bool
      val rising : Sundials.Roots.t -> int -> bool
      val falling : Sundials.Roots.t -> int -> bool
      val get : Sundials.Roots.t -> int -> Sundials.Roots.r
      val set : Sundials.Roots.t -> int -> Sundials.Roots.r -> unit
      val set_noroot : Sundials.Roots.t -> int -> unit
      val set_rising : Sundials.Roots.t -> int -> unit
      val set_falling : Sundials.Roots.t -> int -> unit
      val fill : Sundials.Roots.t -> Sundials.Roots.r -> unit
      val copy : Sundials.Roots.t -> Sundials.Roots.t
      val int_of_root : Sundials.Roots.r -> int
      val reset : Sundials.Roots.t -> unit
      val exists : Sundials.Roots.t -> bool
      val iter : (Sundials.Roots.r -> unit) -> Sundials.Roots.t -> unit
      val iteri :
        (int -> Sundials.Roots.r -> unit) -> Sundials.Roots.t -> unit
      val of_list : Sundials.Roots.r list -> Sundials.Roots.t
      val to_list : Sundials.Roots.t -> Sundials.Roots.r list
      val of_array : Sundials.Roots.r array -> Sundials.Roots.t
      val to_array : Sundials.Roots.t -> Sundials.Roots.r array
    end
  module RootDirs :
    sig
      type t
      type d = Increasing | Decreasing | IncreasingOrDecreasing
      val make : int -> Sundials.RootDirs.d -> Sundials.RootDirs.t
      val create : int -> Sundials.RootDirs.t
      val init : int -> (int -> Sundials.RootDirs.d) -> Sundials.RootDirs.t
      val pp : Stdlib.Format.formatter -> Sundials.RootDirs.t -> unit
      val ppi :
        ?start:string ->
        ?stop:string ->
        ?sep:string ->
        ?item:(Stdlib.Format.formatter -> int -> Sundials.RootDirs.d -> unit) ->
        unit -> Stdlib.Format.formatter -> Sundials.RootDirs.t -> unit
      val copy : int -> Sundials.RootDirs.d array -> Sundials.RootDirs.t
      val length : Sundials.RootDirs.t -> int
      val get : Sundials.RootDirs.t -> int -> Sundials.RootDirs.d
      val set : Sundials.RootDirs.t -> int -> Sundials.RootDirs.d -> unit
      val fill : Sundials.RootDirs.t -> Sundials.RootDirs.d -> unit
      val blitn :
        src:Sundials.RootDirs.t ->
        ?spos:int -> dst:Sundials.RootDirs.t -> ?dpos:int -> int -> unit
      val blit : src:Sundials.RootDirs.t -> dst:Sundials.RootDirs.t -> unit
      val of_list : Sundials.RootDirs.d list -> Sundials.RootDirs.t
      val to_list : Sundials.RootDirs.t -> Sundials.RootDirs.d list
      val of_array : Sundials.RootDirs.d array -> Sundials.RootDirs.t
      val to_array : Sundials.RootDirs.t -> Sundials.RootDirs.d array
    end
  module Constraint :
    sig
      val unconstrained : float
      val geq_zero : float
      val leq_zero : float
      val gt_zero : float
      val lt_zero : float
      type t = Unconstrained | GeqZero | LeqZero | GtZero | LtZero
      val to_float : Sundials.Constraint.t -> float
      val of_float : float -> Sundials.Constraint.t
    end
  module Matrix = Sundials_Matrix
  module LinearSolver = Sundials_LinearSolver
  module NonlinearSolver = Sundials_NonlinearSolver
  module Util :
    sig
      type error_details = {
        error_code : int;
        module_name : string;
        function_name : string;
        error_message : string;
      }
      val format_float : string -> float -> string
      val floata : float -> string
      val compare_float : ?tol:float -> float -> float -> bool
    end
end