From 2315e7168ae2e65917bb5618a769d2c7b2c1bb21 Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner Date: Wed, 10 Aug 2011 02:50:45 +0200 Subject: [PATCH] Add Min, Max, plus minor fixes. --- pymbolic/mapper/evaluator.py | 9 +++++++++ pymbolic/mapper/flop_counter.py | 2 ++ pymbolic/mapper/stringifier.py | 6 ++++++ pymbolic/primitives.py | 27 +++++++++++++++++++++++++-- 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/pymbolic/mapper/evaluator.py b/pymbolic/mapper/evaluator.py index 6d29667..f190a18 100644 --- a/pymbolic/mapper/evaluator.py +++ b/pymbolic/mapper/evaluator.py @@ -43,6 +43,9 @@ class EvaluationMapper(RecursiveMapper): def map_quotient(self, expr): return self.rec(expr.numerator) / self.rec(expr.denominator) + def map_floor_div(self, expr): + return self.rec(expr.numerator) // self.rec(expr.denominator) + def map_power(self, expr): return self.rec(expr.base) ** self.rec(expr.exponent) @@ -85,6 +88,12 @@ class EvaluationMapper(RecursiveMapper): else: return self.rec(expr.else_) + def map_min(self, expr): + return min(self.rec(child) for child in expr.children) + + def map_max(self, expr): + return min(self.rec(child) for child in expr.children) + diff --git a/pymbolic/mapper/flop_counter.py b/pymbolic/mapper/flop_counter.py index 3cd1245..d59238f 100644 --- a/pymbolic/mapper/flop_counter.py +++ b/pymbolic/mapper/flop_counter.py @@ -24,6 +24,8 @@ class FlopCounter(CombineMapper): def map_quotient(self, expr, *args): return 1 + self.rec(expr.numerator) + self.rec(expr.denominator) + map_floor_div = map_quotient + def map_power(self, expr, *args): return 1 + self.rec(expr.base) + self.rec(expr.exponent) diff --git a/pymbolic/mapper/stringifier.py b/pymbolic/mapper/stringifier.py index 2e215b4..640b805 100644 --- a/pymbolic/mapper/stringifier.py +++ b/pymbolic/mapper/stringifier.py @@ -168,6 +168,12 @@ class StringifyMapper(pymbolic.mapper.RecursiveMapper): self.rec(expr.then, PREC_NONE), self.rec(expr.else_, PREC_NONE)) + def map_min(self, expr, enclosing_prec): + what = type(expr).__name__.lower() + return self.format("%s(%s)", what, self.join_rec(", ", expr.children, PREC_NONE)) + + map_max = map_min + diff --git a/pymbolic/primitives.py b/pymbolic/primitives.py index 79804b6..bae27e3 100644 --- a/pymbolic/primitives.py +++ b/pymbolic/primitives.py @@ -115,12 +115,12 @@ class Expression(object): return self return Remainder(self, other) - def __rmod(self, other): + def __rmod__(self, other): if not is_valid_operand(other): return NotImplemented return Remainder(other, self) - + def __pow__(self, other): if not is_valid_operand(other): return NotImplemented @@ -658,6 +658,29 @@ class IfPositive(Expression): +class _MinMaxBase(Expression): + def __init__(self, children): + self.children = children + + def __getinitargs__(self): + return self.children + + def is_equal(self, other): + return (isinstance(other, type(self)) + and self.children == other.children) + + def get_hash(self): + return hash((type(self), self.children)) + +class Min(_MinMaxBase): + mapper_method = intern("map_min") + +class Max(_MinMaxBase): + mapper_method = intern("map_max") + + + + # intelligent makers --------------------------------------------------------- def make_variable(var_or_string): if not isinstance(var_or_string, Expression): -- GitLab