diff --git a/poincare/include/poincare/cosine.h b/poincare/include/poincare/cosine.h index b5c81aa43..bca04a2ed 100644 --- a/poincare/include/poincare/cosine.h +++ b/poincare/include/poincare/cosine.h @@ -21,7 +21,6 @@ public: // Properties Type type() const override { return Type::Cosine; } - float characteristicXRange(Context * context, Preferences::AngleUnit angleUnit) const override; template static Complex computeOnComplex(const std::complex c, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit = Preferences::AngleUnit::Radian); diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index e658a926d..0b665ff86 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -170,15 +170,6 @@ public: static bool IsRandom(const Expression e, Context * context); static bool IsMatrix(const Expression e, Context * context); static bool IsInfinity(const Expression e, Context * context); - /* 'characteristicXRange' tries to assess the range on x where the expression - * (considered as a function on x) has an interesting evolution. For example, - * the period of the function on 'x' if it is periodic. If - * the function is x-independent, the return value is 0.0f (because any - * x-range is equivalent). If the function does not have an interesting range, - * the return value is NAN. - * NB: so far, we consider that the only way of building a periodic function - * is to use sin/tan/cos(f(x)) with f a linear function. */ - float characteristicXRange(Context * context, Preferences::AngleUnit angleUnit) const { return node()->characteristicXRange(context, angleUnit); } /* polynomialDegree returns: * - (-1) if the expression is not a polynome * - the degree of the polynome otherwise */ diff --git a/poincare/include/poincare/expression_node.h b/poincare/include/poincare/expression_node.h index e30d627ce..2e7e45c10 100644 --- a/poincare/include/poincare/expression_node.h +++ b/poincare/include/poincare/expression_node.h @@ -200,7 +200,6 @@ public: /*!*/ virtual Expression deepReplaceReplaceableSymbols(Context * context, bool * didReplace, bool replaceFunctionsOnly, int parameteredAncestorsCount); typedef bool (*isVariableTest)(const char * c, Poincare::Context * context); virtual int getVariables(Context * context, isVariableTest isVariable, char * variables, int maxSizeVariable, int nextVariableIndex) const; - virtual float characteristicXRange(Context * context, Preferences::AngleUnit angleUnit) const; bool isOfType(Type * types, int length) const; virtual Expression removeUnit(Expression * unit); // Only reduced nodes should answer diff --git a/poincare/include/poincare/function.h b/poincare/include/poincare/function.h index cc64a531b..ddd11f81b 100644 --- a/poincare/include/poincare/function.h +++ b/poincare/include/poincare/function.h @@ -27,7 +27,6 @@ public: int polynomialDegree(Context * context, const char * symbolName) const override; int getPolynomialCoefficients(Context * context, const char * symbolName, Expression coefficients[], ExpressionNode::SymbolicComputation symbolicComputation) const override; int getVariables(Context * context, isVariableTest isVariable, char * variables, int maxSizeVariable, int nextVariableIndex) const override; - float characteristicXRange(Context * context, Preferences::AngleUnit angleUnit) const override; private: char m_name[0]; // MUST be the last member variable diff --git a/poincare/include/poincare/sine.h b/poincare/include/poincare/sine.h index eb3938b13..169db870b 100644 --- a/poincare/include/poincare/sine.h +++ b/poincare/include/poincare/sine.h @@ -21,7 +21,6 @@ public: // Properties Type type() const override { return Type::Sine; } - float characteristicXRange(Context * context, Preferences::AngleUnit angleUnit) const override; template static Complex computeOnComplex(const std::complex c, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit = Preferences::AngleUnit::Radian); diff --git a/poincare/include/poincare/symbol.h b/poincare/include/poincare/symbol.h index 8db3794c4..8b800a5fc 100644 --- a/poincare/include/poincare/symbol.h +++ b/poincare/include/poincare/symbol.h @@ -25,7 +25,6 @@ public: int polynomialDegree(Context * context, const char * symbolName) const override; int getPolynomialCoefficients(Context * context, const char * symbolName, Expression coefficients[], ExpressionNode::SymbolicComputation symbolicComputation) const override; int getVariables(Context * context, isVariableTest isVariable, char * variables, int maxSizeVariable, int nextVariableIndex) const override; - float characteristicXRange(Context * context, Preferences::AngleUnit angleUnit) const override; /* getUnit returns Undefined, because the symbol would have * already been replaced if it should have been.*/ diff --git a/poincare/include/poincare/tangent.h b/poincare/include/poincare/tangent.h index 7ec86acb0..0576191b9 100644 --- a/poincare/include/poincare/tangent.h +++ b/poincare/include/poincare/tangent.h @@ -20,7 +20,6 @@ public: // Properties Type type() const override { return Type::Tangent; } - float characteristicXRange(Context * context, Preferences::AngleUnit angleUnit) const override; private: // Layout diff --git a/poincare/include/poincare/trigonometry.h b/poincare/include/poincare/trigonometry.h index 0eac9d5c2..86e49da2a 100644 --- a/poincare/include/poincare/trigonometry.h +++ b/poincare/include/poincare/trigonometry.h @@ -13,7 +13,6 @@ public: Sine = 1, }; static double PiInAngleUnit(Preferences::AngleUnit angleUnit); - static float characteristicXRange(const Expression & e, Context * context, Preferences::AngleUnit angleUnit); static bool isDirectTrigonometryFunction(const Expression & e); static bool isInverseTrigonometryFunction(const Expression & e); static bool AreInverseFunctions(const Expression & directFunction, const Expression & inverseFunction); diff --git a/poincare/src/cosine.cpp b/poincare/src/cosine.cpp index dcf87c6e4..16a47ef1f 100644 --- a/poincare/src/cosine.cpp +++ b/poincare/src/cosine.cpp @@ -15,10 +15,6 @@ constexpr Expression::FunctionHelper Cosine::s_functionHelper; int CosineNode::numberOfChildren() const { return Cosine::s_functionHelper.numberOfChildren(); } -float CosineNode::characteristicXRange(Context * context, Preferences::AngleUnit angleUnit) const { - return Trigonometry::characteristicXRange(Cosine(this), context, angleUnit); -} - template Complex CosineNode::computeOnComplex(const std::complex c, Preferences::ComplexFormat, Preferences::AngleUnit angleUnit) { std::complex angleInput = Trigonometry::ConvertToRadian(c, angleUnit); diff --git a/poincare/src/expression_node.cpp b/poincare/src/expression_node.cpp index e74456cc9..4bd4b9823 100644 --- a/poincare/src/expression_node.cpp +++ b/poincare/src/expression_node.cpp @@ -51,22 +51,6 @@ int ExpressionNode::getVariables(Context * context, isVariableTest isVariable, c return nextVariableIndex; } -float ExpressionNode::characteristicXRange(Context * context, Preferences::AngleUnit angleUnit) const { - /* A expression has a characteristic range if at least one of its childAtIndex has - * one and the other are x-independant. We keep the biggest interesting range - * among the childAtIndex interesting ranges. */ - float range = 0.0f; - for (ExpressionNode * c : children()) { - float opRange = c->characteristicXRange(context, angleUnit); - if (std::isnan(opRange)) { - return NAN; - } else if (range < opRange) { - range = opRange; - } - } - return range; -} - int ExpressionNode::SimplificationOrder(const ExpressionNode * e1, const ExpressionNode * e2, bool ascending, bool canBeInterrupted, bool ignoreParentheses) { // Depending on ignoreParentheses, check if e1 or e2 are parenthesis ExpressionNode::Type type1 = e1->type(); diff --git a/poincare/src/function.cpp b/poincare/src/function.cpp index ae5764af2..1d966416d 100644 --- a/poincare/src/function.cpp +++ b/poincare/src/function.cpp @@ -44,15 +44,6 @@ int FunctionNode::getVariables(Context * context, isVariableTest isVariable, cha return e.node()->getVariables(context, isVariable, variables, maxSizeVariable, nextVariableIndex); } -float FunctionNode::characteristicXRange(Context * context, Preferences::AngleUnit angleUnit) const { - Function f(this); - Expression e = SymbolAbstract::Expand(f,context, true); - if (e.isUninitialized()) { - return 0.0f; - } - return e.characteristicXRange(context, angleUnit); -} - Layout FunctionNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { return LayoutHelper::Prefix(Function(this), floatDisplayMode, numberOfSignificantDigits, name()); } diff --git a/poincare/src/sine.cpp b/poincare/src/sine.cpp index 7d90778b8..17b77a133 100644 --- a/poincare/src/sine.cpp +++ b/poincare/src/sine.cpp @@ -13,10 +13,6 @@ constexpr Expression::FunctionHelper Sine::s_functionHelper; int SineNode::numberOfChildren() const { return Sine::s_functionHelper.numberOfChildren(); } -float SineNode::characteristicXRange(Context * context, Preferences::AngleUnit angleUnit) const { - return Trigonometry::characteristicXRange(Sine(this), context, angleUnit); -} - template Complex SineNode::computeOnComplex(const std::complex c, Preferences::ComplexFormat, Preferences::AngleUnit angleUnit) { std::complex angleInput = Trigonometry::ConvertToRadian(c, angleUnit); diff --git a/poincare/src/symbol.cpp b/poincare/src/symbol.cpp index 3cedd2daa..e04e35656 100644 --- a/poincare/src/symbol.cpp +++ b/poincare/src/symbol.cpp @@ -64,10 +64,6 @@ int SymbolNode::getVariables(Context * context, isVariableTest isVariable, char return nextVariableIndex; } -float SymbolNode::characteristicXRange(Context * context, Preferences::AngleUnit angleUnit) const { - return isUnknown() ? NAN : 0.0f; -} - Layout SymbolNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { assert(!isUnknown()); // TODO return Parse(m_name).createLayout() ? diff --git a/poincare/src/tangent.cpp b/poincare/src/tangent.cpp index 9708ebd98..d1d157805 100644 --- a/poincare/src/tangent.cpp +++ b/poincare/src/tangent.cpp @@ -17,10 +17,6 @@ constexpr Expression::FunctionHelper Tangent::s_functionHelper; int TangentNode::numberOfChildren() const { return Tangent::s_functionHelper.numberOfChildren(); } -float TangentNode::characteristicXRange(Context * context, Preferences::AngleUnit angleUnit) const { - return Trigonometry::characteristicXRange(Tangent(this), context, angleUnit); -} - Layout TangentNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { return LayoutHelper::Prefix(Tangent(this), floatDisplayMode, numberOfSignificantDigits, Tangent::s_functionHelper.name()); } diff --git a/poincare/src/trigonometry.cpp b/poincare/src/trigonometry.cpp index a466f11a6..209aebcc7 100644 --- a/poincare/src/trigonometry.cpp +++ b/poincare/src/trigonometry.cpp @@ -55,32 +55,6 @@ double Trigonometry::PiInAngleUnit(Preferences::AngleUnit angleUnit) { return 200.0; } -float Trigonometry::characteristicXRange(const Expression & e, Context * context, Preferences::AngleUnit angleUnit) { - assert(e.numberOfChildren() == 1); - - constexpr int bufferSize = CodePoint::MaxCodePointCharLength + 1; - char x[bufferSize]; - SerializationHelper::CodePoint(x, bufferSize, UCodePointUnknown); - - int d = e.childAtIndex(0).polynomialDegree(context, x); - if (d < 0 || d > 1) { - // child(0) is not linear so we cannot easily find an interesting range - return e.childAtIndex(0).characteristicXRange(context, angleUnit); - } - // The expression e is x-independent - if (d == 0) { - return 0.0f; - } - // e has the form cos/sin/tan(ax+b) so it is periodic of period 2*π/a - assert(d == 1); - /* To compute a, the slope of the expression child(0), we compute the - * derivative of child(0) for any x value. */ - Poincare::Derivative derivative = Poincare::Derivative::Builder(e.childAtIndex(0).clone(), Symbol::Builder(x, 1), Float::Builder(1.0f)); - double a = derivative.node()->approximate(double(), context, Preferences::ComplexFormat::Real, angleUnit).toScalar(); - double pi = PiInAngleUnit(angleUnit); - return std::fabs(a) < Expression::Epsilon() ? NAN : 2.0*pi/std::fabs(a); -} - bool Trigonometry::isDirectTrigonometryFunction(const Expression & e) { return e.type() == ExpressionNode::Type::Cosine || e.type() == ExpressionNode::Type::Sine diff --git a/poincare/test/expression_properties.cpp b/poincare/test/expression_properties.cpp index 79f10e8e4..4cf2a3b85 100644 --- a/poincare/test/expression_properties.cpp +++ b/poincare/test/expression_properties.cpp @@ -240,45 +240,6 @@ QUIZ_CASE(poincare_properties_polynomial_degree) { Ion::Storage::sharedStorage()->recordNamed("f.func").destroy(); } -void assert_reduced_expression_has_characteristic_range(Expression e, float range, Preferences::AngleUnit angleUnit = Preferences::AngleUnit::Degree, Preferences::UnitFormat unitFormat = Metric) { - Shared::GlobalContext globalContext; - e = e.reduce(ExpressionNode::ReductionContext(&globalContext, Preferences::ComplexFormat::Cartesian, angleUnit, unitFormat, ExpressionNode::ReductionTarget::SystemForApproximation)); - if (std::isnan(range)) { - quiz_assert(std::isnan(e.characteristicXRange(&globalContext, angleUnit))); - } else { - quiz_assert(std::fabs(e.characteristicXRange(&globalContext, angleUnit) - range) < 0.0000001f); - } -} - -QUIZ_CASE(poincare_properties_characteristic_range) { - // cos(x), degree - assert_reduced_expression_has_characteristic_range(Cosine::Builder(Symbol::Builder(UCodePointUnknown)), 360.0f); - // cos(-x), degree - assert_reduced_expression_has_characteristic_range(Cosine::Builder(Opposite::Builder(Symbol::Builder(UCodePointUnknown))), 360.0f); - // cos(x), radian - assert_reduced_expression_has_characteristic_range(Cosine::Builder(Symbol::Builder(UCodePointUnknown)), 2.0f*M_PI, Preferences::AngleUnit::Radian); - // cos(-x), radian - assert_reduced_expression_has_characteristic_range(Cosine::Builder(Opposite::Builder(Symbol::Builder(UCodePointUnknown))), 2.0f*M_PI, Preferences::AngleUnit::Radian); - // sin(9x+10), degree - assert_reduced_expression_has_characteristic_range(Sine::Builder(Addition::Builder(Multiplication::Builder(Rational::Builder(9),Symbol::Builder(UCodePointUnknown)),Rational::Builder(10))), 40.0f); - // sin(9x+10)+cos(x/2), degree - assert_reduced_expression_has_characteristic_range(Addition::Builder(Sine::Builder(Addition::Builder(Multiplication::Builder(Rational::Builder(9),Symbol::Builder(UCodePointUnknown)),Rational::Builder(10))),Cosine::Builder(Division::Builder(Symbol::Builder(UCodePointUnknown),Rational::Builder(2)))), 720.0f); - // sin(9x+10)+cos(x/2), radian - assert_reduced_expression_has_characteristic_range(Addition::Builder(Sine::Builder(Addition::Builder(Multiplication::Builder(Rational::Builder(9),Symbol::Builder(UCodePointUnknown)),Rational::Builder(10))),Cosine::Builder(Division::Builder(Symbol::Builder(UCodePointUnknown),Rational::Builder(2)))), 4.0f*M_PI, Preferences::AngleUnit::Radian); - // x, degree - assert_reduced_expression_has_characteristic_range(Symbol::Builder(UCodePointUnknown), NAN); - // cos(3)+2, degree - assert_reduced_expression_has_characteristic_range(Addition::Builder(Cosine::Builder(Rational::Builder(3)),Rational::Builder(2)), 0.0f); - // log(cos(40x), degree - assert_reduced_expression_has_characteristic_range(CommonLogarithm::Builder(Cosine::Builder(Multiplication::Builder(Rational::Builder(40),Symbol::Builder(UCodePointUnknown)))), 9.0f); - // cos(cos(x)), degree - assert_reduced_expression_has_characteristic_range(Cosine::Builder((Expression)Cosine::Builder(Symbol::Builder(UCodePointUnknown))), 360.0f); - // f(x) with f : x --> cos(x), degree - assert_reduce("cos(x)→f(x)"); - assert_reduced_expression_has_characteristic_range(Function::Builder("f",1,Symbol::Builder(UCodePointUnknown)), 360.0f); - Ion::Storage::sharedStorage()->recordNamed("f.func").destroy(); -} - void assert_expression_has_variables(const char * expression, const char * variables[], int trueNumberOfVariables) { Shared::GlobalContext globalContext; Expression e = parse_expression(expression, &globalContext, false);