Skip to content
Snippets Groups Projects

Reduction Support

Open Richard Angersbach requested to merge rangersbach/reductions into v2.0-dev
Compare and
5 files
+ 143
0
Preferences
Compare changes
Files
5
@@ -15,6 +15,7 @@ from ...sympyextensions import (
@@ -15,6 +15,7 @@ from ...sympyextensions import (
)
)
from ...sympyextensions.typed_sympy import TypedSymbol, CastFunc, DynamicType
from ...sympyextensions.typed_sympy import TypedSymbol, CastFunc, DynamicType
from ...sympyextensions.pointers import AddressOf, mem_acc
from ...sympyextensions.pointers import AddressOf, mem_acc
 
from ...sympyextensions.reduction import ReducedAssignment
from ...field import Field, FieldType
from ...field import Field, FieldType
from .context import KernelCreationContext
from .context import KernelCreationContext
@@ -183,6 +184,32 @@ class FreezeExpressions:
@@ -183,6 +184,32 @@ class FreezeExpressions:
return PsAssignment(lhs, op(lhs.clone(), rhs))
return PsAssignment(lhs, op(lhs.clone(), rhs))
 
def map_ReducedAssignment(self, expr: ReducedAssignment):
 
lhs = self.visit(expr.lhs)
 
rhs = self.visit(expr.rhs)
 
 
assert isinstance(lhs, PsExpression)
 
assert isinstance(rhs, PsExpression)
 
 
match expr.op:
 
case "+=":
 
op = add
 
case "-=":
 
op = sub
 
case "*=":
 
op = mul
 
case "/=":
 
op = truediv
 
# TODO: unsure if sp.Min & sp.Max work here
 
case "min=":
 
op = sp.Min
 
case "max=":
 
op = sp.Max
 
case _:
 
raise FreezeError(f"Unsupported reduced assignment: {expr.op}.")
 
 
return PsAssignment(lhs, op(lhs.clone(), rhs)) # TODO: PsReducedAssignment?
 
def map_Symbol(self, spsym: sp.Symbol) -> PsSymbolExpr:
def map_Symbol(self, spsym: sp.Symbol) -> PsSymbolExpr:
symb = self._ctx.get_symbol(spsym.name)
symb = self._ctx.get_symbol(spsym.name)
return PsSymbolExpr(symb)
return PsSymbolExpr(symb)