sig
  type elt
  type ('a, 'b) t = (CCArray1.S.elt, 'a, 'b) CCArray1.array_
    constraint 'b = [< `R | `W ]
  val add :
    ?res:('a, [< `R | `W > `W ] as 'b) CCArray1.S.t ->
    ('a, [< `R | `W > `R ]) CCArray1.S.t ->
    ('a, [< `R | `W > `R ]) CCArray1.S.t -> ('a, 'b) CCArray1.S.t
  val mult :
    ?res:('a, [< `R | `W > `W ] as 'b) CCArray1.S.t ->
    ('a, [< `R | `W > `R ]) CCArray1.S.t ->
    ('a, [< `R | `W > `R ]) CCArray1.S.t -> ('a, 'b) CCArray1.S.t
  val scalar_add :
    ?res:('a, [< `R | `W > `W ] as 'b) CCArray1.S.t ->
    ('a, [< `R | `W > `R ]) CCArray1.S.t ->
    x:CCArray1.S.elt -> ('a, 'b) CCArray1.S.t
  val scalar_mult :
    ?res:('a, [< `R | `W > `W ] as 'b) CCArray1.S.t ->
    ('a, [< `R | `W > `R ]) CCArray1.S.t ->
    x:CCArray1.S.elt -> ('a, 'b) CCArray1.S.t
  val sum_elt : ('a, [< `R | `W > `R ]) CCArray1.S.t -> CCArray1.S.elt
  val product_elt : ('a, [< `R | `W > `R ]) CCArray1.S.t -> CCArray1.S.elt
  val dot_product :
    ('a, [< `R | `W > `R ]) CCArray1.S.t ->
    ('b, [< `R | `W > `R ]) CCArray1.S.t -> CCArray1.S.elt
  module Infix :
    sig
      val ( * ) :
        ('a, [< `R | `W > `R ]) CCArray1.S.t ->
        ('a, [< `R | `W > `R ]) CCArray1.S.t ->
        ('a, [< `R | `W ]) CCArray1.S.t
      val ( + ) :
        ('a, [< `R | `W > `R ]) CCArray1.S.t ->
        ('b, [< `R | `W > `R ]) CCArray1.S.t ->
        ('a, [< `R | `W ]) CCArray1.S.t
      val ( *! ) :
        ('a, [< `R | `W > `R ]) CCArray1.S.t ->
        CCArray1.S.elt -> ('a, [< `R | `W ]) CCArray1.S.t
      val ( +! ) :
        ('a, [< `R | `W > `R ]) CCArray1.S.t ->
        CCArray1.S.elt -> ('a, [< `R | `W ]) CCArray1.S.t
    end
  val ( * ) :
    ('a, [< `R | `W > `R ]) t ->
    ('a, [< `R | `W > `R ]) t -> ('a, [< `R | `W ]) t
  val ( + ) :
    ('a, [< `R | `W > `R ]) t ->
    ('b, [< `R | `W > `R ]) t -> ('a, [< `R | `W ]) t
  val ( *! ) : ('a, [< `R | `W > `R ]) t -> elt -> ('a, [< `R | `W ]) t
  val ( +! ) : ('a, [< `R | `W > `R ]) t -> elt -> ('a, [< `R | `W ]) t
end