@@ -107,22 +107,13 @@ end
107107 end
108108 elseif s. skip_k < s. seen_k
109109 p = 1 / s. seen_k
110- z = (1 - p)^ (n- 3 )
111- q = rand (s. rng, Uniform (z* (1 - p)* (1 - p)* (1 - p),1.0 ))
112- k = choose (n, p, q, z)
113- @inbounds begin
114- if k == 1
115- r = rand (s. rng, 1 : n)
116- s. value[r] = el
117- update_order_single! (s, r)
118- else
119- for j in 1 : k
120- r = rand (s. rng, j: n)
121- s. value[r] = el
122- s. value[r], s. value[j] = s. value[j], s. value[r]
123- update_order_multi! (s, r, j)
124- end
125- end
110+ z = exp ((n- 4 )* log1p (- p))
111+ q = rand (s. rng, Uniform (z* (1 - p)* (1 - p)* (1 - p)* (1 - p),1.0 ))
112+ k = @inline choose (n, p, q, z)
113+ @inbounds for j in 1 : k
114+ r = rand (s. rng, j: n)
115+ s. value[r], s. value[j] = s. value[j], el
116+ update_order_multi! (s, r, j)
126117 end
127118 s = recompute_skip! (s, n)
128119 end
@@ -164,20 +155,22 @@ function recompute_skip!(s::SampleMultiAlgL, n)
164155 return s
165156end
166157function recompute_skip! (s:: SampleMultiAlgRSWRSKIP , n)
167- q = rand ( s. rng)^ ( 1 / n)
158+ q = exp ( - randexp ( s. rng)/ n)
168159 @update s. skip_k = ceil (Int, s. seen_k/ q)- 1
169160 return s
170161end
171162
172163function choose (n, p, q, z)
173164 m = 1 - p
174165 s = z
175- z = s* m* m* (m + n* p)
166+ z = s* m* m* m * (m + n* p)
176167 z > q && return 1
177- z += n* p* (n- 1 )* p* s* m/ 2
168+ z += n* p* (n- 1 )* p* s* m* m / 2
178169 z > q && return 2
179- z += n* p* (n- 1 )* p* (n- 2 )* p* s/ 6
170+ z += n* p* (n- 1 )* p* (n- 2 )* p* s* m / 6
180171 z > q && return 3
172+ z += n* p* (n- 1 )* p* (n- 2 )* p* (n- 3 )* p* s/ 24
173+ z > q && return 4
181174 b = Binomial (n, p)
182175 return quantile (b, q)
183176end
@@ -226,7 +219,11 @@ function OnlineStatsBase.value(s::Union{SampleMultiAlgR, SampleMultiAlgL})
226219end
227220function OnlineStatsBase. value (s:: SampleMultiAlgRSWRSKIP )
228221 if nobs (s) < length (s. value)
229- return nobs (s) == 0 ? s. value[1 : 0 ] : sample (s. rng, s. value[1 : nobs (s)], length (s. value))
222+ if nobs (s) == 0
223+ return s. value[1 : 0 ]
224+ else
225+ return sample (s. rng, s. value[1 : nobs (s)], length (s. value))
226+ end
230227 else
231228 return s. value
232229 end
@@ -241,7 +238,11 @@ function ordvalue(s::Union{SampleMultiOrdAlgR, SampleMultiOrdAlgL})
241238end
242239function ordvalue (s:: SampleMultiOrdAlgRSWRSKIP )
243240 if nobs (s) < length (s. value)
244- return sample (s. rng, s. value[1 : nobs (s)], length (s. value); ordered= true )
241+ if nobs (s) == 0
242+ return s. value[1 : 0 ]
243+ else
244+ return sample (s. rng, s. value[1 : nobs (s)], length (s. value); ordered= true )
245+ end
245246 else
246247 return s. value[sortperm (s. ord)]
247248 end
0 commit comments