@photivra/engine 1.5.0 → 2.1.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 (1085) hide show
  1. package/CHANGELOG.md +414 -6
  2. package/CITATION.cff +1 -1
  3. package/NODE_SUPPORT.md +64 -12
  4. package/README.md +301 -182
  5. package/SECURITY.md +37 -28
  6. package/THIRD_PARTY.md +148 -4
  7. package/dist/camera/equivalent-focal-length.d.ts +13 -14
  8. package/dist/camera/equivalent-focal-length.js +15 -13
  9. package/dist/camera/equivalent-focal-length.js.map +1 -1
  10. package/dist/camera/field-of-view.d.ts +30 -19
  11. package/dist/camera/field-of-view.js +67 -18
  12. package/dist/camera/field-of-view.js.map +1 -1
  13. package/dist/camera/lens-projection.d.ts +170 -0
  14. package/dist/camera/lens-projection.js +444 -0
  15. package/dist/camera/lens-projection.js.map +1 -0
  16. package/dist/camera/projected-object-size.d.ts +10 -11
  17. package/dist/camera/projected-object-size.js +12 -10
  18. package/dist/camera/projected-object-size.js.map +1 -1
  19. package/dist/capture/capture-export-metadata.d.ts +9 -10
  20. package/dist/capture/capture-export-metadata.js +8 -5
  21. package/dist/capture/capture-export-metadata.js.map +1 -1
  22. package/dist/capture/dng-import.d.ts +91 -0
  23. package/dist/capture/dng-import.js +343 -0
  24. package/dist/capture/dng-import.js.map +1 -0
  25. package/dist/capture/environment-raw-producer.d.ts +37 -17
  26. package/dist/capture/environment-raw-producer.js +43 -19
  27. package/dist/capture/environment-raw-producer.js.map +1 -1
  28. package/dist/capture/export-jpeg.d.ts +35 -4
  29. package/dist/capture/export-jpeg.js +133 -47
  30. package/dist/capture/export-jpeg.js.map +1 -1
  31. package/dist/capture/export-tiff.d.ts +48 -24
  32. package/dist/capture/export-tiff.js +91 -31
  33. package/dist/capture/export-tiff.js.map +1 -1
  34. package/dist/capture/focus-control.d.ts +42 -65
  35. package/dist/capture/focus-control.js +56 -75
  36. package/dist/capture/focus-control.js.map +1 -1
  37. package/dist/capture/host-yield-cadence.d.ts +25 -0
  38. package/dist/capture/host-yield-cadence.js +25 -0
  39. package/dist/capture/host-yield-cadence.js.map +1 -0
  40. package/dist/capture/linear-encoding.d.ts +14 -12
  41. package/dist/capture/linear-encoding.js +14 -13
  42. package/dist/capture/linear-encoding.js.map +1 -1
  43. package/dist/capture/lossless-jpeg.d.ts +27 -0
  44. package/dist/capture/lossless-jpeg.js +237 -0
  45. package/dist/capture/lossless-jpeg.js.map +1 -0
  46. package/dist/capture/native-environment-lean.d.ts +227 -0
  47. package/dist/capture/native-environment-lean.js +974 -0
  48. package/dist/capture/native-environment-lean.js.map +1 -0
  49. package/dist/capture/native-environment-optical-stage.d.ts +97 -0
  50. package/dist/capture/native-environment-optical-stage.js +340 -0
  51. package/dist/capture/native-environment-optical-stage.js.map +1 -0
  52. package/dist/capture/native-environment-raw.d.ts +140 -6
  53. package/dist/capture/native-environment-raw.js +435 -34
  54. package/dist/capture/native-environment-raw.js.map +1 -1
  55. package/dist/capture/native-raw-development.d.ts +116 -9
  56. package/dist/capture/native-raw-development.js +221 -62
  57. package/dist/capture/native-raw-development.js.map +1 -1
  58. package/dist/capture/native-raw-dng.d.ts +60 -0
  59. package/dist/capture/native-raw-dng.js +167 -0
  60. package/dist/capture/native-raw-dng.js.map +1 -0
  61. package/dist/capture/native-raw.d.ts +65 -12
  62. package/dist/capture/native-raw.js +81 -19
  63. package/dist/capture/native-raw.js.map +1 -1
  64. package/dist/capture/packed-sensor-raw.d.ts +160 -0
  65. package/dist/capture/packed-sensor-raw.js +221 -0
  66. package/dist/capture/packed-sensor-raw.js.map +1 -0
  67. package/dist/capture/photographic-export.d.ts +58 -35
  68. package/dist/capture/photographic-export.js +177 -70
  69. package/dist/capture/photographic-export.js.map +1 -1
  70. package/dist/capture/raw-development-kernel.d.ts +52 -0
  71. package/dist/capture/raw-development-kernel.js +88 -0
  72. package/dist/capture/raw-development-kernel.js.map +1 -0
  73. package/dist/capture/raw-frame-limits.d.ts +7 -7
  74. package/dist/capture/raw-frame-limits.js +7 -6
  75. package/dist/capture/raw-frame-limits.js.map +1 -1
  76. package/dist/capture/raw-frame-reconstruction.d.ts +8 -9
  77. package/dist/capture/raw-frame-reconstruction.js +9 -8
  78. package/dist/capture/raw-frame-reconstruction.js.map +1 -1
  79. package/dist/capture/raw-white-level.d.ts +55 -0
  80. package/dist/capture/raw-white-level.js +165 -0
  81. package/dist/capture/raw-white-level.js.map +1 -0
  82. package/dist/capture/release-sequence.d.ts +5 -7
  83. package/dist/capture/release-sequence.js +15 -13
  84. package/dist/capture/release-sequence.js.map +1 -1
  85. package/dist/capture/sensor-raw-frame.d.ts +5 -6
  86. package/dist/capture/sensor-raw-frame.js +26 -9
  87. package/dist/capture/sensor-raw-frame.js.map +1 -1
  88. package/dist/capture/sensor-raw-producer.d.ts +21 -13
  89. package/dist/capture/sensor-raw-producer.js +86 -25
  90. package/dist/capture/sensor-raw-producer.js.map +1 -1
  91. package/dist/capture/simulated-capture.d.ts +15 -16
  92. package/dist/capture/simulated-capture.js +22 -12
  93. package/dist/capture/simulated-capture.js.map +1 -1
  94. package/dist/color/camera-color-matrix.d.ts +69 -0
  95. package/dist/color/camera-color-matrix.js +132 -0
  96. package/dist/color/camera-color-matrix.js.map +1 -0
  97. package/dist/color/capture-color.d.ts +17 -10
  98. package/dist/color/capture-color.js +50 -17
  99. package/dist/color/capture-color.js.map +1 -1
  100. package/dist/color/chromatic-adaptation.d.ts +63 -0
  101. package/dist/color/chromatic-adaptation.js +91 -0
  102. package/dist/color/chromatic-adaptation.js.map +1 -0
  103. package/dist/color/color-difference.d.ts +104 -0
  104. package/dist/color/color-difference.js +205 -0
  105. package/dist/color/color-difference.js.map +1 -0
  106. package/dist/color/color-matching-functions.d.ts +168 -0
  107. package/dist/color/color-matching-functions.js +309 -0
  108. package/dist/color/color-matching-functions.js.map +1 -0
  109. package/dist/color/colorimetry-math.d.ts +52 -0
  110. package/dist/color/colorimetry-math.js +144 -0
  111. package/dist/color/colorimetry-math.js.map +1 -0
  112. package/dist/color/gamut-mapping.d.ts +54 -0
  113. package/dist/color/gamut-mapping.js +107 -0
  114. package/dist/color/gamut-mapping.js.map +1 -0
  115. package/dist/color/illuminants.d.ts +182 -0
  116. package/dist/color/illuminants.js +434 -0
  117. package/dist/color/illuminants.js.map +1 -0
  118. package/dist/color/rgb-color-spaces.d.ts +79 -0
  119. package/dist/color/rgb-color-spaces.js +115 -0
  120. package/dist/color/rgb-color-spaces.js.map +1 -0
  121. package/dist/color/sensor-color-development.d.ts +33 -11
  122. package/dist/color/sensor-color-development.js +104 -30
  123. package/dist/color/sensor-color-development.js.map +1 -1
  124. package/dist/color/srgb-icc.d.ts +9 -2
  125. package/dist/color/srgb-icc.js +16 -5
  126. package/dist/color/srgb-icc.js.map +1 -1
  127. package/dist/color/srgb-transfer.d.ts +1 -2
  128. package/dist/color/srgb-transfer.js +1 -1
  129. package/dist/color/srgb-transfer.js.map +1 -1
  130. package/dist/color/white-balance.d.ts +68 -19
  131. package/dist/color/white-balance.js +168 -35
  132. package/dist/color/white-balance.js.map +1 -1
  133. package/dist/composition/image-formation-plan.d.ts +152 -128
  134. package/dist/composition/image-formation-plan.js +292 -138
  135. package/dist/composition/image-formation-plan.js.map +1 -1
  136. package/dist/composition/plan-consumer.d.ts +6 -7
  137. package/dist/composition/plan-consumer.js +14 -11
  138. package/dist/composition/plan-consumer.js.map +1 -1
  139. package/dist/core/calculation-result.d.ts +21 -14
  140. package/dist/core/calculation-result.js +209 -11
  141. package/dist/core/calculation-result.js.map +1 -1
  142. package/dist/core/canonical-json.d.ts +13 -8
  143. package/dist/core/canonical-json.js +34 -15
  144. package/dist/core/canonical-json.js.map +1 -1
  145. package/dist/core/configuration-error.d.ts +5 -4
  146. package/dist/core/configuration-error.js +5 -3
  147. package/dist/core/configuration-error.js.map +1 -1
  148. package/dist/core/evidence-provenance.d.ts +12 -12
  149. package/dist/core/evidence-provenance.js +10 -9
  150. package/dist/core/evidence-provenance.js.map +1 -1
  151. package/dist/core/image-formation.d.ts +11 -10
  152. package/dist/core/image-formation.js +11 -9
  153. package/dist/core/image-formation.js.map +1 -1
  154. package/dist/core/owned-data.d.ts +9 -17
  155. package/dist/core/owned-data.js +9 -16
  156. package/dist/core/owned-data.js.map +1 -1
  157. package/dist/core/portable-math.d.ts +15 -0
  158. package/dist/core/portable-math.js +56 -0
  159. package/dist/core/portable-math.js.map +1 -0
  160. package/dist/core/record-validation.d.ts +48 -9
  161. package/dist/core/record-validation.js +93 -19
  162. package/dist/core/record-validation.js.map +1 -1
  163. package/dist/core/scientific-assurance.d.ts +16 -14
  164. package/dist/core/scientific-assurance.js +22 -18
  165. package/dist/core/scientific-assurance.js.map +1 -1
  166. package/dist/core/spectral-composition.d.ts +13 -14
  167. package/dist/core/spectral-composition.js +30 -27
  168. package/dist/core/spectral-composition.js.map +1 -1
  169. package/dist/core/spectral.d.ts +5 -6
  170. package/dist/core/spectral.js +9 -7
  171. package/dist/core/spectral.js.map +1 -1
  172. package/dist/core/validation.d.ts +3 -6
  173. package/dist/core/validation.js +3 -5
  174. package/dist/core/validation.js.map +1 -1
  175. package/dist/core/version.d.ts +6 -6
  176. package/dist/core/version.js +6 -5
  177. package/dist/core/version.js.map +1 -1
  178. package/dist/equipment/exposure-capabilities.d.ts +10 -10
  179. package/dist/equipment/exposure-capabilities.js +40 -30
  180. package/dist/equipment/exposure-capabilities.js.map +1 -1
  181. package/dist/equipment/generic-tier-assets.d.ts +13 -6
  182. package/dist/equipment/generic-tier-assets.js +34 -15
  183. package/dist/equipment/generic-tier-assets.js.map +1 -1
  184. package/dist/equipment/generic-tier-presets.d.ts +5 -6
  185. package/dist/equipment/generic-tier-presets.js +15 -13
  186. package/dist/equipment/generic-tier-presets.js.map +1 -1
  187. package/dist/equipment/iso-capabilities.d.ts +21 -22
  188. package/dist/equipment/iso-capabilities.js +49 -44
  189. package/dist/equipment/iso-capabilities.js.map +1 -1
  190. package/dist/equipment/metering-capabilities.d.ts +5 -6
  191. package/dist/equipment/metering-capabilities.js +22 -19
  192. package/dist/equipment/metering-capabilities.js.map +1 -1
  193. package/dist/equipment/release-capabilities.d.ts +3 -4
  194. package/dist/equipment/release-capabilities.js +18 -14
  195. package/dist/equipment/release-capabilities.js.map +1 -1
  196. package/dist/exposure/exposure-duration-control.d.ts +19 -17
  197. package/dist/exposure/exposure-duration-control.js +27 -23
  198. package/dist/exposure/exposure-duration-control.js.map +1 -1
  199. package/dist/exposure/exposure-mode-resolver.d.ts +42 -39
  200. package/dist/exposure/exposure-mode-resolver.js +127 -82
  201. package/dist/exposure/exposure-mode-resolver.js.map +1 -1
  202. package/dist/exposure/exposure.d.ts +17 -16
  203. package/dist/exposure/exposure.js +22 -15
  204. package/dist/exposure/exposure.js.map +1 -1
  205. package/dist/exposure/flash-ttl.d.ts +135 -0
  206. package/dist/exposure/flash-ttl.js +193 -0
  207. package/dist/exposure/flash-ttl.js.map +1 -0
  208. package/dist/exposure/flash.d.ts +144 -36
  209. package/dist/exposure/flash.js +259 -59
  210. package/dist/exposure/flash.js.map +1 -1
  211. package/dist/exposure/metering-scene-radiance.d.ts +10 -10
  212. package/dist/exposure/metering-scene-radiance.js +42 -23
  213. package/dist/exposure/metering-scene-radiance.js.map +1 -1
  214. package/dist/exposure/metering-target.d.ts +8 -8
  215. package/dist/exposure/metering-target.js +30 -20
  216. package/dist/exposure/metering-target.js.map +1 -1
  217. package/dist/exposure/metering-temporal.d.ts +16 -15
  218. package/dist/exposure/metering-temporal.js +41 -19
  219. package/dist/exposure/metering-temporal.js.map +1 -1
  220. package/dist/exposure/metering.d.ts +64 -17
  221. package/dist/exposure/metering.js +159 -30
  222. package/dist/exposure/metering.js.map +1 -1
  223. package/dist/exposure/program-line.d.ts +5 -5
  224. package/dist/exposure/program-line.js +20 -13
  225. package/dist/exposure/program-line.js.map +1 -1
  226. package/dist/facade/camera-preset.d.ts +8 -0
  227. package/dist/facade/camera-preset.js +102 -0
  228. package/dist/facade/camera-preset.js.map +1 -0
  229. package/dist/facade/chart-radiance-batch.d.ts +57 -0
  230. package/dist/facade/chart-radiance-batch.js +121 -0
  231. package/dist/facade/chart-radiance-batch.js.map +1 -0
  232. package/dist/facade/chart-scenes.d.ts +177 -0
  233. package/dist/facade/chart-scenes.js +232 -0
  234. package/dist/facade/chart-scenes.js.map +1 -0
  235. package/dist/facade/diffraction-provider.d.ts +30 -0
  236. package/dist/facade/diffraction-provider.js +127 -0
  237. package/dist/facade/diffraction-provider.js.map +1 -0
  238. package/dist/facade/host-yield.d.ts +7 -0
  239. package/dist/facade/host-yield.js +19 -0
  240. package/dist/facade/host-yield.js.map +1 -0
  241. package/dist/facade/scene-radiance.d.ts +117 -0
  242. package/dist/facade/scene-radiance.js +205 -0
  243. package/dist/facade/scene-radiance.js.map +1 -0
  244. package/dist/facade/simulate-capture.d.ts +363 -0
  245. package/dist/facade/simulate-capture.js +1281 -0
  246. package/dist/facade/simulate-capture.js.map +1 -0
  247. package/dist/gpu/chart-radiance-gpu.d.ts +17 -0
  248. package/dist/gpu/chart-radiance-gpu.js +176 -0
  249. package/dist/gpu/chart-radiance-gpu.js.map +1 -0
  250. package/dist/gpu/image-kernel-accelerator.d.ts +132 -0
  251. package/dist/gpu/image-kernel-accelerator.js +720 -0
  252. package/dist/gpu/image-kernel-accelerator.js.map +1 -0
  253. package/dist/gpu/image-kernel-execution.d.ts +92 -0
  254. package/dist/gpu/image-kernel-execution.js +84 -0
  255. package/dist/gpu/image-kernel-execution.js.map +1 -0
  256. package/dist/gpu/sensor-stage-gpu.d.ts +44 -0
  257. package/dist/gpu/sensor-stage-gpu.js +317 -0
  258. package/dist/gpu/sensor-stage-gpu.js.map +1 -0
  259. package/dist/gpu/temporal-sum-gpu.d.ts +23 -0
  260. package/dist/gpu/temporal-sum-gpu.js +150 -0
  261. package/dist/gpu/temporal-sum-gpu.js.map +1 -0
  262. package/dist/gpu/webgpu-runtime.d.ts +63 -0
  263. package/dist/gpu/webgpu-runtime.js +215 -0
  264. package/dist/gpu/webgpu-runtime.js.map +1 -0
  265. package/dist/gpu/wgsl-chart-kernel.d.ts +30 -0
  266. package/dist/gpu/wgsl-chart-kernel.js +165 -0
  267. package/dist/gpu/wgsl-chart-kernel.js.map +1 -0
  268. package/dist/gpu/wgsl-kernels.d.ts +53 -0
  269. package/dist/gpu/wgsl-kernels.js +365 -0
  270. package/dist/gpu/wgsl-kernels.js.map +1 -0
  271. package/dist/gpu/wgsl-sensor-kernel.d.ts +64 -0
  272. package/dist/gpu/wgsl-sensor-kernel.js +409 -0
  273. package/dist/gpu/wgsl-sensor-kernel.js.map +1 -0
  274. package/dist/index.d.ts +91 -25
  275. package/dist/index.js +60 -15
  276. package/dist/index.js.map +1 -1
  277. package/dist/motion/camera-rotation.d.ts +92 -40
  278. package/dist/motion/camera-rotation.js +84 -47
  279. package/dist/motion/camera-rotation.js.map +1 -1
  280. package/dist/motion/capture-rotation-inverse-mapping.d.ts +37 -34
  281. package/dist/motion/capture-rotation-inverse-mapping.js +32 -24
  282. package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
  283. package/dist/motion/capture-rotation-temporal-quadrature.d.ts +39 -35
  284. package/dist/motion/capture-rotation-temporal-quadrature.js +37 -28
  285. package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
  286. package/dist/motion/capture-rotation-trajectory.d.ts +32 -28
  287. package/dist/motion/capture-rotation-trajectory.js +36 -26
  288. package/dist/motion/capture-rotation-trajectory.js.map +1 -1
  289. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +23 -21
  290. package/dist/motion/capture-translation-parallax-temporal-quadrature.js +33 -14
  291. package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
  292. package/dist/motion/extended-object-projection.d.ts +19 -16
  293. package/dist/motion/extended-object-projection.js +38 -18
  294. package/dist/motion/extended-object-projection.js.map +1 -1
  295. package/dist/motion/projected-motion.d.ts +18 -17
  296. package/dist/motion/projected-motion.js +25 -17
  297. package/dist/motion/projected-motion.js.map +1 -1
  298. package/dist/motion/temporal-exposure-sum.d.ts +55 -0
  299. package/dist/motion/temporal-exposure-sum.js +141 -0
  300. package/dist/motion/temporal-exposure-sum.js.map +1 -0
  301. package/dist/motion/video-sequence.d.ts +111 -0
  302. package/dist/motion/video-sequence.js +179 -0
  303. package/dist/motion/video-sequence.js.map +1 -0
  304. package/dist/optics/aperture.d.ts +14 -15
  305. package/dist/optics/aperture.js +13 -11
  306. package/dist/optics/aperture.js.map +1 -1
  307. package/dist/optics/atmospheric-haze.d.ts +83 -0
  308. package/dist/optics/atmospheric-haze.js +113 -0
  309. package/dist/optics/atmospheric-haze.js.map +1 -0
  310. package/dist/optics/brown-conrady-distortion.d.ts +116 -0
  311. package/dist/optics/brown-conrady-distortion.js +291 -0
  312. package/dist/optics/brown-conrady-distortion.js.map +1 -0
  313. package/dist/optics/circle-of-confusion.d.ts +10 -10
  314. package/dist/optics/circle-of-confusion.js +15 -11
  315. package/dist/optics/circle-of-confusion.js.map +1 -1
  316. package/dist/optics/complex-pupil-psf.d.ts +64 -33
  317. package/dist/optics/complex-pupil-psf.js +190 -98
  318. package/dist/optics/complex-pupil-psf.js.map +1 -1
  319. package/dist/optics/depth-of-field.d.ts +25 -15
  320. package/dist/optics/depth-of-field.js +67 -27
  321. package/dist/optics/depth-of-field.js.map +1 -1
  322. package/dist/optics/diffraction-psf-profile.d.ts +118 -0
  323. package/dist/optics/diffraction-psf-profile.js +252 -0
  324. package/dist/optics/diffraction-psf-profile.js.map +1 -0
  325. package/dist/optics/diffraction.d.ts +14 -13
  326. package/dist/optics/diffraction.js +14 -10
  327. package/dist/optics/diffraction.js.map +1 -1
  328. package/dist/optics/focus-breathing.d.ts +88 -27
  329. package/dist/optics/focus-breathing.js +114 -23
  330. package/dist/optics/focus-breathing.js.map +1 -1
  331. package/dist/optics/focus-state.d.ts +18 -18
  332. package/dist/optics/focus-state.js +21 -15
  333. package/dist/optics/focus-state.js.map +1 -1
  334. package/dist/optics/front-of-lens-filter.d.ts +45 -14
  335. package/dist/optics/front-of-lens-filter.js +259 -88
  336. package/dist/optics/front-of-lens-filter.js.map +1 -1
  337. package/dist/optics/illumination-vignetting.d.ts +16 -17
  338. package/dist/optics/illumination-vignetting.js +40 -17
  339. package/dist/optics/illumination-vignetting.js.map +1 -1
  340. package/dist/optics/irradiance-convolution.d.ts +59 -0
  341. package/dist/optics/irradiance-convolution.js +138 -0
  342. package/dist/optics/irradiance-convolution.js.map +1 -0
  343. package/dist/optics/lateral-chromatic-aberration.d.ts +33 -30
  344. package/dist/optics/lateral-chromatic-aberration.js +33 -23
  345. package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
  346. package/dist/optics/lens-psf-kernels.d.ts +89 -0
  347. package/dist/optics/lens-psf-kernels.js +175 -0
  348. package/dist/optics/lens-psf-kernels.js.map +1 -0
  349. package/dist/optics/lens-psf-profile.d.ts +78 -46
  350. package/dist/optics/lens-psf-profile.js +335 -124
  351. package/dist/optics/lens-psf-profile.js.map +1 -1
  352. package/dist/optics/longitudinal-chromatic-aberration.d.ts +102 -0
  353. package/dist/optics/longitudinal-chromatic-aberration.js +210 -0
  354. package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -0
  355. package/dist/optics/polygon-diffraction.d.ts +80 -23
  356. package/dist/optics/polygon-diffraction.js +130 -25
  357. package/dist/optics/polygon-diffraction.js.map +1 -1
  358. package/dist/optics/profile-contract.d.ts +5 -6
  359. package/dist/optics/profile-contract.js +14 -11
  360. package/dist/optics/profile-contract.js.map +1 -1
  361. package/dist/optics/psf-foundation.d.ts +23 -23
  362. package/dist/optics/psf-foundation.js +24 -21
  363. package/dist/optics/psf-foundation.js.map +1 -1
  364. package/dist/optics/pupil-vignetting.d.ts +118 -0
  365. package/dist/optics/pupil-vignetting.js +264 -0
  366. package/dist/optics/pupil-vignetting.js.map +1 -0
  367. package/dist/optics/radial-distortion.d.ts +34 -33
  368. package/dist/optics/radial-distortion.js +37 -30
  369. package/dist/optics/radial-distortion.js.map +1 -1
  370. package/dist/optics/scene-to-sensor-irradiance.d.ts +47 -33
  371. package/dist/optics/scene-to-sensor-irradiance.js +73 -45
  372. package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
  373. package/dist/optics/scene-to-sensor-quadrature.d.ts +23 -18
  374. package/dist/optics/scene-to-sensor-quadrature.js +16 -11
  375. package/dist/optics/scene-to-sensor-quadrature.js.map +1 -1
  376. package/dist/optics/sensor-aperture-rays.d.ts +20 -4
  377. package/dist/optics/sensor-aperture-rays.js +32 -14
  378. package/dist/optics/sensor-aperture-rays.js.map +1 -1
  379. package/dist/optics/sensor-environment-query.d.ts +81 -16
  380. package/dist/optics/sensor-environment-query.js +145 -12
  381. package/dist/optics/sensor-environment-query.js.map +1 -1
  382. package/dist/optics/sensor-psf-quadrature.d.ts +12 -10
  383. package/dist/optics/sensor-psf-quadrature.js +18 -11
  384. package/dist/optics/sensor-psf-quadrature.js.map +1 -1
  385. package/dist/optics/sensor-psf-support.d.ts +8 -6
  386. package/dist/optics/sensor-psf-support.js +8 -5
  387. package/dist/optics/sensor-psf-support.js.map +1 -1
  388. package/dist/optics/stray-light.d.ts +22 -19
  389. package/dist/optics/stray-light.js +18 -12
  390. package/dist/optics/stray-light.js.map +1 -1
  391. package/dist/optics/thin-lens.d.ts +10 -9
  392. package/dist/optics/thin-lens.js +12 -8
  393. package/dist/optics/thin-lens.js.map +1 -1
  394. package/dist/optics/zernike-wavefront.d.ts +154 -0
  395. package/dist/optics/zernike-wavefront.js +352 -0
  396. package/dist/optics/zernike-wavefront.js.map +1 -0
  397. package/dist/output/capture-corrected-sdr.d.ts +16 -8
  398. package/dist/output/capture-corrected-sdr.js +16 -8
  399. package/dist/output/capture-corrected-sdr.js.map +1 -1
  400. package/dist/output/capture-geometry.d.ts +34 -36
  401. package/dist/output/capture-geometry.js +52 -32
  402. package/dist/output/capture-geometry.js.map +1 -1
  403. package/dist/output/capture-sdr.d.ts +7 -6
  404. package/dist/output/capture-sdr.js +11 -8
  405. package/dist/output/capture-sdr.js.map +1 -1
  406. package/dist/output/crop.d.ts +22 -6
  407. package/dist/output/crop.js +40 -6
  408. package/dist/output/crop.js.map +1 -1
  409. package/dist/output/geometric-transforms.d.ts +60 -23
  410. package/dist/output/geometric-transforms.js +111 -24
  411. package/dist/output/geometric-transforms.js.map +1 -1
  412. package/dist/output/lens-corrections.d.ts +27 -19
  413. package/dist/output/lens-corrections.js +29 -13
  414. package/dist/output/lens-corrections.js.map +1 -1
  415. package/dist/output/native-capture-sdr.d.ts +71 -16
  416. package/dist/output/native-capture-sdr.js +190 -33
  417. package/dist/output/native-capture-sdr.js.map +1 -1
  418. package/dist/output/png-encoder.d.ts +65 -0
  419. package/dist/output/png-encoder.js +461 -0
  420. package/dist/output/png-encoder.js.map +1 -0
  421. package/dist/output/print-contrast-reference.d.ts +10 -9
  422. package/dist/output/print-contrast-reference.js +10 -8
  423. package/dist/output/print-contrast-reference.js.map +1 -1
  424. package/dist/output/print-detail.d.ts +18 -17
  425. package/dist/output/print-detail.js +12 -10
  426. package/dist/output/print-detail.js.map +1 -1
  427. package/dist/output/print-jpeg.d.ts +26 -5
  428. package/dist/output/print-jpeg.js +117 -50
  429. package/dist/output/print-jpeg.js.map +1 -1
  430. package/dist/output/print-plan.d.ts +19 -19
  431. package/dist/output/print-plan.js +11 -10
  432. package/dist/output/print-plan.js.map +1 -1
  433. package/dist/output/print-region-statistics.d.ts +14 -15
  434. package/dist/output/print-region-statistics.js +11 -11
  435. package/dist/output/print-region-statistics.js.map +1 -1
  436. package/dist/output/sdr-rendering.d.ts +48 -10
  437. package/dist/output/sdr-rendering.js +114 -25
  438. package/dist/output/sdr-rendering.js.map +1 -1
  439. package/dist/output/subject-framing-crop.d.ts +6 -10
  440. package/dist/output/subject-framing-crop.js +23 -13
  441. package/dist/output/subject-framing-crop.js.map +1 -1
  442. package/dist/processing/demosaic.d.ts +90 -0
  443. package/dist/processing/demosaic.js +275 -0
  444. package/dist/processing/demosaic.js.map +1 -0
  445. package/dist/processing/denoise.d.ts +68 -0
  446. package/dist/processing/denoise.js +214 -0
  447. package/dist/processing/denoise.js.map +1 -0
  448. package/dist/processing/focus-stacking.d.ts +17 -0
  449. package/dist/processing/focus-stacking.js +80 -0
  450. package/dist/processing/focus-stacking.js.map +1 -0
  451. package/dist/processing/hdr.d.ts +54 -0
  452. package/dist/processing/hdr.js +172 -0
  453. package/dist/processing/hdr.js.map +1 -0
  454. package/dist/processing/image-ops.d.ts +66 -0
  455. package/dist/processing/image-ops.js +192 -0
  456. package/dist/processing/image-ops.js.map +1 -0
  457. package/dist/processing/panorama.d.ts +51 -0
  458. package/dist/processing/panorama.js +305 -0
  459. package/dist/processing/panorama.js.map +1 -0
  460. package/dist/processing/processing-task.d.ts +85 -0
  461. package/dist/processing/processing-task.js +164 -0
  462. package/dist/processing/processing-task.js.map +1 -0
  463. package/dist/processing/tone-mapping.d.ts +69 -0
  464. package/dist/processing/tone-mapping.js +310 -0
  465. package/dist/processing/tone-mapping.js.map +1 -0
  466. package/dist/schema/camera.d.ts +5 -4
  467. package/dist/schema/illumination-spectral.d.ts +13 -19
  468. package/dist/schema/illumination-spectral.js +23 -19
  469. package/dist/schema/illumination-spectral.js.map +1 -1
  470. package/dist/schema/illumination-temporal.d.ts +12 -15
  471. package/dist/schema/illumination-temporal.js +43 -28
  472. package/dist/schema/illumination-temporal.js.map +1 -1
  473. package/dist/schema/illumination.d.ts +5 -4
  474. package/dist/schema/illumination.js +55 -20
  475. package/dist/schema/illumination.js.map +1 -1
  476. package/dist/schema/scene-radiance-temporal.d.ts +9 -11
  477. package/dist/schema/scene-radiance-temporal.js +26 -23
  478. package/dist/schema/scene-radiance-temporal.js.map +1 -1
  479. package/dist/schema/scene-radiance.d.ts +17 -17
  480. package/dist/schema/scene-radiance.js +56 -34
  481. package/dist/schema/scene-radiance.js.map +1 -1
  482. package/dist/schema/scene.d.ts +14 -13
  483. package/dist/schema/validation.d.ts +0 -1
  484. package/dist/schema/validation.js +17 -15
  485. package/dist/schema/validation.js.map +1 -1
  486. package/dist/sensor/accumulated-charge.d.ts +45 -64
  487. package/dist/sensor/accumulated-charge.js +41 -47
  488. package/dist/sensor/accumulated-charge.js.map +1 -1
  489. package/dist/sensor/architecture.d.ts +22 -25
  490. package/dist/sensor/architecture.js +17 -16
  491. package/dist/sensor/architecture.js.map +1 -1
  492. package/dist/sensor/camera-saturation-capacity.d.ts +21 -28
  493. package/dist/sensor/camera-saturation-capacity.js +36 -34
  494. package/dist/sensor/camera-saturation-capacity.js.map +1 -1
  495. package/dist/sensor/capture-color-sampling-binding.d.ts +46 -51
  496. package/dist/sensor/capture-color-sampling-binding.js +39 -41
  497. package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
  498. package/dist/sensor/capture-mode-timing.d.ts +8 -9
  499. package/dist/sensor/capture-mode-timing.js +24 -21
  500. package/dist/sensor/capture-mode-timing.js.map +1 -1
  501. package/dist/sensor/capture-mode.d.ts +28 -30
  502. package/dist/sensor/capture-mode.js +33 -31
  503. package/dist/sensor/capture-mode.js.map +1 -1
  504. package/dist/sensor/color-sampling.d.ts +30 -33
  505. package/dist/sensor/color-sampling.js +32 -37
  506. package/dist/sensor/color-sampling.js.map +1 -1
  507. package/dist/sensor/constant-rate-temporal-integration.d.ts +19 -23
  508. package/dist/sensor/constant-rate-temporal-integration.js +28 -26
  509. package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
  510. package/dist/sensor/dark-current.d.ts +53 -49
  511. package/dist/sensor/dark-current.js +87 -46
  512. package/dist/sensor/dark-current.js.map +1 -1
  513. package/dist/sensor/environment-photo-signal.d.ts +71 -30
  514. package/dist/sensor/environment-photo-signal.js +127 -46
  515. package/dist/sensor/environment-photo-signal.js.map +1 -1
  516. package/dist/sensor/eqe-electron-rate.d.ts +14 -13
  517. package/dist/sensor/eqe-electron-rate.js +34 -14
  518. package/dist/sensor/eqe-electron-rate.js.map +1 -1
  519. package/dist/sensor/eqe-local-exposure.d.ts +24 -24
  520. package/dist/sensor/eqe-local-exposure.js +15 -11
  521. package/dist/sensor/eqe-local-exposure.js.map +1 -1
  522. package/dist/sensor/eqe-temporal-exposure.d.ts +11 -11
  523. package/dist/sensor/eqe-temporal-exposure.js +15 -10
  524. package/dist/sensor/eqe-temporal-exposure.js.map +1 -1
  525. package/dist/sensor/exposure-window.d.ts +48 -34
  526. package/dist/sensor/exposure-window.js +77 -36
  527. package/dist/sensor/exposure-window.js.map +1 -1
  528. package/dist/sensor/fixed-pattern-noise.d.ts +108 -0
  529. package/dist/sensor/fixed-pattern-noise.js +166 -0
  530. package/dist/sensor/fixed-pattern-noise.js.map +1 -0
  531. package/dist/sensor/iso-gain.d.ts +44 -0
  532. package/dist/sensor/iso-gain.js +119 -0
  533. package/dist/sensor/iso-gain.js.map +1 -0
  534. package/dist/sensor/iso-signal-chain.d.ts +25 -48
  535. package/dist/sensor/iso-signal-chain.js +52 -66
  536. package/dist/sensor/iso-signal-chain.js.map +1 -1
  537. package/dist/sensor/local-exposure-binding.d.ts +21 -21
  538. package/dist/sensor/local-exposure-binding.js +22 -18
  539. package/dist/sensor/local-exposure-binding.js.map +1 -1
  540. package/dist/sensor/optical-stack.d.ts +36 -40
  541. package/dist/sensor/optical-stack.js +34 -37
  542. package/dist/sensor/optical-stack.js.map +1 -1
  543. package/dist/sensor/photon-energy.d.ts +22 -28
  544. package/dist/sensor/photon-energy.js +42 -34
  545. package/dist/sensor/photon-energy.js.map +1 -1
  546. package/dist/sensor/physical-charge-capacity.d.ts +20 -30
  547. package/dist/sensor/physical-charge-capacity.js +35 -36
  548. package/dist/sensor/physical-charge-capacity.js.map +1 -1
  549. package/dist/sensor/pixel-pitch.d.ts +2 -3
  550. package/dist/sensor/pixel-pitch.js +4 -2
  551. package/dist/sensor/pixel-pitch.js.map +1 -1
  552. package/dist/sensor/radiometry-readiness.d.ts +13 -15
  553. package/dist/sensor/radiometry-readiness.js +20 -17
  554. package/dist/sensor/radiometry-readiness.js.map +1 -1
  555. package/dist/sensor/raw-readout.d.ts +173 -83
  556. package/dist/sensor/raw-readout.js +425 -160
  557. package/dist/sensor/raw-readout.js.map +1 -1
  558. package/dist/sensor/raw-reconstruction.d.ts +112 -44
  559. package/dist/sensor/raw-reconstruction.js +200 -47
  560. package/dist/sensor/raw-reconstruction.js.map +1 -1
  561. package/dist/sensor/readout-exposure-linkage.d.ts +103 -34
  562. package/dist/sensor/readout-exposure-linkage.js +125 -27
  563. package/dist/sensor/readout-exposure-linkage.js.map +1 -1
  564. package/dist/sensor/readout-timing.d.ts +43 -44
  565. package/dist/sensor/readout-timing.js +38 -30
  566. package/dist/sensor/readout-timing.js.map +1 -1
  567. package/dist/sensor/response-application-compatibility.d.ts +21 -28
  568. package/dist/sensor/response-application-compatibility.js +35 -34
  569. package/dist/sensor/response-application-compatibility.js.map +1 -1
  570. package/dist/sensor/response-operating-range.d.ts +26 -35
  571. package/dist/sensor/response-operating-range.js +40 -39
  572. package/dist/sensor/response-operating-range.js.map +1 -1
  573. package/dist/sensor/responsivity-photocurrent.d.ts +21 -29
  574. package/dist/sensor/responsivity-photocurrent.js +57 -40
  575. package/dist/sensor/responsivity-photocurrent.js.map +1 -1
  576. package/dist/sensor/sampling-aperture.d.ts +21 -25
  577. package/dist/sensor/sampling-aperture.js +29 -28
  578. package/dist/sensor/sampling-aperture.js.map +1 -1
  579. package/dist/sensor/scene-eqe-temporal-exposure.d.ts +14 -12
  580. package/dist/sensor/scene-eqe-temporal-exposure.js +13 -8
  581. package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -1
  582. package/dist/sensor/sensor-geometry.d.ts +28 -32
  583. package/dist/sensor/sensor-geometry.js +35 -20
  584. package/dist/sensor/sensor-geometry.js.map +1 -1
  585. package/dist/sensor/signal-noise.d.ts +14 -16
  586. package/dist/sensor/signal-noise.js +15 -13
  587. package/dist/sensor/signal-noise.js.map +1 -1
  588. package/dist/sensor/spatial-sample-reduction.d.ts +45 -60
  589. package/dist/sensor/spatial-sample-reduction.js +39 -48
  590. package/dist/sensor/spatial-sample-reduction.js.map +1 -1
  591. package/dist/sensor/spatial-sampling-quadrature.d.ts +46 -54
  592. package/dist/sensor/spatial-sampling-quadrature.js +31 -36
  593. package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
  594. package/dist/sensor/spatio-spectral-reduction.d.ts +32 -42
  595. package/dist/sensor/spatio-spectral-reduction.js +24 -29
  596. package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
  597. package/dist/sensor/spectral-coverage.d.ts +6 -9
  598. package/dist/sensor/spectral-coverage.js +9 -6
  599. package/dist/sensor/spectral-coverage.js.map +1 -1
  600. package/dist/sensor/spectral-quadrature.d.ts +46 -60
  601. package/dist/sensor/spectral-quadrature.js +38 -48
  602. package/dist/sensor/spectral-quadrature.js.map +1 -1
  603. package/dist/sensor/spectral-response.d.ts +53 -41
  604. package/dist/sensor/spectral-response.js +80 -47
  605. package/dist/sensor/spectral-response.js.map +1 -1
  606. package/dist/sensor/stochastic-seed.d.ts +50 -0
  607. package/dist/sensor/stochastic-seed.js +123 -0
  608. package/dist/sensor/stochastic-seed.js.map +1 -0
  609. package/dist/sensor/temporal-eqe-sum.d.ts +2 -4
  610. package/dist/sensor/temporal-eqe-sum.js +5 -6
  611. package/dist/sensor/temporal-eqe-sum.js.map +1 -1
  612. package/dist/sensor/temporal-photo-signal.d.ts +5 -6
  613. package/dist/sensor/temporal-photo-signal.js +11 -10
  614. package/dist/sensor/temporal-photo-signal.js.map +1 -1
  615. package/dist/sensor/temporal-sample-binding.d.ts +1 -2
  616. package/dist/sensor/temporal-sample-binding.js +3 -3
  617. package/dist/sensor/temporal-sample-binding.js.map +1 -1
  618. package/dist/simulation/poc-simulation.d.ts +16 -16
  619. package/dist/simulation/poc-simulation.js +20 -15
  620. package/dist/simulation/poc-simulation.js.map +1 -1
  621. package/dist/stabilization/camera-shake.d.ts +42 -18
  622. package/dist/stabilization/camera-shake.js +43 -20
  623. package/dist/stabilization/camera-shake.js.map +1 -1
  624. package/dist/stabilization/system.d.ts +44 -41
  625. package/dist/stabilization/system.js +196 -108
  626. package/dist/stabilization/system.js.map +1 -1
  627. package/docs/AGENT_GUIDE.md +183 -0
  628. package/docs/API_REFERENCE.md +777 -2
  629. package/docs/QUICK_START.md +663 -0
  630. package/docs/USAGE.md +1719 -714
  631. package/docs/api/camera-equivalent-focal-length.md +6 -7
  632. package/docs/api/camera-field-of-view.md +16 -8
  633. package/docs/api/camera-lens-projection.md +246 -0
  634. package/docs/api/camera-projected-object-size.md +6 -5
  635. package/docs/api/capture-capture-export-metadata.md +10 -10
  636. package/docs/api/capture-dng-import.md +134 -0
  637. package/docs/api/capture-environment-raw-producer.md +17 -11
  638. package/docs/api/capture-export-jpeg.md +16 -0
  639. package/docs/api/capture-focus-control.md +25 -47
  640. package/docs/api/capture-linear-encoding.md +21 -12
  641. package/docs/api/capture-lossless-jpeg.md +49 -0
  642. package/docs/api/capture-native-environment-optical-stage.md +75 -0
  643. package/docs/api/capture-native-environment-raw.md +161 -4
  644. package/docs/api/capture-native-raw-development.md +69 -8
  645. package/docs/api/capture-native-raw-dng.md +84 -0
  646. package/docs/api/capture-native-raw.md +21 -10
  647. package/docs/api/capture-packed-sensor-raw.md +156 -0
  648. package/docs/api/capture-photographic-export.md +69 -31
  649. package/docs/api/capture-raw-frame-reconstruction.md +8 -8
  650. package/docs/api/capture-raw-white-level.md +37 -0
  651. package/docs/api/capture-release-sequence.md +6 -7
  652. package/docs/api/capture-sensor-raw-frame.md +6 -6
  653. package/docs/api/capture-sensor-raw-producer.md +17 -11
  654. package/docs/api/capture-simulated-capture.md +15 -15
  655. package/docs/api/color-camera-color-matrix.md +103 -0
  656. package/docs/api/color-capture-color.md +22 -11
  657. package/docs/api/color-chromatic-adaptation.md +82 -0
  658. package/docs/api/color-color-difference.md +134 -0
  659. package/docs/api/color-color-matching-functions.md +259 -0
  660. package/docs/api/color-colorimetry-math.md +54 -0
  661. package/docs/api/color-gamut-mapping.md +72 -0
  662. package/docs/api/color-illuminants.md +280 -0
  663. package/docs/api/color-rgb-color-spaces.md +151 -0
  664. package/docs/api/color-sensor-color-development.md +27 -0
  665. package/docs/api/color-srgb-icc.md +2 -4
  666. package/docs/api/color-white-balance.md +95 -19
  667. package/docs/api/composition-image-formation-plan.md +124 -95
  668. package/docs/api/composition-plan-consumer.md +7 -7
  669. package/docs/api/core-calculation-result.md +18 -14
  670. package/docs/api/core-configuration-error.md +1 -1
  671. package/docs/api/core-image-formation.md +7 -7
  672. package/docs/api/core-scientific-assurance.md +12 -10
  673. package/docs/api/core-spectral-composition.md +14 -14
  674. package/docs/api/core-spectral.md +6 -6
  675. package/docs/api/core-validation.md +3 -3
  676. package/docs/api/core-version.md +7 -6
  677. package/docs/api/equipment-exposure-capabilities.md +11 -10
  678. package/docs/api/equipment-generic-tier-assets.md +7 -2
  679. package/docs/api/equipment-generic-tier-presets.md +6 -6
  680. package/docs/api/equipment-iso-capabilities.md +18 -18
  681. package/docs/api/equipment-metering-capabilities.md +6 -6
  682. package/docs/api/equipment-release-capabilities.md +4 -4
  683. package/docs/api/exports.json +2253 -3
  684. package/docs/api/exposure-exposure-duration-control.md +9 -9
  685. package/docs/api/exposure-exposure-mode-resolver.md +35 -31
  686. package/docs/api/exposure-exposure.md +10 -10
  687. package/docs/api/exposure-flash-ttl.md +182 -0
  688. package/docs/api/exposure-flash.md +183 -28
  689. package/docs/api/exposure-metering-scene-radiance.md +11 -10
  690. package/docs/api/exposure-metering-target.md +9 -8
  691. package/docs/api/exposure-metering-temporal.md +8 -8
  692. package/docs/api/exposure-metering.md +69 -9
  693. package/docs/api/exposure-program-line.md +6 -5
  694. package/docs/api/facade-chart-radiance-batch.md +96 -0
  695. package/docs/api/facade-chart-scenes.md +240 -0
  696. package/docs/api/facade-scene-radiance.md +122 -0
  697. package/docs/api/facade-simulate-capture.md +397 -0
  698. package/docs/api/gpu-image-kernel-accelerator.md +157 -0
  699. package/docs/api/gpu-image-kernel-execution.md +152 -0
  700. package/docs/api/motion-camera-rotation.md +43 -26
  701. package/docs/api/motion-capture-rotation-inverse-mapping.md +24 -23
  702. package/docs/api/motion-capture-rotation-temporal-quadrature.md +22 -22
  703. package/docs/api/motion-capture-rotation-trajectory.md +15 -15
  704. package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +15 -14
  705. package/docs/api/motion-extended-object-projection.md +10 -8
  706. package/docs/api/motion-projected-motion.md +8 -8
  707. package/docs/api/motion-temporal-exposure-sum.md +98 -0
  708. package/docs/api/motion-video-sequence.md +159 -0
  709. package/docs/api/optics-aperture.md +8 -8
  710. package/docs/api/optics-atmospheric-haze.md +104 -0
  711. package/docs/api/optics-brown-conrady-distortion.md +123 -0
  712. package/docs/api/optics-circle-of-confusion.md +5 -4
  713. package/docs/api/optics-complex-pupil-psf.md +57 -16
  714. package/docs/api/optics-depth-of-field.md +12 -6
  715. package/docs/api/optics-diffraction-psf-profile.md +96 -0
  716. package/docs/api/optics-diffraction.md +8 -7
  717. package/docs/api/optics-focus-breathing.md +104 -16
  718. package/docs/api/optics-focus-state.md +9 -10
  719. package/docs/api/optics-front-of-lens-filter.md +72 -14
  720. package/docs/api/optics-illumination-vignetting.md +10 -10
  721. package/docs/api/optics-irradiance-convolution.md +95 -0
  722. package/docs/api/optics-lateral-chromatic-aberration.md +22 -21
  723. package/docs/api/optics-lens-psf-kernels.md +72 -0
  724. package/docs/api/optics-lens-psf-profile.md +48 -26
  725. package/docs/api/optics-longitudinal-chromatic-aberration.md +128 -0
  726. package/docs/api/optics-polygon-diffraction.md +78 -13
  727. package/docs/api/optics-profile-contract.md +4 -4
  728. package/docs/api/optics-psf-foundation.md +12 -12
  729. package/docs/api/optics-pupil-vignetting.md +132 -0
  730. package/docs/api/optics-radial-distortion.md +12 -12
  731. package/docs/api/optics-scene-to-sensor-irradiance.md +25 -14
  732. package/docs/api/optics-scene-to-sensor-quadrature.md +15 -12
  733. package/docs/api/optics-sensor-aperture-rays.md +3 -2
  734. package/docs/api/optics-sensor-environment-query.md +52 -9
  735. package/docs/api/optics-sensor-psf-quadrature.md +13 -10
  736. package/docs/api/optics-stray-light.md +12 -11
  737. package/docs/api/optics-thin-lens.md +4 -3
  738. package/docs/api/optics-zernike-wavefront.md +229 -0
  739. package/docs/api/output-capture-corrected-sdr.md +10 -7
  740. package/docs/api/output-capture-geometry.md +35 -36
  741. package/docs/api/output-capture-sdr.md +4 -4
  742. package/docs/api/output-crop.md +7 -4
  743. package/docs/api/output-geometric-transforms.md +65 -19
  744. package/docs/api/output-lens-corrections.md +17 -15
  745. package/docs/api/output-native-capture-sdr.md +26 -13
  746. package/docs/api/output-png-encoder.md +105 -0
  747. package/docs/api/output-print-contrast-reference.md +8 -8
  748. package/docs/api/output-print-detail.md +14 -14
  749. package/docs/api/output-print-jpeg.md +22 -5
  750. package/docs/api/output-print-plan.md +18 -18
  751. package/docs/api/output-print-region-statistics.md +14 -14
  752. package/docs/api/output-sdr-rendering.md +52 -10
  753. package/docs/api/output-subject-framing-crop.md +5 -6
  754. package/docs/api/processing-demosaic.md +120 -0
  755. package/docs/api/processing-denoise.md +148 -0
  756. package/docs/api/processing-focus-stacking.md +41 -0
  757. package/docs/api/processing-hdr.md +113 -0
  758. package/docs/api/processing-panorama.md +82 -0
  759. package/docs/api/processing-processing-task.md +107 -0
  760. package/docs/api/processing-tone-mapping.md +142 -0
  761. package/docs/api/schema-camera.md +6 -4
  762. package/docs/api/schema-illumination-spectral.md +10 -11
  763. package/docs/api/schema-illumination-temporal.md +13 -15
  764. package/docs/api/schema-illumination.md +4 -4
  765. package/docs/api/schema-scene-radiance-temporal.md +10 -11
  766. package/docs/api/schema-scene-radiance.md +18 -17
  767. package/docs/api/schema-scene.md +9 -9
  768. package/docs/api/schema-validation.md +1 -1
  769. package/docs/api/sensor-accumulated-charge.md +12 -20
  770. package/docs/api/sensor-architecture.md +15 -16
  771. package/docs/api/sensor-camera-saturation-capacity.md +9 -11
  772. package/docs/api/sensor-capture-color-sampling-binding.md +47 -51
  773. package/docs/api/sensor-capture-mode-timing.md +9 -9
  774. package/docs/api/sensor-capture-mode.md +29 -30
  775. package/docs/api/sensor-color-sampling.md +31 -33
  776. package/docs/api/sensor-constant-rate-temporal-integration.md +10 -11
  777. package/docs/api/sensor-dark-current.md +30 -14
  778. package/docs/api/sensor-environment-photo-signal.md +13 -6
  779. package/docs/api/sensor-eqe-electron-rate.md +9 -8
  780. package/docs/api/sensor-eqe-local-exposure.md +18 -17
  781. package/docs/api/sensor-eqe-temporal-exposure.md +12 -11
  782. package/docs/api/sensor-exposure-window.md +24 -24
  783. package/docs/api/sensor-fixed-pattern-noise.md +104 -0
  784. package/docs/api/sensor-iso-gain.md +63 -0
  785. package/docs/api/sensor-iso-signal-chain.md +13 -22
  786. package/docs/api/sensor-local-exposure-binding.md +12 -13
  787. package/docs/api/sensor-optical-stack.md +37 -40
  788. package/docs/api/sensor-photon-energy.md +10 -11
  789. package/docs/api/sensor-physical-charge-capacity.md +8 -13
  790. package/docs/api/sensor-pixel-pitch.md +1 -1
  791. package/docs/api/sensor-radiometry-readiness.md +9 -9
  792. package/docs/api/sensor-raw-readout.md +118 -52
  793. package/docs/api/sensor-raw-reconstruction.md +97 -20
  794. package/docs/api/sensor-readout-exposure-linkage.md +120 -24
  795. package/docs/api/sensor-readout-timing.md +33 -35
  796. package/docs/api/sensor-response-application-compatibility.md +9 -11
  797. package/docs/api/sensor-response-operating-range.md +14 -18
  798. package/docs/api/sensor-responsivity-photocurrent.md +9 -12
  799. package/docs/api/sensor-sampling-aperture.md +22 -25
  800. package/docs/api/sensor-scene-eqe-temporal-exposure.md +9 -8
  801. package/docs/api/sensor-sensor-geometry.md +23 -24
  802. package/docs/api/sensor-signal-noise.md +10 -10
  803. package/docs/api/sensor-spatial-sample-reduction.md +27 -30
  804. package/docs/api/sensor-spatial-sampling-quadrature.md +37 -39
  805. package/docs/api/sensor-spatio-spectral-reduction.md +27 -29
  806. package/docs/api/sensor-spectral-coverage.md +5 -5
  807. package/docs/api/sensor-spectral-quadrature.md +33 -35
  808. package/docs/api/sensor-spectral-response.md +28 -16
  809. package/docs/api/sensor-temporal-photo-signal.md +6 -6
  810. package/docs/api/simulation-poc-simulation.md +17 -16
  811. package/docs/api/stabilization-camera-shake.md +29 -10
  812. package/docs/api/stabilization-system.md +25 -21
  813. package/docs/examples/production-request.json +3821 -2157
  814. package/docs/examples/simulate-capture.mjs +14 -0
  815. package/llms.txt +35 -0
  816. package/package.json +32 -11
  817. package/AGENTS.md +0 -674
  818. package/CONTRIBUTING.md +0 -76
  819. package/DCO +0 -33
  820. package/dist/camera/equivalent-focal-length.d.ts.map +0 -1
  821. package/dist/camera/field-of-view.d.ts.map +0 -1
  822. package/dist/camera/projected-object-size.d.ts.map +0 -1
  823. package/dist/capture/capture-export-metadata.d.ts.map +0 -1
  824. package/dist/capture/environment-raw-producer.d.ts.map +0 -1
  825. package/dist/capture/export-jpeg.d.ts.map +0 -1
  826. package/dist/capture/export-tiff.d.ts.map +0 -1
  827. package/dist/capture/focus-control.d.ts.map +0 -1
  828. package/dist/capture/linear-encoding.d.ts.map +0 -1
  829. package/dist/capture/native-environment-raw.d.ts.map +0 -1
  830. package/dist/capture/native-raw-development.d.ts.map +0 -1
  831. package/dist/capture/native-raw.d.ts.map +0 -1
  832. package/dist/capture/photographic-export.d.ts.map +0 -1
  833. package/dist/capture/raw-frame-limits.d.ts.map +0 -1
  834. package/dist/capture/raw-frame-reconstruction.d.ts.map +0 -1
  835. package/dist/capture/release-sequence.d.ts.map +0 -1
  836. package/dist/capture/sensor-raw-frame.d.ts.map +0 -1
  837. package/dist/capture/sensor-raw-producer.d.ts.map +0 -1
  838. package/dist/capture/simulated-capture.d.ts.map +0 -1
  839. package/dist/color/capture-color.d.ts.map +0 -1
  840. package/dist/color/sensor-color-development.d.ts.map +0 -1
  841. package/dist/color/srgb-icc.d.ts.map +0 -1
  842. package/dist/color/srgb-transfer.d.ts.map +0 -1
  843. package/dist/color/white-balance.d.ts.map +0 -1
  844. package/dist/composition/image-formation-plan.d.ts.map +0 -1
  845. package/dist/composition/plan-consumer.d.ts.map +0 -1
  846. package/dist/core/calculation-result.d.ts.map +0 -1
  847. package/dist/core/canonical-json.d.ts.map +0 -1
  848. package/dist/core/configuration-error.d.ts.map +0 -1
  849. package/dist/core/evidence-provenance.d.ts.map +0 -1
  850. package/dist/core/image-formation.d.ts.map +0 -1
  851. package/dist/core/owned-data.d.ts.map +0 -1
  852. package/dist/core/record-validation.d.ts.map +0 -1
  853. package/dist/core/scientific-assurance.d.ts.map +0 -1
  854. package/dist/core/spectral-composition.d.ts.map +0 -1
  855. package/dist/core/spectral.d.ts.map +0 -1
  856. package/dist/core/validation.d.ts.map +0 -1
  857. package/dist/core/version.d.ts.map +0 -1
  858. package/dist/equipment/exposure-capabilities.d.ts.map +0 -1
  859. package/dist/equipment/generic-tier-assets.d.ts.map +0 -1
  860. package/dist/equipment/generic-tier-presets.d.ts.map +0 -1
  861. package/dist/equipment/iso-capabilities.d.ts.map +0 -1
  862. package/dist/equipment/metering-capabilities.d.ts.map +0 -1
  863. package/dist/equipment/release-capabilities.d.ts.map +0 -1
  864. package/dist/exposure/exposure-duration-control.d.ts.map +0 -1
  865. package/dist/exposure/exposure-mode-resolver.d.ts.map +0 -1
  866. package/dist/exposure/exposure.d.ts.map +0 -1
  867. package/dist/exposure/flash.d.ts.map +0 -1
  868. package/dist/exposure/metering-scene-radiance.d.ts.map +0 -1
  869. package/dist/exposure/metering-target.d.ts.map +0 -1
  870. package/dist/exposure/metering-temporal.d.ts.map +0 -1
  871. package/dist/exposure/metering.d.ts.map +0 -1
  872. package/dist/exposure/program-line.d.ts.map +0 -1
  873. package/dist/index.d.ts.map +0 -1
  874. package/dist/motion/camera-rotation.d.ts.map +0 -1
  875. package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +0 -1
  876. package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +0 -1
  877. package/dist/motion/capture-rotation-trajectory.d.ts.map +0 -1
  878. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +0 -1
  879. package/dist/motion/extended-object-projection.d.ts.map +0 -1
  880. package/dist/motion/projected-motion.d.ts.map +0 -1
  881. package/dist/optics/aperture.d.ts.map +0 -1
  882. package/dist/optics/circle-of-confusion.d.ts.map +0 -1
  883. package/dist/optics/complex-pupil-psf.d.ts.map +0 -1
  884. package/dist/optics/depth-of-field.d.ts.map +0 -1
  885. package/dist/optics/diffraction.d.ts.map +0 -1
  886. package/dist/optics/focus-breathing.d.ts.map +0 -1
  887. package/dist/optics/focus-state.d.ts.map +0 -1
  888. package/dist/optics/front-of-lens-filter.d.ts.map +0 -1
  889. package/dist/optics/illumination-vignetting.d.ts.map +0 -1
  890. package/dist/optics/lateral-chromatic-aberration.d.ts.map +0 -1
  891. package/dist/optics/lens-psf-profile.d.ts.map +0 -1
  892. package/dist/optics/polygon-diffraction.d.ts.map +0 -1
  893. package/dist/optics/profile-contract.d.ts.map +0 -1
  894. package/dist/optics/psf-foundation.d.ts.map +0 -1
  895. package/dist/optics/radial-distortion.d.ts.map +0 -1
  896. package/dist/optics/scene-to-sensor-irradiance.d.ts.map +0 -1
  897. package/dist/optics/scene-to-sensor-quadrature.d.ts.map +0 -1
  898. package/dist/optics/sensor-aperture-rays.d.ts.map +0 -1
  899. package/dist/optics/sensor-environment-query.d.ts.map +0 -1
  900. package/dist/optics/sensor-psf-quadrature.d.ts.map +0 -1
  901. package/dist/optics/sensor-psf-support.d.ts.map +0 -1
  902. package/dist/optics/stray-light.d.ts.map +0 -1
  903. package/dist/optics/thin-lens.d.ts.map +0 -1
  904. package/dist/output/capture-corrected-sdr.d.ts.map +0 -1
  905. package/dist/output/capture-geometry.d.ts.map +0 -1
  906. package/dist/output/capture-sdr.d.ts.map +0 -1
  907. package/dist/output/crop.d.ts.map +0 -1
  908. package/dist/output/geometric-transforms.d.ts.map +0 -1
  909. package/dist/output/lens-corrections.d.ts.map +0 -1
  910. package/dist/output/native-capture-sdr.d.ts.map +0 -1
  911. package/dist/output/print-contrast-reference.d.ts.map +0 -1
  912. package/dist/output/print-detail.d.ts.map +0 -1
  913. package/dist/output/print-jpeg.d.ts.map +0 -1
  914. package/dist/output/print-plan.d.ts.map +0 -1
  915. package/dist/output/print-region-statistics.d.ts.map +0 -1
  916. package/dist/output/sdr-rendering.d.ts.map +0 -1
  917. package/dist/output/subject-framing-crop.d.ts.map +0 -1
  918. package/dist/schema/camera.d.ts.map +0 -1
  919. package/dist/schema/camera.js +0 -3
  920. package/dist/schema/camera.js.map +0 -1
  921. package/dist/schema/illumination-spectral.d.ts.map +0 -1
  922. package/dist/schema/illumination-temporal.d.ts.map +0 -1
  923. package/dist/schema/illumination.d.ts.map +0 -1
  924. package/dist/schema/scene-radiance-temporal.d.ts.map +0 -1
  925. package/dist/schema/scene-radiance.d.ts.map +0 -1
  926. package/dist/schema/scene.d.ts.map +0 -1
  927. package/dist/schema/scene.js +0 -3
  928. package/dist/schema/scene.js.map +0 -1
  929. package/dist/schema/validation.d.ts.map +0 -1
  930. package/dist/sensor/accumulated-charge.d.ts.map +0 -1
  931. package/dist/sensor/architecture.d.ts.map +0 -1
  932. package/dist/sensor/camera-saturation-capacity.d.ts.map +0 -1
  933. package/dist/sensor/capture-color-sampling-binding.d.ts.map +0 -1
  934. package/dist/sensor/capture-mode-timing.d.ts.map +0 -1
  935. package/dist/sensor/capture-mode.d.ts.map +0 -1
  936. package/dist/sensor/color-sampling.d.ts.map +0 -1
  937. package/dist/sensor/constant-rate-temporal-integration.d.ts.map +0 -1
  938. package/dist/sensor/dark-current.d.ts.map +0 -1
  939. package/dist/sensor/environment-photo-signal.d.ts.map +0 -1
  940. package/dist/sensor/eqe-electron-rate.d.ts.map +0 -1
  941. package/dist/sensor/eqe-local-exposure.d.ts.map +0 -1
  942. package/dist/sensor/eqe-temporal-exposure.d.ts.map +0 -1
  943. package/dist/sensor/exposure-window.d.ts.map +0 -1
  944. package/dist/sensor/iso-signal-chain.d.ts.map +0 -1
  945. package/dist/sensor/local-exposure-binding.d.ts.map +0 -1
  946. package/dist/sensor/optical-stack.d.ts.map +0 -1
  947. package/dist/sensor/photon-energy.d.ts.map +0 -1
  948. package/dist/sensor/physical-charge-capacity.d.ts.map +0 -1
  949. package/dist/sensor/pixel-pitch.d.ts.map +0 -1
  950. package/dist/sensor/radiometry-readiness.d.ts.map +0 -1
  951. package/dist/sensor/raw-readout.d.ts.map +0 -1
  952. package/dist/sensor/raw-reconstruction.d.ts.map +0 -1
  953. package/dist/sensor/readout-exposure-linkage.d.ts.map +0 -1
  954. package/dist/sensor/readout-timing.d.ts.map +0 -1
  955. package/dist/sensor/response-application-compatibility.d.ts.map +0 -1
  956. package/dist/sensor/response-operating-range.d.ts.map +0 -1
  957. package/dist/sensor/responsivity-photocurrent.d.ts.map +0 -1
  958. package/dist/sensor/sampling-aperture.d.ts.map +0 -1
  959. package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +0 -1
  960. package/dist/sensor/sensor-geometry.d.ts.map +0 -1
  961. package/dist/sensor/signal-noise.d.ts.map +0 -1
  962. package/dist/sensor/spatial-sample-reduction.d.ts.map +0 -1
  963. package/dist/sensor/spatial-sampling-quadrature.d.ts.map +0 -1
  964. package/dist/sensor/spatio-spectral-reduction.d.ts.map +0 -1
  965. package/dist/sensor/spectral-coverage.d.ts.map +0 -1
  966. package/dist/sensor/spectral-quadrature.d.ts.map +0 -1
  967. package/dist/sensor/spectral-response.d.ts.map +0 -1
  968. package/dist/sensor/temporal-eqe-sum.d.ts.map +0 -1
  969. package/dist/sensor/temporal-photo-signal.d.ts.map +0 -1
  970. package/dist/sensor/temporal-sample-binding.d.ts.map +0 -1
  971. package/dist/simulation/poc-simulation.d.ts.map +0 -1
  972. package/dist/stabilization/camera-shake.d.ts.map +0 -1
  973. package/dist/stabilization/system.d.ts.map +0 -1
  974. package/docs/API_STYLE.md +0 -235
  975. package/docs/ARCHITECTURE.md +0 -356
  976. package/docs/AUTOMATION_COORDINATION.md +0 -190
  977. package/docs/CAPTURE_COLOR.md +0 -25
  978. package/docs/CAPTURE_CORRECTED_SDR.md +0 -25
  979. package/docs/CAPTURE_EXPORT_METADATA.md +0 -27
  980. package/docs/CAPTURE_SDR.md +0 -22
  981. package/docs/DENSE_PUPIL_QUALIFICATION.md +0 -121
  982. package/docs/DEVELOPERS.md +0 -68
  983. package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
  984. package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
  985. package/docs/EXPORT_ACCEPTANCE.md +0 -133
  986. package/docs/GENERIC_TIER_PRESETS.md +0 -269
  987. package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
  988. package/docs/IMAGE_FORMATION.md +0 -247
  989. package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
  990. package/docs/MOTION_AND_SIGNAL.md +0 -250
  991. package/docs/NATIVE_CAPTURE_SDR.md +0 -70
  992. package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
  993. package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
  994. package/docs/NATIVE_RAW_AND_PRINT.md +0 -54
  995. package/docs/NUMERICAL_CORRECTNESS.md +0 -191
  996. package/docs/PERFORMANCE_BASELINE.md +0 -56
  997. package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
  998. package/docs/PHYSICS_FOUNDATION.md +0 -426
  999. package/docs/POC_API.md +0 -278
  1000. package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
  1001. package/docs/POC_PROJECTION_REUSE.md +0 -124
  1002. package/docs/PRINT_195_196_REVIEW.md +0 -93
  1003. package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
  1004. package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
  1005. package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
  1006. package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
  1007. package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
  1008. package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
  1009. package/docs/PRINT_PLANNING.md +0 -75
  1010. package/docs/PRINT_REGION_STATISTICS.md +0 -38
  1011. package/docs/PROCESSED_OUTPUT.md +0 -157
  1012. package/docs/PRODUCTION_COMPOSITION.md +0 -373
  1013. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
  1014. package/docs/PROVENANCE.md +0 -115
  1015. package/docs/PSF_FOUNDATION.md +0 -165
  1016. package/docs/RAW_FRAME_ENVELOPE.md +0 -56
  1017. package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
  1018. package/docs/RELEASE_1_0.md +0 -66
  1019. package/docs/RELEASE_1_0_1.md +0 -61
  1020. package/docs/RELEASE_1_1_0.md +0 -25
  1021. package/docs/RELEASE_1_2_0.md +0 -51
  1022. package/docs/RELEASE_1_3_0.md +0 -15
  1023. package/docs/RELEASE_1_4_0.md +0 -23
  1024. package/docs/RELEASE_1_5_0.md +0 -105
  1025. package/docs/RELEASE_AUDIT.md +0 -39
  1026. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
  1027. package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
  1028. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
  1029. package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
  1030. package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
  1031. package/docs/SDR_RENDERING.md +0 -33
  1032. package/docs/SENSOR_APERTURE_RAYS.md +0 -23
  1033. package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
  1034. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
  1035. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
  1036. package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
  1037. package/docs/SENSOR_RAW_FRAME.md +0 -20
  1038. package/docs/SENSOR_RAW_PRODUCER.md +0 -77
  1039. package/docs/SEPARABLE_EMISSION_DRAFT.md +0 -103
  1040. package/docs/SIGNAL_CONFORMANCE.md +0 -23
  1041. package/docs/SIMULATED_CAPTURE.md +0 -65
  1042. package/docs/STABILIZATION.md +0 -234
  1043. package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
  1044. package/docs/TIER_ACCEPTANCE.md +0 -129
  1045. package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
  1046. package/docs/V1_COMPOSITION_MAP.md +0 -123
  1047. package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
  1048. package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
  1049. package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
  1050. package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
  1051. package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
  1052. package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
  1053. package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
  1054. package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
  1055. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
  1056. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
  1057. package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
  1058. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
  1059. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
  1060. package/docs/licenses/castleCSF-MIT.txt +0 -21
  1061. package/docs/validation/dense-pupil-2026-10-06/pilot.jsonl +0 -6
  1062. package/docs/validation/documentation-fragments.json +0 -212
  1063. package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
  1064. package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
  1065. package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
  1066. package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
  1067. package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
  1068. package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
  1069. package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
  1070. package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
  1071. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
  1072. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
  1073. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
  1074. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
  1075. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
  1076. package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
  1077. package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
  1078. package/docs/validation/print-196-candidate-capabilities.json +0 -28
  1079. package/docs/validation/print-196-candidate-evidence.json +0 -356
  1080. package/docs/validation/print-196-engine-acceptance.json +0 -81
  1081. package/docs/validation/print-detail-capabilities.json +0 -103
  1082. package/docs/validation/print-detail-jpeg-evidence.json +0 -116
  1083. package/docs/validation/print-detail-sdr-evidence.json +0 -81
  1084. package/docs/validation/release-audit-inventory.json +0 -1306
  1085. package/docs/validation/tier-acceptance-report-v1.json +0 -2538
@@ -1 +1 @@
1
- {"version":3,"file":"spatio-spectral-reduction.js","sourceRoot":"","sources":["../../src/sensor/spatio-spectral-reduction.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spatio-spectral-reduction.js","sourceRoot":"","sources":["../../src/sensor/spatio-spectral-reduction.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Spatio-spectral reduction: integrates spectral irradiance on the sensor over one site's area and\n * over wavelength, giving the incident light power on the site's geometric aperture.\n *\n * It stops before the sensor response: QE (quantum efficiency), A/W responsivity and colour-filter\n * transmission are applied in later steps.\n * @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support\n * limits.\n */\n\nimport {\n approximationResult,\n type CalculationResult\n} from \"../core/calculation-result.js\";\nimport { InvalidScientificInputError } from \"../core/validation.js\";\nimport {\n sensorSpatialQuadratureNodeIdentityKey,\n validateSensorSpatialSamplingQuadrature,\n type SensorSpatialQuadratureNodeIdentity\n} from \"./spatial-sample-reduction.js\";\nimport type {\n SensorSpatialSamplingQuadrature\n} from \"./spatial-sampling-quadrature.js\";\nimport {\n validateSensorSpectralQuadrature,\n type SensorSpectralQuadrature,\n type SensorSpectralQuadratureNode\n} from \"./spectral-quadrature.js\";\nimport { requireInputKeys } from \"../core/record-validation.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\n\nconst SQUARE_MICROMETERS_TO_SQUARE_METERS = 1e-12;\nconst MAX_SPATIO_SPECTRAL_SAMPLE_VALUES = 100_000;\n\nexport interface SensorSpatioSpectralNodeIdentity {\n spatialNode: SensorSpatialQuadratureNodeIdentity;\n spectralSampleIndex: number;\n wavelengthNanometers: number;\n}\n\nexport interface SensorSpatioSpectralIrradianceSample {\n node: SensorSpatioSpectralNodeIdentity;\n /**\n * Spectral irradiance at the spatial node's preAntiAliasingSourcePointMm\n * and this spectral node's wavelength.\n *\n * Units: W/m^2/nm.\n */\n spectralIrradianceWattsPerSquareMeterPerNanometer: number;\n}\n\nexport interface ReduceSensorSpatioSpectralIrradianceInput {\n spatialQuadrature: SensorSpatialSamplingQuadrature;\n spectralQuadrature: SensorSpectralQuadrature;\n /**\n * Exactly one E_lambda(x,y) value, with its node identity, for every\n * combination of spatial node and spectral node.\n *\n * Order does not matter; the node identity does.\n */\n sampleValues: readonly SensorSpatioSpectralIrradianceSample[];\n}\n\nexport interface SensorSpatioSpectralWavelengthReduction {\n spectralSampleIndex: number;\n wavelengthNanometers: number;\n wavelengthMeasureNanometers: number;\n normalizedWavelengthWeight: number;\n /**\n * Spatially reduced spectral irradiance at this wavelength.\n * Units: W/m^2/nm.\n */\n normalizedSpatialAverageSpectralIrradianceWattsPerSquareMeterPerNanometer:\n number;\n /**\n * Spectral radiant flux reaching the geometric sensitive aperture, after the\n * declared normalized AA spreading. Units: W/nm.\n *\n * This uses geometric area, not an established light-collection area.\n */\n geometricApertureIncidentSpectralFluxWattsPerNanometer: number;\n /**\n * Contribution to the wavelength-integrated spatial average.\n * Units: W/m^2.\n */\n wavelengthIntegratedSpatialAverageContributionWattsPerSquareMeter: number;\n /**\n * Contribution to wavelength-integrated geometric-aperture incident flux.\n * Units: W.\n */\n wavelengthIntegratedGeometricApertureIncidentFluxContributionWatts: number;\n}\n\nexport interface SensorSpatioSpectralIrradianceReduction {\n colorSamplingProfileId: string;\n samplingApertureProfileId?: string;\n opticalStackProfileId?: string;\n site: {\n x: number;\n y: number;\n };\n channelId: string;\n responseProfileId: string;\n sourceResponseKind:\n SensorSpectralQuadrature[\"sourceResponseKind\"];\n responseScope:\n SensorSpectralQuadrature[\"responseScope\"];\n responseScientificStatus:\n SensorSpectralQuadrature[\"responseScientificStatus\"];\n responseUncertainty:\n SensorSpectralQuadrature[\"responseUncertainty\"];\n responseChannelBinding?:\n SensorSpectralQuadrature[\"responseChannelBinding\"];\n responseReferenceConditions?:\n SensorSpectralQuadrature[\"responseReferenceConditions\"];\n wavelengthBasis:\n SensorSpectralQuadrature[\"wavelengthBasis\"];\n wavelengthBasisResolved: boolean;\n wavelengthRangeNanometers:\n SensorSpectralQuadrature[\"wavelengthRangeNanometers\"];\n responseDeclaredWavelengthRangeNanometers:\n SensorSpectralQuadrature[\"responseDeclaredWavelengthRangeNanometers\"];\n outputMeaning:\n \"pre-response-spatio-spectral-radiometric-reduction\";\n inputValueDomain: {\n kind: \"radiometric-spectral-irradiance\";\n unit: \"W/m^2/nm\";\n semantic:\n \"pre-aa-pre-response-sensor-plane-spectral-irradiance\";\n };\n spatialNodeCount: number;\n spectralNodeCount: number;\n combinedSampleCount: number;\n sourceValuesMatchedBy:\n \"spatial-node-identity-plus-spectral-sample-index-and-wavelength\";\n sourceValuesSuppliedForAllCombinedNodes: true;\n outsideImagingAreaSourceValuesRequired: boolean;\n geometricApertureAreaSquareMicrometers?: number;\n nominalSiteCellAreaSquareMicrometers?: number;\n geometricSensitiveAreaFractionOfLatticeCell?: number;\n perWavelength:\n readonly SensorSpatioSpectralWavelengthReduction[];\n /**\n * Integral over the requested wavelength interval of the spatially averaged\n * spectral irradiance. Units: W/m^2.\n */\n wavelengthIntegratedSpatialAverageIrradianceWattsPerSquareMeter:\n number;\n /**\n * Integral over the requested wavelength interval and the geometric\n * aperture area. Units: W.\n *\n * This is the incident radiant flux before the sensor response, over the\n * declared wavelength interval. It is not collected power or generated charge.\n */\n wavelengthIntegratedGeometricApertureIncidentFluxWatts:\n number;\n spatialIntegrationApplied: true;\n wavelengthIntegrationApplied: true;\n spectralResponsePlanUsedForWavelengthSupport: true;\n spectralResponseApplicationPerformed: false;\n responseScopeMatchedToSourcePlane: false;\n quantumEfficiencyApplied: false;\n spectralResponsivityApplied: false;\n channelFilterTransmissionApplied: false;\n opticalTransmissionAppliedByReducer: false;\n radiometricCollectionAreaEstablished: false;\n temporalIntegrationApplied: false;\n exposureDurationApplied: false;\n photonsCalculated: false;\n electronsCalculated: false;\n currentCalculated: false;\n shotNoiseApplied: false;\n readNoiseApplied: false;\n adcQuantizationApplied: false;\n rawCodeValueProduced: false;\n demosaicOrReconstructionApplied: false;\n convergenceErrorEstimated: false;\n componentEvidence: {\n spatial:\n SensorSpatialSamplingQuadrature[\"componentEvidence\"];\n spectral:\n SensorSpectralQuadrature[\"componentEvidence\"];\n };\n}\n\nfunction requireSafeNonNegativeInteger(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isSafeInteger(value) ||\n value < 0\n ) {\n throw new InvalidScientificInputError(\n path + \" must be a non-negative safe integer.\"\n );\n }\n return value;\n}\n\nfunction requireNonNegativeFinite(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value) ||\n value < 0\n ) {\n throw new InvalidScientificInputError(\n path +\n \" must be finite and greater than or equal to zero.\"\n );\n }\n return value;\n}\n\nfunction sampleKey(\n spatialNode:\n SensorSpatialQuadratureNodeIdentity,\n spectralSampleIndex: number\n): string {\n return (\n sensorSpatialQuadratureNodeIdentityKey(\n spatialNode\n ) +\n \"|\" +\n spectralSampleIndex\n );\n}\n\nfunction parseSamples<T extends { node: SensorSpatioSpectralNodeIdentity }, V>(\n sampleValues:\n readonly T[],\n spatialNodesByKey: ReadonlyMap<\n string,\n SensorSpatialSamplingQuadrature[\"nodes\"][number]\n >,\n spectralNodesByIndex: ReadonlyMap<\n number,\n SensorSpectralQuadratureNode\n >,\n combinedSampleCount: number,\n valueForSample: (sample: T, sampleIndex: number) => V\n): Map<string, V> {\n if (!Array.isArray(sampleValues)) {\n throw new InvalidConfigurationError(\n \"sampleValues must be an array.\"\n );\n }\n if (\n sampleValues.length !==\n combinedSampleCount\n ) {\n throw new InvalidScientificInputError(\n \"sampleValues must contain exactly one value for every spatial × spectral quadrature node.\"\n );\n }\n\n const valuesByKey =\n new Map<string, V>();\n\n sampleValues.forEach(\n (sample, sampleIndex) => {\n if (\n typeof sample !== \"object\" ||\n sample === null ||\n typeof sample.node !== \"object\" ||\n sample.node === null ||\n typeof sample.node.spatialNode !==\n \"object\" ||\n sample.node.spatialNode === null\n ) {\n throw new InvalidScientificInputError(\n \"sampleValues[\" +\n sampleIndex +\n \"] must contain a complete spatio-spectral node identity.\"\n );\n }\n\n const spatialNode = {\n antiAliasingComponentIndex:\n requireSafeNonNegativeInteger(\n sample.node.spatialNode\n .antiAliasingComponentIndex,\n \"sampleValues[\" +\n sampleIndex +\n \"].node.spatialNode.antiAliasingComponentIndex\"\n ),\n apertureSampleXIndex:\n requireSafeNonNegativeInteger(\n sample.node.spatialNode\n .apertureSampleXIndex,\n \"sampleValues[\" +\n sampleIndex +\n \"].node.spatialNode.apertureSampleXIndex\"\n ),\n apertureSampleYIndex:\n requireSafeNonNegativeInteger(\n sample.node.spatialNode\n .apertureSampleYIndex,\n \"sampleValues[\" +\n sampleIndex +\n \"].node.spatialNode.apertureSampleYIndex\"\n )\n };\n const spatialKey =\n sensorSpatialQuadratureNodeIdentityKey(\n spatialNode\n );\n if (\n !spatialNodesByKey.has(\n spatialKey\n )\n ) {\n throw new InvalidScientificInputError(\n \"sampleValues identifies a spatial node that is not present in spatialQuadrature.\"\n );\n }\n\n const spectralSampleIndex =\n requireSafeNonNegativeInteger(\n sample.node.spectralSampleIndex,\n \"sampleValues[\" +\n sampleIndex +\n \"].node.spectralSampleIndex\"\n );\n const spectralNode =\n spectralNodesByIndex.get(\n spectralSampleIndex\n );\n if (spectralNode === undefined) {\n throw new InvalidScientificInputError(\n \"sampleValues identifies a spectral node that is not present in spectralQuadrature.\"\n );\n }\n\n const wavelengthNanometers =\n requireNonNegativeFinite(\n sample.node.wavelengthNanometers,\n \"sampleValues[\" +\n sampleIndex +\n \"].node.wavelengthNanometers\"\n );\n if (\n wavelengthNanometers !==\n spectralNode.wavelengthNanometers\n ) {\n throw new InvalidScientificInputError(\n \"sampleValues wavelengthNanometers must exactly match the identified spectral quadrature node.\"\n );\n }\n\n const key = sampleKey(\n spatialNode,\n spectralSampleIndex\n );\n if (valuesByKey.has(key)) {\n throw new InvalidScientificInputError(\n \"sampleValues contains duplicate spatio-spectral node identities.\"\n );\n }\n\n valuesByKey.set(\n key,\n valueForSample(sample, sampleIndex)\n );\n }\n );\n\n if (valuesByKey.size !== combinedSampleCount) {\n throw new InvalidScientificInputError(\"sampleValues must not contain sparse or missing node entries.\");\n }\n return valuesByKey;\n}\n\n/** Internal: matches samples to their spatial × spectral nodes. Each caller still validates values and applies its own equations. */\nexport function bindSensorSpatioSpectralSamples<T extends { node: SensorSpatioSpectralNodeIdentity }, V>(\n input: { spatialQuadrature: SensorSpatialSamplingQuadrature; spectralQuadrature: SensorSpectralQuadrature; sampleValues: readonly T[] },\n valueForSample: (sample: T, sampleIndex: number) => V\n): { spatialNodesByKey: Map<string, SensorSpatialSamplingQuadrature[\"nodes\"][number]>;\n spectralNodesByIndex: Map<number, SensorSpectralQuadratureNode>; colorSamplingProfileId: string;\n combinedSampleCount: number; valuesByKey: Map<string, V> } {\n const spatialNodesByKey =\n validateSensorSpatialSamplingQuadrature(\n input.spatialQuadrature\n );\n const spectralNodesByIndex =\n validateSensorSpectralQuadrature(\n input.spectralQuadrature\n );\n\n const colorSamplingProfileId =\n input.spatialQuadrature\n .colorSamplingProfileId;\n if (\n typeof colorSamplingProfileId !==\n \"string\" ||\n colorSamplingProfileId.trim().length ===\n 0\n ) {\n throw new InvalidScientificInputError(\n \"spatialQuadrature.colorSamplingProfileId is required for spatio-spectral composition.\"\n );\n }\n if (\n colorSamplingProfileId !==\n input.spectralQuadrature\n .colorSamplingProfileId\n ) {\n throw new InvalidScientificInputError(\n \"Spatial and spectral quadratures must reference the same colorSamplingProfileId.\"\n );\n }\n if (\n input.spatialQuadrature.channelId !==\n input.spectralQuadrature.channelId\n ) {\n throw new InvalidScientificInputError(\n \"Spatial and spectral quadratures must reference the same exact channelId.\"\n );\n }\n\n if (\n input.spatialQuadrature.outputMeaning !==\n \"pre-aa-optical-field-spatial-quadrature-nodes\" ||\n input.spatialQuadrature\n .spectralResponseIncluded !== false ||\n input.spatialQuadrature\n .temporalIntegrationIncluded !== false\n ) {\n throw new InvalidScientificInputError(\n \"spatialQuadrature semantics are incompatible with pre-response spatio-spectral reduction.\"\n );\n }\n\n const combinedSampleCount =\n spatialNodesByKey.size *\n spectralNodesByIndex.size;\n if (\n !Number.isSafeInteger(\n combinedSampleCount\n ) ||\n combinedSampleCount <= 0\n ) {\n throw new InvalidScientificInputError(\n \"Spatial × spectral quadrature sample count must be a positive safe integer.\"\n );\n }\n if (\n combinedSampleCount >\n MAX_SPATIO_SPECTRAL_SAMPLE_VALUES\n ) {\n throw new InvalidScientificInputError(\n \"Spatial × spectral quadrature sample count exceeds the safety limit of \" +\n MAX_SPATIO_SPECTRAL_SAMPLE_VALUES +\n \". Tile/batch the evaluation instead of materializing one oversized Cartesian product.\"\n );\n }\n\n const valuesByKey =\n parseSamples(\n input.sampleValues,\n spatialNodesByKey,\n spectralNodesByIndex,\n combinedSampleCount,\n valueForSample\n );\n\n return { spatialNodesByKey, spectralNodesByIndex, colorSamplingProfileId, combinedSampleCount, valuesByKey };\n}\n\n/**\n * Integrates supplied spectral irradiance on the sensor plane, E_lambda(x,y),\n * over every combination of an existing spatial quadrature and spectral\n * quadrature.\n *\n * Units: the density is in W/m^2/nm and wavelengthMeasureNanometers is dλ in\n * nm, so their product is in W/m^2. Do not convert dλ to metres unless the\n * density's per-nanometre unit is converted to match.\n *\n * Area integration uses the spatial quadrature's geometric area measures,\n * converted from square micrometres to square metres. The result is the\n * incident radiant flux on the geometric aperture only; geometric area is not\n * treated as an effective light-collection area.\n *\n * It deliberately stops before the sensor response. The spectral plan comes\n * from a specific response channel, so its wavelength range and breakpoints\n * fit that channel, but QE, A/W responsivity and colour-filter transmission are\n * not applied here. Matching the response's scope and source plane is a\n * separate later step.\n */\nexport function reduceSensorSpatioSpectralIrradiance(\n input:\n ReduceSensorSpatioSpectralIrradianceInput\n): CalculationResult<SensorSpatioSpectralIrradianceReduction> {\n requireInputKeys(input, \"reduceSensorSpatioSpectralIrradiance\", [\"spatialQuadrature\", \"spectralQuadrature\", \"sampleValues\"]);\n const { spatialNodesByKey, spectralNodesByIndex, colorSamplingProfileId, combinedSampleCount, valuesByKey } =\n bindSensorSpatioSpectralSamples(input, (sample, sampleIndex) => requireNonNegativeFinite(\n sample.spectralIrradianceWattsPerSquareMeterPerNanometer,\n \"sampleValues[\" + sampleIndex + \"].spectralIrradianceWattsPerSquareMeterPerNanometer\"\n ));\n\n const perWavelength:\n SensorSpatioSpectralWavelengthReduction[] =\n [];\n let wavelengthIntegratedSpatialAverage = 0;\n let wavelengthIntegratedGeometricFlux = 0;\n\n for (\n let spectralSampleIndex = 0;\n spectralSampleIndex <\n input.spectralQuadrature.totalNodeCount;\n spectralSampleIndex += 1\n ) {\n const spectralNode =\n spectralNodesByIndex.get(\n spectralSampleIndex\n );\n if (spectralNode === undefined) {\n throw new InvalidScientificInputError(\n \"spectralQuadrature is missing a validated contiguous spectral sample.\"\n );\n }\n\n let spatialAverageSpectralIrradiance = 0;\n let geometricSpectralFluxWattsPerNanometer =\n 0;\n\n spatialNodesByKey.forEach(\n (spatialNode, spatialKey) => {\n const value =\n valuesByKey.get(\n spatialKey +\n \"|\" +\n spectralSampleIndex\n );\n if (value === undefined) {\n throw new InvalidScientificInputError(\n \"A spatio-spectral quadrature node is missing its explicit source value.\"\n );\n }\n\n spatialAverageSpectralIrradiance +=\n value *\n spatialNode\n .combinedNormalizedSpatialWeight;\n geometricSpectralFluxWattsPerNanometer +=\n value *\n (\n spatialNode\n .combinedAreaMeasureSquareMicrometers *\n SQUARE_MICROMETERS_TO_SQUARE_METERS\n );\n\n if (\n !Number.isFinite(\n spatialAverageSpectralIrradiance\n ) ||\n !Number.isFinite(\n geometricSpectralFluxWattsPerNanometer\n )\n ) {\n throw new InvalidScientificInputError(\n \"Reduced spatio-spectral values must remain finite.\"\n );\n }\n }\n );\n\n const spatialAverageContribution =\n spatialAverageSpectralIrradiance *\n spectralNode\n .wavelengthMeasureNanometers;\n const geometricFluxContribution =\n geometricSpectralFluxWattsPerNanometer *\n spectralNode\n .wavelengthMeasureNanometers;\n\n wavelengthIntegratedSpatialAverage +=\n spatialAverageContribution;\n wavelengthIntegratedGeometricFlux +=\n geometricFluxContribution;\n\n if (\n !Number.isFinite(\n wavelengthIntegratedSpatialAverage\n ) ||\n !Number.isFinite(\n wavelengthIntegratedGeometricFlux\n )\n ) {\n throw new InvalidScientificInputError(\n \"Wavelength-integrated spatio-spectral values must remain finite.\"\n );\n }\n\n perWavelength.push({\n spectralSampleIndex,\n wavelengthNanometers:\n spectralNode.wavelengthNanometers,\n wavelengthMeasureNanometers:\n spectralNode\n .wavelengthMeasureNanometers,\n normalizedWavelengthWeight:\n spectralNode\n .normalizedWavelengthWeight,\n normalizedSpatialAverageSpectralIrradianceWattsPerSquareMeterPerNanometer:\n spatialAverageSpectralIrradiance,\n geometricApertureIncidentSpectralFluxWattsPerNanometer:\n geometricSpectralFluxWattsPerNanometer,\n wavelengthIntegratedSpatialAverageContributionWattsPerSquareMeter:\n spatialAverageContribution,\n wavelengthIntegratedGeometricApertureIncidentFluxContributionWatts:\n geometricFluxContribution\n });\n }\n\n return approximationResult(\n {\n colorSamplingProfileId,\n ...(input.spatialQuadrature\n .samplingApertureProfileId ===\n undefined\n ? {}\n : {\n samplingApertureProfileId:\n input.spatialQuadrature\n .samplingApertureProfileId\n }),\n ...(input.spatialQuadrature\n .opticalStackProfileId ===\n undefined\n ? {}\n : {\n opticalStackProfileId:\n input.spatialQuadrature\n .opticalStackProfileId\n }),\n site: {\n ...input.spatialQuadrature.site\n },\n channelId:\n input.spatialQuadrature.channelId,\n responseProfileId:\n input.spectralQuadrature.profileId,\n sourceResponseKind:\n input.spectralQuadrature\n .sourceResponseKind,\n responseScope:\n input.spectralQuadrature\n .responseScope,\n responseScientificStatus:\n input.spectralQuadrature\n .responseScientificStatus,\n responseUncertainty:\n input.spectralQuadrature\n .responseUncertainty,\n ...(input.spectralQuadrature\n .responseChannelBinding ===\n undefined\n ? {}\n : {\n responseChannelBinding:\n input.spectralQuadrature\n .responseChannelBinding\n }),\n ...(input.spectralQuadrature\n .responseReferenceConditions ===\n undefined\n ? {}\n : {\n responseReferenceConditions:\n input.spectralQuadrature\n .responseReferenceConditions\n }),\n wavelengthBasis:\n input.spectralQuadrature\n .wavelengthBasis,\n wavelengthBasisResolved:\n input.spectralQuadrature\n .wavelengthBasisResolved,\n wavelengthRangeNanometers: {\n ...input.spectralQuadrature\n .wavelengthRangeNanometers\n },\n responseDeclaredWavelengthRangeNanometers:\n {\n ...input.spectralQuadrature\n .responseDeclaredWavelengthRangeNanometers\n },\n outputMeaning:\n \"pre-response-spatio-spectral-radiometric-reduction\",\n inputValueDomain: {\n kind:\n \"radiometric-spectral-irradiance\",\n unit: \"W/m^2/nm\",\n semantic:\n \"pre-aa-pre-response-sensor-plane-spectral-irradiance\"\n },\n spatialNodeCount:\n input.spatialQuadrature\n .totalNodeCount,\n spectralNodeCount:\n input.spectralQuadrature\n .totalNodeCount,\n combinedSampleCount,\n sourceValuesMatchedBy:\n \"spatial-node-identity-plus-spectral-sample-index-and-wavelength\",\n sourceValuesSuppliedForAllCombinedNodes:\n true,\n outsideImagingAreaSourceValuesRequired:\n input.spatialQuadrature\n .preAntiAliasingSourceOutsideImagingAreaNodeCount >\n 0,\n geometricApertureAreaSquareMicrometers:\n input.spatialQuadrature\n .geometricApertureAreaSquareMicrometers,\n ...(input.spatialQuadrature\n .nominalSiteCellAreaSquareMicrometers ===\n undefined\n ? {}\n : {\n nominalSiteCellAreaSquareMicrometers:\n input.spatialQuadrature\n .nominalSiteCellAreaSquareMicrometers\n }),\n ...(input.spatialQuadrature\n .geometricSensitiveAreaFractionOfLatticeCell ===\n undefined\n ? {}\n : {\n geometricSensitiveAreaFractionOfLatticeCell:\n input.spatialQuadrature\n .geometricSensitiveAreaFractionOfLatticeCell\n }),\n perWavelength,\n wavelengthIntegratedSpatialAverageIrradianceWattsPerSquareMeter:\n wavelengthIntegratedSpatialAverage,\n wavelengthIntegratedGeometricApertureIncidentFluxWatts:\n wavelengthIntegratedGeometricFlux,\n spatialIntegrationApplied: true,\n wavelengthIntegrationApplied: true,\n spectralResponsePlanUsedForWavelengthSupport:\n true,\n spectralResponseApplicationPerformed:\n false,\n responseScopeMatchedToSourcePlane:\n false,\n quantumEfficiencyApplied: false,\n spectralResponsivityApplied: false,\n channelFilterTransmissionApplied:\n false,\n opticalTransmissionAppliedByReducer:\n false,\n radiometricCollectionAreaEstablished:\n false,\n temporalIntegrationApplied: false,\n exposureDurationApplied: false,\n photonsCalculated: false,\n electronsCalculated: false,\n currentCalculated: false,\n shotNoiseApplied: false,\n readNoiseApplied: false,\n adcQuantizationApplied: false,\n rawCodeValueProduced: false,\n demosaicOrReconstructionApplied:\n false,\n convergenceErrorEstimated: false,\n componentEvidence: {\n spatial:\n input.spatialQuadrature\n .componentEvidence,\n spectral:\n input.spectralQuadrature\n .componentEvidence\n }\n },\n \"sensor-spatio-spectral-irradiance-reduction\",\n \"1.0.0\",\n [\n \"Input values are nonnegative sensor-plane spectral irradiance E_lambda(x,y) in W/m^2/nm, evaluated at every spatial pre-AA source coordinate and spectral quadrature wavelength.\",\n \"Spatial and spectral plans must share the exact colorSamplingProfileId and channelId; a matching channel label alone is insufficient linkage.\",\n \"The full Cartesian product is explicit and capped at 100,000 supplied sample values to avoid multiplicative memory blowups.\",\n \"Spatial normalized weights form the per-wavelength average; geometric square-micrometre area measures are converted to square metres for incident spectral flux density.\",\n \"Physical wavelength integration multiplies W/m^2/nm or W/nm by d-lambda in nm. No extra 1e-9 factor is applied because the spectral density is already per nanometre.\",\n \"The spatial AA kernel is the existing normalized throughput-free spatial redistribution; this reducer adds no omitted optical-stack or microlens throughput.\",\n \"The spectral quadrature's response-derived support and breakpoints are consumed, but QE, A/W responsivity and channel-filter transmission are not applied.\",\n \"Response scope is preserved for downstream work but is not matched to a declared source plane in this version.\",\n \"Geometric aperture area is not promoted to effective radiometric collection area.\",\n \"Temporal exposure integration, photon/electron conversion, electrical current, noise, saturation, ADC/RAW conversion and reconstruction remain separate future work.\",\n \"No source-independent spatio-spectral convergence/error estimate is reported; downstream integrand structure controls numerical error.\"\n ]\n );\n}\n"]}
@@ -1,8 +1,6 @@
1
1
  /**
2
- * Module boundary and integration notes.
3
- * Adapts one parsed sensor response channel into the shared continuous spectral-coverage contract.
4
- * This exposes support and interpolation knots only. It does not apply QE or A/W responsivity and does
5
- * not establish scene/optics coverage.
2
+ * Describes a sensor response channel's wavelength coverage in the shared spectral-coverage format
3
+ * (core/spectral-composition), so it can be intersected with the light source and optics.
6
4
  * @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
7
5
  * limits.
8
6
  */
@@ -14,11 +12,10 @@ export interface CreateSensorSpectralCoverageParticipantInput {
14
12
  participantId?: string;
15
13
  }
16
14
  /**
17
- * Adapts one parsed sensor response channel into the shared continuous
18
- * spectral-coverage contract.
15
+ * Converts one parsed sensor response channel into the shared continuous
16
+ * spectral-coverage format.
19
17
  *
20
- * This exposes support and interpolation knots only. It does not apply QE or
21
- * A/W responsivity and does not establish scene/optics coverage.
18
+ * It gives only the wavelength range and interpolation breakpoints. It does not
19
+ * apply QE or A/W responsivity, and says nothing about scene or optics coverage.
22
20
  */
23
21
  export declare function createSensorSpectralCoverageParticipant(input: CreateSensorSpectralCoverageParticipantInput): SpectralCoverageParticipant;
24
- //# sourceMappingURL=spectral-coverage.d.ts.map
@@ -1,6 +1,8 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  import { InvalidScientificInputError } from "../core/validation.js";
3
3
  import { parseSensorSpectralResponseProfile } from "./spectral-response.js";
4
+ import { requireInputKeys } from "../core/record-validation.js";
5
+ import { InvalidConfigurationError } from "../core/configuration-error.js";
4
6
  function responseCurves(response) {
5
7
  if (response.kind ===
6
8
  "effective-external-quantum-efficiency") {
@@ -20,18 +22,19 @@ function responseCurves(response) {
20
22
  ];
21
23
  }
22
24
  /**
23
- * Adapts one parsed sensor response channel into the shared continuous
24
- * spectral-coverage contract.
25
+ * Converts one parsed sensor response channel into the shared continuous
26
+ * spectral-coverage format.
25
27
  *
26
- * This exposes support and interpolation knots only. It does not apply QE or
27
- * A/W responsivity and does not establish scene/optics coverage.
28
+ * It gives only the wavelength range and interpolation breakpoints. It does not
29
+ * apply QE or A/W responsivity, and says nothing about scene or optics coverage.
28
30
  */
29
31
  export function createSensorSpectralCoverageParticipant(input) {
32
+ requireInputKeys(input, "createSensorSpectralCoverageParticipant", ["spectralResponseProfile", "channelId", "participantId"]);
30
33
  const profile = parseSensorSpectralResponseProfile(input.spectralResponseProfile);
31
34
  if (typeof input.channelId !==
32
35
  "string" ||
33
36
  input.channelId.trim().length === 0) {
34
- throw new InvalidScientificInputError("channelId must be a non-empty string.");
37
+ throw new InvalidConfigurationError("channelId must be a non-empty string.");
35
38
  }
36
39
  const response = profile.channels.find((entry) => entry.channelId ===
37
40
  input.channelId);
@@ -70,7 +73,7 @@ export function createSensorSpectralCoverageParticipant(input) {
70
73
  ":" +
71
74
  input.channelId;
72
75
  if (participantId.trim().length === 0) {
73
- throw new InvalidScientificInputError("participantId must be a non-empty string when supplied.");
76
+ throw new InvalidConfigurationError("participantId must be a non-empty string when supplied.");
74
77
  }
75
78
  return {
76
79
  participantId,
@@ -1 +1 @@
1
- {"version":3,"file":"spectral-coverage.js","sourceRoot":"","sources":["../../src/sensor/spectral-coverage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spectral-coverage.js","sourceRoot":"","sources":["../../src/sensor/spectral-coverage.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Describes a sensor response channel's wavelength coverage in the shared spectral-coverage format\n * (core/spectral-composition), so it can be intersected with the light source and optics.\n * @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support\n * limits.\n */\n\nimport type {\n SpectralCoverageParticipant\n} from \"../core/spectral-composition.js\";\nimport { InvalidScientificInputError } from \"../core/validation.js\";\nimport {\n parseSensorSpectralResponseProfile,\n type SensorSpectralChannelResponse,\n type SensorSpectralResponseProfile\n} from \"./spectral-response.js\";\nimport { requireInputKeys } from \"../core/record-validation.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\n\nexport interface CreateSensorSpectralCoverageParticipantInput {\n spectralResponseProfile:\n SensorSpectralResponseProfile;\n channelId: string;\n participantId?: string;\n}\n\ntype ResponseCurve =\n | Extract<\n SensorSpectralChannelResponse,\n {\n kind:\n \"effective-external-quantum-efficiency\";\n }\n >[\"externalQuantumEfficiency\"]\n | Extract<\n SensorSpectralChannelResponse,\n {\n kind:\n \"effective-spectral-responsivity\";\n }\n >[\"spectralResponsivity\"]\n | Extract<\n SensorSpectralChannelResponse,\n {\n kind:\n \"separable-channel-filter-and-detector-eqe\";\n }\n >[\"channelFilterTransmittance\"];\n\nfunction responseCurves(\n response:\n SensorSpectralChannelResponse\n): readonly ResponseCurve[] {\n if (\n response.kind ===\n \"effective-external-quantum-efficiency\"\n ) {\n return [\n response.externalQuantumEfficiency\n ];\n }\n if (\n response.kind ===\n \"effective-spectral-responsivity\"\n ) {\n return [\n response.spectralResponsivity\n ];\n }\n return [\n response.channelFilterTransmittance,\n response.detectorExternalQuantumEfficiency\n ];\n}\n\n/**\n * Converts one parsed sensor response channel into the shared continuous\n * spectral-coverage format.\n *\n * It gives only the wavelength range and interpolation breakpoints. It does not\n * apply QE or A/W responsivity, and says nothing about scene or optics coverage.\n */\nexport function createSensorSpectralCoverageParticipant(\n input:\n CreateSensorSpectralCoverageParticipantInput\n): SpectralCoverageParticipant {\n requireInputKeys(input, \"createSensorSpectralCoverageParticipant\", [\"spectralResponseProfile\", \"channelId\", \"participantId\"]);\n const profile =\n parseSensorSpectralResponseProfile(\n input.spectralResponseProfile\n );\n\n if (\n typeof input.channelId !==\n \"string\" ||\n input.channelId.trim().length === 0\n ) {\n throw new InvalidConfigurationError(\n \"channelId must be a non-empty string.\"\n );\n }\n\n const response =\n profile.channels.find(\n (entry) =>\n entry.channelId ===\n input.channelId\n );\n if (response === undefined) {\n throw new InvalidScientificInputError(\n \"No spectral response is declared for the requested channelId.\"\n );\n }\n\n const curves =\n responseCurves(response);\n const wavelengthBasis =\n curves[0]!.wavelengthBasis;\n if (wavelengthBasis === \"unspecified\") {\n throw new InvalidScientificInputError(\n \"Sensor spectral coverage requires a resolved air or vacuum wavelength basis.\"\n );\n }\n if (\n curves.some(\n (curve) =>\n curve.wavelengthBasis !==\n wavelengthBasis\n )\n ) {\n throw new InvalidScientificInputError(\n \"Sensor response component curves must share one wavelengthBasis before coverage composition.\"\n );\n }\n\n const minimum = Math.max(\n ...curves.map(\n (curve) =>\n curve.samples[0]!\n .wavelengthNanometers\n )\n );\n const maximum = Math.min(\n ...curves.map(\n (curve) =>\n curve.samples[\n curve.samples.length - 1\n ]!.wavelengthNanometers\n )\n );\n if (!(minimum < maximum)) {\n throw new InvalidScientificInputError(\n \"Sensor response component curves do not share a non-empty wavelength interval.\"\n );\n }\n\n const breakpoints =\n new Set<number>();\n for (const curve of curves) {\n for (const sample of curve.samples) {\n if (\n sample.wavelengthNanometers >\n minimum &&\n sample.wavelengthNanometers <\n maximum\n ) {\n breakpoints.add(\n sample.wavelengthNanometers\n );\n }\n }\n }\n\n const participantId =\n input.participantId ??\n \"sensor-response:\" +\n profile.profileId +\n \":\" +\n input.channelId;\n\n if (\n participantId.trim().length === 0\n ) {\n throw new InvalidConfigurationError(\n \"participantId must be a non-empty string when supplied.\"\n );\n }\n\n return {\n participantId,\n role: \"sensor-response\",\n wavelengthBasis,\n wavelengthRangeNanometers: {\n minimum,\n maximum\n },\n breakpointsNanometers:\n [...breakpoints].sort(\n (a, b) => a - b\n )\n };\n}\n"]}
@@ -1,21 +1,11 @@
1
1
  /**
2
- * Module boundary and integration notes.
3
- * Revalidate continuous spectral node identity, support and nanometre measures before reducing a
4
- * supplied wavelength plan. Continuous spectral midpoint planning uses explicit nanometre measures and
5
- * response-supported intervals. Knot/breakpoint alignment does not prove convergence. Discrete/delta
6
- * lines require their own integrated measure and cannot be silently widened into continuous bins.
7
- * Builds deterministic wavelength quadrature nodes for one exact sensor response channel without
8
- * applying the response to a source spectrum. The requested wavelength range must lie fully inside the
9
- * response channel's declared usable range. Response-curve knots and optional caller-provided
10
- * continuous-spectrum/optics breakpoints partition that range. Each segment is then subdivided so no
11
- * midpoint subinterval exceeds maximumSubintervalWidthNanometers. wavelengthMeasureNanometers is
12
- * d-lambda in nanometres. It is not a dimensionless response weight. Future integration must use a
13
- * source spectral density expressed per nanometre or explicitly convert units before multiplying by
14
- * this measure. This function deliberately does not apply QE or A/W responsivity. Those
15
- * representations have different compatible downstream signal domains: QE is photon-to-electron
16
- * efficiency, while A/W responsivity relates incident radiant power to electrical current. A later
17
- * versioned composition must also match responseScope to the source plane and collection-area
18
- * semantics before integrating any signal.
2
+ * Spectral quadrature: the wavelength sample points (nodes) and step widths used to integrate light
3
+ * over wavelength for one sensor response channel.
4
+ *
5
+ * Each node is the midpoint of a wavelength interval, with its width dλ in nanometres. The intervals
6
+ * stay inside the range the response supports. Lining nodes up with curve breakpoints does not prove
7
+ * the integral has converged. Discrete (delta-like) emission lines need their own integration and are
8
+ * never silently widened into continuous bins.
19
9
  * @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
20
10
  * limits.
21
11
  */
@@ -31,26 +21,26 @@ export interface CalculateSensorSpectralQuadratureInput {
31
21
  channelId: string;
32
22
  wavelengthBasis: SpectralWavelengthBasis;
33
23
  /**
34
- * Explicit wavelength interval to sample. This API validates the interval
35
- * against sensor-response support only; it does not establish scene-spectrum
36
- * or optical-transmission coverage.
24
+ * Wavelength interval to sample. It is checked only against the range the
25
+ * sensor response supports, not against scene-spectrum or optical-transmission
26
+ * coverage.
37
27
  */
38
28
  wavelengthRangeNanometers: SensorSpectralWavelengthRangeNanometers;
39
29
  /**
40
- * Hard upper bound on each midpoint subinterval width.
30
+ * Strict upper limit on the width of each midpoint subinterval.
41
31
  *
42
- * Response knots and optional additional breakpoints split the requested
43
- * range first; each resulting segment is then subdivided until every
44
- * subinterval is no wider than this value.
32
+ * Response breakpoints and any additional breakpoints split the requested
33
+ * range first. Each segment is then subdivided until every subinterval is
34
+ * no wider than this value.
45
35
  */
46
36
  maximumSubintervalWidthNanometers: number;
47
37
  /**
48
38
  * Optional strictly increasing wavelength breakpoints from other continuous
49
- * spectral factors, such as scene spectral-density or optical-transmission
50
- * interpolation knots. Values must lie strictly inside the requested range.
39
+ * spectral inputs, such as the interpolation points of a scene spectrum or of
40
+ * optical transmission. Values must be strictly inside the requested range.
51
41
  *
52
- * These coordinates do not assert that those external factors are actually
53
- * available or valid over the requested range.
42
+ * Passing them does not claim those other inputs are available or valid over
43
+ * the requested range.
54
44
  */
55
45
  additionalBreakpointsNanometers?: readonly number[];
56
46
  }
@@ -64,16 +54,16 @@ export interface SensorSpectralQuadratureNode {
64
54
  */
65
55
  wavelengthNanometers: number;
66
56
  /**
67
- * d-lambda represented by this node. Units: nm.
57
+ * dλ (wavelength width) this node stands for. Units: nm.
68
58
  *
69
- * This is wavelength measure only. It is not response-weighted throughput,
70
- * photon count, radiant energy, current, or a dimensionless probability.
59
+ * It is only a wavelength width. It is not response-weighted throughput,
60
+ * a photon count, radiant energy, current or a dimensionless probability.
71
61
  */
72
62
  wavelengthMeasureNanometers: number;
73
63
  /**
74
- * Dimensionless wavelength measure normalized by the requested range width.
64
+ * The wavelength width divided by the requested range width (dimensionless).
75
65
  *
76
- * This may be useful for averages, but it is not a sensor-response weight.
66
+ * Useful for averages, but it is not a sensor-response weight.
77
67
  */
78
68
  normalizedWavelengthWeight: number;
79
69
  }
@@ -94,7 +84,7 @@ export interface SensorSpectralQuadrature {
94
84
  quadratureScheme: "response-breakpoint-aware-bounded-midpoint";
95
85
  segmentBoundarySource: "requested-range-plus-response-knots-plus-optional-additional-breakpoints";
96
86
  /**
97
- * Ordered unique segment boundaries, including requested range endpoints.
87
+ * Sorted, unique segment boundaries, including the ends of the requested range.
98
88
  */
99
89
  segmentBoundariesNanometers: readonly number[];
100
90
  maximumSubintervalWidthNanometers: number;
@@ -111,7 +101,7 @@ export interface SensorSpectralQuadrature {
111
101
  curves: readonly (readonly EvidenceProvenance[])[];
112
102
  };
113
103
  /**
114
- * Hard scientific boundaries.
104
+ * Fixed statements of what this result does not include.
115
105
  */
116
106
  responseValuesIncluded: false;
117
107
  responseApplicationPerformed: false;
@@ -131,39 +121,35 @@ export interface SensorSpectralQuadrature {
131
121
  convergenceErrorEstimated: false;
132
122
  }
133
123
  /**
134
- * Revalidate continuous spectral node identity, support and nanometre measures before reducing a
135
- * supplied wavelength plan.
124
+ * Rechecks a supplied wavelength plan (node identities, coverage and widths in nanometres) before it
125
+ * is used.
136
126
  *
137
- * Continuous spectral midpoint planning uses explicit nanometre measures and response-supported
138
- * intervals. Knot/breakpoint alignment does not prove convergence. Discrete/delta lines require their
139
- * own integrated measure and cannot be silently widened into continuous bins.
140
- * @param quadrature - SensorSpectralQuadrature. See the linked contract for coordinate, unit and profile binding semantics.
141
- * @returns Map<number, SensorSpectralQuadratureNode>. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
127
+ * Lining nodes up with breakpoints does not prove convergence. Discrete (delta-like) lines need their
128
+ * own integration and are never silently widened into continuous bins.
129
+ * @param quadrature - The input; see `SensorSpectralQuadrature` for its fields, units and coordinates.
130
+ * @returns The result. Success does not imply calibration.
142
131
  *
143
- * @see docs/API_REFERENCE.md for the root export and exact type graph.
132
+ * @see docs/API_REFERENCE.md for the package export and its full type definitions.
144
133
  */
145
134
  export declare function validateSensorSpectralQuadrature(quadrature: SensorSpectralQuadrature): Map<number, SensorSpectralQuadratureNode>;
146
135
  /**
147
- * Builds deterministic wavelength quadrature nodes for one exact sensor
148
- * response channel without applying the response to a source spectrum.
136
+ * Builds deterministic wavelength sample points for one exact sensor response
137
+ * channel. It does not apply the response to any spectrum.
149
138
  *
150
- * The requested wavelength range must lie fully inside the response channel's
151
- * declared usable range. Response-curve knots and optional caller-provided
152
- * continuous-spectrum/optics breakpoints partition that range. Each segment is
153
- * then subdivided so no midpoint subinterval exceeds
139
+ * The requested range must lie fully inside the channel's declared usable
140
+ * range. The response curve's breakpoints, plus any caller-supplied breakpoints
141
+ * from the source spectrum or optics, split that range into segments. Each
142
+ * segment is then subdivided so no midpoint subinterval is wider than
154
143
  * maximumSubintervalWidthNanometers.
155
144
  *
156
- * wavelengthMeasureNanometers is d-lambda in nanometres. It is not a
157
- * dimensionless response weight. Future integration must use a source spectral
158
- * density expressed per nanometre or explicitly convert units before
159
- * multiplying by this measure.
145
+ * wavelengthMeasureNanometers is dλ in nanometres, not a dimensionless response
146
+ * weight. Multiply it only by a spectral density per nanometre, or convert
147
+ * units explicitly first.
160
148
  *
161
- * This function deliberately does not apply QE or A/W responsivity. Those
162
- * representations have different compatible downstream signal domains: QE is
163
- * photon-to-electron efficiency, while A/W responsivity relates incident
164
- * radiant power to electrical current. A later versioned composition must also
165
- * match responseScope to the source plane and collection-area semantics before
166
- * integrating any signal.
149
+ * QE and A/W responsivity are deliberately not applied. They lead to different
150
+ * signals: QE is photon-to-electron efficiency, while A/W responsivity relates
151
+ * incident radiant power to electrical current. A later step must also match
152
+ * responseScope to the source plane and collection area before integrating any
153
+ * signal.
167
154
  */
168
155
  export declare function calculateSensorSpectralQuadrature(input: CalculateSensorSpectralQuadratureInput): CalculationResult<SensorSpectralQuadrature>;
169
- //# sourceMappingURL=spectral-quadrature.d.ts.map
@@ -1,22 +1,12 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  /**
3
- * Module boundary and integration notes.
4
- * Revalidate continuous spectral node identity, support and nanometre measures before reducing a
5
- * supplied wavelength plan. Continuous spectral midpoint planning uses explicit nanometre measures and
6
- * response-supported intervals. Knot/breakpoint alignment does not prove convergence. Discrete/delta
7
- * lines require their own integrated measure and cannot be silently widened into continuous bins.
8
- * Builds deterministic wavelength quadrature nodes for one exact sensor response channel without
9
- * applying the response to a source spectrum. The requested wavelength range must lie fully inside the
10
- * response channel's declared usable range. Response-curve knots and optional caller-provided
11
- * continuous-spectrum/optics breakpoints partition that range. Each segment is then subdivided so no
12
- * midpoint subinterval exceeds maximumSubintervalWidthNanometers. wavelengthMeasureNanometers is
13
- * d-lambda in nanometres. It is not a dimensionless response weight. Future integration must use a
14
- * source spectral density expressed per nanometre or explicitly convert units before multiplying by
15
- * this measure. This function deliberately does not apply QE or A/W responsivity. Those
16
- * representations have different compatible downstream signal domains: QE is photon-to-electron
17
- * efficiency, while A/W responsivity relates incident radiant power to electrical current. A later
18
- * versioned composition must also match responseScope to the source plane and collection-area
19
- * semantics before integrating any signal.
3
+ * Spectral quadrature: the wavelength sample points (nodes) and step widths used to integrate light
4
+ * over wavelength for one sensor response channel.
5
+ *
6
+ * Each node is the midpoint of a wavelength interval, with its width dλ in nanometres. The intervals
7
+ * stay inside the range the response supports. Lining nodes up with curve breakpoints does not prove
8
+ * the integral has converged. Discrete (delta-like) emission lines need their own integration and are
9
+ * never silently widened into continuous bins.
20
10
  * @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
21
11
  * limits.
22
12
  */
@@ -24,6 +14,8 @@ import { approximationResult } from "../core/calculation-result.js";
24
14
  import { InvalidScientificInputError } from "../core/validation.js";
25
15
  import { parseSensorColorSamplingProfile } from "./color-sampling.js";
26
16
  import { createSensorSpectralResponseChannelBinding, parseSensorSpectralResponseProfile, resolveSensorSpectralResponseAtWavelength } from "./spectral-response.js";
17
+ import { requireInputKeys } from "../core/record-validation.js";
18
+ import { InvalidConfigurationError } from "../core/configuration-error.js";
27
19
  const MAX_SPECTRAL_QUADRATURE_NODES = 100_000;
28
20
  function requirePositiveFinite(value, path) {
29
21
  if (typeof value !== "number" ||
@@ -36,7 +28,7 @@ function requirePositiveFinite(value, path) {
36
28
  function channelResponse(profile, channelId) {
37
29
  if (typeof channelId !== "string" ||
38
30
  channelId.trim().length === 0) {
39
- throw new InvalidScientificInputError("channelId must be a non-empty string.");
31
+ throw new InvalidConfigurationError("channelId must be a non-empty string.");
40
32
  }
41
33
  const response = profile.channels.find((entry) => entry.channelId === channelId);
42
34
  if (response === undefined) {
@@ -74,7 +66,7 @@ function usableResponseRange(curves) {
74
66
  function parseRequestedRange(input, usable) {
75
67
  if (typeof input !== "object" ||
76
68
  input === null) {
77
- throw new InvalidScientificInputError("wavelengthRangeNanometers must be an object.");
69
+ throw new InvalidConfigurationError("wavelengthRangeNanometers must be an object.");
78
70
  }
79
71
  const minimum = requirePositiveFinite(input.minimum, "wavelengthRangeNanometers.minimum");
80
72
  const maximum = requirePositiveFinite(input.maximum, "wavelengthRangeNanometers.maximum");
@@ -92,7 +84,7 @@ function additionalBreakpoints(value, range) {
92
84
  return [];
93
85
  }
94
86
  if (!Array.isArray(value)) {
95
- throw new InvalidScientificInputError("additionalBreakpointsNanometers must be an array when supplied.");
87
+ throw new InvalidConfigurationError("additionalBreakpointsNanometers must be an array when supplied.");
96
88
  }
97
89
  if (value.length >=
98
90
  MAX_SPECTRAL_QUADRATURE_NODES) {
@@ -190,22 +182,21 @@ function approximatelyEqual(actual, expected, tolerance = SPECTRAL_VALIDATION_TO
190
182
  tolerance * scale);
191
183
  }
192
184
  /**
193
- * Revalidate continuous spectral node identity, support and nanometre measures before reducing a
194
- * supplied wavelength plan.
185
+ * Rechecks a supplied wavelength plan (node identities, coverage and widths in nanometres) before it
186
+ * is used.
195
187
  *
196
- * Continuous spectral midpoint planning uses explicit nanometre measures and response-supported
197
- * intervals. Knot/breakpoint alignment does not prove convergence. Discrete/delta lines require their
198
- * own integrated measure and cannot be silently widened into continuous bins.
199
- * @param quadrature - SensorSpectralQuadrature. See the linked contract for coordinate, unit and profile binding semantics.
200
- * @returns Map<number, SensorSpectralQuadratureNode>. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
188
+ * Lining nodes up with breakpoints does not prove convergence. Discrete (delta-like) lines need their
189
+ * own integration and are never silently widened into continuous bins.
190
+ * @param quadrature - The input; see `SensorSpectralQuadrature` for its fields, units and coordinates.
191
+ * @returns The result. Success does not imply calibration.
201
192
  *
202
- * @see docs/API_REFERENCE.md for the root export and exact type graph.
193
+ * @see docs/API_REFERENCE.md for the package export and its full type definitions.
203
194
  */
204
195
  export function validateSensorSpectralQuadrature(quadrature) {
205
196
  if (typeof quadrature !== "object" ||
206
197
  quadrature === null ||
207
198
  !Array.isArray(quadrature.nodes)) {
208
- throw new InvalidScientificInputError("spectralQuadrature must contain a nodes array.");
199
+ throw new InvalidConfigurationError("spectralQuadrature must contain a nodes array.");
209
200
  }
210
201
  for (const [field, value] of [
211
202
  ["profileId", quadrature.profileId],
@@ -217,7 +208,7 @@ export function validateSensorSpectralQuadrature(quadrature) {
217
208
  ]) {
218
209
  if (typeof value !== "string" ||
219
210
  value.trim().length === 0) {
220
- throw new InvalidScientificInputError("spectralQuadrature." +
211
+ throw new InvalidConfigurationError("spectralQuadrature." +
221
212
  field +
222
213
  " must be a non-empty string.");
223
214
  }
@@ -225,7 +216,7 @@ export function validateSensorSpectralQuadrature(quadrature) {
225
216
  if (quadrature.wavelengthBasis !== "air" &&
226
217
  quadrature.wavelengthBasis !== "vacuum" &&
227
218
  quadrature.wavelengthBasis !== "unspecified") {
228
- throw new InvalidScientificInputError("spectralQuadrature.wavelengthBasis is invalid.");
219
+ throw new InvalidConfigurationError("spectralQuadrature.wavelengthBasis is invalid.");
229
220
  }
230
221
  const rangeMinimum = requirePositiveFinite(quadrature.wavelengthRangeNanometers.minimum, "spectralQuadrature.wavelengthRangeNanometers.minimum");
231
222
  const rangeMaximum = requirePositiveFinite(quadrature.wavelengthRangeNanometers.maximum, "spectralQuadrature.wavelengthRangeNanometers.maximum");
@@ -386,33 +377,32 @@ export function validateSensorSpectralQuadrature(quadrature) {
386
377
  return nodesByIndex;
387
378
  }
388
379
  /**
389
- * Builds deterministic wavelength quadrature nodes for one exact sensor
390
- * response channel without applying the response to a source spectrum.
380
+ * Builds deterministic wavelength sample points for one exact sensor response
381
+ * channel. It does not apply the response to any spectrum.
391
382
  *
392
- * The requested wavelength range must lie fully inside the response channel's
393
- * declared usable range. Response-curve knots and optional caller-provided
394
- * continuous-spectrum/optics breakpoints partition that range. Each segment is
395
- * then subdivided so no midpoint subinterval exceeds
383
+ * The requested range must lie fully inside the channel's declared usable
384
+ * range. The response curve's breakpoints, plus any caller-supplied breakpoints
385
+ * from the source spectrum or optics, split that range into segments. Each
386
+ * segment is then subdivided so no midpoint subinterval is wider than
396
387
  * maximumSubintervalWidthNanometers.
397
388
  *
398
- * wavelengthMeasureNanometers is d-lambda in nanometres. It is not a
399
- * dimensionless response weight. Future integration must use a source spectral
400
- * density expressed per nanometre or explicitly convert units before
401
- * multiplying by this measure.
389
+ * wavelengthMeasureNanometers is dλ in nanometres, not a dimensionless response
390
+ * weight. Multiply it only by a spectral density per nanometre, or convert
391
+ * units explicitly first.
402
392
  *
403
- * This function deliberately does not apply QE or A/W responsivity. Those
404
- * representations have different compatible downstream signal domains: QE is
405
- * photon-to-electron efficiency, while A/W responsivity relates incident
406
- * radiant power to electrical current. A later versioned composition must also
407
- * match responseScope to the source plane and collection-area semantics before
408
- * integrating any signal.
393
+ * QE and A/W responsivity are deliberately not applied. They lead to different
394
+ * signals: QE is photon-to-electron efficiency, while A/W responsivity relates
395
+ * incident radiant power to electrical current. A later step must also match
396
+ * responseScope to the source plane and collection area before integrating any
397
+ * signal.
409
398
  */
410
399
  export function calculateSensorSpectralQuadrature(input) {
400
+ requireInputKeys(input, "calculateSensorSpectralQuadrature", ["colorSamplingProfile", "spectralResponseProfile", "channelId", "wavelengthBasis", "wavelengthRangeNanometers", "maximumSubintervalWidthNanometers", "additionalBreakpointsNanometers"]);
411
401
  const maximumSubintervalWidthNanometers = requirePositiveFinite(input.maximumSubintervalWidthNanometers, "maximumSubintervalWidthNanometers");
412
402
  if (input.wavelengthBasis !== "air" &&
413
403
  input.wavelengthBasis !== "vacuum" &&
414
404
  input.wavelengthBasis !== "unspecified") {
415
- throw new InvalidScientificInputError("wavelengthBasis is invalid.");
405
+ throw new InvalidConfigurationError("wavelengthBasis is invalid.");
416
406
  }
417
407
  const colorProfile = parseSensorColorSamplingProfile(input.colorSamplingProfile);
418
408
  const responseProfile = parseSensorSpectralResponseProfile(input.spectralResponseProfile);