Commit c5c6019f authored by Stephan Seitz's avatar Stephan Seitz Committed by Markus Holzer
Browse files

Fix deprecation warning for Sympy 1.7

We have to try from newest to oldest import to avoid deprecation
warnings.
parent 9f966136
......@@ -98,6 +98,10 @@ try:
except ImportError:
collect_ignore += [os.path.join(SCRIPT_FOLDER, "pystencils/datahandling/vtk.py")]
# TODO: Remove if Ubuntu 18.04 is no longer supported
if pytest_version < 50403:
collect_ignore += [os.path.join(SCRIPT_FOLDER, "pystencils_tests/test_jupyter_extensions.ipynb")]
collect_ignore += [os.path.join(SCRIPT_FOLDER, 'setup.py')]
for root, sub_dirs, files in os.walk('.'):
......
import numpy as np
import sympy as sp
from sympy.codegen.ast import Assignment
from sympy.printing.latex import LatexPrinter
try:
from sympy.codegen.ast import Assignment
except ImportError:
Assignment = None
__all__ = ['Assignment', 'assignment_from_stencil']
......@@ -21,43 +17,22 @@ def assignment_str(assignment):
return r"{lhs} ← {rhs}".format(lhs=assignment.lhs, rhs=assignment.rhs)
if Assignment:
_old_new = sp.codegen.ast.Assignment.__new__
def _Assignment__new__(cls, lhs, rhs, *args, **kwargs):
if isinstance(lhs, (list, tuple, sp.Matrix)) and isinstance(rhs, (list, tuple, sp.Matrix)):
assert len(lhs) == len(rhs), f'{lhs} and {rhs} must have same length when performing vector assignment!'
return tuple(_old_new(cls, a, b, *args, **kwargs) for a, b in zip(lhs, rhs))
return _old_new(cls, lhs, rhs, *args, **kwargs)
Assignment.__str__ = assignment_str
Assignment.__new__ = _Assignment__new__
LatexPrinter._print_Assignment = print_assignment_latex
_old_new = sp.codegen.ast.Assignment.__new__
sp.MutableDenseMatrix.__hash__ = lambda self: hash(tuple(self))
else:
# back port for older sympy versions that don't have Assignment yet
def _Assignment__new__(cls, lhs, rhs, *args, **kwargs):
if isinstance(lhs, (list, tuple, sp.Matrix)) and isinstance(rhs, (list, tuple, sp.Matrix)):
assert len(lhs) == len(rhs), f'{lhs} and {rhs} must have same length when performing vector assignment!'
return tuple(_old_new(cls, a, b, *args, **kwargs) for a, b in zip(lhs, rhs))
return _old_new(cls, lhs, rhs, *args, **kwargs)
class Assignment(sp.Rel): # pragma: no cover
rel_op = ':='
__slots__ = []
Assignment.__str__ = assignment_str
Assignment.__new__ = _Assignment__new__
LatexPrinter._print_Assignment = print_assignment_latex
def __new__(cls, lhs, rhs=0, **assumptions):
from sympy.matrices.expressions.matexpr import (
MatrixElement, MatrixSymbol)
lhs = sp.sympify(lhs)
rhs = sp.sympify(rhs)
# Tuple of things that can be on the lhs of an assignment
assignable = (sp.Symbol, MatrixSymbol, MatrixElement, sp.Indexed)
if not isinstance(lhs, assignable):
raise TypeError(f"Cannot assign to lhs of type {type(lhs)}.")
return sp.Rel.__new__(cls, lhs, rhs, **assumptions)
sp.MutableDenseMatrix.__hash__ = lambda self: hash(tuple(self))
__str__ = assignment_str
_print_Assignment = print_assignment_latex
# Apparently, in SymPy 1.4 Assignment.__hash__ is not implemented. This has been fixed in current master
try:
......
......@@ -18,12 +18,9 @@ from pystencils.integer_functions import (
int_div, int_power_of_2, modulo_ceil)
try:
from sympy.printing.ccode import C99CodePrinter as CCodePrinter
from sympy.printing.c import C99CodePrinter as CCodePrinter # for sympy versions > 1.6
except ImportError:
try:
from sympy.printing.ccode import CCodePrinter # for sympy versions < 1.1
except ImportError:
from sympy.printing.c import C11CodePrinter as CCodePrinter # for sympy versions > 1.6
from sympy.printing.ccode import C99CodePrinter as CCodePrinter
__all__ = ['generate_c', 'CustomCodeNode', 'PrintNode', 'get_headers', 'CustomSympyPrinter']
......
......@@ -352,7 +352,7 @@ class InterpolatorAccess(TypedSymbol):
__xnew_cached_ = staticmethod(cacheit(__new_stage2__))
def __getnewargs__(self):
return tuple(self.symbol, *self.offsets)
return (self.symbol, *self.offsets)
class DiffInterpolatorAccess(InterpolatorAccess):
......@@ -397,7 +397,7 @@ class DiffInterpolatorAccess(InterpolatorAccess):
__xnew_cached_ = staticmethod(cacheit(__new_stage2__))
def __getnewargs__(self):
return tuple(self.symbol, self.diff_coordinate_idx, *self.offsets)
return (self.symbol, self.diff_coordinate_idx, *self.offsets)
##########################################################################################
......
import pytest
import sympy as sp
import pystencils as ps
import pystencils as ps
from pystencils import Assignment
from pystencils.astnodes import Block, SkipIteration, LoopOverCoordinate, SympyAssignment
from sympy.codegen.rewriting import optims_c99
from pystencils.astnodes import Block, LoopOverCoordinate, SkipIteration, SympyAssignment
sympy_numeric_version = [int(x, 10) for x in sp.__version__.split('.')]
if len(sympy_numeric_version) < 3:
sympy_numeric_version.append(0)
sympy_numeric_version.reverse()
sympy_version = sum(x * (100 ** i) for i, x in enumerate(sympy_numeric_version))
dst = ps.fields('dst(8): double[2D]')
s = sp.symbols('s_:8')
......@@ -11,6 +17,8 @@ x = sp.symbols('x')
y = sp.symbols('y')
@pytest.mark.skipif(sympy_version < 10501,
reason="Old Sympy Versions behave differently which wont be supported in the near future")
def test_kernel_function():
assignments = [
Assignment(dst[0, 0](0), s[0]),
......@@ -36,6 +44,8 @@ def test_skip_iteration():
assert skipped.undefined_symbols == set()
@pytest.mark.skipif(sympy_version < 10501,
reason="Old Sympy Versions behave differently which wont be supported in the near future")
def test_block():
assignments = [
Assignment(dst[0, 0](0), s[0]),
......@@ -83,7 +93,8 @@ def test_loop_over_coordinate():
def test_sympy_assignment():
pytest.importorskip('sympy.codegen.rewriting')
from sympy.codegen.rewriting import optims_c99
assignment = SympyAssignment(dst[0, 0](0), sp.log(x + 3) / sp.log(2) + sp.log(x ** 2 + 1))
assignment.optimize(optims_c99)
......
......@@ -390,7 +390,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.5"
"version": "3.8.5"
}
},
"nbformat": 4,
......
%% Cell type:code id: tags:
``` python
from pystencils.session import *
```
%% Cell type:code id: tags:
``` python
dh = ps.create_data_handling(domain_size=(256, 256), periodicity=True)
c_field = dh.add_array('c')
dh.fill("c", 0.0, ghost_layers=True)
```
%% Cell type:code id: tags:
``` python
for x in range(129):
for y in range(258):
dh.cpu_arrays['c'][x, y] = 1.0
```
%% Cell type:code id: tags:
``` python
plt.scalar_field(dh.cpu_arrays["c"])
```
%%%% Output: execute_result
<matplotlib.image.AxesImage at 0x7ff5b00707c0>
<matplotlib.image.AxesImage at 0x7f5fa4f1cdc0>
%%%% Output: display_data
![](data:image/png;base64,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)
![](data:image/png;base64,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)
%% Cell type:code id: tags:
``` python
ur = ps.Assignment(c_field[0, 0], c_field[1, 0])
ast = ps.create_kernel(ur, target=dh.default_target, cpu_openmp=True)
kernel = ast.compile()
```
%% Cell type:code id: tags:
``` python
c_sync = dh.synchronization_function(['c'])
```
%% Cell type:code id: tags:
``` python
def timeloop(steps=10):
for i in range(steps):
c_sync()
dh.run_kernel(kernel)
return dh.gather_array('c')
```
%% Cell type:code id: tags:
``` python
ps.jupyter.set_display_mode('video')
```
%% Cell type:code id: tags:
``` python
ani = ps.plot.scalar_field_animation(timeloop, rescale=True, frames=12)
ps.jupyter.display_animation(ani)
```
%%%% Output: execute_result
<IPython.core.display.HTML object>
%% Cell type:code id: tags:
``` python
ps.jupyter.set_display_mode('image_update')
```
%% Cell type:code id: tags:
``` python
ani = ps.plot.scalar_field_animation(timeloop, rescale=True, frames=12)
ps.jupyter.display_animation(ani)
```
%%%% Output: display_data
![](data:image/png;base64,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)
![](data:image/png;base64,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)
%% Cell type:code id: tags:
``` python
def grid_update_function(image):
for i in range(40):
c_sync()
dh.run_kernel(kernel)
return dh.gather_array('c')
```
%% Cell type:code id: tags:
``` python
animation = ps.jupyter.make_imshow_animation(dh.cpu_arrays["c"], grid_update_function, frames=300)
```
%%%% Output: display_data
![](data:image/png;base64,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)
![](data:image/png;base64,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)
......
......@@ -369,7 +369,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.9"
"version": "3.8.5"
}
},
"nbformat": 4,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment