From 6fcfa0ddab564ef87748c69a34c0bac4e38dd0f2 Mon Sep 17 00:00:00 2001 From: ZoeLeibowitz Date: Mon, 6 Jan 2025 09:16:51 +0000 Subject: [PATCH 1/5] compiler: Concretize SubDimensions to same object across repeated calls to concretize_subdims --- devito/ir/equations/algorithms.py | 2 +- devito/operator/operator.py | 1 + tests/test_dimension.py | 25 ++++++++++++++++++++++++- tests/test_subdomains.py | 3 ++- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/devito/ir/equations/algorithms.py b/devito/ir/equations/algorithms.py index e0281e1139..85a89f40c1 100644 --- a/devito/ir/equations/algorithms.py +++ b/devito/ir/equations/algorithms.py @@ -169,8 +169,8 @@ def concretize_subdims(exprs, **kwargs): across `exprs`, such as the thickness symbols. """ sregistry = kwargs.get('sregistry') + mapper = kwargs.get('concretize_mapper') - mapper = {} rebuilt = {} # Rebuilt implicit dims etc which are shared between dimensions _concretize_subdims(exprs, mapper, rebuilt, sregistry) diff --git a/devito/operator/operator.py b/devito/operator/operator.py index ccfa5a249f..a75aeb9e7b 100644 --- a/devito/operator/operator.py +++ b/devito/operator/operator.py @@ -262,6 +262,7 @@ def _lower(cls, expressions, **kwargs): """ # Create a symbol registry kwargs.setdefault('sregistry', SymbolRegistry()) + kwargs.setdefault('concretize_mapper', {}) expressions = as_tuple(expressions) diff --git a/tests/test_dimension.py b/tests/test_dimension.py index 84df27ecef..25719ae200 100644 --- a/tests/test_dimension.py +++ b/tests/test_dimension.py @@ -2050,8 +2050,31 @@ def test_correct_thicknesses(self): ix1 = SubDimension.right('x', x, 2) ix2 = SubDimension.middle('x', x, 2, 2) - rebuilt = concretize_subdims([ix0, ix1, ix2], sregistry=SymbolRegistry()) + rebuilt = concretize_subdims([ix0, ix1, ix2], sregistry=SymbolRegistry(), + concretize_mapper={}) assert rebuilt[0].is_left assert rebuilt[1].is_right assert rebuilt[2].is_middle + + def test_repeat_concretization(self): + """ + Ensure that SubDimensions are consistently concretized to the same object + across multiple calls to the function. This is necessary when using + `rcompile` on equations with SubDimensions. + """ + + grid = Grid((2, 2)) + + x = Dimension('x') + ix = SubDimension.middle('ix', x, 2, 2) + + u = Function(name='u', grid=grid) + eq = Eq(u, ix.ltkn) + + kwargs = {'sregistry': SymbolRegistry(), 'concretize_mapper': {}} + + exprs1 = concretize_subdims([eq], **kwargs) + exprs2 = concretize_subdims([eq], **kwargs) + + assert exprs1 == exprs2 diff --git a/tests/test_subdomains.py b/tests/test_subdomains.py index 784dc1c3ad..db08f60de6 100644 --- a/tests/test_subdomains.py +++ b/tests/test_subdomains.py @@ -37,7 +37,8 @@ def define(self, dimensions): with timed_region('x'): # _lower_exprs expects a SymbolRegistry, so create one expr = Operator._lower_exprs([eq0], options={}, - sregistry=SymbolRegistry())[0] + sregistry=SymbolRegistry(), + concretize_mapper={})[0] assert str(expr.rhs) == 'ix*f[ix + 1, iy + 1] + iy' def test_multiple_middle(self): From 5e1239211eeb498bbfb194b5a44302c16449b2de Mon Sep 17 00:00:00 2001 From: ZoeLeibowitz Date: Mon, 6 Jan 2025 09:23:42 +0000 Subject: [PATCH 2/5] misc: Fix ascent import --- tests/test_builtins.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_builtins.py b/tests/test_builtins.py index 102875d35a..7ef4ae6fea 100644 --- a/tests/test_builtins.py +++ b/tests/test_builtins.py @@ -1,7 +1,7 @@ import pytest import numpy as np from scipy.ndimage import gaussian_filter -from scipy.misc import ascent +from scipy.datasets import ascent from devito import ConditionalDimension, Grid, Function, TimeFunction, switchconfig from devito.builtins import (assign, norm, gaussian_smooth, initialize_function, From 81a28e7f6225b9c8f36e4f4654ea385d2f73d2a0 Mon Sep 17 00:00:00 2001 From: ZoeLeibowitz Date: Mon, 6 Jan 2025 15:57:58 +0000 Subject: [PATCH 3/5] misc: Update scipy requirements and edit test_repeat_concretization --- requirements-optional.txt | 2 +- requirements-testing.txt | 2 +- tests/test_dimension.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements-optional.txt b/requirements-optional.txt index d9ca13e636..c2f4a4c3a2 100644 --- a/requirements-optional.txt +++ b/requirements-optional.txt @@ -1,4 +1,4 @@ matplotlib pyrevolve==2.2.4 -scipy +scipy>=1.13.0 distributed \ No newline at end of file diff --git a/requirements-testing.txt b/requirements-testing.txt index 0f88276721..479338223c 100644 --- a/requirements-testing.txt +++ b/requirements-testing.txt @@ -4,5 +4,5 @@ pytest-cov codecov flake8>=2.1.0 nbval -scipy +scipy>=1.13.0 pooch; python_version >= "3.8" diff --git a/tests/test_dimension.py b/tests/test_dimension.py index 25719ae200..2d2ffe9d7c 100644 --- a/tests/test_dimension.py +++ b/tests/test_dimension.py @@ -2070,7 +2070,7 @@ def test_repeat_concretization(self): ix = SubDimension.middle('ix', x, 2, 2) u = Function(name='u', grid=grid) - eq = Eq(u, ix.ltkn) + eq = Eq(u, ix + ix.ltkn + ix.rtkn) kwargs = {'sregistry': SymbolRegistry(), 'concretize_mapper': {}} From 1017e636882d767f935aac3ccc7456d4f2b95517 Mon Sep 17 00:00:00 2001 From: ZoeLeibowitz Date: Tue, 7 Jan 2025 10:13:00 +0000 Subject: [PATCH 4/5] misc: Try/except for ascent import --- requirements-optional.txt | 2 +- requirements-testing.txt | 2 +- tests/test_builtins.py | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/requirements-optional.txt b/requirements-optional.txt index c2f4a4c3a2..d9ca13e636 100644 --- a/requirements-optional.txt +++ b/requirements-optional.txt @@ -1,4 +1,4 @@ matplotlib pyrevolve==2.2.4 -scipy>=1.13.0 +scipy distributed \ No newline at end of file diff --git a/requirements-testing.txt b/requirements-testing.txt index 479338223c..0f88276721 100644 --- a/requirements-testing.txt +++ b/requirements-testing.txt @@ -4,5 +4,5 @@ pytest-cov codecov flake8>=2.1.0 nbval -scipy>=1.13.0 +scipy pooch; python_version >= "3.8" diff --git a/tests/test_builtins.py b/tests/test_builtins.py index 7ef4ae6fea..483bd6a135 100644 --- a/tests/test_builtins.py +++ b/tests/test_builtins.py @@ -1,7 +1,10 @@ import pytest import numpy as np from scipy.ndimage import gaussian_filter -from scipy.datasets import ascent +try: + from scipy.datasets import ascent +except ImportError: + from scipy.misc import ascent from devito import ConditionalDimension, Grid, Function, TimeFunction, switchconfig from devito.builtins import (assign, norm, gaussian_smooth, initialize_function, From 6835b2b7f2f0eca7f6dedf1413523de7b2bd3f87 Mon Sep 17 00:00:00 2001 From: Edward Caunt Date: Tue, 7 Jan 2025 12:37:10 +0000 Subject: [PATCH 5/5] compiler: SubDimension concretisation now uses Thickness concretisation --- devito/ir/equations/algorithms.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/devito/ir/equations/algorithms.py b/devito/ir/equations/algorithms.py index 85a89f40c1..b28730d6c8 100644 --- a/devito/ir/equations/algorithms.py +++ b/devito/ir/equations/algorithms.py @@ -228,9 +228,8 @@ def _(d, mapper, rebuilt, sregistry): # Already have a substitution for this dimension return - tkns = tuple(t._rebuild(name=sregistry.make_name(prefix=t.name)) for t in d.tkns) - mapper.update({tkn0: tkn1 for tkn0, tkn1 in zip(d.tkns, tkns)}) - mapper[d] = d._rebuild(thickness=tkns) + _concretize_subdims(d.tkns, mapper, rebuilt, sregistry) + mapper[d] = d._rebuild(thickness=tuple(mapper[tkn] for tkn in d.tkns)) @_concretize_subdims.register(ConditionalDimension)