@photivra/engine 0.5.1 → 1.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 (753) hide show
  1. package/AGENTS.md +674 -0
  2. package/CHANGELOG.md +218 -0
  3. package/CITATION.cff +1 -1
  4. package/CONTRIBUTING.md +76 -0
  5. package/DCO +33 -0
  6. package/NODE_SUPPORT.md +37 -0
  7. package/NOTICE +2 -0
  8. package/README.md +157 -56
  9. package/SECURITY.md +55 -0
  10. package/THIRD_PARTY.md +63 -0
  11. package/dist/camera/equivalent-focal-length.d.ts +9 -0
  12. package/dist/camera/equivalent-focal-length.d.ts.map +1 -1
  13. package/dist/camera/equivalent-focal-length.js +9 -0
  14. package/dist/camera/equivalent-focal-length.js.map +1 -1
  15. package/dist/camera/field-of-view.d.ts +13 -0
  16. package/dist/camera/field-of-view.d.ts.map +1 -1
  17. package/dist/camera/field-of-view.js +13 -0
  18. package/dist/camera/field-of-view.js.map +1 -1
  19. package/dist/camera/projected-object-size.d.ts +8 -0
  20. package/dist/camera/projected-object-size.d.ts.map +1 -1
  21. package/dist/camera/projected-object-size.js +8 -0
  22. package/dist/camera/projected-object-size.js.map +1 -1
  23. package/dist/capture/capture-export-metadata.d.ts +60 -0
  24. package/dist/capture/capture-export-metadata.d.ts.map +1 -0
  25. package/dist/capture/capture-export-metadata.js +62 -0
  26. package/dist/capture/capture-export-metadata.js.map +1 -0
  27. package/dist/capture/environment-raw-producer.d.ts +55 -0
  28. package/dist/capture/environment-raw-producer.d.ts.map +1 -0
  29. package/dist/capture/environment-raw-producer.js +88 -0
  30. package/dist/capture/environment-raw-producer.js.map +1 -0
  31. package/dist/capture/export-jpeg.d.ts +12 -0
  32. package/dist/capture/export-jpeg.d.ts.map +1 -0
  33. package/dist/capture/export-jpeg.js +126 -0
  34. package/dist/capture/export-jpeg.js.map +1 -0
  35. package/dist/capture/export-tiff.d.ts +45 -0
  36. package/dist/capture/export-tiff.d.ts.map +1 -0
  37. package/dist/capture/export-tiff.js +129 -0
  38. package/dist/capture/export-tiff.js.map +1 -0
  39. package/dist/capture/focus-control.d.ts +210 -0
  40. package/dist/capture/focus-control.d.ts.map +1 -0
  41. package/dist/capture/focus-control.js +664 -0
  42. package/dist/capture/focus-control.js.map +1 -0
  43. package/dist/capture/linear-encoding.d.ts +59 -0
  44. package/dist/capture/linear-encoding.d.ts.map +1 -0
  45. package/dist/capture/linear-encoding.js +98 -0
  46. package/dist/capture/linear-encoding.js.map +1 -0
  47. package/dist/capture/photographic-export.d.ts +135 -0
  48. package/dist/capture/photographic-export.d.ts.map +1 -0
  49. package/dist/capture/photographic-export.js +273 -0
  50. package/dist/capture/photographic-export.js.map +1 -0
  51. package/dist/capture/raw-frame-limits.d.ts +12 -0
  52. package/dist/capture/raw-frame-limits.d.ts.map +1 -0
  53. package/dist/capture/raw-frame-limits.js +13 -0
  54. package/dist/capture/raw-frame-limits.js.map +1 -0
  55. package/dist/capture/raw-frame-reconstruction.d.ts +48 -0
  56. package/dist/capture/raw-frame-reconstruction.d.ts.map +1 -0
  57. package/dist/capture/raw-frame-reconstruction.js +146 -0
  58. package/dist/capture/raw-frame-reconstruction.js.map +1 -0
  59. package/dist/capture/release-sequence.d.ts +120 -0
  60. package/dist/capture/release-sequence.d.ts.map +1 -0
  61. package/dist/capture/release-sequence.js +446 -0
  62. package/dist/capture/release-sequence.js.map +1 -0
  63. package/dist/capture/sensor-raw-frame.d.ts +34 -0
  64. package/dist/capture/sensor-raw-frame.d.ts.map +1 -0
  65. package/dist/capture/sensor-raw-frame.js +106 -0
  66. package/dist/capture/sensor-raw-frame.js.map +1 -0
  67. package/dist/capture/sensor-raw-producer.d.ts +51 -0
  68. package/dist/capture/sensor-raw-producer.d.ts.map +1 -0
  69. package/dist/capture/sensor-raw-producer.js +235 -0
  70. package/dist/capture/sensor-raw-producer.js.map +1 -0
  71. package/dist/capture/simulated-capture.d.ts +125 -0
  72. package/dist/capture/simulated-capture.d.ts.map +1 -0
  73. package/dist/capture/simulated-capture.js +248 -0
  74. package/dist/capture/simulated-capture.js.map +1 -0
  75. package/dist/color/capture-color.d.ts +73 -0
  76. package/dist/color/capture-color.d.ts.map +1 -0
  77. package/dist/color/capture-color.js +145 -0
  78. package/dist/color/capture-color.js.map +1 -0
  79. package/dist/color/sensor-color-development.d.ts +23 -0
  80. package/dist/color/sensor-color-development.d.ts.map +1 -0
  81. package/dist/color/sensor-color-development.js +56 -0
  82. package/dist/color/sensor-color-development.js.map +1 -0
  83. package/dist/color/white-balance.d.ts +175 -0
  84. package/dist/color/white-balance.d.ts.map +1 -0
  85. package/dist/color/white-balance.js +606 -0
  86. package/dist/color/white-balance.js.map +1 -0
  87. package/dist/composition/image-formation-plan.d.ts +481 -0
  88. package/dist/composition/image-formation-plan.d.ts.map +1 -0
  89. package/dist/composition/image-formation-plan.js +2499 -0
  90. package/dist/composition/image-formation-plan.js.map +1 -0
  91. package/dist/composition/plan-consumer.d.ts +53 -0
  92. package/dist/composition/plan-consumer.d.ts.map +1 -0
  93. package/dist/composition/plan-consumer.js +119 -0
  94. package/dist/composition/plan-consumer.js.map +1 -0
  95. package/dist/core/calculation-result.d.ts.map +1 -1
  96. package/dist/core/calculation-result.js +6 -0
  97. package/dist/core/calculation-result.js.map +1 -1
  98. package/dist/core/canonical-json.d.ts +18 -0
  99. package/dist/core/canonical-json.d.ts.map +1 -0
  100. package/dist/core/canonical-json.js +44 -0
  101. package/dist/core/canonical-json.js.map +1 -0
  102. package/dist/core/configuration-error.d.ts +6 -0
  103. package/dist/core/configuration-error.d.ts.map +1 -1
  104. package/dist/core/configuration-error.js +6 -0
  105. package/dist/core/configuration-error.js.map +1 -1
  106. package/dist/core/evidence-provenance.d.ts +6 -0
  107. package/dist/core/evidence-provenance.d.ts.map +1 -1
  108. package/dist/core/evidence-provenance.js +7 -0
  109. package/dist/core/evidence-provenance.js.map +1 -1
  110. package/dist/core/image-formation.d.ts +9 -3
  111. package/dist/core/image-formation.d.ts.map +1 -1
  112. package/dist/core/image-formation.js +29 -5
  113. package/dist/core/image-formation.js.map +1 -1
  114. package/dist/core/owned-data.d.ts +25 -0
  115. package/dist/core/owned-data.d.ts.map +1 -0
  116. package/dist/core/owned-data.js +34 -0
  117. package/dist/core/owned-data.js.map +1 -0
  118. package/dist/core/record-validation.d.ts +17 -0
  119. package/dist/core/record-validation.d.ts.map +1 -0
  120. package/dist/core/record-validation.js +44 -0
  121. package/dist/core/record-validation.js.map +1 -0
  122. package/dist/core/scientific-assurance.d.ts +101 -0
  123. package/dist/core/scientific-assurance.d.ts.map +1 -0
  124. package/dist/core/scientific-assurance.js +301 -0
  125. package/dist/core/scientific-assurance.js.map +1 -0
  126. package/dist/core/spectral-composition.d.ts +106 -0
  127. package/dist/core/spectral-composition.d.ts.map +1 -0
  128. package/dist/core/spectral-composition.js +334 -0
  129. package/dist/core/spectral-composition.js.map +1 -0
  130. package/dist/core/spectral.d.ts +34 -0
  131. package/dist/core/spectral.d.ts.map +1 -0
  132. package/dist/core/spectral.js +57 -0
  133. package/dist/core/spectral.js.map +1 -0
  134. package/dist/core/validation.d.ts +6 -0
  135. package/dist/core/validation.d.ts.map +1 -1
  136. package/dist/core/validation.js +6 -0
  137. package/dist/core/validation.js.map +1 -1
  138. package/dist/core/version.d.ts +14 -0
  139. package/dist/core/version.d.ts.map +1 -0
  140. package/dist/core/version.js +15 -0
  141. package/dist/core/version.js.map +1 -0
  142. package/dist/equipment/exposure-capabilities.d.ts +125 -0
  143. package/dist/equipment/exposure-capabilities.d.ts.map +1 -0
  144. package/dist/equipment/exposure-capabilities.js +391 -0
  145. package/dist/equipment/exposure-capabilities.js.map +1 -0
  146. package/dist/equipment/generic-tier-assets.d.ts +82 -0
  147. package/dist/equipment/generic-tier-assets.d.ts.map +1 -0
  148. package/dist/equipment/generic-tier-assets.js +119 -0
  149. package/dist/equipment/generic-tier-assets.js.map +1 -0
  150. package/dist/equipment/generic-tier-presets.d.ts +57 -0
  151. package/dist/equipment/generic-tier-presets.d.ts.map +1 -0
  152. package/dist/equipment/generic-tier-presets.js +122 -0
  153. package/dist/equipment/generic-tier-presets.js.map +1 -0
  154. package/dist/equipment/iso-capabilities.d.ts +143 -0
  155. package/dist/equipment/iso-capabilities.d.ts.map +1 -0
  156. package/dist/equipment/iso-capabilities.js +578 -0
  157. package/dist/equipment/iso-capabilities.js.map +1 -0
  158. package/dist/equipment/metering-capabilities.d.ts +58 -0
  159. package/dist/equipment/metering-capabilities.d.ts.map +1 -0
  160. package/dist/equipment/metering-capabilities.js +151 -0
  161. package/dist/equipment/metering-capabilities.js.map +1 -0
  162. package/dist/equipment/release-capabilities.d.ts +33 -0
  163. package/dist/equipment/release-capabilities.d.ts.map +1 -0
  164. package/dist/equipment/release-capabilities.js +176 -0
  165. package/dist/equipment/release-capabilities.js.map +1 -0
  166. package/dist/exposure/exposure-duration-control.d.ts +72 -0
  167. package/dist/exposure/exposure-duration-control.d.ts.map +1 -0
  168. package/dist/exposure/exposure-duration-control.js +161 -0
  169. package/dist/exposure/exposure-duration-control.js.map +1 -0
  170. package/dist/exposure/exposure-mode-resolver.d.ts +637 -0
  171. package/dist/exposure/exposure-mode-resolver.d.ts.map +1 -0
  172. package/dist/exposure/exposure-mode-resolver.js +1905 -0
  173. package/dist/exposure/exposure-mode-resolver.js.map +1 -0
  174. package/dist/exposure/exposure.d.ts +8 -0
  175. package/dist/exposure/exposure.d.ts.map +1 -1
  176. package/dist/exposure/exposure.js +8 -0
  177. package/dist/exposure/exposure.js.map +1 -1
  178. package/dist/exposure/flash.d.ts +179 -0
  179. package/dist/exposure/flash.d.ts.map +1 -0
  180. package/dist/exposure/flash.js +644 -0
  181. package/dist/exposure/flash.js.map +1 -0
  182. package/dist/exposure/metering-scene-radiance.d.ts +72 -0
  183. package/dist/exposure/metering-scene-radiance.d.ts.map +1 -0
  184. package/dist/exposure/metering-scene-radiance.js +222 -0
  185. package/dist/exposure/metering-scene-radiance.js.map +1 -0
  186. package/dist/exposure/metering-target.d.ts +67 -0
  187. package/dist/exposure/metering-target.d.ts.map +1 -0
  188. package/dist/exposure/metering-target.js +265 -0
  189. package/dist/exposure/metering-target.js.map +1 -0
  190. package/dist/exposure/metering-temporal.d.ts +76 -0
  191. package/dist/exposure/metering-temporal.d.ts.map +1 -0
  192. package/dist/exposure/metering-temporal.js +210 -0
  193. package/dist/exposure/metering-temporal.js.map +1 -0
  194. package/dist/exposure/metering.d.ts +124 -0
  195. package/dist/exposure/metering.d.ts.map +1 -0
  196. package/dist/exposure/metering.js +422 -0
  197. package/dist/exposure/metering.js.map +1 -0
  198. package/dist/exposure/program-line.d.ts +29 -0
  199. package/dist/exposure/program-line.d.ts.map +1 -0
  200. package/dist/exposure/program-line.js +126 -0
  201. package/dist/exposure/program-line.js.map +1 -0
  202. package/dist/index.d.ts +101 -7
  203. package/dist/index.d.ts.map +1 -1
  204. package/dist/index.js +99 -7
  205. package/dist/index.js.map +1 -1
  206. package/dist/motion/camera-rotation.d.ts +76 -0
  207. package/dist/motion/camera-rotation.d.ts.map +1 -1
  208. package/dist/motion/camera-rotation.js +111 -0
  209. package/dist/motion/camera-rotation.js.map +1 -1
  210. package/dist/motion/capture-rotation-inverse-mapping.d.ts +113 -0
  211. package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +1 -0
  212. package/dist/motion/capture-rotation-inverse-mapping.js +184 -0
  213. package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -0
  214. package/dist/motion/capture-rotation-temporal-quadrature.d.ts +104 -0
  215. package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +1 -0
  216. package/dist/motion/capture-rotation-temporal-quadrature.js +131 -0
  217. package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -0
  218. package/dist/motion/capture-rotation-trajectory.d.ts +113 -0
  219. package/dist/motion/capture-rotation-trajectory.d.ts.map +1 -0
  220. package/dist/motion/capture-rotation-trajectory.js +168 -0
  221. package/dist/motion/capture-rotation-trajectory.js.map +1 -0
  222. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +119 -0
  223. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +1 -0
  224. package/dist/motion/capture-translation-parallax-temporal-quadrature.js +263 -0
  225. package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -0
  226. package/dist/motion/extended-object-projection.d.ts +175 -0
  227. package/dist/motion/extended-object-projection.d.ts.map +1 -0
  228. package/dist/motion/extended-object-projection.js +402 -0
  229. package/dist/motion/extended-object-projection.js.map +1 -0
  230. package/dist/motion/projected-motion.d.ts +11 -0
  231. package/dist/motion/projected-motion.d.ts.map +1 -1
  232. package/dist/motion/projected-motion.js +11 -0
  233. package/dist/motion/projected-motion.js.map +1 -1
  234. package/dist/optics/aperture.d.ts +9 -0
  235. package/dist/optics/aperture.d.ts.map +1 -1
  236. package/dist/optics/aperture.js +9 -0
  237. package/dist/optics/aperture.js.map +1 -1
  238. package/dist/optics/circle-of-confusion.d.ts +8 -0
  239. package/dist/optics/circle-of-confusion.d.ts.map +1 -1
  240. package/dist/optics/circle-of-confusion.js +8 -0
  241. package/dist/optics/circle-of-confusion.js.map +1 -1
  242. package/dist/optics/complex-pupil-psf.d.ts +128 -0
  243. package/dist/optics/complex-pupil-psf.d.ts.map +1 -0
  244. package/dist/optics/complex-pupil-psf.js +462 -0
  245. package/dist/optics/complex-pupil-psf.js.map +1 -0
  246. package/dist/optics/depth-of-field.d.ts +18 -0
  247. package/dist/optics/depth-of-field.d.ts.map +1 -1
  248. package/dist/optics/depth-of-field.js +29 -4
  249. package/dist/optics/depth-of-field.js.map +1 -1
  250. package/dist/optics/diffraction.d.ts +8 -0
  251. package/dist/optics/diffraction.d.ts.map +1 -1
  252. package/dist/optics/diffraction.js +8 -0
  253. package/dist/optics/diffraction.js.map +1 -1
  254. package/dist/optics/focus-breathing.d.ts +13 -0
  255. package/dist/optics/focus-breathing.d.ts.map +1 -1
  256. package/dist/optics/focus-breathing.js +13 -0
  257. package/dist/optics/focus-breathing.js.map +1 -1
  258. package/dist/optics/focus-state.d.ts +47 -0
  259. package/dist/optics/focus-state.d.ts.map +1 -0
  260. package/dist/optics/focus-state.js +78 -0
  261. package/dist/optics/focus-state.js.map +1 -0
  262. package/dist/optics/front-of-lens-filter.d.ts +114 -0
  263. package/dist/optics/front-of-lens-filter.d.ts.map +1 -0
  264. package/dist/optics/front-of-lens-filter.js +468 -0
  265. package/dist/optics/front-of-lens-filter.js.map +1 -0
  266. package/dist/optics/illumination-vignetting.d.ts +9 -0
  267. package/dist/optics/illumination-vignetting.d.ts.map +1 -1
  268. package/dist/optics/illumination-vignetting.js +9 -0
  269. package/dist/optics/illumination-vignetting.js.map +1 -1
  270. package/dist/optics/lateral-chromatic-aberration.d.ts +11 -0
  271. package/dist/optics/lateral-chromatic-aberration.d.ts.map +1 -1
  272. package/dist/optics/lateral-chromatic-aberration.js +23 -4
  273. package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
  274. package/dist/optics/lens-psf-profile.d.ts +217 -0
  275. package/dist/optics/lens-psf-profile.d.ts.map +1 -0
  276. package/dist/optics/lens-psf-profile.js +823 -0
  277. package/dist/optics/lens-psf-profile.js.map +1 -0
  278. package/dist/optics/polygon-diffraction.d.ts +67 -0
  279. package/dist/optics/polygon-diffraction.d.ts.map +1 -0
  280. package/dist/optics/polygon-diffraction.js +145 -0
  281. package/dist/optics/polygon-diffraction.js.map +1 -0
  282. package/dist/optics/profile-contract.d.ts +42 -0
  283. package/dist/optics/profile-contract.d.ts.map +1 -0
  284. package/dist/optics/profile-contract.js +92 -0
  285. package/dist/optics/profile-contract.js.map +1 -0
  286. package/dist/optics/psf-foundation.d.ts +16 -3
  287. package/dist/optics/psf-foundation.d.ts.map +1 -1
  288. package/dist/optics/psf-foundation.js +28 -15
  289. package/dist/optics/psf-foundation.js.map +1 -1
  290. package/dist/optics/radial-distortion.d.ts +22 -2
  291. package/dist/optics/radial-distortion.d.ts.map +1 -1
  292. package/dist/optics/radial-distortion.js +101 -23
  293. package/dist/optics/radial-distortion.js.map +1 -1
  294. package/dist/optics/scene-to-sensor-irradiance.d.ts +213 -0
  295. package/dist/optics/scene-to-sensor-irradiance.d.ts.map +1 -0
  296. package/dist/optics/scene-to-sensor-irradiance.js +662 -0
  297. package/dist/optics/scene-to-sensor-irradiance.js.map +1 -0
  298. package/dist/optics/scene-to-sensor-quadrature.d.ts +63 -0
  299. package/dist/optics/scene-to-sensor-quadrature.d.ts.map +1 -0
  300. package/dist/optics/scene-to-sensor-quadrature.js +82 -0
  301. package/dist/optics/scene-to-sensor-quadrature.js.map +1 -0
  302. package/dist/optics/sensor-environment-query.d.ts +60 -0
  303. package/dist/optics/sensor-environment-query.d.ts.map +1 -0
  304. package/dist/optics/sensor-environment-query.js +50 -0
  305. package/dist/optics/sensor-environment-query.js.map +1 -0
  306. package/dist/optics/sensor-psf-quadrature.d.ts +70 -0
  307. package/dist/optics/sensor-psf-quadrature.d.ts.map +1 -0
  308. package/dist/optics/sensor-psf-quadrature.js +101 -0
  309. package/dist/optics/sensor-psf-quadrature.js.map +1 -0
  310. package/dist/optics/sensor-psf-support.d.ts +20 -0
  311. package/dist/optics/sensor-psf-support.d.ts.map +1 -0
  312. package/dist/optics/sensor-psf-support.js +13 -0
  313. package/dist/optics/sensor-psf-support.js.map +1 -0
  314. package/dist/optics/stray-light.d.ts +91 -0
  315. package/dist/optics/stray-light.d.ts.map +1 -0
  316. package/dist/optics/stray-light.js +110 -0
  317. package/dist/optics/stray-light.js.map +1 -0
  318. package/dist/optics/thin-lens.d.ts +8 -0
  319. package/dist/optics/thin-lens.d.ts.map +1 -1
  320. package/dist/optics/thin-lens.js +8 -0
  321. package/dist/optics/thin-lens.js.map +1 -1
  322. package/dist/output/capture-corrected-sdr.d.ts +49 -0
  323. package/dist/output/capture-corrected-sdr.d.ts.map +1 -0
  324. package/dist/output/capture-corrected-sdr.js +149 -0
  325. package/dist/output/capture-corrected-sdr.js.map +1 -0
  326. package/dist/output/capture-geometry.d.ts.map +1 -1
  327. package/dist/output/capture-geometry.js +32 -11
  328. package/dist/output/capture-geometry.js.map +1 -1
  329. package/dist/output/capture-sdr.d.ts +49 -0
  330. package/dist/output/capture-sdr.d.ts.map +1 -0
  331. package/dist/output/capture-sdr.js +90 -0
  332. package/dist/output/capture-sdr.js.map +1 -0
  333. package/dist/output/crop.d.ts +6 -0
  334. package/dist/output/crop.d.ts.map +1 -1
  335. package/dist/output/crop.js +6 -0
  336. package/dist/output/crop.js.map +1 -1
  337. package/dist/output/geometric-transforms.d.ts +137 -0
  338. package/dist/output/geometric-transforms.d.ts.map +1 -0
  339. package/dist/output/geometric-transforms.js +225 -0
  340. package/dist/output/geometric-transforms.js.map +1 -0
  341. package/dist/output/lens-corrections.d.ts +121 -0
  342. package/dist/output/lens-corrections.d.ts.map +1 -0
  343. package/dist/output/lens-corrections.js +210 -0
  344. package/dist/output/lens-corrections.js.map +1 -0
  345. package/dist/output/sdr-rendering.d.ts +81 -0
  346. package/dist/output/sdr-rendering.d.ts.map +1 -0
  347. package/dist/output/sdr-rendering.js +106 -0
  348. package/dist/output/sdr-rendering.js.map +1 -0
  349. package/dist/output/subject-framing-crop.d.ts +8 -0
  350. package/dist/output/subject-framing-crop.d.ts.map +1 -1
  351. package/dist/output/subject-framing-crop.js +8 -0
  352. package/dist/output/subject-framing-crop.js.map +1 -1
  353. package/dist/schema/camera.d.ts +6 -0
  354. package/dist/schema/camera.d.ts.map +1 -1
  355. package/dist/schema/illumination-spectral.d.ts +51 -0
  356. package/dist/schema/illumination-spectral.d.ts.map +1 -0
  357. package/dist/schema/illumination-spectral.js +132 -0
  358. package/dist/schema/illumination-spectral.js.map +1 -0
  359. package/dist/schema/illumination-temporal.d.ts +156 -0
  360. package/dist/schema/illumination-temporal.d.ts.map +1 -0
  361. package/dist/schema/illumination-temporal.js +554 -0
  362. package/dist/schema/illumination-temporal.js.map +1 -0
  363. package/dist/schema/illumination.d.ts +138 -0
  364. package/dist/schema/illumination.d.ts.map +1 -0
  365. package/dist/schema/illumination.js +483 -0
  366. package/dist/schema/illumination.js.map +1 -0
  367. package/dist/schema/scene-radiance-temporal.d.ts +107 -0
  368. package/dist/schema/scene-radiance-temporal.d.ts.map +1 -0
  369. package/dist/schema/scene-radiance-temporal.js +259 -0
  370. package/dist/schema/scene-radiance-temporal.js.map +1 -0
  371. package/dist/schema/scene-radiance.d.ts +185 -0
  372. package/dist/schema/scene-radiance.d.ts.map +1 -0
  373. package/dist/schema/scene-radiance.js +535 -0
  374. package/dist/schema/scene-radiance.js.map +1 -0
  375. package/dist/schema/scene.d.ts +7 -0
  376. package/dist/schema/scene.d.ts.map +1 -1
  377. package/dist/schema/validation.d.ts.map +1 -1
  378. package/dist/schema/validation.js +7 -0
  379. package/dist/schema/validation.js.map +1 -1
  380. package/dist/sensor/accumulated-charge.d.ts +199 -0
  381. package/dist/sensor/accumulated-charge.d.ts.map +1 -0
  382. package/dist/sensor/accumulated-charge.js +450 -0
  383. package/dist/sensor/accumulated-charge.js.map +1 -0
  384. package/dist/sensor/architecture.d.ts +48 -13
  385. package/dist/sensor/architecture.d.ts.map +1 -1
  386. package/dist/sensor/architecture.js +58 -16
  387. package/dist/sensor/architecture.js.map +1 -1
  388. package/dist/sensor/camera-saturation-capacity.d.ts +138 -0
  389. package/dist/sensor/camera-saturation-capacity.d.ts.map +1 -0
  390. package/dist/sensor/camera-saturation-capacity.js +356 -0
  391. package/dist/sensor/camera-saturation-capacity.js.map +1 -0
  392. package/dist/sensor/capture-color-sampling-binding.d.ts +212 -0
  393. package/dist/sensor/capture-color-sampling-binding.d.ts.map +1 -0
  394. package/dist/sensor/capture-color-sampling-binding.js +437 -0
  395. package/dist/sensor/capture-color-sampling-binding.js.map +1 -0
  396. package/dist/sensor/capture-mode-timing.d.ts +63 -0
  397. package/dist/sensor/capture-mode-timing.d.ts.map +1 -0
  398. package/dist/sensor/capture-mode-timing.js +270 -0
  399. package/dist/sensor/capture-mode-timing.js.map +1 -0
  400. package/dist/sensor/capture-mode.d.ts +157 -0
  401. package/dist/sensor/capture-mode.d.ts.map +1 -0
  402. package/dist/sensor/capture-mode.js +447 -0
  403. package/dist/sensor/capture-mode.js.map +1 -0
  404. package/dist/sensor/color-sampling.d.ts +133 -0
  405. package/dist/sensor/color-sampling.d.ts.map +1 -0
  406. package/dist/sensor/color-sampling.js +245 -0
  407. package/dist/sensor/color-sampling.js.map +1 -0
  408. package/dist/sensor/constant-rate-temporal-integration.d.ts +126 -0
  409. package/dist/sensor/constant-rate-temporal-integration.d.ts.map +1 -0
  410. package/dist/sensor/constant-rate-temporal-integration.js +382 -0
  411. package/dist/sensor/constant-rate-temporal-integration.js.map +1 -0
  412. package/dist/sensor/dark-current.d.ts +169 -0
  413. package/dist/sensor/dark-current.d.ts.map +1 -0
  414. package/dist/sensor/dark-current.js +427 -0
  415. package/dist/sensor/dark-current.js.map +1 -0
  416. package/dist/sensor/environment-photo-signal.d.ts +123 -0
  417. package/dist/sensor/environment-photo-signal.d.ts.map +1 -0
  418. package/dist/sensor/environment-photo-signal.js +186 -0
  419. package/dist/sensor/environment-photo-signal.js.map +1 -0
  420. package/dist/sensor/eqe-electron-rate.d.ts +107 -0
  421. package/dist/sensor/eqe-electron-rate.d.ts.map +1 -0
  422. package/dist/sensor/eqe-electron-rate.js +561 -0
  423. package/dist/sensor/eqe-electron-rate.js.map +1 -0
  424. package/dist/sensor/eqe-local-exposure.d.ts +65 -0
  425. package/dist/sensor/eqe-local-exposure.d.ts.map +1 -0
  426. package/dist/sensor/eqe-local-exposure.js +84 -0
  427. package/dist/sensor/eqe-local-exposure.js.map +1 -0
  428. package/dist/sensor/eqe-temporal-exposure.d.ts +55 -0
  429. package/dist/sensor/eqe-temporal-exposure.d.ts.map +1 -0
  430. package/dist/sensor/eqe-temporal-exposure.js +62 -0
  431. package/dist/sensor/eqe-temporal-exposure.js.map +1 -0
  432. package/dist/sensor/exposure-window.d.ts +117 -0
  433. package/dist/sensor/exposure-window.d.ts.map +1 -0
  434. package/dist/sensor/exposure-window.js +305 -0
  435. package/dist/sensor/exposure-window.js.map +1 -0
  436. package/dist/sensor/iso-signal-chain.d.ts +148 -0
  437. package/dist/sensor/iso-signal-chain.d.ts.map +1 -0
  438. package/dist/sensor/iso-signal-chain.js +411 -0
  439. package/dist/sensor/iso-signal-chain.js.map +1 -0
  440. package/dist/sensor/local-exposure-binding.d.ts +87 -0
  441. package/dist/sensor/local-exposure-binding.d.ts.map +1 -0
  442. package/dist/sensor/local-exposure-binding.js +214 -0
  443. package/dist/sensor/local-exposure-binding.js.map +1 -0
  444. package/dist/sensor/optical-stack.d.ts +132 -0
  445. package/dist/sensor/optical-stack.d.ts.map +1 -0
  446. package/dist/sensor/optical-stack.js +303 -0
  447. package/dist/sensor/optical-stack.js.map +1 -0
  448. package/dist/sensor/photon-energy.d.ts +97 -0
  449. package/dist/sensor/photon-energy.d.ts.map +1 -0
  450. package/dist/sensor/photon-energy.js +390 -0
  451. package/dist/sensor/photon-energy.js.map +1 -0
  452. package/dist/sensor/physical-charge-capacity.d.ts +130 -0
  453. package/dist/sensor/physical-charge-capacity.d.ts.map +1 -0
  454. package/dist/sensor/physical-charge-capacity.js +345 -0
  455. package/dist/sensor/physical-charge-capacity.js.map +1 -0
  456. package/dist/sensor/pixel-pitch.d.ts +6 -0
  457. package/dist/sensor/pixel-pitch.d.ts.map +1 -1
  458. package/dist/sensor/pixel-pitch.js +6 -0
  459. package/dist/sensor/pixel-pitch.js.map +1 -1
  460. package/dist/sensor/radiometry-readiness.d.ts +10 -0
  461. package/dist/sensor/radiometry-readiness.d.ts.map +1 -1
  462. package/dist/sensor/radiometry-readiness.js +10 -0
  463. package/dist/sensor/radiometry-readiness.js.map +1 -1
  464. package/dist/sensor/raw-readout.d.ts +314 -0
  465. package/dist/sensor/raw-readout.d.ts.map +1 -0
  466. package/dist/sensor/raw-readout.js +914 -0
  467. package/dist/sensor/raw-readout.js.map +1 -0
  468. package/dist/sensor/raw-reconstruction.d.ts +170 -0
  469. package/dist/sensor/raw-reconstruction.d.ts.map +1 -0
  470. package/dist/sensor/raw-reconstruction.js +424 -0
  471. package/dist/sensor/raw-reconstruction.js.map +1 -0
  472. package/dist/sensor/readout-exposure-linkage.d.ts +123 -0
  473. package/dist/sensor/readout-exposure-linkage.d.ts.map +1 -0
  474. package/dist/sensor/readout-exposure-linkage.js +222 -0
  475. package/dist/sensor/readout-exposure-linkage.js.map +1 -0
  476. package/dist/sensor/readout-timing.d.ts +137 -0
  477. package/dist/sensor/readout-timing.d.ts.map +1 -0
  478. package/dist/sensor/readout-timing.js +243 -0
  479. package/dist/sensor/readout-timing.js.map +1 -0
  480. package/dist/sensor/response-application-compatibility.d.ts +136 -0
  481. package/dist/sensor/response-application-compatibility.d.ts.map +1 -0
  482. package/dist/sensor/response-application-compatibility.js +408 -0
  483. package/dist/sensor/response-application-compatibility.js.map +1 -0
  484. package/dist/sensor/response-operating-range.d.ts +173 -0
  485. package/dist/sensor/response-operating-range.d.ts.map +1 -0
  486. package/dist/sensor/response-operating-range.js +672 -0
  487. package/dist/sensor/response-operating-range.js.map +1 -0
  488. package/dist/sensor/responsivity-photocurrent.d.ts +158 -0
  489. package/dist/sensor/responsivity-photocurrent.d.ts.map +1 -0
  490. package/dist/sensor/responsivity-photocurrent.js +644 -0
  491. package/dist/sensor/responsivity-photocurrent.js.map +1 -0
  492. package/dist/sensor/sampling-aperture.d.ts +154 -0
  493. package/dist/sensor/sampling-aperture.d.ts.map +1 -0
  494. package/dist/sensor/sampling-aperture.js +388 -0
  495. package/dist/sensor/sampling-aperture.js.map +1 -0
  496. package/dist/sensor/scene-eqe-temporal-exposure.d.ts +45 -0
  497. package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +1 -0
  498. package/dist/sensor/scene-eqe-temporal-exposure.js +64 -0
  499. package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -0
  500. package/dist/sensor/sensor-geometry.d.ts +12 -0
  501. package/dist/sensor/sensor-geometry.d.ts.map +1 -1
  502. package/dist/sensor/sensor-geometry.js +12 -0
  503. package/dist/sensor/sensor-geometry.js.map +1 -1
  504. package/dist/sensor/signal-noise.d.ts +10 -0
  505. package/dist/sensor/signal-noise.d.ts.map +1 -1
  506. package/dist/sensor/signal-noise.js +10 -0
  507. package/dist/sensor/signal-noise.js.map +1 -1
  508. package/dist/sensor/spatial-sample-reduction.d.ts +171 -0
  509. package/dist/sensor/spatial-sample-reduction.d.ts.map +1 -0
  510. package/dist/sensor/spatial-sample-reduction.js +345 -0
  511. package/dist/sensor/spatial-sample-reduction.js.map +1 -0
  512. package/dist/sensor/spatial-sampling-quadrature.d.ts +179 -0
  513. package/dist/sensor/spatial-sampling-quadrature.d.ts.map +1 -0
  514. package/dist/sensor/spatial-sampling-quadrature.js +224 -0
  515. package/dist/sensor/spatial-sampling-quadrature.js.map +1 -0
  516. package/dist/sensor/spatio-spectral-reduction.d.ts +187 -0
  517. package/dist/sensor/spatio-spectral-reduction.d.ts.map +1 -0
  518. package/dist/sensor/spatio-spectral-reduction.js +373 -0
  519. package/dist/sensor/spatio-spectral-reduction.js.map +1 -0
  520. package/dist/sensor/spectral-coverage.d.ts +24 -0
  521. package/dist/sensor/spectral-coverage.d.ts.map +1 -0
  522. package/dist/sensor/spectral-coverage.js +86 -0
  523. package/dist/sensor/spectral-coverage.js.map +1 -0
  524. package/dist/sensor/spectral-quadrature.d.ts +169 -0
  525. package/dist/sensor/spectral-quadrature.d.ts.map +1 -0
  526. package/dist/sensor/spectral-quadrature.js +542 -0
  527. package/dist/sensor/spectral-quadrature.js.map +1 -0
  528. package/dist/sensor/spectral-response.d.ts +192 -0
  529. package/dist/sensor/spectral-response.d.ts.map +1 -0
  530. package/dist/sensor/spectral-response.js +664 -0
  531. package/dist/sensor/spectral-response.js.map +1 -0
  532. package/dist/sensor/temporal-eqe-sum.d.ts +15 -0
  533. package/dist/sensor/temporal-eqe-sum.d.ts.map +1 -0
  534. package/dist/sensor/temporal-eqe-sum.js +30 -0
  535. package/dist/sensor/temporal-eqe-sum.js.map +1 -0
  536. package/dist/sensor/temporal-photo-signal.d.ts +38 -0
  537. package/dist/sensor/temporal-photo-signal.d.ts.map +1 -0
  538. package/dist/sensor/temporal-photo-signal.js +110 -0
  539. package/dist/sensor/temporal-photo-signal.js.map +1 -0
  540. package/dist/sensor/temporal-sample-binding.d.ts +6 -0
  541. package/dist/sensor/temporal-sample-binding.d.ts.map +1 -0
  542. package/dist/sensor/temporal-sample-binding.js +32 -0
  543. package/dist/sensor/temporal-sample-binding.js.map +1 -0
  544. package/dist/simulation/poc-simulation.d.ts.map +1 -1
  545. package/dist/simulation/poc-simulation.js +34 -11
  546. package/dist/simulation/poc-simulation.js.map +1 -1
  547. package/dist/stabilization/camera-shake.d.ts +11 -0
  548. package/dist/stabilization/camera-shake.d.ts.map +1 -1
  549. package/dist/stabilization/camera-shake.js +11 -0
  550. package/dist/stabilization/camera-shake.js.map +1 -1
  551. package/dist/stabilization/system.d.ts +218 -0
  552. package/dist/stabilization/system.d.ts.map +1 -0
  553. package/dist/stabilization/system.js +695 -0
  554. package/dist/stabilization/system.js.map +1 -0
  555. package/docs/API_REFERENCE.md +2017 -0
  556. package/docs/API_STYLE.md +132 -0
  557. package/docs/ARCHITECTURE.md +150 -23
  558. package/docs/AUTOMATION_COORDINATION.md +190 -0
  559. package/docs/CAPTURE_COLOR.md +25 -0
  560. package/docs/CAPTURE_CORRECTED_SDR.md +25 -0
  561. package/docs/CAPTURE_EXPORT_METADATA.md +27 -0
  562. package/docs/CAPTURE_SDR.md +20 -0
  563. package/docs/DEVELOPERS.md +60 -0
  564. package/docs/DIGITAL_OPTICS_FOUNDATION.md +69 -0
  565. package/docs/ENVIRONMENT_RAW_CAPTURE.md +187 -0
  566. package/docs/EXPORT_ACCEPTANCE.md +133 -0
  567. package/docs/GENERIC_TIER_PRESETS.md +269 -0
  568. package/docs/GEOMETRIC_PREPARATION_REUSE.md +141 -0
  569. package/docs/IMAGE_FORMATION.md +105 -9
  570. package/docs/LINEAR_CAPTURE_ENCODING.md +25 -0
  571. package/docs/MOTION_AND_SIGNAL.md +145 -1
  572. package/docs/NUMERICAL_CORRECTNESS.md +191 -0
  573. package/docs/PERFORMANCE_BASELINE.md +56 -0
  574. package/docs/PHOTOGRAPHIC_EXPORT.md +206 -0
  575. package/docs/PHYSICS_FOUNDATION.md +152 -5
  576. package/docs/POC_API.md +2 -0
  577. package/docs/POC_PROJECTION_REUSE.md +124 -0
  578. package/docs/PROCESSED_OUTPUT.md +157 -0
  579. package/docs/PRODUCTION_COMPOSITION.md +373 -0
  580. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +131 -0
  581. package/docs/PROVENANCE.md +4 -0
  582. package/docs/PSF_FOUNDATION.md +110 -88
  583. package/docs/RAW_FRAME_ENVELOPE.md +56 -0
  584. package/docs/RAW_FRAME_RECONSTRUCTION.md +30 -0
  585. package/docs/RELEASE_1_0.md +65 -0
  586. package/docs/RELEASE_AUDIT.md +38 -0
  587. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +298 -0
  588. package/docs/SCENE_SENSOR_QUADRATURE.md +98 -0
  589. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +86 -0
  590. package/docs/SCIENTIFIC_ASSURANCE.md +280 -0
  591. package/docs/SCIENTIFIC_CONFORMANCE.md +83 -0
  592. package/docs/SDR_RENDERING.md +33 -0
  593. package/docs/SENSOR_ENVIRONMENT_QUERY.md +86 -0
  594. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +104 -0
  595. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +74 -0
  596. package/docs/SENSOR_PSF_QUADRATURE.md +90 -0
  597. package/docs/SENSOR_RAW_FRAME.md +20 -0
  598. package/docs/SENSOR_RAW_PRODUCER.md +77 -0
  599. package/docs/SIGNAL_CONFORMANCE.md +23 -0
  600. package/docs/SIMULATED_CAPTURE.md +65 -0
  601. package/docs/STABILIZATION.md +160 -17
  602. package/docs/TEMPORAL_PHOTO_RAW.md +83 -0
  603. package/docs/TIER_ACCEPTANCE.md +129 -0
  604. package/docs/TIER_PRESET_ACCEPTANCE.md +59 -0
  605. package/docs/USAGE.md +5604 -331
  606. package/docs/V1_COMPOSITION_MAP.md +123 -0
  607. package/docs/V1_HELPER_REUSE_REVIEW.md +60 -0
  608. package/docs/V1_PERFORMANCE_DISPOSITION.md +88 -0
  609. package/docs/api/camera-equivalent-focal-length.md +53 -0
  610. package/docs/api/camera-field-of-view.md +119 -0
  611. package/docs/api/camera-projected-object-size.md +54 -0
  612. package/docs/api/capture-capture-export-metadata.md +107 -0
  613. package/docs/api/capture-environment-raw-producer.md +56 -0
  614. package/docs/api/capture-focus-control.md +419 -0
  615. package/docs/api/capture-linear-encoding.md +99 -0
  616. package/docs/api/capture-photographic-export.md +172 -0
  617. package/docs/api/capture-raw-frame-reconstruction.md +87 -0
  618. package/docs/api/capture-release-sequence.md +252 -0
  619. package/docs/api/capture-sensor-raw-frame.md +66 -0
  620. package/docs/api/capture-sensor-raw-producer.md +98 -0
  621. package/docs/api/capture-simulated-capture.md +179 -0
  622. package/docs/api/color-capture-color.md +122 -0
  623. package/docs/api/color-white-balance.md +386 -0
  624. package/docs/api/composition-image-formation-plan.md +825 -0
  625. package/docs/api/composition-plan-consumer.md +98 -0
  626. package/docs/api/core-calculation-result.md +220 -0
  627. package/docs/api/core-configuration-error.md +19 -0
  628. package/docs/api/core-image-formation.md +204 -0
  629. package/docs/api/core-scientific-assurance.md +214 -0
  630. package/docs/api/core-spectral-composition.md +268 -0
  631. package/docs/api/core-spectral.md +78 -0
  632. package/docs/api/core-validation.md +34 -0
  633. package/docs/api/core-version.md +14 -0
  634. package/docs/api/equipment-exposure-capabilities.md +270 -0
  635. package/docs/api/equipment-generic-tier-assets.md +82 -0
  636. package/docs/api/equipment-generic-tier-presets.md +103 -0
  637. package/docs/api/equipment-iso-capabilities.md +295 -0
  638. package/docs/api/equipment-metering-capabilities.md +126 -0
  639. package/docs/api/equipment-release-capabilities.md +91 -0
  640. package/docs/api/exports.json +5656 -0
  641. package/docs/api/exposure-exposure-duration-control.md +115 -0
  642. package/docs/api/exposure-exposure-mode-resolver.md +966 -0
  643. package/docs/api/exposure-exposure.md +150 -0
  644. package/docs/api/exposure-flash.md +327 -0
  645. package/docs/api/exposure-metering-scene-radiance.md +154 -0
  646. package/docs/api/exposure-metering-target.md +134 -0
  647. package/docs/api/exposure-metering-temporal.md +77 -0
  648. package/docs/api/exposure-metering.md +172 -0
  649. package/docs/api/exposure-program-line.md +64 -0
  650. package/docs/api/motion-camera-rotation.md +215 -0
  651. package/docs/api/motion-capture-rotation-inverse-mapping.md +128 -0
  652. package/docs/api/motion-capture-rotation-temporal-quadrature.md +127 -0
  653. package/docs/api/motion-capture-rotation-trajectory.md +132 -0
  654. package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +171 -0
  655. package/docs/api/motion-extended-object-projection.md +312 -0
  656. package/docs/api/motion-projected-motion.md +60 -0
  657. package/docs/api/optics-aperture.md +69 -0
  658. package/docs/api/optics-circle-of-confusion.md +46 -0
  659. package/docs/api/optics-complex-pupil-psf.md +193 -0
  660. package/docs/api/optics-depth-of-field.md +92 -0
  661. package/docs/api/optics-diffraction.md +46 -0
  662. package/docs/api/optics-focus-breathing.md +119 -0
  663. package/docs/api/optics-focus-state.md +64 -0
  664. package/docs/api/optics-front-of-lens-filter.md +263 -0
  665. package/docs/api/optics-illumination-vignetting.md +95 -0
  666. package/docs/api/optics-lateral-chromatic-aberration.md +225 -0
  667. package/docs/api/optics-lens-psf-profile.md +380 -0
  668. package/docs/api/optics-polygon-diffraction.md +68 -0
  669. package/docs/api/optics-profile-contract.md +47 -0
  670. package/docs/api/optics-psf-foundation.md +181 -0
  671. package/docs/api/optics-radial-distortion.md +194 -0
  672. package/docs/api/optics-scene-to-sensor-irradiance.md +371 -0
  673. package/docs/api/optics-scene-to-sensor-quadrature.md +78 -0
  674. package/docs/api/optics-sensor-environment-query.md +58 -0
  675. package/docs/api/optics-sensor-psf-quadrature.md +81 -0
  676. package/docs/api/optics-stray-light.md +109 -0
  677. package/docs/api/optics-thin-lens.md +53 -0
  678. package/docs/api/output-capture-corrected-sdr.md +71 -0
  679. package/docs/api/output-capture-geometry.md +500 -0
  680. package/docs/api/output-capture-sdr.md +69 -0
  681. package/docs/api/output-crop.md +47 -0
  682. package/docs/api/output-geometric-transforms.md +199 -0
  683. package/docs/api/output-lens-corrections.md +162 -0
  684. package/docs/api/output-sdr-rendering.md +122 -0
  685. package/docs/api/output-subject-framing-crop.md +59 -0
  686. package/docs/api/schema-camera.md +84 -0
  687. package/docs/api/schema-illumination-spectral.md +77 -0
  688. package/docs/api/schema-illumination-temporal.md +289 -0
  689. package/docs/api/schema-illumination.md +246 -0
  690. package/docs/api/schema-scene-radiance-temporal.md +215 -0
  691. package/docs/api/schema-scene-radiance.md +415 -0
  692. package/docs/api/schema-scene.md +105 -0
  693. package/docs/api/schema-validation.md +25 -0
  694. package/docs/api/sensor-accumulated-charge.md +273 -0
  695. package/docs/api/sensor-architecture.md +155 -0
  696. package/docs/api/sensor-camera-saturation-capacity.md +215 -0
  697. package/docs/api/sensor-capture-color-sampling-binding.md +323 -0
  698. package/docs/api/sensor-capture-mode-timing.md +123 -0
  699. package/docs/api/sensor-capture-mode.md +321 -0
  700. package/docs/api/sensor-color-sampling.md +228 -0
  701. package/docs/api/sensor-constant-rate-temporal-integration.md +152 -0
  702. package/docs/api/sensor-dark-current.md +227 -0
  703. package/docs/api/sensor-environment-photo-signal.md +77 -0
  704. package/docs/api/sensor-eqe-electron-rate.md +166 -0
  705. package/docs/api/sensor-eqe-local-exposure.md +68 -0
  706. package/docs/api/sensor-eqe-temporal-exposure.md +73 -0
  707. package/docs/api/sensor-exposure-window.md +183 -0
  708. package/docs/api/sensor-iso-signal-chain.md +264 -0
  709. package/docs/api/sensor-local-exposure-binding.md +126 -0
  710. package/docs/api/sensor-optical-stack.md +211 -0
  711. package/docs/api/sensor-photon-energy.md +149 -0
  712. package/docs/api/sensor-physical-charge-capacity.md +196 -0
  713. package/docs/api/sensor-pixel-pitch.md +41 -0
  714. package/docs/api/sensor-radiometry-readiness.md +240 -0
  715. package/docs/api/sensor-raw-readout.md +499 -0
  716. package/docs/api/sensor-raw-reconstruction.md +260 -0
  717. package/docs/api/sensor-readout-exposure-linkage.md +172 -0
  718. package/docs/api/sensor-readout-timing.md +209 -0
  719. package/docs/api/sensor-response-application-compatibility.md +256 -0
  720. package/docs/api/sensor-response-operating-range.md +293 -0
  721. package/docs/api/sensor-responsivity-photocurrent.md +245 -0
  722. package/docs/api/sensor-sampling-aperture.md +221 -0
  723. package/docs/api/sensor-scene-eqe-temporal-exposure.md +56 -0
  724. package/docs/api/sensor-sensor-geometry.md +143 -0
  725. package/docs/api/sensor-signal-noise.md +75 -0
  726. package/docs/api/sensor-spatial-sample-reduction.md +186 -0
  727. package/docs/api/sensor-spatial-sampling-quadrature.md +188 -0
  728. package/docs/api/sensor-spatio-spectral-reduction.md +217 -0
  729. package/docs/api/sensor-spectral-coverage.md +33 -0
  730. package/docs/api/sensor-spectral-quadrature.md +183 -0
  731. package/docs/api/sensor-spectral-response.md +291 -0
  732. package/docs/api/sensor-temporal-photo-signal.md +62 -0
  733. package/docs/api/simulation-poc-simulation.md +364 -0
  734. package/docs/api/stabilization-camera-shake.md +71 -0
  735. package/docs/api/stabilization-system.md +442 -0
  736. package/docs/benchmarks/2026-10-01-main-baseline.json +694 -0
  737. package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +2190 -0
  738. package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +2423 -0
  739. package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +210 -0
  740. package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +187 -0
  741. package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +756 -0
  742. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +711 -0
  743. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +711 -0
  744. package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +885 -0
  745. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +868 -0
  746. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +868 -0
  747. package/docs/examples/production-capture.mjs +34 -0
  748. package/docs/examples/production-request.json +4613 -0
  749. package/docs/examples/quick-start.mjs +12 -0
  750. package/docs/validation/documentation-fragments.json +212 -0
  751. package/docs/validation/release-audit-inventory.json +1306 -0
  752. package/docs/validation/tier-acceptance-report-v1.json +2538 -0
  753. package/package.json +18 -4
@@ -0,0 +1,664 @@
1
+ // SPDX-License-Identifier: Apache-2.0
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.
13
+ * @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
14
+ * limits.
15
+ */
16
+ import { calculatedResult } from "../core/calculation-result.js";
17
+ import { InvalidConfigurationError } from "../core/configuration-error.js";
18
+ import { parseEvidenceList } from "../core/evidence-provenance.js";
19
+ import { InvalidScientificInputError } from "../core/validation.js";
20
+ import { parseSpectralWavelengthBasis } from "../core/spectral.js";
21
+ import { parseSensorColorSamplingProfile } from "./color-sampling.js";
22
+ function requireRecord(value, path) {
23
+ if (typeof value !== "object" ||
24
+ value === null ||
25
+ Array.isArray(value)) {
26
+ throw new InvalidConfigurationError(path + " must be an object.");
27
+ }
28
+ return value;
29
+ }
30
+ function requireNonEmptyString(value, path) {
31
+ if (typeof value !== "string" ||
32
+ value.trim().length === 0) {
33
+ throw new InvalidConfigurationError(path + " must be a non-empty string.");
34
+ }
35
+ return value;
36
+ }
37
+ function requireFinite(value, path) {
38
+ if (typeof value !== "number" ||
39
+ !Number.isFinite(value)) {
40
+ throw new InvalidConfigurationError(path + " must be a finite number.");
41
+ }
42
+ return value;
43
+ }
44
+ function requirePositiveFinite(value, path) {
45
+ const number = requireFinite(value, path);
46
+ if (number <= 0) {
47
+ throw new InvalidConfigurationError(path + " must be greater than zero.");
48
+ }
49
+ return number;
50
+ }
51
+ function requireFraction(value, path) {
52
+ const number = requireFinite(value, path);
53
+ if (number < 0 || number > 1) {
54
+ throw new InvalidConfigurationError(path +
55
+ " must be a finite fraction from 0 through 1.");
56
+ }
57
+ return number;
58
+ }
59
+ function requireReusableCurveEvidence(value, path) {
60
+ const evidence = parseEvidenceList(value, path);
61
+ if (!evidence.some((entry) => entry.reuseStatus ===
62
+ "reusable-data" ||
63
+ entry.reuseStatus ===
64
+ "photivra-owned")) {
65
+ throw new InvalidConfigurationError(path +
66
+ " must contain reusable-data or photivra-owned evidence because the curve contains reusable numeric data.");
67
+ }
68
+ return evidence;
69
+ }
70
+ function parseUncertainty(value, path) {
71
+ const record = requireRecord(value, path);
72
+ if (record.kind === "relative") {
73
+ const fraction = requireFinite(record.fraction, path + ".fraction");
74
+ if (fraction < 0) {
75
+ throw new InvalidConfigurationError(path +
76
+ ".fraction must be greater than or equal to zero.");
77
+ }
78
+ return {
79
+ kind: "relative",
80
+ fraction,
81
+ basis: requireNonEmptyString(record.basis, path + ".basis")
82
+ };
83
+ }
84
+ if (record.kind === "not-quantified") {
85
+ return {
86
+ kind: "not-quantified",
87
+ limitation: requireNonEmptyString(record.limitation, path + ".limitation")
88
+ };
89
+ }
90
+ throw new InvalidConfigurationError(path + ".kind is invalid.");
91
+ }
92
+ function parseReferenceConditions(value, path) {
93
+ const record = requireRecord(value, path);
94
+ const temperatureC = record.temperatureC === undefined
95
+ ? undefined
96
+ : requireFinite(record.temperatureC, path + ".temperatureC");
97
+ const incidenceAngleDegreesFromNormal = record.incidenceAngleDegreesFromNormal ===
98
+ undefined
99
+ ? undefined
100
+ : requireFinite(record.incidenceAngleDegreesFromNormal, path +
101
+ ".incidenceAngleDegreesFromNormal");
102
+ if (incidenceAngleDegreesFromNormal !==
103
+ undefined &&
104
+ (incidenceAngleDegreesFromNormal < 0 ||
105
+ incidenceAngleDegreesFromNormal > 90)) {
106
+ throw new InvalidConfigurationError(path +
107
+ ".incidenceAngleDegreesFromNormal must be from 0 through 90 degrees.");
108
+ }
109
+ const polarization = record.polarization;
110
+ if (polarization !== undefined &&
111
+ polarization !== "unpolarized" &&
112
+ polarization !== "unspecified") {
113
+ throw new InvalidConfigurationError(path + ".polarization is invalid.");
114
+ }
115
+ if (temperatureC === undefined &&
116
+ incidenceAngleDegreesFromNormal ===
117
+ undefined &&
118
+ polarization === undefined) {
119
+ throw new InvalidConfigurationError(path +
120
+ " must declare at least one reference condition.");
121
+ }
122
+ return {
123
+ ...(temperatureC === undefined
124
+ ? {}
125
+ : { temperatureC }),
126
+ ...(incidenceAngleDegreesFromNormal ===
127
+ undefined
128
+ ? {}
129
+ : {
130
+ incidenceAngleDegreesFromNormal
131
+ }),
132
+ ...(polarization === undefined
133
+ ? {}
134
+ : { polarization })
135
+ };
136
+ }
137
+ function parseCurveBase(record, path) {
138
+ if (record.wavelengthUnit !== "nm") {
139
+ throw new InvalidConfigurationError(path +
140
+ '.wavelengthUnit must be "nm".');
141
+ }
142
+ if (record.interpolation !==
143
+ "piecewise-linear") {
144
+ throw new InvalidConfigurationError(path +
145
+ '.interpolation must be "piecewise-linear".');
146
+ }
147
+ if (record.outsideRangeBehavior !==
148
+ "fail-closed") {
149
+ throw new InvalidConfigurationError(path +
150
+ '.outsideRangeBehavior must be "fail-closed".');
151
+ }
152
+ return {
153
+ wavelengthUnit: "nm",
154
+ wavelengthBasis: parseSpectralWavelengthBasis(record.wavelengthBasis, path + ".wavelengthBasis"),
155
+ interpolation: "piecewise-linear",
156
+ outsideRangeBehavior: "fail-closed",
157
+ evidence: requireReusableCurveEvidence(record.evidence, path + ".evidence")
158
+ };
159
+ }
160
+ function parseFractionSamples(value, path) {
161
+ if (!Array.isArray(value) ||
162
+ value.length < 2) {
163
+ throw new InvalidConfigurationError(path +
164
+ " must contain at least two wavelength samples.");
165
+ }
166
+ let previousWavelength = Number.NEGATIVE_INFINITY;
167
+ return value.map((entry, index) => {
168
+ const record = requireRecord(entry, path + "[" + index + "]");
169
+ const wavelengthNanometers = requirePositiveFinite(record.wavelengthNanometers, path +
170
+ "[" +
171
+ index +
172
+ "].wavelengthNanometers");
173
+ if (wavelengthNanometers <=
174
+ previousWavelength) {
175
+ throw new InvalidConfigurationError(path +
176
+ " wavelengths must be strictly increasing.");
177
+ }
178
+ previousWavelength =
179
+ wavelengthNanometers;
180
+ return {
181
+ wavelengthNanometers,
182
+ value: requireFraction(record.value, path +
183
+ "[" +
184
+ index +
185
+ "].value")
186
+ };
187
+ });
188
+ }
189
+ function parseResponsivitySamples(value, path) {
190
+ if (!Array.isArray(value) ||
191
+ value.length < 2) {
192
+ throw new InvalidConfigurationError(path +
193
+ " must contain at least two wavelength samples.");
194
+ }
195
+ let previousWavelength = Number.NEGATIVE_INFINITY;
196
+ return value.map((entry, index) => {
197
+ const record = requireRecord(entry, path + "[" + index + "]");
198
+ const wavelengthNanometers = requirePositiveFinite(record.wavelengthNanometers, path +
199
+ "[" +
200
+ index +
201
+ "].wavelengthNanometers");
202
+ if (wavelengthNanometers <=
203
+ previousWavelength) {
204
+ throw new InvalidConfigurationError(path +
205
+ " wavelengths must be strictly increasing.");
206
+ }
207
+ previousWavelength =
208
+ wavelengthNanometers;
209
+ const amperesPerWatt = requireFinite(record.amperesPerWatt, path +
210
+ "[" +
211
+ index +
212
+ "].amperesPerWatt");
213
+ if (amperesPerWatt < 0) {
214
+ throw new InvalidConfigurationError(path +
215
+ "[" +
216
+ index +
217
+ "].amperesPerWatt must be greater than or equal to zero.");
218
+ }
219
+ return {
220
+ wavelengthNanometers,
221
+ amperesPerWatt
222
+ };
223
+ });
224
+ }
225
+ function parseFractionCurve(value, path) {
226
+ const record = requireRecord(value, path);
227
+ return {
228
+ ...parseCurveBase(record, path),
229
+ samples: parseFractionSamples(record.samples, path + ".samples")
230
+ };
231
+ }
232
+ function parseResponsivityCurve(value, path) {
233
+ const record = requireRecord(value, path);
234
+ return {
235
+ ...parseCurveBase(record, path),
236
+ samples: parseResponsivitySamples(record.samples, path + ".samples")
237
+ };
238
+ }
239
+ function parseScientificStatus(value, path) {
240
+ if (value !== "calibrated" &&
241
+ value !== "approximation") {
242
+ throw new InvalidConfigurationError(path + " is invalid.");
243
+ }
244
+ return value;
245
+ }
246
+ function validateCalibratedWavelengthBasis(scientificStatus, curves, path) {
247
+ if (scientificStatus === "calibrated" &&
248
+ curves.some((curve) => curve.wavelengthBasis ===
249
+ "unspecified")) {
250
+ throw new InvalidConfigurationError(path +
251
+ ' calibrated responses must declare wavelengthBasis "air" or "vacuum".');
252
+ }
253
+ }
254
+ function usableRange(curves) {
255
+ const minimum = Math.max(...curves.map((curve) => curve.samples[0]
256
+ .wavelengthNanometers));
257
+ const maximum = Math.min(...curves.map((curve) => curve.samples[curve.samples.length - 1].wavelengthNanometers));
258
+ if (!(minimum < maximum)) {
259
+ throw new InvalidConfigurationError("Separable spectral-response component curves must have a non-empty overlapping wavelength interval.");
260
+ }
261
+ return { minimum, maximum };
262
+ }
263
+ function parseChannelResponse(value, path) {
264
+ const record = requireRecord(value, path);
265
+ const channelId = requireNonEmptyString(record.channelId, path + ".channelId");
266
+ const scientificStatus = parseScientificStatus(record.scientificStatus, path + ".scientificStatus");
267
+ const uncertainty = parseUncertainty(record.uncertainty, path + ".uncertainty");
268
+ const evidence = parseEvidenceList(record.evidence, path + ".evidence");
269
+ const referenceConditions = record.referenceConditions ===
270
+ undefined
271
+ ? undefined
272
+ : parseReferenceConditions(record.referenceConditions, path + ".referenceConditions");
273
+ if (record.conditionDependence !==
274
+ "not-modeled") {
275
+ throw new InvalidConfigurationError(path +
276
+ '.conditionDependence must be "not-modeled".');
277
+ }
278
+ const common = {
279
+ channelId,
280
+ scientificStatus,
281
+ uncertainty,
282
+ evidence,
283
+ ...(referenceConditions === undefined
284
+ ? {}
285
+ : { referenceConditions }),
286
+ conditionDependence: "not-modeled"
287
+ };
288
+ if (record.kind ===
289
+ "effective-external-quantum-efficiency") {
290
+ if (record.responseScope !==
291
+ "site-incident-effective-channel-response" &&
292
+ record.responseScope !==
293
+ "sensor-package-incident-effective-channel-response") {
294
+ throw new InvalidConfigurationError(path +
295
+ ".responseScope is invalid.");
296
+ }
297
+ const curve = parseFractionCurve(record.externalQuantumEfficiency, path +
298
+ ".externalQuantumEfficiency");
299
+ validateCalibratedWavelengthBasis(scientificStatus, [curve], path);
300
+ return {
301
+ ...common,
302
+ kind: "effective-external-quantum-efficiency",
303
+ responseScope: record.responseScope,
304
+ externalQuantumEfficiency: curve
305
+ };
306
+ }
307
+ if (record.kind ===
308
+ "effective-spectral-responsivity") {
309
+ if (record.responseScope !==
310
+ "site-incident-effective-channel-response" &&
311
+ record.responseScope !==
312
+ "sensor-package-incident-effective-channel-response") {
313
+ throw new InvalidConfigurationError(path +
314
+ ".responseScope is invalid.");
315
+ }
316
+ const curve = parseResponsivityCurve(record.spectralResponsivity, path +
317
+ ".spectralResponsivity");
318
+ validateCalibratedWavelengthBasis(scientificStatus, [curve], path);
319
+ return {
320
+ ...common,
321
+ kind: "effective-spectral-responsivity",
322
+ responseScope: record.responseScope,
323
+ spectralResponsivity: curve
324
+ };
325
+ }
326
+ if (record.kind ===
327
+ "separable-channel-filter-and-detector-eqe") {
328
+ if (record.responseScope !==
329
+ "site-incident-channel-filter-times-detector-eqe") {
330
+ throw new InvalidConfigurationError(path +
331
+ ".responseScope is invalid.");
332
+ }
333
+ if (record.combinationRule !==
334
+ "multiply") {
335
+ throw new InvalidConfigurationError(path +
336
+ '.combinationRule must be "multiply".');
337
+ }
338
+ const filterCurve = parseFractionCurve(record.channelFilterTransmittance, path +
339
+ ".channelFilterTransmittance");
340
+ const detectorCurve = parseFractionCurve(record.detectorExternalQuantumEfficiency, path +
341
+ ".detectorExternalQuantumEfficiency");
342
+ if (filterCurve.wavelengthBasis !==
343
+ detectorCurve.wavelengthBasis) {
344
+ throw new InvalidConfigurationError(path +
345
+ " separable curves must use the same wavelength basis.");
346
+ }
347
+ usableRange([
348
+ filterCurve,
349
+ detectorCurve
350
+ ]);
351
+ validateCalibratedWavelengthBasis(scientificStatus, [
352
+ filterCurve,
353
+ detectorCurve
354
+ ], path);
355
+ return {
356
+ ...common,
357
+ kind: "separable-channel-filter-and-detector-eqe",
358
+ responseScope: "site-incident-channel-filter-times-detector-eqe",
359
+ combinationRule: "multiply",
360
+ channelFilterTransmittance: filterCurve,
361
+ detectorExternalQuantumEfficiency: detectorCurve
362
+ };
363
+ }
364
+ throw new InvalidConfigurationError(path + ".kind is invalid.");
365
+ }
366
+ /**
367
+ * Parses reusable wavelength-dependent response data for semantic sensor
368
+ * channels without inferring response from channel names or CFA family.
369
+ *
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.
373
+ */
374
+ export function parseSensorSpectralResponseProfile(value) {
375
+ const profile = requireRecord(value, "sensorSpectralResponse");
376
+ if (profile.schemaVersion !== "0.1.0") {
377
+ throw new InvalidConfigurationError('sensorSpectralResponse.schemaVersion must be "0.1.0".');
378
+ }
379
+ if (!Array.isArray(profile.channels) ||
380
+ profile.channels.length === 0) {
381
+ throw new InvalidConfigurationError("sensorSpectralResponse.channels must be a non-empty array.");
382
+ }
383
+ const channels = profile.channels.map((entry, index) => parseChannelResponse(entry, "sensorSpectralResponse.channels[" +
384
+ index +
385
+ "]"));
386
+ const channelIds = channels.map((entry) => entry.channelId);
387
+ if (new Set(channelIds).size !==
388
+ channelIds.length) {
389
+ throw new InvalidConfigurationError("sensorSpectralResponse.channels must not contain duplicate channel IDs.");
390
+ }
391
+ return {
392
+ schemaVersion: "0.1.0",
393
+ profileId: requireNonEmptyString(profile.profileId, "sensorSpectralResponse.profileId"),
394
+ colorSamplingProfileId: requireNonEmptyString(profile.colorSamplingProfileId, "sensorSpectralResponse.colorSamplingProfileId"),
395
+ evidence: parseEvidenceList(profile.evidence, "sensorSpectralResponse.evidence"),
396
+ channels
397
+ };
398
+ }
399
+ /**
400
+ * Create an exact canonical-data binding to one parsed response channel so numeric curve substitution
401
+ * cannot hide behind unchanged profile IDs.
402
+ *
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.
409
+ *
410
+ * @see docs/API_REFERENCE.md for the root export and exact type graph.
411
+ */
412
+ export function createSensorSpectralResponseChannelBinding(response) {
413
+ return {
414
+ format: "photivra-spectral-channel-response-canonical-json-v1",
415
+ canonicalJson: JSON.stringify(response)
416
+ };
417
+ }
418
+ function topologyChannelIds(profile) {
419
+ if (profile.layout.kind ===
420
+ "layered") {
421
+ throw new InvalidScientificInputError("Layered color sampling remains spatially unresolved; schema 0.1.0 spectral response cannot yet be composed into per-site layered sampling.");
422
+ }
423
+ if (profile.layout.kind ===
424
+ "monochrome") {
425
+ return [profile.layout.channelId];
426
+ }
427
+ return [
428
+ ...new Set(profile.layout.siteChannelIds)
429
+ ];
430
+ }
431
+ function interpolateFraction(curve, wavelengthNanometers) {
432
+ return interpolateCurve(curve.samples, wavelengthNanometers, (sample) => sample.value);
433
+ }
434
+ function interpolateResponsivity(curve, wavelengthNanometers) {
435
+ return interpolateCurve(curve.samples, wavelengthNanometers, (sample) => sample.amperesPerWatt);
436
+ }
437
+ function interpolateCurve(samples, wavelengthNanometers, valueOf) {
438
+ const first = samples[0];
439
+ const last = samples[samples.length - 1];
440
+ if (wavelengthNanometers <
441
+ first.wavelengthNanometers ||
442
+ wavelengthNanometers >
443
+ last.wavelengthNanometers) {
444
+ throw new InvalidScientificInputError("Requested wavelength is outside the declared spectral-response range; extrapolation/zero-fill is not permitted.");
445
+ }
446
+ for (let index = 0; index < samples.length; index += 1) {
447
+ const sample = samples[index];
448
+ if (wavelengthNanometers ===
449
+ sample.wavelengthNanometers) {
450
+ return {
451
+ value: valueOf(sample),
452
+ interpolationUsed: false
453
+ };
454
+ }
455
+ if (wavelengthNanometers <
456
+ sample.wavelengthNanometers) {
457
+ const previous = samples[index - 1];
458
+ const phase = (wavelengthNanometers -
459
+ previous.wavelengthNanometers) /
460
+ (sample.wavelengthNanometers -
461
+ previous.wavelengthNanometers);
462
+ return {
463
+ value: valueOf(previous) +
464
+ phase *
465
+ (valueOf(sample) -
466
+ valueOf(previous)),
467
+ interpolationUsed: true
468
+ };
469
+ }
470
+ }
471
+ return {
472
+ value: valueOf(last),
473
+ interpolationUsed: false
474
+ };
475
+ }
476
+ /**
477
+ * Resolves one semantic sensor-channel response at one wavelength.
478
+ *
479
+ * The resolver validates the response profile against the exact color-sampling
480
+ * profile, refuses unresolved layered sampling, performs only declared
481
+ * piecewise-linear interpolation, and never extrapolates.
482
+ *
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.
486
+ */
487
+ export function resolveParsedSensorSpectralResponseAtWavelength(input) {
488
+ const colorProfile = input.colorSamplingProfile;
489
+ const responseProfile = input.spectralResponseProfile;
490
+ if (responseProfile
491
+ .colorSamplingProfileId !==
492
+ colorProfile.profileId) {
493
+ throw new InvalidScientificInputError("Spectral-response colorSamplingProfileId must match the supplied color-sampling profile.");
494
+ }
495
+ const knownChannelIds = topologyChannelIds(colorProfile);
496
+ const knownSet = new Set(knownChannelIds);
497
+ for (const response of responseProfile.channels) {
498
+ if (!knownSet.has(response.channelId)) {
499
+ throw new InvalidScientificInputError("Spectral-response profile declares a channel ID that is not present in the linked color-sampling topology.");
500
+ }
501
+ }
502
+ if (typeof input.channelId !==
503
+ "string" ||
504
+ input.channelId.trim().length ===
505
+ 0) {
506
+ throw new InvalidScientificInputError("channelId must be a non-empty string.");
507
+ }
508
+ if (!knownSet.has(input.channelId)) {
509
+ throw new InvalidScientificInputError("channelId is not present in the linked color-sampling topology.");
510
+ }
511
+ const response = responseProfile.channels.find((entry) => entry.channelId ===
512
+ input.channelId);
513
+ if (response === undefined) {
514
+ throw new InvalidScientificInputError("No spectral response is declared for the requested channelId.");
515
+ }
516
+ if (typeof input.wavelengthNanometers !==
517
+ "number" ||
518
+ !Number.isFinite(input.wavelengthNanometers) ||
519
+ input.wavelengthNanometers <= 0) {
520
+ throw new InvalidScientificInputError("wavelengthNanometers must be finite and greater than zero.");
521
+ }
522
+ if (input.wavelengthBasis !==
523
+ "air" &&
524
+ input.wavelengthBasis !==
525
+ "vacuum" &&
526
+ input.wavelengthBasis !==
527
+ "unspecified") {
528
+ throw new InvalidScientificInputError("wavelengthBasis is invalid.");
529
+ }
530
+ const curves = [];
531
+ let resolvedValue;
532
+ let interpolationUsed;
533
+ let wavelengthBasis;
534
+ if (response.kind ===
535
+ "effective-external-quantum-efficiency") {
536
+ const curve = response.externalQuantumEfficiency;
537
+ curves.push(curve);
538
+ wavelengthBasis =
539
+ curve.wavelengthBasis;
540
+ if (input.wavelengthBasis !==
541
+ wavelengthBasis) {
542
+ throw new InvalidScientificInputError("Requested wavelengthBasis must exactly match the response curve; Photivra does not convert air/vacuum/unspecified wavelength coordinates implicitly.");
543
+ }
544
+ const resolved = interpolateFraction(curve, input.wavelengthNanometers);
545
+ interpolationUsed =
546
+ resolved.interpolationUsed;
547
+ resolvedValue = {
548
+ kind: "effective-external-quantum-efficiency",
549
+ externalQuantumEfficiency: resolved.value,
550
+ composition: "direct-effective-response"
551
+ };
552
+ }
553
+ else if (response.kind ===
554
+ "effective-spectral-responsivity") {
555
+ const curve = response.spectralResponsivity;
556
+ curves.push(curve);
557
+ wavelengthBasis =
558
+ curve.wavelengthBasis;
559
+ if (input.wavelengthBasis !==
560
+ wavelengthBasis) {
561
+ throw new InvalidScientificInputError("Requested wavelengthBasis must exactly match the response curve; Photivra does not convert air/vacuum/unspecified wavelength coordinates implicitly.");
562
+ }
563
+ const resolved = interpolateResponsivity(curve, input.wavelengthNanometers);
564
+ interpolationUsed =
565
+ resolved.interpolationUsed;
566
+ resolvedValue = {
567
+ kind: "effective-spectral-responsivity",
568
+ amperesPerWatt: resolved.value,
569
+ composition: "direct-effective-response"
570
+ };
571
+ }
572
+ else {
573
+ const filterCurve = response
574
+ .channelFilterTransmittance;
575
+ const detectorCurve = response
576
+ .detectorExternalQuantumEfficiency;
577
+ curves.push(filterCurve, detectorCurve);
578
+ wavelengthBasis =
579
+ filterCurve.wavelengthBasis;
580
+ if (input.wavelengthBasis !==
581
+ wavelengthBasis) {
582
+ throw new InvalidScientificInputError("Requested wavelengthBasis must exactly match the separable response curves.");
583
+ }
584
+ const filter = interpolateFraction(filterCurve, input.wavelengthNanometers);
585
+ const detector = interpolateFraction(detectorCurve, input.wavelengthNanometers);
586
+ interpolationUsed =
587
+ filter.interpolationUsed ||
588
+ detector.interpolationUsed;
589
+ resolvedValue = {
590
+ kind: "effective-external-quantum-efficiency",
591
+ externalQuantumEfficiency: filter.value *
592
+ detector.value,
593
+ composition: "channel-filter-transmittance-times-detector-eqe",
594
+ channelFilterTransmittance: filter.value,
595
+ detectorExternalQuantumEfficiency: detector.value
596
+ };
597
+ }
598
+ const range = usableRange(curves);
599
+ return calculatedResult({
600
+ profileId: responseProfile.profileId,
601
+ colorSamplingProfileId: responseProfile
602
+ .colorSamplingProfileId,
603
+ channelId: response.channelId,
604
+ sourceResponseKind: response.kind,
605
+ responseScope: response.responseScope,
606
+ scientificStatus: response.scientificStatus,
607
+ uncertainty: response.uncertainty,
608
+ wavelengthNanometers: input.wavelengthNanometers,
609
+ wavelengthBasis,
610
+ wavelengthBasisResolved: wavelengthBasis !==
611
+ "unspecified",
612
+ declaredWavelengthRangeNanometers: range,
613
+ interpolation: "piecewise-linear",
614
+ interpolationUsed,
615
+ outsideRangeBehavior: "fail-closed",
616
+ response: resolvedValue,
617
+ ...(response.referenceConditions ===
618
+ undefined
619
+ ? {}
620
+ : {
621
+ referenceConditions: response.referenceConditions
622
+ }),
623
+ conditionDependenceModeled: false,
624
+ fieldAngleDependenceModeled: false,
625
+ temperatureDependenceModeled: false,
626
+ polarizationDependenceModeled: false,
627
+ spectralIrradianceIntegrated: false,
628
+ wavelengthIntegrationPerformed: false,
629
+ qeResponsivityConversionPerformed: false,
630
+ photonsCalculated: false,
631
+ electronsCalculated: false,
632
+ rawCodeValueProduced: false,
633
+ componentEvidence: {
634
+ profile: responseProfile.evidence,
635
+ channel: response.evidence,
636
+ curves: curves.map((curve) => curve.evidence)
637
+ }
638
+ }, "sensor-spectral-response-lookup", "1.0.0", [
639
+ "Channel IDs are exact semantic identifiers from the linked color-sampling topology; names do not imply spectral behavior.",
640
+ "Piecewise-linear interpolation is applied only inside the declared wavelength range; no extrapolation or implicit zero response is permitted.",
641
+ "Air, vacuum and unspecified wavelength bases are never converted implicitly.",
642
+ "Direct effective response is preserved when decomposition is not established; separable filter×detector-QE is composed only when explicitly declared.",
643
+ "Spectral responsivity in A/W and external QE remain distinct physical representations and are not converted by this API.",
644
+ "Reference-condition metadata does not create field-angle, temperature or polarization dependence models.",
645
+ "Spectral irradiance integration, wavelength integration, photon/electron conversion and RAW-domain output remain future work."
646
+ ]);
647
+ }
648
+ /**
649
+ * Public spectral-response resolver for untrusted/raw profile inputs.
650
+ *
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.
654
+ */
655
+ export function resolveSensorSpectralResponseAtWavelength(input) {
656
+ const colorProfile = parseSensorColorSamplingProfile(input.colorSamplingProfile);
657
+ const responseProfile = parseSensorSpectralResponseProfile(input.spectralResponseProfile);
658
+ return resolveParsedSensorSpectralResponseAtWavelength({
659
+ ...input,
660
+ colorSamplingProfile: colorProfile,
661
+ spectralResponseProfile: responseProfile
662
+ });
663
+ }
664
+ //# sourceMappingURL=spectral-response.js.map