class ProbabilityToFriendlyString::FriendlyProbability

Represents probability represented in a friendly manner.

Attributes

denominator[R]
friendlyDescription[R]
friendlyString[R]
numerator[R]

Public Class Methods

_addFraction(fractionsData, numerator, denominator) click to toggle source
# File lib/probability_to_friendly_string.rb, line 37
def self._addFraction(fractionsData, numerator, denominator)
    fractionsData << [numerator.to_f/denominator, numerator, denominator]
end
_createFractionsData() click to toggle source
# File lib/probability_to_friendly_string.rb, line 40
def self._createFractionsData
    if @@fractionsData
        return
    end
    fractionsData = []
    (2..10).each do |d|
        (1..d).each do |n|
            if n.gcd(d) == 1
                _addFraction(fractionsData, n, d)
            end
        end
    end
    [12, 15, 20, 30, 40, 50, 60, 80, 100].each do |d|
        _addFraction(fractionsData, 1, d)
        _addFraction(fractionsData, d - 1, d)
    end
    @@fractionsData = fractionsData.sort
end
fromProbability(f) click to toggle source

Creates a FriendlyProbability from a double

@param f [Numeric] a probability between 0 and 1 @return [FriendlyProbability] a FriendlyProbability that is closest to f

# File lib/probability_to_friendly_string.rb, line 63
def self.fromProbability(f)
    if f < 0 or f > 1
        raise RangeError, "f is less than 0 or greater than 1"
    end
    # index of the least element > f
    index = @@friendlyDescriptionValues.bsearch_index {|x| x > f}
    if index.nil?
        index = @@friendlyDescriptionStrings.length - 1
    end
    friendlyDescription = @@friendlyDescriptionStrings[index]
    if f == 0
        return FriendlyProbability.new 0, 1, friendlyDescription
    elsif f == 1
        return FriendlyProbability.new 1, 1, friendlyDescription
    elsif f > 0.99
        return FriendlyProbability.new 99, 100, friendlyDescription, ">99 in 100"
    elsif f < 0.01
        return FriendlyProbability.new 1, 100, friendlyDescription, "<1 in 100"
    end

    FriendlyProbability._createFractionsData
    # index of the least element > f
    right = @@fractionsData.bsearch_index {|x| x[0] > f}
    if right
        left = right - 1
    else
        left = @@fractionsData.length - 1
    end
    if (left == (@@fractionsData.length - 1) or (left >= 0 and f - @@fractionsData[left][0] < @@fractionsData[right][0] - f))
        return FriendlyProbability.new @@fractionsData[left][1], @@fractionsData[left][2], friendlyDescription
    else
        return FriendlyProbability.new @@fractionsData[right][1], @@fractionsData[right][2], friendlyDescription
    end
end
new(numerator, denominator, friendlyDescription, friendlyString = nil) click to toggle source
# File lib/probability_to_friendly_string.rb, line 26
def initialize(numerator, denominator, friendlyDescription, friendlyString = nil)
    @numerator = numerator
    @denominator = denominator
    @friendlyDescription = friendlyDescription
    if friendlyString
        @friendlyString = friendlyString 
    else
        @friendlyString = "%d in %d" % [numerator, denominator]
    end
end

Public Instance Methods

<=>(another_friendly_string) click to toggle source
# File lib/probability_to_friendly_string.rb, line 102
def <=>(another_friendly_string)
    if self.numerator < another_friendly_string.numerator
        -1
    elsif self.numerator > another_friendly_string.numerator
        1
    end
    if self.denominator < another_friendly_string.denominator
        -1
    elsif self.denominator > another_friendly_string.denominator
        1
    end
    if self.friendlyDescription < another_friendly_string.friendlyDescription
        -1
    elsif self.friendlyDescription > another_friendly_string.friendlyDescription
        1
    end
     if self.friendlyString < another_friendly_string.friendlyString
        -1
    elsif self.friendlyString > another_friendly_string.friendlyString
        1
    else
        0
    end
end
to_s() click to toggle source
# File lib/probability_to_friendly_string.rb, line 98
def to_s
    return "#{@numerator}/#{@denominator} (text: \"#{@friendlyString}\", description: \"#{@friendlyDescription}\")"
end