Skip to content

Commit 9885199

Browse files
committed
website update
1 parent 7d75eb7 commit 9885199

29 files changed

Lines changed: 1750 additions & 206 deletions

AGENTS.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,8 @@ Implementation rules for agents:
190190
- Do not silently replace one viewer system with another without also updating docs, tests, and architectural notes.
191191
- If you touch axis placement, time-depth direction, cube-attached labels, or camera semantics, read `docs/dev/cube_viewer_invariants.md` first and keep those invariants aligned.
192192
- Fire-plot work must preserve separation between event geometry generation, climate/event data fusion, and rendering backend.
193+
- Prefer `FireEventDaily` and `FireHull` as the canonical fire/VASE object model; keep legacy names such as `TimeHull` only as compatibility aliases unless the task explicitly removes them.
194+
- Prefer cube-compatible outputs when possible. If a hull-to-cube or environment-attribution step is incomplete, expose a narrow documented API with a clear limitation instead of hiding the gap inside plotting code.
193195
- Do not claim fire_plot is fully migrated unless rendering actually runs through the custom cube-viewer path.
194196
- Do not update screenshots/docs only while leaving contradictory code behavior.
195197
- Do not change coordinate conventions without updating `docs/dev/cube_viewer_invariants.md` and relevant tests together.

README.md

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ update your code to use the new package name.
1212

1313
![Tests](https://github.com/CU-ESIIL/cubedynamics/actions/workflows/tests.yml/badge.svg) ![Docs](https://github.com/CU-ESIIL/cubedynamics/actions/workflows/pages.yml/badge.svg)
1414

15-
CubeDynamics: a composable grammar of operations for spatiotemporal data cubes.
15+
CubeDynamics: a grammar of streaming environmental computation.
1616

17-
CubeDynamics is a Python framework for analyzing environmental data as **spatiotemporal cubes**, rather than disconnected maps and time series.
17+
CubeDynamics is a Python framework for computing on environmental data streams through **spatiotemporal cubes**, rather than treating storage, retrieval, and visualization as the main product.
1818

1919
It is designed for scientists and data practitioners who want to reason explicitly about **space, time, scale, and events**—and to do so reproducibly and efficiently, even for large datasets.
2020

21+
Scientists and AI agents use the same streaming interface, so workflows can be explored interactively, scripted, or orchestrated programmatically without switching mental models.
22+
2123

2224

2325

@@ -39,6 +41,14 @@ Yet most workflows break these dimensions apart:
3941

4042
CubeDynamics keeps **space and time together**, making spatiotemporal structure a first-class part of the analysis.
4143

44+
Most neighboring tools answer:
45+
46+
> How do I store, query, or retrieve a cube?
47+
48+
CubeDynamics answers:
49+
50+
> How do I compute on a stream of environmental data?
51+
4252
---
4353

4454
## What CubeDynamics enables
@@ -49,6 +59,15 @@ CubeDynamics keeps **space and time together**, making spatiotemporal structure
4959
- **Event- and hull-based workflows** (fires, droughts, phenology)
5060
- **Integrated visualization** of space–time structure
5161

62+
Fire events now follow a clearer object model built around:
63+
64+
- `FireEventDaily` for canonical FIRED-like daily event geometry
65+
- `FireHull` for the derived fire-time hull / VASE geometry
66+
67+
The intent is to keep FIRED ingestion, hull geometry, environmental attribution,
68+
cube conversion, and visualization separable so fire workflows remain part of
69+
the same composable cube grammar as the rest of CubeDynamics.
70+
5271
---
5372

5473
## Minimal example

docs/capabilities/fire-vase.md

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
# Fire VASE / FireHull
2+
3+
CubeDynamics treats FIRED fire events as spatiotemporal objects, not just a list of polygons or a one-off plot. The fire/VASE workflow turns daily perimeters into a time-stacked hull that can participate in the same cube-centered grammar used elsewhere in the library.
4+
5+
## Core objects
6+
7+
### `FireEventDaily`
8+
9+
`FireEventDaily` is the canonical daily fire event object.
10+
11+
It stores:
12+
13+
- `event_id`
14+
- `gdf` with daily perimeter geometry
15+
- `t0` / `t1`
16+
- `centroid_lat` / `centroid_lon`
17+
18+
Useful entry points:
19+
20+
```python
21+
from cubedynamics.fire_time_hull import FireEventDaily
22+
23+
event = FireEventDaily.example()
24+
event = FireEventDaily.from_fired(fired_daily, event_id=12345)
25+
```
26+
27+
### `FireHull`
28+
29+
`FireHull` is the canonical fire-time hull / VASE object.
30+
31+
It stores triangulated geometry and time metadata:
32+
33+
- `verts_km`
34+
- `tris`
35+
- `t_days_vert`
36+
- `t_norm_vert`
37+
- `metrics`
38+
39+
It exposes object methods aligned with CubeDynamics design principles:
40+
41+
```python
42+
hull = event.to_hull()
43+
hull.metrics()
44+
hull.to_mesh()
45+
hull.to_cube(template_cube)
46+
hull.attach_environment(cube, variables=["vpd"])
47+
hull.plot(color="vpd")
48+
```
49+
50+
`TimeHull` remains available as a compatibility alias, but `FireHull` is the preferred public name going forward.
51+
52+
## Minimal runnable example
53+
54+
```python
55+
from cubedynamics.fire_time_hull import FireEventDaily
56+
57+
event = FireEventDaily.example()
58+
hull = event.to_hull(n_ring_samples=24, n_theta=16)
59+
60+
print(hull.metrics())
61+
mesh = hull.to_mesh()
62+
print(mesh["verts_km"].shape, mesh["tris"].shape)
63+
```
64+
65+
For a complete lightweight example that does not require live FIRED downloads, see [Synthetic fire/VASE recipe](../recipes/fire_vase_synthetic.md).
66+
67+
## Metrics available now
68+
69+
Stable metric names currently include:
70+
71+
- `duration_days`
72+
- `scale_km`
73+
- `footprint_area_peak_km2`
74+
- `footprint_area_final_km2`
75+
- `hull_volume_km2_days`
76+
- `hull_surface_km_day`
77+
78+
Legacy aliases retained for compatibility:
79+
80+
- `days`
81+
- `volume_km2_days`
82+
- `surface_km_day`
83+
84+
These metrics are geometric summaries of the hull. They are not yet a complete ecological or dynamical taxonomy.
85+
86+
## Environmental attribution
87+
88+
The scientific direction is:
89+
90+
```python
91+
hull + environment -> explanatory fire manifold
92+
```
93+
94+
The current first implementation is `FireHull.attach_environment(...)`, which stores per-variable `HullClimateSummary` objects keyed by variable name:
95+
96+
```python
97+
hull_with_env = hull.attach_environment(cube, variables=["vpd"], method="nearest")
98+
fig = hull_with_env.plot(color="vpd")
99+
```
100+
101+
This is intentionally modest but now mesh-aware. It stores:
102+
103+
- the original summary-level `HullClimateSummary`
104+
- per-layer values aligned to hull time slices
105+
- per-vertex values aligned explicitly to the mesh
106+
107+
It does not yet store a fully local `(x, y, t)` field sampled independently at every hull vertex.
108+
109+
## Cube compatibility
110+
111+
`FireHull.to_cube(template_cube)` returns a boolean occupancy cube aligned to a supplied template grid.
112+
113+
Why a template is required:
114+
115+
- CubeDynamics prefers explicit coordinate semantics.
116+
- The hull itself does not yet define a standalone canonical occupancy grid.
117+
- Requiring a template keeps the conversion predictable and composable.
118+
119+
## Current limitations
120+
121+
- The fire-specific interactive hull viewer still uses Plotly.
122+
- `FireHull.to_cube()` requires a template cube.
123+
- `attach_environment()` currently supports `method="nearest"` only.
124+
- Environmental attribution is summary-level, not yet full local hull-element attribution.
125+
- FIRED ingestion, hull geometry, attribution, and rendering are clearer than before, but not fully separated into independent public submodules yet.

docs/concepts/index.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
# Concepts Overview
22

3-
This section answers: **How does the cube grammar represent space, time, and operations?** Use it to align on terminology before picking verbs, datasets, or recipes.
3+
This section answers: **How does the CubeDynamics computation model represent space, time, and operations?** Use it to align on terminology before picking verbs, datasets, or recipes.
4+
5+
CubeDynamics is not another storage layer or another visualization package. It is a grammar of streaming environmental computation built to sit above many data systems.
46

57
In this section you'll find:
6-
- How the cube grammar keeps dimensions explicit across a pipeline.
8+
- How the streaming-first grammar keeps dimensions explicit across a pipeline.
79
- The relationship between cubes, pipes, verbs, and VirtualCubes.
810
- Pointers to glossary terms and comparisons to other libraries.
911

@@ -18,6 +20,8 @@ Key links:
1820
## Cube grammar pipeline
1921
CubeDynamics expresses analysis as a sequence of verbs connected by pipes, operating on explicit cube dimensions. This grammar keeps space, time, and scale visible throughout a workflow and ensures that intermediate steps remain inspectable.
2022

23+
Scientists and AI agents can both reason about the same pipeline because the abstraction is intentionally small and explicit.
24+
2125
![Cube grammar pipeline](../assets/diagrams/cube_grammar_pipeline.png)
2226

2327
## Dimensions stay explicit
@@ -26,10 +30,10 @@ At its core, CubeDynamics works with xarray-backed DataArrays but applies strong
2630
- metadata about resolution, alignment, and scale
2731
- consistency enforced across operations
2832

29-
The goal is to avoid hidden assumptions about where operations run. Dimensions are visible and intentional, making workflows easier to reason about and share.
33+
The goal is to avoid hidden assumptions about where operations run. Dimensions are visible and intentional, making workflows easier to reason about, share, and orchestrate.
3034

3135
## Streaming via VirtualCubes
32-
Environmental datasets are often too large to load into memory. VirtualCubes represent a cube without materializing it and stream chunks through analysis pipelines. Code stays the same whether you stream or work in memory, so scale becomes a configuration choice.
36+
Environmental datasets are often too large to load into memory. VirtualCubes represent a cube without materializing it and stream chunks through analysis pipelines. Code stays the same whether you stream or work in memory, so scale becomes a configuration choice rather than a rewrite.
3337

3438
## Pipes and verbs
3539
Instead of chaining methods, you compose verbs with `pipe(...)` to build declarative workflows:
@@ -40,7 +44,7 @@ from cubedynamics import pipe, verbs as v
4044
pipe(cube) | v.mean() | v.rolling() | v.plot()
4145
```
4246

43-
Pipelines remain inspectable objects, making it straightforward to debug, document, or extend analyses.
47+
Pipelines remain inspectable objects, making it straightforward to debug, document, extend analyses, or hand the same workflow to an agent.
4448

4549
## Read next
4650
- [Getting Started](../quickstart.md)

0 commit comments

Comments
 (0)