Skip to content

Commit

Permalink
Bump
Browse files Browse the repository at this point in the history
  • Loading branch information
giopaglia committed Feb 6, 2024
1 parent 2aa3f8c commit 8a44696
Show file tree
Hide file tree
Showing 7 changed files with 52 additions and 49 deletions.
12 changes: 7 additions & 5 deletions Project.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name = "SoleFeatures"
uuid = "3ceb4e54-d968-4e97-8c18-2deeb0d429fb"
authors = ["Patrik CAVINA", "Federico Manzella", "Giovanni Pagliarini"]
version = "0.1.0"
version = "0.2.0"

[deps]
Catch22 = "acdeb78f-3d39-4310-8fdf-6d75c17c6d5a"
Expand All @@ -10,6 +10,7 @@ HypothesisTests = "09f84164-cd44-5f33-b23f-e6b0d136a0d5"
IterTools = "c8e1da08-722c-5040-9ed9-7db0dc04731e"
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
MLBase = "f0e99cf1-93fa-52ec-9ecc-5026115318e0"
MultiData = "8cc5100c-b3d1-4f82-90cb-0ea93d317aba"
OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0"
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
Expand All @@ -20,17 +21,18 @@ Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"

[compat]
HypothesisTests = "0.10 - 0.11"
SoleData = "0.12"
StatsBase = "0.30 - 0.34"
Random = "1"
Catch22 = "0.4, 0.5"
DataFrames = "1"
HypothesisTests = "0.10 - 0.11"
IterTools = "1"
OrderedCollections = "1"
PyCall = "1"
Random = "1"
Reexport = "1"
Revise = "3"
SoleData = "0.13"
MultiData = "0"
StatsBase = "0.30 - 0.34"
julia = "1"

[extras]
Expand Down
1 change: 1 addition & 0 deletions src/SoleFeatures.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
module SoleFeatures

using StatsBase
using MultiData
using SoleData
using Reexport
using Random
Expand Down
24 changes: 12 additions & 12 deletions src/core.jl
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Removes from provided samples variables indicated by bitmask or selector
# Arguments
- `X::AbstractDataFrame|MultiModalDataset`: samples to evaluate
- `X::AbstractDataFrame|MultiDataset`: samples to evaluate
- `y::AbstractVector`: target vector
- `bm::BitVector`: Vector of bit containing which variables are suitable(1) or not(0)
- `selector::AbstractFeaturesSelector`: Selector
Expand Down Expand Up @@ -38,35 +38,35 @@ function transform!(
end

function transform!(
X::SoleData.AbstractMultiModalDataset,
X::MultiData.AbstractMultiDataset,
bm::BitVector;
i_modality::Union{Integer,Nothing} = nothing
)
if (isnothing(i_modality))
nvariables(X) != length(bm) && throw(DimensionMismatch(""))
return SoleData.dropvariables!(X, findall(!, bm))
return MultiData.dropvariables!(X, findall(!, bm))
else
nvariables(X, i_modality) != length(bm) && throw(DimensionMismatch(""))
return SoleData.dropvariables!(X, i_modality, findall(!, bm))
return MultiData.dropvariables!(X, i_modality, findall(!, bm))
end
end

function transform!(
X::SoleData.AbstractMultiModalDataset,
X::MultiData.AbstractMultiDataset,
selector::AbstractFeaturesSelector;
i_modality::Union{Integer,Nothing} = nothing
)
if (isnothing(i_modality))
return transform!(SoleData.data(X), selector)
return transform!(MultiData.data(X), selector)
else
return transform!(SoleData.modality(X, i_modality), selector)
return transform!(MultiData.modality(X, i_modality), selector)
end
end

# TODO: transform! for MultiModalDataset with supervised selector
# TODO: transform! for MultiDataset with supervised selector

transform(X::AbstractDataFrame, args...; kwargs...) = transform!(deepcopy(X), args...; kwargs...)
transform(X::SoleData.AbstractMultiModalDataset, args...; kwargs...) = transform!(deepcopy(X), args...; kwargs...)
transform(X::MultiData.AbstractMultiDataset, args...; kwargs...) = transform!(deepcopy(X), args...; kwargs...)
# (s::AbstractFeaturesSelector)(X, args; kwargs...) = transform(X, args..., kwargs...) # TODO: correct this

"""
Expand All @@ -88,14 +88,14 @@ True values indicate selected variable index
- `i_modality::Integer`: Modality index
"""
function buildbitmask(
X::SoleData.MultiModalDataset,
X::MultiData.MultiDataset,
selector::AbstractFeaturesSelector,
i_modality::Integer
)::Tuple{BitVector,BitVector}
return buildbitmask(SoleData.modality(X, i_modality), selector)
return buildbitmask(MultiData.modality(X, i_modality), selector)
end

# TODO: buildbitmask for MultiModalDataset with supervised selector
# TODO: buildbitmask for MultiDataset with supervised selector

function buildbitmask(
X::AbstractDataFrame,
Expand Down
22 changes: 11 additions & 11 deletions src/utils/utils.jl
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
# TODO: minmax_normalize in SoleData
# TODO: minmax_normalize in MultiData
"""
Normalize passed DataFrame using min-max normalization.
Return a new normalized DataFrame
"""
minmax_normalize(c, args...; kwars...) = minmax_normalize!(deepcopy(c), args...; kwars...)

function minmax_normalize!(
md::SoleData.MultiModalDataset,
md::MultiData.MultiDataset,
frame_index::Integer;
min_quantile::Real = 0.0,
max_quantile::Real = 1.0,
col_quantile::Bool = true,
)
return minmax_normalize!(
SoleData.modality(md, frame_index);
MultiData.modality(md, frame_index);
min_quantile = min_quantile,
max_quantile = max_quantile,
col_quantile = col_quantile
Expand Down Expand Up @@ -74,12 +74,12 @@ end
"""
_mod_bm2mfd_bm(md, frame_index, frame_bm)
Modality bitmask to MultiModalDataset bitmask.
Modality bitmask to MultiDataset bitmask.
return bitmask for entire MultiModalDataset from a modality of it
return bitmask for entire MultiDataset from a modality of it
"""
function _mod_bm2mfd_bm(
md::SoleData.MultiModalDataset,
md::MultiData.MultiDataset,
i_mods::Union{Integer,AbstractVector{<:Integer}},
framebms::Union{BitVector,AbstractVector{<:BitVector}}
)::BitVector
Expand All @@ -92,7 +92,7 @@ function _mod_bm2mfd_bm(
for i in 1:lastindex(i_mods)
i_modality = i_mods[i]
frbm = framebms[i]
framedescr = SoleData.grouped_variables(md)[i_modality] # modality indices in md
framedescr = MultiData.grouped_variables(md)[i_modality] # modality indices in md
bm[framedescr] = frbm
end
return bm
Expand All @@ -103,12 +103,12 @@ end
return tuple containing names of suitable variables and names of not suitable variables
"""
function bm2var(md::SoleData.MultiModalDataset, bm::BitVector)
return bm2var(SoleData.data(md), bm)
function bm2var(md::MultiData.MultiDataset, bm::BitVector)
return bm2var(MultiData.data(md), bm)
end

function bm2var(md::SoleData.MultiModalDataset, i_modality::Integer, bm::BitVector)
return bm2var(SoleData.modality(md, i_modality), bm)
function bm2var(md::MultiData.MultiDataset, i_modality::Integer, bm::BitVector)
return bm2var(MultiData.modality(md, i_modality), bm)
end

function bm2var(df::AbstractDataFrame, bm::BitVector)
Expand Down
36 changes: 18 additions & 18 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ using HypothesisTests
using StatsBase
using Test
using Revise
using SoleData
using MultiData
using SoleFeatures

include("./test_function.jl")
Expand All @@ -11,27 +11,27 @@ include("./test_function.jl")

@testset "transform" begin

@testset "transform!(md, bm; i_modality) using bitmask on a modality of MultiModalDataset" begin
@testset "transform!(md, bm; i_modality) using bitmask on a modality of MultiDataset" begin
df = random_timeseries_df(; nvar=10)
md = SoleData.MultiModalDataset(df, [[3,7,8], [1,2,4], [5,6,9,10]])
md = MultiData.MultiDataset(df, [[3,7,8], [1,2,4], [5,6,9,10]])
bm_mod = BitVector([0,1,0])
idx_mod = 1
# expected values
emfd = deepcopy(md)
SoleData.dropvariables!(emfd, [3,8])
MultiData.dropvariables!(emfd, [3,8])

SoleFeatures.transform!(md, bm_mod; i_modality=idx_mod)

@test isequal(md, emfd)
end

@testset "transform!(md, bm) using bitmask on whole MultiModalDataset" begin
@testset "transform!(md, bm) using bitmask on whole MultiDataset" begin
df = random_timeseries_df(; nvar=5)
md = SoleData.MultiModalDataset(df, [[4,2,1], [5,3]])
md = MultiData.MultiDataset(df, [[4,2,1], [5,3]])
bm_mod = BitVector([0,1,0,1,1])
# expected values
emfd = deepcopy(md)
SoleData.dropvariables!(emfd, [1,3])
MultiData.dropvariables!(emfd, [1,3])

SoleFeatures.transform!(md, bm_mod)

Expand All @@ -50,27 +50,27 @@ include("./test_function.jl")
@test isequal(df, edf)
end

@testset "transform(md, bm; i_modality) using bitmask on a modality of MultiModalDataset" begin
@testset "transform(md, bm; i_modality) using bitmask on a modality of MultiDataset" begin
df = random_timeseries_df(; nvar=10)
md = SoleData.MultiModalDataset(df, [[3,7,8], [1,2,4], [5,6,9,10]])
md = MultiData.MultiDataset(df, [[3,7,8], [1,2,4], [5,6,9,10]])
bm_mod = BitVector([0,1,0])
idx_mod = 1
# expected values
emfd = deepcopy(md)
SoleData.dropvariables!(emfd, [3,8])
MultiData.dropvariables!(emfd, [3,8])

md = SoleFeatures.transform(md, bm_mod; i_modality=idx_mod)

@test isequal(md, emfd)
end

@testset "transform(md, bm) using bitmask on whole MultiModalDataset" begin
@testset "transform(md, bm) using bitmask on whole MultiDataset" begin
df = random_timeseries_df(; nvar=5)
md = SoleData.MultiModalDataset(df, [[4,2,1], [5,3]])
md = MultiData.MultiDataset(df, [[4,2,1], [5,3]])
bm_mod = BitVector([0,1,0,1,1])
# expected values
emfd = deepcopy(md)
SoleData.dropvariables!(emfd, [1,3])
MultiData.dropvariables!(emfd, [1,3])

md = SoleFeatures.transform(md, bm_mod)

Expand All @@ -95,7 +95,7 @@ include("./test_function.jl")

@testset "_mod_bm2mfd_bm using array of frames and array of bitmasks" begin
df = random_timeseries_df(; nvar=10)
md = SoleData.MultiModalDataset(df, [[3,7,8], [1,2,4], [5,6,9,10]])
md = MultiData.MultiDataset(df, [[3,7,8], [1,2,4], [5,6,9,10]])
frms = [1,2,3]
bms = Vector{BitVector}([ [0,1,0],[0,0,1],[0,1,1,0] ])
# expected values
Expand All @@ -108,7 +108,7 @@ include("./test_function.jl")

@testset "_mod_bm2mfd_bm using modality and bitmask" begin
df = random_timeseries_df(; nvar=10)
md = SoleData.MultiModalDataset(df, [[3,7,8], [1,2,4], [5,6,9,10]])
md = MultiData.MultiDataset(df, [[3,7,8], [1,2,4], [5,6,9,10]])
frm = 2
bm = BitVector([0,0,1])
# expected values
Expand Down Expand Up @@ -186,12 +186,12 @@ include("./test_function.jl")
@test (SoleFeatures.transform!(df, cf) isa DataFrame)
end

@testset "VarianceRanking on MultiModalDataset" begin
@testset "VarianceRanking on MultiDataset" begin
df = random_df();
df = SoleFeatures.minmax_normalize(df; min_quantile=0.0, max_quantile=1.0)
md = SoleData.MultiModalDataset(df, [ [1,2,3,4], [5] ])
md = MultiData.MultiDataset(df, [ [1,2,3,4], [5] ])
vr = VarianceRanking(3)
@test_broken (SoleFeatures.transform!(md, vr; i_modality=1) isa MultiModalDataset)
@test_broken (SoleFeatures.transform!(md, vr; i_modality=1) isa MultiDataset)
end

end
Expand Down
4 changes: 2 additions & 2 deletions test/test_function.jl
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ end
function random_timeseries_mfd(;ninstances=100, nvar=5, ts_len=5)
df = random_timeseries_df(;ninstances=ninstances, nvar=nvar, ts_len=ts_len)
fd = [ collect(1:nvar) ]
return MultiModalDataset(df, fd)
return MultiDataset(df, fd)
end

function random_timeseries_df(;ninstances=100, nvar=5, ts_len=5)
Expand All @@ -140,5 +140,5 @@ end
function random_mfd(;ninstances=100, nvar=5)
df = random_df(;ninstances = ninstances, nvar = nvar)
fd = [ collect(1:nvar) ]
return MultiModalDataset(df, fd)
return MultiDataset(df, fd)
end
2 changes: 1 addition & 1 deletion test/voiceexperiment.jl
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ isdefined(Main, :Catch22) && (Base.nameof(f::SuperFeature) = getname(f)) # wrap

# 28 variables 2 classes
# X, y = arff_2_mfd_multivariate("/home/patrik/develop/aclai/features_selection/results-sole/datasets/FingerMovements_TRAIN.arff")
# X = SoleData.modality(X, 1)
# X = MultiData.modality(X, 1)

# ================== PREPARE VARIABLES, WINDOWS, MEASURES ==================
@info "PREPARE VARIABLES, WINDOWS, MEASURES"
Expand Down

0 comments on commit 8a44696

Please sign in to comment.