probability_to_friendly_string 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 7059a95d77157d0d310e2333bb4cbff4a4094fc7
4
- data.tar.gz: 9f8e25d6c29c9f21f0803ca9df3980bded8cb6e9
2
+ SHA256:
3
+ metadata.gz: 579e97359c71ab54409353dd83c154dc09e4c357b1069f1455c04125602f39b8
4
+ data.tar.gz: f290613fadcea9859d6e27432b780f6b91445ebd0fbadde34e5866121cf1d396
5
5
  SHA512:
6
- metadata.gz: d94985123fab4059d642c6f1ce7060493ddbf49f14bce6981d160e445c332ae90ceb4125be29d54fd169ba5823366f3c6aac85254a69adc694e438f59e197523
7
- data.tar.gz: 5a455957440123a35aedbbc2784929a67313fca06dd6750ca9898a35956886d182a5c6e2a82f6981985f512e854abc188d90dd97469e02b878aed5e9a347859f
6
+ metadata.gz: d68f336766d8adfc11a3252d7448cfdb3b12088e33093485a4100a45175718d9ddcb54a7da98fc4dccdc70cdabbdfd35871772ba11fcaf9caa40bf683662c7b6
7
+ data.tar.gz: 84c70e153f65e5044605c2ed29b1dc58421c5cdff3a17305c9b79bd47e61bfed29deea21945ad105cb174f45535a0b208e351b1d9bfe54f51f5cb5d26ccc5cfb
@@ -2,12 +2,31 @@ module ProbabilityToFriendlyString
2
2
  # Represents probability represented in a friendly manner.
3
3
  class FriendlyProbability
4
4
  include Comparable
5
- attr_reader :numerator, :denominator, :friendlyString
5
+ attr_reader :numerator, :denominator, :friendlyDescription, :friendlyString
6
6
 
7
7
  @@fractionsData = nil
8
- def initialize(numerator, denominator, friendlyString = nil)
8
+ @@friendlyDescriptionValues = [0.005, 0.02, 0.08, 0.15, 0.2, 0.45, 0.55, 0.7, 0.8, 0.85, 0.9, 0.95, 0.995]
9
+ @@friendlyDescriptionStrings = [
10
+ "Hard to imagine",
11
+ "Barely possible",
12
+ "Still possible",
13
+ "Some chance",
14
+ "Could happen",
15
+ "Perhaps",
16
+ "Flip a coin",
17
+ "Likelier than not",
18
+ "Good chance",
19
+ "Probably",
20
+ "Quite likely",
21
+ "Pretty likely",
22
+ "Very likely",
23
+ "Almost certainly",
24
+ ]
25
+
26
+ def initialize(numerator, denominator, friendlyDescription, friendlyString = nil)
9
27
  @numerator = numerator
10
28
  @denominator = denominator
29
+ @friendlyDescription = friendlyDescription
11
30
  if friendlyString
12
31
  @friendlyString = friendlyString
13
32
  else
@@ -45,14 +64,20 @@ module ProbabilityToFriendlyString
45
64
  if f < 0 or f > 1
46
65
  raise RangeError, "f is less than 0 or greater than 1"
47
66
  end
67
+ # index of the least element > f
68
+ index = @@friendlyDescriptionValues.bsearch_index {|x| x > f}
69
+ if index.nil?
70
+ index = @@friendlyDescriptionStrings.length - 1
71
+ end
72
+ friendlyDescription = @@friendlyDescriptionStrings[index]
48
73
  if f == 0
49
- return FriendlyProbability.new 0, 1
74
+ return FriendlyProbability.new 0, 1, friendlyDescription
50
75
  elsif f == 1
51
- return FriendlyProbability.new 1, 1
76
+ return FriendlyProbability.new 1, 1, friendlyDescription
52
77
  elsif f > 0.99
53
- return FriendlyProbability.new 99, 100, ">99 in 100"
78
+ return FriendlyProbability.new 99, 100, friendlyDescription, ">99 in 100"
54
79
  elsif f < 0.01
55
- return FriendlyProbability.new 1, 100, "<1 in 100"
80
+ return FriendlyProbability.new 1, 100, friendlyDescription, "<1 in 100"
56
81
  end
57
82
 
58
83
  FriendlyProbability._createFractionsData
@@ -64,14 +89,14 @@ module ProbabilityToFriendlyString
64
89
  left = @@fractionsData.length - 1
65
90
  end
66
91
  if (left == (@@fractionsData.length - 1) or (left >= 0 and f - @@fractionsData[left][0] < @@fractionsData[right][0] - f))
67
- return FriendlyProbability.new @@fractionsData[left][1], @@fractionsData[left][2]
92
+ return FriendlyProbability.new @@fractionsData[left][1], @@fractionsData[left][2], friendlyDescription
68
93
  else
69
- return FriendlyProbability.new @@fractionsData[right][1], @@fractionsData[right][2]
94
+ return FriendlyProbability.new @@fractionsData[right][1], @@fractionsData[right][2], friendlyDescription
70
95
  end
71
96
  end
72
97
 
73
98
  def to_s
74
- return "#{@numerator}/#{@denominator} (text: \"#{@friendlyString}\")"
99
+ return "#{@numerator}/#{@denominator} (text: \"#{@friendlyString}\", description: \"#{@friendlyDescription}\")"
75
100
  end
76
101
 
77
102
  def <=>(another_friendly_string)
@@ -85,7 +110,12 @@ module ProbabilityToFriendlyString
85
110
  elsif self.denominator > another_friendly_string.denominator
86
111
  1
87
112
  end
88
- if self.friendlyString < another_friendly_string.friendlyString
113
+ if self.friendlyDescription < another_friendly_string.friendlyDescription
114
+ -1
115
+ elsif self.friendlyDescription > another_friendly_string.friendlyDescription
116
+ 1
117
+ end
118
+ if self.friendlyString < another_friendly_string.friendlyString
89
119
  -1
90
120
  elsif self.friendlyString > another_friendly_string.friendlyString
91
121
  1
@@ -19,14 +19,36 @@ class FriendlyProbabilityTests < Test::Unit::TestCase
19
19
  parts = line.split(',')
20
20
  case parts.length
21
21
  when 3
22
- expected = ProbabilityToFriendlyString::FriendlyProbability.new parts[1].to_i, parts[2].to_i
22
+ expected = ProbabilityToFriendlyString::FriendlyProbability.new parts[1].to_i, parts[2].to_i, nil
23
23
  when 4
24
- expected = ProbabilityToFriendlyString::FriendlyProbability.new parts[1].to_i, parts[2].to_i, parts[3]
24
+ expected = ProbabilityToFriendlyString::FriendlyProbability.new parts[1].to_i, parts[2].to_i, nil, parts[3]
25
25
  else
26
26
  flunk "Line badly formatted: #{line} (line #{lineNumber})"
27
27
  end
28
28
  actual = ProbabilityToFriendlyString::FriendlyProbability.fromProbability(parts[0].to_f)
29
- assert_equal expected, actual, "Called on #{parts[0]} (line #{lineNumber})"
29
+ assert_equal expected.numerator, actual.numerator, "Numerator, called on #{parts[0]} (line #{lineNumber})"
30
+ assert_equal expected.denominator, actual.denominator, "Denominator, called on #{parts[0]} (line #{lineNumber})"
31
+ assert_equal expected.friendlyString, actual.friendlyString, "Denominator, called on #{parts[0]} (line #{lineNumber})"
32
+ end
33
+ end
34
+ def test_all_cases_friendly_probability
35
+ directory = File.absolute_path(File.dirname(__FILE__))
36
+ path = File.join(directory, 'testCases.friendlyDescription.txt')
37
+ while !File.exists?(path)
38
+ directory = File.dirname(directory)
39
+ path = File.join(directory, 'testCases.friendlyDescription.txt')
40
+ end
41
+ lineNumber = 0
42
+ File.open(path).each do |fullLine|
43
+ lineNumber += 1
44
+ line = fullLine.strip
45
+ if (line.start_with?('#') or line.empty?)
46
+ next
47
+ end
48
+ parts = line.split(',')
49
+ expected = parts[1]
50
+ actual = ProbabilityToFriendlyString::FriendlyProbability.fromProbability(parts[0].to_f)
51
+ assert_equal expected, actual.friendlyDescription, "FriendlyDescription, called on #{parts[0]} (line #{lineNumber})"
30
52
  end
31
53
  end
32
54
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: probability_to_friendly_string
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Greg Stoll
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-12 00:00:00.000000000 Z
11
+ date: 2020-02-13 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Make probabilities more intuitive by converting them to odds (i.e. 72.3%
14
14
  becomes "5 in 7")
@@ -39,7 +39,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
39
39
  version: '0'
40
40
  requirements: []
41
41
  rubyforge_project:
42
- rubygems_version: 2.5.2.1
42
+ rubygems_version: 2.7.6
43
43
  signing_key:
44
44
  specification_version: 4
45
45
  summary: Make probabilities more intuitive by converting them to odds