diff --git a/apps/regression/app.cpp b/apps/regression/app.cpp index 783b86fdd..c964d55ce 100644 --- a/apps/regression/app.cpp +++ b/apps/regression/app.cpp @@ -47,6 +47,7 @@ App::Descriptor * App::Snapshot::descriptor() { void App::Snapshot::tidy() { m_store.setDelegate(nullptr); + m_store.tidy(); } App::App(Container * container, Snapshot * snapshot) : diff --git a/apps/regression/model/cubic_model.cpp b/apps/regression/model/cubic_model.cpp index 66752cd1d..a1c90448b 100644 --- a/apps/regression/model/cubic_model.cpp +++ b/apps/regression/model/cubic_model.cpp @@ -9,8 +9,7 @@ using namespace Shared; namespace Regression { LayoutReference CubicModel::layout() { - static LayoutReference layout; - if (layout.isUninitialized()) { + if (m_layout.isUninitialized()) { const LayoutReference layoutChildren[] = { CharLayoutRef('a', KDText::FontSize::Small), CharLayoutRef(Ion::Charset::MiddleDot, KDText::FontSize::Small), @@ -34,9 +33,9 @@ LayoutReference CubicModel::layout() { CharLayoutRef('+', KDText::FontSize::Small), CharLayoutRef('d', KDText::FontSize::Small), }; - layout = HorizontalLayoutRef(layoutChildren, 15); + m_layout = HorizontalLayoutRef(layoutChildren, 15); } - return layout; + return m_layout; } Expression CubicModel::simplifiedExpression(double * modelCoefficients, Poincare::Context * context) { diff --git a/apps/regression/model/exponential_model.cpp b/apps/regression/model/exponential_model.cpp index 7572a31f8..7030e18a8 100644 --- a/apps/regression/model/exponential_model.cpp +++ b/apps/regression/model/exponential_model.cpp @@ -7,8 +7,7 @@ using namespace Poincare; namespace Regression { LayoutReference ExponentialModel::layout() { - static LayoutReference layout; - if (layout.isUninitialized()) { + if (m_layout.isUninitialized()) { const LayoutReference layoutChildren[] = { CharLayoutRef('a', KDText::FontSize::Small), CharLayoutRef(Ion::Charset::MiddleDot, KDText::FontSize::Small), @@ -22,9 +21,9 @@ LayoutReference ExponentialModel::layout() { VerticalOffsetLayoutNode::Type::Superscript ) }; - layout = HorizontalLayoutRef(layoutChildren, 4); + m_layout = HorizontalLayoutRef(layoutChildren, 4); } - return layout; + return m_layout; } double ExponentialModel::evaluate(double * modelCoefficients, double x) const { diff --git a/apps/regression/model/linear_model.cpp b/apps/regression/model/linear_model.cpp index 7e4674628..f8dbe2b8b 100644 --- a/apps/regression/model/linear_model.cpp +++ b/apps/regression/model/linear_model.cpp @@ -8,8 +8,7 @@ using namespace Poincare; namespace Regression { LayoutReference LinearModel::layout() { - static LayoutReference layout; - if (layout.isUninitialized()) { + if (m_layout.isUninitialized()) { const LayoutReference layoutChildren[] = { CharLayoutRef('a', KDText::FontSize::Small), CharLayoutRef(Ion::Charset::MiddleDot, KDText::FontSize::Small), @@ -17,9 +16,9 @@ LayoutReference LinearModel::layout() { CharLayoutRef('+', KDText::FontSize::Small), CharLayoutRef('b', KDText::FontSize::Small), }; - layout = HorizontalLayoutRef(layoutChildren, 5); + m_layout = HorizontalLayoutRef(layoutChildren, 5); } - return layout; + return m_layout; } double LinearModel::evaluate(double * modelCoefficients, double x) const { diff --git a/apps/regression/model/logarithmic_model.cpp b/apps/regression/model/logarithmic_model.cpp index 5fece554d..4cec75544 100644 --- a/apps/regression/model/logarithmic_model.cpp +++ b/apps/regression/model/logarithmic_model.cpp @@ -8,8 +8,7 @@ using namespace Poincare; namespace Regression { LayoutReference LogarithmicModel::layout() { - static LayoutReference layout; - if (layout.isUninitialized()) { + if (m_layout.isUninitialized()) { const LayoutReference layoutChildren[] = { CharLayoutRef('a', KDText::FontSize::Small), CharLayoutRef(Ion::Charset::MiddleDot, KDText::FontSize::Small), @@ -21,9 +20,9 @@ LayoutReference LogarithmicModel::layout() { CharLayoutRef('+', KDText::FontSize::Small), CharLayoutRef('b', KDText::FontSize::Small) }; - layout = HorizontalLayoutRef(layoutChildren, 9); + m_layout = HorizontalLayoutRef(layoutChildren, 9); } - return layout; + return m_layout; } double LogarithmicModel::evaluate(double * modelCoefficients, double x) const { diff --git a/apps/regression/model/logistic_model.cpp b/apps/regression/model/logistic_model.cpp index e22ff63ef..76d3c0cf1 100644 --- a/apps/regression/model/logistic_model.cpp +++ b/apps/regression/model/logistic_model.cpp @@ -7,8 +7,7 @@ using namespace Poincare; namespace Regression { LayoutReference LogisticModel::layout() { - static LayoutReference layout; - if (layout.isUninitialized()) { + if (m_layout.isUninitialized()) { const LayoutReference exponentLayoutChildren[] = { CharLayoutRef('-', KDText::FontSize::Small), CharLayoutRef('b', KDText::FontSize::Small), @@ -26,12 +25,12 @@ LayoutReference LogisticModel::layout() { VerticalOffsetLayoutNode::Type::Superscript ) }; - layout = FractionLayoutRef( + m_layout = FractionLayoutRef( CharLayoutRef('c', KDText::FontSize::Small), HorizontalLayoutRef(layoutChildren, 6) ); } - return layout; + return m_layout; } double LogisticModel::evaluate(double * modelCoefficients, double x) const { diff --git a/apps/regression/model/model.cpp b/apps/regression/model/model.cpp index 129eb6083..0015e6e27 100644 --- a/apps/regression/model/model.cpp +++ b/apps/regression/model/model.cpp @@ -11,6 +11,10 @@ using namespace Shared; namespace Regression { +void Model::tidy() { + m_layout = LayoutReference(); +} + double Model::levelSet(double * modelCoefficients, double xMin, double step, double xMax, double y, Poincare::Context * context) { Expression yExpression = Decimal(y); PoincareHelpers::Simplify(&yExpression, *context); diff --git a/apps/regression/model/model.h b/apps/regression/model/model.h index fb8619d25..d9dfcde59 100644 --- a/apps/regression/model/model.h +++ b/apps/regression/model/model.h @@ -26,6 +26,8 @@ public: static constexpr int k_maxNumberOfCoefficients = 5; // This has to verify: k_maxNumberOfCoefficients < Matrix::k_maxNumberOfCoefficients virtual ~Model() = default; virtual Poincare::LayoutReference layout() = 0; + // Reinitialize m_layout to empty the pool + void tidy(); // simplifiedExpression is overrided only by Models that override levelSet virtual Poincare::Expression simplifiedExpression(double * modelCoefficients, Poincare::Context * context) { return Poincare::Expression(); } virtual I18n::Message formulaMessage() const = 0; @@ -37,6 +39,7 @@ public: protected: // Fit virtual bool dataSuitableForFit(Store * store, int series) const; + Poincare::LayoutReference m_layout; private: // Model attributes virtual double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const = 0; diff --git a/apps/regression/model/power_model.cpp b/apps/regression/model/power_model.cpp index 31b4ef1a6..559ad6d97 100644 --- a/apps/regression/model/power_model.cpp +++ b/apps/regression/model/power_model.cpp @@ -8,8 +8,7 @@ using namespace Poincare; namespace Regression { LayoutReference PowerModel::layout() { - static LayoutReference layout; - if (layout.isUninitialized()) { + if (m_layout.isUninitialized()) { const LayoutReference layoutChildren[] = { CharLayoutRef('a', KDText::FontSize::Small), CharLayoutRef(Ion::Charset::MiddleDot, KDText::FontSize::Small), @@ -19,9 +18,9 @@ LayoutReference PowerModel::layout() { VerticalOffsetLayoutNode::Type::Superscript ), }; - layout = HorizontalLayoutRef(layoutChildren, 4); + m_layout = HorizontalLayoutRef(layoutChildren, 4); } - return layout; + return m_layout; } double PowerModel::evaluate(double * modelCoefficients, double x) const { diff --git a/apps/regression/model/quadratic_model.cpp b/apps/regression/model/quadratic_model.cpp index d3f533ae0..03b7c73d6 100644 --- a/apps/regression/model/quadratic_model.cpp +++ b/apps/regression/model/quadratic_model.cpp @@ -9,8 +9,7 @@ using namespace Shared; namespace Regression { LayoutReference QuadraticModel::layout() { - static LayoutReference layout; - if (layout.isUninitialized()) { + if (m_layout.isUninitialized()) { const LayoutReference layoutChildren[] = { CharLayoutRef('a', KDText::FontSize::Small), CharLayoutRef(Ion::Charset::MiddleDot, KDText::FontSize::Small), @@ -26,9 +25,9 @@ LayoutReference QuadraticModel::layout() { CharLayoutRef('+', KDText::FontSize::Small), CharLayoutRef('c', KDText::FontSize::Small), }; - layout = HorizontalLayoutRef(layoutChildren, 10); + m_layout = HorizontalLayoutRef(layoutChildren, 10); } - return layout; + return m_layout; } Expression QuadraticModel::simplifiedExpression(double * modelCoefficients, Poincare::Context * context) { diff --git a/apps/regression/model/quartic_model.cpp b/apps/regression/model/quartic_model.cpp index 601f00e7a..97022fa5b 100644 --- a/apps/regression/model/quartic_model.cpp +++ b/apps/regression/model/quartic_model.cpp @@ -9,8 +9,7 @@ using namespace Shared; namespace Regression { LayoutReference QuarticModel::layout() { - static LayoutReference layout; - if (layout.isUninitialized()) { + if (m_layout.isUninitialized()) { const LayoutReference layoutChildren[] = { CharLayoutRef('a', KDText::FontSize::Small), CharLayoutRef(Ion::Charset::MiddleDot, KDText::FontSize::Small), @@ -42,9 +41,9 @@ LayoutReference QuarticModel::layout() { CharLayoutRef('+', KDText::FontSize::Small), CharLayoutRef('e', KDText::FontSize::Small), }; - layout = HorizontalLayoutRef(layoutChildren, 20); + m_layout = HorizontalLayoutRef(layoutChildren, 20); } - return layout; + return m_layout; } Expression QuarticModel::simplifiedExpression(double * modelCoefficients, Poincare::Context * context) { diff --git a/apps/regression/model/trigonometric_model.cpp b/apps/regression/model/trigonometric_model.cpp index 3b1280599..95e427a4a 100644 --- a/apps/regression/model/trigonometric_model.cpp +++ b/apps/regression/model/trigonometric_model.cpp @@ -10,8 +10,7 @@ using namespace Shared; namespace Regression { LayoutReference TrigonometricModel::layout() { - static LayoutReference layout; - if (layout.isUninitialized()) { + if (m_layout.isUninitialized()) { const LayoutReference layoutChildren[] = { CharLayoutRef('a', KDText::FontSize::Small), CharLayoutRef(Ion::Charset::MiddleDot, KDText::FontSize::Small), @@ -28,9 +27,9 @@ LayoutReference TrigonometricModel::layout() { CharLayoutRef('+', KDText::FontSize::Small), CharLayoutRef('d', KDText::FontSize::Small) }; - layout = HorizontalLayoutRef(layoutChildren, 14); + m_layout = HorizontalLayoutRef(layoutChildren, 14); } - return layout; + return m_layout; } Expression TrigonometricModel::simplifiedExpression(double * modelCoefficients, Poincare::Context * context) { diff --git a/apps/regression/store.cpp b/apps/regression/store.cpp index 61e893f74..af0ba6edd 100644 --- a/apps/regression/store.cpp +++ b/apps/regression/store.cpp @@ -28,6 +28,12 @@ Store::Store() : } } +void Store::tidy() { + for (int i = 0; i < Model::k_numberOfModels; i++) { + regressionModel(i)->tidy(); + } +} + /* Regressions */ void Store::setSeriesRegressionType(int series, Model::Type type) { assert(series >= 0 && series < k_numberOfSeries); diff --git a/apps/regression/store.h b/apps/regression/store.h index 72ff6a390..81e5350bc 100644 --- a/apps/regression/store.h +++ b/apps/regression/store.h @@ -22,6 +22,9 @@ class Store : public Shared::InteractiveCurveViewRange, public Shared::DoublePai public: Store(); + // Clean pool + void tidy(); + // Regression void setSeriesRegressionType(int series, Model::Type type); Model::Type seriesRegressionType(int series) {