functor (S : Scalar.S->
  sig
    module Scalar :
      sig
        type t = S.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