1#
2# $Id: utils.rb,v 1.1.1.1 2022/10/17 07:37:08 mrg Exp $
3#
4# Commont classes
5#
6
7#
8# The hash containing non-unique mappings
9# It can have a->b and a->c together
10# Also, for every mapping it counts the number of times this mapping was set
11#
12class NonuniqueCountingHash < Hash
13
14  alias get_original []
15  alias put_original []=
16
17  def []=(key, value)
18    own = self.get_original(key)
19    hash = get_original(key)
20    if hash.nil?
21      put_original(key, hash = Hash.new)
22    end
23    if hash.has_key?(value)
24      hash[value] += 1
25    else
26      hash[value] = 1
27    end
28  end
29  
30  #
31  # Number of all mappings (a->b and a->c counted as 2 mappings)
32  #
33  def full_length()
34    values.inject(0) do | rv, hash |
35      rv + hash.length
36    end
37  end
38
39  def cardinality(key1, key2)
40    if has_key?(key1) 
41      hash = get_original(key1)
42      if hash.has_key?(key2)
43        hash[key2]
44      else
45        0
46      end
47    else
48      0
49    end
50  end
51
52  def filter(limit)
53    find_all do | key, hash |
54      hash.find_all do | key1, counter |
55        if (counter <= limit)
56          hash.delete(key1)
57        end
58      end
59      if hash.empty? 
60        delete(key)
61      end
62    end
63  end
64end
65