From 8eef577194ee9e165fde83c11ad6365564e59062 Mon Sep 17 00:00:00 2001 From: Florian Pfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Wed, 1 Jul 2026 21:21:04 +0200 Subject: [PATCH 1/2] Allow unsigned padded history dtypes --- src/pyrecest/utils/history_recorder.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/pyrecest/utils/history_recorder.py b/src/pyrecest/utils/history_recorder.py index 4d04c37ab..405ca676c 100644 --- a/src/pyrecest/utils/history_recorder.py +++ b/src/pyrecest/utils/history_recorder.py @@ -7,6 +7,8 @@ from math import nan from typing import Any +import numpy as np + from pyrecest import backend # pylint: disable=no-name-in-module,no-member @@ -46,6 +48,13 @@ def _validate_bool_flag(value: Any, name: str) -> bool: def _is_invalid_padded_history_dtype(dtype: Any) -> bool: + try: + dtype_kind = np.dtype(dtype).kind + except (TypeError, ValueError): + dtype_kind = None + if dtype_kind is not None: + return dtype_kind in {"b", "c", "O", "U", "S", "M", "m"} + dtype_name = str(dtype).lower() return ( "bool" in dtype_name From f726faab42dbc9be1abc3b76d3c5da1d1726a05c Mon Sep 17 00:00:00 2001 From: Florian Pfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Wed, 1 Jul 2026 21:22:02 +0200 Subject: [PATCH 2/2] Add history recorder dtype regression --- tests/test_history_recorder_unsigned_dtype.py | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 tests/test_history_recorder_unsigned_dtype.py diff --git a/tests/test_history_recorder_unsigned_dtype.py b/tests/test_history_recorder_unsigned_dtype.py new file mode 100644 index 000000000..3e20dc9f4 --- /dev/null +++ b/tests/test_history_recorder_unsigned_dtype.py @@ -0,0 +1,34 @@ +import numpy as np +import pytest + +from pyrecest import backend +from pyrecest.utils.history_recorder import HistoryRecorder + + +def _as_numpy(value): + return backend.to_numpy(value) + + +def _swapped_uint16_dtype(): + return np.dtype("uint16").newbyteorder("S") + + +def test_padded_history_accepts_non_native_unsigned_integer_arrays(): + recorder = HistoryRecorder() + initial = np.array([1, 2], dtype=_swapped_uint16_dtype()) + + history = recorder.register("counts", initial, pad_with_nan=True) + + assert _as_numpy(history).tolist() == [[1.0], [2.0]] + + updated = recorder.record("counts", np.array([3], dtype=_swapped_uint16_dtype())) + + expected = np.array([[1.0, 3.0], [2.0, np.nan]]) + assert np.allclose(_as_numpy(updated), expected, equal_nan=True) + + +def test_padded_history_still_rejects_unicode_arrays(): + recorder = HistoryRecorder() + + with pytest.raises(TypeError, match="padded history values must be real numeric"): + recorder.register("bad", np.array(["1"], dtype=np.dtype("U1")), pad_with_nan=True)