Commit 06ee1c72a98711ff7e4ce21add3f1725e6af268d
1 parent
9c36c839
Exists in
master
and in
1 other branch
Catchup algorithm in beta test
Showing
3 changed files
with
39 additions
and
12 deletions
Show diff stats
app/controllers/prompts_controller.rb
@@ -64,8 +64,14 @@ class PromptsController < InheritedResources::Base | @@ -64,8 +64,14 @@ class PromptsController < InheritedResources::Base | ||
64 | #@prompt.choices.each(&:compute_score!) | 64 | #@prompt.choices.each(&:compute_score!) |
65 | respond_to do |format| | 65 | respond_to do |format| |
66 | if successful | 66 | if successful |
67 | - format.xml { render :xml => @question.picked_prompt.to_xml(:methods => [:left_choice_text, :right_choice_text, :left_choice_id, :right_choice_id]), :status => :ok } | ||
68 | - format.json { render :json => @question.picked_prompt.to_json(:methods => [:left_choice_text, :right_choice_text, :left_choice_id, :right_choice_id]), :status => :ok } | 67 | + if @question.id == 120 #test0330 |
68 | + next_prompt = @question.catchup_choose_prompt | ||
69 | + else | ||
70 | + next_prompt = @question.picked_prompt | ||
71 | + end | ||
72 | + | ||
73 | + format.xml { render :xml => next_prompt.to_xml(:methods => [:left_choice_text, :right_choice_text, :left_choice_id, :right_choice_id]), :status => :ok } | ||
74 | + format.json { render :json => next_prompt.to_json(:methods => [:left_choice_text, :right_choice_text, :left_choice_id, :right_choice_id]), :status => :ok } | ||
69 | else | 75 | else |
70 | format.xml { render :xml => c, :status => :unprocessable_entity } | 76 | format.xml { render :xml => c, :status => :unprocessable_entity } |
71 | format.json { render :json => c, :status => :unprocessable_entity } | 77 | format.json { render :json => c, :status => :unprocessable_entity } |
@@ -173,4 +179,4 @@ class PromptsController < InheritedResources::Base | @@ -173,4 +179,4 @@ class PromptsController < InheritedResources::Base | ||
173 | end_of_association_chain.with_choice_id(params[:choice_id]) | 179 | end_of_association_chain.with_choice_id(params[:choice_id]) |
174 | end | 180 | end |
175 | end | 181 | end |
176 | -end | ||
177 | \ No newline at end of file | 182 | \ No newline at end of file |
183 | +end |
app/controllers/questions_controller.rb
@@ -56,7 +56,12 @@ class QuestionsController < InheritedResources::Base | @@ -56,7 +56,12 @@ class QuestionsController < InheritedResources::Base | ||
56 | def show | 56 | def show |
57 | @question = Question.find(params[:id]) | 57 | @question = Question.find(params[:id]) |
58 | unless params[:barebones] | 58 | unless params[:barebones] |
59 | - @p = @question.picked_prompt | 59 | + if params[:algorithm] && params[:algorithm] == "catchup" |
60 | + logger.info("Question #{@question.id} requested catchup algorithm!") | ||
61 | + @p = @question.catchup_choose_prompt | ||
62 | + else | ||
63 | + @p = @question.picked_prompt | ||
64 | + end | ||
60 | left_choice_text = Proc.new { |options| options[:builder].tag!('left_choice_text', @p.left_choice.item.data) } | 65 | left_choice_text = Proc.new { |options| options[:builder].tag!('left_choice_text', @p.left_choice.item.data) } |
61 | right_choice_text = Proc.new { |options| options[:builder].tag!('right_choice_text', @p.right_choice.item.data) } | 66 | right_choice_text = Proc.new { |options| options[:builder].tag!('right_choice_text', @p.right_choice.item.data) } |
62 | picked_prompt_id = Proc.new { |options| options[:builder].tag!('picked_prompt_id', @p.id) } | 67 | picked_prompt_id = Proc.new { |options| options[:builder].tag!('picked_prompt_id', @p.id) } |
app/models/question.rb
@@ -37,17 +37,28 @@ class Question < ActiveRecord::Base | @@ -37,17 +37,28 @@ class Question < ActiveRecord::Base | ||
37 | end until @p.active? | 37 | end until @p.active? |
38 | return @p | 38 | return @p |
39 | end | 39 | end |
40 | - | 40 | + |
41 | # adapted from ruby cookbook(2006): section 5-11 | 41 | # adapted from ruby cookbook(2006): section 5-11 |
42 | - def catchup_choose_prompt_id | 42 | + def catchup_choose_prompt |
43 | weighted = catchup_prompts_weights | 43 | weighted = catchup_prompts_weights |
44 | # Rand returns a number from 0 - 1, so weighted needs to be normalized | 44 | # Rand returns a number from 0 - 1, so weighted needs to be normalized |
45 | - target = rand | ||
46 | - weighted.each do |item, weight| | ||
47 | - return item if target <= weight | ||
48 | - target -= weight | 45 | + prompt = nil |
46 | + | ||
47 | + until prompt && prompt.active? | ||
48 | + target = rand | ||
49 | + prompt_id = nil | ||
50 | + | ||
51 | + weighted.each do |item, weight| | ||
52 | + if target <= weight | ||
53 | + prompt_id = item | ||
54 | + break | ||
55 | + end | ||
56 | + target -= weight | ||
57 | + end | ||
58 | + prompt = Prompt.find(prompt_id, :include => ['left_choice', 'right_choice']) | ||
49 | end | 59 | end |
50 | # check if prompt has two active choices here, maybe we can set this on the prompt level too? | 60 | # check if prompt has two active choices here, maybe we can set this on the prompt level too? |
61 | + prompt | ||
51 | end | 62 | end |
52 | 63 | ||
53 | 64 | ||
@@ -56,8 +67,13 @@ class Question < ActiveRecord::Base | @@ -56,8 +67,13 @@ class Question < ActiveRecord::Base | ||
56 | weights = Hash.new(0) | 67 | weights = Hash.new(0) |
57 | throttle_min = 0.05 | 68 | throttle_min = 0.05 |
58 | #assuming all prompts exist | 69 | #assuming all prompts exist |
59 | - prompts.each do |p| | ||
60 | - weights[p.id] = [(1.0/ (p.votes.size + 1).to_f).to_f, throttle_min].min | 70 | + |
71 | + #the_prompts = prompts.find(:all, :select => 'id, votes_count') | ||
72 | + #We don't really need to instantiate all the objects | ||
73 | + the_prompts = ActiveRecord::Base.connection.select_all("SELECT id, votes_count from prompts where question_id =#{self.id}") | ||
74 | + | ||
75 | + the_prompts.each do |p| | ||
76 | + weights[p["id"].to_i] = [(1.0/ (p["votes_count"].to_i + 1).to_f).to_f, throttle_min].min | ||
61 | end | 77 | end |
62 | normalize!(weights) | 78 | normalize!(weights) |
63 | weights | 79 | weights |