Skip to content

Commit

Permalink
Split repeat_n_sum_k even further
Browse files Browse the repository at this point in the history
  • Loading branch information
Neil-Aframe committed Jul 23, 2013
1 parent 1970dfd commit e28ba73
Showing 1 changed file with 13 additions and 9 deletions.
22 changes: 13 additions & 9 deletions lib/games_dice/probabilities.rb
Original file line number Diff line number Diff line change
Expand Up @@ -278,25 +278,29 @@ def repeat_n_sum_k_each_q q, p_maybe, n, k, kmode, d, new_probs, new_offset
keep_distributions = calc_keep_distributions( k, q, kmode )
p_table = calc_p_table( q, p_maybe, kmode )
(0...k).each do |kn|
repeat_n_sum_k_each_q_kn( q, k, kn, d, new_probs, new_offset, keep_distributions, p_table )
repeat_n_sum_k_each_q_kn( k, kn, d, new_probs, new_offset, keep_distributions, p_table )
end
end

def repeat_n_sum_k_each_q_kn q, k, kn, d, new_probs, new_offset, keep_distributions, p_table
def repeat_n_sum_k_each_q_kn k, kn, d, new_probs, new_offset, keep_distributions, p_table
keepers = [2] * kn + [1] * (k-kn)
p_so_far = keepers.inject(1.0) { |p,idx| p * p_table[idx] }
return unless p_so_far > 0.0
(0..d).each do |dn|
discards = [1] * (d-dn) + [0] * dn
sequence = keepers + discards
p_sequence = discards.inject( p_so_far ) { |p,idx| p * p_table[idx] }
next unless p_sequence > 0.0
p_sequence *= GamesDice::Combinations.count_variations( sequence )
kd = keep_distributions[kn]
kd.each { |r,p_r| new_probs[r-new_offset] += p_r * p_sequence }
repeat_n_sum_k_each_q_kn_dn( keepers, kn, d, dn, p_so_far, new_probs, new_offset, keep_distributions, p_table )
end
end

def repeat_n_sum_k_each_q_kn_dn keepers, kn, d, dn, p_so_far, new_probs, new_offset, keep_distributions, p_table
discards = [1] * (d-dn) + [0] * dn
sequence = keepers + discards
p_sequence = discards.inject( p_so_far ) { |p,idx| p * p_table[idx] }
return unless p_sequence > 0.0
p_sequence *= GamesDice::Combinations.count_variations( sequence )
kd = keep_distributions[kn]
kd.each { |r,p_r| new_probs[r-new_offset] += p_r * p_sequence }
end

def self.add_distributions_internal combined_min, combined_max, m_a, pd_a, m_b, pd_b
new_probs = Array.new( 1 + combined_max - combined_min, 0.0 )
probs_a, offset_a = pd_a.to_ao
Expand Down

0 comments on commit e28ba73

Please sign in to comment.