From 247dbb04c0cbd98e6091f389419d6452bf2ab7d3 Mon Sep 17 00:00:00 2001 From: Alan Garny Date: Wed, 22 Oct 2025 14:25:40 +1300 Subject: [PATCH 1/6] New version. --- VERSION.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION.txt b/VERSION.txt index 05de19166..9f0adfc11 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -0.20251017.0 +0.20251022.0 From 10f9086e40a9acd762de9523becbabb1a5324c07 Mon Sep 17 00:00:00 2001 From: Alan Garny Date: Tue, 21 Oct 2025 17:00:09 +1300 Subject: [PATCH 2/6] Tests: reorganised our miscellaneous tests. --- tests/CMakeLists.txt | 6 ++++-- tests/misc/{compiler/tests.cpp => compilertests.cpp} | 0 tests/misc/{compiler => }/tests.cmake | 6 +++--- 3 files changed, 7 insertions(+), 5 deletions(-) rename tests/misc/{compiler/tests.cpp => compilertests.cpp} (100%) rename tests/misc/{compiler => }/tests.cmake (88%) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 104d9383b..d304bd2b8 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -38,7 +38,7 @@ include(api/sed/tests.cmake) include(api/solver/tests.cmake) include(api/version/tests.cmake) -include(misc/compiler/tests.cmake) +include(misc/tests.cmake) include(support/cellml/tests.cmake) include(support/combine/tests.cmake) @@ -170,7 +170,9 @@ include_directories(${CMAKE_SOURCE_DIR}/src/misc foreach(TEST ${TESTS}) if(LIBOPENCOR_UNIT_TESTING) - if(NOT "${${TEST}_CATEGORY}" STREQUAL "") + if("${${TEST}_CATEGORY}" STREQUAL "") + set(TEST_CATEGORY) + else() set(TEST_CATEGORY "${${TEST}_CATEGORY}_") endif() diff --git a/tests/misc/compiler/tests.cpp b/tests/misc/compilertests.cpp similarity index 100% rename from tests/misc/compiler/tests.cpp rename to tests/misc/compilertests.cpp diff --git a/tests/misc/compiler/tests.cmake b/tests/misc/tests.cmake similarity index 88% rename from tests/misc/compiler/tests.cmake rename to tests/misc/tests.cmake index 30f88984a..0537c7fdf 100644 --- a/tests/misc/compiler/tests.cmake +++ b/tests/misc/tests.cmake @@ -12,11 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(TEST compiler) +set(TEST misc) list(APPEND TESTS ${TEST}) -set(${TEST}_CATEGORY misc) +set(${TEST}_CATEGORY) set(${TEST}_SOURCE_FILES - ${CMAKE_CURRENT_LIST_DIR}/tests.cpp + ${CMAKE_CURRENT_LIST_DIR}/compilertests.cpp ) From 13556a423a3fb0172decc0127e062ab95e4d5a2c Mon Sep 17 00:00:00 2001 From: Alan Garny Date: Tue, 21 Oct 2025 17:01:24 +1300 Subject: [PATCH 3/6] Tests: added a test for a failing simulation. --- tests/misc/failingsimulationtests.cpp | 50 ++++++++++++++++++++++++++ tests/misc/res/tt04.omex | Bin 0 -> 17242 bytes tests/misc/tests.cmake | 1 + 3 files changed, 51 insertions(+) create mode 100644 tests/misc/failingsimulationtests.cpp create mode 100644 tests/misc/res/tt04.omex diff --git a/tests/misc/failingsimulationtests.cpp b/tests/misc/failingsimulationtests.cpp new file mode 100644 index 000000000..0c2a8e6b0 --- /dev/null +++ b/tests/misc/failingsimulationtests.cpp @@ -0,0 +1,50 @@ +/* +Copyright libOpenCOR contributors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +#include "tests/utils.h" + +#include + +TEST(FailingSimulationTest, basic) +{ + // Default simulation. + + auto file = libOpenCOR::File::create(libOpenCOR::resourcePath("../misc/res/tt04.omex")); + auto document = libOpenCOR::SedDocument::create(file); + auto instance = document->instantiate(); + + instance->run(); + + EXPECT_FALSE(instance->hasIssues()); + + // Set the value of `membrane.test` to zero and rerun the simulation. + + auto model = document->model(0); + + model->addChange(libOpenCOR::SedChangeAttribute::create("membrane", "test", "0.0")); + + instance->run(); + + EXPECT_TRUE(instance->hasIssues()); + + // Remove all changes and rerun the simulation. + + model->removeAllChanges(); + + instance->run(); + + EXPECT_FALSE(instance->hasIssues()); +} diff --git a/tests/misc/res/tt04.omex b/tests/misc/res/tt04.omex new file mode 100644 index 0000000000000000000000000000000000000000..6ee337ac90a637e87c8718f8423269753f05683f GIT binary patch literal 17242 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 literal 0 HcmV?d00001 diff --git a/tests/misc/tests.cmake b/tests/misc/tests.cmake index 0537c7fdf..5336fe44d 100644 --- a/tests/misc/tests.cmake +++ b/tests/misc/tests.cmake @@ -19,4 +19,5 @@ list(APPEND TESTS ${TEST}) set(${TEST}_CATEGORY) set(${TEST}_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/compilertests.cpp + ${CMAKE_CURRENT_LIST_DIR}/failingsimulationtests.cpp ) From 456c0b76fb5217d340e9035089a3ca4d3a777128 Mon Sep 17 00:00:00 2001 From: Alan Garny Date: Tue, 21 Oct 2025 17:27:49 +1300 Subject: [PATCH 4/6] SedInstanceTask: some minor cleaning up. --- src/sed/sedinstancetask.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sed/sedinstancetask.cpp b/src/sed/sedinstancetask.cpp index 387611acb..0d07ddbb2 100644 --- a/src/sed/sedinstancetask.cpp +++ b/src/sed/sedinstancetask.cpp @@ -219,7 +219,7 @@ double SedInstanceTask::Impl::run() auto startTime = std::chrono::high_resolution_clock::now(); // (Re)initialise our model. - // Note: reinitialise our model in case we are running our model multiple times. + // Note: reinitialise our model because we initialised it when we created the instance task. initialise(); From bc8c99fff0d499c8362862e0561a6f3c2afb194b Mon Sep 17 00:00:00 2001 From: Alan Garny Date: Tue, 21 Oct 2025 17:39:17 +1300 Subject: [PATCH 5/6] SedInstanceTask: some minor improvement. Makes maintenance easier and less error prone (with regards to our call to `applyChanges()`). --- src/sed/sedinstancetask.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/sed/sedinstancetask.cpp b/src/sed/sedinstancetask.cpp index 0d07ddbb2..2c551f755 100644 --- a/src/sed/sedinstancetask.cpp +++ b/src/sed/sedinstancetask.cpp @@ -161,9 +161,17 @@ void SedInstanceTask::Impl::initialise() #else mRuntime->initialiseVariablesForDifferentialModel()(mStates, mRates, mConstants, mComputedConstants, mAlgebraic); #endif + } else { +#ifdef __EMSCRIPTEN__ + mRuntime->initialiseVariablesForAlgebraicModel(mConstants, mComputedConstants, mAlgebraic); +#else + mRuntime->initialiseVariablesForAlgebraicModel()(mConstants, mComputedConstants, mAlgebraic); +#endif + } - applyChanges(); + applyChanges(); + if (mSedUniformTimeCourse != nullptr) { #ifdef __EMSCRIPTEN__ mRuntime->computeComputedConstantsForDifferentialModel(mStates, mRates, mConstants, mComputedConstants, mAlgebraic); mRuntime->computeRates(mVoi, mStates, mRates, mConstants, mComputedConstants, mAlgebraic); @@ -174,14 +182,6 @@ void SedInstanceTask::Impl::initialise() mRuntime->computeVariablesForDifferentialModel()(mVoi, mStates, mRates, mConstants, mComputedConstants, mAlgebraic); #endif } else { -#ifdef __EMSCRIPTEN__ - mRuntime->initialiseVariablesForAlgebraicModel(mConstants, mComputedConstants, mAlgebraic); -#else - mRuntime->initialiseVariablesForAlgebraicModel()(mConstants, mComputedConstants, mAlgebraic); -#endif - - applyChanges(); - #ifdef __EMSCRIPTEN__ mRuntime->computeComputedConstantsForAlgebraicModel(mConstants, mComputedConstants, mAlgebraic); mRuntime->computeVariablesForAlgebraicModel(mConstants, mComputedConstants, mAlgebraic); From 47c8ede00875d8b185aed07af765c030cbc194b4 Mon Sep 17 00:00:00 2001 From: Alan Garny Date: Wed, 22 Oct 2025 11:45:06 +1300 Subject: [PATCH 6/6] Tests: make sure that our failing simulation test passes. --- src/sed/sedinstance.cpp | 14 ++++++++++++++ src/sed/sedinstance_p.h | 1 + tests/misc/failingsimulationtests.cpp | 9 +++------ 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/sed/sedinstance.cpp b/src/sed/sedinstance.cpp index b402f3045..146297f36 100644 --- a/src/sed/sedinstance.cpp +++ b/src/sed/sedinstance.cpp @@ -67,6 +67,10 @@ SedInstance::Impl::Impl(const SedDocumentPtr &pDocument) } } } + + // Keep track of the issues of all the tasks. + + mTasksIssues = mIssues; } else { addError("The simulation experiment description does not contain any tasks to run."); } @@ -74,6 +78,12 @@ SedInstance::Impl::Impl(const SedDocumentPtr &pDocument) double SedInstance::Impl::run() { + // Reset iourselves. + + removeAllIssues(); + + mIssues = mTasksIssues; + // Run all the tasks associated with this instance unless they have some issues. auto res = 0.0; @@ -84,6 +94,10 @@ double SedInstance::Impl::run() if (task->hasIssues()) { addIssues(task); + + // Reset the issues of the task so that they are not reported again should the instance be run again. + + task->pimpl()->removeAllIssues(); } } } diff --git a/src/sed/sedinstance_p.h b/src/sed/sedinstance_p.h index 4b5dbc183..7260ac1ea 100644 --- a/src/sed/sedinstance_p.h +++ b/src/sed/sedinstance_p.h @@ -26,6 +26,7 @@ class SedInstance::Impl: public Logger::Impl { public: SedInstanceTaskPtrs mTasks; + IssuePtrs mTasksIssues; static SedInstancePtr create(const SedDocumentPtr &pDocument); diff --git a/tests/misc/failingsimulationtests.cpp b/tests/misc/failingsimulationtests.cpp index 0c2a8e6b0..73edd599d 100644 --- a/tests/misc/failingsimulationtests.cpp +++ b/tests/misc/failingsimulationtests.cpp @@ -26,8 +26,7 @@ TEST(FailingSimulationTest, basic) auto document = libOpenCOR::SedDocument::create(file); auto instance = document->instantiate(); - instance->run(); - + EXPECT_NE(instance->run(), 0.0); EXPECT_FALSE(instance->hasIssues()); // Set the value of `membrane.test` to zero and rerun the simulation. @@ -36,15 +35,13 @@ TEST(FailingSimulationTest, basic) model->addChange(libOpenCOR::SedChangeAttribute::create("membrane", "test", "0.0")); - instance->run(); - + EXPECT_EQ(instance->run(), 0.0); EXPECT_TRUE(instance->hasIssues()); // Remove all changes and rerun the simulation. model->removeAllChanges(); - instance->run(); - + EXPECT_NE(instance->run(), 0.0); EXPECT_FALSE(instance->hasIssues()); }