sig
  type key
  type 'v map
  val id : 'v Hptmap_sig.Shape.map -> int
  val hash : 'v Hptmap_sig.Shape.map -> int
  val equal : 'v Hptmap_sig.Shape.map -> 'v Hptmap_sig.Shape.map -> bool
  val compare :
    ('v -> 'v -> int) ->
    'v Hptmap_sig.Shape.map -> 'v Hptmap_sig.Shape.map -> int
  val pretty :
    'v Pretty_utils.formatter ->
    'v Hptmap_sig.Shape.map Pretty_utils.formatter
  val is_empty : 'v Hptmap_sig.Shape.map -> bool
  val is_singleton :
    'v Hptmap_sig.Shape.map -> (Hptmap_sig.Shape.key * 'v) option
  val on_singleton :
    (Hptmap_sig.Shape.key -> 'v -> bool) -> 'v Hptmap_sig.Shape.map -> bool
  val cardinal : 'v Hptmap_sig.Shape.map -> int
  val find : Hptmap_sig.Shape.key -> 'v Hptmap_sig.Shape.map -> 'v
  val find_check_missing :
    Hptmap_sig.Shape.key -> 'v Hptmap_sig.Shape.map -> 'v
  val find_key :
    Hptmap_sig.Shape.key -> 'v Hptmap_sig.Shape.map -> Hptmap_sig.Shape.key
  val mem : Hptmap_sig.Shape.key -> 'v Hptmap_sig.Shape.map -> bool
  val min_binding : 'v Hptmap_sig.Shape.map -> Hptmap_sig.Shape.key * 'v
  val max_binding : 'v Hptmap_sig.Shape.map -> Hptmap_sig.Shape.key * 'v
  val iter :
    (Hptmap_sig.Shape.key -> 'v -> unit) -> 'v Hptmap_sig.Shape.map -> unit
  val for_all :
    (Hptmap_sig.Shape.key -> 'v -> bool) -> 'v Hptmap_sig.Shape.map -> bool
  val exists :
    (Hptmap_sig.Shape.key -> 'v -> bool) -> 'v Hptmap_sig.Shape.map -> bool
  val fold :
    (Hptmap_sig.Shape.key -> 'v -> 'b -> 'b) ->
    'v Hptmap_sig.Shape.map -> 'b -> 'b
  val fold_rev :
    (Hptmap_sig.Shape.key -> 'v -> 'b -> 'b) ->
    'v Hptmap_sig.Shape.map -> 'b -> 'b
  val cached_fold :
    cache_name:string ->
    temporary:bool ->
    f:(Hptmap_sig.Shape.key -> 'v -> 'b) ->
    joiner:('b -> 'b -> 'b) -> empty:'b -> 'v Hptmap_sig.Shape.map -> 'b
  val fold2_join_heterogeneous :
    cache:Hptmap_sig.cache_type ->
    empty_left:('b Hptmap_sig.Shape.map -> 'c) ->
    empty_right:('a Hptmap_sig.Shape.map -> 'c) ->
    both:(Hptmap_sig.Shape.key -> 'a -> 'b -> 'c) ->
    join:('c -> 'c -> 'c) ->
    empty:'c -> 'a Hptmap_sig.Shape.map -> 'b Hptmap_sig.Shape.map -> 'c
  type predicate_type = ExistentialPredicate | UniversalPredicate
  type predicate_result = PTrue | PFalse | PUnknown
  val binary_predicate :
    Hptmap_sig.cache_type ->
    Hptmap_sig.Shape.predicate_type ->
    decide_fast:('a Hptmap_sig.Shape.map ->
                 'b Hptmap_sig.Shape.map -> Hptmap_sig.Shape.predicate_result) ->
    decide_fst:(Hptmap_sig.Shape.key -> 'a -> bool) ->
    decide_snd:(Hptmap_sig.Shape.key -> 'b -> bool) ->
    decide_both:(Hptmap_sig.Shape.key -> 'a -> 'b -> bool) ->
    'a Hptmap_sig.Shape.map -> 'b Hptmap_sig.Shape.map -> bool
  val symmetric_binary_predicate :
    Hptmap_sig.cache_type ->
    Hptmap_sig.Shape.predicate_type ->
    decide_fast:('v Hptmap_sig.Shape.map ->
                 'v Hptmap_sig.Shape.map -> Hptmap_sig.Shape.predicate_result) ->
    decide_one:(Hptmap_sig.Shape.key -> 'v -> bool) ->
    decide_both:(Hptmap_sig.Shape.key -> 'v -> 'v -> bool) ->
    'v Hptmap_sig.Shape.map -> 'v Hptmap_sig.Shape.map -> bool
  val decide_fast_inclusion :
    'v Hptmap_sig.Shape.map ->
    'v Hptmap_sig.Shape.map -> Hptmap_sig.Shape.predicate_result
  val decide_fast_intersection :
    'v Hptmap_sig.Shape.map ->
    'v Hptmap_sig.Shape.map -> Hptmap_sig.Shape.predicate_result
  val clear_caches : unit -> unit
end