beacon-biosignals / OndaEDF.jl

utilities for importing/exporting EDF Files to/from Onda datasets
Other
3 stars 2 forks source link

handle edge case in `reencode_samples` #88

Closed ericphanson closed 1 year ago

ericphanson commented 1 year ago

Encountered during testing in a closed-source repo.

Without this fix, we get

  Test threw exception
  Expression: OndaEDF.reencode_samples(samples) isa Samples
  InexactError: trunc(Int16, NaN)
  Stacktrace:
    [1] trunc
      @ ./float.jl:872 [inlined]
    [2] round
      @ ./float.jl:384 [inlined]
    [3] encode_sample
      @ ~/.julia/packages/Onda/7mYcu/src/samples.jl:192 [inlined]
    [4] encode_sample
      @ ~/.julia/packages/Onda/7mYcu/src/samples.jl:189 [inlined]
    [5] _broadcast_getindex_evalf
      @ ./broadcast.jl:683 [inlined]
    [6] _broadcast_getindex
      @ ./broadcast.jl:666 [inlined]
    [7] getindex
      @ ./broadcast.jl:610 [inlined]
    [8] macro expansion
      @ ./broadcast.jl:974 [inlined]
    [9] macro expansion
      @ ./simdloop.jl:77 [inlined]
   [10] copyto!
      @ ./broadcast.jl:973 [inlined]
   [11] copyto!
      @ ./broadcast.jl:926 [inlined]
   [12] materialize!(#unused#::Base.Broadcast.DefaultArrayStyle{2}, dest::Matrix{Int16}, bc::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{2}, Nothing, typeof(Onda.encode_sample), Tuple{Base.RefValue{Type{Int16}}, Float64, Float64, Matrix{UInt64}}})
      @ Base.Broadcast ./broadcast.jl:884
   [13] materialize!
      @ ./broadcast.jl:881 [inlined]
   [14] broadcast!(::typeof(Onda.encode_sample), ::Matrix{Int16}, ::Type, ::Float64, ::Float64, ::Matrix{UInt64})
      @ Base.Broadcast ./broadcast.jl:850
   [15] encode!
      @ ~/.julia/packages/Onda/7mYcu/src/samples.jl:290 [inlined]
   [16] encode(::Type{Int16}, sample_resolution_in_unit::Float64, sample_offset_in_unit::Float64, sample_data::Matrix{UInt64}, dither_storage::Nothing)
      @ Onda ~/.julia/packages/Onda/7mYcu/src/samples.jl:252
   [17] encode(samples::Samples{Matrix{UInt64}}, dither_storage::Nothing)
      @ Onda ~/.julia/packages/Onda/7mYcu/src/samples.jl:322
   [18] encode
      @ ~/.julia/packages/Onda/7mYcu/src/samples.jl:321 [inlined]
   [19] reencode_samples(samples::Samples{Matrix{UInt64}}, sample_type::Type{Int16})
      @ OndaEDF ~/OndaEDF.jl/src/export_edf.jl:178
   [20] reencode_samples(samples::Samples{Matrix{UInt64}})
      @ OndaEDF ~/OndaEDF.jl/src/export_edf.jl:123
   [21] top-level scope
      @ ~/.julia/juliaup/julia-1.9.3+0.aarch64.apple.darwin14/share/julia/stdlib/v1.9/Test/src/Test.jl:478
   [22] eval
      @ ./boot.jl:370 [inlined]
   [23] eval_user_input(ast::Any, backend::REPL.REPLBackend, mod::Module)
      @ REPL ~/.julia/juliaup/julia-1.9.3+0.aarch64.apple.darwin14/share/julia/stdlib/v1.9/REPL/src/REPL.jl:153
   [24] repl_backend_loop(backend::REPL.REPLBackend, get_module::Function)
      @ REPL ~/.julia/juliaup/julia-1.9.3+0.aarch64.apple.darwin14/share/julia/stdlib/v1.9/REPL/src/REPL.jl:249
   [25] start_repl_backend(backend::REPL.REPLBackend, consumer::Any; get_module::Function)
      @ REPL ~/.julia/juliaup/julia-1.9.3+0.aarch64.apple.darwin14/share/julia/stdlib/v1.9/REPL/src/REPL.jl:234
   [26] run_repl(repl::REPL.AbstractREPL, consumer::Any; backend_on_current_task::Bool, backend::Any)
      @ REPL ~/.julia/juliaup/julia-1.9.3+0.aarch64.apple.darwin14/share/julia/stdlib/v1.9/REPL/src/REPL.jl:379
   [27] run_repl(repl::REPL.AbstractREPL, consumer::Any)
      @ REPL ~/.julia/juliaup/julia-1.9.3+0.aarch64.apple.darwin14/share/julia/stdlib/v1.9/REPL/src/REPL.jl:365
   [28] (::Base.var"#1017#1019"{Bool, Bool, Bool})(REPL::Module)
      @ Base ./client.jl:421
   [29] #invokelatest#2
      @ ./essentials.jl:819 [inlined]
   [30] invokelatest
      @ ./essentials.jl:816 [inlined]
   [31] run_main_repl(interactive::Bool, quiet::Bool, banner::Bool, history_file::Bool, color_set::Bool)
      @ Base ./client.jl:405
   [32] exec_options(opts::Base.JLOptions)
      @ Base ./client.jl:322
   [33] _start()
      @ Base ./client.jl:522
ericphanson commented 1 year ago

@kleinschmidt good points! In this case it is only smin == smax, dmin and dmax are generally fine (that would be a type-level issue, not data-level issue)

how about this?