Sha256: 7f4d6a0e554f8449987913b31f9f3723b6134b0a2804fb7e4dfa868a86e96c55

Contents?: true

Size: 980 Bytes

Versions: 5

Compression:

Stored size: 980 Bytes

Contents

# A multi-armed bandit implementation inspired by 
# @aaronsw and victorykit/whiplash
require 'simple-random'

module Split
  module Algorithms
    module Whiplash
      def self.choose_alternative(experiment)
        experiment[best_guess(experiment.alternatives)]
      end

      private
      
      def self.arm_guess(participants, completions)
        a = [participants, 0].max
        b = [participants-completions, 0].max
        s = SimpleRandom.new; s.set_seed; s.beta(a+fairness_constant, b+fairness_constant)
      end
      
      def self.best_guess(alternatives)
        guesses = {}
        alternatives.each do |alternative| 
          guesses[alternative.name] = arm_guess(alternative.participant_count, alternative.completed_count) 
        end
        gmax = guesses.values.max
        best = guesses.keys.select {|name| guesses[name] ==  gmax }
        return best.sample
      end
      
      def self.fairness_constant
        7
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
split-0.6.3 lib/split/algorithms/whiplash.rb
split-0.6.2 lib/split/algorithms/whiplash.rb
split-0.6.1 lib/split/algorithms/whiplash.rb
split-0.6.0 lib/split/algorithms/whiplash.rb
split-0.5.0 lib/split/algorithms/whiplash.rb