{
 "name": "Desk illuminance in a real office: physics calibrated and corrected by memory, against calibrated physics alone and a learned model",
 "registered": "2026-10-10",
 "data": {
  "source": "IEA EBC Annex 81 sub-hourly datasets, dataset 5: LBNL FLEXLAB XR cells A and B, 9 Jul - 11 Aug 2020 (Mendeley Data 10.17632/xztfbtsgys.3, CC BY 4.0)",
  "root": "[path redacted]",
  "split": "split.py, run before any value was read: development = cell A, external and setpoints before 2020-08-01; sealed = everything from 2020-08-01 and all of cell B",
  "sha256": {
   "dev/ds5-cella-state.csv": "5a91b3a7e55de61bfce41f162505496aefee64d97bb2602e32acc6070c57f059",
   "dev/ds5-external.csv": "68c5705d4c711404759cdd6224ee89ed7a8f680d4bc6aaedcf3b9001b6bdff2e",
   "sealed/ds5-cella-state-from-aug.csv": "34cc9da855b1f54754a814eda4aff509ffc64bacbef38a3f92ee74b924094afd",
   "sealed/ds5-external-from-aug.csv": "6a7f2bee92b8a70240312e29f9ef90943cd7c0dbaa0881706931eafcc88da0b8",
   "sealed/ds5-cellb-state-from-aug.csv": "7f35474dfed0fc04a7603f31709241573479c155080c98e61416738f7552c163",
   "data/annex81/6_datasets.zip": "393c5c5d106d1597e0a059ea43b799d7d2e58baf74a6388beb256c46f2400fe8"
  }
 },
 "items": "10-minute means of the six desk illuminance sensors, steps with the sun above 5 degrees (pvlib, site 37.8755 N, 122.2525 W) and no missing value in any column; time stamps are America/Los_Angeles",
 "holdouts": {
  "H1_days": {
   "what": "cell A, 1-11 Aug 2020: days nobody here has read",
   "state": "sealed/ds5-cella-state-from-aug.csv",
   "external": "sealed/ds5-external-from-aug.csv"
  },
  "H2_room": {
   "what": "cell B, 1-11 Aug 2020: the mirror-image twin room, never read; everything fitted on cell A, desk k of B predicted from desk k of A",
   "state": "sealed/ds5-cellb-state-from-aug.csv",
   "external": "sealed/ds5-external-from-aug.csv"
  }
 },
 "arms": {
  "physics_prior": "daylight backend of livingworlds/map (daylight coefficients, CIE general sky by Perez clearness, radiosity) with the typical values in FREE, plus electric light",
  "calibrated_physics": "the same with its 12 free parameters fitted by least squares on all development steps of cell A; electric light = per-desk lux per lighting watt from cell A's July switching steps",
  "learned": "per desk, histogram gradient boosting (300 iterations, rate 0.05, seed 0) on global, diffuse and direct irradiance, sun altitude and azimuth, log Perez clearness and lighting power, trained on all development steps of cell A",
  "living_worlds": "calibrated physics plus memory: for each step, the mean residual (measured - calibrated physics) of the k development steps nearest in sun altitude/10, azimuth/20, log clearness and global irradiance/200, plus (days apart / tau_days) squared"
 },
 "model": {
  "tau_days": 8.0,
  "k": 20
 },
 "selection": "tau_days and k chosen on two development folds of cell A (check 25-31 Jul, check 9-15 Jul) among tau in {1, 2, 4, 8} and k in {10, 20, 40}; tau 8 k 20 gave 44.8 and 40.4 lux against calibrated physics 100.6 and 46.0 and learned 50.0 and 63.8",
 "metric": "RMSE in lux over all desks and steps of a holdout (validate.score of livingworlds/map, which refuses a holdout used for fitting); reported floor = 5% of the mean measured illuminance (sensor accuracy class), for reading only",
 "bar": {
  "on": "H1_days",
  "rule": "living_worlds RMSE lower than calibrated_physics RMSE AND lower than learned RMSE on H1_days. H2_room is reported with the same two comparisons and is not part of the bar."
 },
 "procedure": "flexlab.py run protocol.json, once, as a capped unit on [host name redacted]; results-flexlab.json is committed whatever it says",
 "results": "results-flexlab.json",
 "code": {
  "map": "livingworlds/map ccb7bdaf2b655508eb553849ac2c44248f78d2f7 (livingworlds_map/backends/daylight.py)",
  "engine": "experiment/light/flexlab.py and this file, at the commit that adds this protocol"
 },
 "amendment": "2026-10-10, before any sealed value was read: the first run stopped at the hash check because split.py printed hashes before its output files were flushed, so two sealed hashes in the registration were of partly written files. The sealed files were last written at the split (11:15:20 CEST) and set read-only then. Re-splitting the original download (sha256 393c5c5d...) with the files closed gives exactly the files on disk; those hashes replace the two wrong ones. Nothing else changes."
}