mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-24 16:20:49 +01:00
[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:
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;};
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user