sig
  type 'd prec_solve_arg = {
    rhs : 'd;
    gamma : float;
    delta : float;
    left : bool;
  }
  type 'd prec_solve_fn =
      (unit, 'd) Arkode.Common.jacobian_arg ->
      'Arkode.Spils.prec_solve_arg -> '-> unit
  type 'd prec_setup_fn =
      (unit, 'd) Arkode.Common.jacobian_arg -> bool -> float -> bool
  type ('d, 'k, 's) preconditioner =
      ('d, 'k, 's) Arkode_impl.SpilsTypes.preconditioner
  module Banded :
    sig
      type bandrange = { mupper : int; mlower : int; }
      val prec_left :
        Arkode.Spils.Banded.bandrange ->
        (Nvector_serial.data, [> Nvector_serial.kind ], 's)
        Arkode.Spils.preconditioner
      val prec_right :
        Arkode.Spils.Banded.bandrange ->
        (Nvector_serial.data, [> Nvector_serial.kind ], 's)
        Arkode.Spils.preconditioner
      val prec_both :
        Arkode.Spils.Banded.bandrange ->
        (Nvector_serial.data, [> Nvector_serial.kind ], 's)
        Arkode.Spils.preconditioner
      type ('a, 'b) serial_session =
          (Nvector_serial.data, 'a, 'b) Arkode_impl.session
        constraint 'a = [> Nvector_serial.kind ]
        constraint 'b = [< `ARKStep | `MRIStep ]
      val get_work_space :
        ([> Nvector_serial.kind ], [< `ARKStep | `MRIStep ])
        Arkode.Spils.Banded.serial_session -> int * int
      val get_num_rhs_evals :
        ([> Nvector_serial.kind ], [< `ARKStep | `MRIStep ])
        Arkode.Spils.Banded.serial_session -> int
    end
  type 'd jac_times_setup_fn = (unit, 'd) Arkode.Common.jacobian_arg -> unit
  type 'd jac_times_vec_fn =
      ('d, 'd) Arkode.Common.jacobian_arg -> '-> '-> unit
end