From 69ec4168cecf3751f126e2ffee4a040238abb0e0 Mon Sep 17 00:00:00 2001 From: Martin Bauer <martin.bauer@fau.de> Date: Thu, 12 Jan 2017 16:30:42 +0100 Subject: [PATCH] new_lbm: SRT simplifications working --- equationcollection/equationcollection.py | 5 ++++- equationcollection/simplifications.py | 21 +++++++++++++++++++- equationcollection/simplificationstrategy.py | 2 +- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/equationcollection/equationcollection.py b/equationcollection/equationcollection.py index ede7d66fb..8c6c6f32f 100644 --- a/equationcollection/equationcollection.py +++ b/equationcollection/equationcollection.py @@ -53,13 +53,16 @@ class EquationCollection: res.subexpressionSymbolNameGenerator = self.subexpressionSymbolNameGenerator return res - def newWithSubstitutionsApplied(self, substitutionDict): + def newWithSubstitutionsApplied(self, substitutionDict, addSubstitutionsAsSubexpresions=False): """ Returns a new equation collection, where terms are substituted according to the passed `substitutionDict`. Substitutions are made in the subexpression terms and the main equations """ newSubexpressions = [fastSubs(eq, substitutionDict) for eq in self.subexpressions] newEquations = [fastSubs(eq, substitutionDict) for eq in self.mainEquations] + if addSubstitutionsAsSubexpresions: + newSubexpressions = [sp.Eq(b, a) for a, b in substitutionDict.items()] + newSubexpressions + res = EquationCollection(newEquations, newSubexpressions, self.simplificationHints) res.subexpressionSymbolNameGenerator = self.subexpressionSymbolNameGenerator return res diff --git a/equationcollection/simplifications.py b/equationcollection/simplifications.py index c8e93702b..412a889cc 100644 --- a/equationcollection/simplifications.py +++ b/equationcollection/simplifications.py @@ -53,7 +53,7 @@ def subexpressionSubstitutionInExistingSubexpressions(equationCollection): equationCollection.subexpressionSymbolNameGenerator) -def subexpressionSubstitutionInUpdateEquations(equationCollection): +def subexpressionSubstitutionInMainEquations(equationCollection): """Replaces already existing subexpressions in the equations of the equationCollection""" result = [] for s in equationCollection.mainEquations: @@ -62,3 +62,22 @@ def subexpressionSubstitutionInUpdateEquations(equationCollection): newRhs = replaceAdditive(newRhs, subExpr.lhs, subExpr.rhs, requiredMatchReplacement=1.0) result.append(sp.Eq(s.lhs, newRhs)) return equationCollection.newWithAdditionalSubexpressions(result, []) + + +def addSubexpressionsForDivisions(equationCollection): + divisors = set() + + def searchDivisors(term): + if term.func == sp.Pow: + if term.exp.is_integer and term.exp.is_number and term.exp < 0: + divisors.add(term) + else: + for a in term.args: + searchDivisors(a) + + for eq in equationCollection.allEquations: + searchDivisors(eq.rhs) + + newSymbolGen = equationCollection.subexpressionSymbolNameGenerator + substitutions = {divisor: newSymbol for newSymbol, divisor in zip(newSymbolGen, divisors)} + return equationCollection.newWithSubstitutionsApplied(substitutions, True) diff --git a/equationcollection/simplificationstrategy.py b/equationcollection/simplificationstrategy.py index 0caa0f269..8f2078ba4 100644 --- a/equationcollection/simplificationstrategy.py +++ b/equationcollection/simplificationstrategy.py @@ -14,7 +14,7 @@ class SimplificationStrategy: def __init__(self): self._rules = [] - def addSimplificationRule(self, rule): + def add(self, rule): """ Adds the given simplification rule to the end of the collection. :param rule: function that taking one equation collection and returning a (simplified) equation collection -- GitLab