diff --git a/apps/regression/app.cpp b/apps/regression/app.cpp index de483ded2..9331fdefc 100644 --- a/apps/regression/app.cpp +++ b/apps/regression/app.cpp @@ -27,7 +27,6 @@ App::Snapshot::Snapshot() : m_rangeVersion(0), m_selectedSeriesIndex(-1) { - assert(m_previousModelsVersions[0] == 0); } App * App::Snapshot::unpack(Container * container) { @@ -35,10 +34,8 @@ App * App::Snapshot::unpack(Container * container) { } void App::Snapshot::reset() { - m_store.deleteAllPairs(); + m_store.reset(); m_modelVersion = 0; - assert(sizeof(m_previousModelsVersions) == sizeof(uint32_t) * GraphController::sNumberOfMemoizedModelVersions); - memset(m_previousModelsVersions, 0, sizeof(m_previousModelsVersions)); m_rangeVersion = 0; setActiveTab(0); } diff --git a/apps/regression/app.h b/apps/regression/app.h index f697d4a49..2c529af77 100644 --- a/apps/regression/app.h +++ b/apps/regression/app.h @@ -30,7 +30,7 @@ public: int * graphSelectedDotIndex() { return &m_graphSelectedDotIndex; } int * selectedSeriesIndex() { return &m_selectedSeriesIndex; } uint32_t * modelVersion() { return &m_modelVersion; } - uint32_t * previousModelsVersions() { return m_previousModelsVersions; } + uint32_t * previousModelsVersions() { return m_store.seriesChecksum(); } uint32_t * rangeVersion() { return &m_rangeVersion; } private: void tidy() override; @@ -38,7 +38,6 @@ public: Shared::CurveViewCursor m_cursor; int m_graphSelectedDotIndex; uint32_t m_modelVersion; - uint32_t m_previousModelsVersions[GraphController::sNumberOfMemoizedModelVersions]; uint32_t m_rangeVersion; int m_selectedSeriesIndex; }; diff --git a/apps/regression/graph_controller.cpp b/apps/regression/graph_controller.cpp index afa38abfe..b6b54aaf1 100644 --- a/apps/regression/graph_controller.cpp +++ b/apps/regression/graph_controller.cpp @@ -352,7 +352,8 @@ uint32_t GraphController::modelVersion() { } uint32_t GraphController::modelVersionAtIndex(size_t i) { - return m_store->seriesChecksumAtIndex(i); + assert(i < numberOfMemoizedVersions()); + return *(m_store->seriesChecksum() + i); } uint32_t GraphController::rangeVersion() { diff --git a/apps/regression/graph_controller.h b/apps/regression/graph_controller.h index 6d434f500..30e722552 100644 --- a/apps/regression/graph_controller.h +++ b/apps/regression/graph_controller.h @@ -16,7 +16,6 @@ namespace Regression { class GraphController : public Shared::InteractiveCurveViewController { public: - static constexpr size_t sNumberOfMemoizedModelVersions = Store::k_numberOfSeries; GraphController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, ButtonRowController * header, Store * store, Shared::CurveViewCursor * cursor, uint32_t * modelVersion, uint32_t * previousModelsVersions, uint32_t * rangeVersion, int * selectedDotIndex, int * selectedSeriesIndex); ViewController * initialisationParameterController() override; bool isEmpty() const override; @@ -46,7 +45,7 @@ private: uint32_t modelVersion() override; uint32_t modelVersionAtIndex(size_t i) override; uint32_t rangeVersion() override; - size_t numberOfMemoizedVersions() const override { return sNumberOfMemoizedModelVersions; } + size_t numberOfMemoizedVersions() const override { return Store::k_numberOfSeries; } int selectedCurveIndex() const override { return *m_selectedSeriesIndex; } bool closestCurveIndexIsSuitable(int newIndex, int currentIndex) const override; Poincare::Coordinate2D xyValues(int curveIndex, double x, Poincare::Context * context) const override; diff --git a/apps/regression/store.cpp b/apps/regression/store.cpp index 0afd7941a..98f703bd5 100644 --- a/apps/regression/store.cpp +++ b/apps/regression/store.cpp @@ -19,13 +19,14 @@ static_assert(Store::k_numberOfSeries == 3, "Number of series changed, Regressio Store::Store() : InteractiveCurveViewRange(), DoublePairStore(), - m_seriesChecksum{0, 0, 0}, m_angleUnit(Poincare::Preferences::AngleUnit::Degree) { - for (int i = 0; i < k_numberOfSeries; i++) { - m_regressionTypes[i] = Model::Type::Linear; - m_regressionChanged[i] = false; - } + resetMemoization(); +} + +void Store::reset() { + deleteAllPairs(); + resetMemoization(); } void Store::tidy() { @@ -188,6 +189,13 @@ double Store::doubleCastedNumberOfPairsOfSeries(int series) const { return DoublePairStore::numberOfPairsOfSeries(series); } +void Store::resetMemoization() { + assert(((int)Model::Type::Linear) == 0); + memset(m_seriesChecksum, 0, sizeof(m_seriesChecksum)); + memset(m_regressionTypes, 0, sizeof(m_regressionTypes)); + memset(m_regressionChanged, 0, sizeof(m_regressionChanged)); +} + float Store::maxValueOfColumn(int series, int i) const { float maxColumn = -FLT_MAX; for (int k = 0; k < numberOfPairsOfSeries(series); k++) { diff --git a/apps/regression/store.h b/apps/regression/store.h index 757ed2b95..2cc6f600f 100644 --- a/apps/regression/store.h +++ b/apps/regression/store.h @@ -22,6 +22,7 @@ class Store : public Shared::InteractiveCurveViewRange, public Shared::DoublePai public: Store(); + void reset(); // Clean pool void tidy(); @@ -35,10 +36,7 @@ public: assert((int)m_regressionTypes[series] >= 0 && (int)m_regressionTypes[series] < Model::k_numberOfModels); return regressionModel((int)m_regressionTypes[series]); } - uint32_t seriesChecksumAtIndex(size_t i) { - assert(i < k_numberOfSeries); - return m_seriesChecksum[i]; - } + uint32_t * seriesChecksum() { return m_seriesChecksum; } // Dots /* Return the closest dot to abscissa x above the regression curve if @@ -74,6 +72,7 @@ public: double squaredCorrelationCoefficient(int series) const; private: constexpr static float k_displayHorizontalMarginRatio = 0.05f; + void resetMemoization(); float maxValueOfColumn(int series, int i) const; //TODO LEA why float ? float minValueOfColumn(int series, int i) const; //TODO LEA why float ? Model * regressionModel(int index);