Module: RCPM

Defined in:
lib/rcpm.rb,
lib/rcpm/version.rb

Constant Summary collapse

VERSION =
"0.1.3"

Class Method Summary collapse

Class Method Details

.cpm(g, k) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/rcpm.rb', line 41

def self.cpm(g, k)
  cliques_to_components = {}
  current_component = 0

  cliques = g.bk.select{|cl| cl.size >= k}

  nodes_to_cliques = nodes_to_cliques(cliques)

  #Para cada uma das cliques
  cliques.each do |clique|

    #Se ela ainda não possui componente(não foi processada)
    if !cliques_to_components.key?(clique)
      current_component += 1
      #Adiciona um novo componente para ela
      cliques_to_components[clique] = current_component
      #Coloca esta clique na fronteira
      frontier = [clique]

      #Enquanto fronteira não for vazia
      while current_clique = frontier.pop
        #Pega todas as cliques vizinhas de current_clique
        get_adjacent_cliques(current_clique, nodes_to_cliques).each do |neighbour|
          #Se neighbour tem uma interseção com current_clique de tamanho >= k - 1
          if (current_clique & neighbour).size >= k - 1
            #Então neighbour também faz parte de current_component
            cliques_to_components[neighbour] = current_component
            #Adiciona neighbour à frontier
            frontier << neighbour
            #E para cada node de neighbour
            neighbour.each do |node|
              #Remove ele da lista de nós não processados
              nodes_to_cliques[node].delete(neighbour)
            end
          end
        end
      end
    end
  end
  #Agora basta unir todos os nós que foram rotulados com o mesmo componente
  component_to_nodes = {}
  cliques_to_components.each_pair do |clique, component_clique_in|
    component_to_nodes[component_clique_in] ||= []
    component_to_nodes[component_clique_in] += clique
  end

  return component_to_nodes.values
end

.graph_to_matrix(ary) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/rcpm.rb', line 26

def self.graph_to_matrix(ary)
  max = ary.flatten.max

  matrix = Array.new(max + 1) { Array.new(max + 1, 0) }

  0.upto(max - 1) { |i| matrix[i][i] = 1 }

  ary.each do |n1, n2|
    matrix[n1][n2] = 1
    matrix[n2][n1] = 1
  end

  return matrix
end

.read_file(filename) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/rcpm.rb', line 5

def self.read_file(filename)
  current_id = {}
  code_to_id = {}
  graphs = {}

  CSV.open(filename, headers: [:id1, :id2, :year]).each do |line|
    year = line[:year]

    current_id[year] ||= -1
    code_to_id[year] ||= {}
    graphs[year] ||= []

    id1 = code_to_id[year][line[:id1]] ||= current_id[year] += 1
    id2 = code_to_id[year][line[:id2]] ||= current_id[year] += 1

    graphs[year] << [id1,id2]
  end

  return [code_to_id, graphs]
end