From 191680d96f9323b04d91750b69a258a115aa331b Mon Sep 17 00:00:00 2001 From: Ruben Dashyan Date: Thu, 20 Feb 2020 17:46:09 +0100 Subject: [PATCH] [poincare/multiplication] Simplify Unit::Dimension::Vector::Metrics comparison --- poincare/src/multiplication.cpp | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/poincare/src/multiplication.cpp b/poincare/src/multiplication.cpp index 9776a17a1..b565f56a1 100644 --- a/poincare/src/multiplication.cpp +++ b/poincare/src/multiplication.cpp @@ -303,7 +303,8 @@ Expression Multiplication::shallowReduce(ExpressionNode::ReductionContext reduct } static bool CanSimplifyUnitProduct( - const Unit::Dimension::Vector &unitsExponents, const Unit::Dimension::Vector &entryUnitExponents, const Integer entryUnitNorm, const Expression entryUnit, + const Unit::Dimension::Vector &unitsExponents, Unit::Dimension::Vector::Metrics &unitsMetrics, + const Unit::Dimension::Vector &entryUnitExponents, const Integer entryUnitNorm, const Expression entryUnit, Integer (*operationOnExponents)(const Integer & unitsExponent, const Integer & entryUnitExponent), Expression & bestUnit, Integer & bestUnitNorm, Unit::Dimension::Vector &bestRemainderExponents, Unit::Dimension::Vector::Metrics & bestRemainderMetrics) { /* This function tries to simplify a Unit product (given as the @@ -315,14 +316,19 @@ static bool CanSimplifyUnitProduct( simplifiedExponents.setCoefficientAtIndex(i, operationOnExponents(unitsExponents.coefficientAtIndex(i), entryUnitExponents.coefficientAtIndex(i))); } Unit::Dimension::Vector::Metrics simplifiedMetrics = simplifiedExponents.metrics(); - bool isSimpler = simplifiedMetrics.supportSize < bestRemainderMetrics.supportSize || - (simplifiedMetrics.supportSize == bestRemainderMetrics.supportSize && - Integer::Addition(simplifiedMetrics.norm, entryUnitNorm).isLowerThan(Integer::Addition(bestRemainderMetrics.norm, bestUnitNorm))); + Unit::Dimension::Vector::Metrics candidateMetrics = { + .supportSize = 1 + simplifiedMetrics.supportSize, + .norm = Integer::Addition(entryUnitNorm, simplifiedMetrics.norm) + }; + bool isSimpler = candidateMetrics.supportSize < unitsMetrics.supportSize || + (candidateMetrics.supportSize == unitsMetrics.supportSize && + candidateMetrics.norm.isLowerThan(unitsMetrics.norm)); if (isSimpler) { bestUnit = entryUnit; bestUnitNorm = entryUnitNorm; bestRemainderExponents = simplifiedExponents; bestRemainderMetrics = simplifiedMetrics; + unitsMetrics = candidateMetrics; } return isSimpler; } @@ -361,22 +367,24 @@ Expression Multiplication::shallowBeautify(ExpressionNode::ReductionContext redu Unit::Dimension::Vector unitsExponents = Unit::Dimension::Vector::FromBaseUnits(units); Unit::Dimension::Vector::Metrics unitsMetrics = unitsExponents.metrics(); Unit::Dimension::Vector bestRemainderExponents; + Unit::Dimension::Vector::Metrics bestRemainderMetrics; while (unitsMetrics.supportSize > 1) { Expression bestUnit; Integer bestUnitNorm(0); - Unit::Dimension::Vector::Metrics bestRemainderMetrics = {.supportSize = unitsMetrics.supportSize - 1, .norm = unitsMetrics.norm}; for (const Unit::Dimension * dim = Unit::DimensionTable + Unit::NumberOfBaseUnits; dim < Unit::DimensionTableUpperBound; dim++) { Unit entryUnit = Unit::Builder(dim, dim->stdRepresentative(), dim->stdRepresentativePrefix()); Unit::Dimension::Vector entryUnitExponents = Unit::Dimension::Vector::FromBaseUnits(entryUnit.clone().shallowReduce(reductionContext)); Integer entryUnitNorm = entryUnitExponents.metrics().norm; CanSimplifyUnitProduct( - unitsExponents, entryUnitExponents, entryUnitNorm, entryUnit, + unitsExponents, unitsMetrics, + entryUnitExponents, entryUnitNorm, entryUnit, Integer::Subtraction, bestUnit, bestUnitNorm, bestRemainderExponents, bestRemainderMetrics ) || CanSimplifyUnitProduct( - unitsExponents, entryUnitExponents, entryUnitNorm, Power::Builder(entryUnit, Rational::Builder(-1)), + unitsExponents, unitsMetrics, + entryUnitExponents, entryUnitNorm, Power::Builder(entryUnit, Rational::Builder(-1)), Integer::Addition, bestUnit, bestUnitNorm, bestRemainderExponents, bestRemainderMetrics );