wfdb-python icon indicating copy to clipboard operation
wfdb-python copied to clipboard

OverflowError with rdann on LUED annotations w/numpy 2.2

Open justinrporter opened this issue 1 year ago • 3 comments

Another area of incompatibility with numpy 2.2 I fear...

If I try

wfdb.rdann('physionet.org/files/ludb/1.0.0/1', extension='atr_ii')

or (for version 1.0.1)

wfdb.rdann('physionet.org/files/ludb/1.0.1/1', extension='ii')

I get:

---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)
Cell In[38], line 2
      1 # os.path.join(folder_path, str(pid))
----> 2 wfdb.rdann('physionet.org/files/ludb/1.0.0/1', extension='atr_ii')

File ~/miniconda3/envs/pytorch-aline/lib/python3.12/site-packages/wfdb/io/annotation.py:1953, in rdann(record_name, extension, sampfrom, sampto, shift_samps, pn_dir, return_label_elements, summarize_labels)
   1950 filebytes = load_byte_pairs(record_name, extension, pn_dir)
   1952 # Get WFDB annotation fields from the file bytes
-> 1953 (sample, label_store, subtype, chan, num, aux_note) = proc_ann_bytes(
   1954     filebytes, sampto
   1955 )
   1957 # Get the indices of annotations that hold definition information about
   1958 # the entire annotation file, and other empty annotations to be removed.
   1959 potential_definition_inds, rm_inds = get_special_inds(
   1960     sample, label_store, aux_note
   1961 )

File ~/miniconda3/envs/pytorch-aline/lib/python3.12/site-packages/wfdb/io/annotation.py:2154, in proc_ann_bytes(filebytes, sampto)
   2146 # Process annotations. Iterate across byte pairs.
   2147 # Sequence for one ann is:
   2148 # - SKIP pair (if any)
   2149 # - samp + sym pair
   2150 # - other pairs (if any)
   2151 # The last byte pair of the file is 0 indicating eof.
   2152 while bpi < filebytes.shape[0] - 1:
   2153     # Get the sample and label_store fields of the current annotation
-> 2154     sample_diff, current_label_store, bpi = proc_core_fields(filebytes, bpi)
   2155     sample_total = sample_total + sample_diff
   2156     sample.append(sample_total)

File ~/miniconda3/envs/pytorch-aline/lib/python3.12/site-packages/wfdb/io/annotation.py:2240, in proc_core_fields(filebytes, bpi)
   2238 # Not a skip - it is the actual sample number + annotation type store value
   2239 label_store = filebytes[bpi, 1] >> 2
-> 2240 sample_diff += int(filebytes[bpi, 0] + 256 * (filebytes[bpi, 1] & 3))
   2241 bpi = bpi + 1
   2243 return sample_diff, label_store, bpi

OverflowError: Python integer 256 out of bounds for uint8

Using the command line rdann works fine, and it works after downgrading numpy 1.26. Seems likely related to #493 ?

Pertinent versions: wfdb-python == 4.1.2 numpy == 2.2.1 (broken) numpy == 1.26.4 (works) python == 3.12

justinrporter avatar Dec 28 '24 19:12 justinrporter

Hey I'm getting the same error. Any workaround other than using a 1.x numpy version?

sandilsranasinghe avatar Jan 15 '25 20:01 sandilsranasinghe

Changing sample_diff += int(filebytes[bpi, 0] + 256 * (filebytes[bpi, 1] & 3))

To sample_diff += int(filebytes[bpi, 0] + 256 * np.int64(filebytes[bpi, 1] & 3))

seems to fix the error for me, (np==1.26 seems to cast (uint8) & int -> (int64) )

sandilsranasinghe avatar Jan 15 '25 21:01 sandilsranasinghe

Please could you update to the latest version of WFDB (v4.2.0) to see if this issue is addressed?

The changelog is at: https://github.com/MIT-LCP/wfdb-python/blob/main/docs/changes.rst

tompollard avatar Jan 21 '25 22:01 tompollard