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