sig
  module Mat : Matrix.S
  type var
  type matrix_expr =
      Const of Mat.t
    | Var of Lmi.S.var
    | Zeros of int * int
    | Eye of int
    | Kron of int * int * int
    | Kron_sym of int * int * int
    | Block of Lmi.S.matrix_expr array array
    | Lift_block of Lmi.S.matrix_expr * int * int * int * int
    | Transpose of Lmi.S.matrix_expr
    | Minus of Lmi.S.matrix_expr
    | Add of Lmi.S.matrix_expr * Lmi.S.matrix_expr
    | Sub of Lmi.S.matrix_expr * Lmi.S.matrix_expr
    | Mult of Lmi.S.matrix_expr * Lmi.S.matrix_expr
    | Power of Lmi.S.matrix_expr * int
  val var : string -> int -> Lmi.S.matrix_expr
  val var_var : string -> int -> Lmi.S.var * Lmi.S.matrix_expr
  val const : Mat.t -> Lmi.S.matrix_expr
  val scalar : Mat.Coeff.t -> Lmi.S.matrix_expr
  val zeros : int -> int -> Lmi.S.matrix_expr
  val eye : int -> Lmi.S.matrix_expr
  val kron : int -> int -> int -> Lmi.S.matrix_expr
  val kron_sym : int -> int -> int -> Lmi.S.matrix_expr
  val block : Lmi.S.matrix_expr array array -> Lmi.S.matrix_expr
  val lift_block :
    Lmi.S.matrix_expr -> int -> int -> int -> int -> Lmi.S.matrix_expr
  val transpose : Lmi.S.matrix_expr -> Lmi.S.matrix_expr
  val minus : Lmi.S.matrix_expr -> Lmi.S.matrix_expr
  val add : Lmi.S.matrix_expr -> Lmi.S.matrix_expr -> Lmi.S.matrix_expr
  val sub : Lmi.S.matrix_expr -> Lmi.S.matrix_expr -> Lmi.S.matrix_expr
  val mult : Lmi.S.matrix_expr -> Lmi.S.matrix_expr -> Lmi.S.matrix_expr
  val power : Lmi.S.matrix_expr -> int -> Lmi.S.matrix_expr
  val nb_lines : Lmi.S.matrix_expr -> int
  val nb_cols : Lmi.S.matrix_expr -> int
  val is_symmetric : Lmi.S.matrix_expr -> bool
  val ( !! ) : Mat.t -> Lmi.S.matrix_expr
  val ( ! ) : Mat.Coeff.t -> Lmi.S.matrix_expr
  val ( ~: ) : Lmi.S.matrix_expr -> Lmi.S.matrix_expr
  val ( *. ) : Mat.Coeff.t -> Lmi.S.matrix_expr -> Lmi.S.matrix_expr
  val ( ~- ) : Lmi.S.matrix_expr -> Lmi.S.matrix_expr
  val ( + ) : Lmi.S.matrix_expr -> Lmi.S.matrix_expr -> Lmi.S.matrix_expr
  val ( - ) : Lmi.S.matrix_expr -> Lmi.S.matrix_expr -> Lmi.S.matrix_expr
  val ( * ) : Lmi.S.matrix_expr -> Lmi.S.matrix_expr -> Lmi.S.matrix_expr
  val ( ** ) : Lmi.S.matrix_expr -> int -> Lmi.S.matrix_expr
  val ( >= ) : Lmi.S.matrix_expr -> Lmi.S.matrix_expr -> Lmi.S.matrix_expr
  val ( <= ) : Lmi.S.matrix_expr -> Lmi.S.matrix_expr -> Lmi.S.matrix_expr
  type options = { sdp : Sdp.options; verbose : int; pad : float; }
  val default : Lmi.S.options
  type obj =
      Minimize of Lmi.S.matrix_expr
    | Maximize of Lmi.S.matrix_expr
    | Purefeas
  type values
  exception Dimension_error of string
  exception Not_linear
  exception Not_symmetric
  val solve :
    ?options:Lmi.S.options ->
    ?solver:Sdp.solver ->
    Lmi.S.obj ->
    Lmi.S.matrix_expr list -> SdpRet.t * (float * float) * Lmi.S.values
  val empty_values : unit -> Lmi.S.values
  val value : Lmi.S.matrix_expr -> Lmi.S.values -> Mat.Coeff.t
  val value_mat : Lmi.S.matrix_expr -> Lmi.S.values -> Mat.t
  val register_value :
    Lmi.S.var -> Mat.Coeff.t -> Lmi.S.values -> Lmi.S.values
  val check :
    ?options:Lmi.S.options ->
    ?values:Lmi.S.values -> Lmi.S.matrix_expr -> bool
  val pp : Stdlib.Format.formatter -> Lmi.S.matrix_expr -> unit
  val pp_values : Stdlib.Format.formatter -> Lmi.S.values -> unit
end