sig
  type kind
  type 'd t = ('d, Nvector_custom.kind) Nvector.t
  type communicator
  type 'd nvector_ops = {
    check : '-> '-> bool;
    clone : '-> 'd;
    space : ('-> int * int) option;
    getlength : '-> int;
    print : ('-> Sundials.Logfile.t option -> unit) option;
    linearsum : float -> '-> float -> '-> '-> unit;
    const : float -> '-> unit;
    prod : '-> '-> '-> unit;
    div : '-> '-> '-> unit;
    scale : float -> '-> '-> unit;
    abs : '-> '-> unit;
    inv : '-> '-> unit;
    addconst : '-> float -> '-> unit;
    maxnorm : '-> float;
    wrmsnorm : '-> '-> float;
    min : '-> float;
    dotprod : '-> '-> float;
    compare : float -> '-> '-> unit;
    invtest : '-> '-> bool;
    wl2norm : ('-> '-> float) option;
    l1norm : ('-> float) option;
    wrmsnormmask : ('-> '-> '-> float) option;
    constrmask : ('-> '-> '-> bool) option;
    minquotient : ('-> '-> float) option;
    getcommunicator : ('-> Nvector_custom.communicator) option;
    linearcombination :
      (Sundials.RealArray.t -> 'd array -> '-> unit) option;
    scaleaddmulti :
      (Sundials.RealArray.t -> '-> 'd array -> 'd array -> unit) option;
    dotprodmulti : ('-> 'd array -> Sundials.RealArray.t -> unit) option;
    linearsumvectorarray :
      (float -> 'd array -> float -> 'd array -> 'd array -> unit) option;
    scalevectorarray :
      (Sundials.RealArray.t -> 'd array -> 'd array -> unit) option;
    constvectorarray : (float -> 'd array -> unit) option;
    wrmsnormvectorarray :
      ('d array -> 'd array -> Sundials.RealArray.t -> unit) option;
    wrmsnormmaskvectorarray :
      ('d array -> 'd array -> '-> Sundials.RealArray.t -> unit) option;
    scaleaddmultivectorarray :
      (Sundials.RealArray.t ->
       'd array -> 'd array array -> 'd array array -> unit)
      option;
    linearcombinationvectorarray :
      (Sundials.RealArray.t -> 'd array array -> 'd array -> unit) option;
    dotprod_local : ('-> '-> float) option;
    maxnorm_local : ('-> float) option;
    min_local : ('-> float) option;
    l1norm_local : ('-> float) option;
    invtest_local : ('-> '-> bool) option;
    constrmask_local : ('-> '-> '-> bool) option;
    minquotient_local : ('-> '-> float) option;
    wsqrsum_local : ('-> '-> float) option;
    wsqrsummask_local : ('-> '-> '-> float) option;
    dotprodmulti_local :
      ('-> 'd array -> Sundials.RealArray.t -> unit) option;
    dotprodmulti_allreduce : ('-> Sundials.RealArray.t -> unit) option;
  }
  val make_wrap :
    'Nvector_custom.nvector_ops ->
    ?context:Sundials.Context.t ->
    ?with_fused_ops:bool -> '-> 'Nvector_custom.t
  val add_tracing :
    string -> 'Nvector_custom.nvector_ops -> 'Nvector_custom.nvector_ops
  val enable :
    ?with_fused_ops:bool ->
    ?with_linear_combination:bool ->
    ?with_scale_add_multi:bool ->
    ?with_dot_prod_multi:bool ->
    ?with_linear_sum_vector_array:bool ->
    ?with_scale_vector_array:bool ->
    ?with_const_vector_array:bool ->
    ?with_wrms_norm_vector_array:bool ->
    ?with_wrms_norm_mask_vector_array:bool ->
    ?with_scale_add_multi_vector_array:bool ->
    ?with_linear_combination_vector_array:bool -> 'Nvector_custom.t -> unit
  module MakeOps :
    functor
      (A : sig
             type data
             val ops : Nvector_custom.MakeOps.data Nvector_custom.nvector_ops
           end)
      ->
      sig
        type kind = kind
        type data = A.data
        type t = (data, kind) Nvector.nvector
        val wrap :
          ?context:Sundials.Context.t -> ?with_fused_ops:bool -> data -> t
        val enable :
          ?with_fused_ops:bool ->
          ?with_linear_combination:bool ->
          ?with_scale_add_multi:bool ->
          ?with_dot_prod_multi:bool ->
          ?with_linear_sum_vector_array:bool ->
          ?with_scale_vector_array:bool ->
          ?with_const_vector_array:bool ->
          ?with_wrms_norm_vector_array:bool ->
          ?with_wrms_norm_mask_vector_array:bool ->
          ?with_scale_add_multi_vector_array:bool ->
          ?with_linear_combination_vector_array:bool -> t -> unit
        module Ops :
          sig
            type t = t
            val clone : t -> t
            val linearsum : float -> t -> float -> t -> t -> unit
            val const : float -> t -> unit
            val prod : t -> t -> t -> unit
            val div : t -> t -> t -> unit
            val scale : float -> t -> t -> unit
            val abs : t -> t -> unit
            val inv : t -> t -> unit
            val addconst : t -> float -> t -> unit
            val dotprod : t -> t -> float
            val maxnorm : t -> float
            val wrmsnorm : t -> t -> float
            val min : t -> float
            val compare : float -> t -> t -> unit
            val invtest : t -> t -> bool
            val wl2norm : t -> t -> float
            val l1norm : t -> float
            val wrmsnormmask : t -> t -> t -> float
            val constrmask : t -> t -> t -> bool
            val minquotient : t -> t -> float
            val space : t -> int * int
            val getlength : t -> int
            val print : ?logfile:Sundials.Logfile.t -> t -> unit
            val linearcombination :
              Sundials.RealArray.t -> t array -> t -> unit
            val scaleaddmulti :
              Sundials.RealArray.t -> t -> t array -> t array -> unit
            val dotprodmulti : t -> t array -> Sundials.RealArray.t -> unit
            val linearsumvectorarray :
              float -> t array -> float -> t array -> t array -> unit
            val scalevectorarray :
              Sundials.RealArray.t -> t array -> t array -> unit
            val constvectorarray : float -> t array -> unit
            val wrmsnormvectorarray :
              t array -> t array -> Sundials.RealArray.t -> unit
            val wrmsnormmaskvectorarray :
              t array -> t array -> t -> Sundials.RealArray.t -> unit
            val scaleaddmultivectorarray :
              Sundials.RealArray.t ->
              t array -> t array array -> t array array -> unit
            val linearcombinationvectorarray :
              Sundials.RealArray.t -> t array array -> t array -> unit
            module Local :
              sig
                val dotprod : t -> t -> float
                val maxnorm : t -> float
                val min : t -> float
                val l1norm : t -> float
                val invtest : t -> t -> bool
                val constrmask : t -> t -> t -> bool
                val minquotient : t -> t -> float
                val wsqrsum : t -> t -> float
                val wsqrsummask : t -> t -> t -> float
                val dotprodmulti :
                  t -> t array -> Sundials.RealArray.t -> unit
                val dotprodmulti_allreduce :
                  t -> Sundials.RealArray.t -> unit
              end
          end
        module DataOps :
          sig
            type t = data
            val clone : t -> t
            val linearsum : float -> t -> float -> t -> t -> unit
            val const : float -> t -> unit
            val prod : t -> t -> t -> unit
            val div : t -> t -> t -> unit
            val scale : float -> t -> t -> unit
            val abs : t -> t -> unit
            val inv : t -> t -> unit
            val addconst : t -> float -> t -> unit
            val dotprod : t -> t -> float
            val maxnorm : t -> float
            val wrmsnorm : t -> t -> float
            val min : t -> float
            val compare : float -> t -> t -> unit
            val invtest : t -> t -> bool
            val wl2norm : t -> t -> float
            val l1norm : t -> float
            val wrmsnormmask : t -> t -> t -> float
            val constrmask : t -> t -> t -> bool
            val minquotient : t -> t -> float
            val space : t -> int * int
            val getlength : t -> int
            val print : ?logfile:Sundials.Logfile.t -> t -> unit
            val linearcombination :
              Sundials.RealArray.t -> t array -> t -> unit
            val scaleaddmulti :
              Sundials.RealArray.t -> t -> t array -> t array -> unit
            val dotprodmulti : t -> t array -> Sundials.RealArray.t -> unit
            val linearsumvectorarray :
              float -> t array -> float -> t array -> t array -> unit
            val scalevectorarray :
              Sundials.RealArray.t -> t array -> t array -> unit
            val constvectorarray : float -> t array -> unit
            val wrmsnormvectorarray :
              t array -> t array -> Sundials.RealArray.t -> unit
            val wrmsnormmaskvectorarray :
              t array -> t array -> t -> Sundials.RealArray.t -> unit
            val scaleaddmultivectorarray :
              Sundials.RealArray.t ->
              t array -> t array array -> t array array -> unit
            val linearcombinationvectorarray :
              Sundials.RealArray.t -> t array array -> t array -> unit
            module Local :
              sig
                val dotprod : t -> t -> float
                val maxnorm : t -> float
                val min : t -> float
                val l1norm : t -> float
                val invtest : t -> t -> bool
                val constrmask : t -> t -> t -> bool
                val minquotient : t -> t -> float
                val wsqrsum : t -> t -> float
                val wsqrsummask : t -> t -> t -> float
                val dotprodmulti :
                  t -> t array -> Sundials.RealArray.t -> unit
                val dotprodmulti_allreduce :
                  t -> Sundials.RealArray.t -> unit
              end
          end
      end
  module Any :
    sig
      val convert_ops :
        inject:('-> Nvector.gdata) ->
        project:(Nvector.gdata -> 'd) ->
        'Nvector_custom.nvector_ops ->
        Nvector.gdata Nvector_custom.nvector_ops
      val make_wrap :
        Nvector.gdata Nvector_custom.nvector_ops ->
        inject:('-> Nvector.gdata) ->
        ?context:Sundials.Context.t ->
        ?with_fused_ops:bool ->
        ?with_linear_combination:bool ->
        ?with_scale_add_multi:bool ->
        ?with_dot_prod_multi:bool ->
        ?with_linear_sum_vector_array:bool ->
        ?with_scale_vector_array:bool ->
        ?with_const_vector_array:bool ->
        ?with_wrms_norm_vector_array:bool ->
        ?with_wrms_norm_mask_vector_array:bool ->
        ?with_scale_add_multi_vector_array:bool ->
        ?with_linear_combination_vector_array:bool -> '-> Nvector.any
    end
end