sig
  module type S =
    sig
      module Scalar : Scalar.S
      type vector = (int * Scalar.t) list
      type 'a obj_ext = Dualize.S.vector * 'Sdp.block_diag
      type 'a constr_ext =
          Dualize.S.vector * 'Sdp.block_diag * Scalar.t * Scalar.t
      val solve_ext_sparse :
        ?options:Sdp.options ->
        ?solver:Sdp.solver ->
        Sdp.sparse_matrix Dualize.S.obj_ext ->
        Sdp.sparse_matrix Dualize.S.constr_ext list ->
        Sdp.bounds ->
        SdpRet.t * (float * float) *
        (Dualize.S.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 Dualize.S.ScalarLinExpr.t
      type details =
          (int * Ident.t) list * Ident.t array array Sdp.block_diag *
          float Dualize.S.details_val Ident.Map.t
      val solve_ext_sparse_details :
        ?options:Sdp.options ->
        ?solver:Sdp.solver ->
        Sdp.sparse_matrix Dualize.S.obj_ext ->
        Sdp.sparse_matrix Dualize.S.constr_ext list ->
        Sdp.bounds ->
        SdpRet.t * (float * float) *
        (Dualize.S.vector * Sdp.matrix Sdp.block_diag) * Dualize.S.details
      val pp_obj_ext :
        (Stdlib.Format.formatter -> '-> unit) ->
        Stdlib.Format.formatter -> 'Dualize.S.obj_ext -> unit
      val pp_constr_ext :
        (Stdlib.Format.formatter -> '-> unit) ->
        Stdlib.Format.formatter -> 'Dualize.S.constr_ext -> unit
      val pp_ext_sparse :
        Stdlib.Format.formatter ->
        Sdp.sparse_matrix Dualize.S.obj_ext *
        Sdp.sparse_matrix Dualize.S.constr_ext list * Sdp.bounds -> unit
    end
  module Make :
    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
  module Q :
    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
  module Float :
    sig
      module Scalar :
        sig
          type t = float
          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
end