[apps/regression] Fix simplifiedExpression memoization

The model does not keep a pointer to the simplifiedExpression, the
method calling simplifiedExpression should delete it afterwards
This commit is contained in:
Léa Saviot
2018-07-09 10:19:28 +02:00
committed by Émilie Feral
parent 448f5b359c
commit 682f12a1ef
8 changed files with 17 additions and 40 deletions

View File

@@ -39,10 +39,6 @@ ExpressionLayout * CubicModel::layout() {
}
Expression * CubicModel::simplifiedExpression(double * modelCoefficients, Poincare::Context * context) {
if (m_expression != nullptr) {
delete m_expression;
m_expression = nullptr;
}
double a = modelCoefficients[0];
double b = modelCoefficients[1];
double c = modelCoefficients[2];
@@ -67,9 +63,9 @@ Expression * CubicModel::simplifiedExpression(double * modelCoefficients, Poinca
false);
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;
Expression * result = new Addition(operands, 4, false);
Expression::Simplify(&result, *context);
return result;
}
double CubicModel::evaluate(double * modelCoefficients, double x) const {

View File

@@ -8,15 +8,13 @@ namespace Regression {
class CubicModel : public Model {
public:
CubicModel() : m_expression(nullptr) {}
using Model::Model;
Poincare::ExpressionLayout * layout() 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;
int numberOfCoefficients() const override { return 4; }
private:
Poincare::Expression * m_expression;
};
}

View File

@@ -31,10 +31,6 @@ ExpressionLayout * QuadraticModel::layout() {
}
Expression * QuadraticModel::simplifiedExpression(double * modelCoefficients, Poincare::Context * context) {
if (m_expression != nullptr) {
delete m_expression;
m_expression = nullptr;
}
double a = modelCoefficients[0];
double b = modelCoefficients[1];
double c = modelCoefficients[2];
@@ -51,9 +47,9 @@ Expression * QuadraticModel::simplifiedExpression(double * modelCoefficients, Po
false);
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;
Expression * result = new Addition(operands, 3, false);
Expression::Simplify(&result, *context);
return result;
}
double QuadraticModel::evaluate(double * modelCoefficients, double x) const {

View File

@@ -8,15 +8,14 @@ namespace Regression {
class QuadraticModel : public Model {
public:
QuadraticModel() : m_expression(nullptr) {}
using Model::Model;
Poincare::ExpressionLayout * layout() 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;
int numberOfCoefficients() const override { return 3; }
private:
Poincare::Expression * m_expression;};
};
}

View File

@@ -47,10 +47,6 @@ ExpressionLayout * QuarticModel::layout() {
}
Expression * QuarticModel::simplifiedExpression(double * modelCoefficients, Poincare::Context * context) {
if (m_expression != nullptr) {
delete m_expression;
m_expression = nullptr;
}
double a = modelCoefficients[0];
double b = modelCoefficients[1];
double c = modelCoefficients[2];
@@ -83,9 +79,9 @@ Expression * QuarticModel::simplifiedExpression(double * modelCoefficients, Poin
false);
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;
Expression * result = new Addition(operands, 5, false);
Expression::Simplify(&result, *context);
return result;
}
double QuarticModel::evaluate(double * modelCoefficients, double x) const {

View File

@@ -8,15 +8,13 @@ namespace Regression {
class QuarticModel : public Model {
public:
QuarticModel() : m_expression(nullptr) {}
using Model::Model;
Poincare::ExpressionLayout * layout() 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;
int numberOfCoefficients() const override { return 5; }
private:
Poincare::Expression * m_expression;
};
}

View File

@@ -33,10 +33,6 @@ ExpressionLayout * TrigonometricModel::layout() {
}
Expression * TrigonometricModel::simplifiedExpression(double * modelCoefficients, Poincare::Context * context) {
if (m_expression != nullptr) {
delete m_expression;
m_expression = nullptr;
}
double a = modelCoefficients[0];
double b = modelCoefficients[1];
double c = modelCoefficients[2];
@@ -53,9 +49,9 @@ Expression * TrigonometricModel::simplifiedExpression(double * modelCoefficients
false);
Expression * asinExpression = new Multiplication(aExpression, sinExpression, false);
Expression * dExpression = new Decimal(d);
m_expression = new Addition(asinExpression, dExpression, false);
Expression::Simplify(&m_expression, *context);
return m_expression;
Expression * result = new Addition(asinExpression, dExpression, false);
Expression::Simplify(&result, *context);
return result;
}
double TrigonometricModel::evaluate(double * modelCoefficients, double x) const {

View File

@@ -8,15 +8,13 @@ namespace Regression {
class TrigonometricModel : public Model {
public:
TrigonometricModel() : m_expression(nullptr) {}
using Model::Model;
Poincare::ExpressionLayout * layout() 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;
int numberOfCoefficients() const override { return 4; }
private:
Poincare::Expression * m_expression;
};
}