sig
  module Scalar :
    sig
      type t = Q.t
      val compare : t -> t -> int
      val zero : t
      val one : t
      val of_float : float -> t
      val to_float : t -> float
      val of_q : Q.t -> t
      val to_q : t -> Q.t
      val add : t -> t -> t
      val sub : t -> t -> t
      val mult : t -> t -> t
      val div : t -> t -> t
      val pp : Format.formatter -> t -> unit
      val minus_one : t
      val of_int : int -> t
      val neg : t -> t
      val inv : t -> t
      val equal : t -> t -> bool
      val leq : t -> t -> bool
      val geq : t -> t -> bool
      val lt : t -> t -> bool
      val gt : t -> t -> bool
      val sign : t -> int
      val ( ~- ) : t -> t
      val ( + ) : t -> t -> t
      val ( - ) : t -> t -> t
      val ( * ) : t -> t -> t
      val ( / ) : t -> t -> t
      val ( = ) : t -> t -> bool
      val ( <> ) : t -> t -> bool
      val ( <= ) : t -> t -> bool
      val ( >= ) : t -> t -> bool
      val ( < ) : t -> t -> bool
      val ( > ) : t -> t -> bool
    end
  type vector = (int * Scalar.t) list
  type 'a obj_ext = vector * 'Sdp.block_diag
  type 'a constr_ext = vector * 'Sdp.block_diag * Scalar.t * Scalar.t
  val solve_ext_sparse :
    ?options:Sdp.options ->
    ?solver:Sdp.solver ->
    Sdp.sparse_matrix obj_ext ->
    Sdp.sparse_matrix constr_ext list ->
    Sdp.bounds ->
    SdpRet.t * (float * float) * (vector * Sdp.matrix Sdp.block_diag)
  module ScalarLinExpr :
    sig
      module Coeff :
        sig
          type t = Scalar.t
          val compare : t -> t -> int
          val zero : t
          val one : t
          val of_float : float -> t
          val to_float : t -> float
          val of_q : Q.t -> t
          val to_q : t -> Q.t
          val add : t -> t -> t
          val sub : t -> t -> t
          val mult : t -> t -> t
          val div : t -> t -> t
          val pp : Format.formatter -> t -> unit
          val minus_one : t
          val of_int : int -> t
          val neg : t -> t
          val inv : t -> t
          val equal : t -> t -> bool
          val leq : t -> t -> bool
          val geq : t -> t -> bool
          val lt : t -> t -> bool
          val gt : t -> t -> bool
          val sign : t -> int
          val ( ~- ) : t -> t
          val ( + ) : t -> t -> t
          val ( - ) : t -> t -> t
          val ( * ) : t -> t -> t
          val ( / ) : t -> t -> t
          val ( = ) : t -> t -> bool
          val ( <> ) : t -> t -> bool
          val ( <= ) : t -> t -> bool
          val ( >= ) : t -> t -> bool
          val ( < ) : t -> t -> bool
          val ( > ) : t -> t -> bool
        end
      type t
      val of_list : (Ident.t * Coeff.t) list -> Coeff.t -> t
      val to_list : t -> (Ident.t * Coeff.t) list * Coeff.t
      val var : Ident.t -> t
      val const : Coeff.t -> t
      val mult_scalar : Coeff.t -> t -> t
      val add : t -> t -> t
      val sub : t -> t -> t
      val replace : t -> (Ident.t * t) list -> t
      val remove : t -> Ident.t -> t
      val compare : t -> t -> int
      val is_var : t -> (Ident.t * Coeff.t) option
      val is_const : t -> Coeff.t option
      val choose : t -> (Ident.t * Coeff.t) option
      val pp : Format.formatter -> t -> unit
    end
  type 'a details_val = DV of '| DVexpr of ScalarLinExpr.t
  type details =
      (int * Ident.t) list * Ident.t array array Sdp.block_diag *
      float details_val Ident.Map.t
  val solve_ext_sparse_details :
    ?options:Sdp.options ->
    ?solver:Sdp.solver ->
    Sdp.sparse_matrix obj_ext ->
    Sdp.sparse_matrix constr_ext list ->
    Sdp.bounds ->
    SdpRet.t * (float * float) * (vector * Sdp.matrix Sdp.block_diag) *
    details
  val pp_obj_ext :
    (Format.formatter -> '-> unit) ->
    Format.formatter -> 'a obj_ext -> unit
  val pp_constr_ext :
    (Format.formatter -> '-> unit) ->
    Format.formatter -> 'a constr_ext -> unit
  val pp_ext_sparse :
    Format.formatter ->
    Sdp.sparse_matrix obj_ext * Sdp.sparse_matrix constr_ext list *
    Sdp.bounds -> unit
end