Module Algorithms::Rank::Ewp
In: lib/algorithms/rank/ewp.rb

calculate expected winning percentage as (1/n)SUM_j(||i>j||/||i,j||)

Methods

Public Instance methods

[Source]

    # 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

[Source]

    # 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

[Source]

    # 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

[Source]

    # 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

[Source]

    # 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

[Source]

    # 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

[Source]

    # 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

[Validate]