|
137 | 137 | @test chains isa Vector{<:MyChain}
|
138 | 138 | @test length(chains) == 1000
|
139 | 139 | @test all(x -> length(x.as) == length(x.bs) == N, chains)
|
| 140 | + @test all(ismissing(x.as[1]) for x in chains) |
140 | 141 |
|
141 | 142 | # test some statistical properties
|
142 | 143 | @test all(x -> isapprox(mean(@view x.as[2:end]), 0.5; atol=5e-2), chains)
|
|
147 | 148 | # test reproducibility
|
148 | 149 | Random.seed!(1234)
|
149 | 150 | chains2 = sample(MyModel(), MySampler(), MCMCThreads(), N, 1000; chain_type=MyChain)
|
150 |
| - |
151 |
| - @test all(c1.as[i] === c2.as[i] for (c1, c2) in zip(chains, chains2), i in 1:N) |
152 |
| - @test all(c1.bs[i] === c2.bs[i] for (c1, c2) in zip(chains, chains2), i in 1:N) |
| 151 | + @test all(ismissing(x.as[1]) for x in chains2) |
| 152 | + @test all(c1.as[i] == c2.as[i] for (c1, c2) in zip(chains, chains2), i in 2:N) |
| 153 | + @test all(c1.bs[i] == c2.bs[i] for (c1, c2) in zip(chains, chains2), i in 1:N) |
153 | 154 |
|
154 | 155 | # Unexpected order of arguments.
|
155 | 156 | str = "Number of chains (10) is greater than number of samples per chain (5)"
|
|
245 | 246 |
|
246 | 247 | # Test output type and size.
|
247 | 248 | @test chains isa Vector{<:MyChain}
|
248 |
| - @test all(c.as[1] === missing for c in chains) |
| 249 | + @test all(ismissing(c.as[1]) for c in chains) |
249 | 250 | @test length(chains) == 1000
|
250 | 251 | @test all(x -> length(x.as) == length(x.bs) == N, chains)
|
251 | 252 |
|
|
260 | 261 | chains2 = sample(
|
261 | 262 | MyModel(), MySampler(), MCMCDistributed(), N, 1000; chain_type=MyChain
|
262 | 263 | )
|
263 |
| - |
264 |
| - @test all(c1.as[i] === c2.as[i] for (c1, c2) in zip(chains, chains2), i in 1:N) |
265 |
| - @test all(c1.bs[i] === c2.bs[i] for (c1, c2) in zip(chains, chains2), i in 1:N) |
| 264 | + @test all(ismissing(c.as[1]) for c in chains2) |
| 265 | + @test all(c1.as[i] == c2.as[i] for (c1, c2) in zip(chains, chains2), i in 2:N) |
| 266 | + @test all(c1.bs[i] == c2.bs[i] for (c1, c2) in zip(chains, chains2), i in 1:N) |
266 | 267 |
|
267 | 268 | # Unexpected order of arguments.
|
268 | 269 | str = "Number of chains (10) is greater than number of samples per chain (5)"
|
|
330 | 331 |
|
331 | 332 | # Test output type and size.
|
332 | 333 | @test chains isa Vector{<:MyChain}
|
333 |
| - @test all(c.as[1] === missing for c in chains) |
| 334 | + @test all(ismissing(c.as[1]) for c in chains) |
334 | 335 | @test length(chains) == 1000
|
335 | 336 | @test all(x -> length(x.as) == length(x.bs) == N, chains)
|
336 | 337 |
|
|
343 | 344 | # Test reproducibility.
|
344 | 345 | Random.seed!(1234)
|
345 | 346 | chains2 = sample(MyModel(), MySampler(), MCMCSerial(), N, 1000; chain_type=MyChain)
|
346 |
| - |
347 |
| - @test all(c1.as[i] === c2.as[i] for (c1, c2) in zip(chains, chains2), i in 1:N) |
348 |
| - @test all(c1.bs[i] === c2.bs[i] for (c1, c2) in zip(chains, chains2), i in 1:N) |
| 347 | + @test all(ismissing(c.as[1]) for c in chains2) |
| 348 | + @test all(c1.as[i] == c2.as[i] for (c1, c2) in zip(chains, chains2), i in 2:N) |
| 349 | + @test all(c1.bs[i] == c2.bs[i] for (c1, c2) in zip(chains, chains2), i in 1:N) |
349 | 350 |
|
350 | 351 | # Unexpected order of arguments.
|
351 | 352 | str = "Number of chains (10) is greater than number of samples per chain (5)"
|
|
415 | 416 | progress=false,
|
416 | 417 | chain_type=MyChain,
|
417 | 418 | )
|
| 419 | + @test all(ismissing(c.as[1]) for c in chains_serial) |
418 | 420 |
|
419 | 421 | # Multi-threaded sampling
|
420 | 422 | Random.seed!(1234)
|
|
427 | 429 | progress=false,
|
428 | 430 | chain_type=MyChain,
|
429 | 431 | )
|
| 432 | + @test all(ismissing(c.as[1]) for c in chains_threads) |
430 | 433 | @test all(
|
431 |
| - c1.as[i] === c2.as[i] for (c1, c2) in zip(chains_serial, chains_threads), |
432 |
| - i in 1:N |
| 434 | + c1.as[i] == c2.as[i] for (c1, c2) in zip(chains_serial, chains_threads), |
| 435 | + i in 2:N |
433 | 436 | )
|
434 | 437 | @test all(
|
435 |
| - c1.bs[i] === c2.bs[i] for (c1, c2) in zip(chains_serial, chains_threads), |
| 438 | + c1.bs[i] == c2.bs[i] for (c1, c2) in zip(chains_serial, chains_threads), |
436 | 439 | i in 1:N
|
437 | 440 | )
|
438 | 441 |
|
|
447 | 450 | progress=false,
|
448 | 451 | chain_type=MyChain,
|
449 | 452 | )
|
| 453 | + @test all(ismissing(c.as[1]) for c in chains_distributed) |
450 | 454 | @test all(
|
451 |
| - c1.as[i] === c2.as[i] for (c1, c2) in zip(chains_serial, chains_distributed), |
452 |
| - i in 1:N |
| 455 | + c1.as[i] == c2.as[i] for (c1, c2) in zip(chains_serial, chains_distributed), |
| 456 | + i in 2:N |
453 | 457 | )
|
454 | 458 | @test all(
|
455 |
| - c1.bs[i] === c2.bs[i] for (c1, c2) in zip(chains_serial, chains_distributed), |
| 459 | + c1.bs[i] == c2.bs[i] for (c1, c2) in zip(chains_serial, chains_distributed), |
456 | 460 | i in 1:N
|
457 | 461 | )
|
458 | 462 | end
|
|
473 | 477 | end
|
474 | 478 |
|
475 | 479 | @testset "Discard initial samples" begin
|
476 |
| - chain = sample(MyModel(), MySampler(), 100; sleepy=true, discard_initial=50) |
477 |
| - @test length(chain) == 100 |
| 480 | + # Create a chain and discard initial samples. |
| 481 | + Random.seed!(1234) |
| 482 | + N = 100 |
| 483 | + discard_initial = 50 |
| 484 | + chain = sample(MyModel(), MySampler(), N; discard_initial=discard_initial) |
| 485 | + @test length(chain) == N |
478 | 486 | @test !ismissing(chain[1].a)
|
| 487 | + |
| 488 | + # Repeat sampling without discarding initial samples. |
| 489 | + # On Julia < 1.6 progress logging changes the global RNG and hence is enabled here. |
| 490 | + # https://github.com/TuringLang/AbstractMCMC.jl/pull/102#issuecomment-1142253258 |
| 491 | + Random.seed!(1234) |
| 492 | + ref_chain = sample( |
| 493 | + MyModel(), MySampler(), N + discard_initial; progress=VERSION < v"1.6" |
| 494 | + ) |
| 495 | + @test all(chain[i].a == ref_chain[i + discard_initial].a for i in 1:N) |
| 496 | + @test all(chain[i].b == ref_chain[i + discard_initial].b for i in 1:N) |
479 | 497 | end
|
480 | 498 |
|
481 | 499 | @testset "Thin chain by a factor of `thinning`" begin
|
482 | 500 | # Run a thinned chain with `N` samples thinned by factor of `thinning`.
|
483 |
| - Random.seed!(1234) |
| 501 | + Random.seed!(100) |
484 | 502 | N = 100
|
485 | 503 | thinning = 3
|
486 |
| - chain = sample(MyModel(), MySampler(), N; sleepy=true, thinning=thinning) |
| 504 | + chain = sample(MyModel(), MySampler(), N; thinning=thinning) |
487 | 505 | @test length(chain) == N
|
488 | 506 | @test ismissing(chain[1].a)
|
489 | 507 |
|
490 | 508 | # Repeat sampling without thinning.
|
491 |
| - Random.seed!(1234) |
492 |
| - ref_chain = sample(MyModel(), MySampler(), N * thinning; sleepy=true) |
493 |
| - @test all(chain[i].a === ref_chain[(i - 1) * thinning + 1].a for i in 1:N) |
| 509 | + # On Julia < 1.6 progress logging changes the global RNG and hence is enabled here. |
| 510 | + # https://github.com/TuringLang/AbstractMCMC.jl/pull/102#issuecomment-1142253258 |
| 511 | + Random.seed!(100) |
| 512 | + ref_chain = sample(MyModel(), MySampler(), N * thinning; progress=VERSION < v"1.6") |
| 513 | + @test all(chain[i].a == ref_chain[(i - 1) * thinning + 1].a for i in 2:N) |
| 514 | + @test all(chain[i].b == ref_chain[(i - 1) * thinning + 1].b for i in 1:N) |
494 | 515 | end
|
495 | 516 |
|
496 | 517 | @testset "Sample without predetermined N" begin
|
|
501 | 522 | @test abs(bmean) <= 0.001 || length(chain) == 10_000
|
502 | 523 |
|
503 | 524 | # Discard initial samples.
|
504 |
| - chain = sample(MyModel(), MySampler(); discard_initial=50) |
| 525 | + Random.seed!(1234) |
| 526 | + discard_initial = 50 |
| 527 | + chain = sample(MyModel(), MySampler(); discard_initial=discard_initial) |
505 | 528 | bmean = mean(x.b for x in chain)
|
506 | 529 | @test !ismissing(chain[1].a)
|
507 | 530 | @test abs(bmean) <= 0.001 || length(chain) == 10_000
|
508 | 531 |
|
| 532 | + # On Julia < 1.6 progress logging changes the global RNG and hence is enabled here. |
| 533 | + # https://github.com/TuringLang/AbstractMCMC.jl/pull/102#issuecomment-1142253258 |
| 534 | + Random.seed!(1234) |
| 535 | + N = length(chain) |
| 536 | + ref_chain = sample( |
| 537 | + MyModel(), |
| 538 | + MySampler(), |
| 539 | + N; |
| 540 | + discard_initial=discard_initial, |
| 541 | + progress=VERSION < v"1.6", |
| 542 | + ) |
| 543 | + @test all(chain[i].a == ref_chain[i].a for i in 1:N) |
| 544 | + @test all(chain[i].b == ref_chain[i].b for i in 1:N) |
| 545 | + |
509 | 546 | # Thin chain by a factor of `thinning`.
|
510 |
| - chain = sample(MyModel(), MySampler(); thinning=3) |
| 547 | + Random.seed!(1234) |
| 548 | + thinning = 3 |
| 549 | + chain = sample(MyModel(), MySampler(); thinning=thinning) |
511 | 550 | bmean = mean(x.b for x in chain)
|
512 | 551 | @test ismissing(chain[1].a)
|
513 | 552 | @test abs(bmean) <= 0.001 || length(chain) == 10_000
|
| 553 | + |
| 554 | + # On Julia < 1.6 progress logging changes the global RNG and hence is enabled here. |
| 555 | + # https://github.com/TuringLang/AbstractMCMC.jl/pull/102#issuecomment-1142253258 |
| 556 | + Random.seed!(1234) |
| 557 | + N = length(chain) |
| 558 | + ref_chain = sample( |
| 559 | + MyModel(), MySampler(), N; thinning=thinning, progress=VERSION < v"1.6" |
| 560 | + ) |
| 561 | + @test all(chain[i].a == ref_chain[i].a for i in 2:N) |
| 562 | + @test all(chain[i].b == ref_chain[i].b for i in 1:N) |
514 | 563 | end
|
515 | 564 |
|
516 | 565 | @testset "Sample vector of `NamedTuple`s" begin
|
|
0 commit comments