diff --git a/apps/regression/model/cubic_model.cpp b/apps/regression/model/cubic_model.cpp index 75705bfbc..4acbd07b2 100644 --- a/apps/regression/model/cubic_model.cpp +++ b/apps/regression/model/cubic_model.cpp @@ -38,7 +38,7 @@ ExpressionLayout * CubicModel::layout() { return layout; } -Expression * CubicModel::expression(double * modelCoefficients) { +Expression * CubicModel::simplifiedExpression(double * modelCoefficients, Poincare::Context * context) { if (m_expression != nullptr) { delete m_expression; m_expression = nullptr; @@ -68,6 +68,7 @@ Expression * CubicModel::expression(double * modelCoefficients) { Expression * dExpression = new Decimal(d); Expression * const operands[] = {ax3Expression, bx2Expression, cxExpression, dExpression}; m_expression = new Addition(operands, 4, false); + Expression::Simplify(&m_expression, *context); return m_expression; } diff --git a/apps/regression/model/cubic_model.h b/apps/regression/model/cubic_model.h index 1a5369ec6..2c3359352 100644 --- a/apps/regression/model/cubic_model.h +++ b/apps/regression/model/cubic_model.h @@ -10,7 +10,7 @@ class CubicModel : public Model { public: CubicModel() : m_expression(nullptr) {} Poincare::ExpressionLayout * layout() override; - Poincare::Expression * expression(double * modelCoefficients) override; + Poincare::Expression * simplifiedExpression(double * modelCoefficients, Poincare::Context * context) override; I18n::Message formulaMessage() const override { return I18n::Message::CubicRegressionFormula; } double evaluate(double * modelCoefficients, double x) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override; diff --git a/apps/regression/model/model.cpp b/apps/regression/model/model.cpp index a01d216d1..a002728d4 100644 --- a/apps/regression/model/model.cpp +++ b/apps/regression/model/model.cpp @@ -12,8 +12,10 @@ using namespace Shared; namespace Regression { double Model::levelSet(double * modelCoefficients, double xMin, double step, double xMax, double y, Poincare::Context * context) { - Decimal * yExpression = new Decimal(y); - double result = expression(modelCoefficients)->nextIntersection('x', xMin, step, xMax, *context, yExpression).abscissa; + Expression * yExpression = static_cast(new Decimal(y)); + Expression::Simplify(&yExpression, *context); + Expression * modelExpression = simplifiedExpression(modelCoefficients, context); + double result = modelExpression->nextIntersection('x', xMin, step, xMax, *context, yExpression).abscissa; delete yExpression; return result; } diff --git a/apps/regression/model/model.h b/apps/regression/model/model.h index e47cb73ec..71e788d05 100644 --- a/apps/regression/model/model.h +++ b/apps/regression/model/model.h @@ -27,7 +27,7 @@ public: static constexpr int k_maxNumberOfCoefficients = 5; virtual ~Model() = default; virtual Poincare::ExpressionLayout * layout() = 0; - virtual Poincare::Expression * expression(double * modelCoefficients) { return nullptr; } //TODO keep this so no need to implement for bijective functions? + virtual Poincare::Expression * simplifiedExpression(double * modelCoefficients, Poincare::Context * context) { return nullptr; } //TODO keep this so no need to implement for bijective functions? virtual I18n::Message formulaMessage() const = 0; virtual double evaluate(double * modelCoefficients, double x) const = 0; virtual double levelSet(double * modelCoefficients, double xMin, double step, double xMax, double y, Poincare::Context * context); diff --git a/apps/regression/model/quadratic_model.cpp b/apps/regression/model/quadratic_model.cpp index bedb367db..6f4989e2e 100644 --- a/apps/regression/model/quadratic_model.cpp +++ b/apps/regression/model/quadratic_model.cpp @@ -30,7 +30,7 @@ ExpressionLayout * QuadraticModel::layout() { return layout; } -Expression * QuadraticModel::expression(double * modelCoefficients) { +Expression * QuadraticModel::simplifiedExpression(double * modelCoefficients, Poincare::Context * context) { if (m_expression != nullptr) { delete m_expression; m_expression = nullptr; @@ -52,6 +52,7 @@ Expression * QuadraticModel::expression(double * modelCoefficients) { Expression * cExpression = new Decimal(c); Expression * const operands[] = {ax2Expression, bxExpression, cExpression}; m_expression = new Addition(operands, 3, false); + Expression::Simplify(&m_expression, *context); return m_expression; } diff --git a/apps/regression/model/quadratic_model.h b/apps/regression/model/quadratic_model.h index fa94de678..a6e8ba9b1 100644 --- a/apps/regression/model/quadratic_model.h +++ b/apps/regression/model/quadratic_model.h @@ -10,7 +10,7 @@ class QuadraticModel : public Model { public: QuadraticModel() : m_expression(nullptr) {} Poincare::ExpressionLayout * layout() override; - Poincare::Expression * expression(double * modelCoefficients) override; + Poincare::Expression * simplifiedExpression(double * modelCoefficients, Poincare::Context * context) override; I18n::Message formulaMessage() const override { return I18n::Message::QuadraticRegressionFormula; } double evaluate(double * modelCoefficients, double x) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override; diff --git a/apps/regression/model/quartic_model.cpp b/apps/regression/model/quartic_model.cpp index 42c0d4fdb..8d9a81b31 100644 --- a/apps/regression/model/quartic_model.cpp +++ b/apps/regression/model/quartic_model.cpp @@ -46,7 +46,7 @@ ExpressionLayout * QuarticModel::layout() { return layout; } -Expression * QuarticModel::expression(double * modelCoefficients) { +Expression * QuarticModel::simplifiedExpression(double * modelCoefficients, Poincare::Context * context) { if (m_expression != nullptr) { delete m_expression; m_expression = nullptr; @@ -84,6 +84,7 @@ Expression * QuarticModel::expression(double * modelCoefficients) { Expression * eExpression = new Decimal(e); Expression * const operands[] = {ax4Expression, bx3Expression, cx2Expression, dxExpression, eExpression}; m_expression = new Addition(operands, 5, false); + Expression::Simplify(&m_expression, *context); return m_expression; } diff --git a/apps/regression/model/quartic_model.h b/apps/regression/model/quartic_model.h index 5a7961ee6..897bbc4ed 100644 --- a/apps/regression/model/quartic_model.h +++ b/apps/regression/model/quartic_model.h @@ -10,7 +10,7 @@ class QuarticModel : public Model { public: QuarticModel() : m_expression(nullptr) {} Poincare::ExpressionLayout * layout() override; - Poincare::Expression * expression(double * modelCoefficients) override; + Poincare::Expression * simplifiedExpression(double * modelCoefficients, Poincare::Context * context) override; I18n::Message formulaMessage() const override { return I18n::Message::QuarticRegressionFormula; } double evaluate(double * modelCoefficients, double x) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override; diff --git a/apps/regression/model/trigonometric_model.cpp b/apps/regression/model/trigonometric_model.cpp index 327d4938e..a75241a49 100644 --- a/apps/regression/model/trigonometric_model.cpp +++ b/apps/regression/model/trigonometric_model.cpp @@ -30,7 +30,7 @@ ExpressionLayout * TrigonometricModel::layout() { return layout; } -Expression * TrigonometricModel::expression(double * modelCoefficients) { +Expression * TrigonometricModel::simplifiedExpression(double * modelCoefficients, Poincare::Context * context) { if (m_expression != nullptr) { delete m_expression; m_expression = nullptr; @@ -49,6 +49,7 @@ Expression * TrigonometricModel::expression(double * modelCoefficients) { false), false); m_expression = new Multiplication(aExpression, sinExpression, false); + Expression::Simplify(&m_expression, *context); return m_expression; } diff --git a/apps/regression/model/trigonometric_model.h b/apps/regression/model/trigonometric_model.h index a646fd61b..6c28dc2c5 100644 --- a/apps/regression/model/trigonometric_model.h +++ b/apps/regression/model/trigonometric_model.h @@ -10,7 +10,7 @@ class TrigonometricModel : public Model { public: TrigonometricModel() : m_expression(nullptr) {} Poincare::ExpressionLayout * layout() override; - Poincare::Expression * expression(double * modelCoefficients) override; + Poincare::Expression * simplifiedExpression(double * modelCoefficients, Poincare::Context * context) override; I18n::Message formulaMessage() const override { return I18n::Message::TrigonometricRegressionFormula; } double evaluate(double * modelCoefficients, double x) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override;