Source code for finat.sympy2gem

from functools import singledispatch, reduce

import sympy
try:
    import symengine
except ImportError:
    class Mock:
        def __getattribute__(self, name):
            return Mock
    symengine = Mock()

import gem


[docs]@singledispatch def sympy2gem(node, self): raise AssertionError("sympy/symengine node expected, got %s" % type(node))
[docs]@sympy2gem.register(sympy.Expr) @sympy2gem.register(symengine.Expr) def sympy2gem_expr(node, self): raise NotImplementedError("no handler for sympy/symengine node type %s" % type(node))
[docs]@sympy2gem.register(sympy.Add) @sympy2gem.register(symengine.Add) def sympy2gem_add(node, self): return reduce(gem.Sum, map(self, node.args))
[docs]@sympy2gem.register(sympy.Mul) @sympy2gem.register(symengine.Mul) def sympy2gem_mul(node, self): return reduce(gem.Product, map(self, node.args))
[docs]@sympy2gem.register(sympy.Pow) @sympy2gem.register(symengine.Pow) def sympy2gem_pow(node, self): return gem.Power(*map(self, node.args))
[docs]@sympy2gem.register(sympy.Integer) @sympy2gem.register(symengine.Integer) @sympy2gem.register(int) def sympy2gem_integer(node, self): return gem.Literal(int(node))
[docs]@sympy2gem.register(sympy.Float) @sympy2gem.register(symengine.Float) @sympy2gem.register(float) def sympy2gem_float(node, self): return gem.Literal(float(node))
[docs]@sympy2gem.register(sympy.Symbol) @sympy2gem.register(symengine.Symbol) def sympy2gem_symbol(node, self): return self.bindings[node]
[docs]@sympy2gem.register(sympy.Rational) @sympy2gem.register(symengine.Rational) def sympy2gem_rational(node, self): return gem.Division(*(map(self, node.as_numer_denom())))