From e1b440e7dc5db642e69684ae0b28dfba9252b027 Mon Sep 17 00:00:00 2001 From: Milan Date: Mon, 28 Mar 2022 15:22:53 +0100 Subject: [PATCH 1/5] bitinformation with masked_value --- src/mutual_information.jl | 14 ++++++++++++++ test/information.jl | 7 +++++++ 2 files changed, 21 insertions(+) diff --git a/src/mutual_information.jl b/src/mutual_information.jl index 6fc47bf..36bec19 100644 --- a/src/mutual_information.jl +++ b/src/mutual_information.jl @@ -112,6 +112,20 @@ function bitinformation(A::AbstractArray{T}, return M end +""" + M = bitinformation(A::AbstractArray{T}, masked_value::T) where {T<:Union{Integer,AbstractFloat}} + +Bitwise real information content of array `A` calculated from the bitwise mutual information +in adjacent entries in A along dimension `dim` (optional keyword). Array `A` is masked for all +entries that are equal to `masked_value`. Masked elements are ignored in the bitwise information calculation.""" +function bitinformation(A::AbstractArray{T}, + masked_value::T; + kwargs...) where {T<:Union{Integer,AbstractFloat}} + + mask = A .== masked_value # create a bitarray for the mask + return bitinformation(A,mask,kwargs...) +end + """Calculate the bitwise redundancy of two arrays A,B. Redundancy is a normalised measure of the mutual information 1 for always identical/opposite bits, 0 for no mutual information.""" diff --git a/test/information.jl b/test/information.jl index 2b50ab9..00d6727 100644 --- a/test/information.jl +++ b/test/information.jl @@ -199,5 +199,12 @@ end mask[1:2:end,2:2:end] .= true mask[2:2:end,1:2:end] .= true @test_throws AssertionError bitinformation(A,mask) + + # check providing mask against providing a masked_value (mask is created internally) + masked_value = convert(T,1/4) + A = rand(T,30,40) + round!(A,1) + mask = A .== masked_value + @test bitinformation(A,mask) == bitinformation(A,masked_value) end end \ No newline at end of file From 52bfb3e446e22ec188519eaa2764b8fca1c29e1c Mon Sep 17 00:00:00 2001 From: Milan Date: Mon, 28 Mar 2022 15:35:13 +0100 Subject: [PATCH 2/5] masked_value changed to mandatory keyword arg --- src/mutual_information.jl | 6 +++--- test/information.jl | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mutual_information.jl b/src/mutual_information.jl index 36bec19..bee5030 100644 --- a/src/mutual_information.jl +++ b/src/mutual_information.jl @@ -113,13 +113,13 @@ function bitinformation(A::AbstractArray{T}, end """ - M = bitinformation(A::AbstractArray{T}, masked_value::T) where {T<:Union{Integer,AbstractFloat}} + M = bitinformation(A::AbstractArray{T}; masked_value::T) where {T<:Union{Integer,AbstractFloat}} Bitwise real information content of array `A` calculated from the bitwise mutual information in adjacent entries in A along dimension `dim` (optional keyword). Array `A` is masked for all entries that are equal to `masked_value`. Masked elements are ignored in the bitwise information calculation.""" -function bitinformation(A::AbstractArray{T}, - masked_value::T; +function bitinformation(A::AbstractArray{T}; + masked_value::T, kwargs...) where {T<:Union{Integer,AbstractFloat}} mask = A .== masked_value # create a bitarray for the mask diff --git a/test/information.jl b/test/information.jl index 00d6727..e7d6371 100644 --- a/test/information.jl +++ b/test/information.jl @@ -205,6 +205,6 @@ end A = rand(T,30,40) round!(A,1) mask = A .== masked_value - @test bitinformation(A,mask) == bitinformation(A,masked_value) + @test bitinformation(A,mask) == bitinformation(A;masked_value) end end \ No newline at end of file From 3ffeda782361149f36a8a1543a4e4de17a9b757c Mon Sep 17 00:00:00 2001 From: Milan Date: Mon, 28 Mar 2022 17:38:59 +0100 Subject: [PATCH 3/5] masked_value is nothing by default --- src/mutual_information.jl | 42 +++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/src/mutual_information.jl b/src/mutual_information.jl index bee5030..4685a93 100644 --- a/src/mutual_information.jl +++ b/src/mutual_information.jl @@ -52,19 +52,29 @@ function mutual_information(A::AbstractArray{T}, return M end -"""Bitwise real information content of array `A` calculated from the bitwise mutual information -in adjacent entries in A along dimension `dim`.""" +""" + M = bitinformation(A::AbstractArray{T}) where {T<:Union{Integer,AbstractFloat}} + +Bitwise real information content of array `A` calculated from the bitwise mutual information +in adjacent entries in `A`. Optional keyword arguments + + - `dim::Int=1` computes the bitwise information along dimension `dim`. + - `masked_value::T=NaN` masks all entries in `A` that are equal to `masked_value`. + - `set_zero_insignificant::Bool=true` set insignificant information to zero. + - `confidence::Real=0.99` confidence level for `set_zero_insignificant`. +""" function bitinformation(A::AbstractArray{T}; dim::Int=1, + masked_value::Union{T,Nothing}=nothing, kwargs...) where {T<:Union{Integer,AbstractFloat}} - - # Permute A to take adjacent entry in dimension dim - A = permute_dim_forward(A,dim) - # create a two views on A for pairs of adjacent entries + # create a BitArray mask if a masked_value is provided + isnothing(masked_value) && return bitinformation(A,A .== masked_value;dim,kwargs...) + + A = permute_dim_forward(A,dim) # Permute A to take adjacent entry in dimension dim n = size(A)[1] # n elements in dim - # as A is now permuted always select 1st dimension + # create a two views on A for pairs of adjacent entries, dim is always 1st dimension after permutation A1view = selectdim(A,1,1:n-1) # no adjacent entries in A array bounds A2view = selectdim(A,1,2:n) # for same indices A2 is the adjacent entry to A1 @@ -113,22 +123,10 @@ function bitinformation(A::AbstractArray{T}, end """ - M = bitinformation(A::AbstractArray{T}; masked_value::T) where {T<:Union{Integer,AbstractFloat}} - -Bitwise real information content of array `A` calculated from the bitwise mutual information -in adjacent entries in A along dimension `dim` (optional keyword). Array `A` is masked for all -entries that are equal to `masked_value`. Masked elements are ignored in the bitwise information calculation.""" -function bitinformation(A::AbstractArray{T}; - masked_value::T, - kwargs...) where {T<:Union{Integer,AbstractFloat}} - - mask = A .== masked_value # create a bitarray for the mask - return bitinformation(A,mask,kwargs...) -end + R = redundancy(A::AbstractArray{T},B::AbstractArray{T}) where {T<:Union{Integer,AbstractFloat}} -"""Calculate the bitwise redundancy of two arrays A,B. Redundancy -is a normalised measure of the mutual information 1 for always -identical/opposite bits, 0 for no mutual information.""" +Bitwise redundancy of two arrays A,B. Redundancy is a normalised measure of the mutual information: +1 for always identical/opposite bits, 0 for no mutual information.""" function redundancy(A::AbstractArray{T}, B::AbstractArray{T}) where {T<:Union{Integer,AbstractFloat}} From fcf1f1120af3a4bc15a1ac40174a99a05ee90275 Mon Sep 17 00:00:00 2001 From: Milan Date: Mon, 28 Mar 2022 18:06:45 +0100 Subject: [PATCH 4/5] && replaced with || for masked_value --- src/mutual_information.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mutual_information.jl b/src/mutual_information.jl index 4685a93..d27cd67 100644 --- a/src/mutual_information.jl +++ b/src/mutual_information.jl @@ -69,7 +69,7 @@ function bitinformation(A::AbstractArray{T}; kwargs...) where {T<:Union{Integer,AbstractFloat}} # create a BitArray mask if a masked_value is provided - isnothing(masked_value) && return bitinformation(A,A .== masked_value;dim,kwargs...) + isnothing(masked_value) || return bitinformation(A,A .== masked_value;dim,kwargs...) A = permute_dim_forward(A,dim) # Permute A to take adjacent entry in dimension dim n = size(A)[1] # n elements in dim From 37d72b6d7bb2e54535875e892bf0d1bbca3eac4c Mon Sep 17 00:00:00 2001 From: Milan Date: Mon, 28 Mar 2022 18:22:40 +0100 Subject: [PATCH 5/5] error tolerance increased --- test/information.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/information.jl b/test/information.jl index e7d6371..b78e6ee 100644 --- a/test/information.jl +++ b/test/information.jl @@ -64,7 +64,7 @@ end for T in (UInt8,UInt16,UInt32,UInt64,Float16,Float32,Float64) mutinf = mutual_information(rand(T,N),rand(T,N)) for m in mutinf - @test isapprox(0,m,atol=1e-3) + @test isapprox(0,m,atol=2e-3) end end