| using Random |
|
|
| function qcorridor(T, k, com, seed, alpha0, alphaT, eps0, epsT, N) |
| |
| rng = Xoshiro(seed + 1000*k) |
| pi = [0.5, 0.5] |
|
|
| |
| function c(t, c0, cT) |
| if c0 == cT return c0 end |
| cb = cT * T / (c0 - cT) |
| ca = c0 * cb |
| return ca / (cb + t) |
| end |
|
|
| |
| q = 0.1 * randn(rng, 2, 2) |
| ts = N > 1 ? floor.(10 .^ range(0, log10(T), N)) : |
| N == 0 ? range(1, T) : [T] |
| qs = N != 1 ? zeros(size(ts, 1), 2, 2) : q |
| x = 0 |
| z = 0 |
| u = rand(rng) < pi[z + 1] |
| j = 1 |
|
|
| for t in 1:T |
| |
| x += 2*u - 1 |
| z_ = x > 0 |
| r = x == 0 ? 0 : x == k + 1 ? k : -1 |
|
|
| |
| q[z + 1, u + 1] += c(t, alpha0, alphaT) * (r + |
| (0 <= x <= k ? maximum(@view q[z_ + 1, :]) : 0) - q[z + 1, u + 1]) |
|
|
| if eps0 > 0 |
| eps = c(t, eps0, epsT) |
| pi[1] = q[1, 2] > q[1, 1] ? 1 - eps : eps |
| pi[2] = q[2, 2] > q[2, 1] ? 1 - eps : eps |
| end |
|
|
| |
| while j <= size(ts, 1) && t == ts[j] |
| qs[j, :, :] = q |
| j += 1 |
| end |
|
|
| if !(0 <= x <= k) |
| x = 0 |
| z = 0 |
| u = rand(rng) < pi[z + 1] |
| elseif !com || z_ != z |
| z = z_ |
| u = rand(rng) < pi[z_ + 1] |
| end |
| end |
| return ts, qs |
| end |
|
|