From 9a950a86ff8a879e010a7509fe6126aafa5330d4 Mon Sep 17 00:00:00 2001 From: Stefano Furi Date: Mon, 19 Jan 2026 12:40:47 +0100 Subject: [PATCH 01/29] feat!: add a reactive engine (#5066) # Conflicts: # .github/workflows/build-and-deploy.yml # .github/workflows/update-ancillary-files.yml # CHANGELOG.md # dokka-cache/ch.qos.logback/logback-classic/1.5.21.list # dokka-cache/ch.qos.logback/logback-classic/1.5.22.list # dokka-cache/ch.qos.logback/logback-classic/1.5.26.list # dokka-cache/de.flapdoodle.embed/de.flapdoodle.embed.mongo/4.21.0.list # dokka-cache/de.flapdoodle.embed/de.flapdoodle.embed.mongo/4.22.0.list # dokka-cache/de.flapdoodle.embed/de.flapdoodle.embed.mongo/4.24.0.list # dokka-cache/it.unibo.alchemist/alchemist-api/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-api/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-api/42.3.32.list # dokka-cache/it.unibo.alchemist/alchemist-cognitive-agents/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-cognitive-agents/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-cognitive-agents/42.3.32.list # dokka-cache/it.unibo.alchemist/alchemist-composeui/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-composeui/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-composeui/42.3.32.list # dokka-cache/it.unibo.alchemist/alchemist-engine/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-engine/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-engine/42.3.32.list # dokka-cache/it.unibo.alchemist/alchemist-euclidean-geometry/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-euclidean-geometry/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-euclidean-geometry/42.3.32.list # dokka-cache/it.unibo.alchemist/alchemist-full/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-full/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-full/42.3.32.list # dokka-cache/it.unibo.alchemist/alchemist-graphql-surrogates/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-graphql-surrogates/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-graphql-surrogates/42.3.32.list # dokka-cache/it.unibo.alchemist/alchemist-graphql/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-graphql/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-graphql/42.3.32.list # dokka-cache/it.unibo.alchemist/alchemist-implementationbase/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-implementationbase/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-implementationbase/42.3.32.list # dokka-cache/it.unibo.alchemist/alchemist-incarnation-biochemistry/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-incarnation-biochemistry/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-incarnation-biochemistry/42.3.32.list # dokka-cache/it.unibo.alchemist/alchemist-incarnation-protelis/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-incarnation-protelis/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-incarnation-protelis/42.3.32.list # dokka-cache/it.unibo.alchemist/alchemist-incarnation-sapere/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-incarnation-sapere/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-incarnation-sapere/42.3.32.list # dokka-cache/it.unibo.alchemist/alchemist-loading/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-loading/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-loading/42.3.32.list # dokka-cache/it.unibo.alchemist/alchemist-maintenance-tooling/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-maintenance-tooling/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-maintenance-tooling/42.3.32.list # dokka-cache/it.unibo.alchemist/alchemist-maps/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-maps/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-maps/42.3.32.list # dokka-cache/it.unibo.alchemist/alchemist-physics/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-physics/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-physics/42.3.32.list # dokka-cache/it.unibo.alchemist/alchemist-sapere-mathexp/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-sapere-mathexp/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-sapere-mathexp/42.3.32.list # dokka-cache/it.unibo.alchemist/alchemist-smartcam/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-smartcam/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-smartcam/42.3.32.list # dokka-cache/it.unibo.alchemist/alchemist-swingui/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-swingui/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-swingui/42.3.32.list # dokka-cache/it.unibo.alchemist/alchemist-test/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-test/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-test/42.3.32.list # dokka-cache/it.unibo.alchemist/alchemist-ui-tooling/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-ui-tooling/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-ui-tooling/42.3.32.list # dokka-cache/it.unibo.alchemist/alchemist-web-renderer/42.3.18.list # dokka-cache/it.unibo.alchemist/alchemist-web-renderer/42.3.22.list # dokka-cache/it.unibo.alchemist/alchemist-web-renderer/42.3.32.list # gradle/libs.versions.toml # package-lock.json # package.json # settings.gradle.kts # Conflicts: # alchemist-engine/src/main/kotlin/it/unibo/alchemist/core/Engine.kt # Conflicts: # alchemist-api/build.gradle.kts # alchemist-implementationbase/src/main/kotlin/it/unibo/alchemist/model/environments/AbstractEnvironment.kt # alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/loader/LoadingSystem.kt --- .idea/inspectionProfiles/Project_Default.xml | 4 + alchemist-api/build.gradle.kts | 1 + .../it/unibo/alchemist/model/Condition.java | 24 +- .../it/unibo/alchemist/model/Actionable.kt | 15 + .../it/unibo/alchemist/model/Environment.kt | 34 ++ .../kotlin/it/unibo/alchemist/model/Node.kt | 31 + .../model/observation/DerivedObservable.kt | 98 ++++ .../alchemist/model/observation/Disposable.kt | 21 + .../model/observation/EventObservable.kt | 35 ++ .../alchemist/model/observation/Observable.kt | 227 ++++++++ .../model/observation/ObservableExtensions.kt | 343 +++++++++++ .../model/observation/ObservableList.kt | 267 +++++++++ .../model/observation/ObservableMap.kt | 252 ++++++++ .../model/observation/ObservableSet.kt | 232 ++++++++ .../model/observation/ObservableListTest.kt | 247 ++++++++ .../model/observation/ObservableMapTest.kt | 129 +++++ .../model/observation/ObservableSetTest.kt | 181 ++++++ .../model/observation/ObservableTest.kt | 541 ++++++++++++++++++ .../it/unibo/alchemist/core/AbstractEngine.kt | 371 ++++++++++++ .../kotlin/it/unibo/alchemist/core/Engine.kt | 343 +---------- .../it/unibo/alchemist/core/ReactiveEngine.kt | 116 ++++ .../alchemist/core/AbstractDependencyTest.kt | 85 +++ .../alchemist/core/AbstractEngineTest.kt | 75 +++ .../alchemist/core/TestDependencyGraph.kt | 114 +--- .../alchemist/core/TestEngineComparison.kt | 146 +++++ .../core/TestEngineImplementation.kt | 12 + .../core/TestReactiveDependencies.kt | 46 ++ .../core/TestReactiveEngineImplementation.kt | 12 + .../alchemist/core/util/DependencyUtils.kt | 94 +++ .../model/conditions/AbstractCondition.java | 107 +++- .../conditions/ConcentrationChanged.java | 46 +- .../conditions/MoleculeHasConcentration.java | 13 +- .../model/linkingrules/AdaptiveRange.java | 3 +- .../model/linkingrules/ClosestN.java | 2 +- .../model/reactions/AbstractReaction.java | 179 ++++-- .../model/reactions/ChemicalReaction.java | 2 +- ...tractNonPropensityContributingCondition.kt | 4 +- .../model/conditions/ContainsMolecule.kt | 11 +- .../conditions/NeighborHasConcentration.kt | 54 ++ .../conditions/NoOtherReactionCanExecute.kt | 17 +- .../model/environments/AbstractEnvironment.kt | 167 +++++- .../alchemist/model/nodes/GenericNode.kt | 32 +- .../conditions/AbstractNeighborCondition.java | 64 ++- .../conditions/BiomolPresentInEnv.java | 74 ++- .../conditions/BiomolPresentInNeighbor.java | 60 +- .../biochemistry/conditions/EnvPresent.java | 18 +- .../conditions/GenericMoleculePresent.java | 52 +- .../conditions/GenericMoleculeUnderLevel.java | 41 +- .../conditions/JunctionPresentInCell.java | 38 +- .../conditions/NeighborhoodPresent.java | 20 +- .../conditions/TensionPresent.java | 101 ++-- .../environments/BioRect2DEnvironment.java | 2 +- .../model/biochemistry/CellProperty.kt | 91 +-- .../model/biochemistry/properties/Cell.kt | 4 +- .../biochemistry/properties/CircularCell.kt | 4 +- .../properties/CircularDeformableCell.kt | 4 +- .../TestNeighborhoodReactionsPropensities.kt | 6 +- .../ComputationalRoundComplete.java | 26 +- .../model/incarnations/ProtelisIncarnation.kt | 11 + .../protelis/actions/RunProtelisProgram.kt | 18 +- .../alchemist/model/sapere/ILsaNode.java | 6 + .../conditions/LsaNeighborhoodCondition.java | 48 +- .../conditions/LsaStandardCondition.java | 23 +- .../alchemist/model/sapere/nodes/LsaNode.java | 103 ++-- .../sapere/reactions/SAPEREGradient.java | 31 +- .../sapere/reactions/SAPEREReaction.java | 8 +- .../model/scafi/actions/RunScafiProgram.scala | 11 +- .../ScafiComputationalRoundComplete.scala | 1 + alchemist-loading/build.gradle.kts | 1 - .../boundary/loader/LoadingSystem.kt | 8 +- .../test/TestReactiveEngineLoading.kt | 41 ++ .../LinkNodesWithinRoutingRange.java | 3 +- .../model/physics/reactions/PhysicsUpdate.kt | 47 +- .../alchemist/test/GlobalTestReaction.kt | 18 + build.gradle.kts | 3 + run_all_tests_reactive.sh | 2 + 76 files changed, 4832 insertions(+), 889 deletions(-) create mode 100644 alchemist-api/src/main/kotlin/it/unibo/alchemist/model/observation/DerivedObservable.kt create mode 100644 alchemist-api/src/main/kotlin/it/unibo/alchemist/model/observation/Disposable.kt create mode 100644 alchemist-api/src/main/kotlin/it/unibo/alchemist/model/observation/EventObservable.kt create mode 100644 alchemist-api/src/main/kotlin/it/unibo/alchemist/model/observation/Observable.kt create mode 100644 alchemist-api/src/main/kotlin/it/unibo/alchemist/model/observation/ObservableExtensions.kt create mode 100644 alchemist-api/src/main/kotlin/it/unibo/alchemist/model/observation/ObservableList.kt create mode 100644 alchemist-api/src/main/kotlin/it/unibo/alchemist/model/observation/ObservableMap.kt create mode 100644 alchemist-api/src/main/kotlin/it/unibo/alchemist/model/observation/ObservableSet.kt create mode 100644 alchemist-api/src/test/kotlin/it/unibo/alchemist/model/observation/ObservableListTest.kt create mode 100644 alchemist-api/src/test/kotlin/it/unibo/alchemist/model/observation/ObservableMapTest.kt create mode 100644 alchemist-api/src/test/kotlin/it/unibo/alchemist/model/observation/ObservableSetTest.kt create mode 100644 alchemist-api/src/test/kotlin/it/unibo/alchemist/model/observation/ObservableTest.kt create mode 100644 alchemist-engine/src/main/kotlin/it/unibo/alchemist/core/AbstractEngine.kt create mode 100644 alchemist-engine/src/main/kotlin/it/unibo/alchemist/core/ReactiveEngine.kt create mode 100644 alchemist-engine/src/test/kotlin/it/unibo/alchemist/core/AbstractDependencyTest.kt create mode 100644 alchemist-engine/src/test/kotlin/it/unibo/alchemist/core/AbstractEngineTest.kt create mode 100644 alchemist-engine/src/test/kotlin/it/unibo/alchemist/core/TestEngineComparison.kt create mode 100644 alchemist-engine/src/test/kotlin/it/unibo/alchemist/core/TestEngineImplementation.kt create mode 100644 alchemist-engine/src/test/kotlin/it/unibo/alchemist/core/TestReactiveDependencies.kt create mode 100644 alchemist-engine/src/test/kotlin/it/unibo/alchemist/core/TestReactiveEngineImplementation.kt create mode 100644 alchemist-engine/src/test/kotlin/it/unibo/alchemist/core/util/DependencyUtils.kt create mode 100644 alchemist-implementationbase/src/main/kotlin/it/unibo/alchemist/model/conditions/NeighborHasConcentration.kt create mode 100644 alchemist-loading/src/test/kotlin/it/unibo/alchemist/test/TestReactiveEngineLoading.kt create mode 100755 run_all_tests_reactive.sh diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 7bee31df84..8dce9e5fbf 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -5,6 +5,10 @@