sig
  type float32_elt = Bigarray.float32_elt = Float32_elt
  type float64_elt = Bigarray.float64_elt = Float64_elt
  type complex32_elt = Bigarray.complex32_elt = Complex32_elt
  type complex64_elt = Bigarray.complex64_elt = Complex64_elt
  type int8_signed_elt = Bigarray.int8_signed_elt = Int8_signed_elt
  type int8_unsigned_elt = Bigarray.int8_unsigned_elt = Int8_unsigned_elt
  type int16_signed_elt = Bigarray.int16_signed_elt = Int16_signed_elt
  type int16_unsigned_elt = Bigarray.int16_unsigned_elt = Int16_unsigned_elt
  type int_elt = Bigarray.int_elt = Int_elt
  type int32_elt = Bigarray.int32_elt = Int32_elt
  type int64_elt = Bigarray.int64_elt = Int64_elt
  type nativeint_elt = Bigarray.nativeint_elt = Nativeint_elt
  type ('a, 'b) kind =
    ('a, 'b) Bigarray.kind =
      Float32 : (float, BatBigarray.float32_elt) BatBigarray.kind
    | Float64 : (float, BatBigarray.float64_elt) BatBigarray.kind
    | Int8_signed : (int, BatBigarray.int8_signed_elt) BatBigarray.kind
    | Int8_unsigned : (int, BatBigarray.int8_unsigned_elt) BatBigarray.kind
    | Int16_signed : (int, BatBigarray.int16_signed_elt) BatBigarray.kind
    | Int16_unsigned : (int, BatBigarray.int16_unsigned_elt) BatBigarray.kind
    | Int32 : (int32, BatBigarray.int32_elt) BatBigarray.kind
    | Int64 : (int64, BatBigarray.int64_elt) BatBigarray.kind
    | Int : (int, BatBigarray.int_elt) BatBigarray.kind
    | Nativeint : (nativeint, BatBigarray.nativeint_elt) BatBigarray.kind
    | Complex32 :
        (Stdlib.Complex.t, BatBigarray.complex32_elt) BatBigarray.kind
    | Complex64 :
        (Stdlib.Complex.t, BatBigarray.complex64_elt) BatBigarray.kind
    | Char : (char, BatBigarray.int8_unsigned_elt) BatBigarray.kind
  val float32 : (float, BatBigarray.float32_elt) BatBigarray.kind
  val float64 : (float, BatBigarray.float64_elt) BatBigarray.kind
  val complex32 :
    (Stdlib.Complex.t, BatBigarray.complex32_elt) BatBigarray.kind
  val complex64 :
    (Stdlib.Complex.t, BatBigarray.complex64_elt) BatBigarray.kind
  val int8_signed : (int, BatBigarray.int8_signed_elt) BatBigarray.kind
  val int8_unsigned : (int, BatBigarray.int8_unsigned_elt) BatBigarray.kind
  val int16_signed : (int, BatBigarray.int16_signed_elt) BatBigarray.kind
  val int16_unsigned : (int, BatBigarray.int16_unsigned_elt) BatBigarray.kind
  val int : (int, BatBigarray.int_elt) BatBigarray.kind
  val int32 : (int32, BatBigarray.int32_elt) BatBigarray.kind
  val int64 : (int64, BatBigarray.int64_elt) BatBigarray.kind
  val nativeint : (nativeint, BatBigarray.nativeint_elt) BatBigarray.kind
  val char : (char, BatBigarray.int8_unsigned_elt) BatBigarray.kind
  val kind_size_in_bytes : ('a, 'b) BatBigarray.kind -> int
  type c_layout = Bigarray.c_layout = C_layout_typ
  type fortran_layout = Bigarray.fortran_layout = Fortran_layout_typ
  type 'a layout =
    'Bigarray.layout =
      C_layout : BatBigarray.c_layout BatBigarray.layout
    | Fortran_layout : BatBigarray.fortran_layout BatBigarray.layout
  val c_layout : BatBigarray.c_layout BatBigarray.layout
  val fortran_layout : BatBigarray.fortran_layout BatBigarray.layout
  module Genarray :
    sig
      type ('a, 'b, 'c) t = ('a, 'b, 'c) Bigarray.Genarray.t
      external create :
        ('a, 'b) BatBigarray.kind ->
        'BatBigarray.layout ->
        int array -> ('a, 'b, 'c) BatBigarray.Genarray.t = "caml_ba_create"
      external num_dims : ('a, 'b, 'c) BatBigarray.Genarray.t -> int
        = "caml_ba_num_dims"
      val dims : ('a, 'b, 'c) BatBigarray.Genarray.t -> int array
      external nth_dim : ('a, 'b, 'c) BatBigarray.Genarray.t -> int -> int
        = "caml_ba_dim"
      external kind :
        ('a, 'b, 'c) BatBigarray.Genarray.t -> ('a, 'b) BatBigarray.kind
        = "caml_ba_kind"
      external layout :
        ('a, 'b, 'c) BatBigarray.Genarray.t -> 'BatBigarray.layout
        = "caml_ba_layout"
      external change_layout :
        ('a, 'b, 'c) BatBigarray.Genarray.t ->
        'BatBigarray.layout -> ('a, 'b, 'd) BatBigarray.Genarray.t
        = "caml_ba_change_layout"
      val size_in_bytes : ('a, 'b, 'c) BatBigarray.Genarray.t -> int
      external get : ('a, 'b, 'c) BatBigarray.Genarray.t -> int array -> 'a
        = "caml_ba_get_generic"
      external set :
        ('a, 'b, 'c) BatBigarray.Genarray.t -> int array -> '-> unit
        = "caml_ba_set_generic"
      external sub_left :
        ('a, 'b, BatBigarray.c_layout) BatBigarray.Genarray.t ->
        int -> int -> ('a, 'b, BatBigarray.c_layout) BatBigarray.Genarray.t
        = "caml_ba_sub"
      external sub_right :
        ('a, 'b, BatBigarray.fortran_layout) BatBigarray.Genarray.t ->
        int ->
        int -> ('a, 'b, BatBigarray.fortran_layout) BatBigarray.Genarray.t
        = "caml_ba_sub"
      external slice_left :
        ('a, 'b, BatBigarray.c_layout) BatBigarray.Genarray.t ->
        int array -> ('a, 'b, BatBigarray.c_layout) BatBigarray.Genarray.t
        = "caml_ba_slice"
      external slice_right :
        ('a, 'b, BatBigarray.fortran_layout) BatBigarray.Genarray.t ->
        int array ->
        ('a, 'b, BatBigarray.fortran_layout) BatBigarray.Genarray.t
        = "caml_ba_slice"
      external blit :
        ('a, 'b, 'c) BatBigarray.Genarray.t ->
        ('a, 'b, 'c) BatBigarray.Genarray.t -> unit = "caml_ba_blit"
      external fill : ('a, 'b, 'c) BatBigarray.Genarray.t -> '-> unit
        = "caml_ba_fill"
      val map_file :
        Unix.file_descr ->
        ?pos:int64 ->
        ('a, 'b) BatBigarray.kind ->
        'BatBigarray.layout ->
        bool -> int array -> ('a, 'b, 'c) BatBigarray.Genarray.t
      val iter : ('-> unit) -> ('a, 'b, 'c) BatBigarray.Genarray.t -> unit
      val iteri :
        ((int, [ `Read ]) BatArray.Cap.t -> '-> unit) ->
        ('a, 'b, 'c) BatBigarray.Genarray.t -> unit
      val modify : ('-> 'a) -> ('a, 'b, 'c) BatBigarray.Genarray.t -> unit
      val modifyi :
        ((int, [ `Read ]) BatArray.Cap.t -> '-> 'a) ->
        ('a, 'b, 'c) BatBigarray.Genarray.t -> unit
      val enum : ('a, 'b, 'c) BatBigarray.Genarray.t -> 'BatEnum.t
      val map :
        ('-> 'b) ->
        ('b, 'c) Bigarray.kind ->
        ('a, 'd, 'e) BatBigarray.Genarray.t ->
        ('b, 'c, 'e) BatBigarray.Genarray.t
      val mapi :
        ((int, [ `Read ]) BatArray.Cap.t -> '-> 'b) ->
        ('b, 'c) Bigarray.kind ->
        ('a, 'd, 'e) BatBigarray.Genarray.t ->
        ('b, 'c, 'e) BatBigarray.Genarray.t
    end
  module Array0 :
    sig
      type ('a, 'b, 'c) t = ('a, 'b, 'c) Bigarray.Array0.t
      val create :
        ('a, 'b) BatBigarray.kind ->
        'BatBigarray.layout -> ('a, 'b, 'c) BatBigarray.Array0.t
      external kind :
        ('a, 'b, 'c) BatBigarray.Array0.t -> ('a, 'b) BatBigarray.kind
        = "caml_ba_kind"
      external layout :
        ('a, 'b, 'c) BatBigarray.Array0.t -> 'BatBigarray.layout
        = "caml_ba_layout"
      val change_layout :
        ('a, 'b, 'c) BatBigarray.Array0.t ->
        'BatBigarray.layout -> ('a, 'b, 'd) BatBigarray.Array0.t
      val size_in_bytes : ('a, 'b, 'c) BatBigarray.Array0.t -> int
      val get : ('a, 'b, 'c) BatBigarray.Array0.t -> 'a
      val set : ('a, 'b, 'c) BatBigarray.Array0.t -> '-> unit
      external blit :
        ('a, 'b, 'c) BatBigarray.Array0.t ->
        ('a, 'b, 'c) BatBigarray.Array0.t -> unit = "caml_ba_blit"
      external fill : ('a, 'b, 'c) BatBigarray.Array0.t -> '-> unit
        = "caml_ba_fill"
      val of_value :
        ('a, 'b) BatBigarray.kind ->
        'BatBigarray.layout -> '-> ('a, 'b, 'c) BatBigarray.Array0.t
    end
  module Array1 :
    sig
      type ('a, 'b, 'c) t = ('a, 'b, 'c) Bigarray.Array1.t
      val create :
        ('a, 'b) BatBigarray.kind ->
        'BatBigarray.layout -> int -> ('a, 'b, 'c) BatBigarray.Array1.t
      external dim : ('a, 'b, 'c) BatBigarray.Array1.t -> int
        = "%caml_ba_dim_1"
      external kind :
        ('a, 'b, 'c) BatBigarray.Array1.t -> ('a, 'b) BatBigarray.kind
        = "caml_ba_kind"
      external layout :
        ('a, 'b, 'c) BatBigarray.Array1.t -> 'BatBigarray.layout
        = "caml_ba_layout"
      val change_layout :
        ('a, 'b, 'c) BatBigarray.Array1.t ->
        'BatBigarray.layout -> ('a, 'b, 'd) BatBigarray.Array1.t
      val size_in_bytes : ('a, 'b, 'c) BatBigarray.Array1.t -> int
      external get : ('a, 'b, 'c) BatBigarray.Array1.t -> int -> 'a
        = "%caml_ba_ref_1"
      external set : ('a, 'b, 'c) BatBigarray.Array1.t -> int -> '-> unit
        = "%caml_ba_set_1"
      external sub :
        ('a, 'b, 'c) BatBigarray.Array1.t ->
        int -> int -> ('a, 'b, 'c) BatBigarray.Array1.t = "caml_ba_sub"
      val slice :
        ('a, 'b, 'c) BatBigarray.Array1.t ->
        int -> ('a, 'b, 'c) BatBigarray.Array0.t
      external blit :
        ('a, 'b, 'c) BatBigarray.Array1.t ->
        ('a, 'b, 'c) BatBigarray.Array1.t -> unit = "caml_ba_blit"
      external fill : ('a, 'b, 'c) BatBigarray.Array1.t -> '-> unit
        = "caml_ba_fill"
      val of_array :
        ('a, 'b) BatBigarray.kind ->
        'BatBigarray.layout ->
        'a array -> ('a, 'b, 'c) BatBigarray.Array1.t
      val map_file :
        Unix.file_descr ->
        ?pos:int64 ->
        ('a, 'b) BatBigarray.kind ->
        'BatBigarray.layout ->
        bool -> int -> ('a, 'b, 'c) BatBigarray.Array1.t
      val enum : ('a, 'b, 'c) BatBigarray.Array1.t -> 'BatEnum.t
      val of_enum :
        ('a, 'b) BatBigarray.kind ->
        'BatBigarray.layout ->
        'BatEnum.t -> ('a, 'b, 'c) BatBigarray.Array1.t
      val map :
        ('-> 'b) ->
        ('b, 'c) Bigarray.kind ->
        ('a, 'd, 'e) BatBigarray.Array1.t ->
        ('b, 'c, 'e) BatBigarray.Array1.t
      val mapi :
        (int -> '-> 'b) ->
        ('b, 'c) Bigarray.kind ->
        ('a, 'd, 'e) BatBigarray.Array1.t ->
        ('b, 'c, 'e) BatBigarray.Array1.t
      val modify : ('-> 'a) -> ('a, 'b, 'c) BatBigarray.Array1.t -> unit
      val modifyi :
        (int -> '-> 'a) -> ('a, 'b, 'c) BatBigarray.Array1.t -> unit
      val to_array : ('a, 'b, 'c) BatBigarray.Array1.t -> 'a array
      external unsafe_get : ('a, 'b, 'c) BatBigarray.Array1.t -> int -> 'a
        = "%caml_ba_unsafe_ref_1"
      external unsafe_set :
        ('a, 'b, 'c) BatBigarray.Array1.t -> int -> '-> unit
        = "%caml_ba_unsafe_set_1"
    end
  module Array2 :
    sig
      type ('a, 'b, 'c) t = ('a, 'b, 'c) Bigarray.Array2.t
      val create :
        ('a, 'b) BatBigarray.kind ->
        'BatBigarray.layout ->
        int -> int -> ('a, 'b, 'c) BatBigarray.Array2.t
      external dim1 : ('a, 'b, 'c) BatBigarray.Array2.t -> int
        = "%caml_ba_dim_1"
      external dim2 : ('a, 'b, 'c) BatBigarray.Array2.t -> int
        = "%caml_ba_dim_2"
      external kind :
        ('a, 'b, 'c) BatBigarray.Array2.t -> ('a, 'b) BatBigarray.kind
        = "caml_ba_kind"
      external layout :
        ('a, 'b, 'c) BatBigarray.Array2.t -> 'BatBigarray.layout
        = "caml_ba_layout"
      val change_layout :
        ('a, 'b, 'c) BatBigarray.Array2.t ->
        'BatBigarray.layout -> ('a, 'b, 'd) BatBigarray.Array2.t
      val size_in_bytes : ('a, 'b, 'c) BatBigarray.Array2.t -> int
      external get : ('a, 'b, 'c) BatBigarray.Array2.t -> int -> int -> 'a
        = "%caml_ba_ref_2"
      external set :
        ('a, 'b, 'c) BatBigarray.Array2.t -> int -> int -> '-> unit
        = "%caml_ba_set_2"
      external sub_left :
        ('a, 'b, BatBigarray.c_layout) BatBigarray.Array2.t ->
        int -> int -> ('a, 'b, BatBigarray.c_layout) BatBigarray.Array2.t
        = "caml_ba_sub"
      external sub_right :
        ('a, 'b, BatBigarray.fortran_layout) BatBigarray.Array2.t ->
        int ->
        int -> ('a, 'b, BatBigarray.fortran_layout) BatBigarray.Array2.t
        = "caml_ba_sub"
      val slice_left :
        ('a, 'b, BatBigarray.c_layout) BatBigarray.Array2.t ->
        int -> ('a, 'b, BatBigarray.c_layout) BatBigarray.Array1.t
      val slice_right :
        ('a, 'b, BatBigarray.fortran_layout) BatBigarray.Array2.t ->
        int -> ('a, 'b, BatBigarray.fortran_layout) BatBigarray.Array1.t
      external blit :
        ('a, 'b, 'c) BatBigarray.Array2.t ->
        ('a, 'b, 'c) BatBigarray.Array2.t -> unit = "caml_ba_blit"
      external fill : ('a, 'b, 'c) BatBigarray.Array2.t -> '-> unit
        = "caml_ba_fill"
      val of_array :
        ('a, 'b) BatBigarray.kind ->
        'BatBigarray.layout ->
        'a array array -> ('a, 'b, 'c) BatBigarray.Array2.t
      val map_file :
        Unix.file_descr ->
        ?pos:int64 ->
        ('a, 'b) BatBigarray.kind ->
        'BatBigarray.layout ->
        bool -> int -> int -> ('a, 'b, 'c) BatBigarray.Array2.t
      val enum : ('a, 'b, 'c) BatBigarray.Array2.t -> 'BatEnum.t
      val map :
        ('-> 'b) ->
        ('b, 'c) Bigarray.kind ->
        ('a, 'd, 'e) BatBigarray.Array2.t ->
        ('b, 'c, 'e) BatBigarray.Array2.t
      val mapij :
        (int -> int -> '-> 'b) ->
        ('b, 'c) Bigarray.kind ->
        ('a, 'd, 'e) BatBigarray.Array2.t ->
        ('b, 'c, 'e) BatBigarray.Array2.t
      val modify : ('-> 'a) -> ('a, 'b, 'c) BatBigarray.Array2.t -> unit
      val modifyij :
        (int -> int -> '-> 'a) -> ('a, 'b, 'c) BatBigarray.Array2.t -> unit
      val to_array : ('a, 'b, 'c) BatBigarray.Array2.t -> 'a array array
      external unsafe_get :
        ('a, 'b, 'c) BatBigarray.Array2.t -> int -> int -> 'a
        = "%caml_ba_unsafe_ref_2"
      external unsafe_set :
        ('a, 'b, 'c) BatBigarray.Array2.t -> int -> int -> '-> unit
        = "%caml_ba_unsafe_set_2"
    end
  module Array3 :
    sig
      type ('a, 'b, 'c) t = ('a, 'b, 'c) Bigarray.Array3.t
      val create :
        ('a, 'b) BatBigarray.kind ->
        'BatBigarray.layout ->
        int -> int -> int -> ('a, 'b, 'c) BatBigarray.Array3.t
      external dim1 : ('a, 'b, 'c) BatBigarray.Array3.t -> int
        = "%caml_ba_dim_1"
      external dim2 : ('a, 'b, 'c) BatBigarray.Array3.t -> int
        = "%caml_ba_dim_2"
      external dim3 : ('a, 'b, 'c) BatBigarray.Array3.t -> int
        = "%caml_ba_dim_3"
      external kind :
        ('a, 'b, 'c) BatBigarray.Array3.t -> ('a, 'b) BatBigarray.kind
        = "caml_ba_kind"
      external layout :
        ('a, 'b, 'c) BatBigarray.Array3.t -> 'BatBigarray.layout
        = "caml_ba_layout"
      val change_layout :
        ('a, 'b, 'c) BatBigarray.Array3.t ->
        'BatBigarray.layout -> ('a, 'b, 'd) BatBigarray.Array3.t
      val size_in_bytes : ('a, 'b, 'c) BatBigarray.Array3.t -> int
      external get :
        ('a, 'b, 'c) BatBigarray.Array3.t -> int -> int -> int -> 'a
        = "%caml_ba_ref_3"
      external set :
        ('a, 'b, 'c) BatBigarray.Array3.t -> int -> int -> int -> '-> unit
        = "%caml_ba_set_3"
      external sub_left :
        ('a, 'b, BatBigarray.c_layout) BatBigarray.Array3.t ->
        int -> int -> ('a, 'b, BatBigarray.c_layout) BatBigarray.Array3.t
        = "caml_ba_sub"
      external sub_right :
        ('a, 'b, BatBigarray.fortran_layout) BatBigarray.Array3.t ->
        int ->
        int -> ('a, 'b, BatBigarray.fortran_layout) BatBigarray.Array3.t
        = "caml_ba_sub"
      val slice_left_1 :
        ('a, 'b, BatBigarray.c_layout) BatBigarray.Array3.t ->
        int -> int -> ('a, 'b, BatBigarray.c_layout) BatBigarray.Array1.t
      val slice_right_1 :
        ('a, 'b, BatBigarray.fortran_layout) BatBigarray.Array3.t ->
        int ->
        int -> ('a, 'b, BatBigarray.fortran_layout) BatBigarray.Array1.t
      val slice_left_2 :
        ('a, 'b, BatBigarray.c_layout) BatBigarray.Array3.t ->
        int -> ('a, 'b, BatBigarray.c_layout) BatBigarray.Array2.t
      val slice_right_2 :
        ('a, 'b, BatBigarray.fortran_layout) BatBigarray.Array3.t ->
        int -> ('a, 'b, BatBigarray.fortran_layout) BatBigarray.Array2.t
      external blit :
        ('a, 'b, 'c) BatBigarray.Array3.t ->
        ('a, 'b, 'c) BatBigarray.Array3.t -> unit = "caml_ba_blit"
      external fill : ('a, 'b, 'c) BatBigarray.Array3.t -> '-> unit
        = "caml_ba_fill"
      val of_array :
        ('a, 'b) BatBigarray.kind ->
        'BatBigarray.layout ->
        'a array array array -> ('a, 'b, 'c) BatBigarray.Array3.t
      val map_file :
        Unix.file_descr ->
        ?pos:int64 ->
        ('a, 'b) BatBigarray.kind ->
        'BatBigarray.layout ->
        bool -> int -> int -> int -> ('a, 'b, 'c) BatBigarray.Array3.t
      val enum : ('a, 'b, 'c) BatBigarray.Array3.t -> 'BatEnum.t
      val map :
        ('-> 'b) ->
        ('b, 'c) Bigarray.kind ->
        ('a, 'd, 'e) BatBigarray.Array3.t ->
        ('b, 'c, 'e) BatBigarray.Array3.t
      val mapijk :
        (int -> int -> int -> '-> 'b) ->
        ('b, 'c) Bigarray.kind ->
        ('a, 'd, 'e) BatBigarray.Array3.t ->
        ('b, 'c, 'e) BatBigarray.Array3.t
      val modify : ('-> 'a) -> ('a, 'b, 'c) BatBigarray.Array3.t -> unit
      val modifyijk :
        (int -> int -> int -> '-> 'a) ->
        ('a, 'b, 'c) BatBigarray.Array3.t -> unit
      val to_array :
        ('a, 'b, 'c) BatBigarray.Array3.t -> 'a array array array
      external unsafe_get :
        ('a, 'b, 'c) BatBigarray.Array3.t -> int -> int -> int -> 'a
        = "%caml_ba_unsafe_ref_3"
      external unsafe_set :
        ('a, 'b, 'c) BatBigarray.Array3.t -> int -> int -> int -> '-> unit
        = "%caml_ba_unsafe_set_3"
    end
  external genarray_of_array0 :
    ('a, 'b, 'c) BatBigarray.Array0.t -> ('a, 'b, 'c) BatBigarray.Genarray.t
    = "%identity"
  external genarray_of_array1 :
    ('a, 'b, 'c) BatBigarray.Array1.t -> ('a, 'b, 'c) BatBigarray.Genarray.t
    = "%identity"
  external genarray_of_array2 :
    ('a, 'b, 'c) BatBigarray.Array2.t -> ('a, 'b, 'c) BatBigarray.Genarray.t
    = "%identity"
  external genarray_of_array3 :
    ('a, 'b, 'c) BatBigarray.Array3.t -> ('a, 'b, 'c) BatBigarray.Genarray.t
    = "%identity"
  val array0_of_genarray :
    ('a, 'b, 'c) BatBigarray.Genarray.t -> ('a, 'b, 'c) BatBigarray.Array0.t
  val array1_of_genarray :
    ('a, 'b, 'c) BatBigarray.Genarray.t -> ('a, 'b, 'c) BatBigarray.Array1.t
  val array2_of_genarray :
    ('a, 'b, 'c) BatBigarray.Genarray.t -> ('a, 'b, 'c) BatBigarray.Array2.t
  val array3_of_genarray :
    ('a, 'b, 'c) BatBigarray.Genarray.t -> ('a, 'b, 'c) BatBigarray.Array3.t
  val reshape :
    ('a, 'b, 'c) BatBigarray.Genarray.t ->
    int array -> ('a, 'b, 'c) BatBigarray.Genarray.t
  val reshape_0 :
    ('a, 'b, 'c) BatBigarray.Genarray.t -> ('a, 'b, 'c) BatBigarray.Array0.t
  val reshape_1 :
    ('a, 'b, 'c) BatBigarray.Genarray.t ->
    int -> ('a, 'b, 'c) BatBigarray.Array1.t
  val reshape_2 :
    ('a, 'b, 'c) BatBigarray.Genarray.t ->
    int -> int -> ('a, 'b, 'c) BatBigarray.Array2.t
  val reshape_3 :
    ('a, 'b, 'c) BatBigarray.Genarray.t ->
    int -> int -> int -> ('a, 'b, 'c) BatBigarray.Array3.t
end