tiny_outcome 3.0.0 → 3.1.1

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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/tiny_outcome.rb +33 -6
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 86b4b40958991ec5019ebaa4595fd5526cb06547d1e649dadf8dd7098355b45c
4
- data.tar.gz: 546ace5ff2dde2fa8cd3d4e6e982101d90c57293157a66458ba870cb6860e305
3
+ metadata.gz: 117564a93dd35781e19d6f1420eb763f2a39ed5feb38a7a3bd3279ad8f1ed4d2
4
+ data.tar.gz: 5dd7829f20e626b261a004ef3f83a8e48d8e978fc8d400d36f63d62e6f6bfd42
5
5
  SHA512:
6
- metadata.gz: 442b6a72cbf0f0457c10de8ce1a8f78b8b7c5187a634c3816e8b3dea5d5eb0c33bed7a1d01f5bc86c1373c6a323df46df6dd6dc78da0b94ba0856e714cba221c
7
- data.tar.gz: e92cbdef295da8f77501608c9d8a4511b2b1f2c184b7eba8e8896ac901c125b5ad2c330c7fc07f346b81b31fd0cd2650b175f301cb6f6248814014216b147aaf
6
+ metadata.gz: 02c0184cb9692db7ffce8fd91cd1ec1b830df1b0bebf453c7fd25744ead1cc2af5ba2e9c990b4eed23d3668231edeb79840b4121ddf65d5ac2bbf57a6e1a85c5
7
+ data.tar.gz: 3fb696f998d6598d04453b5dbe1ac70216ff340884b9a6d89a6b990338619e7c34197b43a10d7a2403ea4b5ff3ba915cd988c4c1a5b0982c6f39ca7383538006
data/lib/tiny_outcome.rb CHANGED
@@ -32,7 +32,10 @@ class TinyOutcome
32
32
  :warmup,
33
33
  :probability,
34
34
  :one_count,
35
- :value
35
+ :value,
36
+ :min,
37
+ :max,
38
+ :avg
36
39
 
37
40
  WARM_FULL = :full
38
41
  WARM_TWO_THIRDS = :two_thirds
@@ -49,6 +52,9 @@ class TinyOutcome
49
52
  @probability = 0.0
50
53
  @one_count = 0
51
54
  @samples = 0
55
+ @min = 1.0
56
+ @max = 0.0
57
+ @avg = 0.0
52
58
  @warmth = 0
53
59
  @value = [0] * @precision
54
60
  @value_index = 0
@@ -68,10 +74,7 @@ class TinyOutcome
68
74
  (full? ? @value.rotate(@value_index) : @value)[..(samples-1)].join.to_i(2)
69
75
  end
70
76
 
71
- # add a sample to the historic outcomes. the new sample is added to the
72
- # low-order bits. the new sample is literally left-shifted into the value. the
73
- # only reason this is a custom method is because some metadata needs to be
74
- # updated when a new sample is added
77
+ # add a sample to the historic outcomes
75
78
  def <<(sample)
76
79
  raise "Invalid sample: #{sample}" unless sample == 0 || sample == 1
77
80
 
@@ -91,7 +94,7 @@ class TinyOutcome
91
94
  @one_count += 1 if sample == 1
92
95
  @probability = @one_count / samples.to_f
93
96
 
94
- value
97
+ @value
95
98
  end
96
99
 
97
100
  # true if #probability is >= percentage
@@ -117,6 +120,30 @@ class TinyOutcome
117
120
  samples == precision
118
121
  end
119
122
 
123
+ # updates, and memoizes, the min/max/avg numbers. if you read the min/max/avg
124
+ # attributes you are getting the MEMOIZED values.
125
+ def update_stats!
126
+ return if @samples == 0
127
+
128
+ @min = 1.0
129
+ @max = 0.0
130
+ @avg = 0.0
131
+
132
+ sum = 0.0
133
+ raw = (full? ? @value.rotate(@value_index) : @value)[..(samples-1)]
134
+ group_size = [@samples, 100].min
135
+ num_groups = @samples - group_size
136
+ raw.each_cons(group_size) do |samples_group|
137
+ curr = samples_group.count(1) / samples.to_f
138
+ sum += curr
139
+
140
+ @min = curr if curr < @min
141
+ @max = curr if curr > @max
142
+ end
143
+
144
+ @avg = sum / (@num_groups.to_f + 1.0)
145
+ end
146
+
120
147
  # convenient way to see what's up
121
148
  def to_hash
122
149
  [:value,
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tiny_outcome
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Lunt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-03 00:00:00.000000000 Z
11
+ date: 2023-11-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest