def test_product(): k = pystencils.TypedSymbol('k', create_type('int64')) sum = sympy.Product(k, (k, 1, 10)) expanded_sum = sum.doit() print(sum) print(expanded_sum) x = pystencils.fields('x: int64[1d]') assignments = pystencils.AssignmentCollection({x.center(): sum}) ast = pystencils.create_kernel(assignments) code = str(pystencils.show_code(ast)) kernel = ast.compile() print(code) assert 'int64_t product' in code array = np.zeros((10, ), np.int64) kernel(x=array) assert np.allclose(array, int(expanded_sum) * np.ones_like(array))
def handle_sum_or_prod(func, name): val = convert_mp(func.mp()) iter_var = convert_expr(func.subeq().equality().expr(0)) start = convert_expr(func.subeq().equality().expr(1)) end = convert_expr(func.supexpr().expr()) if name == "summation": return sympy.Sum(val, (iter_var, start, end)) elif name == "product": return sympy.Product(val, (iter_var, start, end))
def __handle_sum_or_prod(func, name): val = Math.__convert_mp(func.mp()) iter_var = Math.__convert_expr(func.subeq().equality().expr(0)) start = Math.__convert_expr(func.subeq().equality().expr(1)) if func.supexpr().expr(): # ^{expr} end = Math.__convert_expr(func.supexpr().expr()) else: # ^atom end = Math.__convert_atom(func.supexpr().atom()) if name == "summation": return sympy.Sum(val, (iter_var, start, end)) elif name == "product": return sympy.Product(val, (iter_var, start, end))
def handle_sum_or_prod(func, name): val = convert_mp(func.mp()) iter_var = None start = None if func.subeq(): # e.g. _{i=0} iter_var = convert_expr(func.subeq().equality().expr(0)) start = convert_expr(func.subeq().equality().expr(1)) elif func.subexpr().expr(): # _{expr} iter_var = convert_expr(func.subexpr().expr()) else: # _atom iter_var = convert_atom(func.subexpr().atom()) if func.supexpr(): if func.supexpr().expr(): # ^{expr} end = convert_expr(func.supexpr().expr()) else: # ^atom end = convert_atom(func.supexpr().atom()) if name == "summation": if start is not None: return sympy.Sum(val, (iter_var, start, end)) else: return sympy.Function('sum_{' + str(iter_var) + '}')(val) elif name == "product": return sympy.Product(val, (iter_var, start, end))
# In[172]: x = sympy.Sum(1 / (n**2), (n, 1, oo)) # In[173]: x # In[174]: x.doit() # In[175]: x = sympy.Product(n, (n, 1, 7)) # In[176]: x # In[177]: x.doit() # In[178]: x = sympy.Symbol("x") # In[179]:
sympy.limit(f, x, y) # sin(y)/y # Example: # limit(x→y){sin(x)/x} sympy.limit(sympy.sin(x) / x, x, y) # sin(y)/y sympy.limit(sympy.sin(x) / x, x, 0) # 1 sympy.limit(sympy.sin(x) / x, x, sympy.oo) # 0 (The reality is none) expr = (x**2 - 3 * x) / (2 * x - 2) p = sympy.limit(expr / x, x, sympy.oo) q = sympy.limit(expr - p * x, x, sympy.oo) p, q # (1/2, -1) #%% Sums and Products import numpy as np import sympy import math from sympy import I, pi, oo n = sympy.symbols("n", integer=True) # Sums: S = sympy.Sum(1 / (n**2), (n, 1, oo)) S # Sum(n**(-2), (n, 1, oo)) S.doit() # pi**2/6 # Products: X = sympy.Product(n, (n, 1, 16)) X # Product(n, (n, 1, 512)) X.doit() # 20922789888000
("\\sqrt[y]{\\sin x}", sympy.root(sympy.sin(x), y)), ("\\sqrt[\\theta]{\\sin x}", sympy.root(sympy.sin(x), theta)), ("x < y", sympy.StrictLessThan(x, y)), ("x \\leq y", sympy.LessThan(x, y)), ("x > y", sympy.StrictGreaterThan(x, y)), ("x \\geq y", sympy.GreaterThan(x, y)), ("\\mathit{x}", sympy.Symbol('x')), ("\\mathit{test}", sympy.Symbol('test')), ("\\mathit{TEST}", sympy.Symbol('TEST')), ("\\mathit{HELLO world}", sympy.Symbol('HELLO world')), ("\\sum_{k = 1}^{3} c", sympy.Sum(c, (k, 1, 3))), ("\\sum_{k = 1}^3 c", sympy.Sum(c, (k, 1, 3))), ("\\sum^{3}_{k = 1} c", sympy.Sum(c, (k, 1, 3))), ("\\sum^3_{k = 1} c", sympy.Sum(c, (k, 1, 3))), ("\\sum_{k = 1}^{10} k^2", sympy.Sum(k**2, (k, 1, 10))), ("\\sum_{n = 0}^{\\infty} \\frac{1}{n!}", sympy.Sum(_Pow(_factorial(n), -1), (n, 0, sympy.oo))), ("\\prod_{a = b}^{c} x", sympy.Product(x, (a, b, c))), ("\\prod_{a = b}^c x", sympy.Product(x, (a, b, c))), ("\\prod^{c}_{a = b} x", sympy.Product(x, (a, b, c))), ("\\prod^c_{a = b} x", sympy.Product(x, (a, b, c))), ("\\ln x", _log(x, sympy.E)), ("\\ln xy", _log(x * y, sympy.E)), ("\\log x", _log(x, 10)), ("\\log xy", _log(x * y, 10)), ("\\log_2 x", _log(x, 2)), ("\\log_{2} x", _log(x, 2)), ("\\log_a x", _log(x, a)), ("\\log_{a} x", _log(x, a)), ("\\log_{11} x", _log(x, 11)), ("\\log_{a^2} x", _log(x, _Pow(a, 2))), ("[x]", x), ("[a + b]", _Add(a, b)), ("\\frac{d}{dx} [ \\tan x ]", sympy.Derivative(sympy.tan(x), x)) ] # These bad latex strings should raise an exception when parsed BAD_STRINGS = [ "(", ")", "a / b /", "\\frac{d}{dx}", "(\\frac{d}{dx})"