module Bet::BetCalculations::Combinatorial

Public Instance Methods

full_cover(prices, opts = {}) click to toggle source
# File lib/bet/bet_calculations/combinatorial.rb, line 37
def full_cover(prices, opts = {})
  prices = parse_prices(prices)
  opts   = parse_opts(opts)
  opts   = { min_size: 1 }.merge(opts)

  num_bets = (opts[:min_size]..prices.length).to_a.map do |n|
    (1..prices.length).to_a.combination(n).to_a.length
  end.reduce(:+)

  winning_prices = if prices.first.is_a?(Array)
      prices.select{ |_,v| win_place_lose?(v) == :win }.map(&:first)
    else
      prices
    end

  returns = (opts[:min_size]..winning_prices.length).to_a.map do |n|
    winning_prices.combination(n).map do |multis|
      acca(multis, stake: opts[:stake])[:returns]
    end.reduce(:+)
  end.reduce(:+)

  outlay = num_bets * opts[:stake]
  profit = returns - outlay

  {
    returns: returns,
    profit: profit,
    outlay: outlay
  }
end