sig
  exception No_solution
  exception Nonlinear
  module type Vector =
    sig
      type t
      type dim
      type scalar
      val equal : Linear.Vector.t -> Linear.Vector.t -> bool
      val add : Linear.Vector.t -> Linear.Vector.t -> Linear.Vector.t
      val scalar_mul :
        Linear.Vector.scalar -> Linear.Vector.t -> Linear.Vector.t
      val negate : Linear.Vector.t -> Linear.Vector.t
      val sub : Linear.Vector.t -> Linear.Vector.t -> Linear.Vector.t
      val dot : Linear.Vector.t -> Linear.Vector.t -> Linear.Vector.scalar
      val zero : Linear.Vector.t
      val is_zero : Linear.Vector.t -> bool
      val add_term :
        Linear.Vector.scalar ->
        Linear.Vector.dim -> Linear.Vector.t -> Linear.Vector.t
      val of_term :
        Linear.Vector.scalar -> Linear.Vector.dim -> Linear.Vector.t
      val enum :
        Linear.Vector.t ->
        (Linear.Vector.scalar * Linear.Vector.dim) BatEnum.t
      val of_enum :
        (Linear.Vector.scalar * Linear.Vector.dim) BatEnum.t ->
        Linear.Vector.t
      val of_list :
        (Linear.Vector.scalar * Linear.Vector.dim) list -> Linear.Vector.t
      val coeff :
        Linear.Vector.dim -> Linear.Vector.t -> Linear.Vector.scalar
      val pivot :
        Linear.Vector.dim ->
        Linear.Vector.t -> Linear.Vector.scalar * Linear.Vector.t
    end
  module ZZVector :
    sig
      type t
      type dim = int
      type scalar = ZZ.t
      val equal : t -> t -> bool
      val add : t -> t -> t
      val scalar_mul : scalar -> t -> t
      val negate : t -> t
      val sub : t -> t -> t
      val dot : t -> t -> scalar
      val zero : t
      val is_zero : t -> bool
      val add_term : scalar -> dim -> t -> t
      val of_term : scalar -> dim -> t
      val enum : t -> (scalar * dim) BatEnum.t
      val of_enum : (scalar * dim) BatEnum.t -> t
      val of_list : (scalar * dim) list -> t
      val coeff : dim -> t -> scalar
      val pivot : dim -> t -> scalar * t
      val compare : t -> t -> int
      val pp : Format.formatter -> t -> unit
      val show : t -> string
    end
  module QQVector :
    sig
      type t
      type dim = int
      type scalar = QQ.t
      val equal : t -> t -> bool
      val add : t -> t -> t
      val scalar_mul : scalar -> t -> t
      val negate : t -> t
      val sub : t -> t -> t
      val dot : t -> t -> scalar
      val zero : t
      val is_zero : t -> bool
      val add_term : scalar -> dim -> t -> t
      val of_term : scalar -> dim -> t
      val enum : t -> (scalar * dim) BatEnum.t
      val of_enum : (scalar * dim) BatEnum.t -> t
      val of_list : (scalar * dim) list -> t
      val coeff : dim -> t -> scalar
      val pivot : dim -> t -> scalar * t
      val compare : t -> t -> int
      val pp : Format.formatter -> t -> unit
      val show : t -> string
    end
  module QQMatrix :
    sig
      type t
      type dim = int
      type scalar = QQ.t
      val equal : Linear.QQMatrix.t -> Linear.QQMatrix.t -> bool
      val add : Linear.QQMatrix.t -> Linear.QQMatrix.t -> Linear.QQMatrix.t
      val scalar_mul :
        Linear.QQMatrix.scalar -> Linear.QQMatrix.t -> Linear.QQMatrix.t
      val mul : Linear.QQMatrix.t -> Linear.QQMatrix.t -> Linear.QQMatrix.t
      val zero : Linear.QQMatrix.t
      val identity : Linear.QQMatrix.dim list -> Linear.QQMatrix.t
      val row : Linear.QQMatrix.dim -> Linear.QQMatrix.t -> Linear.QQVector.t
      val rowsi :
        Linear.QQMatrix.t ->
        (Linear.QQMatrix.dim * Linear.QQVector.t) BatEnum.t
      val add_row :
        Linear.QQMatrix.dim ->
        Linear.QQVector.t -> Linear.QQMatrix.t -> Linear.QQMatrix.t
      val add_column :
        Linear.QQMatrix.dim ->
        Linear.QQVector.t -> Linear.QQMatrix.t -> Linear.QQMatrix.t
      val add_entry :
        Linear.QQMatrix.dim ->
        Linear.QQMatrix.dim -> QQ.t -> Linear.QQMatrix.t -> Linear.QQMatrix.t
      val pivot :
        Linear.QQMatrix.dim ->
        Linear.QQMatrix.t -> Linear.QQVector.t * Linear.QQMatrix.t
      val transpose : Linear.QQMatrix.t -> Linear.QQMatrix.t
      val entry :
        Linear.QQMatrix.dim ->
        Linear.QQMatrix.dim -> Linear.QQMatrix.t -> Linear.QQMatrix.scalar
      val entries :
        Linear.QQMatrix.t ->
        (Linear.QQMatrix.dim * Linear.QQMatrix.dim * Linear.QQMatrix.scalar)
        BatEnum.t
      val row_set : Linear.QQMatrix.t -> SrkUtil.Int.Set.t
      val column_set : Linear.QQMatrix.t -> SrkUtil.Int.Set.t
      val nb_rows : Linear.QQMatrix.t -> int
      val nb_columns : Linear.QQMatrix.t -> int
      val pp : Format.formatter -> Linear.QQMatrix.t -> unit
      val show : Linear.QQMatrix.t -> string
      val rational_eigenvalues : Linear.QQMatrix.t -> (QQ.t * int) list
    end
  module type AbelianGroup =
    sig
      type t
      val equal : Linear.AbelianGroup.t -> Linear.AbelianGroup.t -> bool
      val add :
        Linear.AbelianGroup.t ->
        Linear.AbelianGroup.t -> Linear.AbelianGroup.t
      val negate : Linear.AbelianGroup.t -> Linear.AbelianGroup.t
      val zero : Linear.AbelianGroup.t
    end
  module type Ring =
    sig
      type t
      val equal : Linear.Ring.t -> Linear.Ring.t -> bool
      val add : Linear.Ring.t -> Linear.Ring.t -> Linear.Ring.t
      val negate : Linear.Ring.t -> Linear.Ring.t
      val zero : Linear.Ring.t
      val mul : Linear.Ring.t -> Linear.Ring.t -> Linear.Ring.t
      val one : Linear.Ring.t
    end
  module RingMap :
    functor
      (M : sig
             type 'a t
             type key
             val equal :
               ('-> '-> bool) ->
               'Linear.RingMap.t -> 'Linear.RingMap.t -> bool
             val compare :
               ('-> '-> int) ->
               'Linear.RingMap.t -> 'Linear.RingMap.t -> int
             val enum :
               'Linear.RingMap.t -> (Linear.RingMap.key * 'a) BatEnum.t
             val map :
               ('-> 'b) -> 'Linear.RingMap.t -> 'Linear.RingMap.t
             val find : Linear.RingMap.key -> 'Linear.RingMap.t -> 'a
             val add :
               Linear.RingMap.key ->
               '-> 'Linear.RingMap.t -> 'Linear.RingMap.t
             val remove :
               Linear.RingMap.key ->
               'Linear.RingMap.t -> 'Linear.RingMap.t
             val empty : 'Linear.RingMap.t
             val merge :
               (Linear.RingMap.key -> 'a option -> 'b option -> 'c option) ->
               'Linear.RingMap.t ->
               'Linear.RingMap.t -> 'Linear.RingMap.t
           end) (R : Ring->
      sig
        type t = R.t M.t
        type dim = M.key
        type scalar = R.t
        val equal : t -> t -> bool
        val add : t -> t -> t
        val scalar_mul : scalar -> t -> t
        val negate : t -> t
        val sub : t -> t -> t
        val dot : t -> t -> scalar
        val zero : t
        val is_zero : t -> bool
        val add_term : scalar -> dim -> t -> t
        val of_term : scalar -> dim -> t
        val enum : t -> (scalar * dim) BatEnum.t
        val of_enum : (scalar * dim) BatEnum.t -> t
        val of_list : (scalar * dim) list -> t
        val coeff : dim -> t -> scalar
        val pivot : dim -> t -> scalar * t
      end
  val nullspace : Linear.QQMatrix.t -> int list -> Linear.QQVector.t list
  val solve_exn : Linear.QQMatrix.t -> Linear.QQVector.t -> Linear.QQVector.t
  val solve :
    Linear.QQMatrix.t -> Linear.QQVector.t -> Linear.QQVector.t option
  val orient :
    (int -> bool) -> Linear.QQVector.t list -> (int * Linear.QQVector.t) list
  val vector_right_mul :
    Linear.QQMatrix.t -> Linear.QQVector.t -> Linear.QQVector.t
  val intersect_rowspace :
    Linear.QQMatrix.t ->
    Linear.QQMatrix.t -> Linear.QQMatrix.t * Linear.QQMatrix.t
  val divide_right :
    Linear.QQMatrix.t -> Linear.QQMatrix.t -> Linear.QQMatrix.t option
  val max_rowspace_projection :
    Linear.QQMatrix.t -> Linear.QQMatrix.t -> Linear.QQMatrix.t
  val rational_triangulation :
    Linear.QQMatrix.t -> Linear.QQMatrix.t * Linear.QQMatrix.t
  val evaluate_affine : (int -> QQ.t) -> Linear.QQVector.t -> QQ.t
  val sym_of_dim : int -> Syntax.symbol option
  val dim_of_sym : Syntax.symbol -> int
  val const_dim : int
  val const_linterm : QQ.t -> Linear.QQVector.t
  val const_of_linterm : Linear.QQVector.t -> QQ.t option
  val linterm_of : 'Syntax.context -> 'Syntax.term -> Linear.QQVector.t
  val of_linterm : 'Syntax.context -> Linear.QQVector.t -> 'Syntax.term
  val pp_linterm :
    'Syntax.context -> Format.formatter -> Linear.QQVector.t -> unit
  val evaluate_linterm : (Syntax.symbol -> QQ.t) -> Linear.QQVector.t -> QQ.t
  val linterm_size : Linear.QQVector.t -> int
end