Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
1b7f288
Update README.md
VEZY Mar 18, 2026
e7c861c
Merge branch 'main' into multi-plants
VEZY May 3, 2026
75954d1
Add domain simulations with hard-domain targets and microclimate support
VEZY Jun 3, 2026
62b7878
Update docstrings and doc
VEZY Jun 3, 2026
2e274c3
Remove backward compatibility
VEZY Jun 3, 2026
236534e
Another large cleanup
VEZY Jun 4, 2026
06c909d
Use true PlantBiophysics models in the examples
VEZY Jun 4, 2026
287187c
Use two layers for the soil in maespa example
VEZY Jun 4, 2026
38eef0b
Update maespa_domain_example.jl
VEZY Jun 4, 2026
ef8d5d1
MAESPA example: make the model a bit more process-based + scene LAI a…
VEZY Jun 4, 2026
6f7663e
Auto-detect mapped variables between domains (not required in the use…
VEZY Jun 4, 2026
89f0971
Update maespa_domain_example.jl
VEZY Jun 4, 2026
26df6a5
Split Route types and route materialization into different scripts
VEZY Jun 4, 2026
82d881c
Remove all references to ModelList
VEZY Jun 5, 2026
b377c9c
Starting implementing the new scene API
VEZY Jun 5, 2026
c460928
Add producer application metadata and selector validation in Inputs.
VEZY Jun 6, 2026
0b4e5f4
Better error catching for Inputs
VEZY Jun 6, 2026
df679dc
Implements default scope inference for compiled scene/object dependen…
VEZY Jun 6, 2026
07e958a
Implements the remaining "Phase 5" mechanics
VEZY Jun 6, 2026
42106a3
Implements the goal of multi-plants and spatial (mutable) microclimate
VEZY Jun 13, 2026
6f52c7e
Remove Domain, SimulationMapping, Route, AllDomains, HardDomains, and…
VEZY Jun 13, 2026
4286cf1
First end-to-end implementation of the new API
VEZY Jun 18, 2026
21a1cd6
Add `add_organ!` again for an easier high-level function
VEZY Jun 18, 2026
2144f5e
Adapt past tests and doc to the new API
VEZY Jun 19, 2026
f168992
Adapt the graph editor to the new API
VEZY Jun 20, 2026
9c3ffad
Simplify examples in docs -> use defaults when possible
VEZY Jun 20, 2026
b8fde7d
Harden a bit more the API
VEZY Jun 20, 2026
26250d0
Fix benchmarks
VEZY Jun 21, 2026
8a3c52b
Delete runtests.jl
VEZY Jun 21, 2026
e8a0cc9
Simplify examples in docs -> use ModelList equivalent whenever possible
VEZY Jun 22, 2026
4e17d3b
Rename Scene into CompositeModel
VEZY Jun 22, 2026
18705b8
Remove `call_target` and only use `call_targets` so we always expect …
VEZY Jun 25, 2026
69b80cb
Avoiding manual updates of statuses in Maespa
VEZY Jun 25, 2026
846e31b
Make variables use mapping instead of being called by their their sta…
VEZY Jun 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,3 +75,51 @@ jobs:
using PlantSimEngine
DocMeta.setdocmeta!(PlantSimEngine, :DocTestSetup, :(using PlantSimEngine); recursive=true)
doctest(PlantSimEngine)
graph-editor-e2e:
name: Graph editor frontend and E2E
runs-on: ubuntu-latest
timeout-minutes: 30
permissions:
actions: write
contents: read
steps:
- uses: actions/checkout@v6
- uses: julia-actions/setup-julia@v3
with:
version: "1"
- uses: julia-actions/cache@v3
- name: Configure graph editor test environment
shell: julia --project=test --color=yes {0}
run: |
using Pkg
Pkg.develop(PackageSpec(path=pwd()))
Pkg.instantiate()
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
cache-dependency-path: frontend/package-lock.json
- name: Install frontend dependencies
working-directory: frontend
run: npm ci
- name: Check and build frontend
working-directory: frontend
run: |
npm run typecheck
npm test
npm run build
- name: Install Chromium
working-directory: frontend
run: npx playwright install --with-deps chromium
- name: Run graph editor end-to-end tests
working-directory: frontend
run: npm run test:e2e
- name: Upload Playwright report on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: graph-editor-playwright-report
path: |
frontend/playwright-report
frontend/test-results
if-no-files-found: ignore
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,7 @@ docs/Manifest.toml
test/Manifest.toml
docs/build/
benchmark/Manifest.toml
frontend
/frontend/node_modules/
/frontend/.vite/
/frontend/test-results/
/frontend/playwright-report/
473 changes: 177 additions & 296 deletions AGENTS.md

Large diffs are not rendered by default.

40 changes: 31 additions & 9 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,27 @@
# Changelog

## v0.15.0

### Breaking changes

- Hard dependencies now execute through
`run_call!(context::RunContext, name::Symbol; ...)`, which executes every
selector-resolved target and always returns a vector-like `CallTargets`
collection.
- The singular hard-call accessor and string-name hard-call methods were
removed. Use `only(call_targets(context, :name))` for fine-grained access to
a `One` dependency.
- Direct recursive dependency execution is no longer supported. Model kernels
must run inside a compiled `CompositeModel` and receive a `RunContext`.

### Added

- `CallTargets`, a cached `AbstractVector` view over compiled hard-call targets
that is allocation-free to retrieve.
- `run_call!(context, name)` for the common execute-all operation while
retaining `run_call!(target::CallTarget)` for selective, per-target, and
iterative control.

## v0.14.0

Changes in this section are based on the git history since [`v0.13.2`](https://github.com/VirtualPlantLab/PlantSimEngine.jl/releases/tag/v0.13.2), corresponding to the GitHub compare view for [`v0.14.0`](https://github.com/VirtualPlantLab/PlantSimEngine.jl/compare/v0.13.2...v0.14.0).
Expand All @@ -21,7 +43,7 @@ and substantially expands the documentation.
The main user-facing breaking change in this release is the move toward
`Symbol`-based scale names in mappings and multi-scale configuration. Code that
still uses string scales such as `"Leaf"` or `"Plant"` should be updated to use
symbols such as `:Leaf` and `:Plant`, especially in `ModelMapping(...)`,
symbols such as `:Leaf` and `:Plant`, especially in `PlantSimEngine.ModelMapping(...)`,
`MultiScaleModel(...)`, and explicit multi-rate bindings. `ModelList` is also on
the deprecation path in favor of `ModelMapping`, so this release is a good time
to migrate mapping code to the newer API.
Expand Down Expand Up @@ -77,12 +99,12 @@ to migrate mapping code to the newer API.

### Deprecated

- `run!(::ModelList, ...)` is deprecated. Use `run!(ModelMapping(...), ...)`
- `run!(::ModelList, ...)` is deprecated. Use `run!(PlantSimEngine.ModelMapping(...), ...)`
instead.
- `run!` with collections of `ModelList` is deprecated. Use collections of
`ModelMapping` instead.
- `run!(mtg, mapping::AbstractDict, ...)` is deprecated. Construct a
`ModelMapping(...)` first, or call `run!(mtg, ModelMapping(mapping), ...)`.
`PlantSimEngine.ModelMapping(...)` first, or call `run!(mtg, PlantSimEngine.ModelMapping(mapping), ...)`.
- String scale names are deprecated in multi-scale mapping APIs. Use `Symbol`
scales such as `:Leaf` instead of `"Leaf"`.
- `ModelList` remains available for now but is being phased out in favor of
Expand All @@ -93,7 +115,7 @@ to migrate mapping code to the newer API.
#### 1. Replace ad hoc mappings with `ModelMapping`

If you previously used `ModelList(...)` directly for single-scale runs, or a
plain `Dict` for MTG runs, migrate to `ModelMapping(...)`.
plain `Dict` for MTG runs, migrate to `PlantSimEngine.ModelMapping(...)`.

Before:

Expand All @@ -113,13 +135,13 @@ mapping = Dict(
After:

```julia
leaf = ModelMapping(
leaf = PlantSimEngine.ModelMapping(
process1 = Process1Model(),
process2 = Process2Model(),
status = (x = 1.0,),
)

mapping = ModelMapping(
mapping = PlantSimEngine.ModelMapping(
:Leaf => (ToyAssimModel(),),
:Plant => (ToyGrowthModel(),),
)
Expand All @@ -133,7 +155,7 @@ When a model should run at a cadence different from the meteo, wrap it in
Typical pattern:

```julia
mapping = ModelMapping(
mapping = PlantSimEngine.ModelMapping(
:Leaf => (
ModelSpec(HourlyLeafModel()) |> TimeStepModel(1.0),
),
Expand Down Expand Up @@ -180,7 +202,7 @@ If your mappings still use string scales, migrate them to symbols.
Before:

```julia
mapping = ModelMapping(
mapping = PlantSimEngine.ModelMapping(
"Leaf" => (ToyAssimModel(),),
)

Expand All @@ -191,7 +213,7 @@ MultiScaleModel([:A => "Leaf"])
After:

```julia
mapping = ModelMapping(
mapping = PlantSimEngine.ModelMapping(
:Leaf => (ToyAssimModel(),),
)

Expand Down
21 changes: 12 additions & 9 deletions Project.toml
Original file line number Diff line number Diff line change
@@ -1,34 +1,37 @@
name = "PlantSimEngine"
uuid = "9a576370-710b-4269-adf9-4f603a9c6423"
version = "0.14.0"
version = "0.15.0"
authors = ["Rémi Vezy <VEZY@users.noreply.github.com> and contributors"]

[deps]
AbstractTrees = "1520ce14-60c1-5f80-bbc7-55ef81b5835c"
CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
DataAPI = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a"
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
FLoops = "cc61a311-1640-44b5-9fba-1b764f453329"
InteractiveUtils = "b77e0a4c-d291-57a0-90e8-8db25a27a240"
JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
Markdown = "d6f4376e-aef5-505a-96c1-9c027394607a"
MultiScaleTreeGraph = "dd4a991b-8a45-4075-bede-262ee62d5583"
PlantMeteo = "4630fe09-e0fb-4da5-a846-781cb73437b6"
SHA = "ea8e919c-243c-51af-8825-aaa63cd721ce"
Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
Term = "22787eb5-b846-44ae-b979-8e399b8463ab"

[weakdeps]
HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3"

[extensions]
PlantSimEngineGraphEditorExt = "HTTP"

[compat]
AbstractTrees = "0.4"
CSV = "0.10"
DataAPI = "1.15"
DataFrames = "1"
Dates = "1.10"
FLoops = "0.2"
InteractiveUtils = "1.10"
JSON = "1.6.1"
HTTP = "1"
Markdown = "1.10"
MultiScaleTreeGraph = "0.15.1"
PlantMeteo = "0.8.2"
SHA = "0.7.0"
Statistics = "1.10"
Tables = "1"
Term = "2"
Expand Down
Loading
Loading