@photivra/engine 1.5.0 → 2.0.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 (1078) hide show
  1. package/CHANGELOG.md +393 -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/host-yield.d.ts +7 -0
  236. package/dist/facade/host-yield.js +23 -0
  237. package/dist/facade/host-yield.js.map +1 -0
  238. package/dist/facade/scene-radiance.d.ts +117 -0
  239. package/dist/facade/scene-radiance.js +205 -0
  240. package/dist/facade/scene-radiance.js.map +1 -0
  241. package/dist/facade/simulate-capture.d.ts +284 -0
  242. package/dist/facade/simulate-capture.js +1026 -0
  243. package/dist/facade/simulate-capture.js.map +1 -0
  244. package/dist/gpu/chart-radiance-gpu.d.ts +17 -0
  245. package/dist/gpu/chart-radiance-gpu.js +176 -0
  246. package/dist/gpu/chart-radiance-gpu.js.map +1 -0
  247. package/dist/gpu/image-kernel-accelerator.d.ts +132 -0
  248. package/dist/gpu/image-kernel-accelerator.js +720 -0
  249. package/dist/gpu/image-kernel-accelerator.js.map +1 -0
  250. package/dist/gpu/image-kernel-execution.d.ts +92 -0
  251. package/dist/gpu/image-kernel-execution.js +84 -0
  252. package/dist/gpu/image-kernel-execution.js.map +1 -0
  253. package/dist/gpu/sensor-stage-gpu.d.ts +44 -0
  254. package/dist/gpu/sensor-stage-gpu.js +317 -0
  255. package/dist/gpu/sensor-stage-gpu.js.map +1 -0
  256. package/dist/gpu/temporal-sum-gpu.d.ts +23 -0
  257. package/dist/gpu/temporal-sum-gpu.js +150 -0
  258. package/dist/gpu/temporal-sum-gpu.js.map +1 -0
  259. package/dist/gpu/webgpu-runtime.d.ts +63 -0
  260. package/dist/gpu/webgpu-runtime.js +215 -0
  261. package/dist/gpu/webgpu-runtime.js.map +1 -0
  262. package/dist/gpu/wgsl-chart-kernel.d.ts +30 -0
  263. package/dist/gpu/wgsl-chart-kernel.js +165 -0
  264. package/dist/gpu/wgsl-chart-kernel.js.map +1 -0
  265. package/dist/gpu/wgsl-kernels.d.ts +53 -0
  266. package/dist/gpu/wgsl-kernels.js +365 -0
  267. package/dist/gpu/wgsl-kernels.js.map +1 -0
  268. package/dist/gpu/wgsl-sensor-kernel.d.ts +64 -0
  269. package/dist/gpu/wgsl-sensor-kernel.js +409 -0
  270. package/dist/gpu/wgsl-sensor-kernel.js.map +1 -0
  271. package/dist/index.d.ts +89 -25
  272. package/dist/index.js +59 -15
  273. package/dist/index.js.map +1 -1
  274. package/dist/motion/camera-rotation.d.ts +92 -40
  275. package/dist/motion/camera-rotation.js +84 -47
  276. package/dist/motion/camera-rotation.js.map +1 -1
  277. package/dist/motion/capture-rotation-inverse-mapping.d.ts +37 -34
  278. package/dist/motion/capture-rotation-inverse-mapping.js +32 -24
  279. package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
  280. package/dist/motion/capture-rotation-temporal-quadrature.d.ts +39 -35
  281. package/dist/motion/capture-rotation-temporal-quadrature.js +37 -28
  282. package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
  283. package/dist/motion/capture-rotation-trajectory.d.ts +32 -28
  284. package/dist/motion/capture-rotation-trajectory.js +36 -26
  285. package/dist/motion/capture-rotation-trajectory.js.map +1 -1
  286. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +23 -21
  287. package/dist/motion/capture-translation-parallax-temporal-quadrature.js +33 -14
  288. package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
  289. package/dist/motion/extended-object-projection.d.ts +19 -16
  290. package/dist/motion/extended-object-projection.js +38 -18
  291. package/dist/motion/extended-object-projection.js.map +1 -1
  292. package/dist/motion/projected-motion.d.ts +18 -17
  293. package/dist/motion/projected-motion.js +25 -17
  294. package/dist/motion/projected-motion.js.map +1 -1
  295. package/dist/motion/temporal-exposure-sum.d.ts +55 -0
  296. package/dist/motion/temporal-exposure-sum.js +141 -0
  297. package/dist/motion/temporal-exposure-sum.js.map +1 -0
  298. package/dist/motion/video-sequence.d.ts +111 -0
  299. package/dist/motion/video-sequence.js +179 -0
  300. package/dist/motion/video-sequence.js.map +1 -0
  301. package/dist/optics/aperture.d.ts +14 -15
  302. package/dist/optics/aperture.js +13 -11
  303. package/dist/optics/aperture.js.map +1 -1
  304. package/dist/optics/atmospheric-haze.d.ts +83 -0
  305. package/dist/optics/atmospheric-haze.js +113 -0
  306. package/dist/optics/atmospheric-haze.js.map +1 -0
  307. package/dist/optics/brown-conrady-distortion.d.ts +116 -0
  308. package/dist/optics/brown-conrady-distortion.js +291 -0
  309. package/dist/optics/brown-conrady-distortion.js.map +1 -0
  310. package/dist/optics/circle-of-confusion.d.ts +10 -10
  311. package/dist/optics/circle-of-confusion.js +15 -11
  312. package/dist/optics/circle-of-confusion.js.map +1 -1
  313. package/dist/optics/complex-pupil-psf.d.ts +64 -33
  314. package/dist/optics/complex-pupil-psf.js +190 -98
  315. package/dist/optics/complex-pupil-psf.js.map +1 -1
  316. package/dist/optics/depth-of-field.d.ts +25 -15
  317. package/dist/optics/depth-of-field.js +67 -27
  318. package/dist/optics/depth-of-field.js.map +1 -1
  319. package/dist/optics/diffraction.d.ts +14 -13
  320. package/dist/optics/diffraction.js +14 -10
  321. package/dist/optics/diffraction.js.map +1 -1
  322. package/dist/optics/focus-breathing.d.ts +88 -27
  323. package/dist/optics/focus-breathing.js +114 -23
  324. package/dist/optics/focus-breathing.js.map +1 -1
  325. package/dist/optics/focus-state.d.ts +18 -18
  326. package/dist/optics/focus-state.js +21 -15
  327. package/dist/optics/focus-state.js.map +1 -1
  328. package/dist/optics/front-of-lens-filter.d.ts +45 -14
  329. package/dist/optics/front-of-lens-filter.js +259 -88
  330. package/dist/optics/front-of-lens-filter.js.map +1 -1
  331. package/dist/optics/illumination-vignetting.d.ts +16 -17
  332. package/dist/optics/illumination-vignetting.js +40 -17
  333. package/dist/optics/illumination-vignetting.js.map +1 -1
  334. package/dist/optics/irradiance-convolution.d.ts +59 -0
  335. package/dist/optics/irradiance-convolution.js +138 -0
  336. package/dist/optics/irradiance-convolution.js.map +1 -0
  337. package/dist/optics/lateral-chromatic-aberration.d.ts +33 -30
  338. package/dist/optics/lateral-chromatic-aberration.js +33 -23
  339. package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
  340. package/dist/optics/lens-psf-kernels.d.ts +89 -0
  341. package/dist/optics/lens-psf-kernels.js +175 -0
  342. package/dist/optics/lens-psf-kernels.js.map +1 -0
  343. package/dist/optics/lens-psf-profile.d.ts +78 -46
  344. package/dist/optics/lens-psf-profile.js +335 -124
  345. package/dist/optics/lens-psf-profile.js.map +1 -1
  346. package/dist/optics/longitudinal-chromatic-aberration.d.ts +102 -0
  347. package/dist/optics/longitudinal-chromatic-aberration.js +210 -0
  348. package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -0
  349. package/dist/optics/polygon-diffraction.d.ts +80 -23
  350. package/dist/optics/polygon-diffraction.js +130 -25
  351. package/dist/optics/polygon-diffraction.js.map +1 -1
  352. package/dist/optics/profile-contract.d.ts +5 -6
  353. package/dist/optics/profile-contract.js +14 -11
  354. package/dist/optics/profile-contract.js.map +1 -1
  355. package/dist/optics/psf-foundation.d.ts +23 -23
  356. package/dist/optics/psf-foundation.js +24 -21
  357. package/dist/optics/psf-foundation.js.map +1 -1
  358. package/dist/optics/pupil-vignetting.d.ts +118 -0
  359. package/dist/optics/pupil-vignetting.js +264 -0
  360. package/dist/optics/pupil-vignetting.js.map +1 -0
  361. package/dist/optics/radial-distortion.d.ts +34 -33
  362. package/dist/optics/radial-distortion.js +37 -30
  363. package/dist/optics/radial-distortion.js.map +1 -1
  364. package/dist/optics/scene-to-sensor-irradiance.d.ts +47 -33
  365. package/dist/optics/scene-to-sensor-irradiance.js +73 -45
  366. package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
  367. package/dist/optics/scene-to-sensor-quadrature.d.ts +23 -18
  368. package/dist/optics/scene-to-sensor-quadrature.js +16 -11
  369. package/dist/optics/scene-to-sensor-quadrature.js.map +1 -1
  370. package/dist/optics/sensor-aperture-rays.d.ts +20 -4
  371. package/dist/optics/sensor-aperture-rays.js +32 -14
  372. package/dist/optics/sensor-aperture-rays.js.map +1 -1
  373. package/dist/optics/sensor-environment-query.d.ts +81 -16
  374. package/dist/optics/sensor-environment-query.js +145 -12
  375. package/dist/optics/sensor-environment-query.js.map +1 -1
  376. package/dist/optics/sensor-psf-quadrature.d.ts +12 -10
  377. package/dist/optics/sensor-psf-quadrature.js +18 -11
  378. package/dist/optics/sensor-psf-quadrature.js.map +1 -1
  379. package/dist/optics/sensor-psf-support.d.ts +8 -6
  380. package/dist/optics/sensor-psf-support.js +8 -5
  381. package/dist/optics/sensor-psf-support.js.map +1 -1
  382. package/dist/optics/stray-light.d.ts +22 -19
  383. package/dist/optics/stray-light.js +18 -12
  384. package/dist/optics/stray-light.js.map +1 -1
  385. package/dist/optics/thin-lens.d.ts +10 -9
  386. package/dist/optics/thin-lens.js +12 -8
  387. package/dist/optics/thin-lens.js.map +1 -1
  388. package/dist/optics/zernike-wavefront.d.ts +154 -0
  389. package/dist/optics/zernike-wavefront.js +352 -0
  390. package/dist/optics/zernike-wavefront.js.map +1 -0
  391. package/dist/output/capture-corrected-sdr.d.ts +16 -8
  392. package/dist/output/capture-corrected-sdr.js +16 -8
  393. package/dist/output/capture-corrected-sdr.js.map +1 -1
  394. package/dist/output/capture-geometry.d.ts +34 -36
  395. package/dist/output/capture-geometry.js +52 -32
  396. package/dist/output/capture-geometry.js.map +1 -1
  397. package/dist/output/capture-sdr.d.ts +7 -6
  398. package/dist/output/capture-sdr.js +11 -8
  399. package/dist/output/capture-sdr.js.map +1 -1
  400. package/dist/output/crop.d.ts +22 -6
  401. package/dist/output/crop.js +40 -6
  402. package/dist/output/crop.js.map +1 -1
  403. package/dist/output/geometric-transforms.d.ts +60 -23
  404. package/dist/output/geometric-transforms.js +111 -24
  405. package/dist/output/geometric-transforms.js.map +1 -1
  406. package/dist/output/lens-corrections.d.ts +27 -19
  407. package/dist/output/lens-corrections.js +29 -13
  408. package/dist/output/lens-corrections.js.map +1 -1
  409. package/dist/output/native-capture-sdr.d.ts +71 -16
  410. package/dist/output/native-capture-sdr.js +190 -33
  411. package/dist/output/native-capture-sdr.js.map +1 -1
  412. package/dist/output/png-encoder.d.ts +65 -0
  413. package/dist/output/png-encoder.js +461 -0
  414. package/dist/output/png-encoder.js.map +1 -0
  415. package/dist/output/print-contrast-reference.d.ts +10 -9
  416. package/dist/output/print-contrast-reference.js +10 -8
  417. package/dist/output/print-contrast-reference.js.map +1 -1
  418. package/dist/output/print-detail.d.ts +18 -17
  419. package/dist/output/print-detail.js +12 -10
  420. package/dist/output/print-detail.js.map +1 -1
  421. package/dist/output/print-jpeg.d.ts +26 -5
  422. package/dist/output/print-jpeg.js +117 -50
  423. package/dist/output/print-jpeg.js.map +1 -1
  424. package/dist/output/print-plan.d.ts +19 -19
  425. package/dist/output/print-plan.js +11 -10
  426. package/dist/output/print-plan.js.map +1 -1
  427. package/dist/output/print-region-statistics.d.ts +14 -15
  428. package/dist/output/print-region-statistics.js +11 -11
  429. package/dist/output/print-region-statistics.js.map +1 -1
  430. package/dist/output/sdr-rendering.d.ts +48 -10
  431. package/dist/output/sdr-rendering.js +114 -25
  432. package/dist/output/sdr-rendering.js.map +1 -1
  433. package/dist/output/subject-framing-crop.d.ts +6 -10
  434. package/dist/output/subject-framing-crop.js +23 -13
  435. package/dist/output/subject-framing-crop.js.map +1 -1
  436. package/dist/processing/demosaic.d.ts +90 -0
  437. package/dist/processing/demosaic.js +275 -0
  438. package/dist/processing/demosaic.js.map +1 -0
  439. package/dist/processing/denoise.d.ts +68 -0
  440. package/dist/processing/denoise.js +214 -0
  441. package/dist/processing/denoise.js.map +1 -0
  442. package/dist/processing/focus-stacking.d.ts +17 -0
  443. package/dist/processing/focus-stacking.js +80 -0
  444. package/dist/processing/focus-stacking.js.map +1 -0
  445. package/dist/processing/hdr.d.ts +54 -0
  446. package/dist/processing/hdr.js +172 -0
  447. package/dist/processing/hdr.js.map +1 -0
  448. package/dist/processing/image-ops.d.ts +66 -0
  449. package/dist/processing/image-ops.js +192 -0
  450. package/dist/processing/image-ops.js.map +1 -0
  451. package/dist/processing/panorama.d.ts +51 -0
  452. package/dist/processing/panorama.js +305 -0
  453. package/dist/processing/panorama.js.map +1 -0
  454. package/dist/processing/processing-task.d.ts +85 -0
  455. package/dist/processing/processing-task.js +164 -0
  456. package/dist/processing/processing-task.js.map +1 -0
  457. package/dist/processing/tone-mapping.d.ts +69 -0
  458. package/dist/processing/tone-mapping.js +310 -0
  459. package/dist/processing/tone-mapping.js.map +1 -0
  460. package/dist/schema/camera.d.ts +5 -4
  461. package/dist/schema/illumination-spectral.d.ts +13 -19
  462. package/dist/schema/illumination-spectral.js +23 -19
  463. package/dist/schema/illumination-spectral.js.map +1 -1
  464. package/dist/schema/illumination-temporal.d.ts +12 -15
  465. package/dist/schema/illumination-temporal.js +43 -28
  466. package/dist/schema/illumination-temporal.js.map +1 -1
  467. package/dist/schema/illumination.d.ts +5 -4
  468. package/dist/schema/illumination.js +55 -20
  469. package/dist/schema/illumination.js.map +1 -1
  470. package/dist/schema/scene-radiance-temporal.d.ts +9 -11
  471. package/dist/schema/scene-radiance-temporal.js +26 -23
  472. package/dist/schema/scene-radiance-temporal.js.map +1 -1
  473. package/dist/schema/scene-radiance.d.ts +17 -17
  474. package/dist/schema/scene-radiance.js +56 -34
  475. package/dist/schema/scene-radiance.js.map +1 -1
  476. package/dist/schema/scene.d.ts +14 -13
  477. package/dist/schema/validation.d.ts +0 -1
  478. package/dist/schema/validation.js +17 -15
  479. package/dist/schema/validation.js.map +1 -1
  480. package/dist/sensor/accumulated-charge.d.ts +45 -64
  481. package/dist/sensor/accumulated-charge.js +41 -47
  482. package/dist/sensor/accumulated-charge.js.map +1 -1
  483. package/dist/sensor/architecture.d.ts +22 -25
  484. package/dist/sensor/architecture.js +17 -16
  485. package/dist/sensor/architecture.js.map +1 -1
  486. package/dist/sensor/camera-saturation-capacity.d.ts +21 -28
  487. package/dist/sensor/camera-saturation-capacity.js +36 -34
  488. package/dist/sensor/camera-saturation-capacity.js.map +1 -1
  489. package/dist/sensor/capture-color-sampling-binding.d.ts +46 -51
  490. package/dist/sensor/capture-color-sampling-binding.js +39 -41
  491. package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
  492. package/dist/sensor/capture-mode-timing.d.ts +8 -9
  493. package/dist/sensor/capture-mode-timing.js +24 -21
  494. package/dist/sensor/capture-mode-timing.js.map +1 -1
  495. package/dist/sensor/capture-mode.d.ts +28 -30
  496. package/dist/sensor/capture-mode.js +33 -31
  497. package/dist/sensor/capture-mode.js.map +1 -1
  498. package/dist/sensor/color-sampling.d.ts +30 -33
  499. package/dist/sensor/color-sampling.js +32 -37
  500. package/dist/sensor/color-sampling.js.map +1 -1
  501. package/dist/sensor/constant-rate-temporal-integration.d.ts +19 -23
  502. package/dist/sensor/constant-rate-temporal-integration.js +28 -26
  503. package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
  504. package/dist/sensor/dark-current.d.ts +53 -49
  505. package/dist/sensor/dark-current.js +87 -46
  506. package/dist/sensor/dark-current.js.map +1 -1
  507. package/dist/sensor/environment-photo-signal.d.ts +71 -30
  508. package/dist/sensor/environment-photo-signal.js +127 -46
  509. package/dist/sensor/environment-photo-signal.js.map +1 -1
  510. package/dist/sensor/eqe-electron-rate.d.ts +14 -13
  511. package/dist/sensor/eqe-electron-rate.js +34 -14
  512. package/dist/sensor/eqe-electron-rate.js.map +1 -1
  513. package/dist/sensor/eqe-local-exposure.d.ts +24 -24
  514. package/dist/sensor/eqe-local-exposure.js +15 -11
  515. package/dist/sensor/eqe-local-exposure.js.map +1 -1
  516. package/dist/sensor/eqe-temporal-exposure.d.ts +11 -11
  517. package/dist/sensor/eqe-temporal-exposure.js +15 -10
  518. package/dist/sensor/eqe-temporal-exposure.js.map +1 -1
  519. package/dist/sensor/exposure-window.d.ts +48 -34
  520. package/dist/sensor/exposure-window.js +77 -36
  521. package/dist/sensor/exposure-window.js.map +1 -1
  522. package/dist/sensor/fixed-pattern-noise.d.ts +108 -0
  523. package/dist/sensor/fixed-pattern-noise.js +166 -0
  524. package/dist/sensor/fixed-pattern-noise.js.map +1 -0
  525. package/dist/sensor/iso-gain.d.ts +44 -0
  526. package/dist/sensor/iso-gain.js +119 -0
  527. package/dist/sensor/iso-gain.js.map +1 -0
  528. package/dist/sensor/iso-signal-chain.d.ts +25 -48
  529. package/dist/sensor/iso-signal-chain.js +52 -66
  530. package/dist/sensor/iso-signal-chain.js.map +1 -1
  531. package/dist/sensor/local-exposure-binding.d.ts +21 -21
  532. package/dist/sensor/local-exposure-binding.js +22 -18
  533. package/dist/sensor/local-exposure-binding.js.map +1 -1
  534. package/dist/sensor/optical-stack.d.ts +36 -40
  535. package/dist/sensor/optical-stack.js +34 -37
  536. package/dist/sensor/optical-stack.js.map +1 -1
  537. package/dist/sensor/photon-energy.d.ts +22 -28
  538. package/dist/sensor/photon-energy.js +42 -34
  539. package/dist/sensor/photon-energy.js.map +1 -1
  540. package/dist/sensor/physical-charge-capacity.d.ts +20 -30
  541. package/dist/sensor/physical-charge-capacity.js +35 -36
  542. package/dist/sensor/physical-charge-capacity.js.map +1 -1
  543. package/dist/sensor/pixel-pitch.d.ts +2 -3
  544. package/dist/sensor/pixel-pitch.js +4 -2
  545. package/dist/sensor/pixel-pitch.js.map +1 -1
  546. package/dist/sensor/radiometry-readiness.d.ts +13 -15
  547. package/dist/sensor/radiometry-readiness.js +20 -17
  548. package/dist/sensor/radiometry-readiness.js.map +1 -1
  549. package/dist/sensor/raw-readout.d.ts +173 -83
  550. package/dist/sensor/raw-readout.js +425 -160
  551. package/dist/sensor/raw-readout.js.map +1 -1
  552. package/dist/sensor/raw-reconstruction.d.ts +112 -44
  553. package/dist/sensor/raw-reconstruction.js +200 -47
  554. package/dist/sensor/raw-reconstruction.js.map +1 -1
  555. package/dist/sensor/readout-exposure-linkage.d.ts +103 -34
  556. package/dist/sensor/readout-exposure-linkage.js +125 -27
  557. package/dist/sensor/readout-exposure-linkage.js.map +1 -1
  558. package/dist/sensor/readout-timing.d.ts +43 -44
  559. package/dist/sensor/readout-timing.js +38 -30
  560. package/dist/sensor/readout-timing.js.map +1 -1
  561. package/dist/sensor/response-application-compatibility.d.ts +21 -28
  562. package/dist/sensor/response-application-compatibility.js +35 -34
  563. package/dist/sensor/response-application-compatibility.js.map +1 -1
  564. package/dist/sensor/response-operating-range.d.ts +26 -35
  565. package/dist/sensor/response-operating-range.js +40 -39
  566. package/dist/sensor/response-operating-range.js.map +1 -1
  567. package/dist/sensor/responsivity-photocurrent.d.ts +21 -29
  568. package/dist/sensor/responsivity-photocurrent.js +57 -40
  569. package/dist/sensor/responsivity-photocurrent.js.map +1 -1
  570. package/dist/sensor/sampling-aperture.d.ts +21 -25
  571. package/dist/sensor/sampling-aperture.js +29 -28
  572. package/dist/sensor/sampling-aperture.js.map +1 -1
  573. package/dist/sensor/scene-eqe-temporal-exposure.d.ts +14 -12
  574. package/dist/sensor/scene-eqe-temporal-exposure.js +13 -8
  575. package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -1
  576. package/dist/sensor/sensor-geometry.d.ts +28 -32
  577. package/dist/sensor/sensor-geometry.js +35 -20
  578. package/dist/sensor/sensor-geometry.js.map +1 -1
  579. package/dist/sensor/signal-noise.d.ts +14 -16
  580. package/dist/sensor/signal-noise.js +15 -13
  581. package/dist/sensor/signal-noise.js.map +1 -1
  582. package/dist/sensor/spatial-sample-reduction.d.ts +45 -60
  583. package/dist/sensor/spatial-sample-reduction.js +39 -48
  584. package/dist/sensor/spatial-sample-reduction.js.map +1 -1
  585. package/dist/sensor/spatial-sampling-quadrature.d.ts +46 -54
  586. package/dist/sensor/spatial-sampling-quadrature.js +31 -36
  587. package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
  588. package/dist/sensor/spatio-spectral-reduction.d.ts +32 -42
  589. package/dist/sensor/spatio-spectral-reduction.js +24 -29
  590. package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
  591. package/dist/sensor/spectral-coverage.d.ts +6 -9
  592. package/dist/sensor/spectral-coverage.js +9 -6
  593. package/dist/sensor/spectral-coverage.js.map +1 -1
  594. package/dist/sensor/spectral-quadrature.d.ts +46 -60
  595. package/dist/sensor/spectral-quadrature.js +38 -48
  596. package/dist/sensor/spectral-quadrature.js.map +1 -1
  597. package/dist/sensor/spectral-response.d.ts +53 -41
  598. package/dist/sensor/spectral-response.js +80 -47
  599. package/dist/sensor/spectral-response.js.map +1 -1
  600. package/dist/sensor/stochastic-seed.d.ts +50 -0
  601. package/dist/sensor/stochastic-seed.js +123 -0
  602. package/dist/sensor/stochastic-seed.js.map +1 -0
  603. package/dist/sensor/temporal-eqe-sum.d.ts +2 -4
  604. package/dist/sensor/temporal-eqe-sum.js +5 -6
  605. package/dist/sensor/temporal-eqe-sum.js.map +1 -1
  606. package/dist/sensor/temporal-photo-signal.d.ts +5 -6
  607. package/dist/sensor/temporal-photo-signal.js +11 -10
  608. package/dist/sensor/temporal-photo-signal.js.map +1 -1
  609. package/dist/sensor/temporal-sample-binding.d.ts +1 -2
  610. package/dist/sensor/temporal-sample-binding.js +3 -3
  611. package/dist/sensor/temporal-sample-binding.js.map +1 -1
  612. package/dist/simulation/poc-simulation.d.ts +16 -16
  613. package/dist/simulation/poc-simulation.js +20 -15
  614. package/dist/simulation/poc-simulation.js.map +1 -1
  615. package/dist/stabilization/camera-shake.d.ts +42 -18
  616. package/dist/stabilization/camera-shake.js +43 -20
  617. package/dist/stabilization/camera-shake.js.map +1 -1
  618. package/dist/stabilization/system.d.ts +44 -41
  619. package/dist/stabilization/system.js +196 -108
  620. package/dist/stabilization/system.js.map +1 -1
  621. package/docs/AGENT_GUIDE.md +183 -0
  622. package/docs/API_REFERENCE.md +761 -2
  623. package/docs/QUICK_START.md +495 -0
  624. package/docs/USAGE.md +1719 -714
  625. package/docs/api/camera-equivalent-focal-length.md +6 -7
  626. package/docs/api/camera-field-of-view.md +16 -8
  627. package/docs/api/camera-lens-projection.md +246 -0
  628. package/docs/api/camera-projected-object-size.md +6 -5
  629. package/docs/api/capture-capture-export-metadata.md +10 -10
  630. package/docs/api/capture-dng-import.md +134 -0
  631. package/docs/api/capture-environment-raw-producer.md +17 -11
  632. package/docs/api/capture-export-jpeg.md +16 -0
  633. package/docs/api/capture-focus-control.md +25 -47
  634. package/docs/api/capture-linear-encoding.md +21 -12
  635. package/docs/api/capture-lossless-jpeg.md +49 -0
  636. package/docs/api/capture-native-environment-optical-stage.md +75 -0
  637. package/docs/api/capture-native-environment-raw.md +161 -4
  638. package/docs/api/capture-native-raw-development.md +69 -8
  639. package/docs/api/capture-native-raw-dng.md +84 -0
  640. package/docs/api/capture-native-raw.md +21 -10
  641. package/docs/api/capture-packed-sensor-raw.md +156 -0
  642. package/docs/api/capture-photographic-export.md +69 -31
  643. package/docs/api/capture-raw-frame-reconstruction.md +8 -8
  644. package/docs/api/capture-raw-white-level.md +37 -0
  645. package/docs/api/capture-release-sequence.md +6 -7
  646. package/docs/api/capture-sensor-raw-frame.md +6 -6
  647. package/docs/api/capture-sensor-raw-producer.md +17 -11
  648. package/docs/api/capture-simulated-capture.md +15 -15
  649. package/docs/api/color-camera-color-matrix.md +103 -0
  650. package/docs/api/color-capture-color.md +22 -11
  651. package/docs/api/color-chromatic-adaptation.md +82 -0
  652. package/docs/api/color-color-difference.md +134 -0
  653. package/docs/api/color-color-matching-functions.md +259 -0
  654. package/docs/api/color-colorimetry-math.md +54 -0
  655. package/docs/api/color-gamut-mapping.md +72 -0
  656. package/docs/api/color-illuminants.md +280 -0
  657. package/docs/api/color-rgb-color-spaces.md +151 -0
  658. package/docs/api/color-sensor-color-development.md +27 -0
  659. package/docs/api/color-srgb-icc.md +2 -4
  660. package/docs/api/color-white-balance.md +95 -19
  661. package/docs/api/composition-image-formation-plan.md +124 -95
  662. package/docs/api/composition-plan-consumer.md +7 -7
  663. package/docs/api/core-calculation-result.md +18 -14
  664. package/docs/api/core-configuration-error.md +1 -1
  665. package/docs/api/core-image-formation.md +7 -7
  666. package/docs/api/core-scientific-assurance.md +12 -10
  667. package/docs/api/core-spectral-composition.md +14 -14
  668. package/docs/api/core-spectral.md +6 -6
  669. package/docs/api/core-validation.md +3 -3
  670. package/docs/api/core-version.md +7 -6
  671. package/docs/api/equipment-exposure-capabilities.md +11 -10
  672. package/docs/api/equipment-generic-tier-assets.md +7 -2
  673. package/docs/api/equipment-generic-tier-presets.md +6 -6
  674. package/docs/api/equipment-iso-capabilities.md +18 -18
  675. package/docs/api/equipment-metering-capabilities.md +6 -6
  676. package/docs/api/equipment-release-capabilities.md +4 -4
  677. package/docs/api/exports.json +2213 -8
  678. package/docs/api/exposure-exposure-duration-control.md +9 -9
  679. package/docs/api/exposure-exposure-mode-resolver.md +35 -31
  680. package/docs/api/exposure-exposure.md +10 -10
  681. package/docs/api/exposure-flash-ttl.md +182 -0
  682. package/docs/api/exposure-flash.md +183 -28
  683. package/docs/api/exposure-metering-scene-radiance.md +11 -10
  684. package/docs/api/exposure-metering-target.md +9 -8
  685. package/docs/api/exposure-metering-temporal.md +8 -8
  686. package/docs/api/exposure-metering.md +69 -9
  687. package/docs/api/exposure-program-line.md +6 -5
  688. package/docs/api/facade-chart-radiance-batch.md +96 -0
  689. package/docs/api/facade-chart-scenes.md +240 -0
  690. package/docs/api/facade-scene-radiance.md +122 -0
  691. package/docs/api/facade-simulate-capture.md +324 -0
  692. package/docs/api/gpu-image-kernel-accelerator.md +157 -0
  693. package/docs/api/gpu-image-kernel-execution.md +152 -0
  694. package/docs/api/motion-camera-rotation.md +43 -26
  695. package/docs/api/motion-capture-rotation-inverse-mapping.md +24 -23
  696. package/docs/api/motion-capture-rotation-temporal-quadrature.md +22 -22
  697. package/docs/api/motion-capture-rotation-trajectory.md +15 -15
  698. package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +15 -14
  699. package/docs/api/motion-extended-object-projection.md +10 -8
  700. package/docs/api/motion-projected-motion.md +8 -8
  701. package/docs/api/motion-temporal-exposure-sum.md +98 -0
  702. package/docs/api/motion-video-sequence.md +159 -0
  703. package/docs/api/optics-aperture.md +8 -8
  704. package/docs/api/optics-atmospheric-haze.md +104 -0
  705. package/docs/api/optics-brown-conrady-distortion.md +123 -0
  706. package/docs/api/optics-circle-of-confusion.md +5 -4
  707. package/docs/api/optics-complex-pupil-psf.md +57 -16
  708. package/docs/api/optics-depth-of-field.md +12 -6
  709. package/docs/api/optics-diffraction.md +8 -7
  710. package/docs/api/optics-focus-breathing.md +104 -16
  711. package/docs/api/optics-focus-state.md +9 -10
  712. package/docs/api/optics-front-of-lens-filter.md +72 -14
  713. package/docs/api/optics-illumination-vignetting.md +10 -10
  714. package/docs/api/optics-irradiance-convolution.md +95 -0
  715. package/docs/api/optics-lateral-chromatic-aberration.md +22 -21
  716. package/docs/api/optics-lens-psf-kernels.md +72 -0
  717. package/docs/api/optics-lens-psf-profile.md +48 -26
  718. package/docs/api/optics-longitudinal-chromatic-aberration.md +128 -0
  719. package/docs/api/optics-polygon-diffraction.md +78 -13
  720. package/docs/api/optics-profile-contract.md +4 -4
  721. package/docs/api/optics-psf-foundation.md +12 -12
  722. package/docs/api/optics-pupil-vignetting.md +132 -0
  723. package/docs/api/optics-radial-distortion.md +12 -12
  724. package/docs/api/optics-scene-to-sensor-irradiance.md +25 -14
  725. package/docs/api/optics-scene-to-sensor-quadrature.md +15 -12
  726. package/docs/api/optics-sensor-aperture-rays.md +3 -2
  727. package/docs/api/optics-sensor-environment-query.md +52 -9
  728. package/docs/api/optics-sensor-psf-quadrature.md +13 -10
  729. package/docs/api/optics-stray-light.md +12 -11
  730. package/docs/api/optics-thin-lens.md +4 -3
  731. package/docs/api/optics-zernike-wavefront.md +229 -0
  732. package/docs/api/output-capture-corrected-sdr.md +10 -7
  733. package/docs/api/output-capture-geometry.md +35 -36
  734. package/docs/api/output-capture-sdr.md +4 -4
  735. package/docs/api/output-crop.md +7 -4
  736. package/docs/api/output-geometric-transforms.md +65 -19
  737. package/docs/api/output-lens-corrections.md +17 -15
  738. package/docs/api/output-native-capture-sdr.md +26 -13
  739. package/docs/api/output-png-encoder.md +105 -0
  740. package/docs/api/output-print-contrast-reference.md +8 -8
  741. package/docs/api/output-print-detail.md +14 -14
  742. package/docs/api/output-print-jpeg.md +22 -5
  743. package/docs/api/output-print-plan.md +18 -18
  744. package/docs/api/output-print-region-statistics.md +14 -14
  745. package/docs/api/output-sdr-rendering.md +52 -10
  746. package/docs/api/output-subject-framing-crop.md +5 -6
  747. package/docs/api/processing-demosaic.md +120 -0
  748. package/docs/api/processing-denoise.md +148 -0
  749. package/docs/api/processing-focus-stacking.md +41 -0
  750. package/docs/api/processing-hdr.md +113 -0
  751. package/docs/api/processing-panorama.md +82 -0
  752. package/docs/api/processing-processing-task.md +107 -0
  753. package/docs/api/processing-tone-mapping.md +142 -0
  754. package/docs/api/schema-camera.md +6 -4
  755. package/docs/api/schema-illumination-spectral.md +10 -11
  756. package/docs/api/schema-illumination-temporal.md +13 -15
  757. package/docs/api/schema-illumination.md +4 -4
  758. package/docs/api/schema-scene-radiance-temporal.md +10 -11
  759. package/docs/api/schema-scene-radiance.md +18 -17
  760. package/docs/api/schema-scene.md +9 -9
  761. package/docs/api/schema-validation.md +1 -1
  762. package/docs/api/sensor-accumulated-charge.md +12 -20
  763. package/docs/api/sensor-architecture.md +15 -16
  764. package/docs/api/sensor-camera-saturation-capacity.md +9 -11
  765. package/docs/api/sensor-capture-color-sampling-binding.md +47 -51
  766. package/docs/api/sensor-capture-mode-timing.md +9 -9
  767. package/docs/api/sensor-capture-mode.md +29 -30
  768. package/docs/api/sensor-color-sampling.md +31 -33
  769. package/docs/api/sensor-constant-rate-temporal-integration.md +10 -11
  770. package/docs/api/sensor-dark-current.md +30 -14
  771. package/docs/api/sensor-environment-photo-signal.md +13 -6
  772. package/docs/api/sensor-eqe-electron-rate.md +9 -8
  773. package/docs/api/sensor-eqe-local-exposure.md +18 -17
  774. package/docs/api/sensor-eqe-temporal-exposure.md +12 -11
  775. package/docs/api/sensor-exposure-window.md +24 -24
  776. package/docs/api/sensor-fixed-pattern-noise.md +104 -0
  777. package/docs/api/sensor-iso-gain.md +63 -0
  778. package/docs/api/sensor-iso-signal-chain.md +13 -22
  779. package/docs/api/sensor-local-exposure-binding.md +12 -13
  780. package/docs/api/sensor-optical-stack.md +37 -40
  781. package/docs/api/sensor-photon-energy.md +10 -11
  782. package/docs/api/sensor-physical-charge-capacity.md +8 -13
  783. package/docs/api/sensor-pixel-pitch.md +1 -1
  784. package/docs/api/sensor-radiometry-readiness.md +9 -9
  785. package/docs/api/sensor-raw-readout.md +118 -52
  786. package/docs/api/sensor-raw-reconstruction.md +97 -20
  787. package/docs/api/sensor-readout-exposure-linkage.md +120 -24
  788. package/docs/api/sensor-readout-timing.md +33 -35
  789. package/docs/api/sensor-response-application-compatibility.md +9 -11
  790. package/docs/api/sensor-response-operating-range.md +14 -18
  791. package/docs/api/sensor-responsivity-photocurrent.md +9 -12
  792. package/docs/api/sensor-sampling-aperture.md +22 -25
  793. package/docs/api/sensor-scene-eqe-temporal-exposure.md +9 -8
  794. package/docs/api/sensor-sensor-geometry.md +23 -24
  795. package/docs/api/sensor-signal-noise.md +10 -10
  796. package/docs/api/sensor-spatial-sample-reduction.md +27 -30
  797. package/docs/api/sensor-spatial-sampling-quadrature.md +37 -39
  798. package/docs/api/sensor-spatio-spectral-reduction.md +27 -29
  799. package/docs/api/sensor-spectral-coverage.md +5 -5
  800. package/docs/api/sensor-spectral-quadrature.md +33 -35
  801. package/docs/api/sensor-spectral-response.md +28 -16
  802. package/docs/api/sensor-temporal-photo-signal.md +6 -6
  803. package/docs/api/simulation-poc-simulation.md +17 -16
  804. package/docs/api/stabilization-camera-shake.md +29 -10
  805. package/docs/api/stabilization-system.md +25 -21
  806. package/docs/examples/production-request.json +3821 -2157
  807. package/docs/examples/simulate-capture.mjs +14 -0
  808. package/llms.txt +35 -0
  809. package/package.json +32 -12
  810. package/AGENTS.md +0 -674
  811. package/CONTRIBUTING.md +0 -76
  812. package/DCO +0 -33
  813. package/dist/camera/equivalent-focal-length.d.ts.map +0 -1
  814. package/dist/camera/field-of-view.d.ts.map +0 -1
  815. package/dist/camera/projected-object-size.d.ts.map +0 -1
  816. package/dist/capture/capture-export-metadata.d.ts.map +0 -1
  817. package/dist/capture/environment-raw-producer.d.ts.map +0 -1
  818. package/dist/capture/export-jpeg.d.ts.map +0 -1
  819. package/dist/capture/export-tiff.d.ts.map +0 -1
  820. package/dist/capture/focus-control.d.ts.map +0 -1
  821. package/dist/capture/linear-encoding.d.ts.map +0 -1
  822. package/dist/capture/native-environment-raw.d.ts.map +0 -1
  823. package/dist/capture/native-raw-development.d.ts.map +0 -1
  824. package/dist/capture/native-raw.d.ts.map +0 -1
  825. package/dist/capture/photographic-export.d.ts.map +0 -1
  826. package/dist/capture/raw-frame-limits.d.ts.map +0 -1
  827. package/dist/capture/raw-frame-reconstruction.d.ts.map +0 -1
  828. package/dist/capture/release-sequence.d.ts.map +0 -1
  829. package/dist/capture/sensor-raw-frame.d.ts.map +0 -1
  830. package/dist/capture/sensor-raw-producer.d.ts.map +0 -1
  831. package/dist/capture/simulated-capture.d.ts.map +0 -1
  832. package/dist/color/capture-color.d.ts.map +0 -1
  833. package/dist/color/sensor-color-development.d.ts.map +0 -1
  834. package/dist/color/srgb-icc.d.ts.map +0 -1
  835. package/dist/color/srgb-transfer.d.ts.map +0 -1
  836. package/dist/color/white-balance.d.ts.map +0 -1
  837. package/dist/composition/image-formation-plan.d.ts.map +0 -1
  838. package/dist/composition/plan-consumer.d.ts.map +0 -1
  839. package/dist/core/calculation-result.d.ts.map +0 -1
  840. package/dist/core/canonical-json.d.ts.map +0 -1
  841. package/dist/core/configuration-error.d.ts.map +0 -1
  842. package/dist/core/evidence-provenance.d.ts.map +0 -1
  843. package/dist/core/image-formation.d.ts.map +0 -1
  844. package/dist/core/owned-data.d.ts.map +0 -1
  845. package/dist/core/record-validation.d.ts.map +0 -1
  846. package/dist/core/scientific-assurance.d.ts.map +0 -1
  847. package/dist/core/spectral-composition.d.ts.map +0 -1
  848. package/dist/core/spectral.d.ts.map +0 -1
  849. package/dist/core/validation.d.ts.map +0 -1
  850. package/dist/core/version.d.ts.map +0 -1
  851. package/dist/equipment/exposure-capabilities.d.ts.map +0 -1
  852. package/dist/equipment/generic-tier-assets.d.ts.map +0 -1
  853. package/dist/equipment/generic-tier-presets.d.ts.map +0 -1
  854. package/dist/equipment/iso-capabilities.d.ts.map +0 -1
  855. package/dist/equipment/metering-capabilities.d.ts.map +0 -1
  856. package/dist/equipment/release-capabilities.d.ts.map +0 -1
  857. package/dist/exposure/exposure-duration-control.d.ts.map +0 -1
  858. package/dist/exposure/exposure-mode-resolver.d.ts.map +0 -1
  859. package/dist/exposure/exposure.d.ts.map +0 -1
  860. package/dist/exposure/flash.d.ts.map +0 -1
  861. package/dist/exposure/metering-scene-radiance.d.ts.map +0 -1
  862. package/dist/exposure/metering-target.d.ts.map +0 -1
  863. package/dist/exposure/metering-temporal.d.ts.map +0 -1
  864. package/dist/exposure/metering.d.ts.map +0 -1
  865. package/dist/exposure/program-line.d.ts.map +0 -1
  866. package/dist/index.d.ts.map +0 -1
  867. package/dist/motion/camera-rotation.d.ts.map +0 -1
  868. package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +0 -1
  869. package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +0 -1
  870. package/dist/motion/capture-rotation-trajectory.d.ts.map +0 -1
  871. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +0 -1
  872. package/dist/motion/extended-object-projection.d.ts.map +0 -1
  873. package/dist/motion/projected-motion.d.ts.map +0 -1
  874. package/dist/optics/aperture.d.ts.map +0 -1
  875. package/dist/optics/circle-of-confusion.d.ts.map +0 -1
  876. package/dist/optics/complex-pupil-psf.d.ts.map +0 -1
  877. package/dist/optics/depth-of-field.d.ts.map +0 -1
  878. package/dist/optics/diffraction.d.ts.map +0 -1
  879. package/dist/optics/focus-breathing.d.ts.map +0 -1
  880. package/dist/optics/focus-state.d.ts.map +0 -1
  881. package/dist/optics/front-of-lens-filter.d.ts.map +0 -1
  882. package/dist/optics/illumination-vignetting.d.ts.map +0 -1
  883. package/dist/optics/lateral-chromatic-aberration.d.ts.map +0 -1
  884. package/dist/optics/lens-psf-profile.d.ts.map +0 -1
  885. package/dist/optics/polygon-diffraction.d.ts.map +0 -1
  886. package/dist/optics/profile-contract.d.ts.map +0 -1
  887. package/dist/optics/psf-foundation.d.ts.map +0 -1
  888. package/dist/optics/radial-distortion.d.ts.map +0 -1
  889. package/dist/optics/scene-to-sensor-irradiance.d.ts.map +0 -1
  890. package/dist/optics/scene-to-sensor-quadrature.d.ts.map +0 -1
  891. package/dist/optics/sensor-aperture-rays.d.ts.map +0 -1
  892. package/dist/optics/sensor-environment-query.d.ts.map +0 -1
  893. package/dist/optics/sensor-psf-quadrature.d.ts.map +0 -1
  894. package/dist/optics/sensor-psf-support.d.ts.map +0 -1
  895. package/dist/optics/stray-light.d.ts.map +0 -1
  896. package/dist/optics/thin-lens.d.ts.map +0 -1
  897. package/dist/output/capture-corrected-sdr.d.ts.map +0 -1
  898. package/dist/output/capture-geometry.d.ts.map +0 -1
  899. package/dist/output/capture-sdr.d.ts.map +0 -1
  900. package/dist/output/crop.d.ts.map +0 -1
  901. package/dist/output/geometric-transforms.d.ts.map +0 -1
  902. package/dist/output/lens-corrections.d.ts.map +0 -1
  903. package/dist/output/native-capture-sdr.d.ts.map +0 -1
  904. package/dist/output/print-contrast-reference.d.ts.map +0 -1
  905. package/dist/output/print-detail.d.ts.map +0 -1
  906. package/dist/output/print-jpeg.d.ts.map +0 -1
  907. package/dist/output/print-plan.d.ts.map +0 -1
  908. package/dist/output/print-region-statistics.d.ts.map +0 -1
  909. package/dist/output/sdr-rendering.d.ts.map +0 -1
  910. package/dist/output/subject-framing-crop.d.ts.map +0 -1
  911. package/dist/schema/camera.d.ts.map +0 -1
  912. package/dist/schema/camera.js +0 -3
  913. package/dist/schema/camera.js.map +0 -1
  914. package/dist/schema/illumination-spectral.d.ts.map +0 -1
  915. package/dist/schema/illumination-temporal.d.ts.map +0 -1
  916. package/dist/schema/illumination.d.ts.map +0 -1
  917. package/dist/schema/scene-radiance-temporal.d.ts.map +0 -1
  918. package/dist/schema/scene-radiance.d.ts.map +0 -1
  919. package/dist/schema/scene.d.ts.map +0 -1
  920. package/dist/schema/scene.js +0 -3
  921. package/dist/schema/scene.js.map +0 -1
  922. package/dist/schema/validation.d.ts.map +0 -1
  923. package/dist/sensor/accumulated-charge.d.ts.map +0 -1
  924. package/dist/sensor/architecture.d.ts.map +0 -1
  925. package/dist/sensor/camera-saturation-capacity.d.ts.map +0 -1
  926. package/dist/sensor/capture-color-sampling-binding.d.ts.map +0 -1
  927. package/dist/sensor/capture-mode-timing.d.ts.map +0 -1
  928. package/dist/sensor/capture-mode.d.ts.map +0 -1
  929. package/dist/sensor/color-sampling.d.ts.map +0 -1
  930. package/dist/sensor/constant-rate-temporal-integration.d.ts.map +0 -1
  931. package/dist/sensor/dark-current.d.ts.map +0 -1
  932. package/dist/sensor/environment-photo-signal.d.ts.map +0 -1
  933. package/dist/sensor/eqe-electron-rate.d.ts.map +0 -1
  934. package/dist/sensor/eqe-local-exposure.d.ts.map +0 -1
  935. package/dist/sensor/eqe-temporal-exposure.d.ts.map +0 -1
  936. package/dist/sensor/exposure-window.d.ts.map +0 -1
  937. package/dist/sensor/iso-signal-chain.d.ts.map +0 -1
  938. package/dist/sensor/local-exposure-binding.d.ts.map +0 -1
  939. package/dist/sensor/optical-stack.d.ts.map +0 -1
  940. package/dist/sensor/photon-energy.d.ts.map +0 -1
  941. package/dist/sensor/physical-charge-capacity.d.ts.map +0 -1
  942. package/dist/sensor/pixel-pitch.d.ts.map +0 -1
  943. package/dist/sensor/radiometry-readiness.d.ts.map +0 -1
  944. package/dist/sensor/raw-readout.d.ts.map +0 -1
  945. package/dist/sensor/raw-reconstruction.d.ts.map +0 -1
  946. package/dist/sensor/readout-exposure-linkage.d.ts.map +0 -1
  947. package/dist/sensor/readout-timing.d.ts.map +0 -1
  948. package/dist/sensor/response-application-compatibility.d.ts.map +0 -1
  949. package/dist/sensor/response-operating-range.d.ts.map +0 -1
  950. package/dist/sensor/responsivity-photocurrent.d.ts.map +0 -1
  951. package/dist/sensor/sampling-aperture.d.ts.map +0 -1
  952. package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +0 -1
  953. package/dist/sensor/sensor-geometry.d.ts.map +0 -1
  954. package/dist/sensor/signal-noise.d.ts.map +0 -1
  955. package/dist/sensor/spatial-sample-reduction.d.ts.map +0 -1
  956. package/dist/sensor/spatial-sampling-quadrature.d.ts.map +0 -1
  957. package/dist/sensor/spatio-spectral-reduction.d.ts.map +0 -1
  958. package/dist/sensor/spectral-coverage.d.ts.map +0 -1
  959. package/dist/sensor/spectral-quadrature.d.ts.map +0 -1
  960. package/dist/sensor/spectral-response.d.ts.map +0 -1
  961. package/dist/sensor/temporal-eqe-sum.d.ts.map +0 -1
  962. package/dist/sensor/temporal-photo-signal.d.ts.map +0 -1
  963. package/dist/sensor/temporal-sample-binding.d.ts.map +0 -1
  964. package/dist/simulation/poc-simulation.d.ts.map +0 -1
  965. package/dist/stabilization/camera-shake.d.ts.map +0 -1
  966. package/dist/stabilization/system.d.ts.map +0 -1
  967. package/docs/API_STYLE.md +0 -235
  968. package/docs/ARCHITECTURE.md +0 -356
  969. package/docs/AUTOMATION_COORDINATION.md +0 -190
  970. package/docs/CAPTURE_COLOR.md +0 -25
  971. package/docs/CAPTURE_CORRECTED_SDR.md +0 -25
  972. package/docs/CAPTURE_EXPORT_METADATA.md +0 -27
  973. package/docs/CAPTURE_SDR.md +0 -22
  974. package/docs/DENSE_PUPIL_QUALIFICATION.md +0 -121
  975. package/docs/DEVELOPERS.md +0 -68
  976. package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
  977. package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
  978. package/docs/EXPORT_ACCEPTANCE.md +0 -133
  979. package/docs/GENERIC_TIER_PRESETS.md +0 -269
  980. package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
  981. package/docs/IMAGE_FORMATION.md +0 -247
  982. package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
  983. package/docs/MOTION_AND_SIGNAL.md +0 -250
  984. package/docs/NATIVE_CAPTURE_SDR.md +0 -70
  985. package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
  986. package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
  987. package/docs/NATIVE_RAW_AND_PRINT.md +0 -54
  988. package/docs/NUMERICAL_CORRECTNESS.md +0 -191
  989. package/docs/PERFORMANCE_BASELINE.md +0 -56
  990. package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
  991. package/docs/PHYSICS_FOUNDATION.md +0 -426
  992. package/docs/POC_API.md +0 -278
  993. package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
  994. package/docs/POC_PROJECTION_REUSE.md +0 -124
  995. package/docs/PRINT_195_196_REVIEW.md +0 -93
  996. package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
  997. package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
  998. package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
  999. package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
  1000. package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
  1001. package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
  1002. package/docs/PRINT_PLANNING.md +0 -75
  1003. package/docs/PRINT_REGION_STATISTICS.md +0 -38
  1004. package/docs/PROCESSED_OUTPUT.md +0 -157
  1005. package/docs/PRODUCTION_COMPOSITION.md +0 -373
  1006. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
  1007. package/docs/PROVENANCE.md +0 -115
  1008. package/docs/PSF_FOUNDATION.md +0 -165
  1009. package/docs/RAW_FRAME_ENVELOPE.md +0 -56
  1010. package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
  1011. package/docs/RELEASE_1_0.md +0 -66
  1012. package/docs/RELEASE_1_0_1.md +0 -61
  1013. package/docs/RELEASE_1_1_0.md +0 -25
  1014. package/docs/RELEASE_1_2_0.md +0 -51
  1015. package/docs/RELEASE_1_3_0.md +0 -15
  1016. package/docs/RELEASE_1_4_0.md +0 -23
  1017. package/docs/RELEASE_1_5_0.md +0 -105
  1018. package/docs/RELEASE_AUDIT.md +0 -39
  1019. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
  1020. package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
  1021. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
  1022. package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
  1023. package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
  1024. package/docs/SDR_RENDERING.md +0 -33
  1025. package/docs/SENSOR_APERTURE_RAYS.md +0 -23
  1026. package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
  1027. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
  1028. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
  1029. package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
  1030. package/docs/SENSOR_RAW_FRAME.md +0 -20
  1031. package/docs/SENSOR_RAW_PRODUCER.md +0 -77
  1032. package/docs/SEPARABLE_EMISSION_DRAFT.md +0 -103
  1033. package/docs/SIGNAL_CONFORMANCE.md +0 -23
  1034. package/docs/SIMULATED_CAPTURE.md +0 -65
  1035. package/docs/STABILIZATION.md +0 -234
  1036. package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
  1037. package/docs/TIER_ACCEPTANCE.md +0 -129
  1038. package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
  1039. package/docs/V1_COMPOSITION_MAP.md +0 -123
  1040. package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
  1041. package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
  1042. package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
  1043. package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
  1044. package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
  1045. package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
  1046. package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
  1047. package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
  1048. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
  1049. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
  1050. package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
  1051. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
  1052. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
  1053. package/docs/licenses/castleCSF-MIT.txt +0 -21
  1054. package/docs/validation/dense-pupil-2026-10-06/pilot.jsonl +0 -6
  1055. package/docs/validation/documentation-fragments.json +0 -212
  1056. package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
  1057. package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
  1058. package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
  1059. package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
  1060. package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
  1061. package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
  1062. package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
  1063. package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
  1064. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
  1065. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
  1066. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
  1067. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
  1068. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
  1069. package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
  1070. package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
  1071. package/docs/validation/print-196-candidate-capabilities.json +0 -28
  1072. package/docs/validation/print-196-candidate-evidence.json +0 -356
  1073. package/docs/validation/print-196-engine-acceptance.json +0 -81
  1074. package/docs/validation/print-detail-capabilities.json +0 -103
  1075. package/docs/validation/print-detail-jpeg-evidence.json +0 -116
  1076. package/docs/validation/print-detail-sdr-evidence.json +0 -81
  1077. package/docs/validation/release-audit-inventory.json +0 -1306
  1078. package/docs/validation/tier-acceptance-report-v1.json +0 -2538
@@ -1 +1 @@
1
- {"version":3,"file":"spectral-quadrature.js","sourceRoot":"","sources":["../../src/sensor/spectral-quadrature.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spectral-quadrature.js","sourceRoot":"","sources":["../../src/sensor/spectral-quadrature.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Spectral quadrature: the wavelength sample points (nodes) and step widths used to integrate light\n * over wavelength for one sensor response channel.\n *\n * Each node is the midpoint of a wavelength interval, with its width dλ in nanometres. The intervals\n * stay inside the range the response supports. Lining nodes up with curve breakpoints does not prove\n * the integral has converged. Discrete (delta-like) emission lines need their own integration and are\n * never silently widened into continuous bins.\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 type { EvidenceProvenance } from \"../core/evidence-provenance.js\";\nimport { InvalidScientificInputError } from \"../core/validation.js\";\nimport type {\n SpectralWavelengthBasis,\n SpectralWavelengthRangeNanometers\n} from \"../core/spectral.js\";\nimport {\n parseSensorColorSamplingProfile,\n type SensorColorSamplingProfile\n} from \"./color-sampling.js\";\nimport {\n createSensorSpectralResponseChannelBinding,\n parseSensorSpectralResponseProfile,\n resolveSensorSpectralResponseAtWavelength,\n type SensorSpectralReferenceConditions,\n type SensorSpectralResponseProfile,\n type SensorSpectralResponseScientificStatus,\n type SensorSpectralResponseUncertainty\n} from \"./spectral-response.js\";\nimport { requireInputKeys } from \"../core/record-validation.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\n\nconst MAX_SPECTRAL_QUADRATURE_NODES = 100_000;\n\nexport type SensorSpectralWavelengthRangeNanometers =\n SpectralWavelengthRangeNanometers;\n\nexport interface CalculateSensorSpectralQuadratureInput {\n colorSamplingProfile: SensorColorSamplingProfile;\n spectralResponseProfile: SensorSpectralResponseProfile;\n channelId: string;\n wavelengthBasis: SpectralWavelengthBasis;\n /**\n * Wavelength interval to sample. It is checked only against the range the\n * sensor response supports, not against scene-spectrum or optical-transmission\n * coverage.\n */\n wavelengthRangeNanometers:\n SensorSpectralWavelengthRangeNanometers;\n /**\n * Strict upper limit on the width of each midpoint subinterval.\n *\n * Response breakpoints and any additional breakpoints split the requested\n * range first. Each segment is then subdivided until every subinterval is\n * no wider than this value.\n */\n maximumSubintervalWidthNanometers: number;\n /**\n * Optional strictly increasing wavelength breakpoints from other continuous\n * spectral inputs, such as the interpolation points of a scene spectrum or of\n * optical transmission. Values must be strictly inside the requested range.\n *\n * Passing them does not claim those other inputs are available or valid over\n * the requested range.\n */\n additionalBreakpointsNanometers?:\n readonly number[];\n}\n\nexport interface SensorSpectralQuadratureNode {\n spectralSampleIndex: number;\n segmentIndex: number;\n subdivisionIndex: number;\n segmentSubdivisionCount: number;\n /**\n * Midpoint wavelength for this subinterval. Units: nm in wavelengthBasis.\n */\n wavelengthNanometers: number;\n /**\n * dλ (wavelength width) this node stands for. Units: nm.\n *\n * It is only a wavelength width. It is not response-weighted throughput,\n * a photon count, radiant energy, current or a dimensionless probability.\n */\n wavelengthMeasureNanometers: number;\n /**\n * The wavelength width divided by the requested range width (dimensionless).\n *\n * Useful for averages, but it is not a sensor-response weight.\n */\n normalizedWavelengthWeight: number;\n}\n\nexport interface SensorSpectralQuadrature {\n profileId: string;\n colorSamplingProfileId: string;\n channelId: string;\n sourceResponseKind:\n SensorSpectralResponseProfile[\"channels\"][number][\"kind\"];\n responseScope:\n SensorSpectralResponseProfile[\"channels\"][number][\"responseScope\"];\n responseScientificStatus:\n SensorSpectralResponseScientificStatus;\n responseUncertainty:\n SensorSpectralResponseUncertainty;\n responseChannelBinding?: import(\"./spectral-response.js\").SensorSpectralResponseChannelBinding;\n responseReferenceConditions?:\n SensorSpectralReferenceConditions;\n wavelengthBasis: SpectralWavelengthBasis;\n wavelengthBasisResolved: boolean;\n wavelengthRangeNanometers:\n SensorSpectralWavelengthRangeNanometers;\n responseDeclaredWavelengthRangeNanometers:\n SensorSpectralWavelengthRangeNanometers;\n quadratureScheme:\n \"response-breakpoint-aware-bounded-midpoint\";\n segmentBoundarySource:\n \"requested-range-plus-response-knots-plus-optional-additional-breakpoints\";\n /**\n * Sorted, unique segment boundaries, including the ends of the requested range.\n */\n segmentBoundariesNanometers:\n readonly number[];\n maximumSubintervalWidthNanometers: number;\n segmentCount: number;\n totalNodeCount: number;\n normalizedWavelengthWeightSum: number;\n wavelengthMeasureSumNanometers: number;\n nodes: readonly SensorSpectralQuadratureNode[];\n responseKnotAlignmentIncluded: true;\n componentEvidence: {\n colorSamplingProfile: readonly EvidenceProvenance[];\n profile: readonly EvidenceProvenance[];\n channel: readonly EvidenceProvenance[];\n curves:\n readonly (readonly EvidenceProvenance[])[];\n };\n /**\n * Fixed statements of what this result does not include.\n */\n responseValuesIncluded: false;\n responseApplicationPerformed: false;\n sourceSpectralValuesIncluded: false;\n spectralIrradianceIncluded: false;\n spectralPhotonIrradianceIncluded: false;\n commonSpectralCoverageValidated: false;\n continuousSpectralDensityQuadratureOnly: true;\n discreteLineSpectrumIncluded: false;\n opticalTransmissionIncludedByQuadrature: false;\n wavelengthIntegrationPerformed: false;\n spatialIntegrationPerformed: false;\n temporalIntegrationPerformed: false;\n photonsCalculated: false;\n electronsCalculated: false;\n rawCodeValueProduced: false;\n convergenceErrorEstimated: false;\n}\n\ninterface ResponseCurveSupport {\n wavelengthBasis: SpectralWavelengthBasis;\n samples: readonly {\n wavelengthNanometers: number;\n }[];\n evidence: readonly EvidenceProvenance[];\n}\n\ninterface SegmentPlan {\n minimum: number;\n maximum: number;\n subdivisionCount: number;\n subintervalWidthNanometers: number;\n}\n\nfunction requirePositiveFinite(\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 + \" must be finite and greater than zero.\"\n );\n }\n return value;\n}\n\nfunction channelResponse(\n profile: SensorSpectralResponseProfile,\n channelId: string\n): SensorSpectralResponseProfile[\"channels\"][number] {\n if (\n typeof channelId !== \"string\" ||\n channelId.trim().length === 0\n ) {\n throw new InvalidConfigurationError(\n \"channelId must be a non-empty string.\"\n );\n }\n\n const response = profile.channels.find(\n (entry) => entry.channelId === channelId\n );\n if (response === undefined) {\n throw new InvalidScientificInputError(\n \"No spectral response is declared for the requested channelId.\"\n );\n }\n return response;\n}\n\nfunction responseCurves(\n response:\n SensorSpectralResponseProfile[\"channels\"][number]\n): readonly ResponseCurveSupport[] {\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\nfunction usableResponseRange(\n curves: readonly ResponseCurveSupport[]\n): SensorSpectralWavelengthRangeNanometers {\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\n if (!(minimum < maximum)) {\n throw new InvalidScientificInputError(\n \"Spectral-response curves do not have a usable overlapping wavelength interval.\"\n );\n }\n\n return { minimum, maximum };\n}\n\nfunction parseRequestedRange(\n input:\n SensorSpectralWavelengthRangeNanometers,\n usable:\n SensorSpectralWavelengthRangeNanometers\n): SensorSpectralWavelengthRangeNanometers {\n if (\n typeof input !== \"object\" ||\n input === null\n ) {\n throw new InvalidConfigurationError(\n \"wavelengthRangeNanometers must be an object.\"\n );\n }\n\n const minimum = requirePositiveFinite(\n input.minimum,\n \"wavelengthRangeNanometers.minimum\"\n );\n const maximum = requirePositiveFinite(\n input.maximum,\n \"wavelengthRangeNanometers.maximum\"\n );\n\n if (!(minimum < maximum)) {\n throw new InvalidScientificInputError(\n \"wavelengthRangeNanometers.minimum must be less than maximum.\"\n );\n }\n\n if (\n minimum < usable.minimum ||\n maximum > usable.maximum\n ) {\n throw new InvalidScientificInputError(\n \"Requested wavelength range must remain inside the usable spectral-response range; clipping, extrapolation, and implicit zero-fill are not permitted.\"\n );\n }\n\n return { minimum, maximum };\n}\n\nfunction additionalBreakpoints(\n value: readonly number[] | undefined,\n range:\n SensorSpectralWavelengthRangeNanometers\n): readonly number[] {\n if (value === undefined) {\n return [];\n }\n if (!Array.isArray(value)) {\n throw new InvalidConfigurationError(\n \"additionalBreakpointsNanometers must be an array when supplied.\"\n );\n }\n if (\n value.length >=\n MAX_SPECTRAL_QUADRATURE_NODES\n ) {\n throw new InvalidScientificInputError(\n \"additionalBreakpointsNanometers contains too many entries for the spectral quadrature safety limit.\"\n );\n }\n\n let previous =\n Number.NEGATIVE_INFINITY;\n\n return value.map(\n (entry, index) => {\n const wavelength =\n requirePositiveFinite(\n entry,\n \"additionalBreakpointsNanometers[\" +\n index +\n \"]\"\n );\n if (\n wavelength <= range.minimum ||\n wavelength >= range.maximum\n ) {\n throw new InvalidScientificInputError(\n \"Additional spectral breakpoints must lie strictly inside the requested wavelength range.\"\n );\n }\n if (wavelength <= previous) {\n throw new InvalidScientificInputError(\n \"additionalBreakpointsNanometers must be strictly increasing with no duplicates.\"\n );\n }\n previous = wavelength;\n return wavelength;\n }\n );\n}\n\nfunction partitionBoundaries(\n curves: readonly ResponseCurveSupport[],\n range:\n SensorSpectralWavelengthRangeNanometers,\n additional:\n readonly number[]\n): readonly number[] {\n const boundaries = new Set<number>([\n range.minimum,\n range.maximum,\n ...additional\n ]);\n\n for (const curve of curves) {\n for (const sample of curve.samples) {\n if (\n sample.wavelengthNanometers >\n range.minimum &&\n sample.wavelengthNanometers <\n range.maximum\n ) {\n boundaries.add(\n sample.wavelengthNanometers\n );\n }\n }\n }\n\n return [...boundaries].sort(\n (a, b) => a - b\n );\n}\n\nfunction planSegments(\n boundaries: readonly number[],\n maximumSubintervalWidthNanometers: number\n): {\n segments: readonly SegmentPlan[];\n totalNodeCount: number;\n} {\n const segments: SegmentPlan[] = [];\n let totalNodeCount = 0;\n\n for (\n let segmentIndex = 0;\n segmentIndex < boundaries.length - 1;\n segmentIndex += 1\n ) {\n const minimum =\n boundaries[segmentIndex]!;\n const maximum =\n boundaries[segmentIndex + 1]!;\n const width =\n maximum - minimum;\n\n if (\n !Number.isFinite(width) ||\n width <= 0\n ) {\n throw new InvalidScientificInputError(\n \"Spectral quadrature segment widths must be finite and greater than zero.\"\n );\n }\n\n const subdivisionCount =\n Math.ceil(\n width /\n maximumSubintervalWidthNanometers\n );\n\n if (\n !Number.isSafeInteger(\n subdivisionCount\n ) ||\n subdivisionCount <= 0\n ) {\n throw new InvalidScientificInputError(\n \"Spectral quadrature segment subdivision count must be a positive safe integer.\"\n );\n }\n\n totalNodeCount +=\n subdivisionCount;\n\n if (\n !Number.isSafeInteger(\n totalNodeCount\n )\n ) {\n throw new InvalidScientificInputError(\n \"Spectral quadrature node count must remain a safe integer.\"\n );\n }\n if (\n totalNodeCount >\n MAX_SPECTRAL_QUADRATURE_NODES\n ) {\n throw new InvalidScientificInputError(\n \"Spectral quadrature node count exceeds the safety limit of \" +\n MAX_SPECTRAL_QUADRATURE_NODES +\n \".\"\n );\n }\n\n segments.push({\n minimum,\n maximum,\n subdivisionCount,\n subintervalWidthNanometers:\n width / subdivisionCount\n });\n }\n\n if (segments.length === 0) {\n throw new InvalidScientificInputError(\n \"Spectral quadrature requires at least one non-empty segment.\"\n );\n }\n\n return {\n segments,\n totalNodeCount\n };\n}\n\nconst SPECTRAL_VALIDATION_TOLERANCE = 1e-10;\n\nfunction requireNonNegativeSafeInteger(\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 approximatelyEqual(\n actual: number,\n expected: number,\n tolerance = SPECTRAL_VALIDATION_TOLERANCE\n): boolean {\n const scale = Math.max(\n 1,\n Math.abs(actual),\n Math.abs(expected)\n );\n return (\n Math.abs(actual - expected) <=\n tolerance * scale\n );\n}\n\n/**\n * Rechecks a supplied wavelength plan (node identities, coverage and widths in nanometres) before it\n * is used.\n *\n * Lining nodes up with breakpoints does not prove convergence. Discrete (delta-like) lines need their\n * own integration and are never silently widened into continuous bins.\n * @param quadrature - The input; see `SensorSpectralQuadrature` for its fields, units and coordinates.\n * @returns The result. Success does not imply calibration.\n *\n * @see docs/API_REFERENCE.md for the package export and its full type definitions.\n */\nexport function validateSensorSpectralQuadrature(\n quadrature: SensorSpectralQuadrature\n): Map<number, SensorSpectralQuadratureNode> {\n if (\n typeof quadrature !== \"object\" ||\n quadrature === null ||\n !Array.isArray(quadrature.nodes)\n ) {\n throw new InvalidConfigurationError(\n \"spectralQuadrature must contain a nodes array.\"\n );\n }\n\n for (const [field, value] of [\n [\"profileId\", quadrature.profileId],\n [\n \"colorSamplingProfileId\",\n quadrature.colorSamplingProfileId\n ],\n [\"channelId\", quadrature.channelId]\n ] as const) {\n if (\n typeof value !== \"string\" ||\n value.trim().length === 0\n ) {\n throw new InvalidConfigurationError(\n \"spectralQuadrature.\" +\n field +\n \" must be a non-empty string.\"\n );\n }\n }\n\n if (\n quadrature.wavelengthBasis !== \"air\" &&\n quadrature.wavelengthBasis !== \"vacuum\" &&\n quadrature.wavelengthBasis !== \"unspecified\"\n ) {\n throw new InvalidConfigurationError(\n \"spectralQuadrature.wavelengthBasis is invalid.\"\n );\n }\n\n const rangeMinimum = requirePositiveFinite(\n quadrature.wavelengthRangeNanometers.minimum,\n \"spectralQuadrature.wavelengthRangeNanometers.minimum\"\n );\n const rangeMaximum = requirePositiveFinite(\n quadrature.wavelengthRangeNanometers.maximum,\n \"spectralQuadrature.wavelengthRangeNanometers.maximum\"\n );\n if (!(rangeMinimum < rangeMaximum)) {\n throw new InvalidScientificInputError(\n \"spectralQuadrature wavelength range minimum must be less than maximum.\"\n );\n }\n\n const maximumSubintervalWidthNanometers =\n requirePositiveFinite(\n quadrature.maximumSubintervalWidthNanometers,\n \"spectralQuadrature.maximumSubintervalWidthNanometers\"\n );\n\n if (\n !Array.isArray(\n quadrature.segmentBoundariesNanometers\n ) ||\n quadrature.segmentBoundariesNanometers.length <\n 2\n ) {\n throw new InvalidScientificInputError(\n \"spectralQuadrature.segmentBoundariesNanometers must contain at least two boundaries.\"\n );\n }\n\n let previousBoundary =\n Number.NEGATIVE_INFINITY;\n quadrature.segmentBoundariesNanometers.forEach(\n (boundary, index) => {\n const parsed = requirePositiveFinite(\n boundary,\n \"spectralQuadrature.segmentBoundariesNanometers[\" +\n index +\n \"]\"\n );\n if (parsed <= previousBoundary) {\n throw new InvalidScientificInputError(\n \"spectralQuadrature.segmentBoundariesNanometers must be strictly increasing.\"\n );\n }\n previousBoundary = parsed;\n }\n );\n\n const segmentCount =\n requireNonNegativeSafeInteger(\n quadrature.segmentCount,\n \"spectralQuadrature.segmentCount\"\n );\n if (\n segmentCount <= 0 ||\n segmentCount !==\n quadrature.segmentBoundariesNanometers.length -\n 1\n ) {\n throw new InvalidScientificInputError(\n \"spectralQuadrature.segmentCount must be positive and match the boundary count.\"\n );\n }\n\n if (\n !approximatelyEqual(\n quadrature.segmentBoundariesNanometers[0]!,\n rangeMinimum\n ) ||\n !approximatelyEqual(\n quadrature.segmentBoundariesNanometers[\n quadrature.segmentBoundariesNanometers.length -\n 1\n ]!,\n rangeMaximum\n )\n ) {\n throw new InvalidScientificInputError(\n \"spectralQuadrature segment boundaries must exactly span the requested wavelength range.\"\n );\n }\n\n const totalNodeCount =\n requireNonNegativeSafeInteger(\n quadrature.totalNodeCount,\n \"spectralQuadrature.totalNodeCount\"\n );\n if (\n totalNodeCount <= 0 ||\n totalNodeCount !== quadrature.nodes.length\n ) {\n throw new InvalidScientificInputError(\n \"spectralQuadrature.totalNodeCount must be positive and exactly match spectralQuadrature.nodes.length.\"\n );\n }\n if (\n totalNodeCount >\n MAX_SPECTRAL_QUADRATURE_NODES\n ) {\n throw new InvalidScientificInputError(\n \"spectralQuadrature.totalNodeCount exceeds the spectral quadrature safety limit.\"\n );\n }\n\n if (\n quadrature.responseApplicationPerformed !==\n false ||\n quadrature.responseValuesIncluded !== false ||\n quadrature.wavelengthIntegrationPerformed !==\n false ||\n quadrature.continuousSpectralDensityQuadratureOnly !==\n true ||\n quadrature.discreteLineSpectrumIncluded !==\n false\n ) {\n throw new InvalidScientificInputError(\n \"spectralQuadrature semantics are incompatible with pre-response continuous-density composition.\"\n );\n }\n\n const span =\n rangeMaximum - rangeMinimum;\n const nodesByIndex =\n new Map<number, SensorSpectralQuadratureNode>();\n const seenSegmentSubdivisions =\n new Set<string>();\n const segmentSubdivisionCounts =\n new Map<number, number>();\n const segmentSeenCounts =\n new Map<number, number>();\n let measureSum = 0;\n let normalizedWeightSum = 0;\n\n quadrature.nodes.forEach(\n (node, nodeArrayIndex) => {\n const spectralSampleIndex =\n requireNonNegativeSafeInteger(\n node.spectralSampleIndex,\n \"spectralQuadrature.nodes[\" +\n nodeArrayIndex +\n \"].spectralSampleIndex\"\n );\n if (\n nodesByIndex.has(\n spectralSampleIndex\n )\n ) {\n throw new InvalidScientificInputError(\n \"spectralQuadrature contains duplicate spectralSampleIndex values.\"\n );\n }\n\n const segmentIndex =\n requireNonNegativeSafeInteger(\n node.segmentIndex,\n \"spectralQuadrature.nodes[\" +\n nodeArrayIndex +\n \"].segmentIndex\"\n );\n if (segmentIndex >= segmentCount) {\n throw new InvalidScientificInputError(\n \"spectralQuadrature node segmentIndex is outside the declared segment range.\"\n );\n }\n\n const subdivisionIndex =\n requireNonNegativeSafeInteger(\n node.subdivisionIndex,\n \"spectralQuadrature.nodes[\" +\n nodeArrayIndex +\n \"].subdivisionIndex\"\n );\n const segmentSubdivisionCount =\n requireNonNegativeSafeInteger(\n node.segmentSubdivisionCount,\n \"spectralQuadrature.nodes[\" +\n nodeArrayIndex +\n \"].segmentSubdivisionCount\"\n );\n if (\n segmentSubdivisionCount <= 0 ||\n subdivisionIndex >=\n segmentSubdivisionCount\n ) {\n throw new InvalidScientificInputError(\n \"spectralQuadrature node subdivision identity is invalid.\"\n );\n }\n\n const priorSegmentCount =\n segmentSubdivisionCounts.get(\n segmentIndex\n );\n if (\n priorSegmentCount !== undefined &&\n priorSegmentCount !==\n segmentSubdivisionCount\n ) {\n throw new InvalidScientificInputError(\n \"spectralQuadrature nodes disagree on a segment subdivision count.\"\n );\n }\n segmentSubdivisionCounts.set(\n segmentIndex,\n segmentSubdivisionCount\n );\n\n const subdivisionKey =\n segmentIndex +\n \":\" +\n subdivisionIndex;\n if (\n seenSegmentSubdivisions.has(\n subdivisionKey\n )\n ) {\n throw new InvalidScientificInputError(\n \"spectralQuadrature contains duplicate segment/subdivision identities.\"\n );\n }\n seenSegmentSubdivisions.add(\n subdivisionKey\n );\n segmentSeenCounts.set(\n segmentIndex,\n (segmentSeenCounts.get(\n segmentIndex\n ) ?? 0) + 1\n );\n\n const wavelengthNanometers =\n requirePositiveFinite(\n node.wavelengthNanometers,\n \"spectralQuadrature.nodes[\" +\n nodeArrayIndex +\n \"].wavelengthNanometers\"\n );\n const wavelengthMeasureNanometers =\n requirePositiveFinite(\n node.wavelengthMeasureNanometers,\n \"spectralQuadrature.nodes[\" +\n nodeArrayIndex +\n \"].wavelengthMeasureNanometers\"\n );\n const normalizedWavelengthWeight =\n requirePositiveFinite(\n node.normalizedWavelengthWeight,\n \"spectralQuadrature.nodes[\" +\n nodeArrayIndex +\n \"].normalizedWavelengthWeight\"\n );\n\n const segmentMinimum =\n quadrature.segmentBoundariesNanometers[\n segmentIndex\n ]!;\n const segmentMaximum =\n quadrature.segmentBoundariesNanometers[\n segmentIndex + 1\n ]!;\n const expectedMeasure =\n (segmentMaximum -\n segmentMinimum) /\n segmentSubdivisionCount;\n const expectedWavelength =\n segmentMinimum +\n (subdivisionIndex + 0.5) *\n expectedMeasure;\n const expectedNormalizedWeight =\n expectedMeasure / span;\n\n if (\n !approximatelyEqual(\n wavelengthMeasureNanometers,\n expectedMeasure\n ) ||\n !approximatelyEqual(\n wavelengthNanometers,\n expectedWavelength\n ) ||\n !approximatelyEqual(\n normalizedWavelengthWeight,\n expectedNormalizedWeight\n )\n ) {\n throw new InvalidScientificInputError(\n \"spectralQuadrature node geometry/measure does not match its declared segment/subdivision identity.\"\n );\n }\n\n if (\n wavelengthMeasureNanometers >\n maximumSubintervalWidthNanometers &&\n !approximatelyEqual(\n wavelengthMeasureNanometers,\n maximumSubintervalWidthNanometers\n )\n ) {\n throw new InvalidScientificInputError(\n \"spectralQuadrature node width exceeds maximumSubintervalWidthNanometers.\"\n );\n }\n\n measureSum +=\n wavelengthMeasureNanometers;\n normalizedWeightSum +=\n normalizedWavelengthWeight;\n if (\n !Number.isFinite(measureSum) ||\n !Number.isFinite(\n normalizedWeightSum\n )\n ) {\n throw new InvalidScientificInputError(\n \"spectralQuadrature aggregate measures must remain finite.\"\n );\n }\n\n nodesByIndex.set(\n spectralSampleIndex,\n node\n );\n }\n );\n\n for (\n let spectralSampleIndex = 0;\n spectralSampleIndex < totalNodeCount;\n spectralSampleIndex += 1\n ) {\n if (\n !nodesByIndex.has(\n spectralSampleIndex\n )\n ) {\n throw new InvalidScientificInputError(\n \"spectralQuadrature spectralSampleIndex values must form the exact contiguous range 0..totalNodeCount-1.\"\n );\n }\n }\n\n for (\n let segmentIndex = 0;\n segmentIndex < segmentCount;\n segmentIndex += 1\n ) {\n const expected =\n segmentSubdivisionCounts.get(\n segmentIndex\n );\n const seen =\n segmentSeenCounts.get(\n segmentIndex\n ) ?? 0;\n if (\n expected === undefined ||\n seen !== expected\n ) {\n throw new InvalidScientificInputError(\n \"spectralQuadrature must contain every declared subdivision exactly once.\"\n );\n }\n }\n\n if (\n !approximatelyEqual(\n measureSum,\n span\n ) ||\n !approximatelyEqual(\n normalizedWeightSum,\n 1\n ) ||\n !approximatelyEqual(\n quadrature.wavelengthMeasureSumNanometers,\n measureSum\n ) ||\n !approximatelyEqual(\n quadrature.normalizedWavelengthWeightSum,\n normalizedWeightSum\n )\n ) {\n throw new InvalidScientificInputError(\n \"spectralQuadrature aggregate wavelength measures/weights are inconsistent.\"\n );\n }\n\n return nodesByIndex;\n}\n\n/**\n * Builds deterministic wavelength sample points for one exact sensor response\n * channel. It does not apply the response to any spectrum.\n *\n * The requested range must lie fully inside the channel's declared usable\n * range. The response curve's breakpoints, plus any caller-supplied breakpoints\n * from the source spectrum or optics, split that range into segments. Each\n * segment is then subdivided so no midpoint subinterval is wider than\n * maximumSubintervalWidthNanometers.\n *\n * wavelengthMeasureNanometers is dλ in nanometres, not a dimensionless response\n * weight. Multiply it only by a spectral density per nanometre, or convert\n * units explicitly first.\n *\n * QE and A/W responsivity are deliberately not applied. They lead to different\n * signals: QE is photon-to-electron efficiency, while A/W responsivity relates\n * incident radiant power to electrical current. A later step must also match\n * responseScope to the source plane and collection area before integrating any\n * signal.\n */\nexport function calculateSensorSpectralQuadrature(\n input:\n CalculateSensorSpectralQuadratureInput\n): CalculationResult<SensorSpectralQuadrature> {\n requireInputKeys(input, \"calculateSensorSpectralQuadrature\", [\"colorSamplingProfile\", \"spectralResponseProfile\", \"channelId\", \"wavelengthBasis\", \"wavelengthRangeNanometers\", \"maximumSubintervalWidthNanometers\", \"additionalBreakpointsNanometers\"]);\n const maximumSubintervalWidthNanometers =\n requirePositiveFinite(\n input.maximumSubintervalWidthNanometers,\n \"maximumSubintervalWidthNanometers\"\n );\n\n if (\n input.wavelengthBasis !== \"air\" &&\n input.wavelengthBasis !== \"vacuum\" &&\n input.wavelengthBasis !== \"unspecified\"\n ) {\n throw new InvalidConfigurationError(\n \"wavelengthBasis is invalid.\"\n );\n }\n\n const colorProfile =\n parseSensorColorSamplingProfile(\n input.colorSamplingProfile\n );\n const responseProfile =\n parseSensorSpectralResponseProfile(\n input.spectralResponseProfile\n );\n const response = channelResponse(\n responseProfile,\n input.channelId\n );\n const curves =\n responseCurves(response);\n\n if (\n !curves.every(\n (curve) =>\n curve.wavelengthBasis ===\n input.wavelengthBasis\n )\n ) {\n throw new InvalidScientificInputError(\n \"wavelengthBasis must exactly match every response curve used by the requested channel.\"\n );\n }\n\n const usable = usableResponseRange(\n curves\n );\n const range = parseRequestedRange(\n input.wavelengthRangeNanometers,\n usable\n );\n const validationWavelength =\n range.minimum +\n (range.maximum - range.minimum) /\n 2;\n const representative =\n resolveSensorSpectralResponseAtWavelength(\n {\n colorSamplingProfile:\n colorProfile,\n spectralResponseProfile:\n responseProfile,\n channelId: input.channelId,\n wavelengthNanometers:\n validationWavelength,\n wavelengthBasis:\n input.wavelengthBasis\n }\n ).value;\n\n const additional =\n additionalBreakpoints(\n input.additionalBreakpointsNanometers,\n range\n );\n const boundaries =\n partitionBoundaries(\n curves,\n range,\n additional\n );\n const {\n segments,\n totalNodeCount\n } = planSegments(\n boundaries,\n maximumSubintervalWidthNanometers\n );\n\n const totalSpan =\n range.maximum - range.minimum;\n const nodes:\n SensorSpectralQuadratureNode[] = [];\n let spectralSampleIndex = 0;\n\n for (\n let segmentIndex = 0;\n segmentIndex < segments.length;\n segmentIndex += 1\n ) {\n const segment =\n segments[segmentIndex]!;\n\n for (\n let subdivisionIndex = 0;\n subdivisionIndex <\n segment.subdivisionCount;\n subdivisionIndex += 1\n ) {\n const wavelengthNanometers =\n segment.minimum +\n (subdivisionIndex + 0.5) *\n segment\n .subintervalWidthNanometers;\n\n nodes.push({\n spectralSampleIndex,\n segmentIndex,\n subdivisionIndex,\n segmentSubdivisionCount:\n segment.subdivisionCount,\n wavelengthNanometers,\n wavelengthMeasureNanometers:\n segment\n .subintervalWidthNanometers,\n normalizedWavelengthWeight:\n segment\n .subintervalWidthNanometers /\n totalSpan\n });\n\n spectralSampleIndex += 1;\n }\n }\n\n const normalizedWavelengthWeightSum =\n nodes.reduce(\n (sum, node) =>\n sum +\n node.normalizedWavelengthWeight,\n 0\n );\n const wavelengthMeasureSumNanometers =\n nodes.reduce(\n (sum, node) =>\n sum +\n node.wavelengthMeasureNanometers,\n 0\n );\n\n return approximationResult(\n {\n profileId:\n representative.profileId,\n colorSamplingProfileId:\n representative\n .colorSamplingProfileId,\n channelId:\n representative.channelId,\n sourceResponseKind:\n representative\n .sourceResponseKind,\n responseScope:\n representative.responseScope,\n responseScientificStatus:\n representative\n .scientificStatus,\n responseUncertainty:\n representative.uncertainty,\n responseChannelBinding:\n createSensorSpectralResponseChannelBinding(\n response\n ),\n ...(representative.referenceConditions ===\n undefined\n ? {}\n : {\n responseReferenceConditions:\n representative.referenceConditions\n }),\n wavelengthBasis:\n input.wavelengthBasis,\n wavelengthBasisResolved:\n representative\n .wavelengthBasisResolved,\n wavelengthRangeNanometers:\n range,\n responseDeclaredWavelengthRangeNanometers:\n usable,\n quadratureScheme:\n \"response-breakpoint-aware-bounded-midpoint\",\n segmentBoundarySource:\n \"requested-range-plus-response-knots-plus-optional-additional-breakpoints\",\n segmentBoundariesNanometers:\n [...boundaries],\n maximumSubintervalWidthNanometers,\n segmentCount:\n segments.length,\n totalNodeCount,\n normalizedWavelengthWeightSum,\n wavelengthMeasureSumNanometers,\n nodes,\n responseKnotAlignmentIncluded:\n true,\n componentEvidence: {\n colorSamplingProfile:\n colorProfile.evidence,\n profile:\n representative\n .componentEvidence.profile,\n channel:\n representative\n .componentEvidence.channel,\n curves:\n representative\n .componentEvidence.curves\n },\n responseValuesIncluded: false,\n responseApplicationPerformed:\n false,\n sourceSpectralValuesIncluded:\n false,\n spectralIrradianceIncluded:\n false,\n spectralPhotonIrradianceIncluded:\n false,\n commonSpectralCoverageValidated:\n false,\n continuousSpectralDensityQuadratureOnly:\n true,\n discreteLineSpectrumIncluded:\n false,\n opticalTransmissionIncludedByQuadrature:\n false,\n wavelengthIntegrationPerformed:\n false,\n spatialIntegrationPerformed:\n false,\n temporalIntegrationPerformed:\n false,\n photonsCalculated: false,\n electronsCalculated: false,\n rawCodeValueProduced: false,\n convergenceErrorEstimated: false\n },\n \"sensor-spectral-quadrature\",\n \"1.0.0\",\n [\n \"The partition includes requested range edges, response-curve knots, and optional caller-supplied continuous-spectrum/optics breakpoints.\",\n \"Every segment uses deterministic equal-width midpoint subintervals whose width is bounded by maximumSubintervalWidthNanometers.\",\n \"Wavelength measures are d-lambda in nanometres and normalized wavelength weights are geometric wavelength measures only; neither is sensor-response weighting.\",\n \"The requested range is validated against sensor-response support only. Scene-spectrum, optical-transmission, and other spectral-factor coverage are not established by this API.\",\n \"The response profile, exact channel linkage, wavelength basis, response scope, and response-data provenance are validated and preserved, but response values are not applied at quadrature nodes.\",\n \"QE and A/W responsivity remain different physical representations and require different compatible downstream photon/power semantics.\",\n \"Future signal composition must match responseScope to the source plane and collection-area model so upstream transmission is not omitted or double-counted.\",\n \"This midpoint plan targets continuous spectral-density integration. Discrete/delta-like line spectra require a separate explicit representation rather than being approximated by hidden point masses.\",\n \"No source spectral values, spectral irradiance, spectral photon irradiance, optical transmission, spatial integration, temporal integration, photon/electron conversion, current calculation, or RAW output is calculated.\",\n \"Response-knot alignment and a bounded wavelength step do not prove convergence for arbitrary source spectra or other wavelength-dependent factors.\",\n \"No source-independent convergence/error estimate is reported because integration error depends on the downstream integrand.\"\n ]\n );\n}\n"]}
@@ -1,14 +1,12 @@
1
1
  /**
2
- * Module boundary and integration notes.
3
- * Parses reusable wavelength-dependent response data for semantic sensor channels without inferring
4
- * response from channel names or CFA family. Embedded multi-point curves require reusable-data or
5
- * Photivra-owned evidence. Public/factual references without reuse permission may support metadata but
6
- * cannot by themselves authorize copying numeric curve data into the engine.
7
- * Create an exact canonical-data binding to one parsed response channel so numeric curve substitution
8
- * cannot hide behind unchanged profile IDs. Channel IDs bind an explicit effective EQE or A/W curve,
9
- * or a separately evidenced filter-times-detector EQE representation. Support/interpolation/wavelength
10
- * basis and exact canonical channel data remain part of identity. Do not infer response from RGB
11
- * labels or extrapolate outside sampled support.
2
+ * Sensor spectral response: how strongly each sensor channel responds at each wavelength, as an EQE
3
+ * (external quantum efficiency) curve, an A/W responsivity curve, or a colour-filter curve times a
4
+ * detector EQE curve.
5
+ *
6
+ * Responses are never guessed from channel names (such as "red") or the CFA type, and are never
7
+ * extrapolated outside the sampled range. A numeric curve can be embedded only with evidence that the
8
+ * data is reusable or owned by Photivra; a public reference without reuse permission can support
9
+ * metadata but does not by itself allow copying its numbers into the engine.
12
10
  * @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
13
11
  * limits.
14
12
  */
@@ -74,16 +72,23 @@ export type SensorSpectralChannelResponse = (SensorSpectralChannelResponseBase &
74
72
  channelFilterTransmittance: SpectralFractionCurve;
75
73
  detectorExternalQuantumEfficiency: SpectralFractionCurve;
76
74
  });
75
+ /**
76
+ * Current channel-binding format. v2 (package 2.0.0) serializes the parsed channel with sorted keys.
77
+ * v1 (package 1.5.0 and earlier) used the unparsed channel's JSON in insertion order; it is rejected
78
+ * with an explicit version error instead of being compared.
79
+ */
80
+ export declare const SENSOR_SPECTRAL_RESPONSE_CHANNEL_BINDING_FORMAT: "photivra-spectral-channel-response-canonical-json-v2";
77
81
  export interface SensorSpectralResponseChannelBinding {
78
- format: "photivra-spectral-channel-response-canonical-json-v1";
82
+ format: typeof SENSOR_SPECTRAL_RESPONSE_CHANNEL_BINDING_FORMAT;
79
83
  canonicalJson: string;
80
84
  }
81
85
  /**
82
- * Versioned channel-response data linked to one exact color-sampling profile.
83
- * Each channel declares effective EQE, effective A/W response or separable filter
84
- * and detector EQE, sampled support/interpolation and an explicit wavelength basis.
85
- * Reference conditions, evidence and uncertainty retain their own validity. Names
86
- * such as red/green/blue never supply missing curves or justify extrapolation.
86
+ * Versioned response data for the channels of one exact colour-sampling profile.
87
+ * Each channel declares an effective EQE, an effective A/W response, or separate
88
+ * filter and detector EQE curves, with its sampled range, interpolation and an
89
+ * explicit wavelength basis (air or vacuum). Reference conditions, evidence and
90
+ * uncertainty each keep their own validity. Names such as red, green or blue
91
+ * never fill in a missing curve or justify extrapolation.
87
92
  */
88
93
  export interface SensorSpectralResponseProfile {
89
94
  schemaVersion: "0.1.0";
@@ -147,46 +152,53 @@ export interface ResolvedSensorSpectralResponse {
147
152
  };
148
153
  }
149
154
  /**
150
- * Parses reusable wavelength-dependent response data for semantic sensor
151
- * channels without inferring response from channel names or CFA family.
155
+ * Parses wavelength-dependent response data for sensor channels. Responses are
156
+ * never guessed from channel names or the CFA type.
152
157
  *
153
- * Embedded multi-point curves require reusable-data or Photivra-owned evidence.
154
- * Public/factual references without reuse permission may support metadata but
155
- * cannot by themselves authorize copying numeric curve data into the engine.
158
+ * An embedded multi-point curve needs evidence that the data is reusable or
159
+ * owned by Photivra. A public reference without reuse permission can support
160
+ * metadata, but does not by itself allow copying numeric curve data into the engine.
156
161
  */
157
162
  export declare function parseSensorSpectralResponseProfile(value: unknown): SensorSpectralResponseProfile;
158
163
  /**
159
- * Create an exact canonical-data binding to one parsed response channel so numeric curve substitution
160
- * cannot hide behind unchanged profile IDs.
164
+ * Creates an exact binding to one parsed response channel's data, so a swapped numeric curve cannot
165
+ * hide behind an unchanged profile ID.
161
166
  *
162
- * Channel IDs bind an explicit effective EQE or A/W curve, or a separately evidenced
163
- * filter-times-detector EQE representation. Support/interpolation/wavelength basis and exact canonical
164
- * channel data remain part of identity. Do not infer response from RGB labels or extrapolate outside
165
- * sampled support.
166
- * @param response - SensorSpectralChannelResponse. See the linked contract for coordinate, unit and profile binding semantics.
167
- * @returns SensorSpectralResponseChannelBinding. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
167
+ * The binding includes the channel's EQE or A/W curve (or its separately evidenced filter × detector
168
+ * EQE curves), its range, interpolation and wavelength basis, and the exact canonical channel data.
169
+ * The channel is parsed first and serialized with sorted object keys, so property order never changes
170
+ * the binding and a malformed channel throws.
171
+ * @param response - The input; see `SensorSpectralChannelResponse` for its fields, units and coordinates.
172
+ * @returns The result. Success does not imply calibration.
168
173
  *
169
- * @see docs/API_REFERENCE.md for the root export and exact type graph.
174
+ * @see docs/API_REFERENCE.md for the package export and its full type definitions.
170
175
  */
171
176
  export declare function createSensorSpectralResponseChannelBinding(response: SensorSpectralChannelResponse): SensorSpectralResponseChannelBinding;
172
177
  /**
173
- * Resolves one semantic sensor-channel response at one wavelength.
178
+ * Rejects a channel binding stored in a reduction unless it uses the current format. A v1 binding from
179
+ * package 1.5.0 or earlier fails with an explicit version error: a different serializer produced it, so
180
+ * comparing it would report a misleading data mismatch. Recompute the spectral quadrature and reduction
181
+ * with this release to get a v2 binding.
182
+ * Internal to the repository; not exported from the package.
183
+ */
184
+ export declare function requireCurrentSensorSpectralResponseChannelBinding(binding: unknown): void;
185
+ /**
186
+ * Returns one sensor channel's response at one wavelength.
174
187
  *
175
- * The resolver validates the response profile against the exact color-sampling
176
- * profile, refuses unresolved layered sampling, performs only declared
188
+ * It checks the response profile against the exact colour-sampling profile,
189
+ * rejects layered layouts whose sampling is not defined, uses only the declared
177
190
  * piecewise-linear interpolation, and never extrapolates.
178
191
  *
179
- * Direct effective response and separable filter×detector-QE are both supported.
180
- * QE and A/W responsivity remain distinct physical representations; this API
181
- * does not convert between them.
192
+ * Both a direct effective response and separate filter × detector QE curves are
193
+ * supported. QE and A/W responsivity are different physical quantities; this
194
+ * API does not convert between them.
182
195
  */
183
196
  export declare function resolveParsedSensorSpectralResponseAtWavelength(input: ResolveSensorSpectralResponseAtWavelengthInput): CalculationResult<ResolvedSensorSpectralResponse>;
184
197
  /**
185
- * Public spectral-response resolver for untrusted/raw profile inputs.
198
+ * Public spectral-response lookup for untrusted, unparsed profiles.
186
199
  *
187
- * Profiles are parsed once here. Internal composition code that has already
188
- * parsed both profiles may use resolveParsedSensorSpectralResponseAtWavelength
189
- * to avoid repeating full profile parsing for every wavelength node.
200
+ * The profiles are parsed here, once. Internal code that has already parsed
201
+ * both profiles can call resolveParsedSensorSpectralResponseAtWavelength, to
202
+ * avoid parsing them again for every wavelength node.
190
203
  */
191
204
  export declare function resolveSensorSpectralResponseAtWavelength(input: ResolveSensorSpectralResponseAtWavelengthInput): CalculationResult<ResolvedSensorSpectralResponse>;
192
- //# sourceMappingURL=spectral-response.d.ts.map
@@ -1,30 +1,38 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  /**
3
- * Module boundary and integration notes.
4
- * Parses reusable wavelength-dependent response data for semantic sensor channels without inferring
5
- * response from channel names or CFA family. Embedded multi-point curves require reusable-data or
6
- * Photivra-owned evidence. Public/factual references without reuse permission may support metadata but
7
- * cannot by themselves authorize copying numeric curve data into the engine.
8
- * Create an exact canonical-data binding to one parsed response channel so numeric curve substitution
9
- * cannot hide behind unchanged profile IDs. Channel IDs bind an explicit effective EQE or A/W curve,
10
- * or a separately evidenced filter-times-detector EQE representation. Support/interpolation/wavelength
11
- * basis and exact canonical channel data remain part of identity. Do not infer response from RGB
12
- * labels or extrapolate outside sampled support.
3
+ * Sensor spectral response: how strongly each sensor channel responds at each wavelength, as an EQE
4
+ * (external quantum efficiency) curve, an A/W responsivity curve, or a colour-filter curve times a
5
+ * detector EQE curve.
6
+ *
7
+ * Responses are never guessed from channel names (such as "red") or the CFA type, and are never
8
+ * extrapolated outside the sampled range. A numeric curve can be embedded only with evidence that the
9
+ * data is reusable or owned by Photivra; a public reference without reuse permission can support
10
+ * metadata but does not by itself allow copying its numbers into the engine.
13
11
  * @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
14
12
  * limits.
15
13
  */
16
14
  import { calculatedResult } from "../core/calculation-result.js";
15
+ import { stringifyCanonicalJson } from "../core/canonical-json.js";
17
16
  import { InvalidConfigurationError } from "../core/configuration-error.js";
18
17
  import { parseEvidenceList } from "../core/evidence-provenance.js";
19
18
  import { InvalidScientificInputError } from "../core/validation.js";
20
19
  import { parseSpectralWavelengthBasis } from "../core/spectral.js";
21
20
  import { parseSensorColorSamplingProfile } from "./color-sampling.js";
22
- function requireRecord(value, path) {
21
+ import { requireInputKeys, rejectUnknownFields, rejectUnknownVariantFields, UNCERTAINTY_VARIANT_FIELDS } from "../core/record-validation.js";
22
+ /**
23
+ * Current channel-binding format. v2 (package 2.0.0) serializes the parsed channel with sorted keys.
24
+ * v1 (package 1.5.0 and earlier) used the unparsed channel's JSON in insertion order; it is rejected
25
+ * with an explicit version error instead of being compared.
26
+ */
27
+ export const SENSOR_SPECTRAL_RESPONSE_CHANNEL_BINDING_FORMAT = "photivra-spectral-channel-response-canonical-json-v2";
28
+ function requireRecord(value, path, allowedKeys) {
23
29
  if (typeof value !== "object" ||
24
30
  value === null ||
25
31
  Array.isArray(value)) {
26
32
  throw new InvalidConfigurationError(path + " must be an object.");
27
33
  }
34
+ if (allowedKeys !== null)
35
+ rejectUnknownFields(value, allowedKeys, path);
28
36
  return value;
29
37
  }
30
38
  function requireNonEmptyString(value, path) {
@@ -68,7 +76,8 @@ function requireReusableCurveEvidence(value, path) {
68
76
  return evidence;
69
77
  }
70
78
  function parseUncertainty(value, path) {
71
- const record = requireRecord(value, path);
79
+ const record = requireRecord(value, path, null);
80
+ rejectUnknownVariantFields(record, "kind", UNCERTAINTY_VARIANT_FIELDS, path);
72
81
  if (record.kind === "relative") {
73
82
  const fraction = requireFinite(record.fraction, path + ".fraction");
74
83
  if (fraction < 0) {
@@ -90,7 +99,7 @@ function parseUncertainty(value, path) {
90
99
  throw new InvalidConfigurationError(path + ".kind is invalid.");
91
100
  }
92
101
  function parseReferenceConditions(value, path) {
93
- const record = requireRecord(value, path);
102
+ const record = requireRecord(value, path, ["temperatureC", "incidenceAngleDegreesFromNormal", "polarization"]);
94
103
  const temperatureC = record.temperatureC === undefined
95
104
  ? undefined
96
105
  : requireFinite(record.temperatureC, path + ".temperatureC");
@@ -165,7 +174,7 @@ function parseFractionSamples(value, path) {
165
174
  }
166
175
  let previousWavelength = Number.NEGATIVE_INFINITY;
167
176
  return value.map((entry, index) => {
168
- const record = requireRecord(entry, path + "[" + index + "]");
177
+ const record = requireRecord(entry, path + "[" + index + "]", ["wavelengthNanometers", "value"]);
169
178
  const wavelengthNanometers = requirePositiveFinite(record.wavelengthNanometers, path +
170
179
  "[" +
171
180
  index +
@@ -194,7 +203,7 @@ function parseResponsivitySamples(value, path) {
194
203
  }
195
204
  let previousWavelength = Number.NEGATIVE_INFINITY;
196
205
  return value.map((entry, index) => {
197
- const record = requireRecord(entry, path + "[" + index + "]");
206
+ const record = requireRecord(entry, path + "[" + index + "]", ["wavelengthNanometers", "amperesPerWatt"]);
198
207
  const wavelengthNanometers = requirePositiveFinite(record.wavelengthNanometers, path +
199
208
  "[" +
200
209
  index +
@@ -223,14 +232,14 @@ function parseResponsivitySamples(value, path) {
223
232
  });
224
233
  }
225
234
  function parseFractionCurve(value, path) {
226
- const record = requireRecord(value, path);
235
+ const record = requireRecord(value, path, ["wavelengthUnit", "interpolation", "outsideRangeBehavior", "wavelengthBasis", "evidence", "samples"]);
227
236
  return {
228
237
  ...parseCurveBase(record, path),
229
238
  samples: parseFractionSamples(record.samples, path + ".samples")
230
239
  };
231
240
  }
232
241
  function parseResponsivityCurve(value, path) {
233
- const record = requireRecord(value, path);
242
+ const record = requireRecord(value, path, ["wavelengthUnit", "interpolation", "outsideRangeBehavior", "wavelengthBasis", "evidence", "samples"]);
234
243
  return {
235
244
  ...parseCurveBase(record, path),
236
245
  samples: parseResponsivitySamples(record.samples, path + ".samples")
@@ -261,7 +270,7 @@ function usableRange(curves) {
261
270
  return { minimum, maximum };
262
271
  }
263
272
  function parseChannelResponse(value, path) {
264
- const record = requireRecord(value, path);
273
+ const record = requireRecord(value, path, ["channelId", "scientificStatus", "uncertainty", "evidence", "referenceConditions", "conditionDependence", "kind", "responseScope", "externalQuantumEfficiency", "spectralResponsivity", "combinationRule", "channelFilterTransmittance", "detectorExternalQuantumEfficiency"]);
265
274
  const channelId = requireNonEmptyString(record.channelId, path + ".channelId");
266
275
  const scientificStatus = parseScientificStatus(record.scientificStatus, path + ".scientificStatus");
267
276
  const uncertainty = parseUncertainty(record.uncertainty, path + ".uncertainty");
@@ -364,15 +373,15 @@ function parseChannelResponse(value, path) {
364
373
  throw new InvalidConfigurationError(path + ".kind is invalid.");
365
374
  }
366
375
  /**
367
- * Parses reusable wavelength-dependent response data for semantic sensor
368
- * channels without inferring response from channel names or CFA family.
376
+ * Parses wavelength-dependent response data for sensor channels. Responses are
377
+ * never guessed from channel names or the CFA type.
369
378
  *
370
- * Embedded multi-point curves require reusable-data or Photivra-owned evidence.
371
- * Public/factual references without reuse permission may support metadata but
372
- * cannot by themselves authorize copying numeric curve data into the engine.
379
+ * An embedded multi-point curve needs evidence that the data is reusable or
380
+ * owned by Photivra. A public reference without reuse permission can support
381
+ * metadata, but does not by itself allow copying numeric curve data into the engine.
373
382
  */
374
383
  export function parseSensorSpectralResponseProfile(value) {
375
- const profile = requireRecord(value, "sensorSpectralResponse");
384
+ const profile = requireRecord(value, "sensorSpectralResponse", ["schemaVersion", "channels", "profileId", "colorSamplingProfileId", "evidence"]);
376
385
  if (profile.schemaVersion !== "0.1.0") {
377
386
  throw new InvalidConfigurationError('sensorSpectralResponse.schemaVersion must be "0.1.0".');
378
387
  }
@@ -397,24 +406,47 @@ export function parseSensorSpectralResponseProfile(value) {
397
406
  };
398
407
  }
399
408
  /**
400
- * Create an exact canonical-data binding to one parsed response channel so numeric curve substitution
401
- * cannot hide behind unchanged profile IDs.
409
+ * Creates an exact binding to one parsed response channel's data, so a swapped numeric curve cannot
410
+ * hide behind an unchanged profile ID.
402
411
  *
403
- * Channel IDs bind an explicit effective EQE or A/W curve, or a separately evidenced
404
- * filter-times-detector EQE representation. Support/interpolation/wavelength basis and exact canonical
405
- * channel data remain part of identity. Do not infer response from RGB labels or extrapolate outside
406
- * sampled support.
407
- * @param response - SensorSpectralChannelResponse. See the linked contract for coordinate, unit and profile binding semantics.
408
- * @returns SensorSpectralResponseChannelBinding. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
412
+ * The binding includes the channel's EQE or A/W curve (or its separately evidenced filter × detector
413
+ * EQE curves), its range, interpolation and wavelength basis, and the exact canonical channel data.
414
+ * The channel is parsed first and serialized with sorted object keys, so property order never changes
415
+ * the binding and a malformed channel throws.
416
+ * @param response - The input; see `SensorSpectralChannelResponse` for its fields, units and coordinates.
417
+ * @returns The result. Success does not imply calibration.
409
418
  *
410
- * @see docs/API_REFERENCE.md for the root export and exact type graph.
419
+ * @see docs/API_REFERENCE.md for the package export and its full type definitions.
411
420
  */
412
421
  export function createSensorSpectralResponseChannelBinding(response) {
413
422
  return {
414
- format: "photivra-spectral-channel-response-canonical-json-v1",
415
- canonicalJson: JSON.stringify(response)
423
+ format: SENSOR_SPECTRAL_RESPONSE_CHANNEL_BINDING_FORMAT,
424
+ // Parse first so the binding never repeats unvalidated input, then sort keys
425
+ // so channels with the same content bind identically whatever their key order.
426
+ canonicalJson: stringifyCanonicalJson(parseChannelResponse(response, "sensorSpectralResponseChannel"), {
427
+ undefinedObjectProperties: "omit",
428
+ nonFiniteNumberMessage: "sensorSpectralResponseChannel must contain finite numbers.",
429
+ unsupportedValueMessage: "sensorSpectralResponseChannel must be plain JSON data."
430
+ })
416
431
  };
417
432
  }
433
+ /**
434
+ * Rejects a channel binding stored in a reduction unless it uses the current format. A v1 binding from
435
+ * package 1.5.0 or earlier fails with an explicit version error: a different serializer produced it, so
436
+ * comparing it would report a misleading data mismatch. Recompute the spectral quadrature and reduction
437
+ * with this release to get a v2 binding.
438
+ * Internal to the repository; not exported from the package.
439
+ */
440
+ export function requireCurrentSensorSpectralResponseChannelBinding(binding) {
441
+ const format = typeof binding === "object" && binding !== null
442
+ ? binding.format
443
+ : undefined;
444
+ if (format === SENSOR_SPECTRAL_RESPONSE_CHANNEL_BINDING_FORMAT)
445
+ return;
446
+ throw new InvalidConfigurationError(format === "photivra-spectral-channel-response-canonical-json-v1"
447
+ ? "Response-channel binding format v1 (package 1.5.0 and earlier) is not supported; recompute the spectral quadrature and reduction to obtain a v2 binding."
448
+ : "Response-channel binding has an unsupported format; expected " + SENSOR_SPECTRAL_RESPONSE_CHANNEL_BINDING_FORMAT + ".");
449
+ }
418
450
  function topologyChannelIds(profile) {
419
451
  if (profile.layout.kind ===
420
452
  "layered") {
@@ -474,15 +506,15 @@ function interpolateCurve(samples, wavelengthNanometers, valueOf) {
474
506
  };
475
507
  }
476
508
  /**
477
- * Resolves one semantic sensor-channel response at one wavelength.
509
+ * Returns one sensor channel's response at one wavelength.
478
510
  *
479
- * The resolver validates the response profile against the exact color-sampling
480
- * profile, refuses unresolved layered sampling, performs only declared
511
+ * It checks the response profile against the exact colour-sampling profile,
512
+ * rejects layered layouts whose sampling is not defined, uses only the declared
481
513
  * piecewise-linear interpolation, and never extrapolates.
482
514
  *
483
- * Direct effective response and separable filter×detector-QE are both supported.
484
- * QE and A/W responsivity remain distinct physical representations; this API
485
- * does not convert between them.
515
+ * Both a direct effective response and separate filter × detector QE curves are
516
+ * supported. QE and A/W responsivity are different physical quantities; this
517
+ * API does not convert between them.
486
518
  */
487
519
  export function resolveParsedSensorSpectralResponseAtWavelength(input) {
488
520
  const colorProfile = input.colorSamplingProfile;
@@ -503,7 +535,7 @@ export function resolveParsedSensorSpectralResponseAtWavelength(input) {
503
535
  "string" ||
504
536
  input.channelId.trim().length ===
505
537
  0) {
506
- throw new InvalidScientificInputError("channelId must be a non-empty string.");
538
+ throw new InvalidConfigurationError("channelId must be a non-empty string.");
507
539
  }
508
540
  if (!knownSet.has(input.channelId)) {
509
541
  throw new InvalidScientificInputError("channelId is not present in the linked color-sampling topology.");
@@ -525,7 +557,7 @@ export function resolveParsedSensorSpectralResponseAtWavelength(input) {
525
557
  "vacuum" &&
526
558
  input.wavelengthBasis !==
527
559
  "unspecified") {
528
- throw new InvalidScientificInputError("wavelengthBasis is invalid.");
560
+ throw new InvalidConfigurationError("wavelengthBasis is invalid.");
529
561
  }
530
562
  const curves = [];
531
563
  let resolvedValue;
@@ -646,13 +678,14 @@ export function resolveParsedSensorSpectralResponseAtWavelength(input) {
646
678
  ]);
647
679
  }
648
680
  /**
649
- * Public spectral-response resolver for untrusted/raw profile inputs.
681
+ * Public spectral-response lookup for untrusted, unparsed profiles.
650
682
  *
651
- * Profiles are parsed once here. Internal composition code that has already
652
- * parsed both profiles may use resolveParsedSensorSpectralResponseAtWavelength
653
- * to avoid repeating full profile parsing for every wavelength node.
683
+ * The profiles are parsed here, once. Internal code that has already parsed
684
+ * both profiles can call resolveParsedSensorSpectralResponseAtWavelength, to
685
+ * avoid parsing them again for every wavelength node.
654
686
  */
655
687
  export function resolveSensorSpectralResponseAtWavelength(input) {
688
+ requireInputKeys(input, "resolveSensorSpectralResponseAtWavelength", ["colorSamplingProfile", "spectralResponseProfile", "channelId", "wavelengthNanometers", "wavelengthBasis"]);
656
689
  const colorProfile = parseSensorColorSamplingProfile(input.colorSamplingProfile);
657
690
  const responseProfile = parseSensorSpectralResponseProfile(input.spectralResponseProfile);
658
691
  return resolveParsedSensorSpectralResponseAtWavelength({