| Module | Algorithms::Rank::Ewp |
| In: |
lib/algorithms/rank/ewp.rb
|
calculate expected winning percentage as (1/n)SUM_j(||i>j||/||i,j||)
# File lib/algorithms/rank/ewp.rb, line 40
40: def comparisons_for_item_question(item, question_id)
41: stat_options = {
42: :select => "stats.votes, items_stats2.item_id",
43: :joins => "INNER JOIN items_stats ON (items_stats.stat_id=stats.id
44: AND items_stats.item_id=#{item.id}) INNER JOIN items_stats AS items_stats2
45: ON (items_stats2.stat_id=stats.id AND items_stats2.item_id!=#{item.id})"
46: }
47: stat_options[:conditions] = { :question_id => question_id } if question_id > 0
48: ::Stat.all(stat_options).inject({}) do |hash, stat|
49: hash[stat.item_id.to_i] = stat.votes.to_f
50: hash
51: end
52: end
# File lib/algorithms/rank/ewp.rb, line 3
3: def ewp(item, question_id)
4: stat = Stat.first({
5: :select => "SUM(wins/(wins + losses)) AS score, COUNT(*) AS count",
6: :conditions => "question_id=#{question_id} AND wins + losses > 0",
7: :joins => "INNER JOIN items_stats ON (items_stats.stat_id=stats.id AND
8: items_stats.item_id=#{item.id})"
9: })
10: stat_to_percent(stat)
11: end
# File lib/algorithms/rank/ewp.rb, line 13
13: def ewp_all(items, question_id)
14: Stat.all({
15: :select => "SUM(wins/(wins + losses)) AS score, COUNT(*) AS count, item_id",
16: :conditions => "question_id=#{question_id} AND wins + losses > 0 AND
17: item_id IN (#{items.map(&:id).join(',')})",
18: :joins => "INNER JOIN items_stats ON (items_stats.stat_id=stats.id)",
19: :group => 'item_id'
20: })
21: end
# File lib/algorithms/rank/ewp.rb, line 54
54: def raw_cmp_for_item_question(item, question_id)
55: prompt_options = {
56: :select => "COUNT(items_prompts.item_id) AS cmp, items_prompts.item_id",
57: :group => "items_prompts.item_id",
58: :joins => "INNER JOIN items_prompts ON (items_prompts.prompt_id=prompts.id
59: AND items_prompts.item_id!=#{item.id}) INNER JOIN items_prompts AS
60: items_prompts2 ON (items_prompts2.prompt_id=prompts.id AND
61: items_prompts2.item_id=#{item.id})INNER JOIN votes ON
62: (votes.prompt_id=prompts.id)"
63: }
64: prompt_options[:conditions] = { :question_id => question_id } if question_id > 0
65: ::Prompt.all(prompt_options).inject({}) do |hash, prompt|
66: hash[prompt.item_id.to_i] = prompt.cmp.to_i
67: hash
68: end
69: end
# File lib/algorithms/rank/ewp.rb, line 23
23: def raw_ewp(item, items, question_id)
24: i_cmp = comparisons_for_item_question(item, question_id)
25: i_wins = wins_for_item_question(item, question_id)
26: cmp = 0
27: score = (items - [item]).inject(0) do |sum, j_item|
28: i_j_cmp = i_cmp[j_item.id]
29: if i_j_cmp && i_j_cmp > 0
30: cmp += 1
31: wins = i_wins[j_item.id]
32: wins ? sum + wins / i_j_cmp : sum
33: else
34: sum
35: end
36: end
37: cmp > 0 ? (100 * (score / cmp)).round(2) : 0
38: end
# File lib/algorithms/rank/ewp.rb, line 87
87: def stat_to_percent(stat)
88: (stat.count == '0') ? 0 : (100 * (stat.score.to_f / stat.count.to_i)).round(2)
89: end
# File lib/algorithms/rank/ewp.rb, line 71
71: def wins_for_item_question(item, question_id)
72: prompt_options = {
73: :select => "COUNT(items_prompts.item_id) AS wins, items_prompts.item_id",
74: :group => "items_prompts.item_id",
75: :joins => "INNER JOIN items_prompts ON (items_prompts.prompt_id=prompts.id
76: AND items_prompts.item_id!=#{item.id}) INNER JOIN votes ON
77: (votes.prompt_id=prompts.id) INNER JOIN items_votes ON (items_votes.vote_id=votes.id
78: AND items_votes.item_id=#{item.id})"
79: }
80: prompt_options[:conditions] = { :question_id => question_id } if question_id > 0
81: ::Prompt.all(prompt_options).inject({}) do |hash, prompt|
82: hash[prompt.item_id.to_i] = prompt.wins.to_i
83: hash
84: end
85: end