|
57 | 57 | end
|
58 | 58 | @inline function Base.iterate(it::SeqSampleIter, state)
|
59 | 59 | i, nv, Nv, q1, q2, threshold, vprime = state
|
60 |
| - if nv > 1 && threshold < Nv |
| 60 | + if nv > 1 |
61 | 61 | s, vprime = skip(it.rng, nv, Nv, vprime, q1, q2)
|
62 | 62 | i, nv, Nv, q1, q2, threshold = new_state(it, s, i, nv, Nv, q1, q2, threshold)
|
63 | 63 | return (i, (i, nv, Nv, q1, q2, threshold, vprime))
|
64 |
| - elseif nv > 1 |
65 |
| - s = seqsample_a(it.rng, it.N - i, nv) |
66 |
| - nv -= 1 |
67 |
| - i += s+1 |
68 |
| - return (i, ((nv === 0 ? i : it.N+1), nv, Nv, q1, q2, threshold, vprime)) |
69 | 64 | else
|
70 |
| - i === it.N+1 && return nothing |
| 65 | + nv === 0 && return nothing |
71 | 66 | s = trunc(Int, Nv * vprime)
|
72 | 67 | i += s+1
|
73 |
| - return (i, (it.N+1, nv, Nv, q1, q2, threshold, vprime)) |
| 68 | + nv -= 1 |
| 69 | + return (i, (i, nv, Nv, q1, q2, threshold, vprime)) |
74 | 70 | end
|
75 | 71 | end
|
76 | 72 |
|
|
129 | 125 | return i, nv, Nv, q1, q2, threshold
|
130 | 126 | end
|
131 | 127 |
|
132 |
| -@inline function seqsample_a!(rng::AbstractRNG, n, k) |
| 128 | +@inline function seqsample_a(rng::AbstractRNG, n, k) |
133 | 129 | if k > 1
|
134 | 130 | i = 0
|
135 | 131 | q = (n-k)/n
|
|
138 | 134 | n -= 1
|
139 | 135 | q *= (n-k)/n
|
140 | 136 | end
|
141 |
| - return i |
| 137 | + return i, n |
142 | 138 | else
|
143 |
| - return trunc(Int, n * rand(rng)) |
| 139 | + return trunc(Int, n * rand(rng)), n |
144 | 140 | end
|
145 | 141 | end
|
146 | 142 |
|
|
0 commit comments