sig
  module N :
    sig
      type t =
          (Rapids.package_id,
           (Rapids.unit_id, Rapids.version_number * Rapids.release_number,
            Rapids.glob)
           Napkin.versioned)
          Diagnosis.reason
      type reason = Installability.N.t
    end
  type solver = SAT | Direct
  val set_solver : Installability.solver -> unit
  val get_solver : unit -> Installability.solver
  val set_verifier : Installability.solver option -> unit
  val get_verifier : unit -> Installability.solver option
  val prepare :
    Rapids.db ->
    ?log:(string -> unit) ->
    indicator:Progress.indicator ->
    ?targets:Rapids.Package_set.t ->
    available:Rapids.Package_set.t ->
    unit ->
    int * (Rapids.Package_set.elt -> Solver.M(N).var) *
    (Solver.M(N).var -> Rapids.Package_set.elt) * Rapids.Package_set.t *
    Solver.M(N).state * 'a list Pervasives.ref * int Pervasives.ref *
    int Pervasives.ref * int Pervasives.ref
  val check :
    Rapids.db ->
    ?log:(string -> unit) ->
    ?preparation:int * (Rapids.Package_set.elt -> Solver.M(N).var) *
                 (Solver.M(N).var -> Rapids.Package_set.elt) *
                 Rapids.Package_set.t * Solver.M(N).state *
                 (Rapids.Package_set.elt * Installability.N.reason list) list
                 Pervasives.ref * int Pervasives.ref * int Pervasives.ref *
                 int Pervasives.ref ->
    indicator:Progress.indicator ->
    targets:Rapids.Package_set.t ->
    available:Rapids.Package_set.t ->
    unit ->
    (Rapids.Package_set.elt, Rapids.Package_set.elt,
     (Rapids.unit_id, Rapids.version_number * Rapids.release_number,
      Rapids.glob)
     Napkin.versioned)
    Diagnosis.diagnosis
  val check_together :
    Rapids.db ->
    ?log:(string -> unit) ->
    ?preparation:int * (Rapids.Package_set.elt -> Solver.M(N).var) *
                 (Solver.M(N).var -> Rapids.Package_set.elt) *
                 Rapids.Package_set.t * Solver.M(N).state *
                 (Rapids.Package_set.elt list * Installability.N.reason list)
                 list Pervasives.ref * int Pervasives.ref *
                 int Pervasives.ref * int Pervasives.ref ->
    indicator:Progress.indicator ->
    targets:Rapids.Package_set.t ->
    available:Rapids.Package_set.t ->
    unit ->
    (Rapids.Package_set.elt list, Rapids.Package_set.elt,
     (Rapids.unit_id, Rapids.version_number * Rapids.release_number,
      Rapids.glob)
     Napkin.versioned)
    Diagnosis.diagnosis
  val install :
    Rapids.db ->
    ?log:(string -> unit) ->
    ?preparation:int * (Rapids.Package_set.elt -> Solver.M(N).var) *
                 (Solver.M(N).var -> Rapids.Package_set.elt) *
                 Rapids.Package_set.t * Solver.M(N).state *
                 'a list Pervasives.ref * int Pervasives.ref *
                 int Pervasives.ref * int Pervasives.ref ->
    indicator:Progress.indicator ->
    targets:Rapids.Package_set.t ->
    available:Rapids.Package_set.t ->
    ?known:Rapids.Package_set.t -> unit -> Rapids.Package_set.t
  val abundance :
    Rapids.db -> Rapids.Package_set.t -> Rapids.package_id option
  val strong_dep :
    Rapids.db ->
    ?is:Rapids.Package_set.t ->
    ?preparation:int * (Rapids.Package_set.elt -> Solver.M(N).var) *
                 (Solver.M(N).var -> Rapids.Package_set.elt) *
                 Rapids.Package_set.t * Solver.M(N).state *
                 'a list Pervasives.ref * int Pervasives.ref *
                 int Pervasives.ref * int Pervasives.ref ->
    Rapids.Package_set.t -> Rapids.package_id -> Rapids.package_id -> bool
  val trim : Rapids.db -> Rapids.Package_set.t -> Rapids.Package_set.t
end