From 55ba4c11d5dd581fcb6c40b4161352a489eda606 Mon Sep 17 00:00:00 2001 From: Penelope Yong Date: Fri, 18 Jul 2025 16:29:48 +0100 Subject: [PATCH 1/4] Implement custom `sqmahal` for DiagNormal --- src/multivariate/mvnormal.jl | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/multivariate/mvnormal.jl b/src/multivariate/mvnormal.jl index 5806c00f31..1abf15a089 100644 --- a/src/multivariate/mvnormal.jl +++ b/src/multivariate/mvnormal.jl @@ -261,6 +261,16 @@ logdetcov(d::MvNormal) = logdet(d.Σ) sqmahal(d::MvNormal, x::AbstractVector) = invquad(d.Σ, x .- d.μ) +function sqmahal(d::DiagNormal, x::AbstractVector) + # Faster than above as this avoids calculating (x .- d.µ) + T = promote_type(partype(d), eltype(x)) + sum = zero(T) + for i in eachindex(x) + @inbounds sum += abs2(x[i] - d.μ[i]) / d.Σ[i, i] + end + return sum +end + sqmahal!(r::AbstractVector, d::MvNormal, x::AbstractMatrix) = invquad!(r, d.Σ, x .- d.μ) From 529ba7afedadb893e12ed783f095d3c3f7b904c2 Mon Sep 17 00:00:00 2001 From: Penelope Yong Date: Fri, 18 Jul 2025 16:30:14 +0100 Subject: [PATCH 2/4] Bump patch --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 033930d7cc..5adbe274c7 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "Distributions" uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" authors = ["JuliaStats"] -version = "0.25.120" +version = "0.25.121" [deps] AliasTables = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" From 17d8c716d3e51faafd4dc8b8443f3ed166bab33e Mon Sep 17 00:00:00 2001 From: Penelope Yong Date: Fri, 18 Jul 2025 16:44:46 +0100 Subject: [PATCH 3/4] Add IsoNormal method too --- src/multivariate/mvnormal.jl | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/multivariate/mvnormal.jl b/src/multivariate/mvnormal.jl index 1abf15a089..cead377cc2 100644 --- a/src/multivariate/mvnormal.jl +++ b/src/multivariate/mvnormal.jl @@ -271,6 +271,15 @@ function sqmahal(d::DiagNormal, x::AbstractVector) return sum end +function sqmahal(d::IsoNormal, x::AbstractVector) + T = promote_type(partype(d), eltype(x)) + sum = zero(T) + for i in eachindex(x) + @inbounds sum += abs2(x[i] - d.μ[i]) + end + return sum +end + sqmahal!(r::AbstractVector, d::MvNormal, x::AbstractMatrix) = invquad!(r, d.Σ, x .- d.μ) From 0b592c79a92608800c773eec2757cb1921289f34 Mon Sep 17 00:00:00 2001 From: Penelope Yong Date: Fri, 18 Jul 2025 16:54:35 +0100 Subject: [PATCH 4/4] Fix typo in IsoNormal method --- src/multivariate/mvnormal.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/multivariate/mvnormal.jl b/src/multivariate/mvnormal.jl index cead377cc2..fa64142365 100644 --- a/src/multivariate/mvnormal.jl +++ b/src/multivariate/mvnormal.jl @@ -277,7 +277,7 @@ function sqmahal(d::IsoNormal, x::AbstractVector) for i in eachindex(x) @inbounds sum += abs2(x[i] - d.μ[i]) end - return sum + return sum / d.Σ[1, 1] end sqmahal!(r::AbstractVector, d::MvNormal, x::AbstractMatrix) =