def from_primitives(expr, var_order): from pymbolic import get_dependencies, evaluate deps = get_dependencies(expr) var_deps = [dep for dep in deps if dep in var_order] context = dict((vd, Polynomial(vd, var_order=var_order)) for vd in var_deps) # FIXME not fast, but works # (and exercises multivariate polynomial code) return evaluate(expr, context)
def from_primitives(expr, var_order): from pymbolic import get_dependencies, evaluate deps = get_dependencies(expr) var_deps = [dep for dep in deps if dep in var_order] context = dict( (vd, Polynomial(vd, var_order=var_order)) for vd in var_deps) # FIXME not fast, but works # (and exercises multivariate polynomial code) return evaluate(expr, context)
def as_primitives(self): deps = pymbolic.get_dependencies(self) context = dict((dep, dep) for dep in deps) return pymbolic.evaluate(self, context)
def _get_expr_dep_data(self, parsed): from pymbolic import get_dependencies deps = get_dependencies(parsed) # gather information on aggregation expressions dep_data = [] from pymbolic.primitives import Variable, Lookup, Subscript for dep_idx, dep in enumerate(deps): if isinstance(dep, Variable): name = dep.name agg_func = self.quantity_data[name].default_aggregator if agg_func is None: if self.is_parallel: raise ValueError, "must specify explicit aggregator for '%s'" % name else: agg_func = lambda lst: lst[0] elif isinstance(dep, Lookup): assert isinstance(dep.aggregate, Variable) name = dep.aggregate.name agg_name = dep.name if agg_name == "min": agg_func = min elif agg_name == "max": agg_func = max elif agg_name == "avg": from pytools import average agg_func = average elif agg_name == "sum": agg_func = sum elif agg_name == "norm2": from math import sqrt agg_func = lambda iterable: sqrt( sum(entry**2 for entry in iterable)) else: raise ValueError, "invalid rank aggregator '%s'" % agg_name elif isinstance(dep, Subscript): assert isinstance(dep.aggregate, Variable) name = dep.aggregate.name class Nth: def __init__(self, n): self.n = n def __call__(self, lst): return lst[self.n] from pymbolic import evaluate agg_func = Nth(evaluate(dep.index)) qdat = self.quantity_data[name] from pytools import Record this_dep_data = Record(name=name, qdat=qdat, agg_func=agg_func, varname="logvar%d" % dep_idx, expr=dep) dep_data.append(this_dep_data) # substitute in the "logvar" variable names from pymbolic import var, substitute parsed = substitute(parsed, dict((dd.expr, var(dd.varname)) for dd in dep_data)) return parsed, dep_data