diff --git a/apps/graph/cartesian_function_store.cpp b/apps/graph/cartesian_function_store.cpp index 341ead7be..98af7af7c 100644 --- a/apps/graph/cartesian_function_store.cpp +++ b/apps/graph/cartesian_function_store.cpp @@ -15,9 +15,10 @@ Ion::Storage::Record::ErrorStatus CartesianFunctionStore::addEmptyModel() { return error; } -void CartesianFunctionStore::setMemoizedModelAtIndex(int cacheIndex, Ion::Storage::Record record) const { +ExpressionModelHandle * CartesianFunctionStore::setMemoizedModelAtIndex(int cacheIndex, Ion::Storage::Record record) const { assert(cacheIndex >= 0 && cacheIndex < maxNumberOfMemoizedModels()); m_functions[cacheIndex] = CartesianFunction(record); + return &m_functions[cacheIndex]; } ExpressionModelHandle * CartesianFunctionStore::memoizedModelAtIndex(int cacheIndex) const { diff --git a/apps/graph/cartesian_function_store.h b/apps/graph/cartesian_function_store.h index f2ff11601..365de72ab 100644 --- a/apps/graph/cartesian_function_store.h +++ b/apps/graph/cartesian_function_store.h @@ -16,7 +16,7 @@ public: private: Ion::Storage::Record::ErrorStatus addEmptyModel() override; const char * modelExtension() const override { return Ion::Storage::funcExtension; } - void setMemoizedModelAtIndex(int cacheIndex, Ion::Storage::Record record) const override; + Shared::ExpressionModelHandle * setMemoizedModelAtIndex(int cacheIndex, Ion::Storage::Record record) const override; Shared::ExpressionModelHandle * memoizedModelAtIndex(int cacheIndex) const override; mutable Shared::CartesianFunction m_functions[k_maxNumberOfMemoizedModels]; }; diff --git a/apps/sequence/sequence_store.cpp b/apps/sequence/sequence_store.cpp index 6f9ca7dfa..5e70ee688 100644 --- a/apps/sequence/sequence_store.cpp +++ b/apps/sequence/sequence_store.cpp @@ -47,9 +47,14 @@ int SequenceStore::sequenceIndexForName(char name) { return 0; } -void SequenceStore::setMemoizedModelAtIndex(int cacheIndex, Ion::Storage::Record record) const { +Shared::ExpressionModelHandle * SequenceStore::setMemoizedModelAtIndex(int cacheIndex, Ion::Storage::Record record) const { assert(cacheIndex >= 0 && cacheIndex < maxNumberOfMemoizedModels()); - m_sequences[cacheIndex] = Sequence(record); + int index = cacheIndex; + if (!record.isNull()) { + index = SequenceStore::sequenceIndexForName(record.fullName()[0]); + } + m_sequences[index] = Sequence(record); + return &m_sequences[index]; } Shared::ExpressionModelHandle * SequenceStore::memoizedModelAtIndex(int cacheIndex) const { diff --git a/apps/sequence/sequence_store.h b/apps/sequence/sequence_store.h index 9528fd419..5f5a27a4b 100644 --- a/apps/sequence/sequence_store.h +++ b/apps/sequence/sequence_store.h @@ -32,9 +32,16 @@ public: private: const char * modelExtension() const override { return Ion::Storage::seqExtension; } - /* We don't really use model memoization as the number of Sequence is limited - * and we keep enough Sequences to store them all. */ - void setMemoizedModelAtIndex(int cacheIndex, Ion::Storage::Record record) const override; + /* We don't use model memoization for two reasons: + * - the number of Sequence is capped so we keep enough Sequences to store them all. + * - evaluating sequences require to evaluate all of them at the same time + * (as they might be co-dependent) which doesn't suit our ring memoization. + * To still make it work with the ExpressionModelStore, we force + * setMemoizedModelAtIndex to store u, v and w sequences in this order in + * m_sequences whatever the value of cacheIndex. We thus return a + * ExpressionModelHandle pointer after setting the model as it won't be the + * memoized model at cacheIndex. */ + Shared::ExpressionModelHandle * setMemoizedModelAtIndex(int cacheIndex, Ion::Storage::Record record) const override; Shared::ExpressionModelHandle * memoizedModelAtIndex(int cacheIndex) const override; mutable Sequence m_sequences[MaxNumberOfSequences]; }; diff --git a/apps/shared/expression_model_store.cpp b/apps/shared/expression_model_store.cpp index eee7cb969..8ba25529c 100644 --- a/apps/shared/expression_model_store.cpp +++ b/apps/shared/expression_model_store.cpp @@ -21,8 +21,7 @@ ExpressionModelHandle * ExpressionModelStore::privateModelForRecord(Ion::Storage return memoizedModelAtIndex(i); } } - setMemoizedModelAtIndex(m_oldestMemoizedIndex, record); - ExpressionModelHandle * result = memoizedModelAtIndex(m_oldestMemoizedIndex); + ExpressionModelHandle * result = setMemoizedModelAtIndex(m_oldestMemoizedIndex, record); m_oldestMemoizedIndex = (m_oldestMemoizedIndex+1) % maxNumberOfMemoizedModels(); return result; } diff --git a/apps/shared/expression_model_store.h b/apps/shared/expression_model_store.h index 31b93dd3f..2cf45424d 100644 --- a/apps/shared/expression_model_store.h +++ b/apps/shared/expression_model_store.h @@ -43,7 +43,7 @@ protected: ExpressionModelHandle * privateModelForRecord(Ion::Storage::Record record) const; private: void resetMemoizedModelsExceptRecord(const Ion::Storage::Record record = Ion::Storage::Record()) const; - virtual void setMemoizedModelAtIndex(int cacheIndex, Ion::Storage::Record) const = 0; + virtual ExpressionModelHandle * setMemoizedModelAtIndex(int cacheIndex, Ion::Storage::Record) const = 0; virtual ExpressionModelHandle * memoizedModelAtIndex(int cacheIndex) const = 0; virtual const char * modelExtension() const = 0; /* Memoization of k_maxNumberOfMemoizedModels. When the required model is not diff --git a/apps/solver/equation_store.cpp b/apps/solver/equation_store.cpp index 9f2b75480..d083bb533 100644 --- a/apps/solver/equation_store.cpp +++ b/apps/solver/equation_store.cpp @@ -44,9 +44,10 @@ Ion::Storage::Record::ErrorStatus EquationStore::addEmptyModel() { return Ion::Storage::sharedStorage()->createRecordWithExtension(name, Ion::Storage::eqExtension, nullptr, 0); } -void EquationStore::setMemoizedModelAtIndex(int cacheIndex, Ion::Storage::Record record) const { +Shared::ExpressionModelHandle * EquationStore::setMemoizedModelAtIndex(int cacheIndex, Ion::Storage::Record record) const { assert(cacheIndex >= 0 && cacheIndex < maxNumberOfMemoizedModels()); m_equations[cacheIndex] = Equation(record); + return &m_equations[cacheIndex]; } ExpressionModelHandle * EquationStore::memoizedModelAtIndex(int cacheIndex) const { diff --git a/apps/solver/equation_store.h b/apps/solver/equation_store.h index 70737f088..b1a1bf717 100644 --- a/apps/solver/equation_store.h +++ b/apps/solver/equation_store.h @@ -81,7 +81,7 @@ private: const char * modelExtension() const override { return Ion::Storage::eqExtension; } /* We don't really use model memoization as the number of Equation is limited * and we keep enough Equations to store them all. */ - void setMemoizedModelAtIndex(int cacheIndex, Ion::Storage::Record record) const override; + Shared::ExpressionModelHandle * setMemoizedModelAtIndex(int cacheIndex, Ion::Storage::Record record) const override; Shared::ExpressionModelHandle * memoizedModelAtIndex(int cacheIndex) const override; Error resolveLinearSystem(Poincare::Expression solutions[k_maxNumberOfExactSolutions], Poincare::Expression solutionApproximations[k_maxNumberOfExactSolutions], Poincare::Expression coefficients[k_maxNumberOfEquations][Poincare::Expression::k_maxNumberOfVariables], Poincare::Expression constants[k_maxNumberOfEquations], Poincare::Context * context);