From 68ecaf9e81f54db27afe150b022688d0dc5d7ee7 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 16 Oct 2026 03:20:56 +0000 Subject: [PATCH] BlockLayout2D.to_dense: restore hole-only NaN fill guard cc64abc dropped the guard, so full layouts with integer arrays raised on an empty NaN assignment (regression caught by test_to_dense_dtype_contract). Co-Authored-By: Claude Opus 5.5 --- src/CelerisLab/lbm/blocks.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/CelerisLab/lbm/blocks.py b/src/CelerisLab/lbm/blocks.py index f0fab2c..8869fe2 100644 --- a/src/CelerisLab/lbm/blocks.py +++ b/src/CelerisLab/lbm/blocks.py @@ -330,7 +330,8 @@ class BlockLayout2D: raise ValueError("a layout with holes unpacks floating arrays only (holes are NaN)") ob, oc = np.divmod(self.owner.ravel()[owned].astype(np.intp), flat.shape[2]) dense = np.empty((NQ, owned.size), dtype=blocked.dtype) - dense[:, ~owned] = np.nan + if not owned.all(): # even an empty NaN assignment fails for integer dtypes + dense[:, ~owned] = np.nan dense[:, owned] = flat[ob, :, oc].T return dense.reshape(NQ, *self.shape)