Class: TrailGuide::Calculators::Calculator

Inherits:
Object
  • Object
show all
Defined in:
lib/trail_guide/calculators/calculator.rb

Direct Known Subclasses

Bayesian, Score

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(experiment, probability = TrailGuide::Calculators::DEFAULT_PROBABILITY, base: :default, goal: nil, against: nil) ⇒ Calculator

Returns a new instance of Calculator.



9
10
11
12
13
14
15
# File 'lib/trail_guide/calculators/calculator.rb', line 9

def initialize(experiment, probability=TrailGuide::Calculators::DEFAULT_PROBABILITY, base: :default, goal: nil, against: nil)
  @experiment = experiment
  @probability = probability
  @base_type = base
  @goal = goal
  @against = against
end

Instance Attribute Details

#choiceObject (readonly)

Returns the value of attribute choice.



7
8
9
# File 'lib/trail_guide/calculators/calculator.rb', line 7

def choice
  @choice
end

#experimentObject (readonly)

Returns the value of attribute experiment.



7
8
9
# File 'lib/trail_guide/calculators/calculator.rb', line 7

def experiment
  @experiment
end

#goalObject (readonly)

Returns the value of attribute goal.



7
8
9
# File 'lib/trail_guide/calculators/calculator.rb', line 7

def goal
  @goal
end

#probabilityObject (readonly)

Returns the value of attribute probability.



7
8
9
# File 'lib/trail_guide/calculators/calculator.rb', line 7

def probability
  @probability
end

Instance Method Details

#baseObject



34
35
36
37
38
39
40
41
42
43
# File 'lib/trail_guide/calculators/calculator.rb', line 34

def base
  @base ||= case @base_type
    when :control
      # use the control as the "base"
      variants.find { |variant| variant.control }
    else
      # use the second-best converting as the "base" (default behavior)
      variants[-2]
  end
end

#bestObject



45
46
47
# File 'lib/trail_guide/calculators/calculator.rb', line 45

def best
  @best ||= variants_with_conversion.last
end

#calculate!Object

Raises:

  • (NotImplementedError)


53
54
55
# File 'lib/trail_guide/calculators/calculator.rb', line 53

def calculate!
  raise NotImplementedError, "You must define a calculate! method on your calculator class"
end

#variantsObject



17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/trail_guide/calculators/calculator.rb', line 17

def variants
  @variants ||= experiment.variants.map do |variant|
    superset = @against ? variant.converted(@against) : variant.participants
    converts = variant.converted(goal)
    measure = (converts.to_f / superset.to_f) rescue 0
    measure = 0 if measure.nan?

    Struct.new(:name, :control, :superset, :subset, :measure,
               :difference, :probability, :significance, :z_score)
      .new(variant.name, variant.control?, superset, converts, measure, 0, 0, nil, nil)
  end.sort_by { |v| v.measure }
end

#variants_with_conversionObject



30
31
32
# File 'lib/trail_guide/calculators/calculator.rb', line 30

def variants_with_conversion
  @variants_with_conversion ||= variants.select { |variant| variant.measure > 0.0 }
end

#worstObject



49
50
51
# File 'lib/trail_guide/calculators/calculator.rb', line 49

def worst
  @worst ||= variants_with_conversion.first
end