From 7b4a94296bd5879e4496d5139c0b93f535117b96 Mon Sep 17 00:00:00 2001 From: Laury Date: Wed, 1 Sep 2021 17:31:51 +0200 Subject: [PATCH] [calculation][poincare] Revert 'b8544e3' and improve equal simplification --- apps/calculation/app.cpp | 2 +- apps/shared/function_app.cpp | 10 +++++++--- apps/shared/text_field_delegate_app.cpp | 8 +++++++- apps/solver/app.cpp | 6 ------ apps/solver/app.h | 3 --- poincare/include/poincare/equal.h | 2 +- poincare/src/equal.cpp | 16 ++++++---------- 7 files changed, 22 insertions(+), 25 deletions(-) diff --git a/apps/calculation/app.cpp b/apps/calculation/app.cpp index 2c5c97d3c..ad344c316 100644 --- a/apps/calculation/app.cpp +++ b/apps/calculation/app.cpp @@ -72,7 +72,7 @@ bool App::isAcceptableExpression(const Poincare::Expression expression) { return false; } } - return !(expression.isUninitialized() || expression.type() == ExpressionNode::Type::Equal); + return !expression.isUninitialized(); } void App::didBecomeActive(Window * window) { diff --git a/apps/shared/function_app.cpp b/apps/shared/function_app.cpp index fbdc4f43a..a63ca3284 100644 --- a/apps/shared/function_app.cpp +++ b/apps/shared/function_app.cpp @@ -31,9 +31,13 @@ void FunctionApp::willBecomeInactive() { ::App::willBecomeInactive(); } - -bool FunctionApp::isAcceptableExpression(const Expression exp) { - return TextFieldDelegateApp::isAcceptableExpression(exp) && ExpressionCanBeSerialized(exp, false, Expression(), localContext()); +bool FunctionApp::isAcceptableExpression(const Poincare::Expression expression) { + /* We forbid functions whose type is equal because the input "2+f(3)" would be + * simplify to an expression with an nested equal node which makes no sense. */ + if (!TextFieldDelegateApp::ExpressionCanBeSerialized(expression, false, Expression(), localContext()) || expression.type() == ExpressionNode::Type::Equal) { + return false; + } + return TextFieldDelegateApp::isAcceptableExpression(expression); } } diff --git a/apps/shared/text_field_delegate_app.cpp b/apps/shared/text_field_delegate_app.cpp index e66a87422..ece157f9b 100644 --- a/apps/shared/text_field_delegate_app.cpp +++ b/apps/shared/text_field_delegate_app.cpp @@ -85,7 +85,13 @@ bool TextFieldDelegateApp::isFinishingEvent(Ion::Events::Event event) { } bool TextFieldDelegateApp::isAcceptableExpression(const Expression exp) { - return !(exp.isUninitialized() || exp.type() == ExpressionNode::Type::Store || exp.type() == ExpressionNode::Type::Equal); + if (exp.isUninitialized()) { + return false; + } + if (exp.type() == ExpressionNode::Type::Store) { + return false; + } + return true; } bool TextFieldDelegateApp::ExpressionCanBeSerialized(const Expression expression, bool replaceAns, Expression ansExpression, Context * context) { diff --git a/apps/solver/app.cpp b/apps/solver/app.cpp index 11f96a32a..1c88b7df5 100644 --- a/apps/solver/app.cpp +++ b/apps/solver/app.cpp @@ -68,10 +68,4 @@ void App::willBecomeInactive() { ::App::willBecomeInactive(); } - -bool App::isAcceptableExpression(const Poincare::Expression exp) { - return TextFieldDelegateApp::ExpressionCanBeSerialized(exp, false, Poincare::Expression(), localContext()) - && !(exp.isUninitialized() || exp.type() == Poincare::ExpressionNode::Type::Store); -} - } diff --git a/apps/solver/app.h b/apps/solver/app.h index a4919978e..898c3c6b8 100644 --- a/apps/solver/app.h +++ b/apps/solver/app.h @@ -47,9 +47,6 @@ public: void willBecomeInactive() override; TELEMETRY_ID("Solver"); private: - // TextFieldDelegateApp - bool isAcceptableExpression(const Poincare::Expression expression) override; - App(Snapshot * snapshot); SolutionsController m_solutionsController; IntervalController m_intervalController; diff --git a/poincare/include/poincare/equal.h b/poincare/include/poincare/equal.h index fa067652f..1f61b2c57 100644 --- a/poincare/include/poincare/equal.h +++ b/poincare/include/poincare/equal.h @@ -41,7 +41,7 @@ public: // For the equation A = B, create the reduced expression A-B Expression standardEquation(Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, Preferences::UnitFormat unitFormat, ExpressionNode::ReductionTarget reductionTarget) const; // Expression - Expression shallowReduce(); + Expression shallowReduce(ExpressionNode::ReductionContext reductionContext); }; } diff --git a/poincare/src/equal.cpp b/poincare/src/equal.cpp index 4468a2e32..3e8ca67bd 100644 --- a/poincare/src/equal.cpp +++ b/poincare/src/equal.cpp @@ -23,7 +23,7 @@ extern "C" { namespace Poincare { Expression EqualNode::shallowReduce(ReductionContext reductionContext) { - return Equal(this).shallowReduce(); + return Equal(this).shallowReduce(reductionContext); } Layout EqualNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { @@ -49,19 +49,15 @@ Expression Equal::standardEquation(Context * context, Preferences::ComplexFormat return sub.reduce(ExpressionNode::ReductionContext(context, complexFormat, angleUnit, unitFormat, reductionTarget)); } -Expression Equal::shallowReduce() { - { - Expression e = Expression::defaultShallowReduce(); - if (e.isUndefined()) { - return e; - } - } - if (childAtIndex(0).isIdenticalTo(childAtIndex(1))) { +Expression Equal::shallowReduce(ExpressionNode::ReductionContext reductionContext) { + + Expression e = Equal::Builder(Subtraction::Builder(childAtIndex(0).clone(), childAtIndex(1).clone()).shallowReduce(reductionContext), Rational::Builder(0)); + if (e.childAtIndex(0).isIdenticalTo(e.childAtIndex(1))) { Expression result = Rational::Builder(1); replaceWithInPlace(result); return result; } - return *this; + return e; } }