lib/activefacts/dependency_analyser.rb in activefacts-generators-1.8.3 vs lib/activefacts/dependency_analyser.rb in activefacts-generators-1.9.0

- old
+ new

@@ -6,146 +6,146 @@ end def analyse_precursors &block @precursors = {} @enumerable.each do |item| - @precursors[item] = block.call(item) + @precursors[item] = block.call(item) end end def analyse_precursors_transitive all_precursors = proc do |item| - p = @precursors[item] - all = - p + p.map do |precursor| - p.include?(precursor) ? [] : all_precursors.call(precursor) - end.flatten - all.uniq - end + p = @precursors[item] + all = + p + p.map do |precursor| + p.include?(precursor) ? [] : all_precursors.call(precursor) + end.flatten + all.uniq + end @precursors_transitive = {} @enumerable.each do |item| - @precursors_transitive[item] = all_precursors.call(item) + @precursors_transitive[item] = all_precursors.call(item) end end def analyse_followers @followers = Hash.new{|h, k| h[k] = [] } @enumerable.each do |item| - @precursors[item].each do |precursor| - @followers[precursor] << item - end + @precursors[item].each do |precursor| + @followers[precursor] << item + end end end def analyse_chasers analyse_precursors_transitive unless @precursors_transitive analyse_followers unless @followers # A follower is an object with us as a precursor, that has no new precursors of its own @chasers = {} @enumerable.each do |item| - @chasers[item] = - @enumerable.select do |follower| - @precursors[follower].include?(item) and - (@precursors_transitive[follower] - @precursors_transitive[item] - [item]).size == 0 - end + @chasers[item] = + @enumerable.select do |follower| + @precursors[follower].include?(item) and + (@precursors_transitive[follower] - @precursors_transitive[item] - [item]).size == 0 + end end end def tsort &block analyse_precursors unless @precursors emitted = {} pass = 0 until emitted.size == @enumerable.size - next_items = [] - blocked = - @enumerable.inject({}) do |hash, item| - next hash if emitted[item] - blockers = item.precursors.select{|precursor| !emitted[precursor]} - if blockers.size > 0 - hash[item] = blockers - else - next_items << item - end - hash - end - return blocked if next_items.size == 0 # Cannot make progress - # puts "PASS #{pass += 1}" - next_items.each do |item| - block.call(item) - emitted[item] = true - end + next_items = [] + blocked = + @enumerable.inject({}) do |hash, item| + next hash if emitted[item] + blockers = item.precursors.select{|precursor| !emitted[precursor]} + if blockers.size > 0 + hash[item] = blockers + else + next_items << item + end + hash + end + return blocked if next_items.size == 0 # Cannot make progress + # puts "PASS #{pass += 1}" + next_items.each do |item| + block.call(item) + emitted[item] = true + end end nil end def each &b if block_given? - @enumerable.each { |item| yield item} + @enumerable.each { |item| yield item} else - @enumerable + @enumerable end end def precursors item = nil, &b analyse_precursors unless @precursors if item - if block_given? - Array(@precursors[item]).each { |precursor| yield precursor, item } - else - Array(@precursors[item]) - end + if block_given? + Array(@precursors[item]).each { |precursor| yield precursor, item } + else + Array(@precursors[item]) + end else - @enumerable.each do |item| - precursors(item, &b) - end + @enumerable.each do |item| + precursors(item, &b) + end end end def precursors_transitive item, &b analyse_precursors_transitive unless @precursors_transitive if item - if block_given? - Array(@precursors_transitive[item]).each { |precursor| yield precursor, item } - else - Array(@precursors_transitive[item]) - end + if block_given? + Array(@precursors_transitive[item]).each { |precursor| yield precursor, item } + else + Array(@precursors_transitive[item]) + end else - @enumerable.each do |item| - precursors_transitive(item, &b) - end + @enumerable.each do |item| + precursors_transitive(item, &b) + end end end def followers item = nil, &b analyse_followers unless @followers if item - if block_given? - Array(@followers[item]).each { |follower| yield follower, item } - else - Array(@followers[item]) - end + if block_given? + Array(@followers[item]).each { |follower| yield follower, item } + else + Array(@followers[item]) + end else - @enumerable.each do |item| - followers(item, &b) - end + @enumerable.each do |item| + followers(item, &b) + end end end def chasers item, &b analyse_chasers unless @chasers if item - if block_given? - Array(@chasers[item]).each { |follower| yield follower, item } - else - Array(@chasers[item]) - end + if block_given? + Array(@chasers[item]).each { |follower| yield follower, item } + else + Array(@chasers[item]) + end else - @enumerable.each do |item| - follower(item, &b) - end + @enumerable.each do |item| + follower(item, &b) + end end end # Compute the page rank of the objects # If used, the block shold return the starting weight @@ -153,26 +153,26 @@ weight ||= proc {|item| 1.0} @total = 0 @rank = {} @enumerable.each do |item| - @total += - (@rank[item] = weight.call(item) * 1.0) + @total += + (@rank[item] = weight.call(item) * 1.0) end # Normalize: @enumerable.each do |item| - @rank[item] /= @total + @rank[item] /= @total end 50.times do |iteration| - @enumerable.each do |item| - links = (precursors(item) + followers(item)).uniq - linked_rank = links.map do |l| - onward_links = (precursors(l) + followers(l)).uniq || @enumerable.size - @rank[l] / onward_links.size - end.inject(&:+) || 0 - @rank[item] = (1.0-damping) + damping*linked_rank - end + @enumerable.each do |item| + links = (precursors(item) + followers(item)).uniq + linked_rank = links.map do |l| + onward_links = (precursors(l) + followers(l)).uniq || @enumerable.size + @rank[l] / onward_links.size + end.inject(&:+) || 0 + @rank[item] = (1.0-damping) + damping*linked_rank + end end @rank end