diff --git a/src/ks_rank_sensitivity.jl b/src/ks_rank_sensitivity.jl index d63a6d7b..2fda0f68 100644 --- a/src/ks_rank_sensitivity.jl +++ b/src/ks_rank_sensitivity.jl @@ -54,11 +54,13 @@ struct KSRank <: GSAMethod acceptance_threshold::Union{Function, Real} end -KSRank(;n_dummy_parameters = 50, acceptance_threshold=mean) = KSRank(n_dummy_parameters, acceptance_threshold) +function KSRank(; n_dummy_parameters = 50, acceptance_threshold = mean) + KSRank(n_dummy_parameters, acceptance_threshold) +end struct KSRankResult{T} S::AbstractVector{T} - Sd::Tuple{T, T} + Sd::Tuple{T, T} end function ks_rank_sensitivity(Xi, flag) @@ -79,16 +81,16 @@ function _compute_ksrank(X::AbstractArray, Y::AbstractArray, method::KSRank) K = size(X, 1) #samples = size(X, 2) sensitivities = zeros(K) - + if method.acceptance_threshold isa Function acceptance_threshold = method.acceptance_threshold(Y) else acceptance_threshold = method.acceptance_threshold - end + end flag = Int.(Y .> acceptance_threshold) - + # Cumulative distributions (for model parameters and dummies) - @inbounds for i = 1:K + @inbounds for i in 1:K Xi = @view X[i, :] # calculate KS score @@ -96,9 +98,11 @@ function _compute_ksrank(X::AbstractArray, Y::AbstractArray, method::KSRank) end # collect dummy sensitivities (mean and std) - dummy_sensitivities = (mean(sensitivities[K-method.n_dummy_parameters+1:end]), std(sensitivities[K-method.n_dummy_parameters+1+1:end])) + dummy_sensitivities = (mean(sensitivities[(K - method.n_dummy_parameters + 1):end]), + std(sensitivities[(K - method.n_dummy_parameters + 1 + 1):end])) - return KSRankResult(sensitivities[1:K-method.n_dummy_parameters], dummy_sensitivities) + return KSRankResult( + sensitivities[1:(K - method.n_dummy_parameters)], dummy_sensitivities) end function gsa(f, method::KSRank, p_range; samples, batch = false) diff --git a/test/ks_rank_method.jl b/test/ks_rank_method.jl index dd32c6b7..a380b100 100644 --- a/test/ks_rank_method.jl +++ b/test/ks_rank_method.jl @@ -1,6 +1,5 @@ using GlobalSensitivity, Test, QuasiMonteCarlo - function ishi_batch(X) A = 7 B = 0.1 @@ -26,16 +25,17 @@ end lb = -ones(4) * π ub = ones(4) * π -res1 = gsa(ishi, KSRank(n_dummy_parameters=50), [[lb[i], ub[i]] for i in 1:4], samples = 100_000) -res2 = gsa(ishi_batch, KSRank(), [[lb[i], ub[i]] for i in 1:4], samples = 100_000, batch = true) +res1 = gsa( + ishi, KSRank(n_dummy_parameters = 50), [[lb[i], ub[i]] for i in 1:4], samples = 100_000) +res2 = gsa( + ishi_batch, KSRank(), [[lb[i], ub[i]] for i in 1:4], samples = 100_000, batch = true) -@test (4*res1.Sd[1] .> res1.S) == [0,0,1,1] -@test (4*res2.Sd[1] .> res2.S) == [0,0,1,1] +@test (4 * res1.Sd[1] .> res1.S) == [0, 0, 1, 1] +@test (4 * res2.Sd[1] .> res2.S) == [0, 0, 1, 1] res1 = gsa(linear, KSRank(), [[lb[i], ub[i]] for i in 1:4], samples = 100_000) res2 = gsa(linear_batch, KSRank(), [[lb[i], ub[i]] for i in 1:4], batch = true, samples = 100_000) -@test (4*res1.Sd[1] .> res1.S) == [0,1,1,1] -@test (4*res2.Sd[1] .> res2.S) == [0,1,1,1] - +@test (4 * res1.Sd[1] .> res1.S) == [0, 1, 1, 1] +@test (4 * res2.Sd[1] .> res2.S) == [0, 1, 1, 1]