146185892Smrg# 246185892Smrg# $Id: utils.rb,v 1.1.1.1 2022/10/17 07:37:08 mrg Exp $ 346185892Smrg# 446185892Smrg# Commont classes 546185892Smrg# 646185892Smrg 746185892Smrg# 846185892Smrg# The hash containing non-unique mappings 946185892Smrg# It can have a->b and a->c together 1046185892Smrg# Also, for every mapping it counts the number of times this mapping was set 1146185892Smrg# 1246185892Smrgclass NonuniqueCountingHash < Hash 1346185892Smrg 1446185892Smrg alias get_original [] 1546185892Smrg alias put_original []= 1646185892Smrg 1746185892Smrg def []=(key, value) 1846185892Smrg own = self.get_original(key) 1946185892Smrg hash = get_original(key) 2046185892Smrg if hash.nil? 2146185892Smrg put_original(key, hash = Hash.new) 2246185892Smrg end 2346185892Smrg if hash.has_key?(value) 2446185892Smrg hash[value] += 1 2546185892Smrg else 2646185892Smrg hash[value] = 1 2746185892Smrg end 2846185892Smrg end 2946185892Smrg 3046185892Smrg # 3146185892Smrg # Number of all mappings (a->b and a->c counted as 2 mappings) 3246185892Smrg # 3346185892Smrg def full_length() 3446185892Smrg values.inject(0) do | rv, hash | 3546185892Smrg rv + hash.length 3646185892Smrg end 3746185892Smrg end 3846185892Smrg 3946185892Smrg def cardinality(key1, key2) 4046185892Smrg if has_key?(key1) 4146185892Smrg hash = get_original(key1) 4246185892Smrg if hash.has_key?(key2) 4346185892Smrg hash[key2] 4446185892Smrg else 4546185892Smrg 0 4646185892Smrg end 4746185892Smrg else 4846185892Smrg 0 4946185892Smrg end 5046185892Smrg end 5146185892Smrg 5246185892Smrg def filter(limit) 5346185892Smrg find_all do | key, hash | 5446185892Smrg hash.find_all do | key1, counter | 5546185892Smrg if (counter <= limit) 5646185892Smrg hash.delete(key1) 5746185892Smrg end 5846185892Smrg end 5946185892Smrg if hash.empty? 6046185892Smrg delete(key) 6146185892Smrg end 6246185892Smrg end 6346185892Smrg end 6446185892Smrgend 65