Skip to content

Commit 2be81ee

Browse files
committed
Fix: Update IndexSetND.subset retun val to prevent side-effect with IndexSetND.squeeze
1 parent dcf21b6 commit 2be81ee

2 files changed

Lines changed: 12 additions & 1 deletion

File tree

src/docplex_extensions/_index_sets.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1312,7 +1312,11 @@ def subset(self, *pattern: Any) -> list[ElemNDT]:
13121312

13131313
given = tuple(v for v in pattern if v != '*') # Wildcard filtering
13141314

1315-
return self._groupby(*indices)[given]
1315+
# Use `get` instead of `__getitem__`` because we don't want to update the defaultdict with
1316+
# an empty list for keys that are not preset prior to returning the empty list. Leads to a
1317+
# side-effect in `squeeze` because the keys are cached in the defaultdict. So directly
1318+
# return an empty list with get instead.
1319+
return self._groupby(*indices).get(given, list())
13161320

13171321
@overload
13181322
def squeeze( # numpydoc ignore=GL08

tests/unit_tests/index_sets/indexsetnd_subset_selection_test.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,13 @@ def test_squeeze_w_rmvd_elem_pop(input, index, indices, expected):
366366
assert input.squeeze(*indices) == expected
367367

368368

369+
@pytest.mark.parametrize('sub_val', [('*', 1), ('*', 2), (0, '*'), (2, '*')])
370+
@pytest.mark.parametrize('sqz_idx', [0, 1])
371+
def test_squeeze_after_subset(setNd_int_cmb2, sub_val, sqz_idx):
372+
_ = setNd_int_cmb2.subset(*sub_val)
373+
assert_sets_same(setNd_int_cmb2.squeeze(sqz_idx), IndexSet1D(range(2)))
374+
375+
369376
def test_squeeze_after_clear(setNd_int_cmb2):
370377
_ = setNd_int_cmb2.squeeze(0)
371378
setNd_int_cmb2.clear()

0 commit comments

Comments
 (0)