From 947909c36286a46a7492ddb1256719728f73d5e7 Mon Sep 17 00:00:00 2001 From: Shravan Goswami Date: Wed, 1 Oct 2025 20:39:54 +0530 Subject: [PATCH 1/8] Show warning message if initial_parameters is passed instead of initial_params --- src/sample.jl | 15 +++++++++++++++ test/sample.jl | 16 ++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/sample.jl b/src/sample.jl index 913332d1..2f790b1f 100644 --- a/src/sample.jl +++ b/src/sample.jl @@ -405,6 +405,11 @@ function mcmcsample( initial_state=nothing, kwargs..., ) + # Warn if initial_parameters is passed instead of initial_params + if haskey(kwargs, :initial_parameters) + @warn "The `initial_parameters` keyword argument is not recognised; please use `initial_params` instead." + end + # Check if actually multiple threads are used. if Threads.nthreads() == 1 @warn "Only a single thread available: MCMC chains are not sampled in parallel" @@ -588,6 +593,11 @@ function mcmcsample( initial_state=nothing, kwargs..., ) + # Warn if initial_parameters is passed instead of initial_params + if haskey(kwargs, :initial_parameters) + @warn "The `initial_parameters` keyword argument is not recognised; please use `initial_params` instead." + end + # Check if actually multiple processes are used. if Distributed.nworkers() == 1 @warn "Only a single process available: MCMC chains are not sampled in parallel" @@ -727,6 +737,11 @@ function mcmcsample( initial_state=nothing, kwargs..., ) + # Warn if initial_parameters is passed instead of initial_params + if haskey(kwargs, :initial_parameters) + @warn "The `initial_parameters` keyword argument is not recognised; please use `initial_params` instead." + end + # Check if the number of chains is larger than the number of samples if nchains > N @warn "Number of chains ($nchains) is greater than number of samples per chain ($N)" diff --git a/test/sample.jl b/test/sample.jl index f561f535..b104e25c 100644 --- a/test/sample.jl +++ b/test/sample.jl @@ -31,6 +31,12 @@ ) @test chain[1].a == -1.8 @test chain[1].b == 3.2 + + # test warning for initial_parameters (typo) + # Note: initial_parameters will be ignored, but it should warn the user + @test_logs (:warn, r"initial_parameters.*not recognised.*initial_params") (:warn,) sample( + MyModel(), MySampler(), MCMCThreads(), 3, 2; progress=false, initial_parameters=(b=1.0, a=2.0) + ) end @testset "IJulia" begin @@ -282,6 +288,11 @@ MyModel(), MySampler(), MCMCDistributed(), 5, 10; chain_type=MyChain ) + # Test warning for initial_parameters (typo) + @test_logs (:warn, r"initial_parameters.*not recognised.*initial_params") sample( + MyModel(), MySampler(), MCMCDistributed(), 3, 2; progress=false, initial_parameters=(b=1.0, a=2.0) + ) + # Suppress output. logs, _ = collect_test_logs(; min_level=Logging.LogLevel(-1)) do sample( @@ -408,6 +419,11 @@ MyModel(), MySampler(), MCMCSerial(), 5, 10; chain_type=MyChain ) + # Test warning for initial_parameters (typo) + @test_logs (:warn, r"initial_parameters.*not recognised.*initial_params") sample( + MyModel(), MySampler(), MCMCSerial(), 3, 2; progress=false, initial_parameters=(b=1.0, a=2.0) + ) + # Suppress output. logs, _ = collect_test_logs(; min_level=Logging.LogLevel(-1)) do sample( From 9c1d283a2546eab6cd30f570800ea3a581f6d737 Mon Sep 17 00:00:00 2001 From: Shravan Goswami Date: Wed, 1 Oct 2025 20:44:35 +0530 Subject: [PATCH 2/8] run JuliaFormatter --- test/sample.jl | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/test/sample.jl b/test/sample.jl index b104e25c..acca867b 100644 --- a/test/sample.jl +++ b/test/sample.jl @@ -34,8 +34,16 @@ # test warning for initial_parameters (typo) # Note: initial_parameters will be ignored, but it should warn the user - @test_logs (:warn, r"initial_parameters.*not recognised.*initial_params") (:warn,) sample( - MyModel(), MySampler(), MCMCThreads(), 3, 2; progress=false, initial_parameters=(b=1.0, a=2.0) + @test_logs (:warn, r"initial_parameters.*not recognised.*initial_params") ( + :warn, + ) sample( + MyModel(), + MySampler(), + MCMCThreads(), + 3, + 2; + progress=false, + initial_parameters=(b=1.0, a=2.0), ) end @@ -290,7 +298,13 @@ # Test warning for initial_parameters (typo) @test_logs (:warn, r"initial_parameters.*not recognised.*initial_params") sample( - MyModel(), MySampler(), MCMCDistributed(), 3, 2; progress=false, initial_parameters=(b=1.0, a=2.0) + MyModel(), + MySampler(), + MCMCDistributed(), + 3, + 2; + progress=false, + initial_parameters=(b=1.0, a=2.0), ) # Suppress output. @@ -421,7 +435,13 @@ # Test warning for initial_parameters (typo) @test_logs (:warn, r"initial_parameters.*not recognised.*initial_params") sample( - MyModel(), MySampler(), MCMCSerial(), 3, 2; progress=false, initial_parameters=(b=1.0, a=2.0) + MyModel(), + MySampler(), + MCMCSerial(), + 3, + 2; + progress=false, + initial_parameters=(b=1.0, a=2.0), ) # Suppress output. From 42e519b3fb6c9a9ff4d02f503053a35d43fc39de Mon Sep 17 00:00:00 2001 From: Shravan Goswami Date: Wed, 1 Oct 2025 21:14:40 +0530 Subject: [PATCH 3/8] fix CI --- test/sample.jl | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/sample.jl b/test/sample.jl index acca867b..511efae0 100644 --- a/test/sample.jl +++ b/test/sample.jl @@ -34,9 +34,8 @@ # test warning for initial_parameters (typo) # Note: initial_parameters will be ignored, but it should warn the user - @test_logs (:warn, r"initial_parameters.*not recognised.*initial_params") ( - :warn, - ) sample( + @test_logs (:warn, r"initial_parameters.*not recognised.*initial_params") match_mode = + :any sample( MyModel(), MySampler(), MCMCThreads(), From 62881c58739374c1633687f2709fa7042ea098c4 Mon Sep 17 00:00:00 2001 From: Shravan Goswami Date: Thu, 2 Oct 2025 10:14:17 +0530 Subject: [PATCH 4/8] remove initial_parameters from kwargs in multi-chain functions --- src/sample.jl | 11 +++++++++++ test/sample.jl | 7 ++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/sample.jl b/src/sample.jl index 2f790b1f..fd3975ce 100644 --- a/src/sample.jl +++ b/src/sample.jl @@ -121,6 +121,11 @@ function mcmcsample( initial_state=nothing, kwargs..., ) + # Warn if initial_parameters is passed instead of initial_params + if haskey(kwargs, :initial_parameters) + @warn "The `initial_parameters` keyword argument is not recognised; please use `initial_params` instead." + end + # Check the number of requested samples. N > 0 || error("the number of samples must be ≥ 1") discard_initial >= 0 || @@ -408,6 +413,8 @@ function mcmcsample( # Warn if initial_parameters is passed instead of initial_params if haskey(kwargs, :initial_parameters) @warn "The `initial_parameters` keyword argument is not recognised; please use `initial_params` instead." + # Remove initial_parameters from kwargs to prevent it from being passed to single-chain sample + kwargs = pairs((; (k => v for (k, v) in pairs(kwargs) if k !== :initial_parameters)...)) end # Check if actually multiple threads are used. @@ -596,6 +603,8 @@ function mcmcsample( # Warn if initial_parameters is passed instead of initial_params if haskey(kwargs, :initial_parameters) @warn "The `initial_parameters` keyword argument is not recognised; please use `initial_params` instead." + # Remove initial_parameters from kwargs to prevent it from being passed to single-chain sample + kwargs = pairs((; (k => v for (k, v) in pairs(kwargs) if k !== :initial_parameters)...)) end # Check if actually multiple processes are used. @@ -740,6 +749,8 @@ function mcmcsample( # Warn if initial_parameters is passed instead of initial_params if haskey(kwargs, :initial_parameters) @warn "The `initial_parameters` keyword argument is not recognised; please use `initial_params` instead." + # Remove initial_parameters from kwargs to prevent it from being passed to single-chain sample + kwargs = pairs((; (k => v for (k, v) in pairs(kwargs) if k !== :initial_parameters)...)) end # Check if the number of chains is larger than the number of samples diff --git a/test/sample.jl b/test/sample.jl index 511efae0..a64f13ec 100644 --- a/test/sample.jl +++ b/test/sample.jl @@ -32,7 +32,12 @@ @test chain[1].a == -1.8 @test chain[1].b == 3.2 - # test warning for initial_parameters (typo) + # test warning for initial_parameters (typo) in single-chain sampling + @test_logs (:warn, r"initial_parameters.*not recognised.*initial_params") sample( + MyModel(), MySampler(), 3; progress=false, initial_parameters=(b=1.0, a=2.0) + ) + + # test warning for initial_parameters (typo) in multi-chain sampling # Note: initial_parameters will be ignored, but it should warn the user @test_logs (:warn, r"initial_parameters.*not recognised.*initial_params") match_mode = :any sample( From 15649ad16320b530eb159e57b2e5834c11c6fd62 Mon Sep 17 00:00:00 2001 From: Shravan Goswami Date: Thu, 2 Oct 2025 10:15:04 +0530 Subject: [PATCH 5/8] format --- src/sample.jl | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/sample.jl b/src/sample.jl index fd3975ce..e811068d 100644 --- a/src/sample.jl +++ b/src/sample.jl @@ -414,7 +414,9 @@ function mcmcsample( if haskey(kwargs, :initial_parameters) @warn "The `initial_parameters` keyword argument is not recognised; please use `initial_params` instead." # Remove initial_parameters from kwargs to prevent it from being passed to single-chain sample - kwargs = pairs((; (k => v for (k, v) in pairs(kwargs) if k !== :initial_parameters)...)) + kwargs = pairs((; + (k => v for (k, v) in pairs(kwargs) if k !== :initial_parameters)... + )) end # Check if actually multiple threads are used. @@ -604,7 +606,9 @@ function mcmcsample( if haskey(kwargs, :initial_parameters) @warn "The `initial_parameters` keyword argument is not recognised; please use `initial_params` instead." # Remove initial_parameters from kwargs to prevent it from being passed to single-chain sample - kwargs = pairs((; (k => v for (k, v) in pairs(kwargs) if k !== :initial_parameters)...)) + kwargs = pairs((; + (k => v for (k, v) in pairs(kwargs) if k !== :initial_parameters)... + )) end # Check if actually multiple processes are used. @@ -750,7 +754,9 @@ function mcmcsample( if haskey(kwargs, :initial_parameters) @warn "The `initial_parameters` keyword argument is not recognised; please use `initial_params` instead." # Remove initial_parameters from kwargs to prevent it from being passed to single-chain sample - kwargs = pairs((; (k => v for (k, v) in pairs(kwargs) if k !== :initial_parameters)...)) + kwargs = pairs((; + (k => v for (k, v) in pairs(kwargs) if k !== :initial_parameters)... + )) end # Check if the number of chains is larger than the number of samples From 8824683c477a8405316cb46de19b210a445f500e Mon Sep 17 00:00:00 2001 From: Shravan Goswami Date: Thu, 2 Oct 2025 10:19:02 +0530 Subject: [PATCH 6/8] remove reduntant comment --- test/sample.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/test/sample.jl b/test/sample.jl index a64f13ec..954acc7c 100644 --- a/test/sample.jl +++ b/test/sample.jl @@ -38,7 +38,6 @@ ) # test warning for initial_parameters (typo) in multi-chain sampling - # Note: initial_parameters will be ignored, but it should warn the user @test_logs (:warn, r"initial_parameters.*not recognised.*initial_params") match_mode = :any sample( MyModel(), From 72ac520b7a12ed1e4ecbc69e7779f9e0a311cbb7 Mon Sep 17 00:00:00 2001 From: Shravan Goswami Date: Thu, 2 Oct 2025 12:46:23 +0530 Subject: [PATCH 7/8] minor version bump --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 3580425a..f49b214a 100644 --- a/Project.toml +++ b/Project.toml @@ -3,7 +3,7 @@ uuid = "80f14c24-f653-4e6a-9b94-39d6b0f70001" keywords = ["markov chain monte carlo", "probabilistic programming"] license = "MIT" desc = "A lightweight interface for common MCMC methods." -version = "5.8.0" +version = "5.8.1" [deps] BangBang = "198e06fe-97b7-11e9-32a5-e1d131e6ad66" From 539d06b3410359ad0f2b3c5973bc000e5e18003b Mon Sep 17 00:00:00 2001 From: Shravan Goswami Date: Thu, 2 Oct 2025 17:24:14 +0530 Subject: [PATCH 8/8] add utility function for initial_parameters warning --- src/sample.jl | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/sample.jl b/src/sample.jl index e811068d..13e91b7a 100644 --- a/src/sample.jl +++ b/src/sample.jl @@ -105,6 +105,20 @@ function StatsBase.sample( return mcmcsample(rng, model, sampler, parallel, N, nchains; kwargs...) end +# Utility function to check and warn about common kwargs mistakes +function _check_initial_params_kwarg(kwargs) + if haskey(kwargs, :initial_parameters) + @warn "The `initial_parameters` keyword argument is not recognised; please use `initial_params` instead." + return true + end + return false +end + +# Utility function to remove initial_parameters from kwargs after warning +function _filter_initial_params_kwarg(kwargs) + return pairs((; (k => v for (k, v) in pairs(kwargs) if k !== :initial_parameters)...)) +end + # Default implementations of regular and parallel sampling. function mcmcsample( rng::Random.AbstractRNG, @@ -122,9 +136,7 @@ function mcmcsample( kwargs..., ) # Warn if initial_parameters is passed instead of initial_params - if haskey(kwargs, :initial_parameters) - @warn "The `initial_parameters` keyword argument is not recognised; please use `initial_params` instead." - end + _check_initial_params_kwarg(kwargs) # Check the number of requested samples. N > 0 || error("the number of samples must be ≥ 1") @@ -410,13 +422,9 @@ function mcmcsample( initial_state=nothing, kwargs..., ) - # Warn if initial_parameters is passed instead of initial_params - if haskey(kwargs, :initial_parameters) - @warn "The `initial_parameters` keyword argument is not recognised; please use `initial_params` instead." - # Remove initial_parameters from kwargs to prevent it from being passed to single-chain sample - kwargs = pairs((; - (k => v for (k, v) in pairs(kwargs) if k !== :initial_parameters)... - )) + # Warn if initial_parameters is passed instead of initial_params and remove it from kwargs + if _check_initial_params_kwarg(kwargs) + kwargs = _filter_initial_params_kwarg(kwargs) end # Check if actually multiple threads are used. @@ -602,13 +610,9 @@ function mcmcsample( initial_state=nothing, kwargs..., ) - # Warn if initial_parameters is passed instead of initial_params - if haskey(kwargs, :initial_parameters) - @warn "The `initial_parameters` keyword argument is not recognised; please use `initial_params` instead." - # Remove initial_parameters from kwargs to prevent it from being passed to single-chain sample - kwargs = pairs((; - (k => v for (k, v) in pairs(kwargs) if k !== :initial_parameters)... - )) + # Warn if initial_parameters is passed instead of initial_params and remove it from kwargs + if _check_initial_params_kwarg(kwargs) + kwargs = _filter_initial_params_kwarg(kwargs) end # Check if actually multiple processes are used. @@ -750,13 +754,9 @@ function mcmcsample( initial_state=nothing, kwargs..., ) - # Warn if initial_parameters is passed instead of initial_params - if haskey(kwargs, :initial_parameters) - @warn "The `initial_parameters` keyword argument is not recognised; please use `initial_params` instead." - # Remove initial_parameters from kwargs to prevent it from being passed to single-chain sample - kwargs = pairs((; - (k => v for (k, v) in pairs(kwargs) if k !== :initial_parameters)... - )) + # Warn if initial_parameters is passed instead of initial_params and remove it from kwargs + if _check_initial_params_kwarg(kwargs) + kwargs = _filter_initial_params_kwarg(kwargs) end # Check if the number of chains is larger than the number of samples