ALLSHIFT/CLAUDE.md
robert 702647d84e Updated the parameter names contained within the matlab controller david1606
TBD: parameters outside the controller, parameters contained on the old parameter doc
2026-09-11 13:05:38 +00:00

112 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## What this repository is
ALLSHIFT is Team SHIFT's single shared repository (TU/e student team; an AI-managed hospital
hydrogen microgrid, Beth Israel Deaconess Boston as the case). It is public on Gitea
(`git.teamshiftenergy.com/pepe/ALLSHIFT`). Four kinds of content live side by side:
- `docs/` — the documentation hub. Every project document exists here as a markdown report;
`docs/README.md` is the index and ends with the project-wide open-questions list. Retired
material goes to `superseded/` with a stated reason.
- `Shift Matlab Drive/` — a mirror of the team's MATLAB Drive: Simulink models and raw data.
The Simulink work belongs to the Simulations cluster (see
`docs/04-simulations/simulink-model-inventory.md`; the live framework needs R2026a). No
Python goes here.
- `website/` — the public Astro site, with its own `website/CLAUDE.md` and `pnpm` commands.
No Python goes here either.
- Root `pyproject.toml` + `uv.lock` — the one pinned Python environment for every cluster.
Cluster code lives in top-level folders registered as uv workspace members; `AICONTROL/`
(AI & Control cluster) is the first.
## Commands (from the repository root)
```bash
uv sync # create/refresh .venv from uv.lock (Python 3.12; ~1.3 GB, torch included)
uv run pytest # all tests (pytest testpaths = AICONTROL/tests)
uv run pytest AICONTROL/tests/test_spaces.py::test_action_space_and_shedding_level # one test
uv run python -m aicontrol.env.spaces # print the current observation/action layout as a table
uv lock # after editing dependencies; commit the updated uv.lock
```
Adding a dependency: edit `dependencies` in the root `pyproject.toml`, run `uv lock`, commit
`uv.lock`. Adding a cluster folder: give it its own `pyproject.toml` (hatchling,
`packages = [...]`), add the folder to `[tool.uv.workspace] members`, and add its package name
to the root `dependencies` and to `[tool.uv.sources]` as `{ workspace = true }`.
Website: `cd website && pnpm dev | pnpm build | pnpm preview` — details in `website/CLAUDE.md`.
## Architecture
### Clusters and the three handovers
The team leader's *Project Manual* (not in the repo) fixes four clusters and exactly three
written handovers between them:
1. **Energy Management → Simulations:** the Parameter Book (a spreadsheet of every rating and
efficiency, versioned) and the clean 5-minute BIDMC dataset with Tier 1 / 2 / 3 load
assigned, as Parquet.
2. **Simulations → AI:** a Gymnasium environment. Simulations owns everything inside `step()`
— the twin's physics, the KPI calculator, and the benchmark controllers (rule-based, MPC on
forecasts, perfect knowledge; Pyomo + HiGHS). AI owns everything outside it: the agent, the
safety layer, evaluation, dashboard. Written jointly early in Q2, frozen before Christmas.
3. **AI → Business:** one results file, one row per controller × scenario × run, Parquet with a
CSV beside it.
Fixed by the manual, not up for local decision: 5-minute timestep (105,120 steps per year); a
full simulated year must run in under a minute; Boston with ISO New England prices and carbon;
Tier 1 load is never shed; reward weights are agreed across clusters and never tuned by code.
### `AICONTROL/` — the AI & Control cluster package
- Everything is built from `AICONTROL/configs/env.yaml`, so the joint session with Simulations
can change a number without touching code. Values marked `PLACEHOLDER` there (plant sizes,
load bound, reward weights) are stand-ins owned by other clusters; keep the marker until the
owning cluster confirms a value.
- `aicontrol/env/spaces.py` is the single source of the interface shape. `observation_slots(cfg)`
defines the flat 64-value observation in order (calendar 4, present-state 12, forecasts
= quantities × horizons × quantiles = 48); `build_action_space` gives a `Box(4)`: `u_ele`
[0, 1], `u_fc` [0, 1], `u_batt` [1, 1] with positive = discharge, `shed` [0, 2] rounded by
`shedding_level()` because Stable-Baselines3 cannot mix continuous and discrete actions.
Names follow the Simulator I/O sheet (`P_PV`, `SoC`, `H2_level`, `p_tank`, `price`,
`CO2_int`, `grid_on`).
- `AICONTROL/docs/interface-draft.md` is the handover document; keep its tables in step with
`spaces.py` (regenerate the observation table with `describe()`).
- The placeholder environment (next: `aicontrol/env/placeholder.py`) exposes exactly these
spaces with toy physics. It never gets better physics and is deleted the day the twin runs.
Do not build a competing simulator in this folder.
- Planned subpackages: `forecast/`, `train/`, `evaluate/`, `safety/`, `dashboard/`. Tooling is
fixed by the manual: LightGBM / scikit-learn / Optuna for forecasting, Gymnasium +
Stable-Baselines3 for RL, Weights & Biases for logging (not MLflow), SHAP + Streamlit.
### Documentation conventions
- A markdown report of a non-markdown source opens with a provenance table (Source, Format,
MD5, Status, Report generated). Reconstructed tables are labelled as such; observations that
go beyond the source are attributed to the audit, not the author.
- `docs/02-specifications/` is owned by the AI cluster. The RL state / action / reward
documents there are superseded by the manual's interface list but kept for the rationale
behind individual terms.
- `docs/01-project/ai-control-cluster-plan-2026-2027.md` is the AI cluster's plan: seats,
Q1 week by week, later blocks, open items for the leader.
## Data: what actually exists
Under `Shift Matlab Drive/Shift Matlab Drive/Energy_Managment/`: hospital load is the NREL
ComStock building `89993-0.parquet` (2018, 15-minute, simulated; `MA_hourly_load.csv` is a
mis-named numerical twin of it). Weather is NSRDB 2019, hourly, timestamps in UTC. PV is a
PVWatts 4 kW typical-year run that aligns with neither. There is no price, carbon-intensity,
outage or measured-load series. `hospital_communication_energy_system.csv` is synthetic noise;
derive nothing from it. Provenance and licences: `docs/06-data/dataset-inventory.md`.
## Things to know
- Formats: machine-made tables are Parquet, hand-written settings are YAML, documents are
Markdown.
- `.venv/`, `wandb/` run folders and `**/data/raw/` are gitignored; `uv sync` rebuilds the
environment from `uv.lock` on any machine.
- `website/CLAUDE.md` embeds live third-party keys that are due for rotation; do not copy them
anywhere.
- `Interview Questions-*.md` at the root is personal recruitment data, gitignored on purpose.