sig
  type reason_int =
      DependencyInt of (int * Cudf_types.vpkg list * int list)
    | MissingInt of (int * Cudf_types.vpkg list)
    | ConflictInt of (int * int * Cudf_types.vpkg)
  type result_int =
      SuccessInt of (?all:bool -> unit -> int list)
    | FailureInt of (unit -> Algo.Diagnostic.reason_int list)
  type request_int = int option * int list
  type reason =
      Dependency of (Cudf.package * Cudf_types.vpkg list * Cudf.package list)
    | Missing of (Cudf.package * Cudf_types.vpkg list)
    | Conflict of (Cudf.package * Cudf.package * Cudf_types.vpkg)
  type request = Cudf.package list
  type result =
      Success of (?all:bool -> unit -> Cudf.package list)
    | Failure of (unit -> Algo.Diagnostic.reason list)
  type diagnosis = {
    result : Algo.Diagnostic.result;
    request : Algo.Diagnostic.request;
  }
  val diagnosis :
    Common.Util.projection ->
    Cudf.universe ->
    Algo.Diagnostic.result_int ->
    Algo.Diagnostic.request_int -> Algo.Diagnostic.diagnosis
  module ResultHash :
    sig
      type key = reason
      type 'a t
      val create : int -> 'a t
      val clear : 'a t -> unit
      val reset : 'a t -> unit
      val copy : 'a t -> 'a t
      val add : 'a t -> key -> '-> unit
      val remove : 'a t -> key -> unit
      val find : 'a t -> key -> 'a
      val find_all : 'a t -> key -> 'a list
      val replace : 'a t -> key -> '-> unit
      val mem : 'a t -> key -> bool
      val iter : (key -> '-> unit) -> 'a t -> unit
      val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
      val length : 'a t -> int
      val stats : 'a t -> Hashtbl.statistics
    end
  type summary = {
    mutable missing : int;
    mutable conflict : int;
    mutable unique_missing : int;
    mutable unique_conflict : int;
    mutable unique_selfconflict : int;
    summary : Cudf.package list Pervasives.ref Algo.Diagnostic.ResultHash.t;
    statistic : (int * int, int Pervasives.ref) Hashtbl.t;
  }
  val default_result : int -> Algo.Diagnostic.summary
  val collect : Algo.Diagnostic.summary -> Algo.Diagnostic.diagnosis -> unit
  val pp_out_version : Format.formatter -> unit
  val pp_package :
    ?source:bool ->
    ?fields:bool ->
    Common.CudfAdd.pp -> Format.formatter -> Cudf.package -> unit
  val pp_dependency :
    Common.CudfAdd.pp ->
    ?label:string ->
    Format.formatter -> Cudf.package * Cudf_types.vpkglist -> unit
  val pp_dependencies :
    Common.CudfAdd.pp ->
    Format.formatter ->
    (Cudf.package * Cudf_types.vpkglist) list list -> unit
  val pp_list :
    (Format.formatter -> '-> unit) -> Format.formatter -> 'a list -> unit
  val print_error :
    ?condense:bool ->
    ?minimal:bool ->
    Common.CudfAdd.pp ->
    Cudf.package -> Format.formatter -> Algo.Diagnostic.reason list -> unit
  val get_installationset :
    ?minimal:bool -> Algo.Diagnostic.diagnosis -> Cudf.package list
  val is_solution : Algo.Diagnostic.diagnosis -> bool
  val pp_summary :
    ?pp:Common.CudfAdd.pp ->
    ?explain:bool ->
    unit -> Format.formatter -> Algo.Diagnostic.summary -> unit
  val print_error_human :
    ?prefix:string ->
    Common.CudfAdd.pp ->
    Cudf.package -> Format.formatter -> Algo.Diagnostic.reason list -> unit
  val fprintf_human :
    ?pp:Common.CudfAdd.pp ->
    ?prefix:string -> Format.formatter -> Algo.Diagnostic.diagnosis -> unit
  val fprintf :
    ?pp:Common.CudfAdd.pp ->
    ?failure:bool ->
    ?success:bool ->
    ?explain:bool ->
    ?minimal:bool ->
    ?condense:bool -> Format.formatter -> Algo.Diagnostic.diagnosis -> unit
  val printf :
    ?pp:Common.CudfAdd.pp ->
    ?failure:bool ->
    ?success:bool -> ?explain:bool -> Algo.Diagnostic.diagnosis -> unit
end