@photivra/engine 2.18.0 → 2.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/CHANGELOG.md +179 -1
  2. package/CITATION.cff +1 -1
  3. package/NODE_SUPPORT.md +7 -5
  4. package/README.md +6 -6
  5. package/SECURITY.md +1 -1
  6. package/THIRD_PARTY.md +14 -10
  7. package/dist/capture/dng-lens-correction-opcodes.d.ts +32 -0
  8. package/dist/capture/dng-lens-correction-opcodes.js +119 -0
  9. package/dist/capture/dng-lens-correction-opcodes.js.map +1 -0
  10. package/dist/capture/focus-control.js +2 -75
  11. package/dist/capture/focus-control.js.map +1 -1
  12. package/dist/capture/native-environment-lean.d.ts +1 -0
  13. package/dist/capture/native-environment-lean.js +2 -6
  14. package/dist/capture/native-environment-lean.js.map +1 -1
  15. package/dist/capture/native-environment-optical-stage.d.ts +1 -0
  16. package/dist/capture/native-environment-optical-stage.js +2 -5
  17. package/dist/capture/native-environment-optical-stage.js.map +1 -1
  18. package/dist/capture/native-environment-raw.js +1 -5
  19. package/dist/capture/native-environment-raw.js.map +1 -1
  20. package/dist/capture/native-raw-dng.d.ts +6 -0
  21. package/dist/capture/native-raw-dng.js +16 -2
  22. package/dist/capture/native-raw-dng.js.map +1 -1
  23. package/dist/capture/release-sequence.js +2 -47
  24. package/dist/capture/release-sequence.js.map +1 -1
  25. package/dist/capture/sensor-raw-producer.js +3 -5
  26. package/dist/capture/sensor-raw-producer.js.map +1 -1
  27. package/dist/color/white-balance.d.ts +2 -0
  28. package/dist/color/white-balance.js +3 -56
  29. package/dist/color/white-balance.js.map +1 -1
  30. package/dist/composition/image-formation-plan.d.ts +1 -0
  31. package/dist/composition/image-formation-plan.js +3 -49
  32. package/dist/composition/image-formation-plan.js.map +1 -1
  33. package/dist/core/evidence-provenance.js +1 -16
  34. package/dist/core/evidence-provenance.js.map +1 -1
  35. package/dist/core/record-validation.d.ts +54 -0
  36. package/dist/core/record-validation.js +176 -0
  37. package/dist/core/record-validation.js.map +1 -1
  38. package/dist/core/scientific-assurance.js +1 -18
  39. package/dist/core/scientific-assurance.js.map +1 -1
  40. package/dist/core/shared-helpers.d.ts +35 -0
  41. package/dist/core/shared-helpers.js +38 -0
  42. package/dist/core/shared-helpers.js.map +1 -0
  43. package/dist/core/spectral-composition.js +1 -36
  44. package/dist/core/spectral-composition.js.map +1 -1
  45. package/dist/core/spectral.js +1 -19
  46. package/dist/core/spectral.js.map +1 -1
  47. package/dist/core/version.d.ts +1 -1
  48. package/dist/core/version.js +1 -1
  49. package/dist/core/version.js.map +1 -1
  50. package/dist/equipment/exposure-capabilities.d.ts +1 -0
  51. package/dist/equipment/exposure-capabilities.js +2 -36
  52. package/dist/equipment/exposure-capabilities.js.map +1 -1
  53. package/dist/equipment/generic-lens-catalogue.d.ts +8 -2
  54. package/dist/equipment/generic-lens-catalogue.js +31 -2
  55. package/dist/equipment/generic-lens-catalogue.js.map +1 -1
  56. package/dist/equipment/generic-tier-assets.js +2 -3
  57. package/dist/equipment/generic-tier-assets.js.map +1 -1
  58. package/dist/equipment/generic-tier-presets.js +2 -3
  59. package/dist/equipment/generic-tier-presets.js.map +1 -1
  60. package/dist/equipment/iso-capabilities.js +2 -49
  61. package/dist/equipment/iso-capabilities.js.map +1 -1
  62. package/dist/equipment/metering-capabilities.js +1 -26
  63. package/dist/equipment/metering-capabilities.js.map +1 -1
  64. package/dist/equipment/release-capabilities.js +1 -53
  65. package/dist/equipment/release-capabilities.js.map +1 -1
  66. package/dist/exposure/auto-iso-slowest-shutter.js +1 -7
  67. package/dist/exposure/auto-iso-slowest-shutter.js.map +1 -1
  68. package/dist/exposure/exposure-duration-control.js +1 -16
  69. package/dist/exposure/exposure-duration-control.js.map +1 -1
  70. package/dist/exposure/exposure-mode-resolver.js +1 -17
  71. package/dist/exposure/exposure-mode-resolver.js.map +1 -1
  72. package/dist/exposure/filtered-exposure-time.d.ts +93 -0
  73. package/dist/exposure/filtered-exposure-time.js +129 -0
  74. package/dist/exposure/filtered-exposure-time.js.map +1 -0
  75. package/dist/exposure/flash-ttl.d.ts +1 -0
  76. package/dist/exposure/flash-ttl.js +1 -1
  77. package/dist/exposure/flash-ttl.js.map +1 -1
  78. package/dist/exposure/flash.js +1 -49
  79. package/dist/exposure/flash.js.map +1 -1
  80. package/dist/exposure/metering-scene-radiance.js +1 -25
  81. package/dist/exposure/metering-scene-radiance.js.map +1 -1
  82. package/dist/exposure/metering-target.js +1 -30
  83. package/dist/exposure/metering-target.js.map +1 -1
  84. package/dist/exposure/metering-temporal.js +1 -8
  85. package/dist/exposure/metering-temporal.js.map +1 -1
  86. package/dist/exposure/metering.js +1 -72
  87. package/dist/exposure/metering.js.map +1 -1
  88. package/dist/exposure/program-line.js +1 -45
  89. package/dist/exposure/program-line.js.map +1 -1
  90. package/dist/facade/develop-joined-parts.d.ts +29 -0
  91. package/dist/facade/develop-joined-parts.js +33 -0
  92. package/dist/facade/develop-joined-parts.js.map +1 -0
  93. package/dist/facade/display-view-gpu.d.ts +7 -4
  94. package/dist/facade/display-view-gpu.js +4 -4
  95. package/dist/facade/display-view-gpu.js.map +1 -1
  96. package/dist/facade/display-view-lens-signal.d.ts +1 -1
  97. package/dist/facade/display-view-lens-signal.js +5 -3
  98. package/dist/facade/display-view-lens-signal.js.map +1 -1
  99. package/dist/facade/display-view.d.ts +3 -1
  100. package/dist/facade/display-view.js +1 -1
  101. package/dist/facade/display-view.js.map +1 -1
  102. package/dist/facade/fast-methods.d.ts +50 -0
  103. package/dist/facade/fast-methods.js +50 -0
  104. package/dist/facade/fast-methods.js.map +1 -0
  105. package/dist/facade/fast-resolution.d.ts +12 -0
  106. package/dist/facade/fast-resolution.js +18 -0
  107. package/dist/facade/fast-resolution.js.map +1 -0
  108. package/dist/facade/generic-lens-capture.d.ts +6 -3
  109. package/dist/facade/generic-lens-capture.js +6 -3
  110. package/dist/facade/generic-lens-capture.js.map +1 -1
  111. package/dist/facade/simulate-capture.d.ts +88 -16
  112. package/dist/facade/simulate-capture.js +279 -153
  113. package/dist/facade/simulate-capture.js.map +1 -1
  114. package/dist/facade/simulate-display-view.d.ts +3 -2
  115. package/dist/facade/simulate-display-view.js +22 -12
  116. package/dist/facade/simulate-display-view.js.map +1 -1
  117. package/dist/gpu/chart-composite-gpu.js +1 -3
  118. package/dist/gpu/chart-composite-gpu.js.map +1 -1
  119. package/dist/gpu/chart-radiance-gpu.js +1 -5
  120. package/dist/gpu/chart-radiance-gpu.js.map +1 -1
  121. package/dist/gpu/display-view-quality-gpu.d.ts +13 -1
  122. package/dist/gpu/display-view-quality-gpu.js +4 -8
  123. package/dist/gpu/display-view-quality-gpu.js.map +1 -1
  124. package/dist/gpu/display-view-speed-gpu.js +3 -25
  125. package/dist/gpu/display-view-speed-gpu.js.map +1 -1
  126. package/dist/gpu/sensor-stage-gpu.js +1 -5
  127. package/dist/gpu/sensor-stage-gpu.js.map +1 -1
  128. package/dist/gpu/webgpu-runtime.d.ts +2 -0
  129. package/dist/gpu/webgpu-runtime.js +3 -0
  130. package/dist/gpu/webgpu-runtime.js.map +1 -1
  131. package/dist/index.d.ts +11 -1
  132. package/dist/index.js +8 -0
  133. package/dist/index.js.map +1 -1
  134. package/dist/motion/camera-rotation.js +1 -6
  135. package/dist/motion/camera-rotation.js.map +1 -1
  136. package/dist/motion/capture-rotation-inverse-mapping.d.ts +12 -0
  137. package/dist/motion/capture-rotation-inverse-mapping.js +2 -2
  138. package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
  139. package/dist/motion/capture-rotation-temporal-quadrature.d.ts +1 -0
  140. package/dist/motion/capture-rotation-temporal-quadrature.js +1 -1
  141. package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
  142. package/dist/motion/capture-rotation-trajectory.js +2 -17
  143. package/dist/motion/capture-rotation-trajectory.js.map +1 -1
  144. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +1 -0
  145. package/dist/motion/capture-translation-parallax-temporal-quadrature.js +3 -14
  146. package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
  147. package/dist/motion/extended-object-projection.js +5 -40
  148. package/dist/motion/extended-object-projection.js.map +1 -1
  149. package/dist/optics/aperture-diameter.d.ts +47 -0
  150. package/dist/optics/aperture-diameter.js +50 -0
  151. package/dist/optics/aperture-diameter.js.map +1 -0
  152. package/dist/optics/atmospheric-haze.js +1 -7
  153. package/dist/optics/atmospheric-haze.js.map +1 -1
  154. package/dist/optics/brown-conrady-distortion.js +1 -7
  155. package/dist/optics/brown-conrady-distortion.js.map +1 -1
  156. package/dist/optics/complex-pupil-psf.d.ts +1 -0
  157. package/dist/optics/complex-pupil-psf.js +2 -84
  158. package/dist/optics/complex-pupil-psf.js.map +1 -1
  159. package/dist/optics/detail-limit.d.ts +182 -0
  160. package/dist/optics/detail-limit.js +336 -0
  161. package/dist/optics/detail-limit.js.map +1 -0
  162. package/dist/optics/focus-state.js +1 -11
  163. package/dist/optics/focus-state.js.map +1 -1
  164. package/dist/optics/front-of-lens-filter.d.ts +5 -0
  165. package/dist/optics/front-of-lens-filter.js +3 -65
  166. package/dist/optics/front-of-lens-filter.js.map +1 -1
  167. package/dist/optics/generic-lens-psf.d.ts +18 -2
  168. package/dist/optics/generic-lens-psf.js +25 -2
  169. package/dist/optics/generic-lens-psf.js.map +1 -1
  170. package/dist/optics/generic-nd-filter-presets.d.ts +12 -0
  171. package/dist/optics/generic-nd-filter-presets.js +48 -0
  172. package/dist/optics/generic-nd-filter-presets.js.map +1 -0
  173. package/dist/optics/illumination-vignetting.js +1 -6
  174. package/dist/optics/illumination-vignetting.js.map +1 -1
  175. package/dist/optics/lens-psf-profile.d.ts +4 -1
  176. package/dist/optics/lens-psf-profile.js +12 -111
  177. package/dist/optics/lens-psf-profile.js.map +1 -1
  178. package/dist/optics/longitudinal-chromatic-aberration.js +1 -7
  179. package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -1
  180. package/dist/optics/pupil-vignetting.js +1 -7
  181. package/dist/optics/pupil-vignetting.js.map +1 -1
  182. package/dist/optics/radial-distortion.js +1 -6
  183. package/dist/optics/radial-distortion.js.map +1 -1
  184. package/dist/optics/scene-to-sensor-irradiance.d.ts +13 -0
  185. package/dist/optics/scene-to-sensor-irradiance.js +11 -96
  186. package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
  187. package/dist/optics/stray-light.d.ts +1 -0
  188. package/dist/optics/stray-light.js +1 -1
  189. package/dist/optics/stray-light.js.map +1 -1
  190. package/dist/optics/zernike-wavefront.js +1 -7
  191. package/dist/optics/zernike-wavefront.js.map +1 -1
  192. package/dist/output/capture-geometry.js +1 -8
  193. package/dist/output/capture-geometry.js.map +1 -1
  194. package/dist/output/crop-to-match-focal-length.d.ts +62 -0
  195. package/dist/output/crop-to-match-focal-length.js +63 -0
  196. package/dist/output/crop-to-match-focal-length.js.map +1 -0
  197. package/dist/output/developed-lens-corrections.d.ts +62 -0
  198. package/dist/output/developed-lens-corrections.js +135 -0
  199. package/dist/output/developed-lens-corrections.js.map +1 -0
  200. package/dist/output/generic-lens-corrections.d.ts +5 -7
  201. package/dist/output/generic-lens-corrections.js +11 -10
  202. package/dist/output/generic-lens-corrections.js.map +1 -1
  203. package/dist/output/geometric-transforms.js +1 -4
  204. package/dist/output/geometric-transforms.js.map +1 -1
  205. package/dist/output/lens-corrections.d.ts +12 -2
  206. package/dist/output/lens-corrections.js +22 -7
  207. package/dist/output/lens-corrections.js.map +1 -1
  208. package/dist/output/native-capture-sdr.d.ts +2 -2
  209. package/dist/output/native-capture-sdr.js +3 -2
  210. package/dist/output/native-capture-sdr.js.map +1 -1
  211. package/dist/output/print-contrast-reference.js +1 -1
  212. package/dist/output/print-contrast-reference.js.map +1 -1
  213. package/dist/output/print-size-blur-noise.d.ts +110 -0
  214. package/dist/output/print-size-blur-noise.js +138 -0
  215. package/dist/output/print-size-blur-noise.js.map +1 -0
  216. package/dist/processing/development-detail.d.ts +29 -0
  217. package/dist/processing/development-detail.js +128 -107
  218. package/dist/processing/development-detail.js.map +1 -1
  219. package/dist/schema/illumination-temporal.js +3 -72
  220. package/dist/schema/illumination-temporal.js.map +1 -1
  221. package/dist/schema/illumination.d.ts +1 -0
  222. package/dist/schema/illumination.js +2 -65
  223. package/dist/schema/illumination.js.map +1 -1
  224. package/dist/schema/scene-radiance-temporal.js +2 -14
  225. package/dist/schema/scene-radiance-temporal.js.map +1 -1
  226. package/dist/schema/scene-radiance.js +2 -60
  227. package/dist/schema/scene-radiance.js.map +1 -1
  228. package/dist/schema/validation.d.ts +2 -0
  229. package/dist/schema/validation.js +2 -17
  230. package/dist/schema/validation.js.map +1 -1
  231. package/dist/sensor/accumulated-charge.js +2 -59
  232. package/dist/sensor/accumulated-charge.js.map +1 -1
  233. package/dist/sensor/architecture.js +1 -16
  234. package/dist/sensor/architecture.js.map +1 -1
  235. package/dist/sensor/camera-saturation-capacity.d.ts +1 -0
  236. package/dist/sensor/camera-saturation-capacity.js +3 -55
  237. package/dist/sensor/camera-saturation-capacity.js.map +1 -1
  238. package/dist/sensor/capture-color-sampling-binding.js +1 -26
  239. package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
  240. package/dist/sensor/capture-mode-timing.js +1 -39
  241. package/dist/sensor/capture-mode-timing.js.map +1 -1
  242. package/dist/sensor/capture-mode.js +1 -23
  243. package/dist/sensor/capture-mode.js.map +1 -1
  244. package/dist/sensor/color-sampling.js +1 -26
  245. package/dist/sensor/color-sampling.js.map +1 -1
  246. package/dist/sensor/constant-rate-temporal-integration.js +2 -46
  247. package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
  248. package/dist/sensor/dark-current.js +2 -45
  249. package/dist/sensor/dark-current.js.map +1 -1
  250. package/dist/sensor/eqe-electron-rate.js +2 -41
  251. package/dist/sensor/eqe-electron-rate.js.map +1 -1
  252. package/dist/sensor/exposure-window.d.ts +7 -0
  253. package/dist/sensor/exposure-window.js +9 -24
  254. package/dist/sensor/exposure-window.js.map +1 -1
  255. package/dist/sensor/iso-gain.js +1 -7
  256. package/dist/sensor/iso-gain.js.map +1 -1
  257. package/dist/sensor/iso-signal-chain.js +1 -43
  258. package/dist/sensor/iso-signal-chain.js.map +1 -1
  259. package/dist/sensor/optical-stack.js +1 -25
  260. package/dist/sensor/optical-stack.js.map +1 -1
  261. package/dist/sensor/photon-energy.js +1 -26
  262. package/dist/sensor/photon-energy.js.map +1 -1
  263. package/dist/sensor/physical-charge-capacity.js +3 -77
  264. package/dist/sensor/physical-charge-capacity.js.map +1 -1
  265. package/dist/sensor/radiometry-readiness.js +2 -23
  266. package/dist/sensor/radiometry-readiness.js.map +1 -1
  267. package/dist/sensor/raw-readout.d.ts +3 -0
  268. package/dist/sensor/raw-readout.js +4 -66
  269. package/dist/sensor/raw-readout.js.map +1 -1
  270. package/dist/sensor/raw-reconstruction.js +2 -64
  271. package/dist/sensor/raw-reconstruction.js.map +1 -1
  272. package/dist/sensor/readout-exposure-linkage.js +1 -9
  273. package/dist/sensor/readout-exposure-linkage.js.map +1 -1
  274. package/dist/sensor/readout-timing.js +4 -79
  275. package/dist/sensor/readout-timing.js.map +1 -1
  276. package/dist/sensor/response-application-compatibility.d.ts +2 -0
  277. package/dist/sensor/response-application-compatibility.js +4 -35
  278. package/dist/sensor/response-application-compatibility.js.map +1 -1
  279. package/dist/sensor/response-operating-range.d.ts +1 -0
  280. package/dist/sensor/response-operating-range.js +3 -79
  281. package/dist/sensor/response-operating-range.js.map +1 -1
  282. package/dist/sensor/responsivity-photocurrent.js +4 -114
  283. package/dist/sensor/responsivity-photocurrent.js.map +1 -1
  284. package/dist/sensor/sampling-aperture.js +1 -25
  285. package/dist/sensor/sampling-aperture.js.map +1 -1
  286. package/dist/sensor/sensor-characteristics.d.ts +137 -0
  287. package/dist/sensor/sensor-characteristics.js +115 -0
  288. package/dist/sensor/sensor-characteristics.js.map +1 -0
  289. package/dist/sensor/spatial-sample-reduction.js +3 -24
  290. package/dist/sensor/spatial-sample-reduction.js.map +1 -1
  291. package/dist/sensor/spatial-sampling-quadrature.js +1 -3
  292. package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
  293. package/dist/sensor/spatio-spectral-reduction.js +1 -18
  294. package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
  295. package/dist/sensor/spectral-coverage.d.ts +10 -1
  296. package/dist/sensor/spectral-coverage.js +1 -1
  297. package/dist/sensor/spectral-coverage.js.map +1 -1
  298. package/dist/sensor/spectral-quadrature.js +3 -41
  299. package/dist/sensor/spectral-quadrature.js.map +1 -1
  300. package/dist/sensor/spectral-response.js +1 -47
  301. package/dist/sensor/spectral-response.js.map +1 -1
  302. package/dist/sensor/temporal-photo-signal.d.ts +3 -0
  303. package/dist/sensor/temporal-photo-signal.js +5 -2
  304. package/dist/sensor/temporal-photo-signal.js.map +1 -1
  305. package/dist/stabilization/camera-shake.js +1 -6
  306. package/dist/stabilization/camera-shake.js.map +1 -1
  307. package/dist/stabilization/system.d.ts +9 -0
  308. package/dist/stabilization/system.js +7 -86
  309. package/dist/stabilization/system.js.map +1 -1
  310. package/docs/AGENT_GUIDE.md +5 -0
  311. package/docs/API_REFERENCE.md +116 -3
  312. package/docs/QUICK_START.md +178 -14
  313. package/docs/USAGE.md +111 -3
  314. package/docs/api/capture-native-raw-dng.md +6 -0
  315. package/docs/api/core-version.md +1 -1
  316. package/docs/api/equipment-generic-lens-catalogue.md +7 -2
  317. package/docs/api/exports.json +203 -3
  318. package/docs/api/exposure-filtered-exposure-time.md +105 -0
  319. package/docs/api/facade-develop-joined-parts.md +32 -0
  320. package/docs/api/facade-display-view-gpu.md +5 -2
  321. package/docs/api/facade-fast-methods.md +91 -0
  322. package/docs/api/facade-simulate-capture.md +72 -16
  323. package/docs/api/facade-simulate-display-view.md +3 -2
  324. package/docs/api/optics-aperture-diameter.md +51 -0
  325. package/docs/api/optics-detail-limit.md +203 -0
  326. package/docs/api/optics-generic-nd-filter-presets.md +34 -0
  327. package/docs/api/optics-lens-psf-profile.md +3 -1
  328. package/docs/api/output-crop-to-match-focal-length.md +67 -0
  329. package/docs/api/output-developed-lens-corrections.md +12 -0
  330. package/docs/api/output-generic-lens-corrections.md +3 -10
  331. package/docs/api/output-lens-corrections.md +11 -1
  332. package/docs/api/output-print-size-blur-noise.md +115 -0
  333. package/docs/api/sensor-sensor-characteristics.md +105 -0
  334. package/llms.txt +5 -0
  335. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"illumination-temporal.js","sourceRoot":"","sources":["../../src/schema/illumination-temporal.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Time-varying light sources, such as flicker or a pulsed light.\n *\n * A temporal profile sits on top of an existing illumination profile. Each binding multiplies\n * one source by a relative waveform over time. The base source magnitude and spectrum still\n * apply, and sources with no binding stay constant. This module parses the profile, evaluates\n * a waveform at one capture time, and integrates it over an exposure window.\n * @see docs/SCENE_RADIANCE_AND_ILLUMINATION.md for equations, coordinate/unit conventions, blockers\n * and support limits.\n */\n\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport {\n parseEvidenceList,\n type EvidenceProvenance\n} from \"../core/evidence-provenance.js\";\nimport {\n InvalidScientificInputError,\n requirePositiveInteger\n} from \"../core/validation.js\";\nimport type {\n CaptureExposureWindows\n} from \"../sensor/exposure-window.js\";\nimport type {\n SceneIlluminationProfile,\n SceneIlluminationUncertainty\n} from \"./illumination.js\";\nimport { requireInputKeys, rejectUnknownFields, rejectUnknownVariantFields, UNCERTAINTY_VARIANT_FIELDS, requireFixedFieldsWhenPresent } from \"../core/record-validation.js\";\n\ntype UnknownRecord = Record<string, unknown>;\n\nexport const SCENE_ILLUMINATION_TEMPORAL_PROFILE_SCHEMA_VERSION =\n \"0.1.0\" as const;\n\nexport type SceneIlluminationTemporalScientificStatus =\n | \"calibrated\"\n | \"approximation\";\n\nexport interface SceneIlluminationTemporalWaveformSample {\n timeSecondsFromWaveformReference: number;\n relativeMagnitudeMultiplier: number;\n}\n\ninterface SceneIlluminationTemporalWaveformBase {\n waveformId: string;\n timeUnit: \"s\";\n scientificStatus:\n SceneIlluminationTemporalScientificStatus;\n uncertainty: SceneIlluminationUncertainty;\n evidence: readonly EvidenceProvenance[];\n interpolation: \"piecewise-linear\";\n samples:\n readonly SceneIlluminationTemporalWaveformSample[];\n}\n\nexport type SceneIlluminationTemporalWaveform =\n | (SceneIlluminationTemporalWaveformBase & {\n kind:\n \"aperiodic-relative-multiplier\";\n outsideSupportBehavior: \"zero\";\n })\n | (SceneIlluminationTemporalWaveformBase & {\n kind:\n \"periodic-relative-multiplier\";\n periodSeconds: number;\n endpointContinuityRequired: true;\n });\n\nexport type SceneIlluminationTemporalRegistrationUncertainty =\n | {\n kind: \"absolute-seconds\";\n plusMinusSeconds: number;\n basis: string;\n }\n | {\n kind: \"not-quantified\";\n limitation: string;\n };\n\nexport interface SceneIlluminationTemporalSourceBinding {\n bindingId: string;\n sourceId: string;\n waveformId: string;\n captureTimeReference:\n \"first-opening-boundary-phase\";\n /**\n * The capture time at which the waveform's own t=0 falls.\n *\n * waveformTime = captureTime - waveformTimeZeroSecondsFromCaptureReference\n */\n waveformTimeZeroSecondsFromCaptureReference:\n number;\n scientificStatus:\n SceneIlluminationTemporalScientificStatus;\n timingUncertainty:\n SceneIlluminationTemporalRegistrationUncertainty;\n evidence: readonly EvidenceProvenance[];\n}\n\nexport interface SceneIlluminationTemporalProfile {\n schemaVersion:\n typeof SCENE_ILLUMINATION_TEMPORAL_PROFILE_SCHEMA_VERSION;\n profileId: string;\n sceneId: string;\n illuminationProfileId: string;\n evidence: readonly EvidenceProvenance[];\n waveforms:\n readonly SceneIlluminationTemporalWaveform[];\n sourceBindings:\n readonly SceneIlluminationTemporalSourceBinding[];\n baseIlluminationProfileRemainsAuthoritative:\n true;\n sensorReadoutTimingUsedAsExposureTiming:\n false;\n automaticExposurePolicyIncluded: false;\n}\n\nexport interface EvaluateSceneIlluminationTemporalMultiplierInput {\n illuminationProfile:\n SceneIlluminationProfile;\n temporalProfile:\n SceneIlluminationTemporalProfile;\n sourceId: string;\n captureTimeSecondsFromReference: number;\n}\n\nexport interface SceneIlluminationTemporalMultiplierEvaluation {\n sourceId: string;\n sourceEnabled: boolean;\n temporalProfileId: string;\n bindingId: string;\n waveformId: string;\n captureTimeReference:\n \"first-opening-boundary-phase\";\n captureTimeSecondsFromReference: number;\n waveformTimeSecondsFromWaveformReference:\n number;\n waveformKind:\n SceneIlluminationTemporalWaveform[\"kind\"];\n relativeMagnitudeMultiplier: number;\n effectiveRelativeMagnitudeMultiplier:\n number;\n sourceMagnitudeApplied: false;\n materialTransportApplied: false;\n sceneRadianceCalculated: false;\n sensorReadoutTimingUsed: false;\n automaticExposureResolved: false;\n}\n\nexport interface IntegrateSceneIlluminationTemporalMultiplierInput {\n illuminationProfile:\n SceneIlluminationProfile;\n temporalProfile:\n SceneIlluminationTemporalProfile;\n sourceId: string;\n exposureWindows: CaptureExposureWindows;\n sampleIndex: number;\n temporalSampleCount: number;\n}\n\nexport interface SceneIlluminationTemporalIntegrationNode {\n temporalSampleIndex: number;\n localExposurePhase: number;\n captureTimeSecondsFromReference: number;\n waveformTimeSecondsFromWaveformReference:\n number;\n relativeMagnitudeMultiplier: number;\n effectiveRelativeMagnitudeMultiplier:\n number;\n normalizedTimeWeight: number;\n timeMeasureSeconds: number;\n}\n\nexport interface SceneIlluminationTemporalExposureIntegration {\n sourceId: string;\n sourceEnabled: boolean;\n temporalProfileId: string;\n bindingId: string;\n waveformId: string;\n timeReference:\n \"first-opening-boundary-phase\";\n localExposureWindow: {\n startSecondsFromCaptureReference: number;\n endSecondsFromCaptureReference: number;\n durationSeconds: number;\n };\n quadratureScheme: \"uniform-midpoint\";\n temporalSampleCount: number;\n nodes:\n readonly SceneIlluminationTemporalIntegrationNode[];\n averageRelativeMagnitudeMultiplier:\n number;\n integratedRelativeMagnitudeSeconds:\n number;\n averageEffectiveRelativeMagnitudeMultiplier:\n number;\n integratedEffectiveRelativeMagnitudeSeconds:\n number;\n sourceMagnitudeApplied: false;\n materialTransportApplied: false;\n sceneRadianceCalculated: false;\n sensorReadoutTimingUsed: false;\n automaticExposureResolved: false;\n convergenceErrorEstimated: false;\n}\n\nfunction requireRecord(\n value: unknown,\n path: string,\n allowedKeys: readonly string[] | null\n): UnknownRecord {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value)\n ) {\n throw new InvalidConfigurationError(\n path + \" must be an object.\"\n );\n }\n if (allowedKeys !== null) rejectUnknownFields(value, allowedKeys, path);\n return value as UnknownRecord;\n}\n\nfunction requireNonEmptyString(\n value: unknown,\n path: string\n): string {\n if (\n typeof value !== \"string\" ||\n value.trim().length === 0\n ) {\n throw new InvalidConfigurationError(\n path + \" must be a non-empty string.\"\n );\n }\n return value.trim();\n}\n\nfunction requireFinite(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value)\n ) {\n throw new InvalidConfigurationError(\n path + \" must be finite.\"\n );\n }\n return value;\n}\n\nfunction requirePositiveFinite(\n value: unknown,\n path: string\n): number {\n const parsed = requireFinite(\n value,\n path\n );\n if (parsed <= 0) {\n throw new InvalidConfigurationError(\n path +\n \" must be greater than zero.\"\n );\n }\n return parsed;\n}\n\nfunction requireNonNegativeFinite(\n value: unknown,\n path: string\n): number {\n const parsed = requireFinite(\n value,\n path\n );\n if (parsed < 0) {\n throw new InvalidConfigurationError(\n path +\n \" must be greater than or equal to zero.\"\n );\n }\n return parsed;\n}\n\nfunction requireReusableNumericEvidence(\n value: unknown,\n path: string\n): readonly EvidenceProvenance[] {\n const evidence = parseEvidenceList(\n value,\n path\n );\n if (\n !evidence.some(\n (entry) =>\n entry.reuseStatus ===\n \"reusable-data\" ||\n entry.reuseStatus ===\n \"photivra-owned\"\n )\n ) {\n throw new InvalidConfigurationError(\n path +\n \" must contain reusable-data or photivra-owned evidence because the waveform embeds reusable numeric data.\"\n );\n }\n return evidence;\n}\n\nfunction parseScientificStatus(\n value: unknown,\n path: string\n): SceneIlluminationTemporalScientificStatus {\n if (\n value !== \"calibrated\" &&\n value !== \"approximation\"\n ) {\n throw new InvalidConfigurationError(\n path + \" is invalid.\"\n );\n }\n return value;\n}\n\nfunction parseUncertainty(\n value: unknown,\n path: string\n): SceneIlluminationUncertainty {\n const record = requireRecord(\n value,\n path, null\n );\n rejectUnknownVariantFields(record, \"kind\", UNCERTAINTY_VARIANT_FIELDS, path);\n if (record.kind === \"relative\") {\n return {\n kind: \"relative\",\n fraction:\n requireNonNegativeFinite(\n record.fraction,\n path + \".fraction\"\n ),\n basis: requireNonEmptyString(\n record.basis,\n path + \".basis\"\n )\n };\n }\n if (record.kind === \"not-quantified\") {\n return {\n kind: \"not-quantified\",\n limitation:\n requireNonEmptyString(\n record.limitation,\n path + \".limitation\"\n )\n };\n }\n throw new InvalidConfigurationError(\n path + \".kind is invalid.\"\n );\n}\n\nfunction parseRegistrationUncertainty(\n value: unknown,\n path: string\n): SceneIlluminationTemporalRegistrationUncertainty {\n const record = requireRecord(\n value,\n path, null\n );\n rejectUnknownVariantFields(record, \"kind\", { \"absolute-seconds\": [\"kind\", \"plusMinusSeconds\", \"basis\"], \"not-quantified\": [\"kind\", \"limitation\"] }, path);\n if (\n record.kind ===\n \"absolute-seconds\"\n ) {\n return {\n kind: \"absolute-seconds\",\n plusMinusSeconds:\n requireNonNegativeFinite(\n record.plusMinusSeconds,\n path +\n \".plusMinusSeconds\"\n ),\n basis: requireNonEmptyString(\n record.basis,\n path + \".basis\"\n )\n };\n }\n if (record.kind === \"not-quantified\") {\n return {\n kind: \"not-quantified\",\n limitation:\n requireNonEmptyString(\n record.limitation,\n path + \".limitation\"\n )\n };\n }\n throw new InvalidConfigurationError(\n path + \".kind is invalid.\"\n );\n}\n\nfunction parseWaveformSamples(\n value: unknown,\n path: string\n): readonly SceneIlluminationTemporalWaveformSample[] {\n if (\n !Array.isArray(value) ||\n value.length < 2\n ) {\n throw new InvalidConfigurationError(\n path +\n \" must contain at least two samples.\"\n );\n }\n\n let previous =\n Number.NEGATIVE_INFINITY;\n return value.map((entry, index) => {\n const samplePath =\n path + \"[\" + index + \"]\";\n const sample = requireRecord(\n entry,\n samplePath, [\"timeSecondsFromWaveformReference\", \"relativeMagnitudeMultiplier\"]\n );\n const time =\n requireNonNegativeFinite(\n sample\n .timeSecondsFromWaveformReference,\n samplePath +\n \".timeSecondsFromWaveformReference\"\n );\n if (time <= previous) {\n throw new InvalidConfigurationError(\n path +\n \" times must be strictly increasing.\"\n );\n }\n previous = time;\n return {\n timeSecondsFromWaveformReference:\n time,\n relativeMagnitudeMultiplier:\n requireNonNegativeFinite(\n sample\n .relativeMagnitudeMultiplier,\n samplePath +\n \".relativeMagnitudeMultiplier\"\n )\n };\n });\n}\n\nconst WAVEFORM_BASE_FIELDS = [\"kind\", \"waveformId\", \"timeUnit\", \"scientificStatus\", \"uncertainty\", \"evidence\", \"interpolation\", \"samples\"] as const;\n\nfunction parseWaveform(\n value: unknown,\n path: string\n): SceneIlluminationTemporalWaveform {\n const record = requireRecord(\n value,\n path, null\n );\n rejectUnknownVariantFields(record, \"kind\", {\n \"aperiodic-relative-multiplier\": [...WAVEFORM_BASE_FIELDS, \"outsideSupportBehavior\"],\n \"periodic-relative-multiplier\": [...WAVEFORM_BASE_FIELDS, \"periodSeconds\", \"endpointContinuityRequired\"]\n }, path);\n if (record.timeUnit !== \"s\") {\n throw new InvalidConfigurationError(\n path + '.timeUnit must be \"s\".'\n );\n }\n if (\n record.interpolation !==\n \"piecewise-linear\"\n ) {\n throw new InvalidConfigurationError(\n path +\n '.interpolation must be \"piecewise-linear\".'\n );\n }\n\n const waveformId =\n requireNonEmptyString(\n record.waveformId,\n path + \".waveformId\"\n );\n const scientificStatus =\n parseScientificStatus(\n record.scientificStatus,\n path + \".scientificStatus\"\n );\n const uncertainty =\n parseUncertainty(\n record.uncertainty,\n path + \".uncertainty\"\n );\n if (\n scientificStatus === \"calibrated\" &&\n uncertainty.kind !== \"relative\"\n ) {\n throw new InvalidConfigurationError(\n path +\n \" calibrated waveform data requires quantified relative uncertainty.\"\n );\n }\n const evidence =\n requireReusableNumericEvidence(\n record.evidence,\n path + \".evidence\"\n );\n const samples =\n parseWaveformSamples(\n record.samples,\n path + \".samples\"\n );\n\n if (\n samples[0]!\n .timeSecondsFromWaveformReference !==\n 0\n ) {\n throw new InvalidConfigurationError(\n path +\n \".samples must begin at waveform-local t=0.\"\n );\n }\n\n if (\n record.kind ===\n \"aperiodic-relative-multiplier\"\n ) {\n if (\n record.outsideSupportBehavior !==\n \"zero\"\n ) {\n throw new InvalidConfigurationError(\n path +\n '.outsideSupportBehavior must be \"zero\".'\n );\n }\n return {\n kind:\n \"aperiodic-relative-multiplier\",\n waveformId,\n timeUnit: \"s\",\n scientificStatus,\n uncertainty,\n evidence,\n interpolation:\n \"piecewise-linear\",\n samples,\n outsideSupportBehavior:\n \"zero\"\n };\n }\n\n if (\n record.kind ===\n \"periodic-relative-multiplier\"\n ) {\n const periodSeconds =\n requirePositiveFinite(\n record.periodSeconds,\n path + \".periodSeconds\"\n );\n const last =\n samples[samples.length - 1]!;\n if (\n last\n .timeSecondsFromWaveformReference !==\n periodSeconds\n ) {\n throw new InvalidConfigurationError(\n path +\n \".samples must end exactly at periodSeconds.\"\n );\n }\n if (\n samples[0]!\n .relativeMagnitudeMultiplier !==\n last.relativeMagnitudeMultiplier\n ) {\n throw new InvalidConfigurationError(\n path +\n \" periodic endpoint multipliers must match.\"\n );\n }\n if (\n record.endpointContinuityRequired !==\n true\n ) {\n throw new InvalidConfigurationError(\n path +\n \".endpointContinuityRequired must be true.\"\n );\n }\n return {\n kind:\n \"periodic-relative-multiplier\",\n waveformId,\n timeUnit: \"s\",\n scientificStatus,\n uncertainty,\n evidence,\n interpolation:\n \"piecewise-linear\",\n samples,\n periodSeconds,\n endpointContinuityRequired:\n true\n };\n }\n\n throw new InvalidConfigurationError(\n path + \".kind is invalid.\"\n );\n}\n\nfunction parseSourceBinding(\n value: unknown,\n path: string\n): SceneIlluminationTemporalSourceBinding {\n const record = requireRecord(\n value,\n path, [\"captureTimeReference\", \"scientificStatus\", \"timingUncertainty\", \"bindingId\", \"sourceId\", \"waveformId\", \"waveformTimeZeroSecondsFromCaptureReference\", \"evidence\"]\n );\n if (\n record.captureTimeReference !==\n \"first-opening-boundary-phase\"\n ) {\n throw new InvalidConfigurationError(\n path +\n '.captureTimeReference must be \"first-opening-boundary-phase\".'\n );\n }\n\n const scientificStatus =\n parseScientificStatus(\n record.scientificStatus,\n path + \".scientificStatus\"\n );\n const timingUncertainty =\n parseRegistrationUncertainty(\n record.timingUncertainty,\n path + \".timingUncertainty\"\n );\n if (\n scientificStatus === \"calibrated\" &&\n timingUncertainty.kind !==\n \"absolute-seconds\"\n ) {\n throw new InvalidConfigurationError(\n path +\n \" calibrated waveform registration requires quantified absolute timing uncertainty.\"\n );\n }\n\n return {\n bindingId:\n requireNonEmptyString(\n record.bindingId,\n path + \".bindingId\"\n ),\n sourceId:\n requireNonEmptyString(\n record.sourceId,\n path + \".sourceId\"\n ),\n waveformId:\n requireNonEmptyString(\n record.waveformId,\n path + \".waveformId\"\n ),\n captureTimeReference:\n \"first-opening-boundary-phase\",\n waveformTimeZeroSecondsFromCaptureReference:\n requireFinite(\n record\n .waveformTimeZeroSecondsFromCaptureReference,\n path +\n \".waveformTimeZeroSecondsFromCaptureReference\"\n ),\n scientificStatus,\n timingUncertainty,\n evidence: parseEvidenceList(\n record.evidence,\n path + \".evidence\"\n )\n };\n}\n\n/** Fixed flags the parser writes; a parsed profile may carry them back in unchanged. */\nconst TEMPORAL_PROFILE_FIXED_FIELDS = {\n baseIlluminationProfileRemainsAuthoritative: true, sensorReadoutTimingUsedAsExposureTiming: false,\n automaticExposurePolicyIncluded: false\n} as const;\n\n/**\n * Parses a time-varying illumination profile that sits on top of one existing\n * illumination profile.\n *\n * The base source magnitude and spectrum still apply. Each binding multiplies one\n * source by one relative waveform over time. Sources with no binding stay constant.\n */\nexport function parseSceneIlluminationTemporalProfile(\n value: unknown\n): SceneIlluminationTemporalProfile {\n const record = requireRecord(\n value,\n \"sceneIlluminationTemporalProfile\", [\"schemaVersion\", \"waveforms\", \"sourceBindings\", \"profileId\", \"sceneId\", \"illuminationProfileId\", \"evidence\", ...Object.keys(TEMPORAL_PROFILE_FIXED_FIELDS)]\n );\n requireFixedFieldsWhenPresent(record, TEMPORAL_PROFILE_FIXED_FIELDS, \"sceneIlluminationTemporalProfile\");\n if (\n record.schemaVersion !==\n SCENE_ILLUMINATION_TEMPORAL_PROFILE_SCHEMA_VERSION\n ) {\n throw new InvalidConfigurationError(\n 'sceneIlluminationTemporalProfile.schemaVersion must be \"' +\n SCENE_ILLUMINATION_TEMPORAL_PROFILE_SCHEMA_VERSION +\n '\".'\n );\n }\n if (!Array.isArray(record.waveforms)) {\n throw new InvalidConfigurationError(\n \"sceneIlluminationTemporalProfile.waveforms must be an array.\"\n );\n }\n if (\n !Array.isArray(record.sourceBindings)\n ) {\n throw new InvalidConfigurationError(\n \"sceneIlluminationTemporalProfile.sourceBindings must be an array.\"\n );\n }\n\n const waveforms =\n record.waveforms.map(\n (entry, index) =>\n parseWaveform(\n entry,\n \"sceneIlluminationTemporalProfile.waveforms[\" +\n index +\n \"]\"\n )\n );\n const waveformIds =\n waveforms.map(\n (entry) => entry.waveformId\n );\n if (\n new Set(waveformIds).size !==\n waveformIds.length\n ) {\n throw new InvalidConfigurationError(\n \"sceneIlluminationTemporalProfile.waveforms[].waveformId must not contain duplicates.\"\n );\n }\n\n const sourceBindings =\n record.sourceBindings.map(\n (entry, index) =>\n parseSourceBinding(\n entry,\n \"sceneIlluminationTemporalProfile.sourceBindings[\" +\n index +\n \"]\"\n )\n );\n const bindingIds =\n sourceBindings.map(\n (entry) => entry.bindingId\n );\n if (\n new Set(bindingIds).size !==\n bindingIds.length\n ) {\n throw new InvalidConfigurationError(\n \"sceneIlluminationTemporalProfile.sourceBindings[].bindingId must not contain duplicates.\"\n );\n }\n const sourceIds =\n sourceBindings.map(\n (entry) => entry.sourceId\n );\n if (\n new Set(sourceIds).size !==\n sourceIds.length\n ) {\n throw new InvalidConfigurationError(\n \"sceneIlluminationTemporalProfile supports at most one temporal binding per sourceId in schema 0.1.0.\"\n );\n }\n const waveformIdSet =\n new Set(waveformIds);\n for (const binding of sourceBindings) {\n if (\n !waveformIdSet.has(\n binding.waveformId\n )\n ) {\n throw new InvalidConfigurationError(\n \"sceneIlluminationTemporalProfile source binding references an unknown waveformId.\"\n );\n }\n }\n\n return {\n schemaVersion:\n SCENE_ILLUMINATION_TEMPORAL_PROFILE_SCHEMA_VERSION,\n profileId:\n requireNonEmptyString(\n record.profileId,\n \"sceneIlluminationTemporalProfile.profileId\"\n ),\n sceneId:\n requireNonEmptyString(\n record.sceneId,\n \"sceneIlluminationTemporalProfile.sceneId\"\n ),\n illuminationProfileId:\n requireNonEmptyString(\n record.illuminationProfileId,\n \"sceneIlluminationTemporalProfile.illuminationProfileId\"\n ),\n evidence: parseEvidenceList(\n record.evidence,\n \"sceneIlluminationTemporalProfile.evidence\"\n ),\n waveforms,\n sourceBindings,\n baseIlluminationProfileRemainsAuthoritative:\n true,\n sensorReadoutTimingUsedAsExposureTiming:\n false,\n automaticExposurePolicyIncluded:\n false\n };\n}\n\nfunction requireProfileBindings(\n illuminationProfile:\n SceneIlluminationProfile,\n temporalProfile:\n SceneIlluminationTemporalProfile\n): void {\n if (\n temporalProfile.sceneId !==\n illuminationProfile.sceneId\n ) {\n throw new InvalidScientificInputError(\n \"Temporal illumination profile sceneId must match the illumination profile.\"\n );\n }\n if (\n temporalProfile\n .illuminationProfileId !==\n illuminationProfile.profileId\n ) {\n throw new InvalidScientificInputError(\n \"Temporal illumination profile illuminationProfileId must match the supplied illumination profile.\"\n );\n }\n\n const knownSourceIds =\n new Set(\n illuminationProfile.sources.map(\n (entry) => entry.sourceId\n )\n );\n for (\n const binding of\n temporalProfile.sourceBindings\n ) {\n if (\n !knownSourceIds.has(\n binding.sourceId\n )\n ) {\n throw new InvalidScientificInputError(\n \"Temporal illumination source binding references a sourceId that is not declared by the illumination profile.\"\n );\n }\n }\n}\n\nfunction resolveSourceAndTemporalBinding(\n illuminationProfile:\n SceneIlluminationProfile,\n temporalProfile:\n SceneIlluminationTemporalProfile,\n sourceId: string\n): {\n source:\n SceneIlluminationProfile[\"sources\"][number];\n binding:\n SceneIlluminationTemporalSourceBinding;\n waveform:\n SceneIlluminationTemporalWaveform;\n} {\n requireProfileBindings(\n illuminationProfile,\n temporalProfile\n );\n\n const source =\n illuminationProfile.sources.find(\n (entry) =>\n entry.sourceId === sourceId\n );\n if (source === undefined) {\n throw new InvalidScientificInputError(\n \"sourceId is not declared by the supplied illumination profile.\"\n );\n }\n\n const binding =\n temporalProfile.sourceBindings.find(\n (entry) =>\n entry.sourceId === sourceId\n );\n if (binding === undefined) {\n throw new InvalidScientificInputError(\n \"Time-varying source evaluation requires an explicit source waveform-to-capture registration.\"\n );\n }\n\n const waveform =\n temporalProfile.waveforms.find(\n (entry) =>\n entry.waveformId ===\n binding.waveformId\n );\n if (waveform === undefined) {\n throw new InvalidScientificInputError(\n \"Temporal source binding waveformId is not declared by the temporal profile.\"\n );\n }\n\n return {\n source,\n binding,\n waveform\n };\n}\n\nfunction interpolateWaveform(\n samples:\n readonly SceneIlluminationTemporalWaveformSample[],\n timeSeconds: number\n): number {\n const first = samples[0]!;\n const last =\n samples[samples.length - 1]!;\n\n if (\n timeSeconds ===\n first.timeSecondsFromWaveformReference\n ) {\n return first\n .relativeMagnitudeMultiplier;\n }\n if (\n timeSeconds ===\n last.timeSecondsFromWaveformReference\n ) {\n return last\n .relativeMagnitudeMultiplier;\n }\n\n for (\n let index = 1;\n index < samples.length;\n index += 1\n ) {\n const right = samples[index]!;\n if (\n timeSeconds <\n right\n .timeSecondsFromWaveformReference\n ) {\n const left =\n samples[index - 1]!;\n const span =\n right\n .timeSecondsFromWaveformReference -\n left\n .timeSecondsFromWaveformReference;\n const phase =\n (timeSeconds -\n left\n .timeSecondsFromWaveformReference) /\n span;\n return (\n left\n .relativeMagnitudeMultiplier +\n phase *\n (right\n .relativeMagnitudeMultiplier -\n left\n .relativeMagnitudeMultiplier)\n );\n }\n }\n\n return last\n .relativeMagnitudeMultiplier;\n}\n\nfunction positiveModulo(\n value: number,\n modulus: number\n): number {\n const remainder = value % modulus;\n return remainder < 0\n ? remainder + modulus\n : remainder;\n}\n\nfunction evaluateWaveform(\n waveform:\n SceneIlluminationTemporalWaveform,\n waveformTimeSeconds: number\n): number {\n if (\n waveform.kind ===\n \"aperiodic-relative-multiplier\"\n ) {\n const last =\n waveform.samples[\n waveform.samples.length - 1\n ]!;\n if (\n waveformTimeSeconds < 0 ||\n waveformTimeSeconds >\n last\n .timeSecondsFromWaveformReference\n ) {\n return 0;\n }\n return interpolateWaveform(\n waveform.samples,\n waveformTimeSeconds\n );\n }\n\n const periodicTime =\n positiveModulo(\n waveformTimeSeconds,\n waveform.periodSeconds\n );\n return interpolateWaveform(\n waveform.samples,\n periodicTime\n );\n}\n\n/**\n * Returns one registered source's time-varying multiplier at one capture time.\n *\n * Capture time is in seconds from the first opening boundary of the exposure. Sensor\n * readout timing is never used in place of capture time.\n */\nexport function evaluateSceneIlluminationTemporalMultiplier(\n input:\n EvaluateSceneIlluminationTemporalMultiplierInput\n): SceneIlluminationTemporalMultiplierEvaluation {\n requireInputKeys(input, \"evaluateSceneIlluminationTemporalMultiplier\", [\"illuminationProfile\", \"temporalProfile\", \"sourceId\", \"captureTimeSecondsFromReference\"]);\n if (\n typeof input.sourceId !== \"string\" ||\n input.sourceId.trim().length === 0\n ) {\n throw new InvalidConfigurationError(\n \"sourceId must be a non-empty string.\"\n );\n }\n if (\n typeof input\n .captureTimeSecondsFromReference !==\n \"number\" ||\n !Number.isFinite(\n input\n .captureTimeSecondsFromReference\n )\n ) {\n throw new InvalidScientificInputError(\n \"captureTimeSecondsFromReference must be finite.\"\n );\n }\n\n const {\n source,\n binding,\n waveform\n } =\n resolveSourceAndTemporalBinding(\n input.illuminationProfile,\n input.temporalProfile,\n input.sourceId\n );\n\n const waveformTimeSeconds =\n input\n .captureTimeSecondsFromReference -\n binding\n .waveformTimeZeroSecondsFromCaptureReference;\n const multiplier =\n evaluateWaveform(\n waveform,\n waveformTimeSeconds\n );\n\n return {\n sourceId: source.sourceId,\n sourceEnabled: source.enabled,\n temporalProfileId:\n input.temporalProfile.profileId,\n bindingId: binding.bindingId,\n waveformId: waveform.waveformId,\n captureTimeReference:\n \"first-opening-boundary-phase\",\n captureTimeSecondsFromReference:\n input\n .captureTimeSecondsFromReference,\n waveformTimeSecondsFromWaveformReference:\n waveformTimeSeconds,\n waveformKind: waveform.kind,\n relativeMagnitudeMultiplier:\n multiplier,\n effectiveRelativeMagnitudeMultiplier:\n source.enabled ? multiplier : 0,\n sourceMagnitudeApplied: false,\n materialTransportApplied: false,\n sceneRadianceCalculated: false,\n sensorReadoutTimingUsed: false,\n automaticExposureResolved: false\n };\n}\n\n/**\n * Integrates one source's time-varying multiplier over one local exposure window\n * (from sensor/exposure-window), using the deterministic midpoint rule.\n *\n * It integrates only the relative modulation over time. It does not apply source\n * magnitude, scene light transport, optics, sensor response or metering policy.\n */\nexport function integrateSceneIlluminationTemporalMultiplierOverExposureWindow(\n input:\n IntegrateSceneIlluminationTemporalMultiplierInput\n): SceneIlluminationTemporalExposureIntegration {\n requireInputKeys(input, \"integrateSceneIlluminationTemporalMultiplierOverExposureWindow\", [\"illuminationProfile\", \"temporalProfile\", \"sourceId\", \"exposureWindows\", \"sampleIndex\", \"temporalSampleCount\"]);\n requirePositiveInteger(\n \"temporalSampleCount\",\n input.temporalSampleCount\n );\n if (\n !Number.isSafeInteger(\n input.sampleIndex\n ) ||\n input.sampleIndex < 0\n ) {\n throw new InvalidScientificInputError(\n \"sampleIndex must be a non-negative safe integer.\"\n );\n }\n if (\n input.exposureWindows\n .timeReference !==\n \"first-opening-boundary-phase\"\n ) {\n throw new InvalidScientificInputError(\n \"Exposure windows must use the first-opening-boundary-phase time reference.\"\n );\n }\n\n const window =\n input.exposureWindows.samples[\n input.sampleIndex\n ];\n if (window === undefined) {\n throw new InvalidScientificInputError(\n \"sampleIndex is outside exposureWindows.samples.\"\n );\n }\n\n const context =\n resolveSourceAndTemporalBinding(\n input.illuminationProfile,\n input.temporalProfile,\n input.sourceId\n );\n const durationSeconds =\n window.localExposureDurationSeconds;\n const normalizedTimeWeight =\n 1 / input.temporalSampleCount;\n const timeMeasureSeconds =\n durationSeconds /\n input.temporalSampleCount;\n\n let averageMultiplier = 0;\n let integratedMultiplierSeconds =\n 0;\n let averageEffectiveMultiplier =\n 0;\n let integratedEffectiveMultiplierSeconds =\n 0;\n\n const nodes = Array.from(\n {\n length:\n input.temporalSampleCount\n },\n (_, temporalSampleIndex) => {\n const localExposurePhase =\n (temporalSampleIndex + 0.5) /\n input.temporalSampleCount;\n const captureTimeSeconds =\n window\n .startOffsetSecondsFromOpeningReference +\n localExposurePhase *\n durationSeconds;\n const evaluated =\n evaluateSceneIlluminationTemporalMultiplier(\n {\n illuminationProfile:\n input.illuminationProfile,\n temporalProfile:\n input.temporalProfile,\n sourceId: input.sourceId,\n captureTimeSecondsFromReference:\n captureTimeSeconds\n }\n );\n\n averageMultiplier +=\n evaluated\n .relativeMagnitudeMultiplier *\n normalizedTimeWeight;\n integratedMultiplierSeconds +=\n evaluated\n .relativeMagnitudeMultiplier *\n timeMeasureSeconds;\n averageEffectiveMultiplier +=\n evaluated\n .effectiveRelativeMagnitudeMultiplier *\n normalizedTimeWeight;\n integratedEffectiveMultiplierSeconds +=\n evaluated\n .effectiveRelativeMagnitudeMultiplier *\n timeMeasureSeconds;\n\n return {\n temporalSampleIndex,\n localExposurePhase,\n captureTimeSecondsFromReference:\n captureTimeSeconds,\n waveformTimeSecondsFromWaveformReference:\n evaluated\n .waveformTimeSecondsFromWaveformReference,\n relativeMagnitudeMultiplier:\n evaluated\n .relativeMagnitudeMultiplier,\n effectiveRelativeMagnitudeMultiplier:\n evaluated\n .effectiveRelativeMagnitudeMultiplier,\n normalizedTimeWeight,\n timeMeasureSeconds\n };\n }\n );\n\n return {\n sourceId: context.source.sourceId,\n sourceEnabled:\n context.source.enabled,\n temporalProfileId:\n input.temporalProfile.profileId,\n bindingId:\n context.binding.bindingId,\n waveformId:\n context.waveform.waveformId,\n timeReference:\n \"first-opening-boundary-phase\",\n localExposureWindow: {\n startSecondsFromCaptureReference:\n window\n .startOffsetSecondsFromOpeningReference,\n endSecondsFromCaptureReference:\n window\n .endOffsetSecondsFromOpeningReference,\n durationSeconds\n },\n quadratureScheme:\n \"uniform-midpoint\",\n temporalSampleCount:\n input.temporalSampleCount,\n nodes,\n averageRelativeMagnitudeMultiplier:\n averageMultiplier,\n integratedRelativeMagnitudeSeconds:\n integratedMultiplierSeconds,\n averageEffectiveRelativeMagnitudeMultiplier:\n averageEffectiveMultiplier,\n integratedEffectiveRelativeMagnitudeSeconds:\n integratedEffectiveMultiplierSeconds,\n sourceMagnitudeApplied: false,\n materialTransportApplied: false,\n sceneRadianceCalculated: false,\n sensorReadoutTimingUsed: false,\n automaticExposureResolved: false,\n convergenceErrorEstimated: false\n };\n}\n"]}
1
+ {"version":3,"file":"illumination-temporal.js","sourceRoot":"","sources":["../../src/schema/illumination-temporal.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;;;;;GASG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EACL,iBAAiB,EAElB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACvB,MAAM,uBAAuB,CAAC;AAQ/B,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,6BAA6B,EAAE,mBAAmB,IAAI,aAAa,EAAE,0BAA0B,IAAI,qBAAqB,EAAE,mBAAmB,IAAI,aAAa,EAAE,2BAA2B,IAAI,qBAAqB,EAAE,4BAA4B,IAAI,qBAAqB,EAAE,8BAA8B,IAAI,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACra,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,MAAM,CAAC,MAAM,kDAAkD,GAC7D,OAAgB,CAAC;AA8KnB,SAAS,8BAA8B,CACrC,KAAc,EACd,IAAY;IAEZ,MAAM,QAAQ,GAAG,iBAAiB,CAChC,KAAK,EACL,IAAI,CACL,CAAC;IACF,IACE,CAAC,QAAQ,CAAC,IAAI,CACZ,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,WAAW;QACf,eAAe;QACjB,KAAK,CAAC,WAAW;YACf,gBAAgB,CACrB,EACD,CAAC;QACD,MAAM,IAAI,yBAAyB,CACjC,IAAI;YACF,2GAA2G,CAC9G,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,4BAA4B,CACnC,KAAc,EACd,IAAY;IAEZ,MAAM,MAAM,GAAG,aAAa,CAC1B,KAAK,EACL,IAAI,EAAE,IAAI,CACX,CAAC;IACF,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,kBAAkB,EAAE,CAAC,MAAM,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1J,IACE,MAAM,CAAC,IAAI;QACX,kBAAkB,EAClB,CAAC;QACD,OAAO;YACL,IAAI,EAAE,kBAAkB;YACxB,gBAAgB,EACd,wBAAwB,CACtB,MAAM,CAAC,gBAAgB,EACvB,IAAI;gBACF,mBAAmB,CACtB;YACH,KAAK,EAAE,qBAAqB,CAC1B,MAAM,CAAC,KAAK,EACZ,IAAI,GAAG,QAAQ,CAChB;SACF,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACrC,OAAO;YACL,IAAI,EAAE,gBAAgB;YACtB,UAAU,EACR,qBAAqB,CACnB,MAAM,CAAC,UAAU,EACjB,IAAI,GAAG,aAAa,CACrB;SACJ,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,yBAAyB,CACjC,IAAI,GAAG,mBAAmB,CAC3B,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAAc,EACd,IAAY;IAEZ,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrB,KAAK,CAAC,MAAM,GAAG,CAAC,EAChB,CAAC;QACD,MAAM,IAAI,yBAAyB,CACjC,IAAI;YACF,qCAAqC,CACxC,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,GACV,MAAM,CAAC,iBAAiB,CAAC;IAC3B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAChC,MAAM,UAAU,GACd,IAAI,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC;QAC3B,MAAM,MAAM,GAAG,aAAa,CAC1B,KAAK,EACL,UAAU,EAAE,CAAC,kCAAkC,EAAE,6BAA6B,CAAC,CAChF,CAAC;QACF,MAAM,IAAI,GACR,wBAAwB,CACtB,MAAM;aACH,gCAAgC,EACnC,UAAU;YACR,mCAAmC,CACtC,CAAC;QACJ,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;YACrB,MAAM,IAAI,yBAAyB,CACjC,IAAI;gBACF,qCAAqC,CACxC,CAAC;QACJ,CAAC;QACD,QAAQ,GAAG,IAAI,CAAC;QAChB,OAAO;YACL,gCAAgC,EAC9B,IAAI;YACN,2BAA2B,EACzB,wBAAwB,CACtB,MAAM;iBACH,2BAA2B,EAC9B,UAAU;gBACR,8BAA8B,CACjC;SACJ,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,CAAU,CAAC;AAEpJ,SAAS,aAAa,CACpB,KAAc,EACd,IAAY;IAEZ,MAAM,MAAM,GAAG,aAAa,CAC1B,KAAK,EACL,IAAI,EAAE,IAAI,CACX,CAAC;IACF,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE;QACzC,+BAA+B,EAAE,CAAC,GAAG,oBAAoB,EAAE,wBAAwB,CAAC;QACpF,8BAA8B,EAAE,CAAC,GAAG,oBAAoB,EAAE,eAAe,EAAE,4BAA4B,CAAC;KACzG,EAAE,IAAI,CAAC,CAAC;IACT,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,IAAI,yBAAyB,CACjC,IAAI,GAAG,wBAAwB,CAChC,CAAC;IACJ,CAAC;IACD,IACE,MAAM,CAAC,aAAa;QACpB,kBAAkB,EAClB,CAAC;QACD,MAAM,IAAI,yBAAyB,CACjC,IAAI;YACF,4CAA4C,CAC/C,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GACd,qBAAqB,CACnB,MAAM,CAAC,UAAU,EACjB,IAAI,GAAG,aAAa,CACrB,CAAC;IACJ,MAAM,gBAAgB,GACpB,qBAAqB,CACnB,MAAM,CAAC,gBAAgB,EACvB,IAAI,GAAG,mBAAmB,CAC3B,CAAC;IACJ,MAAM,WAAW,GACf,gBAAgB,CACd,MAAM,CAAC,WAAW,EAClB,IAAI,GAAG,cAAc,CACtB,CAAC;IACJ,IACE,gBAAgB,KAAK,YAAY;QACjC,WAAW,CAAC,IAAI,KAAK,UAAU,EAC/B,CAAC;QACD,MAAM,IAAI,yBAAyB,CACjC,IAAI;YACF,qEAAqE,CACxE,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GACZ,8BAA8B,CAC5B,MAAM,CAAC,QAAQ,EACf,IAAI,GAAG,WAAW,CACnB,CAAC;IACJ,MAAM,OAAO,GACX,oBAAoB,CAClB,MAAM,CAAC,OAAO,EACd,IAAI,GAAG,UAAU,CAClB,CAAC;IAEJ,IACE,OAAO,CAAC,CAAC,CAAE;SACR,gCAAgC;QACnC,CAAC,EACD,CAAC;QACD,MAAM,IAAI,yBAAyB,CACjC,IAAI;YACF,4CAA4C,CAC/C,CAAC;IACJ,CAAC;IAED,IACE,MAAM,CAAC,IAAI;QACX,+BAA+B,EAC/B,CAAC;QACD,IACE,MAAM,CAAC,sBAAsB;YAC7B,MAAM,EACN,CAAC;YACD,MAAM,IAAI,yBAAyB,CACjC,IAAI;gBACF,yCAAyC,CAC5C,CAAC;QACJ,CAAC;QACD,OAAO;YACL,IAAI,EACF,+BAA+B;YACjC,UAAU;YACV,QAAQ,EAAE,GAAG;YACb,gBAAgB;YAChB,WAAW;YACX,QAAQ;YACR,aAAa,EACX,kBAAkB;YACpB,OAAO;YACP,sBAAsB,EACpB,MAAM;SACT,CAAC;IACJ,CAAC;IAED,IACE,MAAM,CAAC,IAAI;QACX,8BAA8B,EAC9B,CAAC;QACD,MAAM,aAAa,GACjB,qBAAqB,CACnB,MAAM,CAAC,aAAa,EACpB,IAAI,GAAG,gBAAgB,CACxB,CAAC;QACJ,MAAM,IAAI,GACR,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;QAC/B,IACE,IAAI;aACD,gCAAgC;YACnC,aAAa,EACb,CAAC;YACD,MAAM,IAAI,yBAAyB,CACjC,IAAI;gBACF,6CAA6C,CAChD,CAAC;QACJ,CAAC;QACD,IACE,OAAO,CAAC,CAAC,CAAE;aACR,2BAA2B;YAC9B,IAAI,CAAC,2BAA2B,EAChC,CAAC;YACD,MAAM,IAAI,yBAAyB,CACjC,IAAI;gBACF,4CAA4C,CAC/C,CAAC;QACJ,CAAC;QACD,IACE,MAAM,CAAC,0BAA0B;YACjC,IAAI,EACJ,CAAC;YACD,MAAM,IAAI,yBAAyB,CACjC,IAAI;gBACF,2CAA2C,CAC9C,CAAC;QACJ,CAAC;QACD,OAAO;YACL,IAAI,EACF,8BAA8B;YAChC,UAAU;YACV,QAAQ,EAAE,GAAG;YACb,gBAAgB;YAChB,WAAW;YACX,QAAQ;YACR,aAAa,EACX,kBAAkB;YACpB,OAAO;YACP,aAAa;YACb,0BAA0B,EACxB,IAAI;SACP,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,yBAAyB,CACjC,IAAI,GAAG,mBAAmB,CAC3B,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAc,EACd,IAAY;IAEZ,MAAM,MAAM,GAAG,aAAa,CAC1B,KAAK,EACL,IAAI,EAAE,CAAC,sBAAsB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,6CAA6C,EAAE,UAAU,CAAC,CAC1K,CAAC;IACF,IACE,MAAM,CAAC,oBAAoB;QAC3B,8BAA8B,EAC9B,CAAC;QACD,MAAM,IAAI,yBAAyB,CACjC,IAAI;YACF,+DAA+D,CAClE,CAAC;IACJ,CAAC;IAED,MAAM,gBAAgB,GACpB,qBAAqB,CACnB,MAAM,CAAC,gBAAgB,EACvB,IAAI,GAAG,mBAAmB,CAC3B,CAAC;IACJ,MAAM,iBAAiB,GACrB,4BAA4B,CAC1B,MAAM,CAAC,iBAAiB,EACxB,IAAI,GAAG,oBAAoB,CAC5B,CAAC;IACJ,IACE,gBAAgB,KAAK,YAAY;QACjC,iBAAiB,CAAC,IAAI;YACpB,kBAAkB,EACpB,CAAC;QACD,MAAM,IAAI,yBAAyB,CACjC,IAAI;YACF,oFAAoF,CACvF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EACP,qBAAqB,CACnB,MAAM,CAAC,SAAS,EAChB,IAAI,GAAG,YAAY,CACpB;QACH,QAAQ,EACN,qBAAqB,CACnB,MAAM,CAAC,QAAQ,EACf,IAAI,GAAG,WAAW,CACnB;QACH,UAAU,EACR,qBAAqB,CACnB,MAAM,CAAC,UAAU,EACjB,IAAI,GAAG,aAAa,CACrB;QACH,oBAAoB,EAClB,8BAA8B;QAChC,2CAA2C,EACzC,aAAa,CACX,MAAM;aACH,2CAA2C,EAC9C,IAAI;YACF,8CAA8C,CACjD;QACH,gBAAgB;QAChB,iBAAiB;QACjB,QAAQ,EAAE,iBAAiB,CACzB,MAAM,CAAC,QAAQ,EACf,IAAI,GAAG,WAAW,CACnB;KACF,CAAC;AACJ,CAAC;AAED,wFAAwF;AACxF,MAAM,6BAA6B,GAAG;IACpC,2CAA2C,EAAE,IAAI,EAAE,uCAAuC,EAAE,KAAK;IACjG,+BAA+B,EAAE,KAAK;CAC9B,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,UAAU,qCAAqC,CACnD,KAAc;IAEd,MAAM,MAAM,GAAG,aAAa,CAC1B,KAAK,EACL,kCAAkC,EAAE,CAAC,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,SAAS,EAAE,uBAAuB,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CACjM,CAAC;IACF,6BAA6B,CAAC,MAAM,EAAE,6BAA6B,EAAE,kCAAkC,CAAC,CAAC;IACzG,IACE,MAAM,CAAC,aAAa;QACpB,kDAAkD,EAClD,CAAC;QACD,MAAM,IAAI,yBAAyB,CACjC,0DAA0D;YACxD,kDAAkD;YAClD,IAAI,CACP,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,yBAAyB,CACjC,8DAA8D,CAC/D,CAAC;IACJ,CAAC;IACD,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,EACrC,CAAC;QACD,MAAM,IAAI,yBAAyB,CACjC,mEAAmE,CACpE,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GACb,MAAM,CAAC,SAAS,CAAC,GAAG,CAClB,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CACf,aAAa,CACX,KAAK,EACL,6CAA6C;QAC3C,KAAK;QACL,GAAG,CACN,CACJ,CAAC;IACJ,MAAM,WAAW,GACf,SAAS,CAAC,GAAG,CACX,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAC5B,CAAC;IACJ,IACE,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI;QACzB,WAAW,CAAC,MAAM,EAClB,CAAC;QACD,MAAM,IAAI,yBAAyB,CACjC,sFAAsF,CACvF,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAClB,MAAM,CAAC,cAAc,CAAC,GAAG,CACvB,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CACf,kBAAkB,CAChB,KAAK,EACL,kDAAkD;QAChD,KAAK;QACL,GAAG,CACN,CACJ,CAAC;IACJ,MAAM,UAAU,GACd,cAAc,CAAC,GAAG,CAChB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAC3B,CAAC;IACJ,IACE,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI;QACxB,UAAU,CAAC,MAAM,EACjB,CAAC;QACD,MAAM,IAAI,yBAAyB,CACjC,0FAA0F,CAC3F,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GACb,cAAc,CAAC,GAAG,CAChB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAC1B,CAAC;IACJ,IACE,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI;QACvB,SAAS,CAAC,MAAM,EAChB,CAAC;QACD,MAAM,IAAI,yBAAyB,CACjC,sGAAsG,CACvG,CAAC;IACJ,CAAC;IACD,MAAM,aAAa,GACjB,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IACvB,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACrC,IACE,CAAC,aAAa,CAAC,GAAG,CAChB,OAAO,CAAC,UAAU,CACnB,EACD,CAAC;YACD,MAAM,IAAI,yBAAyB,CACjC,mFAAmF,CACpF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,aAAa,EACX,kDAAkD;QACpD,SAAS,EACP,qBAAqB,CACnB,MAAM,CAAC,SAAS,EAChB,4CAA4C,CAC7C;QACH,OAAO,EACL,qBAAqB,CACnB,MAAM,CAAC,OAAO,EACd,0CAA0C,CAC3C;QACH,qBAAqB,EACnB,qBAAqB,CACnB,MAAM,CAAC,qBAAqB,EAC5B,wDAAwD,CACzD;QACH,QAAQ,EAAE,iBAAiB,CACzB,MAAM,CAAC,QAAQ,EACf,2CAA2C,CAC5C;QACD,SAAS;QACT,cAAc;QACd,2CAA2C,EACzC,IAAI;QACN,uCAAuC,EACrC,KAAK;QACP,+BAA+B,EAC7B,KAAK;KACR,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,mBAC0B,EAC1B,eACkC;IAElC,IACE,eAAe,CAAC,OAAO;QACvB,mBAAmB,CAAC,OAAO,EAC3B,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,4EAA4E,CAC7E,CAAC;IACJ,CAAC;IACD,IACE,eAAe;SACZ,qBAAqB;QACxB,mBAAmB,CAAC,SAAS,EAC7B,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,mGAAmG,CACpG,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAClB,IAAI,GAAG,CACL,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAC7B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAC1B,CACF,CAAC;IACJ,KACE,MAAM,OAAO,IACb,eAAe,CAAC,cAAc,EAC9B,CAAC;QACD,IACE,CAAC,cAAc,CAAC,GAAG,CACjB,OAAO,CAAC,QAAQ,CACjB,EACD,CAAC;YACD,MAAM,IAAI,2BAA2B,CACnC,8GAA8G,CAC/G,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,+BAA+B,CACtC,mBAC0B,EAC1B,eACkC,EAClC,QAAgB;IAShB,sBAAsB,CACpB,mBAAmB,EACnB,eAAe,CAChB,CAAC;IAEF,MAAM,MAAM,GACV,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAC9B,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAC9B,CAAC;IACJ,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,2BAA2B,CACnC,gEAAgE,CACjE,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GACX,eAAe,CAAC,cAAc,CAAC,IAAI,CACjC,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAC9B,CAAC;IACJ,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,2BAA2B,CACnC,8FAA8F,CAC/F,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GACZ,eAAe,CAAC,SAAS,CAAC,IAAI,CAC5B,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,UAAU;QAChB,OAAO,CAAC,UAAU,CACrB,CAAC;IACJ,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,2BAA2B,CACnC,6EAA6E,CAC9E,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM;QACN,OAAO;QACP,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,OACoD,EACpD,WAAmB;IAEnB,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;IAC1B,MAAM,IAAI,GACR,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IAE/B,IACE,WAAW;QACX,KAAK,CAAC,gCAAgC,EACtC,CAAC;QACD,OAAO,KAAK;aACT,2BAA2B,CAAC;IACjC,CAAC;IACD,IACE,WAAW;QACX,IAAI,CAAC,gCAAgC,EACrC,CAAC;QACD,OAAO,IAAI;aACR,2BAA2B,CAAC;IACjC,CAAC;IAED,KACE,IAAI,KAAK,GAAG,CAAC,EACb,KAAK,GAAG,OAAO,CAAC,MAAM,EACtB,KAAK,IAAI,CAAC,EACV,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAE,CAAC;QAC9B,IACE,WAAW;YACX,KAAK;iBACF,gCAAgC,EACnC,CAAC;YACD,MAAM,IAAI,GACR,OAAO,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC;YACtB,MAAM,IAAI,GACR,KAAK;iBACF,gCAAgC;gBACnC,IAAI;qBACD,gCAAgC,CAAC;YACtC,MAAM,KAAK,GACT,CAAC,WAAW;gBACV,IAAI;qBACD,gCAAgC,CAAC;gBACtC,IAAI,CAAC;YACP,OAAO,CACL,IAAI;iBACD,2BAA2B;gBAC9B,KAAK;oBACH,CAAC,KAAK;yBACH,2BAA2B;wBAC5B,IAAI;6BACD,2BAA2B,CAAC,CACpC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,IAAI;SACR,2BAA2B,CAAC;AACjC,CAAC;AAED,SAAS,gBAAgB,CACvB,QACmC,EACnC,mBAA2B;IAE3B,IACE,QAAQ,CAAC,IAAI;QACb,+BAA+B,EAC/B,CAAC;QACD,MAAM,IAAI,GACR,QAAQ,CAAC,OAAO,CACd,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAC3B,CAAC;QACL,IACE,mBAAmB,GAAG,CAAC;YACvB,mBAAmB;gBACjB,IAAI;qBACD,gCAAgC,EACrC,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,mBAAmB,CACxB,QAAQ,CAAC,OAAO,EAChB,mBAAmB,CACpB,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAChB,cAAc,CACZ,mBAAmB,EACnB,QAAQ,CAAC,aAAa,CACvB,CAAC;IACJ,OAAO,mBAAmB,CACxB,QAAQ,CAAC,OAAO,EAChB,YAAY,CACb,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2CAA2C,CACzD,KACkD;IAElD,gBAAgB,CAAC,KAAK,EAAE,6CAA6C,EAAE,CAAC,qBAAqB,EAAE,iBAAiB,EAAE,UAAU,EAAE,iCAAiC,CAAC,CAAC,CAAC;IAClK,IACE,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAClC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAClC,CAAC;QACD,MAAM,IAAI,yBAAyB,CACjC,sCAAsC,CACvC,CAAC;IACJ,CAAC;IACD,IACE,OAAO,KAAK;SACT,+BAA+B;QAChC,QAAQ;QACV,CAAC,MAAM,CAAC,QAAQ,CACd,KAAK;aACF,+BAA+B,CACnC,EACD,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,iDAAiD,CAClD,CAAC;IACJ,CAAC;IAED,MAAM,EACJ,MAAM,EACN,OAAO,EACP,QAAQ,EACT,GACC,+BAA+B,CAC7B,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,eAAe,EACrB,KAAK,CAAC,QAAQ,CACf,CAAC;IAEJ,MAAM,mBAAmB,GACvB,KAAK;SACF,+BAA+B;QAClC,OAAO;aACJ,2CAA2C,CAAC;IACjD,MAAM,UAAU,GACd,gBAAgB,CACd,QAAQ,EACR,mBAAmB,CACpB,CAAC;IAEJ,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,aAAa,EAAE,MAAM,CAAC,OAAO;QAC7B,iBAAiB,EACf,KAAK,CAAC,eAAe,CAAC,SAAS;QACjC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,oBAAoB,EAClB,8BAA8B;QAChC,+BAA+B,EAC7B,KAAK;aACF,+BAA+B;QACpC,wCAAwC,EACtC,mBAAmB;QACrB,YAAY,EAAE,QAAQ,CAAC,IAAI;QAC3B,2BAA2B,EACzB,UAAU;QACZ,oCAAoC,EAClC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACjC,sBAAsB,EAAE,KAAK;QAC7B,wBAAwB,EAAE,KAAK;QAC/B,uBAAuB,EAAE,KAAK;QAC9B,uBAAuB,EAAE,KAAK;QAC9B,yBAAyB,EAAE,KAAK;KACjC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,8DAA8D,CAC5E,KACmD;IAEnD,gBAAgB,CAAC,KAAK,EAAE,gEAAgE,EAAE,CAAC,qBAAqB,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAC3M,sBAAsB,CACpB,qBAAqB,EACrB,KAAK,CAAC,mBAAmB,CAC1B,CAAC;IACF,IACE,CAAC,MAAM,CAAC,aAAa,CACnB,KAAK,CAAC,WAAW,CAClB;QACD,KAAK,CAAC,WAAW,GAAG,CAAC,EACrB,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,kDAAkD,CACnD,CAAC;IACJ,CAAC;IACD,IACE,KAAK,CAAC,eAAe;SAClB,aAAa;QAChB,8BAA8B,EAC9B,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,4EAA4E,CAC7E,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GACV,KAAK,CAAC,eAAe,CAAC,OAAO,CAC3B,KAAK,CAAC,WAAW,CAClB,CAAC;IACJ,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,2BAA2B,CACnC,iDAAiD,CAClD,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GACX,+BAA+B,CAC7B,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,eAAe,EACrB,KAAK,CAAC,QAAQ,CACf,CAAC;IACJ,MAAM,eAAe,GACnB,MAAM,CAAC,4BAA4B,CAAC;IACtC,MAAM,oBAAoB,GACxB,CAAC,GAAG,KAAK,CAAC,mBAAmB,CAAC;IAChC,MAAM,kBAAkB,GACtB,eAAe;QACf,KAAK,CAAC,mBAAmB,CAAC;IAE5B,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,2BAA2B,GAC7B,CAAC,CAAC;IACJ,IAAI,0BAA0B,GAC5B,CAAC,CAAC;IACJ,IAAI,oCAAoC,GACtC,CAAC,CAAC;IAEJ,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CACtB;QACE,MAAM,EACJ,KAAK,CAAC,mBAAmB;KAC5B,EACD,CAAC,CAAC,EAAE,mBAAmB,EAAE,EAAE;QACzB,MAAM,kBAAkB,GACtB,CAAC,mBAAmB,GAAG,GAAG,CAAC;YAC3B,KAAK,CAAC,mBAAmB,CAAC;QAC5B,MAAM,kBAAkB,GACtB,MAAM;aACH,sCAAsC;YACzC,kBAAkB;gBAChB,eAAe,CAAC;QACpB,MAAM,SAAS,GACb,2CAA2C,CACzC;YACE,mBAAmB,EACjB,KAAK,CAAC,mBAAmB;YAC3B,eAAe,EACb,KAAK,CAAC,eAAe;YACvB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,+BAA+B,EAC7B,kBAAkB;SACrB,CACF,CAAC;QAEJ,iBAAiB;YACf,SAAS;iBACN,2BAA2B;gBAC9B,oBAAoB,CAAC;QACvB,2BAA2B;YACzB,SAAS;iBACN,2BAA2B;gBAC9B,kBAAkB,CAAC;QACrB,0BAA0B;YACxB,SAAS;iBACN,oCAAoC;gBACvC,oBAAoB,CAAC;QACvB,oCAAoC;YAClC,SAAS;iBACN,oCAAoC;gBACvC,kBAAkB,CAAC;QAErB,OAAO;YACL,mBAAmB;YACnB,kBAAkB;YAClB,+BAA+B,EAC7B,kBAAkB;YACpB,wCAAwC,EACtC,SAAS;iBACN,wCAAwC;YAC7C,2BAA2B,EACzB,SAAS;iBACN,2BAA2B;YAChC,oCAAoC,EAClC,SAAS;iBACN,oCAAoC;YACzC,oBAAoB;YACpB,kBAAkB;SACnB,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ;QACjC,aAAa,EACX,OAAO,CAAC,MAAM,CAAC,OAAO;QACxB,iBAAiB,EACf,KAAK,CAAC,eAAe,CAAC,SAAS;QACjC,SAAS,EACP,OAAO,CAAC,OAAO,CAAC,SAAS;QAC3B,UAAU,EACR,OAAO,CAAC,QAAQ,CAAC,UAAU;QAC7B,aAAa,EACX,8BAA8B;QAChC,mBAAmB,EAAE;YACnB,gCAAgC,EAC9B,MAAM;iBACH,sCAAsC;YAC3C,8BAA8B,EAC5B,MAAM;iBACH,oCAAoC;YACzC,eAAe;SAChB;QACD,gBAAgB,EACd,kBAAkB;QACpB,mBAAmB,EACjB,KAAK,CAAC,mBAAmB;QAC3B,KAAK;QACL,kCAAkC,EAChC,iBAAiB;QACnB,kCAAkC,EAChC,2BAA2B;QAC7B,2CAA2C,EACzC,0BAA0B;QAC5B,2CAA2C,EACzC,oCAAoC;QACtC,sBAAsB,EAAE,KAAK;QAC7B,wBAAwB,EAAE,KAAK;QAC/B,uBAAuB,EAAE,KAAK;QAC9B,uBAAuB,EAAE,KAAK;QAC9B,yBAAyB,EAAE,KAAK;QAChC,yBAAyB,EAAE,KAAK;KACjC,CAAC;AACJ,CAAC","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Time-varying light sources, such as flicker or a pulsed light.\n *\n * A temporal profile sits on top of an existing illumination profile. Each binding multiplies\n * one source by a relative waveform over time. The base source magnitude and spectrum still\n * apply, and sources with no binding stay constant. This module parses the profile, evaluates\n * a waveform at one capture time, and integrates it over an exposure window.\n * @see docs/SCENE_RADIANCE_AND_ILLUMINATION.md for equations, coordinate/unit conventions, blockers\n * and support limits.\n */\n\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport {\n parseEvidenceList,\n type EvidenceProvenance\n} from \"../core/evidence-provenance.js\";\nimport {\n InvalidScientificInputError,\n requirePositiveInteger\n} from \"../core/validation.js\";\nimport type {\n CaptureExposureWindows\n} from \"../sensor/exposure-window.js\";\nimport type {\n SceneIlluminationProfile,\n SceneIlluminationUncertainty\n} from \"./illumination.js\";\nimport { requireInputKeys, rejectUnknownVariantFields, requireFixedFieldsWhenPresent, requireConfigRecord as requireRecord, requireTrimmedConfigString as requireNonEmptyString, requireConfigFinite as requireFinite, parseConfigScientificStatus as parseScientificStatus, requireConfigFiniteAboveZero as requirePositiveFinite, requireConfigFiniteAtLeastZero as requireNonNegativeFinite } from \"../core/record-validation.js\";\nimport { parseUncertainty } from \"../optics/lens-psf-profile.js\";\nimport { positiveModulo } from \"../optics/complex-pupil-psf.js\";\n\nexport const SCENE_ILLUMINATION_TEMPORAL_PROFILE_SCHEMA_VERSION =\n \"0.1.0\" as const;\n\nexport type SceneIlluminationTemporalScientificStatus =\n | \"calibrated\"\n | \"approximation\";\n\nexport interface SceneIlluminationTemporalWaveformSample {\n timeSecondsFromWaveformReference: number;\n relativeMagnitudeMultiplier: number;\n}\n\ninterface SceneIlluminationTemporalWaveformBase {\n waveformId: string;\n timeUnit: \"s\";\n scientificStatus:\n SceneIlluminationTemporalScientificStatus;\n uncertainty: SceneIlluminationUncertainty;\n evidence: readonly EvidenceProvenance[];\n interpolation: \"piecewise-linear\";\n samples:\n readonly SceneIlluminationTemporalWaveformSample[];\n}\n\nexport type SceneIlluminationTemporalWaveform =\n | (SceneIlluminationTemporalWaveformBase & {\n kind:\n \"aperiodic-relative-multiplier\";\n outsideSupportBehavior: \"zero\";\n })\n | (SceneIlluminationTemporalWaveformBase & {\n kind:\n \"periodic-relative-multiplier\";\n periodSeconds: number;\n endpointContinuityRequired: true;\n });\n\nexport type SceneIlluminationTemporalRegistrationUncertainty =\n | {\n kind: \"absolute-seconds\";\n plusMinusSeconds: number;\n basis: string;\n }\n | {\n kind: \"not-quantified\";\n limitation: string;\n };\n\nexport interface SceneIlluminationTemporalSourceBinding {\n bindingId: string;\n sourceId: string;\n waveformId: string;\n captureTimeReference:\n \"first-opening-boundary-phase\";\n /**\n * The capture time at which the waveform's own t=0 falls.\n *\n * waveformTime = captureTime - waveformTimeZeroSecondsFromCaptureReference\n */\n waveformTimeZeroSecondsFromCaptureReference:\n number;\n scientificStatus:\n SceneIlluminationTemporalScientificStatus;\n timingUncertainty:\n SceneIlluminationTemporalRegistrationUncertainty;\n evidence: readonly EvidenceProvenance[];\n}\n\nexport interface SceneIlluminationTemporalProfile {\n schemaVersion:\n typeof SCENE_ILLUMINATION_TEMPORAL_PROFILE_SCHEMA_VERSION;\n profileId: string;\n sceneId: string;\n illuminationProfileId: string;\n evidence: readonly EvidenceProvenance[];\n waveforms:\n readonly SceneIlluminationTemporalWaveform[];\n sourceBindings:\n readonly SceneIlluminationTemporalSourceBinding[];\n baseIlluminationProfileRemainsAuthoritative:\n true;\n sensorReadoutTimingUsedAsExposureTiming:\n false;\n automaticExposurePolicyIncluded: false;\n}\n\nexport interface EvaluateSceneIlluminationTemporalMultiplierInput {\n illuminationProfile:\n SceneIlluminationProfile;\n temporalProfile:\n SceneIlluminationTemporalProfile;\n sourceId: string;\n captureTimeSecondsFromReference: number;\n}\n\nexport interface SceneIlluminationTemporalMultiplierEvaluation {\n sourceId: string;\n sourceEnabled: boolean;\n temporalProfileId: string;\n bindingId: string;\n waveformId: string;\n captureTimeReference:\n \"first-opening-boundary-phase\";\n captureTimeSecondsFromReference: number;\n waveformTimeSecondsFromWaveformReference:\n number;\n waveformKind:\n SceneIlluminationTemporalWaveform[\"kind\"];\n relativeMagnitudeMultiplier: number;\n effectiveRelativeMagnitudeMultiplier:\n number;\n sourceMagnitudeApplied: false;\n materialTransportApplied: false;\n sceneRadianceCalculated: false;\n sensorReadoutTimingUsed: false;\n automaticExposureResolved: false;\n}\n\nexport interface IntegrateSceneIlluminationTemporalMultiplierInput {\n illuminationProfile:\n SceneIlluminationProfile;\n temporalProfile:\n SceneIlluminationTemporalProfile;\n sourceId: string;\n exposureWindows: CaptureExposureWindows;\n sampleIndex: number;\n temporalSampleCount: number;\n}\n\nexport interface SceneIlluminationTemporalIntegrationNode {\n temporalSampleIndex: number;\n localExposurePhase: number;\n captureTimeSecondsFromReference: number;\n waveformTimeSecondsFromWaveformReference:\n number;\n relativeMagnitudeMultiplier: number;\n effectiveRelativeMagnitudeMultiplier:\n number;\n normalizedTimeWeight: number;\n timeMeasureSeconds: number;\n}\n\nexport interface SceneIlluminationTemporalExposureIntegration {\n sourceId: string;\n sourceEnabled: boolean;\n temporalProfileId: string;\n bindingId: string;\n waveformId: string;\n timeReference:\n \"first-opening-boundary-phase\";\n localExposureWindow: {\n startSecondsFromCaptureReference: number;\n endSecondsFromCaptureReference: number;\n durationSeconds: number;\n };\n quadratureScheme: \"uniform-midpoint\";\n temporalSampleCount: number;\n nodes:\n readonly SceneIlluminationTemporalIntegrationNode[];\n averageRelativeMagnitudeMultiplier:\n number;\n integratedRelativeMagnitudeSeconds:\n number;\n averageEffectiveRelativeMagnitudeMultiplier:\n number;\n integratedEffectiveRelativeMagnitudeSeconds:\n number;\n sourceMagnitudeApplied: false;\n materialTransportApplied: false;\n sceneRadianceCalculated: false;\n sensorReadoutTimingUsed: false;\n automaticExposureResolved: false;\n convergenceErrorEstimated: false;\n}\n\nfunction requireReusableNumericEvidence(\n value: unknown,\n path: string\n): readonly EvidenceProvenance[] {\n const evidence = parseEvidenceList(\n value,\n path\n );\n if (\n !evidence.some(\n (entry) =>\n entry.reuseStatus ===\n \"reusable-data\" ||\n entry.reuseStatus ===\n \"photivra-owned\"\n )\n ) {\n throw new InvalidConfigurationError(\n path +\n \" must contain reusable-data or photivra-owned evidence because the waveform embeds reusable numeric data.\"\n );\n }\n return evidence;\n}\n\nfunction parseRegistrationUncertainty(\n value: unknown,\n path: string\n): SceneIlluminationTemporalRegistrationUncertainty {\n const record = requireRecord(\n value,\n path, null\n );\n rejectUnknownVariantFields(record, \"kind\", { \"absolute-seconds\": [\"kind\", \"plusMinusSeconds\", \"basis\"], \"not-quantified\": [\"kind\", \"limitation\"] }, path);\n if (\n record.kind ===\n \"absolute-seconds\"\n ) {\n return {\n kind: \"absolute-seconds\",\n plusMinusSeconds:\n requireNonNegativeFinite(\n record.plusMinusSeconds,\n path +\n \".plusMinusSeconds\"\n ),\n basis: requireNonEmptyString(\n record.basis,\n path + \".basis\"\n )\n };\n }\n if (record.kind === \"not-quantified\") {\n return {\n kind: \"not-quantified\",\n limitation:\n requireNonEmptyString(\n record.limitation,\n path + \".limitation\"\n )\n };\n }\n throw new InvalidConfigurationError(\n path + \".kind is invalid.\"\n );\n}\n\nfunction parseWaveformSamples(\n value: unknown,\n path: string\n): readonly SceneIlluminationTemporalWaveformSample[] {\n if (\n !Array.isArray(value) ||\n value.length < 2\n ) {\n throw new InvalidConfigurationError(\n path +\n \" must contain at least two samples.\"\n );\n }\n\n let previous =\n Number.NEGATIVE_INFINITY;\n return value.map((entry, index) => {\n const samplePath =\n path + \"[\" + index + \"]\";\n const sample = requireRecord(\n entry,\n samplePath, [\"timeSecondsFromWaveformReference\", \"relativeMagnitudeMultiplier\"]\n );\n const time =\n requireNonNegativeFinite(\n sample\n .timeSecondsFromWaveformReference,\n samplePath +\n \".timeSecondsFromWaveformReference\"\n );\n if (time <= previous) {\n throw new InvalidConfigurationError(\n path +\n \" times must be strictly increasing.\"\n );\n }\n previous = time;\n return {\n timeSecondsFromWaveformReference:\n time,\n relativeMagnitudeMultiplier:\n requireNonNegativeFinite(\n sample\n .relativeMagnitudeMultiplier,\n samplePath +\n \".relativeMagnitudeMultiplier\"\n )\n };\n });\n}\n\nconst WAVEFORM_BASE_FIELDS = [\"kind\", \"waveformId\", \"timeUnit\", \"scientificStatus\", \"uncertainty\", \"evidence\", \"interpolation\", \"samples\"] as const;\n\nfunction parseWaveform(\n value: unknown,\n path: string\n): SceneIlluminationTemporalWaveform {\n const record = requireRecord(\n value,\n path, null\n );\n rejectUnknownVariantFields(record, \"kind\", {\n \"aperiodic-relative-multiplier\": [...WAVEFORM_BASE_FIELDS, \"outsideSupportBehavior\"],\n \"periodic-relative-multiplier\": [...WAVEFORM_BASE_FIELDS, \"periodSeconds\", \"endpointContinuityRequired\"]\n }, path);\n if (record.timeUnit !== \"s\") {\n throw new InvalidConfigurationError(\n path + '.timeUnit must be \"s\".'\n );\n }\n if (\n record.interpolation !==\n \"piecewise-linear\"\n ) {\n throw new InvalidConfigurationError(\n path +\n '.interpolation must be \"piecewise-linear\".'\n );\n }\n\n const waveformId =\n requireNonEmptyString(\n record.waveformId,\n path + \".waveformId\"\n );\n const scientificStatus =\n parseScientificStatus(\n record.scientificStatus,\n path + \".scientificStatus\"\n );\n const uncertainty =\n parseUncertainty(\n record.uncertainty,\n path + \".uncertainty\"\n );\n if (\n scientificStatus === \"calibrated\" &&\n uncertainty.kind !== \"relative\"\n ) {\n throw new InvalidConfigurationError(\n path +\n \" calibrated waveform data requires quantified relative uncertainty.\"\n );\n }\n const evidence =\n requireReusableNumericEvidence(\n record.evidence,\n path + \".evidence\"\n );\n const samples =\n parseWaveformSamples(\n record.samples,\n path + \".samples\"\n );\n\n if (\n samples[0]!\n .timeSecondsFromWaveformReference !==\n 0\n ) {\n throw new InvalidConfigurationError(\n path +\n \".samples must begin at waveform-local t=0.\"\n );\n }\n\n if (\n record.kind ===\n \"aperiodic-relative-multiplier\"\n ) {\n if (\n record.outsideSupportBehavior !==\n \"zero\"\n ) {\n throw new InvalidConfigurationError(\n path +\n '.outsideSupportBehavior must be \"zero\".'\n );\n }\n return {\n kind:\n \"aperiodic-relative-multiplier\",\n waveformId,\n timeUnit: \"s\",\n scientificStatus,\n uncertainty,\n evidence,\n interpolation:\n \"piecewise-linear\",\n samples,\n outsideSupportBehavior:\n \"zero\"\n };\n }\n\n if (\n record.kind ===\n \"periodic-relative-multiplier\"\n ) {\n const periodSeconds =\n requirePositiveFinite(\n record.periodSeconds,\n path + \".periodSeconds\"\n );\n const last =\n samples[samples.length - 1]!;\n if (\n last\n .timeSecondsFromWaveformReference !==\n periodSeconds\n ) {\n throw new InvalidConfigurationError(\n path +\n \".samples must end exactly at periodSeconds.\"\n );\n }\n if (\n samples[0]!\n .relativeMagnitudeMultiplier !==\n last.relativeMagnitudeMultiplier\n ) {\n throw new InvalidConfigurationError(\n path +\n \" periodic endpoint multipliers must match.\"\n );\n }\n if (\n record.endpointContinuityRequired !==\n true\n ) {\n throw new InvalidConfigurationError(\n path +\n \".endpointContinuityRequired must be true.\"\n );\n }\n return {\n kind:\n \"periodic-relative-multiplier\",\n waveformId,\n timeUnit: \"s\",\n scientificStatus,\n uncertainty,\n evidence,\n interpolation:\n \"piecewise-linear\",\n samples,\n periodSeconds,\n endpointContinuityRequired:\n true\n };\n }\n\n throw new InvalidConfigurationError(\n path + \".kind is invalid.\"\n );\n}\n\nfunction parseSourceBinding(\n value: unknown,\n path: string\n): SceneIlluminationTemporalSourceBinding {\n const record = requireRecord(\n value,\n path, [\"captureTimeReference\", \"scientificStatus\", \"timingUncertainty\", \"bindingId\", \"sourceId\", \"waveformId\", \"waveformTimeZeroSecondsFromCaptureReference\", \"evidence\"]\n );\n if (\n record.captureTimeReference !==\n \"first-opening-boundary-phase\"\n ) {\n throw new InvalidConfigurationError(\n path +\n '.captureTimeReference must be \"first-opening-boundary-phase\".'\n );\n }\n\n const scientificStatus =\n parseScientificStatus(\n record.scientificStatus,\n path + \".scientificStatus\"\n );\n const timingUncertainty =\n parseRegistrationUncertainty(\n record.timingUncertainty,\n path + \".timingUncertainty\"\n );\n if (\n scientificStatus === \"calibrated\" &&\n timingUncertainty.kind !==\n \"absolute-seconds\"\n ) {\n throw new InvalidConfigurationError(\n path +\n \" calibrated waveform registration requires quantified absolute timing uncertainty.\"\n );\n }\n\n return {\n bindingId:\n requireNonEmptyString(\n record.bindingId,\n path + \".bindingId\"\n ),\n sourceId:\n requireNonEmptyString(\n record.sourceId,\n path + \".sourceId\"\n ),\n waveformId:\n requireNonEmptyString(\n record.waveformId,\n path + \".waveformId\"\n ),\n captureTimeReference:\n \"first-opening-boundary-phase\",\n waveformTimeZeroSecondsFromCaptureReference:\n requireFinite(\n record\n .waveformTimeZeroSecondsFromCaptureReference,\n path +\n \".waveformTimeZeroSecondsFromCaptureReference\"\n ),\n scientificStatus,\n timingUncertainty,\n evidence: parseEvidenceList(\n record.evidence,\n path + \".evidence\"\n )\n };\n}\n\n/** Fixed flags the parser writes; a parsed profile may carry them back in unchanged. */\nconst TEMPORAL_PROFILE_FIXED_FIELDS = {\n baseIlluminationProfileRemainsAuthoritative: true, sensorReadoutTimingUsedAsExposureTiming: false,\n automaticExposurePolicyIncluded: false\n} as const;\n\n/**\n * Parses a time-varying illumination profile that sits on top of one existing\n * illumination profile.\n *\n * The base source magnitude and spectrum still apply. Each binding multiplies one\n * source by one relative waveform over time. Sources with no binding stay constant.\n */\nexport function parseSceneIlluminationTemporalProfile(\n value: unknown\n): SceneIlluminationTemporalProfile {\n const record = requireRecord(\n value,\n \"sceneIlluminationTemporalProfile\", [\"schemaVersion\", \"waveforms\", \"sourceBindings\", \"profileId\", \"sceneId\", \"illuminationProfileId\", \"evidence\", ...Object.keys(TEMPORAL_PROFILE_FIXED_FIELDS)]\n );\n requireFixedFieldsWhenPresent(record, TEMPORAL_PROFILE_FIXED_FIELDS, \"sceneIlluminationTemporalProfile\");\n if (\n record.schemaVersion !==\n SCENE_ILLUMINATION_TEMPORAL_PROFILE_SCHEMA_VERSION\n ) {\n throw new InvalidConfigurationError(\n 'sceneIlluminationTemporalProfile.schemaVersion must be \"' +\n SCENE_ILLUMINATION_TEMPORAL_PROFILE_SCHEMA_VERSION +\n '\".'\n );\n }\n if (!Array.isArray(record.waveforms)) {\n throw new InvalidConfigurationError(\n \"sceneIlluminationTemporalProfile.waveforms must be an array.\"\n );\n }\n if (\n !Array.isArray(record.sourceBindings)\n ) {\n throw new InvalidConfigurationError(\n \"sceneIlluminationTemporalProfile.sourceBindings must be an array.\"\n );\n }\n\n const waveforms =\n record.waveforms.map(\n (entry, index) =>\n parseWaveform(\n entry,\n \"sceneIlluminationTemporalProfile.waveforms[\" +\n index +\n \"]\"\n )\n );\n const waveformIds =\n waveforms.map(\n (entry) => entry.waveformId\n );\n if (\n new Set(waveformIds).size !==\n waveformIds.length\n ) {\n throw new InvalidConfigurationError(\n \"sceneIlluminationTemporalProfile.waveforms[].waveformId must not contain duplicates.\"\n );\n }\n\n const sourceBindings =\n record.sourceBindings.map(\n (entry, index) =>\n parseSourceBinding(\n entry,\n \"sceneIlluminationTemporalProfile.sourceBindings[\" +\n index +\n \"]\"\n )\n );\n const bindingIds =\n sourceBindings.map(\n (entry) => entry.bindingId\n );\n if (\n new Set(bindingIds).size !==\n bindingIds.length\n ) {\n throw new InvalidConfigurationError(\n \"sceneIlluminationTemporalProfile.sourceBindings[].bindingId must not contain duplicates.\"\n );\n }\n const sourceIds =\n sourceBindings.map(\n (entry) => entry.sourceId\n );\n if (\n new Set(sourceIds).size !==\n sourceIds.length\n ) {\n throw new InvalidConfigurationError(\n \"sceneIlluminationTemporalProfile supports at most one temporal binding per sourceId in schema 0.1.0.\"\n );\n }\n const waveformIdSet =\n new Set(waveformIds);\n for (const binding of sourceBindings) {\n if (\n !waveformIdSet.has(\n binding.waveformId\n )\n ) {\n throw new InvalidConfigurationError(\n \"sceneIlluminationTemporalProfile source binding references an unknown waveformId.\"\n );\n }\n }\n\n return {\n schemaVersion:\n SCENE_ILLUMINATION_TEMPORAL_PROFILE_SCHEMA_VERSION,\n profileId:\n requireNonEmptyString(\n record.profileId,\n \"sceneIlluminationTemporalProfile.profileId\"\n ),\n sceneId:\n requireNonEmptyString(\n record.sceneId,\n \"sceneIlluminationTemporalProfile.sceneId\"\n ),\n illuminationProfileId:\n requireNonEmptyString(\n record.illuminationProfileId,\n \"sceneIlluminationTemporalProfile.illuminationProfileId\"\n ),\n evidence: parseEvidenceList(\n record.evidence,\n \"sceneIlluminationTemporalProfile.evidence\"\n ),\n waveforms,\n sourceBindings,\n baseIlluminationProfileRemainsAuthoritative:\n true,\n sensorReadoutTimingUsedAsExposureTiming:\n false,\n automaticExposurePolicyIncluded:\n false\n };\n}\n\nfunction requireProfileBindings(\n illuminationProfile:\n SceneIlluminationProfile,\n temporalProfile:\n SceneIlluminationTemporalProfile\n): void {\n if (\n temporalProfile.sceneId !==\n illuminationProfile.sceneId\n ) {\n throw new InvalidScientificInputError(\n \"Temporal illumination profile sceneId must match the illumination profile.\"\n );\n }\n if (\n temporalProfile\n .illuminationProfileId !==\n illuminationProfile.profileId\n ) {\n throw new InvalidScientificInputError(\n \"Temporal illumination profile illuminationProfileId must match the supplied illumination profile.\"\n );\n }\n\n const knownSourceIds =\n new Set(\n illuminationProfile.sources.map(\n (entry) => entry.sourceId\n )\n );\n for (\n const binding of\n temporalProfile.sourceBindings\n ) {\n if (\n !knownSourceIds.has(\n binding.sourceId\n )\n ) {\n throw new InvalidScientificInputError(\n \"Temporal illumination source binding references a sourceId that is not declared by the illumination profile.\"\n );\n }\n }\n}\n\nfunction resolveSourceAndTemporalBinding(\n illuminationProfile:\n SceneIlluminationProfile,\n temporalProfile:\n SceneIlluminationTemporalProfile,\n sourceId: string\n): {\n source:\n SceneIlluminationProfile[\"sources\"][number];\n binding:\n SceneIlluminationTemporalSourceBinding;\n waveform:\n SceneIlluminationTemporalWaveform;\n} {\n requireProfileBindings(\n illuminationProfile,\n temporalProfile\n );\n\n const source =\n illuminationProfile.sources.find(\n (entry) =>\n entry.sourceId === sourceId\n );\n if (source === undefined) {\n throw new InvalidScientificInputError(\n \"sourceId is not declared by the supplied illumination profile.\"\n );\n }\n\n const binding =\n temporalProfile.sourceBindings.find(\n (entry) =>\n entry.sourceId === sourceId\n );\n if (binding === undefined) {\n throw new InvalidScientificInputError(\n \"Time-varying source evaluation requires an explicit source waveform-to-capture registration.\"\n );\n }\n\n const waveform =\n temporalProfile.waveforms.find(\n (entry) =>\n entry.waveformId ===\n binding.waveformId\n );\n if (waveform === undefined) {\n throw new InvalidScientificInputError(\n \"Temporal source binding waveformId is not declared by the temporal profile.\"\n );\n }\n\n return {\n source,\n binding,\n waveform\n };\n}\n\nfunction interpolateWaveform(\n samples:\n readonly SceneIlluminationTemporalWaveformSample[],\n timeSeconds: number\n): number {\n const first = samples[0]!;\n const last =\n samples[samples.length - 1]!;\n\n if (\n timeSeconds ===\n first.timeSecondsFromWaveformReference\n ) {\n return first\n .relativeMagnitudeMultiplier;\n }\n if (\n timeSeconds ===\n last.timeSecondsFromWaveformReference\n ) {\n return last\n .relativeMagnitudeMultiplier;\n }\n\n for (\n let index = 1;\n index < samples.length;\n index += 1\n ) {\n const right = samples[index]!;\n if (\n timeSeconds <\n right\n .timeSecondsFromWaveformReference\n ) {\n const left =\n samples[index - 1]!;\n const span =\n right\n .timeSecondsFromWaveformReference -\n left\n .timeSecondsFromWaveformReference;\n const phase =\n (timeSeconds -\n left\n .timeSecondsFromWaveformReference) /\n span;\n return (\n left\n .relativeMagnitudeMultiplier +\n phase *\n (right\n .relativeMagnitudeMultiplier -\n left\n .relativeMagnitudeMultiplier)\n );\n }\n }\n\n return last\n .relativeMagnitudeMultiplier;\n}\n\nfunction evaluateWaveform(\n waveform:\n SceneIlluminationTemporalWaveform,\n waveformTimeSeconds: number\n): number {\n if (\n waveform.kind ===\n \"aperiodic-relative-multiplier\"\n ) {\n const last =\n waveform.samples[\n waveform.samples.length - 1\n ]!;\n if (\n waveformTimeSeconds < 0 ||\n waveformTimeSeconds >\n last\n .timeSecondsFromWaveformReference\n ) {\n return 0;\n }\n return interpolateWaveform(\n waveform.samples,\n waveformTimeSeconds\n );\n }\n\n const periodicTime =\n positiveModulo(\n waveformTimeSeconds,\n waveform.periodSeconds\n );\n return interpolateWaveform(\n waveform.samples,\n periodicTime\n );\n}\n\n/**\n * Returns one registered source's time-varying multiplier at one capture time.\n *\n * Capture time is in seconds from the first opening boundary of the exposure. Sensor\n * readout timing is never used in place of capture time.\n */\nexport function evaluateSceneIlluminationTemporalMultiplier(\n input:\n EvaluateSceneIlluminationTemporalMultiplierInput\n): SceneIlluminationTemporalMultiplierEvaluation {\n requireInputKeys(input, \"evaluateSceneIlluminationTemporalMultiplier\", [\"illuminationProfile\", \"temporalProfile\", \"sourceId\", \"captureTimeSecondsFromReference\"]);\n if (\n typeof input.sourceId !== \"string\" ||\n input.sourceId.trim().length === 0\n ) {\n throw new InvalidConfigurationError(\n \"sourceId must be a non-empty string.\"\n );\n }\n if (\n typeof input\n .captureTimeSecondsFromReference !==\n \"number\" ||\n !Number.isFinite(\n input\n .captureTimeSecondsFromReference\n )\n ) {\n throw new InvalidScientificInputError(\n \"captureTimeSecondsFromReference must be finite.\"\n );\n }\n\n const {\n source,\n binding,\n waveform\n } =\n resolveSourceAndTemporalBinding(\n input.illuminationProfile,\n input.temporalProfile,\n input.sourceId\n );\n\n const waveformTimeSeconds =\n input\n .captureTimeSecondsFromReference -\n binding\n .waveformTimeZeroSecondsFromCaptureReference;\n const multiplier =\n evaluateWaveform(\n waveform,\n waveformTimeSeconds\n );\n\n return {\n sourceId: source.sourceId,\n sourceEnabled: source.enabled,\n temporalProfileId:\n input.temporalProfile.profileId,\n bindingId: binding.bindingId,\n waveformId: waveform.waveformId,\n captureTimeReference:\n \"first-opening-boundary-phase\",\n captureTimeSecondsFromReference:\n input\n .captureTimeSecondsFromReference,\n waveformTimeSecondsFromWaveformReference:\n waveformTimeSeconds,\n waveformKind: waveform.kind,\n relativeMagnitudeMultiplier:\n multiplier,\n effectiveRelativeMagnitudeMultiplier:\n source.enabled ? multiplier : 0,\n sourceMagnitudeApplied: false,\n materialTransportApplied: false,\n sceneRadianceCalculated: false,\n sensorReadoutTimingUsed: false,\n automaticExposureResolved: false\n };\n}\n\n/**\n * Integrates one source's time-varying multiplier over one local exposure window\n * (from sensor/exposure-window), using the deterministic midpoint rule.\n *\n * It integrates only the relative modulation over time. It does not apply source\n * magnitude, scene light transport, optics, sensor response or metering policy.\n */\nexport function integrateSceneIlluminationTemporalMultiplierOverExposureWindow(\n input:\n IntegrateSceneIlluminationTemporalMultiplierInput\n): SceneIlluminationTemporalExposureIntegration {\n requireInputKeys(input, \"integrateSceneIlluminationTemporalMultiplierOverExposureWindow\", [\"illuminationProfile\", \"temporalProfile\", \"sourceId\", \"exposureWindows\", \"sampleIndex\", \"temporalSampleCount\"]);\n requirePositiveInteger(\n \"temporalSampleCount\",\n input.temporalSampleCount\n );\n if (\n !Number.isSafeInteger(\n input.sampleIndex\n ) ||\n input.sampleIndex < 0\n ) {\n throw new InvalidScientificInputError(\n \"sampleIndex must be a non-negative safe integer.\"\n );\n }\n if (\n input.exposureWindows\n .timeReference !==\n \"first-opening-boundary-phase\"\n ) {\n throw new InvalidScientificInputError(\n \"Exposure windows must use the first-opening-boundary-phase time reference.\"\n );\n }\n\n const window =\n input.exposureWindows.samples[\n input.sampleIndex\n ];\n if (window === undefined) {\n throw new InvalidScientificInputError(\n \"sampleIndex is outside exposureWindows.samples.\"\n );\n }\n\n const context =\n resolveSourceAndTemporalBinding(\n input.illuminationProfile,\n input.temporalProfile,\n input.sourceId\n );\n const durationSeconds =\n window.localExposureDurationSeconds;\n const normalizedTimeWeight =\n 1 / input.temporalSampleCount;\n const timeMeasureSeconds =\n durationSeconds /\n input.temporalSampleCount;\n\n let averageMultiplier = 0;\n let integratedMultiplierSeconds =\n 0;\n let averageEffectiveMultiplier =\n 0;\n let integratedEffectiveMultiplierSeconds =\n 0;\n\n const nodes = Array.from(\n {\n length:\n input.temporalSampleCount\n },\n (_, temporalSampleIndex) => {\n const localExposurePhase =\n (temporalSampleIndex + 0.5) /\n input.temporalSampleCount;\n const captureTimeSeconds =\n window\n .startOffsetSecondsFromOpeningReference +\n localExposurePhase *\n durationSeconds;\n const evaluated =\n evaluateSceneIlluminationTemporalMultiplier(\n {\n illuminationProfile:\n input.illuminationProfile,\n temporalProfile:\n input.temporalProfile,\n sourceId: input.sourceId,\n captureTimeSecondsFromReference:\n captureTimeSeconds\n }\n );\n\n averageMultiplier +=\n evaluated\n .relativeMagnitudeMultiplier *\n normalizedTimeWeight;\n integratedMultiplierSeconds +=\n evaluated\n .relativeMagnitudeMultiplier *\n timeMeasureSeconds;\n averageEffectiveMultiplier +=\n evaluated\n .effectiveRelativeMagnitudeMultiplier *\n normalizedTimeWeight;\n integratedEffectiveMultiplierSeconds +=\n evaluated\n .effectiveRelativeMagnitudeMultiplier *\n timeMeasureSeconds;\n\n return {\n temporalSampleIndex,\n localExposurePhase,\n captureTimeSecondsFromReference:\n captureTimeSeconds,\n waveformTimeSecondsFromWaveformReference:\n evaluated\n .waveformTimeSecondsFromWaveformReference,\n relativeMagnitudeMultiplier:\n evaluated\n .relativeMagnitudeMultiplier,\n effectiveRelativeMagnitudeMultiplier:\n evaluated\n .effectiveRelativeMagnitudeMultiplier,\n normalizedTimeWeight,\n timeMeasureSeconds\n };\n }\n );\n\n return {\n sourceId: context.source.sourceId,\n sourceEnabled:\n context.source.enabled,\n temporalProfileId:\n input.temporalProfile.profileId,\n bindingId:\n context.binding.bindingId,\n waveformId:\n context.waveform.waveformId,\n timeReference:\n \"first-opening-boundary-phase\",\n localExposureWindow: {\n startSecondsFromCaptureReference:\n window\n .startOffsetSecondsFromOpeningReference,\n endSecondsFromCaptureReference:\n window\n .endOffsetSecondsFromOpeningReference,\n durationSeconds\n },\n quadratureScheme:\n \"uniform-midpoint\",\n temporalSampleCount:\n input.temporalSampleCount,\n nodes,\n averageRelativeMagnitudeMultiplier:\n averageMultiplier,\n integratedRelativeMagnitudeSeconds:\n integratedMultiplierSeconds,\n averageEffectiveRelativeMagnitudeMultiplier:\n averageEffectiveMultiplier,\n integratedEffectiveRelativeMagnitudeSeconds:\n integratedEffectiveMultiplierSeconds,\n sourceMagnitudeApplied: false,\n materialTransportApplied: false,\n sceneRadianceCalculated: false,\n sensorReadoutTimingUsed: false,\n automaticExposureResolved: false,\n convergenceErrorEstimated: false\n };\n}\n"]}
@@ -127,6 +127,7 @@ export interface SceneIlluminationProfile {
127
127
  volumetricTransportModeled: false;
128
128
  polarizationModeled: false;
129
129
  }
130
+ export declare function parseVector3(value: unknown, path: string): Vector3;
130
131
  /** Parses one source of a scene illumination profile (also used by record-taking helpers). Not a root export. */
131
132
  export declare function parseSceneIlluminationSource(value: unknown, path: string): SceneIlluminationSource;
132
133
  /**
@@ -8,64 +8,19 @@
8
8
  * @see docs/SCENE_RADIANCE_AND_ILLUMINATION.md for equations, coordinate/unit conventions, blockers
9
9
  * and support limits.
10
10
  */
11
- import { rejectUnknownFields, rejectUnknownVariantFields, requireFixedFieldsWhenPresent } from "../core/record-validation.js";
11
+ import { rejectUnknownFields, rejectUnknownVariantFields, requireFixedFieldsWhenPresent, requireConfigRecord as requireRecord, requireTrimmedConfigString as requireNonEmptyString, parseConfigScientificStatus as parseScientificStatus, requireConfigFiniteNumber as requireFinite, parseConfigLimitations as parseLimitations, requireConfigFraction as requireFraction, requireConfigNumberAtLeastZero as requireNonNegativeFinite, requireConfigNumberAboveZero as requirePositiveFinite } from "../core/record-validation.js";
12
12
  import { InvalidConfigurationError } from "../core/configuration-error.js";
13
13
  import { parseEvidenceList } from "../core/evidence-provenance.js";
14
14
  import { parseSpectralWavelengthBasis } from "../core/spectral.js";
15
15
  import { parseNormalizedDiscreteSpectralLineDistribution } from "../core/spectral-composition.js";
16
16
  export const SCENE_ILLUMINATION_PROFILE_SCHEMA_VERSION = "0.1.0";
17
- function requireRecord(value, path, allowedKeys) {
18
- if (typeof value !== "object" ||
19
- value === null ||
20
- Array.isArray(value)) {
21
- throw new InvalidConfigurationError(path + " must be an object.");
22
- }
23
- if (allowedKeys !== null)
24
- rejectUnknownFields(value, allowedKeys, path);
25
- return value;
26
- }
27
- function requireNonEmptyString(value, path) {
28
- if (typeof value !== "string" ||
29
- value.trim().length === 0) {
30
- throw new InvalidConfigurationError(path + " must be a non-empty string.");
31
- }
32
- return value.trim();
33
- }
34
17
  function requireBoolean(value, path) {
35
18
  if (typeof value !== "boolean") {
36
19
  throw new InvalidConfigurationError(path + " must be a boolean.");
37
20
  }
38
21
  return value;
39
22
  }
40
- function requireFinite(value, path) {
41
- if (typeof value !== "number" ||
42
- !Number.isFinite(value)) {
43
- throw new InvalidConfigurationError(path + " must be a finite number.");
44
- }
45
- return value;
46
- }
47
- function requirePositiveFinite(value, path) {
48
- const number = requireFinite(value, path);
49
- if (number <= 0) {
50
- throw new InvalidConfigurationError(path + " must be greater than zero.");
51
- }
52
- return number;
53
- }
54
- function requireNonNegativeFinite(value, path) {
55
- const number = requireFinite(value, path);
56
- if (number < 0) {
57
- throw new InvalidConfigurationError(path + " must be greater than or equal to zero.");
58
- }
59
- return number;
60
- }
61
- function requireFraction(value, path) {
62
- const number = requireFinite(value, path);
63
- if (number < 0 || number > 1) {
64
- throw new InvalidConfigurationError(path + " must be a finite fraction from 0 through 1.");
65
- }
66
- return number;
67
- }
68
- function parseVector3(value, path) {
23
+ export function parseVector3(value, path) {
69
24
  const record = requireRecord(value, path, ["x", "y", "z"]);
70
25
  return {
71
26
  x: requireFinite(record.x, path + ".x"),
@@ -82,13 +37,6 @@ function parseDirectionUnitVector(value, path) {
82
37
  }
83
38
  return vector;
84
39
  }
85
- function parseScientificStatus(value, path) {
86
- if (value !== "calibrated" &&
87
- value !== "approximation") {
88
- throw new InvalidConfigurationError(path + " is invalid.");
89
- }
90
- return value;
91
- }
92
40
  function parseUncertainty(value, path) {
93
41
  const record = requireRecord(value, path, null);
94
42
  if (record.kind === "relative") {
@@ -418,17 +366,6 @@ function parseSpectrum(value, path) {
418
366
  samples
419
367
  };
420
368
  }
421
- function parseLimitations(value, path) {
422
- if (!Array.isArray(value)) {
423
- throw new InvalidConfigurationError(path + " must be an array.");
424
- }
425
- const limitations = value.map((entry, index) => requireNonEmptyString(entry, path + "[" + index + "]"));
426
- if (new Set(limitations).size !==
427
- limitations.length) {
428
- throw new InvalidConfigurationError(path + " must not contain duplicates.");
429
- }
430
- return limitations;
431
- }
432
369
  function parseFamily(value, path) {
433
370
  if (value !== "point" &&
434
371
  value !== "spot" &&
@@ -1 +1 @@
1
- {"version":3,"file":"illumination.js","sourceRoot":"","sources":["../../src/schema/illumination.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Scene illumination profiles: the light sources in a scene, independent of any renderer.\n *\n * A profile describes sources only. It does not compute the light leaving surfaces\n * (outgoing scene radiance), material response, visibility or indirect light, and on its\n * own it does not justify photon or electron counts downstream.\n * @see docs/SCENE_RADIANCE_AND_ILLUMINATION.md for equations, coordinate/unit conventions, blockers\n * and support limits.\n */\n\nimport { rejectUnknownFields, rejectUnknownVariantFields, requireFixedFieldsWhenPresent } from \"../core/record-validation.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport {\n parseEvidenceList,\n type EvidenceProvenance\n} from \"../core/evidence-provenance.js\";\nimport {\n parseSpectralWavelengthBasis,\n type SpectralWavelengthBasis\n} from \"../core/spectral.js\";\nimport {\n parseNormalizedDiscreteSpectralLineDistribution,\n type NormalizedDiscreteSpectralLineDistribution\n} from \"../core/spectral-composition.js\";\nimport type { Vector3 } from \"./scene.js\";\n\ntype UnknownRecord = Record<string, unknown>;\n\nexport const SCENE_ILLUMINATION_PROFILE_SCHEMA_VERSION = \"0.1.0\" as const;\n\nexport type SceneIlluminationSourceFamily =\n | \"point\"\n | \"spot\"\n | \"area\"\n | \"directional\"\n | \"environment\";\n\nexport type SceneIlluminationScientificStatus =\n | \"calibrated\"\n | \"approximation\";\n\nexport type SceneIlluminationUncertainty =\n | {\n kind: \"relative\";\n fraction: number;\n basis: string;\n }\n | {\n kind: \"not-quantified\";\n limitation: string;\n };\n\nexport type SceneIlluminationSourceGeometry =\n | {\n kind: \"point-position\";\n positionM: Vector3;\n }\n | {\n kind: \"scene-object-binding\";\n sceneObjectId: string;\n }\n | {\n kind: \"spot\";\n origin:\n | {\n kind: \"point-position\";\n positionM: Vector3;\n }\n | {\n kind: \"scene-object-binding\";\n sceneObjectId: string;\n };\n directionUnitVector: Vector3;\n outerConeAngleDegrees: number;\n }\n | {\n kind: \"directional\";\n directionUnitVector: Vector3;\n }\n | {\n kind: \"environment\";\n };\n\nexport type SceneIlluminationMagnitude =\n | {\n kind: \"relative-linear-scale\";\n scale: number;\n scientificStatus: \"approximation\";\n limitation: string;\n }\n | {\n kind: \"radiant-intensity\";\n wattsPerSteradian: number;\n scientificStatus: SceneIlluminationScientificStatus;\n uncertainty: SceneIlluminationUncertainty;\n evidence: readonly EvidenceProvenance[];\n }\n | {\n kind: \"surface-radiance\";\n wattsPerSquareMeterSteradian: number;\n scientificStatus: SceneIlluminationScientificStatus;\n uncertainty: SceneIlluminationUncertainty;\n evidence: readonly EvidenceProvenance[];\n }\n | {\n kind: \"reference-plane-irradiance\";\n wattsPerSquareMeter: number;\n referencePlaneId: string;\n scientificStatus: SceneIlluminationScientificStatus;\n uncertainty: SceneIlluminationUncertainty;\n evidence: readonly EvidenceProvenance[];\n };\n\nexport interface SceneIlluminationRelativeSpectrumSample {\n wavelengthNanometers: number;\n relativeDensityPerNanometer: number;\n}\n\nexport type SceneIlluminationSpectrum =\n | {\n kind: \"unresolved\";\n limitation: string;\n }\n | {\n kind: \"rgb-preview-approximation\";\n colorSpace: \"linear-srgb\";\n red: number;\n green: number;\n blue: number;\n limitation: string;\n }\n | {\n kind: \"blackbody-temperature-approximation\";\n temperatureKelvin: number;\n limitation: string;\n }\n | {\n kind: \"continuous-relative-spectrum\";\n spectrumId: string;\n wavelengthUnit: \"nm\";\n wavelengthBasis: SpectralWavelengthBasis;\n interpolation: \"piecewise-linear\";\n outsideRangeBehavior: \"fail-closed\";\n normalization: \"arbitrary-relative-scale\";\n scientificStatus:\n | \"calibrated-relative-shape\"\n | \"approximation\";\n uncertainty: SceneIlluminationUncertainty;\n evidence: readonly EvidenceProvenance[];\n samples:\n readonly SceneIlluminationRelativeSpectrumSample[];\n }\n | {\n kind: \"discrete-relative-lines\";\n spectrumId: string;\n wavelengthUnit: \"nm\";\n scientificStatus:\n | \"calibrated-relative-lines\"\n | \"approximation\";\n uncertainty: SceneIlluminationUncertainty;\n evidence: readonly EvidenceProvenance[];\n distribution:\n NormalizedDiscreteSpectralLineDistribution;\n };\n\nexport interface SceneIlluminationSource {\n sourceId: string;\n family: SceneIlluminationSourceFamily;\n enabled: boolean;\n geometry: SceneIlluminationSourceGeometry;\n magnitude: SceneIlluminationMagnitude;\n spectrum: SceneIlluminationSpectrum;\n temporalBehavior: {\n kind: \"time-invariant\";\n };\n evidence: readonly EvidenceProvenance[];\n limitations?: readonly string[];\n}\n\nexport interface SceneIlluminationProfile {\n schemaVersion:\n typeof SCENE_ILLUMINATION_PROFILE_SCHEMA_VERSION;\n profileId: string;\n sceneId: string;\n evidence: readonly EvidenceProvenance[];\n sources: readonly SceneIlluminationSource[];\n sceneRadianceCalculated: false;\n materialResponseApplied: false;\n visibilityEvaluated: false;\n indirectTransportEvaluated: false;\n fluorescenceModeled: false;\n volumetricTransportModeled: false;\n polarizationModeled: false;\n}\n\nfunction requireRecord(\n value: unknown,\n path: string,\n allowedKeys: readonly string[] | null\n): UnknownRecord {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value)\n ) {\n throw new InvalidConfigurationError(\n path + \" must be an object.\"\n );\n }\n if (allowedKeys !== null) rejectUnknownFields(value, allowedKeys, path);\n return value as UnknownRecord;\n}\n\nfunction requireNonEmptyString(\n value: unknown,\n path: string\n): string {\n if (\n typeof value !== \"string\" ||\n value.trim().length === 0\n ) {\n throw new InvalidConfigurationError(\n path + \" must be a non-empty string.\"\n );\n }\n return value.trim();\n}\n\nfunction requireBoolean(\n value: unknown,\n path: string\n): boolean {\n if (typeof value !== \"boolean\") {\n throw new InvalidConfigurationError(\n path + \" must be a boolean.\"\n );\n }\n return value;\n}\n\nfunction requireFinite(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value)\n ) {\n throw new InvalidConfigurationError(\n path + \" must be a finite number.\"\n );\n }\n return value;\n}\n\nfunction requirePositiveFinite(\n value: unknown,\n path: string\n): number {\n const number = requireFinite(value, path);\n if (number <= 0) {\n throw new InvalidConfigurationError(\n path + \" must be greater than zero.\"\n );\n }\n return number;\n}\n\nfunction requireNonNegativeFinite(\n value: unknown,\n path: string\n): number {\n const number = requireFinite(value, path);\n if (number < 0) {\n throw new InvalidConfigurationError(\n path + \" must be greater than or equal to zero.\"\n );\n }\n return number;\n}\n\nfunction requireFraction(\n value: unknown,\n path: string\n): number {\n const number = requireFinite(value, path);\n if (number < 0 || number > 1) {\n throw new InvalidConfigurationError(\n path + \" must be a finite fraction from 0 through 1.\"\n );\n }\n return number;\n}\n\nfunction parseVector3(\n value: unknown,\n path: string\n): Vector3 {\n const record = requireRecord(value, path, [\"x\", \"y\", \"z\"]);\n return {\n x: requireFinite(record.x, path + \".x\"),\n y: requireFinite(record.y, path + \".y\"),\n z: requireFinite(record.z, path + \".z\")\n };\n}\n\nfunction parseDirectionUnitVector(\n value: unknown,\n path: string\n): Vector3 {\n const vector = parseVector3(value, path);\n const magnitude = Math.hypot(\n vector.x,\n vector.y,\n vector.z\n );\n if (\n !Number.isFinite(magnitude) ||\n Math.abs(magnitude - 1) > 1e-9\n ) {\n throw new InvalidConfigurationError(\n path + \" must be a unit-length direction vector.\"\n );\n }\n return vector;\n}\n\nfunction parseScientificStatus(\n value: unknown,\n path: string\n): SceneIlluminationScientificStatus {\n if (\n value !== \"calibrated\" &&\n value !== \"approximation\"\n ) {\n throw new InvalidConfigurationError(\n path + \" is invalid.\"\n );\n }\n return value;\n}\n\nfunction parseUncertainty(\n value: unknown,\n path: string\n): SceneIlluminationUncertainty {\n const record = requireRecord(value, path, null);\n\n if (record.kind === \"relative\") {\n rejectUnknownFields(record, [\"kind\", \"fraction\", \"basis\"], path);\n return {\n kind: \"relative\",\n fraction: requireNonNegativeFinite(\n record.fraction,\n path + \".fraction\"\n ),\n basis: requireNonEmptyString(\n record.basis,\n path + \".basis\"\n )\n };\n }\n\n if (record.kind === \"not-quantified\") {\n rejectUnknownFields(record, [\"kind\", \"limitation\"], path);\n return {\n kind: \"not-quantified\",\n limitation: requireNonEmptyString(\n record.limitation,\n path + \".limitation\"\n )\n };\n }\n\n throw new InvalidConfigurationError(\n path + \".kind is invalid.\"\n );\n}\n\nfunction validateCalibratedUncertainty(\n scientificStatus:\n SceneIlluminationScientificStatus,\n uncertainty: SceneIlluminationUncertainty,\n path: string\n): void {\n if (\n scientificStatus === \"calibrated\" &&\n uncertainty.kind !== \"relative\"\n ) {\n throw new InvalidConfigurationError(\n path +\n \" calibrated physical magnitude requires quantified relative uncertainty.\"\n );\n }\n}\n\nfunction parsePointOrigin(\n value: unknown,\n path: string\n):\n | {\n kind: \"point-position\";\n positionM: Vector3;\n }\n | {\n kind: \"scene-object-binding\";\n sceneObjectId: string;\n } {\n const record = requireRecord(value, path, null);\n\n if (record.kind === \"point-position\") {\n rejectUnknownFields(record, [\"kind\", \"positionM\"], path);\n return {\n kind: \"point-position\",\n positionM: parseVector3(\n record.positionM,\n path + \".positionM\"\n )\n };\n }\n\n if (record.kind === \"scene-object-binding\") {\n rejectUnknownFields(record, [\"kind\", \"sceneObjectId\"], path);\n return {\n kind: \"scene-object-binding\",\n sceneObjectId: requireNonEmptyString(\n record.sceneObjectId,\n path + \".sceneObjectId\"\n )\n };\n }\n\n throw new InvalidConfigurationError(\n path + \".kind is invalid.\"\n );\n}\n\nfunction parseGeometry(\n family: SceneIlluminationSourceFamily,\n value: unknown,\n path: string\n): SceneIlluminationSourceGeometry {\n // The allowed fields depend on the source family; parsePointOrigin checks the point geometry.\n const record = requireRecord(value, path, null);\n\n if (family === \"point\") {\n return parsePointOrigin(record, path);\n }\n\n if (family === \"spot\") {\n if (record.kind !== \"spot\") {\n throw new InvalidConfigurationError(\n path + '.kind must be \"spot\" for a spot source.'\n );\n }\n rejectUnknownFields(record, [\"kind\", \"origin\", \"directionUnitVector\", \"outerConeAngleDegrees\"], path);\n const outerConeAngleDegrees =\n requirePositiveFinite(\n record.outerConeAngleDegrees,\n path + \".outerConeAngleDegrees\"\n );\n if (outerConeAngleDegrees >= 180) {\n throw new InvalidConfigurationError(\n path +\n \".outerConeAngleDegrees must be less than 180.\"\n );\n }\n return {\n kind: \"spot\",\n origin: parsePointOrigin(\n record.origin,\n path + \".origin\"\n ),\n directionUnitVector:\n parseDirectionUnitVector(\n record.directionUnitVector,\n path + \".directionUnitVector\"\n ),\n outerConeAngleDegrees\n };\n }\n\n if (family === \"area\") {\n if (record.kind !== \"scene-object-binding\") {\n throw new InvalidConfigurationError(\n path +\n '.kind must be \"scene-object-binding\" for an area source so emitting geometry remains scene-owned.'\n );\n }\n rejectUnknownFields(record, [\"kind\", \"sceneObjectId\"], path);\n return {\n kind: \"scene-object-binding\",\n sceneObjectId: requireNonEmptyString(\n record.sceneObjectId,\n path + \".sceneObjectId\"\n )\n };\n }\n\n if (family === \"directional\") {\n if (record.kind !== \"directional\") {\n throw new InvalidConfigurationError(\n path +\n '.kind must be \"directional\" for a directional source.'\n );\n }\n rejectUnknownFields(record, [\"kind\", \"directionUnitVector\"], path);\n return {\n kind: \"directional\",\n directionUnitVector:\n parseDirectionUnitVector(\n record.directionUnitVector,\n path + \".directionUnitVector\"\n )\n };\n }\n\n if (record.kind !== \"environment\") {\n throw new InvalidConfigurationError(\n path +\n '.kind must be \"environment\" for an environment source.'\n );\n }\n rejectUnknownFields(record, [\"kind\"], path);\n return { kind: \"environment\" };\n}\n\nfunction parseMagnitude(\n family: SceneIlluminationSourceFamily,\n value: unknown,\n path: string\n): SceneIlluminationMagnitude {\n const record = requireRecord(value, path, null);\n rejectUnknownVariantFields(record, \"kind\", {\n \"relative-linear-scale\": [\"kind\", \"scale\", \"scientificStatus\", \"limitation\"],\n \"radiant-intensity\": [\"kind\", \"wattsPerSteradian\", \"scientificStatus\", \"uncertainty\", \"evidence\"],\n \"surface-radiance\": [\"kind\", \"wattsPerSquareMeterSteradian\", \"scientificStatus\", \"uncertainty\", \"evidence\"],\n \"reference-plane-irradiance\": [\"kind\", \"wattsPerSquareMeter\", \"referencePlaneId\", \"scientificStatus\", \"uncertainty\", \"evidence\"]\n }, path);\n\n if (record.kind === \"relative-linear-scale\") {\n if (record.scientificStatus !== \"approximation\") {\n throw new InvalidConfigurationError(\n path +\n '.scientificStatus must be \"approximation\" for relative-linear-scale.'\n );\n }\n return {\n kind: \"relative-linear-scale\",\n scale: requirePositiveFinite(\n record.scale,\n path + \".scale\"\n ),\n scientificStatus: \"approximation\",\n limitation: requireNonEmptyString(\n record.limitation,\n path + \".limitation\"\n )\n };\n }\n\n const scientificStatus =\n parseScientificStatus(\n record.scientificStatus,\n path + \".scientificStatus\"\n );\n const uncertainty =\n parseUncertainty(\n record.uncertainty,\n path + \".uncertainty\"\n );\n validateCalibratedUncertainty(\n scientificStatus,\n uncertainty,\n path\n );\n const evidence = parseEvidenceList(\n record.evidence,\n path + \".evidence\"\n );\n\n if (\n record.kind === \"radiant-intensity\" &&\n family === \"point\"\n ) {\n return {\n kind: \"radiant-intensity\",\n wattsPerSteradian:\n requirePositiveFinite(\n record.wattsPerSteradian,\n path + \".wattsPerSteradian\"\n ),\n scientificStatus,\n uncertainty,\n evidence\n };\n }\n\n if (\n record.kind === \"surface-radiance\" &&\n family === \"area\"\n ) {\n return {\n kind: \"surface-radiance\",\n wattsPerSquareMeterSteradian:\n requirePositiveFinite(\n record.wattsPerSquareMeterSteradian,\n path +\n \".wattsPerSquareMeterSteradian\"\n ),\n scientificStatus,\n uncertainty,\n evidence\n };\n }\n\n if (\n record.kind ===\n \"reference-plane-irradiance\" &&\n family === \"directional\"\n ) {\n return {\n kind: \"reference-plane-irradiance\",\n wattsPerSquareMeter:\n requirePositiveFinite(\n record.wattsPerSquareMeter,\n path + \".wattsPerSquareMeter\"\n ),\n referencePlaneId:\n requireNonEmptyString(\n record.referencePlaneId,\n path + \".referencePlaneId\"\n ),\n scientificStatus,\n uncertainty,\n evidence\n };\n }\n\n throw new InvalidConfigurationError(\n path +\n \".kind is not supported for source family \" +\n family +\n \".\"\n );\n}\n\nfunction requireReusableSpectrumEvidence(\n value: unknown,\n path: string\n): readonly EvidenceProvenance[] {\n const evidence = parseEvidenceList(\n value,\n path\n );\n if (\n !evidence.some(\n (entry) =>\n entry.reuseStatus ===\n \"reusable-data\" ||\n entry.reuseStatus ===\n \"photivra-owned\"\n )\n ) {\n throw new InvalidConfigurationError(\n path +\n \" must contain reusable-data or photivra-owned evidence because the spectrum embeds reusable numeric data.\"\n );\n }\n return evidence;\n}\n\nfunction parseSpectrum(\n value: unknown,\n path: string\n): SceneIlluminationSpectrum {\n const record = requireRecord(value, path, null);\n rejectUnknownVariantFields(record, \"kind\", {\n unresolved: [\"kind\", \"limitation\"],\n \"rgb-preview-approximation\": [\"kind\", \"colorSpace\", \"red\", \"green\", \"blue\", \"limitation\"],\n \"blackbody-temperature-approximation\": [\"kind\", \"temperatureKelvin\", \"limitation\"],\n \"discrete-relative-lines\": [\"kind\", \"spectrumId\", \"wavelengthUnit\", \"scientificStatus\", \"uncertainty\", \"evidence\", \"distribution\"],\n \"continuous-relative-spectrum\": [\"kind\", \"spectrumId\", \"wavelengthUnit\", \"wavelengthBasis\", \"interpolation\", \"outsideRangeBehavior\",\n \"normalization\", \"scientificStatus\", \"uncertainty\", \"evidence\", \"samples\"]\n }, path);\n\n if (record.kind === \"unresolved\") {\n return {\n kind: \"unresolved\",\n limitation: requireNonEmptyString(\n record.limitation,\n path + \".limitation\"\n )\n };\n }\n\n if (\n record.kind ===\n \"rgb-preview-approximation\"\n ) {\n if (record.colorSpace !== \"linear-srgb\") {\n throw new InvalidConfigurationError(\n path +\n '.colorSpace must be \"linear-srgb\" for the first RGB preview approximation.'\n );\n }\n return {\n kind: \"rgb-preview-approximation\",\n colorSpace: \"linear-srgb\",\n red: requireFraction(\n record.red,\n path + \".red\"\n ),\n green: requireFraction(\n record.green,\n path + \".green\"\n ),\n blue: requireFraction(\n record.blue,\n path + \".blue\"\n ),\n limitation: requireNonEmptyString(\n record.limitation,\n path + \".limitation\"\n )\n };\n }\n\n if (\n record.kind ===\n \"blackbody-temperature-approximation\"\n ) {\n return {\n kind: \"blackbody-temperature-approximation\",\n temperatureKelvin:\n requirePositiveFinite(\n record.temperatureKelvin,\n path + \".temperatureKelvin\"\n ),\n limitation: requireNonEmptyString(\n record.limitation,\n path + \".limitation\"\n )\n };\n }\n\n if (\n record.kind ===\n \"discrete-relative-lines\"\n ) {\n if (record.wavelengthUnit !== \"nm\") {\n throw new InvalidConfigurationError(\n path + '.wavelengthUnit must be \"nm\".'\n );\n }\n if (\n record.scientificStatus !==\n \"calibrated-relative-lines\" &&\n record.scientificStatus !==\n \"approximation\"\n ) {\n throw new InvalidConfigurationError(\n path + \".scientificStatus is invalid.\"\n );\n }\n const uncertainty =\n parseUncertainty(\n record.uncertainty,\n path + \".uncertainty\"\n );\n if (\n record.scientificStatus ===\n \"calibrated-relative-lines\" &&\n uncertainty.kind !== \"relative\"\n ) {\n throw new InvalidConfigurationError(\n path +\n \" calibrated-relative-lines spectra require quantified relative uncertainty.\"\n );\n }\n\n return {\n kind: \"discrete-relative-lines\",\n spectrumId: requireNonEmptyString(\n record.spectrumId,\n path + \".spectrumId\"\n ),\n wavelengthUnit: \"nm\",\n scientificStatus:\n record.scientificStatus,\n uncertainty,\n evidence:\n requireReusableSpectrumEvidence(\n record.evidence,\n path + \".evidence\"\n ),\n distribution:\n parseNormalizedDiscreteSpectralLineDistribution(\n record.distribution,\n path + \".distribution\"\n )\n };\n }\n\n if (\n record.kind !==\n \"continuous-relative-spectrum\"\n ) {\n throw new InvalidConfigurationError(\n path + \".kind is invalid.\"\n );\n }\n\n if (record.wavelengthUnit !== \"nm\") {\n throw new InvalidConfigurationError(\n path + '.wavelengthUnit must be \"nm\".'\n );\n }\n if (\n record.interpolation !==\n \"piecewise-linear\"\n ) {\n throw new InvalidConfigurationError(\n path +\n '.interpolation must be \"piecewise-linear\".'\n );\n }\n if (\n record.outsideRangeBehavior !==\n \"fail-closed\"\n ) {\n throw new InvalidConfigurationError(\n path +\n '.outsideRangeBehavior must be \"fail-closed\".'\n );\n }\n if (\n record.normalization !==\n \"arbitrary-relative-scale\"\n ) {\n throw new InvalidConfigurationError(\n path +\n '.normalization must be \"arbitrary-relative-scale\".'\n );\n }\n if (\n record.scientificStatus !==\n \"calibrated-relative-shape\" &&\n record.scientificStatus !==\n \"approximation\"\n ) {\n throw new InvalidConfigurationError(\n path + \".scientificStatus is invalid.\"\n );\n }\n\n const wavelengthBasis =\n parseSpectralWavelengthBasis(\n record.wavelengthBasis,\n path + \".wavelengthBasis\"\n );\n const uncertainty =\n parseUncertainty(\n record.uncertainty,\n path + \".uncertainty\"\n );\n if (\n record.scientificStatus ===\n \"calibrated-relative-shape\" &&\n wavelengthBasis === \"unspecified\"\n ) {\n throw new InvalidConfigurationError(\n path +\n ' calibrated-relative-shape spectra must declare wavelengthBasis \"air\" or \"vacuum\".'\n );\n }\n if (\n record.scientificStatus ===\n \"calibrated-relative-shape\" &&\n uncertainty.kind !== \"relative\"\n ) {\n throw new InvalidConfigurationError(\n path +\n \" calibrated-relative-shape spectra require quantified relative uncertainty.\"\n );\n }\n\n const evidence =\n requireReusableSpectrumEvidence(\n record.evidence,\n path + \".evidence\"\n );\n if (\n !Array.isArray(record.samples) ||\n record.samples.length < 2\n ) {\n throw new InvalidConfigurationError(\n path +\n \".samples must contain at least two wavelength samples.\"\n );\n }\n\n let previousWavelength =\n Number.NEGATIVE_INFINITY;\n let hasPositiveDensity = false;\n const samples = record.samples.map(\n (entry, index) => {\n const sample = requireRecord(\n entry,\n path + \".samples[\" + index + \"]\", [\"wavelengthNanometers\", \"relativeDensityPerNanometer\"]\n );\n const wavelengthNanometers =\n requirePositiveFinite(\n sample.wavelengthNanometers,\n path +\n \".samples[\" +\n index +\n \"].wavelengthNanometers\"\n );\n if (\n wavelengthNanometers <=\n previousWavelength\n ) {\n throw new InvalidConfigurationError(\n path +\n \".samples wavelengths must be strictly increasing.\"\n );\n }\n previousWavelength =\n wavelengthNanometers;\n const relativeDensityPerNanometer =\n requireNonNegativeFinite(\n sample.relativeDensityPerNanometer,\n path +\n \".samples[\" +\n index +\n \"].relativeDensityPerNanometer\"\n );\n if (relativeDensityPerNanometer > 0) {\n hasPositiveDensity = true;\n }\n return {\n wavelengthNanometers,\n relativeDensityPerNanometer\n };\n }\n );\n\n if (!hasPositiveDensity) {\n throw new InvalidConfigurationError(\n path +\n \".samples must contain at least one positive relative density.\"\n );\n }\n\n return {\n kind: \"continuous-relative-spectrum\",\n spectrumId: requireNonEmptyString(\n record.spectrumId,\n path + \".spectrumId\"\n ),\n wavelengthUnit: \"nm\",\n wavelengthBasis,\n interpolation: \"piecewise-linear\",\n outsideRangeBehavior: \"fail-closed\",\n normalization: \"arbitrary-relative-scale\",\n scientificStatus:\n record.scientificStatus,\n uncertainty,\n evidence,\n samples\n };\n}\n\nfunction parseLimitations(\n value: unknown,\n path: string\n): readonly string[] {\n if (!Array.isArray(value)) {\n throw new InvalidConfigurationError(\n path + \" must be an array.\"\n );\n }\n const limitations = value.map(\n (entry, index) =>\n requireNonEmptyString(\n entry,\n path + \"[\" + index + \"]\"\n )\n );\n if (\n new Set(limitations).size !==\n limitations.length\n ) {\n throw new InvalidConfigurationError(\n path + \" must not contain duplicates.\"\n );\n }\n return limitations;\n}\n\nfunction parseFamily(\n value: unknown,\n path: string\n): SceneIlluminationSourceFamily {\n if (\n value !== \"point\" &&\n value !== \"spot\" &&\n value !== \"area\" &&\n value !== \"directional\" &&\n value !== \"environment\"\n ) {\n throw new InvalidConfigurationError(\n path + \" is invalid.\"\n );\n }\n return value;\n}\n\n/** Parses one source of a scene illumination profile (also used by record-taking helpers). Not a root export. */\nexport function parseSceneIlluminationSource(\n value: unknown,\n path: string\n): SceneIlluminationSource {\n const record = requireRecord(value, path, [\"family\", \"temporalBehavior\", \"sourceId\", \"enabled\", \"geometry\", \"magnitude\", \"spectrum\", \"evidence\", \"limitations\"]);\n const family = parseFamily(\n record.family,\n path + \".family\"\n );\n\n const temporalBehavior =\n requireRecord(\n record.temporalBehavior,\n path + \".temporalBehavior\", [\"kind\"]\n );\n if (\n temporalBehavior.kind !==\n \"time-invariant\"\n ) {\n throw new InvalidConfigurationError(\n path +\n '.temporalBehavior.kind must be \"time-invariant\" in schema 0.1.0.'\n );\n }\n\n return {\n sourceId: requireNonEmptyString(\n record.sourceId,\n path + \".sourceId\"\n ),\n family,\n enabled: requireBoolean(\n record.enabled,\n path + \".enabled\"\n ),\n geometry: parseGeometry(\n family,\n record.geometry,\n path + \".geometry\"\n ),\n magnitude: parseMagnitude(\n family,\n record.magnitude,\n path + \".magnitude\"\n ),\n spectrum: parseSpectrum(\n record.spectrum,\n path + \".spectrum\"\n ),\n temporalBehavior: {\n kind: \"time-invariant\"\n },\n evidence: parseEvidenceList(\n record.evidence,\n path + \".evidence\"\n ),\n ...(record.limitations === undefined\n ? {}\n : {\n limitations: parseLimitations(\n record.limitations,\n path + \".limitations\"\n )\n })\n };\n}\n\n/** Fixed flags the parser writes; a parsed profile may carry them back in unchanged. */\nconst ILLUMINATION_PROFILE_FIXED_FIELDS = {\n sceneRadianceCalculated: false, materialResponseApplied: false, visibilityEvaluated: false,\n indirectTransportEvaluated: false, fluorescenceModeled: false, volumetricTransportModeled: false,\n polarizationModeled: false\n} as const;\n\n/**\n * Parses a renderer-independent scene illumination profile.\n *\n * The result describes light sources only. It does not compute outgoing scene\n * radiance, material response, visibility or indirect light, and on its own it\n * does not justify photon or electron counts downstream.\n */\nexport function parseSceneIlluminationProfile(\n value: unknown\n): SceneIlluminationProfile {\n const record = requireRecord(\n value,\n \"sceneIlluminationProfile\", [\"schemaVersion\", \"sources\", \"profileId\", \"sceneId\", \"evidence\", ...Object.keys(ILLUMINATION_PROFILE_FIXED_FIELDS)]\n );\n requireFixedFieldsWhenPresent(record, ILLUMINATION_PROFILE_FIXED_FIELDS, \"sceneIlluminationProfile\");\n\n if (\n record.schemaVersion !==\n SCENE_ILLUMINATION_PROFILE_SCHEMA_VERSION\n ) {\n throw new InvalidConfigurationError(\n 'sceneIlluminationProfile.schemaVersion must be \"' +\n SCENE_ILLUMINATION_PROFILE_SCHEMA_VERSION +\n '\".'\n );\n }\n\n if (!Array.isArray(record.sources)) {\n throw new InvalidConfigurationError(\n \"sceneIlluminationProfile.sources must be an array.\"\n );\n }\n\n const sources = record.sources.map(\n (source, index) =>\n parseSceneIlluminationSource(\n source,\n \"sceneIlluminationProfile.sources[\" +\n index +\n \"]\"\n )\n );\n const sourceIds = sources.map(\n (source) => source.sourceId\n );\n if (\n new Set(sourceIds).size !==\n sourceIds.length\n ) {\n throw new InvalidConfigurationError(\n \"sceneIlluminationProfile.sources[].sourceId must not contain duplicates.\"\n );\n }\n\n return {\n schemaVersion:\n SCENE_ILLUMINATION_PROFILE_SCHEMA_VERSION,\n profileId: requireNonEmptyString(\n record.profileId,\n \"sceneIlluminationProfile.profileId\"\n ),\n sceneId: requireNonEmptyString(\n record.sceneId,\n \"sceneIlluminationProfile.sceneId\"\n ),\n evidence: parseEvidenceList(\n record.evidence,\n \"sceneIlluminationProfile.evidence\"\n ),\n sources,\n sceneRadianceCalculated: false,\n materialResponseApplied: false,\n visibilityEvaluated: false,\n indirectTransportEvaluated: false,\n fluorescenceModeled: false,\n volumetricTransportModeled: false,\n polarizationModeled: false\n };\n}\n"]}
1
+ {"version":3,"file":"illumination.js","sourceRoot":"","sources":["../../src/schema/illumination.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Scene illumination profiles: the light sources in a scene, independent of any renderer.\n *\n * A profile describes sources only. It does not compute the light leaving surfaces\n * (outgoing scene radiance), material response, visibility or indirect light, and on its\n * own it does not justify photon or electron counts downstream.\n * @see docs/SCENE_RADIANCE_AND_ILLUMINATION.md for equations, coordinate/unit conventions, blockers\n * and support limits.\n */\n\nimport { rejectUnknownFields, rejectUnknownVariantFields, requireFixedFieldsWhenPresent, requireConfigRecord as requireRecord, requireTrimmedConfigString as requireNonEmptyString, parseConfigScientificStatus as parseScientificStatus, requireConfigFiniteNumber as requireFinite, parseConfigLimitations as parseLimitations, requireConfigFraction as requireFraction, requireConfigNumberAtLeastZero as requireNonNegativeFinite, requireConfigNumberAboveZero as requirePositiveFinite } from \"../core/record-validation.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport {\n parseEvidenceList,\n type EvidenceProvenance\n} from \"../core/evidence-provenance.js\";\nimport {\n parseSpectralWavelengthBasis,\n type SpectralWavelengthBasis\n} from \"../core/spectral.js\";\nimport {\n parseNormalizedDiscreteSpectralLineDistribution,\n type NormalizedDiscreteSpectralLineDistribution\n} from \"../core/spectral-composition.js\";\nimport type { Vector3 } from \"./scene.js\";\n\nexport const SCENE_ILLUMINATION_PROFILE_SCHEMA_VERSION = \"0.1.0\" as const;\n\nexport type SceneIlluminationSourceFamily =\n | \"point\"\n | \"spot\"\n | \"area\"\n | \"directional\"\n | \"environment\";\n\nexport type SceneIlluminationScientificStatus =\n | \"calibrated\"\n | \"approximation\";\n\nexport type SceneIlluminationUncertainty =\n | {\n kind: \"relative\";\n fraction: number;\n basis: string;\n }\n | {\n kind: \"not-quantified\";\n limitation: string;\n };\n\nexport type SceneIlluminationSourceGeometry =\n | {\n kind: \"point-position\";\n positionM: Vector3;\n }\n | {\n kind: \"scene-object-binding\";\n sceneObjectId: string;\n }\n | {\n kind: \"spot\";\n origin:\n | {\n kind: \"point-position\";\n positionM: Vector3;\n }\n | {\n kind: \"scene-object-binding\";\n sceneObjectId: string;\n };\n directionUnitVector: Vector3;\n outerConeAngleDegrees: number;\n }\n | {\n kind: \"directional\";\n directionUnitVector: Vector3;\n }\n | {\n kind: \"environment\";\n };\n\nexport type SceneIlluminationMagnitude =\n | {\n kind: \"relative-linear-scale\";\n scale: number;\n scientificStatus: \"approximation\";\n limitation: string;\n }\n | {\n kind: \"radiant-intensity\";\n wattsPerSteradian: number;\n scientificStatus: SceneIlluminationScientificStatus;\n uncertainty: SceneIlluminationUncertainty;\n evidence: readonly EvidenceProvenance[];\n }\n | {\n kind: \"surface-radiance\";\n wattsPerSquareMeterSteradian: number;\n scientificStatus: SceneIlluminationScientificStatus;\n uncertainty: SceneIlluminationUncertainty;\n evidence: readonly EvidenceProvenance[];\n }\n | {\n kind: \"reference-plane-irradiance\";\n wattsPerSquareMeter: number;\n referencePlaneId: string;\n scientificStatus: SceneIlluminationScientificStatus;\n uncertainty: SceneIlluminationUncertainty;\n evidence: readonly EvidenceProvenance[];\n };\n\nexport interface SceneIlluminationRelativeSpectrumSample {\n wavelengthNanometers: number;\n relativeDensityPerNanometer: number;\n}\n\nexport type SceneIlluminationSpectrum =\n | {\n kind: \"unresolved\";\n limitation: string;\n }\n | {\n kind: \"rgb-preview-approximation\";\n colorSpace: \"linear-srgb\";\n red: number;\n green: number;\n blue: number;\n limitation: string;\n }\n | {\n kind: \"blackbody-temperature-approximation\";\n temperatureKelvin: number;\n limitation: string;\n }\n | {\n kind: \"continuous-relative-spectrum\";\n spectrumId: string;\n wavelengthUnit: \"nm\";\n wavelengthBasis: SpectralWavelengthBasis;\n interpolation: \"piecewise-linear\";\n outsideRangeBehavior: \"fail-closed\";\n normalization: \"arbitrary-relative-scale\";\n scientificStatus:\n | \"calibrated-relative-shape\"\n | \"approximation\";\n uncertainty: SceneIlluminationUncertainty;\n evidence: readonly EvidenceProvenance[];\n samples:\n readonly SceneIlluminationRelativeSpectrumSample[];\n }\n | {\n kind: \"discrete-relative-lines\";\n spectrumId: string;\n wavelengthUnit: \"nm\";\n scientificStatus:\n | \"calibrated-relative-lines\"\n | \"approximation\";\n uncertainty: SceneIlluminationUncertainty;\n evidence: readonly EvidenceProvenance[];\n distribution:\n NormalizedDiscreteSpectralLineDistribution;\n };\n\nexport interface SceneIlluminationSource {\n sourceId: string;\n family: SceneIlluminationSourceFamily;\n enabled: boolean;\n geometry: SceneIlluminationSourceGeometry;\n magnitude: SceneIlluminationMagnitude;\n spectrum: SceneIlluminationSpectrum;\n temporalBehavior: {\n kind: \"time-invariant\";\n };\n evidence: readonly EvidenceProvenance[];\n limitations?: readonly string[];\n}\n\nexport interface SceneIlluminationProfile {\n schemaVersion:\n typeof SCENE_ILLUMINATION_PROFILE_SCHEMA_VERSION;\n profileId: string;\n sceneId: string;\n evidence: readonly EvidenceProvenance[];\n sources: readonly SceneIlluminationSource[];\n sceneRadianceCalculated: false;\n materialResponseApplied: false;\n visibilityEvaluated: false;\n indirectTransportEvaluated: false;\n fluorescenceModeled: false;\n volumetricTransportModeled: false;\n polarizationModeled: false;\n}\n\nfunction requireBoolean(\n value: unknown,\n path: string\n): boolean {\n if (typeof value !== \"boolean\") {\n throw new InvalidConfigurationError(\n path + \" must be a boolean.\"\n );\n }\n return value;\n}\n\nexport function parseVector3(\n value: unknown,\n path: string\n): Vector3 {\n const record = requireRecord(value, path, [\"x\", \"y\", \"z\"]);\n return {\n x: requireFinite(record.x, path + \".x\"),\n y: requireFinite(record.y, path + \".y\"),\n z: requireFinite(record.z, path + \".z\")\n };\n}\n\nfunction parseDirectionUnitVector(\n value: unknown,\n path: string\n): Vector3 {\n const vector = parseVector3(value, path);\n const magnitude = Math.hypot(\n vector.x,\n vector.y,\n vector.z\n );\n if (\n !Number.isFinite(magnitude) ||\n Math.abs(magnitude - 1) > 1e-9\n ) {\n throw new InvalidConfigurationError(\n path + \" must be a unit-length direction vector.\"\n );\n }\n return vector;\n}\n\nfunction parseUncertainty(\n value: unknown,\n path: string\n): SceneIlluminationUncertainty {\n const record = requireRecord(value, path, null);\n\n if (record.kind === \"relative\") {\n rejectUnknownFields(record, [\"kind\", \"fraction\", \"basis\"], path);\n return {\n kind: \"relative\",\n fraction: requireNonNegativeFinite(\n record.fraction,\n path + \".fraction\"\n ),\n basis: requireNonEmptyString(\n record.basis,\n path + \".basis\"\n )\n };\n }\n\n if (record.kind === \"not-quantified\") {\n rejectUnknownFields(record, [\"kind\", \"limitation\"], path);\n return {\n kind: \"not-quantified\",\n limitation: requireNonEmptyString(\n record.limitation,\n path + \".limitation\"\n )\n };\n }\n\n throw new InvalidConfigurationError(\n path + \".kind is invalid.\"\n );\n}\n\nfunction validateCalibratedUncertainty(\n scientificStatus:\n SceneIlluminationScientificStatus,\n uncertainty: SceneIlluminationUncertainty,\n path: string\n): void {\n if (\n scientificStatus === \"calibrated\" &&\n uncertainty.kind !== \"relative\"\n ) {\n throw new InvalidConfigurationError(\n path +\n \" calibrated physical magnitude requires quantified relative uncertainty.\"\n );\n }\n}\n\nfunction parsePointOrigin(\n value: unknown,\n path: string\n):\n | {\n kind: \"point-position\";\n positionM: Vector3;\n }\n | {\n kind: \"scene-object-binding\";\n sceneObjectId: string;\n } {\n const record = requireRecord(value, path, null);\n\n if (record.kind === \"point-position\") {\n rejectUnknownFields(record, [\"kind\", \"positionM\"], path);\n return {\n kind: \"point-position\",\n positionM: parseVector3(\n record.positionM,\n path + \".positionM\"\n )\n };\n }\n\n if (record.kind === \"scene-object-binding\") {\n rejectUnknownFields(record, [\"kind\", \"sceneObjectId\"], path);\n return {\n kind: \"scene-object-binding\",\n sceneObjectId: requireNonEmptyString(\n record.sceneObjectId,\n path + \".sceneObjectId\"\n )\n };\n }\n\n throw new InvalidConfigurationError(\n path + \".kind is invalid.\"\n );\n}\n\nfunction parseGeometry(\n family: SceneIlluminationSourceFamily,\n value: unknown,\n path: string\n): SceneIlluminationSourceGeometry {\n // The allowed fields depend on the source family; parsePointOrigin checks the point geometry.\n const record = requireRecord(value, path, null);\n\n if (family === \"point\") {\n return parsePointOrigin(record, path);\n }\n\n if (family === \"spot\") {\n if (record.kind !== \"spot\") {\n throw new InvalidConfigurationError(\n path + '.kind must be \"spot\" for a spot source.'\n );\n }\n rejectUnknownFields(record, [\"kind\", \"origin\", \"directionUnitVector\", \"outerConeAngleDegrees\"], path);\n const outerConeAngleDegrees =\n requirePositiveFinite(\n record.outerConeAngleDegrees,\n path + \".outerConeAngleDegrees\"\n );\n if (outerConeAngleDegrees >= 180) {\n throw new InvalidConfigurationError(\n path +\n \".outerConeAngleDegrees must be less than 180.\"\n );\n }\n return {\n kind: \"spot\",\n origin: parsePointOrigin(\n record.origin,\n path + \".origin\"\n ),\n directionUnitVector:\n parseDirectionUnitVector(\n record.directionUnitVector,\n path + \".directionUnitVector\"\n ),\n outerConeAngleDegrees\n };\n }\n\n if (family === \"area\") {\n if (record.kind !== \"scene-object-binding\") {\n throw new InvalidConfigurationError(\n path +\n '.kind must be \"scene-object-binding\" for an area source so emitting geometry remains scene-owned.'\n );\n }\n rejectUnknownFields(record, [\"kind\", \"sceneObjectId\"], path);\n return {\n kind: \"scene-object-binding\",\n sceneObjectId: requireNonEmptyString(\n record.sceneObjectId,\n path + \".sceneObjectId\"\n )\n };\n }\n\n if (family === \"directional\") {\n if (record.kind !== \"directional\") {\n throw new InvalidConfigurationError(\n path +\n '.kind must be \"directional\" for a directional source.'\n );\n }\n rejectUnknownFields(record, [\"kind\", \"directionUnitVector\"], path);\n return {\n kind: \"directional\",\n directionUnitVector:\n parseDirectionUnitVector(\n record.directionUnitVector,\n path + \".directionUnitVector\"\n )\n };\n }\n\n if (record.kind !== \"environment\") {\n throw new InvalidConfigurationError(\n path +\n '.kind must be \"environment\" for an environment source.'\n );\n }\n rejectUnknownFields(record, [\"kind\"], path);\n return { kind: \"environment\" };\n}\n\nfunction parseMagnitude(\n family: SceneIlluminationSourceFamily,\n value: unknown,\n path: string\n): SceneIlluminationMagnitude {\n const record = requireRecord(value, path, null);\n rejectUnknownVariantFields(record, \"kind\", {\n \"relative-linear-scale\": [\"kind\", \"scale\", \"scientificStatus\", \"limitation\"],\n \"radiant-intensity\": [\"kind\", \"wattsPerSteradian\", \"scientificStatus\", \"uncertainty\", \"evidence\"],\n \"surface-radiance\": [\"kind\", \"wattsPerSquareMeterSteradian\", \"scientificStatus\", \"uncertainty\", \"evidence\"],\n \"reference-plane-irradiance\": [\"kind\", \"wattsPerSquareMeter\", \"referencePlaneId\", \"scientificStatus\", \"uncertainty\", \"evidence\"]\n }, path);\n\n if (record.kind === \"relative-linear-scale\") {\n if (record.scientificStatus !== \"approximation\") {\n throw new InvalidConfigurationError(\n path +\n '.scientificStatus must be \"approximation\" for relative-linear-scale.'\n );\n }\n return {\n kind: \"relative-linear-scale\",\n scale: requirePositiveFinite(\n record.scale,\n path + \".scale\"\n ),\n scientificStatus: \"approximation\",\n limitation: requireNonEmptyString(\n record.limitation,\n path + \".limitation\"\n )\n };\n }\n\n const scientificStatus =\n parseScientificStatus(\n record.scientificStatus,\n path + \".scientificStatus\"\n );\n const uncertainty =\n parseUncertainty(\n record.uncertainty,\n path + \".uncertainty\"\n );\n validateCalibratedUncertainty(\n scientificStatus,\n uncertainty,\n path\n );\n const evidence = parseEvidenceList(\n record.evidence,\n path + \".evidence\"\n );\n\n if (\n record.kind === \"radiant-intensity\" &&\n family === \"point\"\n ) {\n return {\n kind: \"radiant-intensity\",\n wattsPerSteradian:\n requirePositiveFinite(\n record.wattsPerSteradian,\n path + \".wattsPerSteradian\"\n ),\n scientificStatus,\n uncertainty,\n evidence\n };\n }\n\n if (\n record.kind === \"surface-radiance\" &&\n family === \"area\"\n ) {\n return {\n kind: \"surface-radiance\",\n wattsPerSquareMeterSteradian:\n requirePositiveFinite(\n record.wattsPerSquareMeterSteradian,\n path +\n \".wattsPerSquareMeterSteradian\"\n ),\n scientificStatus,\n uncertainty,\n evidence\n };\n }\n\n if (\n record.kind ===\n \"reference-plane-irradiance\" &&\n family === \"directional\"\n ) {\n return {\n kind: \"reference-plane-irradiance\",\n wattsPerSquareMeter:\n requirePositiveFinite(\n record.wattsPerSquareMeter,\n path + \".wattsPerSquareMeter\"\n ),\n referencePlaneId:\n requireNonEmptyString(\n record.referencePlaneId,\n path + \".referencePlaneId\"\n ),\n scientificStatus,\n uncertainty,\n evidence\n };\n }\n\n throw new InvalidConfigurationError(\n path +\n \".kind is not supported for source family \" +\n family +\n \".\"\n );\n}\n\nfunction requireReusableSpectrumEvidence(\n value: unknown,\n path: string\n): readonly EvidenceProvenance[] {\n const evidence = parseEvidenceList(\n value,\n path\n );\n if (\n !evidence.some(\n (entry) =>\n entry.reuseStatus ===\n \"reusable-data\" ||\n entry.reuseStatus ===\n \"photivra-owned\"\n )\n ) {\n throw new InvalidConfigurationError(\n path +\n \" must contain reusable-data or photivra-owned evidence because the spectrum embeds reusable numeric data.\"\n );\n }\n return evidence;\n}\n\nfunction parseSpectrum(\n value: unknown,\n path: string\n): SceneIlluminationSpectrum {\n const record = requireRecord(value, path, null);\n rejectUnknownVariantFields(record, \"kind\", {\n unresolved: [\"kind\", \"limitation\"],\n \"rgb-preview-approximation\": [\"kind\", \"colorSpace\", \"red\", \"green\", \"blue\", \"limitation\"],\n \"blackbody-temperature-approximation\": [\"kind\", \"temperatureKelvin\", \"limitation\"],\n \"discrete-relative-lines\": [\"kind\", \"spectrumId\", \"wavelengthUnit\", \"scientificStatus\", \"uncertainty\", \"evidence\", \"distribution\"],\n \"continuous-relative-spectrum\": [\"kind\", \"spectrumId\", \"wavelengthUnit\", \"wavelengthBasis\", \"interpolation\", \"outsideRangeBehavior\",\n \"normalization\", \"scientificStatus\", \"uncertainty\", \"evidence\", \"samples\"]\n }, path);\n\n if (record.kind === \"unresolved\") {\n return {\n kind: \"unresolved\",\n limitation: requireNonEmptyString(\n record.limitation,\n path + \".limitation\"\n )\n };\n }\n\n if (\n record.kind ===\n \"rgb-preview-approximation\"\n ) {\n if (record.colorSpace !== \"linear-srgb\") {\n throw new InvalidConfigurationError(\n path +\n '.colorSpace must be \"linear-srgb\" for the first RGB preview approximation.'\n );\n }\n return {\n kind: \"rgb-preview-approximation\",\n colorSpace: \"linear-srgb\",\n red: requireFraction(\n record.red,\n path + \".red\"\n ),\n green: requireFraction(\n record.green,\n path + \".green\"\n ),\n blue: requireFraction(\n record.blue,\n path + \".blue\"\n ),\n limitation: requireNonEmptyString(\n record.limitation,\n path + \".limitation\"\n )\n };\n }\n\n if (\n record.kind ===\n \"blackbody-temperature-approximation\"\n ) {\n return {\n kind: \"blackbody-temperature-approximation\",\n temperatureKelvin:\n requirePositiveFinite(\n record.temperatureKelvin,\n path + \".temperatureKelvin\"\n ),\n limitation: requireNonEmptyString(\n record.limitation,\n path + \".limitation\"\n )\n };\n }\n\n if (\n record.kind ===\n \"discrete-relative-lines\"\n ) {\n if (record.wavelengthUnit !== \"nm\") {\n throw new InvalidConfigurationError(\n path + '.wavelengthUnit must be \"nm\".'\n );\n }\n if (\n record.scientificStatus !==\n \"calibrated-relative-lines\" &&\n record.scientificStatus !==\n \"approximation\"\n ) {\n throw new InvalidConfigurationError(\n path + \".scientificStatus is invalid.\"\n );\n }\n const uncertainty =\n parseUncertainty(\n record.uncertainty,\n path + \".uncertainty\"\n );\n if (\n record.scientificStatus ===\n \"calibrated-relative-lines\" &&\n uncertainty.kind !== \"relative\"\n ) {\n throw new InvalidConfigurationError(\n path +\n \" calibrated-relative-lines spectra require quantified relative uncertainty.\"\n );\n }\n\n return {\n kind: \"discrete-relative-lines\",\n spectrumId: requireNonEmptyString(\n record.spectrumId,\n path + \".spectrumId\"\n ),\n wavelengthUnit: \"nm\",\n scientificStatus:\n record.scientificStatus,\n uncertainty,\n evidence:\n requireReusableSpectrumEvidence(\n record.evidence,\n path + \".evidence\"\n ),\n distribution:\n parseNormalizedDiscreteSpectralLineDistribution(\n record.distribution,\n path + \".distribution\"\n )\n };\n }\n\n if (\n record.kind !==\n \"continuous-relative-spectrum\"\n ) {\n throw new InvalidConfigurationError(\n path + \".kind is invalid.\"\n );\n }\n\n if (record.wavelengthUnit !== \"nm\") {\n throw new InvalidConfigurationError(\n path + '.wavelengthUnit must be \"nm\".'\n );\n }\n if (\n record.interpolation !==\n \"piecewise-linear\"\n ) {\n throw new InvalidConfigurationError(\n path +\n '.interpolation must be \"piecewise-linear\".'\n );\n }\n if (\n record.outsideRangeBehavior !==\n \"fail-closed\"\n ) {\n throw new InvalidConfigurationError(\n path +\n '.outsideRangeBehavior must be \"fail-closed\".'\n );\n }\n if (\n record.normalization !==\n \"arbitrary-relative-scale\"\n ) {\n throw new InvalidConfigurationError(\n path +\n '.normalization must be \"arbitrary-relative-scale\".'\n );\n }\n if (\n record.scientificStatus !==\n \"calibrated-relative-shape\" &&\n record.scientificStatus !==\n \"approximation\"\n ) {\n throw new InvalidConfigurationError(\n path + \".scientificStatus is invalid.\"\n );\n }\n\n const wavelengthBasis =\n parseSpectralWavelengthBasis(\n record.wavelengthBasis,\n path + \".wavelengthBasis\"\n );\n const uncertainty =\n parseUncertainty(\n record.uncertainty,\n path + \".uncertainty\"\n );\n if (\n record.scientificStatus ===\n \"calibrated-relative-shape\" &&\n wavelengthBasis === \"unspecified\"\n ) {\n throw new InvalidConfigurationError(\n path +\n ' calibrated-relative-shape spectra must declare wavelengthBasis \"air\" or \"vacuum\".'\n );\n }\n if (\n record.scientificStatus ===\n \"calibrated-relative-shape\" &&\n uncertainty.kind !== \"relative\"\n ) {\n throw new InvalidConfigurationError(\n path +\n \" calibrated-relative-shape spectra require quantified relative uncertainty.\"\n );\n }\n\n const evidence =\n requireReusableSpectrumEvidence(\n record.evidence,\n path + \".evidence\"\n );\n if (\n !Array.isArray(record.samples) ||\n record.samples.length < 2\n ) {\n throw new InvalidConfigurationError(\n path +\n \".samples must contain at least two wavelength samples.\"\n );\n }\n\n let previousWavelength =\n Number.NEGATIVE_INFINITY;\n let hasPositiveDensity = false;\n const samples = record.samples.map(\n (entry, index) => {\n const sample = requireRecord(\n entry,\n path + \".samples[\" + index + \"]\", [\"wavelengthNanometers\", \"relativeDensityPerNanometer\"]\n );\n const wavelengthNanometers =\n requirePositiveFinite(\n sample.wavelengthNanometers,\n path +\n \".samples[\" +\n index +\n \"].wavelengthNanometers\"\n );\n if (\n wavelengthNanometers <=\n previousWavelength\n ) {\n throw new InvalidConfigurationError(\n path +\n \".samples wavelengths must be strictly increasing.\"\n );\n }\n previousWavelength =\n wavelengthNanometers;\n const relativeDensityPerNanometer =\n requireNonNegativeFinite(\n sample.relativeDensityPerNanometer,\n path +\n \".samples[\" +\n index +\n \"].relativeDensityPerNanometer\"\n );\n if (relativeDensityPerNanometer > 0) {\n hasPositiveDensity = true;\n }\n return {\n wavelengthNanometers,\n relativeDensityPerNanometer\n };\n }\n );\n\n if (!hasPositiveDensity) {\n throw new InvalidConfigurationError(\n path +\n \".samples must contain at least one positive relative density.\"\n );\n }\n\n return {\n kind: \"continuous-relative-spectrum\",\n spectrumId: requireNonEmptyString(\n record.spectrumId,\n path + \".spectrumId\"\n ),\n wavelengthUnit: \"nm\",\n wavelengthBasis,\n interpolation: \"piecewise-linear\",\n outsideRangeBehavior: \"fail-closed\",\n normalization: \"arbitrary-relative-scale\",\n scientificStatus:\n record.scientificStatus,\n uncertainty,\n evidence,\n samples\n };\n}\n\nfunction parseFamily(\n value: unknown,\n path: string\n): SceneIlluminationSourceFamily {\n if (\n value !== \"point\" &&\n value !== \"spot\" &&\n value !== \"area\" &&\n value !== \"directional\" &&\n value !== \"environment\"\n ) {\n throw new InvalidConfigurationError(\n path + \" is invalid.\"\n );\n }\n return value;\n}\n\n/** Parses one source of a scene illumination profile (also used by record-taking helpers). Not a root export. */\nexport function parseSceneIlluminationSource(\n value: unknown,\n path: string\n): SceneIlluminationSource {\n const record = requireRecord(value, path, [\"family\", \"temporalBehavior\", \"sourceId\", \"enabled\", \"geometry\", \"magnitude\", \"spectrum\", \"evidence\", \"limitations\"]);\n const family = parseFamily(\n record.family,\n path + \".family\"\n );\n\n const temporalBehavior =\n requireRecord(\n record.temporalBehavior,\n path + \".temporalBehavior\", [\"kind\"]\n );\n if (\n temporalBehavior.kind !==\n \"time-invariant\"\n ) {\n throw new InvalidConfigurationError(\n path +\n '.temporalBehavior.kind must be \"time-invariant\" in schema 0.1.0.'\n );\n }\n\n return {\n sourceId: requireNonEmptyString(\n record.sourceId,\n path + \".sourceId\"\n ),\n family,\n enabled: requireBoolean(\n record.enabled,\n path + \".enabled\"\n ),\n geometry: parseGeometry(\n family,\n record.geometry,\n path + \".geometry\"\n ),\n magnitude: parseMagnitude(\n family,\n record.magnitude,\n path + \".magnitude\"\n ),\n spectrum: parseSpectrum(\n record.spectrum,\n path + \".spectrum\"\n ),\n temporalBehavior: {\n kind: \"time-invariant\"\n },\n evidence: parseEvidenceList(\n record.evidence,\n path + \".evidence\"\n ),\n ...(record.limitations === undefined\n ? {}\n : {\n limitations: parseLimitations(\n record.limitations,\n path + \".limitations\"\n )\n })\n };\n}\n\n/** Fixed flags the parser writes; a parsed profile may carry them back in unchanged. */\nconst ILLUMINATION_PROFILE_FIXED_FIELDS = {\n sceneRadianceCalculated: false, materialResponseApplied: false, visibilityEvaluated: false,\n indirectTransportEvaluated: false, fluorescenceModeled: false, volumetricTransportModeled: false,\n polarizationModeled: false\n} as const;\n\n/**\n * Parses a renderer-independent scene illumination profile.\n *\n * The result describes light sources only. It does not compute outgoing scene\n * radiance, material response, visibility or indirect light, and on its own it\n * does not justify photon or electron counts downstream.\n */\nexport function parseSceneIlluminationProfile(\n value: unknown\n): SceneIlluminationProfile {\n const record = requireRecord(\n value,\n \"sceneIlluminationProfile\", [\"schemaVersion\", \"sources\", \"profileId\", \"sceneId\", \"evidence\", ...Object.keys(ILLUMINATION_PROFILE_FIXED_FIELDS)]\n );\n requireFixedFieldsWhenPresent(record, ILLUMINATION_PROFILE_FIXED_FIELDS, \"sceneIlluminationProfile\");\n\n if (\n record.schemaVersion !==\n SCENE_ILLUMINATION_PROFILE_SCHEMA_VERSION\n ) {\n throw new InvalidConfigurationError(\n 'sceneIlluminationProfile.schemaVersion must be \"' +\n SCENE_ILLUMINATION_PROFILE_SCHEMA_VERSION +\n '\".'\n );\n }\n\n if (!Array.isArray(record.sources)) {\n throw new InvalidConfigurationError(\n \"sceneIlluminationProfile.sources must be an array.\"\n );\n }\n\n const sources = record.sources.map(\n (source, index) =>\n parseSceneIlluminationSource(\n source,\n \"sceneIlluminationProfile.sources[\" +\n index +\n \"]\"\n )\n );\n const sourceIds = sources.map(\n (source) => source.sourceId\n );\n if (\n new Set(sourceIds).size !==\n sourceIds.length\n ) {\n throw new InvalidConfigurationError(\n \"sceneIlluminationProfile.sources[].sourceId must not contain duplicates.\"\n );\n }\n\n return {\n schemaVersion:\n SCENE_ILLUMINATION_PROFILE_SCHEMA_VERSION,\n profileId: requireNonEmptyString(\n record.profileId,\n \"sceneIlluminationProfile.profileId\"\n ),\n sceneId: requireNonEmptyString(\n record.sceneId,\n \"sceneIlluminationProfile.sceneId\"\n ),\n evidence: parseEvidenceList(\n record.evidence,\n \"sceneIlluminationProfile.evidence\"\n ),\n sources,\n sceneRadianceCalculated: false,\n materialResponseApplied: false,\n visibilityEvaluated: false,\n indirectTransportEvaluated: false,\n fluorescenceModeled: false,\n volumetricTransportModeled: false,\n polarizationModeled: false\n };\n}\n"]}
@@ -14,21 +14,9 @@
14
14
  */
15
15
  import { InvalidScientificInputError, requirePositiveInteger } from "../core/validation.js";
16
16
  import { parseSceneRadianceEvaluationRequest, parseSceneRadianceEvaluationResult } from "./scene-radiance.js";
17
- import { requireInputKeys } from "../core/record-validation.js";
18
- import { InvalidConfigurationError } from "../core/configuration-error.js";
17
+ import { requireInputKeys, requireTrimmedConfigString as requireNonEmptyString } from "../core/record-validation.js";
18
+ import { sameSite as samePoint } from "../core/shared-helpers.js";
19
19
  export const SCENE_RADIANCE_TEMPORAL_SAMPLING_PLAN_VERSION = "0.1.0";
20
- function requireNonEmptyString(value, path) {
21
- if (typeof value !== "string" ||
22
- value.trim().length === 0) {
23
- throw new InvalidConfigurationError(path +
24
- " must be a non-empty string.");
25
- }
26
- return value.trim();
27
- }
28
- function samePoint(a, b) {
29
- return (a.x === b.x &&
30
- a.y === b.y);
31
- }
32
20
  function exposureForPoint(timing, point) {
33
21
  const matches = timing.exposureWindows.samples.filter((sample) => samePoint(sample.pointNative, point));
34
22
  if (matches.length !== 1) {