@photivra/engine 0.6.0 → 1.0.1

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 (750) hide show
  1. package/AGENTS.md +674 -0
  2. package/CHANGELOG.md +191 -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 +139 -72
  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 +9 -0
  139. package/dist/core/version.d.ts.map +1 -0
  140. package/dist/core/version.js +10 -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 +87 -6
  203. package/dist/index.d.ts.map +1 -1
  204. package/dist/index.js +85 -6
  205. package/dist/index.js.map +1 -1
  206. package/dist/motion/camera-rotation.d.ts +16 -0
  207. package/dist/motion/camera-rotation.d.ts.map +1 -1
  208. package/dist/motion/camera-rotation.js +16 -0
  209. package/dist/motion/camera-rotation.js.map +1 -1
  210. package/dist/motion/capture-rotation-inverse-mapping.d.ts +13 -0
  211. package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +1 -1
  212. package/dist/motion/capture-rotation-inverse-mapping.js +13 -0
  213. package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
  214. package/dist/motion/capture-rotation-temporal-quadrature.d.ts +15 -0
  215. package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +1 -1
  216. package/dist/motion/capture-rotation-temporal-quadrature.js +15 -0
  217. package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
  218. package/dist/motion/capture-rotation-trajectory.d.ts +15 -0
  219. package/dist/motion/capture-rotation-trajectory.d.ts.map +1 -1
  220. package/dist/motion/capture-rotation-trajectory.js +15 -0
  221. package/dist/motion/capture-rotation-trajectory.js.map +1 -1
  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 +11 -0
  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 +18 -0
  291. package/dist/optics/radial-distortion.d.ts.map +1 -1
  292. package/dist/optics/radial-distortion.js +18 -0
  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 +8 -0
  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 +1 -0
  393. package/dist/sensor/capture-color-sampling-binding.d.ts.map +1 -1
  394. package/dist/sensor/capture-color-sampling-binding.js +14 -0
  395. package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
  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.map +1 -1
  401. package/dist/sensor/capture-mode.js +13 -0
  402. package/dist/sensor/capture-mode.js.map +1 -1
  403. package/dist/sensor/color-sampling.d.ts.map +1 -1
  404. package/dist/sensor/color-sampling.js +19 -0
  405. package/dist/sensor/color-sampling.js.map +1 -1
  406. package/dist/sensor/constant-rate-temporal-integration.d.ts +126 -0
  407. package/dist/sensor/constant-rate-temporal-integration.d.ts.map +1 -0
  408. package/dist/sensor/constant-rate-temporal-integration.js +382 -0
  409. package/dist/sensor/constant-rate-temporal-integration.js.map +1 -0
  410. package/dist/sensor/dark-current.d.ts +169 -0
  411. package/dist/sensor/dark-current.d.ts.map +1 -0
  412. package/dist/sensor/dark-current.js +427 -0
  413. package/dist/sensor/dark-current.js.map +1 -0
  414. package/dist/sensor/environment-photo-signal.d.ts +123 -0
  415. package/dist/sensor/environment-photo-signal.d.ts.map +1 -0
  416. package/dist/sensor/environment-photo-signal.js +186 -0
  417. package/dist/sensor/environment-photo-signal.js.map +1 -0
  418. package/dist/sensor/eqe-electron-rate.d.ts +107 -0
  419. package/dist/sensor/eqe-electron-rate.d.ts.map +1 -0
  420. package/dist/sensor/eqe-electron-rate.js +561 -0
  421. package/dist/sensor/eqe-electron-rate.js.map +1 -0
  422. package/dist/sensor/eqe-local-exposure.d.ts +65 -0
  423. package/dist/sensor/eqe-local-exposure.d.ts.map +1 -0
  424. package/dist/sensor/eqe-local-exposure.js +84 -0
  425. package/dist/sensor/eqe-local-exposure.js.map +1 -0
  426. package/dist/sensor/eqe-temporal-exposure.d.ts +55 -0
  427. package/dist/sensor/eqe-temporal-exposure.d.ts.map +1 -0
  428. package/dist/sensor/eqe-temporal-exposure.js +62 -0
  429. package/dist/sensor/eqe-temporal-exposure.js.map +1 -0
  430. package/dist/sensor/exposure-window.d.ts +14 -0
  431. package/dist/sensor/exposure-window.d.ts.map +1 -1
  432. package/dist/sensor/exposure-window.js +14 -0
  433. package/dist/sensor/exposure-window.js.map +1 -1
  434. package/dist/sensor/iso-signal-chain.d.ts +148 -0
  435. package/dist/sensor/iso-signal-chain.d.ts.map +1 -0
  436. package/dist/sensor/iso-signal-chain.js +411 -0
  437. package/dist/sensor/iso-signal-chain.js.map +1 -0
  438. package/dist/sensor/local-exposure-binding.d.ts +87 -0
  439. package/dist/sensor/local-exposure-binding.d.ts.map +1 -0
  440. package/dist/sensor/local-exposure-binding.js +214 -0
  441. package/dist/sensor/local-exposure-binding.js.map +1 -0
  442. package/dist/sensor/optical-stack.d.ts.map +1 -1
  443. package/dist/sensor/optical-stack.js +17 -0
  444. package/dist/sensor/optical-stack.js.map +1 -1
  445. package/dist/sensor/photon-energy.d.ts +97 -0
  446. package/dist/sensor/photon-energy.d.ts.map +1 -0
  447. package/dist/sensor/photon-energy.js +390 -0
  448. package/dist/sensor/photon-energy.js.map +1 -0
  449. package/dist/sensor/physical-charge-capacity.d.ts +130 -0
  450. package/dist/sensor/physical-charge-capacity.d.ts.map +1 -0
  451. package/dist/sensor/physical-charge-capacity.js +345 -0
  452. package/dist/sensor/physical-charge-capacity.js.map +1 -0
  453. package/dist/sensor/pixel-pitch.d.ts +6 -0
  454. package/dist/sensor/pixel-pitch.d.ts.map +1 -1
  455. package/dist/sensor/pixel-pitch.js +6 -0
  456. package/dist/sensor/pixel-pitch.js.map +1 -1
  457. package/dist/sensor/radiometry-readiness.d.ts +10 -0
  458. package/dist/sensor/radiometry-readiness.d.ts.map +1 -1
  459. package/dist/sensor/radiometry-readiness.js +10 -0
  460. package/dist/sensor/radiometry-readiness.js.map +1 -1
  461. package/dist/sensor/raw-readout.d.ts +314 -0
  462. package/dist/sensor/raw-readout.d.ts.map +1 -0
  463. package/dist/sensor/raw-readout.js +914 -0
  464. package/dist/sensor/raw-readout.js.map +1 -0
  465. package/dist/sensor/raw-reconstruction.d.ts +170 -0
  466. package/dist/sensor/raw-reconstruction.d.ts.map +1 -0
  467. package/dist/sensor/raw-reconstruction.js +424 -0
  468. package/dist/sensor/raw-reconstruction.js.map +1 -0
  469. package/dist/sensor/readout-exposure-linkage.d.ts +12 -0
  470. package/dist/sensor/readout-exposure-linkage.d.ts.map +1 -1
  471. package/dist/sensor/readout-exposure-linkage.js +12 -0
  472. package/dist/sensor/readout-exposure-linkage.js.map +1 -1
  473. package/dist/sensor/readout-timing.d.ts +13 -0
  474. package/dist/sensor/readout-timing.d.ts.map +1 -1
  475. package/dist/sensor/readout-timing.js +13 -0
  476. package/dist/sensor/readout-timing.js.map +1 -1
  477. package/dist/sensor/response-application-compatibility.d.ts +136 -0
  478. package/dist/sensor/response-application-compatibility.d.ts.map +1 -0
  479. package/dist/sensor/response-application-compatibility.js +408 -0
  480. package/dist/sensor/response-application-compatibility.js.map +1 -0
  481. package/dist/sensor/response-operating-range.d.ts +173 -0
  482. package/dist/sensor/response-operating-range.d.ts.map +1 -0
  483. package/dist/sensor/response-operating-range.js +672 -0
  484. package/dist/sensor/response-operating-range.js.map +1 -0
  485. package/dist/sensor/responsivity-photocurrent.d.ts +158 -0
  486. package/dist/sensor/responsivity-photocurrent.d.ts.map +1 -0
  487. package/dist/sensor/responsivity-photocurrent.js +644 -0
  488. package/dist/sensor/responsivity-photocurrent.js.map +1 -0
  489. package/dist/sensor/sampling-aperture.d.ts.map +1 -1
  490. package/dist/sensor/sampling-aperture.js +14 -0
  491. package/dist/sensor/sampling-aperture.js.map +1 -1
  492. package/dist/sensor/scene-eqe-temporal-exposure.d.ts +45 -0
  493. package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +1 -0
  494. package/dist/sensor/scene-eqe-temporal-exposure.js +64 -0
  495. package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -0
  496. package/dist/sensor/sensor-geometry.d.ts +12 -0
  497. package/dist/sensor/sensor-geometry.d.ts.map +1 -1
  498. package/dist/sensor/sensor-geometry.js +12 -0
  499. package/dist/sensor/sensor-geometry.js.map +1 -1
  500. package/dist/sensor/signal-noise.d.ts +10 -0
  501. package/dist/sensor/signal-noise.d.ts.map +1 -1
  502. package/dist/sensor/signal-noise.js +10 -0
  503. package/dist/sensor/signal-noise.js.map +1 -1
  504. package/dist/sensor/spatial-sample-reduction.d.ts +44 -1
  505. package/dist/sensor/spatial-sample-reduction.d.ts.map +1 -1
  506. package/dist/sensor/spatial-sample-reduction.js +51 -5
  507. package/dist/sensor/spatial-sample-reduction.js.map +1 -1
  508. package/dist/sensor/spatial-sampling-quadrature.d.ts +24 -0
  509. package/dist/sensor/spatial-sampling-quadrature.d.ts.map +1 -1
  510. package/dist/sensor/spatial-sampling-quadrature.js +27 -0
  511. package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
  512. package/dist/sensor/spatio-spectral-reduction.d.ts +187 -0
  513. package/dist/sensor/spatio-spectral-reduction.d.ts.map +1 -0
  514. package/dist/sensor/spatio-spectral-reduction.js +373 -0
  515. package/dist/sensor/spatio-spectral-reduction.js.map +1 -0
  516. package/dist/sensor/spectral-coverage.d.ts +24 -0
  517. package/dist/sensor/spectral-coverage.d.ts.map +1 -0
  518. package/dist/sensor/spectral-coverage.js +86 -0
  519. package/dist/sensor/spectral-coverage.js.map +1 -0
  520. package/dist/sensor/spectral-quadrature.d.ts +169 -0
  521. package/dist/sensor/spectral-quadrature.d.ts.map +1 -0
  522. package/dist/sensor/spectral-quadrature.js +542 -0
  523. package/dist/sensor/spectral-quadrature.js.map +1 -0
  524. package/dist/sensor/spectral-response.d.ts +192 -0
  525. package/dist/sensor/spectral-response.d.ts.map +1 -0
  526. package/dist/sensor/spectral-response.js +664 -0
  527. package/dist/sensor/spectral-response.js.map +1 -0
  528. package/dist/sensor/temporal-eqe-sum.d.ts +15 -0
  529. package/dist/sensor/temporal-eqe-sum.d.ts.map +1 -0
  530. package/dist/sensor/temporal-eqe-sum.js +30 -0
  531. package/dist/sensor/temporal-eqe-sum.js.map +1 -0
  532. package/dist/sensor/temporal-photo-signal.d.ts +38 -0
  533. package/dist/sensor/temporal-photo-signal.d.ts.map +1 -0
  534. package/dist/sensor/temporal-photo-signal.js +110 -0
  535. package/dist/sensor/temporal-photo-signal.js.map +1 -0
  536. package/dist/sensor/temporal-sample-binding.d.ts +6 -0
  537. package/dist/sensor/temporal-sample-binding.d.ts.map +1 -0
  538. package/dist/sensor/temporal-sample-binding.js +32 -0
  539. package/dist/sensor/temporal-sample-binding.js.map +1 -0
  540. package/dist/simulation/poc-simulation.d.ts.map +1 -1
  541. package/dist/simulation/poc-simulation.js +34 -11
  542. package/dist/simulation/poc-simulation.js.map +1 -1
  543. package/dist/stabilization/camera-shake.d.ts +11 -0
  544. package/dist/stabilization/camera-shake.d.ts.map +1 -1
  545. package/dist/stabilization/camera-shake.js +11 -0
  546. package/dist/stabilization/camera-shake.js.map +1 -1
  547. package/dist/stabilization/system.d.ts +218 -0
  548. package/dist/stabilization/system.d.ts.map +1 -0
  549. package/dist/stabilization/system.js +695 -0
  550. package/dist/stabilization/system.js.map +1 -0
  551. package/docs/API_REFERENCE.md +2017 -0
  552. package/docs/API_STYLE.md +139 -3
  553. package/docs/ARCHITECTURE.md +134 -24
  554. package/docs/AUTOMATION_COORDINATION.md +2 -0
  555. package/docs/CAPTURE_COLOR.md +25 -0
  556. package/docs/CAPTURE_CORRECTED_SDR.md +25 -0
  557. package/docs/CAPTURE_EXPORT_METADATA.md +27 -0
  558. package/docs/CAPTURE_SDR.md +20 -0
  559. package/docs/DEVELOPERS.md +60 -0
  560. package/docs/DIGITAL_OPTICS_FOUNDATION.md +69 -0
  561. package/docs/ENVIRONMENT_RAW_CAPTURE.md +187 -0
  562. package/docs/EXPORT_ACCEPTANCE.md +133 -0
  563. package/docs/GENERIC_TIER_PRESETS.md +269 -0
  564. package/docs/GEOMETRIC_PREPARATION_REUSE.md +141 -0
  565. package/docs/IMAGE_FORMATION.md +80 -10
  566. package/docs/LINEAR_CAPTURE_ENCODING.md +25 -0
  567. package/docs/MOTION_AND_SIGNAL.md +5 -3
  568. package/docs/NUMERICAL_CORRECTNESS.md +191 -0
  569. package/docs/PERFORMANCE_BASELINE.md +56 -0
  570. package/docs/PHOTOGRAPHIC_EXPORT.md +206 -0
  571. package/docs/PHYSICS_FOUNDATION.md +152 -5
  572. package/docs/POC_API.md +2 -0
  573. package/docs/POC_PROJECTION_REUSE.md +124 -0
  574. package/docs/PROCESSED_OUTPUT.md +157 -0
  575. package/docs/PRODUCTION_COMPOSITION.md +373 -0
  576. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +131 -0
  577. package/docs/PROVENANCE.md +4 -0
  578. package/docs/PSF_FOUNDATION.md +110 -88
  579. package/docs/RAW_FRAME_ENVELOPE.md +56 -0
  580. package/docs/RAW_FRAME_RECONSTRUCTION.md +30 -0
  581. package/docs/RELEASE_1_0.md +66 -0
  582. package/docs/RELEASE_1_0_1.md +61 -0
  583. package/docs/RELEASE_AUDIT.md +39 -0
  584. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +298 -0
  585. package/docs/SCENE_SENSOR_QUADRATURE.md +98 -0
  586. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +86 -0
  587. package/docs/SCIENTIFIC_ASSURANCE.md +280 -0
  588. package/docs/SCIENTIFIC_CONFORMANCE.md +83 -0
  589. package/docs/SDR_RENDERING.md +33 -0
  590. package/docs/SENSOR_ENVIRONMENT_QUERY.md +86 -0
  591. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +104 -0
  592. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +74 -0
  593. package/docs/SENSOR_PSF_QUADRATURE.md +90 -0
  594. package/docs/SENSOR_RAW_FRAME.md +20 -0
  595. package/docs/SENSOR_RAW_PRODUCER.md +77 -0
  596. package/docs/SIGNAL_CONFORMANCE.md +23 -0
  597. package/docs/SIMULATED_CAPTURE.md +65 -0
  598. package/docs/STABILIZATION.md +160 -17
  599. package/docs/TEMPORAL_PHOTO_RAW.md +83 -0
  600. package/docs/TIER_ACCEPTANCE.md +129 -0
  601. package/docs/TIER_PRESET_ACCEPTANCE.md +59 -0
  602. package/docs/USAGE.md +5050 -1047
  603. package/docs/V1_COMPOSITION_MAP.md +123 -0
  604. package/docs/V1_HELPER_REUSE_REVIEW.md +60 -0
  605. package/docs/V1_PERFORMANCE_DISPOSITION.md +88 -0
  606. package/docs/api/camera-equivalent-focal-length.md +53 -0
  607. package/docs/api/camera-field-of-view.md +119 -0
  608. package/docs/api/camera-projected-object-size.md +54 -0
  609. package/docs/api/capture-capture-export-metadata.md +107 -0
  610. package/docs/api/capture-environment-raw-producer.md +56 -0
  611. package/docs/api/capture-focus-control.md +419 -0
  612. package/docs/api/capture-linear-encoding.md +99 -0
  613. package/docs/api/capture-photographic-export.md +172 -0
  614. package/docs/api/capture-raw-frame-reconstruction.md +87 -0
  615. package/docs/api/capture-release-sequence.md +252 -0
  616. package/docs/api/capture-sensor-raw-frame.md +66 -0
  617. package/docs/api/capture-sensor-raw-producer.md +98 -0
  618. package/docs/api/capture-simulated-capture.md +179 -0
  619. package/docs/api/color-capture-color.md +122 -0
  620. package/docs/api/color-white-balance.md +386 -0
  621. package/docs/api/composition-image-formation-plan.md +825 -0
  622. package/docs/api/composition-plan-consumer.md +98 -0
  623. package/docs/api/core-calculation-result.md +220 -0
  624. package/docs/api/core-configuration-error.md +19 -0
  625. package/docs/api/core-image-formation.md +204 -0
  626. package/docs/api/core-scientific-assurance.md +214 -0
  627. package/docs/api/core-spectral-composition.md +268 -0
  628. package/docs/api/core-spectral.md +78 -0
  629. package/docs/api/core-validation.md +34 -0
  630. package/docs/api/core-version.md +14 -0
  631. package/docs/api/equipment-exposure-capabilities.md +270 -0
  632. package/docs/api/equipment-generic-tier-assets.md +82 -0
  633. package/docs/api/equipment-generic-tier-presets.md +103 -0
  634. package/docs/api/equipment-iso-capabilities.md +295 -0
  635. package/docs/api/equipment-metering-capabilities.md +126 -0
  636. package/docs/api/equipment-release-capabilities.md +91 -0
  637. package/docs/api/exports.json +5656 -0
  638. package/docs/api/exposure-exposure-duration-control.md +115 -0
  639. package/docs/api/exposure-exposure-mode-resolver.md +966 -0
  640. package/docs/api/exposure-exposure.md +150 -0
  641. package/docs/api/exposure-flash.md +327 -0
  642. package/docs/api/exposure-metering-scene-radiance.md +154 -0
  643. package/docs/api/exposure-metering-target.md +134 -0
  644. package/docs/api/exposure-metering-temporal.md +77 -0
  645. package/docs/api/exposure-metering.md +172 -0
  646. package/docs/api/exposure-program-line.md +64 -0
  647. package/docs/api/motion-camera-rotation.md +215 -0
  648. package/docs/api/motion-capture-rotation-inverse-mapping.md +128 -0
  649. package/docs/api/motion-capture-rotation-temporal-quadrature.md +127 -0
  650. package/docs/api/motion-capture-rotation-trajectory.md +132 -0
  651. package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +171 -0
  652. package/docs/api/motion-extended-object-projection.md +312 -0
  653. package/docs/api/motion-projected-motion.md +60 -0
  654. package/docs/api/optics-aperture.md +69 -0
  655. package/docs/api/optics-circle-of-confusion.md +46 -0
  656. package/docs/api/optics-complex-pupil-psf.md +193 -0
  657. package/docs/api/optics-depth-of-field.md +92 -0
  658. package/docs/api/optics-diffraction.md +46 -0
  659. package/docs/api/optics-focus-breathing.md +119 -0
  660. package/docs/api/optics-focus-state.md +64 -0
  661. package/docs/api/optics-front-of-lens-filter.md +263 -0
  662. package/docs/api/optics-illumination-vignetting.md +95 -0
  663. package/docs/api/optics-lateral-chromatic-aberration.md +225 -0
  664. package/docs/api/optics-lens-psf-profile.md +380 -0
  665. package/docs/api/optics-polygon-diffraction.md +68 -0
  666. package/docs/api/optics-profile-contract.md +47 -0
  667. package/docs/api/optics-psf-foundation.md +181 -0
  668. package/docs/api/optics-radial-distortion.md +194 -0
  669. package/docs/api/optics-scene-to-sensor-irradiance.md +371 -0
  670. package/docs/api/optics-scene-to-sensor-quadrature.md +78 -0
  671. package/docs/api/optics-sensor-environment-query.md +58 -0
  672. package/docs/api/optics-sensor-psf-quadrature.md +81 -0
  673. package/docs/api/optics-stray-light.md +109 -0
  674. package/docs/api/optics-thin-lens.md +53 -0
  675. package/docs/api/output-capture-corrected-sdr.md +71 -0
  676. package/docs/api/output-capture-geometry.md +500 -0
  677. package/docs/api/output-capture-sdr.md +69 -0
  678. package/docs/api/output-crop.md +47 -0
  679. package/docs/api/output-geometric-transforms.md +199 -0
  680. package/docs/api/output-lens-corrections.md +162 -0
  681. package/docs/api/output-sdr-rendering.md +122 -0
  682. package/docs/api/output-subject-framing-crop.md +59 -0
  683. package/docs/api/schema-camera.md +84 -0
  684. package/docs/api/schema-illumination-spectral.md +77 -0
  685. package/docs/api/schema-illumination-temporal.md +289 -0
  686. package/docs/api/schema-illumination.md +246 -0
  687. package/docs/api/schema-scene-radiance-temporal.md +215 -0
  688. package/docs/api/schema-scene-radiance.md +415 -0
  689. package/docs/api/schema-scene.md +105 -0
  690. package/docs/api/schema-validation.md +25 -0
  691. package/docs/api/sensor-accumulated-charge.md +273 -0
  692. package/docs/api/sensor-architecture.md +155 -0
  693. package/docs/api/sensor-camera-saturation-capacity.md +215 -0
  694. package/docs/api/sensor-capture-color-sampling-binding.md +323 -0
  695. package/docs/api/sensor-capture-mode-timing.md +123 -0
  696. package/docs/api/sensor-capture-mode.md +321 -0
  697. package/docs/api/sensor-color-sampling.md +228 -0
  698. package/docs/api/sensor-constant-rate-temporal-integration.md +152 -0
  699. package/docs/api/sensor-dark-current.md +227 -0
  700. package/docs/api/sensor-environment-photo-signal.md +77 -0
  701. package/docs/api/sensor-eqe-electron-rate.md +166 -0
  702. package/docs/api/sensor-eqe-local-exposure.md +68 -0
  703. package/docs/api/sensor-eqe-temporal-exposure.md +73 -0
  704. package/docs/api/sensor-exposure-window.md +183 -0
  705. package/docs/api/sensor-iso-signal-chain.md +264 -0
  706. package/docs/api/sensor-local-exposure-binding.md +126 -0
  707. package/docs/api/sensor-optical-stack.md +211 -0
  708. package/docs/api/sensor-photon-energy.md +149 -0
  709. package/docs/api/sensor-physical-charge-capacity.md +196 -0
  710. package/docs/api/sensor-pixel-pitch.md +41 -0
  711. package/docs/api/sensor-radiometry-readiness.md +240 -0
  712. package/docs/api/sensor-raw-readout.md +499 -0
  713. package/docs/api/sensor-raw-reconstruction.md +260 -0
  714. package/docs/api/sensor-readout-exposure-linkage.md +172 -0
  715. package/docs/api/sensor-readout-timing.md +209 -0
  716. package/docs/api/sensor-response-application-compatibility.md +256 -0
  717. package/docs/api/sensor-response-operating-range.md +293 -0
  718. package/docs/api/sensor-responsivity-photocurrent.md +245 -0
  719. package/docs/api/sensor-sampling-aperture.md +221 -0
  720. package/docs/api/sensor-scene-eqe-temporal-exposure.md +56 -0
  721. package/docs/api/sensor-sensor-geometry.md +143 -0
  722. package/docs/api/sensor-signal-noise.md +75 -0
  723. package/docs/api/sensor-spatial-sample-reduction.md +186 -0
  724. package/docs/api/sensor-spatial-sampling-quadrature.md +188 -0
  725. package/docs/api/sensor-spatio-spectral-reduction.md +217 -0
  726. package/docs/api/sensor-spectral-coverage.md +33 -0
  727. package/docs/api/sensor-spectral-quadrature.md +183 -0
  728. package/docs/api/sensor-spectral-response.md +291 -0
  729. package/docs/api/sensor-temporal-photo-signal.md +62 -0
  730. package/docs/api/simulation-poc-simulation.md +364 -0
  731. package/docs/api/stabilization-camera-shake.md +71 -0
  732. package/docs/api/stabilization-system.md +442 -0
  733. package/docs/benchmarks/2026-10-01-main-baseline.json +694 -0
  734. package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +2190 -0
  735. package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +2423 -0
  736. package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +210 -0
  737. package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +187 -0
  738. package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +756 -0
  739. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +711 -0
  740. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +711 -0
  741. package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +885 -0
  742. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +868 -0
  743. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +868 -0
  744. package/docs/examples/production-capture.mjs +34 -0
  745. package/docs/examples/production-request.json +4613 -0
  746. package/docs/examples/quick-start.mjs +12 -0
  747. package/docs/validation/documentation-fragments.json +212 -0
  748. package/docs/validation/release-audit-inventory.json +1306 -0
  749. package/docs/validation/tier-acceptance-report-v1.json +2538 -0
  750. package/package.json +15 -3
@@ -0,0 +1,644 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ /**
3
+ * Module boundary and integration notes.
4
+ * Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
5
+ * missing required fields and incompatible scientific data fail at this boundary. A/W response
6
+ * converts per-bin radiant power to quasi-static detector-terminal current magnitude. Electrical
7
+ * bias/load applicability is explicit. This is not EQE, electron rate, transimpedance voltage or RAW;
8
+ * rapidly varying current requires a separate temporal detector-response model.
9
+ * Integrate per-wavelength A/W times radiant-power contributions to steady-state current magnitude
10
+ * with explicit electrical applicability. A/W response converts per-bin radiant power to quasi-static
11
+ * detector-terminal current magnitude. Electrical bias/load applicability is explicit. This is not
12
+ * EQE, electron rate, transimpedance voltage or RAW; rapidly varying current requires a separate
13
+ * temporal detector-response model.
14
+ * @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
15
+ * limits.
16
+ */
17
+ import { approximationResult } from "../core/calculation-result.js";
18
+ import { InvalidConfigurationError } from "../core/configuration-error.js";
19
+ import { parseEvidenceList } from "../core/evidence-provenance.js";
20
+ import { InvalidScientificInputError } from "../core/validation.js";
21
+ import { parseSensorColorSamplingProfile } from "./color-sampling.js";
22
+ import { createSensorSpectralResponseChannelBinding, parseSensorSpectralResponseProfile, resolveParsedSensorSpectralResponseAtWavelength } from "./spectral-response.js";
23
+ const REDUCTION_TOLERANCE = 1e-10;
24
+ function addCompensated(state, value) {
25
+ const adjusted = value - state.correction;
26
+ const next = state.sum + adjusted;
27
+ state.correction =
28
+ (next - state.sum) - adjusted;
29
+ state.sum = next;
30
+ }
31
+ function requireRecord(value, path) {
32
+ if (typeof value !== "object" ||
33
+ value === null ||
34
+ Array.isArray(value)) {
35
+ throw new InvalidConfigurationError(path + " must be an object.");
36
+ }
37
+ return value;
38
+ }
39
+ function requireNonEmptyString(value, path) {
40
+ if (typeof value !== "string" ||
41
+ value.trim().length === 0) {
42
+ throw new InvalidConfigurationError(path + " must be a non-empty string.");
43
+ }
44
+ return value;
45
+ }
46
+ function requireFiniteNonNegative(value, path) {
47
+ if (typeof value !== "number" ||
48
+ !Number.isFinite(value) ||
49
+ value < 0) {
50
+ throw new InvalidConfigurationError(path +
51
+ " must be finite and greater than or equal to zero.");
52
+ }
53
+ return value;
54
+ }
55
+ function requirePositiveFiniteConfiguration(value, path) {
56
+ if (typeof value !== "number" ||
57
+ !Number.isFinite(value) ||
58
+ value <= 0) {
59
+ throw new InvalidConfigurationError(path +
60
+ " must be finite and greater than zero.");
61
+ }
62
+ return value;
63
+ }
64
+ function requirePositiveFiniteInput(value, path) {
65
+ if (typeof value !== "number" ||
66
+ !Number.isFinite(value) ||
67
+ value <= 0) {
68
+ throw new InvalidScientificInputError(path +
69
+ " must be finite and greater than zero.");
70
+ }
71
+ return value;
72
+ }
73
+ function requireNonNegativeFiniteInput(value, path) {
74
+ if (typeof value !== "number" ||
75
+ !Number.isFinite(value) ||
76
+ value < 0) {
77
+ throw new InvalidScientificInputError(path +
78
+ " must be finite and greater than or equal to zero.");
79
+ }
80
+ return value;
81
+ }
82
+ function requireSafeNonNegativeInteger(value, path) {
83
+ if (typeof value !== "number" ||
84
+ !Number.isSafeInteger(value) ||
85
+ value < 0) {
86
+ throw new InvalidScientificInputError(path +
87
+ " must be a non-negative safe integer.");
88
+ }
89
+ return value;
90
+ }
91
+ function parseUncertainty(value, path) {
92
+ const record = requireRecord(value, path);
93
+ if (record.kind === "relative") {
94
+ const fraction = requireFiniteNonNegative(record.fraction, path + ".fraction");
95
+ return {
96
+ kind: "relative",
97
+ fraction,
98
+ basis: requireNonEmptyString(record.basis, path + ".basis")
99
+ };
100
+ }
101
+ if (record.kind === "not-quantified") {
102
+ return {
103
+ kind: "not-quantified",
104
+ limitation: requireNonEmptyString(record.limitation, path + ".limitation")
105
+ };
106
+ }
107
+ throw new InvalidConfigurationError(path + ".kind is invalid.");
108
+ }
109
+ function parseElectricalConditions(value, path) {
110
+ const record = requireRecord(value, path);
111
+ const bias = requireRecord(record.bias, path + ".bias");
112
+ const readoutLoad = requireRecord(record.readoutLoad, path + ".readoutLoad");
113
+ const parsedBias = bias.kind ===
114
+ "zero-bias-photovoltaic"
115
+ ? {
116
+ kind: "zero-bias-photovoltaic"
117
+ }
118
+ : bias.kind ===
119
+ "reverse-biased"
120
+ ? {
121
+ kind: "reverse-biased",
122
+ magnitudeVolts: requirePositiveFiniteConfiguration(bias.magnitudeVolts, path +
123
+ ".bias.magnitudeVolts")
124
+ }
125
+ : (() => {
126
+ throw new InvalidConfigurationError(path +
127
+ ".bias.kind is invalid.");
128
+ })();
129
+ const parsedReadout = readoutLoad.kind ===
130
+ "virtual-ground-current-readout"
131
+ ? {
132
+ kind: "virtual-ground-current-readout"
133
+ }
134
+ : readoutLoad.kind ===
135
+ "finite-input-impedance"
136
+ ? {
137
+ kind: "finite-input-impedance",
138
+ inputImpedanceOhms: requirePositiveFiniteConfiguration(readoutLoad
139
+ .inputImpedanceOhms, path +
140
+ ".readoutLoad.inputImpedanceOhms")
141
+ }
142
+ : (() => {
143
+ throw new InvalidConfigurationError(path +
144
+ ".readoutLoad.kind is invalid.");
145
+ })();
146
+ return {
147
+ bias: parsedBias,
148
+ readoutLoad: parsedReadout
149
+ };
150
+ }
151
+ function parseConditionPolicy(value, path) {
152
+ const record = requireRecord(value, path);
153
+ if (record.kind ===
154
+ "exact-match-required") {
155
+ return {
156
+ kind: "exact-match-required"
157
+ };
158
+ }
159
+ if (record.kind ===
160
+ "assume-compatible") {
161
+ return {
162
+ kind: "assume-compatible",
163
+ limitation: requireNonEmptyString(record.limitation, path + ".limitation"),
164
+ evidence: parseEvidenceList(record.evidence, path + ".evidence")
165
+ };
166
+ }
167
+ throw new InvalidConfigurationError(path + ".kind is invalid.");
168
+ }
169
+ /**
170
+ * Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
171
+ * missing required fields and incompatible scientific data fail at this boundary.
172
+ *
173
+ * A/W response converts per-bin radiant power to quasi-static detector-terminal current magnitude.
174
+ * Electrical bias/load applicability is explicit. This is not EQE, electron rate, transimpedance
175
+ * voltage or RAW; rapidly varying current requires a separate temporal detector-response model.
176
+ * @param value - unknown. Treated as untrusted data; static typing alone is not validation.
177
+ * @returns SensorResponsivityElectricalApplicabilityProfile. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
178
+ *
179
+ * @see docs/API_REFERENCE.md for the root export and exact type graph.
180
+ */
181
+ export function parseSensorResponsivityElectricalApplicabilityProfile(value) {
182
+ const record = requireRecord(value, "sensorResponsivityElectricalApplicability");
183
+ if (record.schemaVersion !== "0.1.0") {
184
+ throw new InvalidConfigurationError('sensorResponsivityElectricalApplicability.schemaVersion must be "0.1.0".');
185
+ }
186
+ if (record.outputMeaning !==
187
+ "detector-terminal-photocurrent-magnitude") {
188
+ throw new InvalidConfigurationError("sensorResponsivityElectricalApplicability.outputMeaning is invalid.");
189
+ }
190
+ if (record.scientificStatus !==
191
+ "calibrated" &&
192
+ record.scientificStatus !==
193
+ "approximation") {
194
+ throw new InvalidConfigurationError("sensorResponsivityElectricalApplicability.scientificStatus is invalid.");
195
+ }
196
+ const uncertainty = parseUncertainty(record.uncertainty, "sensorResponsivityElectricalApplicability.uncertainty");
197
+ if (record.scientificStatus ===
198
+ "calibrated" &&
199
+ uncertainty.kind ===
200
+ "not-quantified") {
201
+ throw new InvalidConfigurationError("A calibrated electrical applicability profile must declare quantified relative uncertainty.");
202
+ }
203
+ return {
204
+ schemaVersion: "0.1.0",
205
+ profileId: requireNonEmptyString(record.profileId, "sensorResponsivityElectricalApplicability.profileId"),
206
+ responseApplicationProfileId: requireNonEmptyString(record
207
+ .responseApplicationProfileId, "sensorResponsivityElectricalApplicability.responseApplicationProfileId"),
208
+ spectralResponseProfileId: requireNonEmptyString(record
209
+ .spectralResponseProfileId, "sensorResponsivityElectricalApplicability.spectralResponseProfileId"),
210
+ colorSamplingProfileId: requireNonEmptyString(record.colorSamplingProfileId, "sensorResponsivityElectricalApplicability.colorSamplingProfileId"),
211
+ channelId: requireNonEmptyString(record.channelId, "sensorResponsivityElectricalApplicability.channelId"),
212
+ outputMeaning: "detector-terminal-photocurrent-magnitude",
213
+ referenceConditions: parseElectricalConditions(record.referenceConditions, "sensorResponsivityElectricalApplicability.referenceConditions"),
214
+ conditionPolicy: parseConditionPolicy(record.conditionPolicy, "sensorResponsivityElectricalApplicability.conditionPolicy"),
215
+ scientificStatus: record.scientificStatus,
216
+ uncertainty,
217
+ evidence: parseEvidenceList(record.evidence, "sensorResponsivityElectricalApplicability.evidence")
218
+ };
219
+ }
220
+ function canonicalJson(value) {
221
+ return JSON.stringify(value);
222
+ }
223
+ function approximatelyEqual(actual, expected) {
224
+ const scale = Math.max(1, Math.abs(actual), Math.abs(expected));
225
+ return (Math.abs(actual - expected) <=
226
+ REDUCTION_TOLERANCE * scale);
227
+ }
228
+ function electricalConditionsMatch(reference, operating) {
229
+ return (canonicalJson(reference) ===
230
+ canonicalJson(operating));
231
+ }
232
+ function validateAuthorizationChain(reduction, compatibility, operatingRange) {
233
+ if (reduction.outputMeaning !==
234
+ "pre-response-spatio-spectral-radiometric-reduction" ||
235
+ reduction
236
+ .spectralResponseApplicationPerformed !==
237
+ false ||
238
+ reduction
239
+ .spectralResponsivityApplied !==
240
+ false ||
241
+ reduction.temporalIntegrationApplied !==
242
+ false) {
243
+ throw new InvalidScientificInputError("reduction must remain pre-response and pre-temporal before A/W photocurrent conversion.");
244
+ }
245
+ if (!compatibility
246
+ .structuralCompatibilityEstablished ||
247
+ compatibility.compatibilityStatus ===
248
+ "blocked" ||
249
+ compatibility.blockers.length !== 0 ||
250
+ !compatibility.sourcePlaneMatched ||
251
+ compatibility.requiredSignalPath !==
252
+ "radiant-power-to-current") {
253
+ throw new InvalidScientificInputError("compatibility must establish a non-blocked radiant-power-to-current response path.");
254
+ }
255
+ if (compatibility
256
+ .spectralResponseProfileId !==
257
+ reduction.responseProfileId ||
258
+ compatibility.colorSamplingProfileId !==
259
+ reduction.colorSamplingProfileId ||
260
+ compatibility.channelId !==
261
+ reduction.channelId ||
262
+ compatibility.responseScope !==
263
+ reduction.responseScope) {
264
+ throw new InvalidScientificInputError("compatibility identities must exactly match the reduction.");
265
+ }
266
+ if (!operatingRange
267
+ .operatingRangeCompatibilityAssessed ||
268
+ !operatingRange
269
+ .instantaneousResponseRangeCompatible ||
270
+ !operatingRange
271
+ .responseRateConversionAuthorized ||
272
+ operatingRange.status === "blocked" ||
273
+ operatingRange.blockers.length !== 0 ||
274
+ operatingRange.requiredSignalPath !==
275
+ "radiant-power-to-current" ||
276
+ operatingRange
277
+ .responseApplicationPerformed !==
278
+ false ||
279
+ operatingRange
280
+ .currentConversionPerformed !== false ||
281
+ operatingRange
282
+ .temporalIntegrationAuthorized !== false ||
283
+ !operatingRange
284
+ .spectralNodeRangeCompatibilityAssessed ||
285
+ operatingRange
286
+ .spectralInputModel.kind !==
287
+ "per-spectral-bin" ||
288
+ operatingRange
289
+ .spatialLinearityModel.kind !==
290
+ "linear-superposition-over-geometric-aperture") {
291
+ throw new InvalidScientificInputError("operatingRange must authorize a clean per-bin radiant-power-to-current path.");
292
+ }
293
+ if (operatingRange
294
+ .spectralResponseProfileId !==
295
+ reduction.responseProfileId ||
296
+ operatingRange
297
+ .colorSamplingProfileId !==
298
+ reduction.colorSamplingProfileId ||
299
+ operatingRange.channelId !==
300
+ reduction.channelId ||
301
+ operatingRange
302
+ .responseApplicationProfileId !==
303
+ compatibility.applicationProfileId) {
304
+ throw new InvalidScientificInputError("operatingRange identities must exactly match the reduction and compatibility assessment.");
305
+ }
306
+ }
307
+ function validateReductionNodes(reduction) {
308
+ if (!Array.isArray(reduction.perWavelength) ||
309
+ !Number.isSafeInteger(reduction.spectralNodeCount) ||
310
+ reduction.spectralNodeCount <= 0 ||
311
+ reduction.perWavelength.length !==
312
+ reduction.spectralNodeCount) {
313
+ throw new InvalidScientificInputError("reduction.perWavelength must contain exactly spectralNodeCount entries.");
314
+ }
315
+ let priorWavelength = Number.NEGATIVE_INFINITY;
316
+ let normalizedWeightSum = 0;
317
+ const totalPower = {
318
+ sum: 0,
319
+ correction: 0
320
+ };
321
+ reduction.perWavelength.forEach((node, arrayIndex) => {
322
+ const sampleIndex = requireSafeNonNegativeInteger(node.spectralSampleIndex, "reduction.perWavelength[" +
323
+ arrayIndex +
324
+ "].spectralSampleIndex");
325
+ if (sampleIndex !== arrayIndex) {
326
+ throw new InvalidScientificInputError("reduction spectralSampleIndex values must form the exact contiguous range 0..spectralNodeCount-1.");
327
+ }
328
+ const wavelength = requirePositiveFiniteInput(node.wavelengthNanometers, "reduction.perWavelength[" +
329
+ arrayIndex +
330
+ "].wavelengthNanometers");
331
+ if (wavelength <= priorWavelength) {
332
+ throw new InvalidScientificInputError("reduction wavelength nodes must be strictly increasing.");
333
+ }
334
+ priorWavelength = wavelength;
335
+ const measure = requirePositiveFiniteInput(node.wavelengthMeasureNanometers, "reduction.perWavelength[" +
336
+ arrayIndex +
337
+ "].wavelengthMeasureNanometers");
338
+ const normalizedWeight = requirePositiveFiniteInput(node.normalizedWavelengthWeight, "reduction.perWavelength[" +
339
+ arrayIndex +
340
+ "].normalizedWavelengthWeight");
341
+ const fluxDensity = requireNonNegativeFiniteInput(node
342
+ .geometricApertureIncidentSpectralFluxWattsPerNanometer, "reduction.perWavelength[" +
343
+ arrayIndex +
344
+ "].geometricApertureIncidentSpectralFluxWattsPerNanometer");
345
+ const power = requireNonNegativeFiniteInput(node
346
+ .wavelengthIntegratedGeometricApertureIncidentFluxContributionWatts, "reduction.perWavelength[" +
347
+ arrayIndex +
348
+ "].wavelengthIntegratedGeometricApertureIncidentFluxContributionWatts");
349
+ const expected = fluxDensity * measure;
350
+ if (!Number.isFinite(expected) ||
351
+ !approximatelyEqual(power, expected)) {
352
+ throw new InvalidScientificInputError("reduction per-wavelength radiant-power contribution must equal spectral flux density × d-lambda.");
353
+ }
354
+ normalizedWeightSum +=
355
+ normalizedWeight;
356
+ addCompensated(totalPower, power);
357
+ });
358
+ if (!Number.isFinite(normalizedWeightSum) ||
359
+ !approximatelyEqual(normalizedWeightSum, 1)) {
360
+ throw new InvalidScientificInputError("reduction normalized wavelength weights must sum to 1.");
361
+ }
362
+ const reductionPower = requireNonNegativeFiniteInput(reduction
363
+ .wavelengthIntegratedGeometricApertureIncidentFluxWatts, "reduction.wavelengthIntegratedGeometricApertureIncidentFluxWatts");
364
+ if (!approximatelyEqual(totalPower.sum, reductionPower)) {
365
+ throw new InvalidScientificInputError("reduction total geometric-aperture radiant power must match the per-wavelength sum.");
366
+ }
367
+ return reduction.perWavelength;
368
+ }
369
+ function validateOperatingRangeNodeBinding(reduction, nodes, operatingRange) {
370
+ const evaluated = operatingRange
371
+ .evaluatedSpectralNodeInputs;
372
+ if (evaluated === undefined ||
373
+ evaluated.length !== nodes.length) {
374
+ throw new InvalidScientificInputError("operatingRange must carry one evaluated spectral-node input per reduction wavelength node.");
375
+ }
376
+ if (operatingRange
377
+ .evaluatedWavelengthRangeNanometers
378
+ .minimum !==
379
+ reduction.wavelengthRangeNanometers
380
+ .minimum ||
381
+ operatingRange
382
+ .evaluatedWavelengthRangeNanometers
383
+ .maximum !==
384
+ reduction.wavelengthRangeNanometers
385
+ .maximum) {
386
+ throw new InvalidScientificInputError("operatingRange wavelength range must exactly match the reduction.");
387
+ }
388
+ evaluated.forEach((entry, index) => {
389
+ const node = nodes[index];
390
+ if (entry.spectralSampleIndex !==
391
+ node.spectralSampleIndex ||
392
+ entry.wavelengthNanometers !==
393
+ node.wavelengthNanometers ||
394
+ entry.wavelengthMeasureNanometers !==
395
+ node.wavelengthMeasureNanometers) {
396
+ throw new InvalidScientificInputError("operatingRange spectral-node identities must exactly match the reduction.");
397
+ }
398
+ const expected = operatingRange.inputRange.kind ===
399
+ "wavelength-integrated-geometric-aperture-radiant-power"
400
+ ? node
401
+ .wavelengthIntegratedGeometricApertureIncidentFluxContributionWatts
402
+ : node
403
+ .wavelengthIntegratedSpatialAverageContributionWattsPerSquareMeter;
404
+ if (entry.kind !==
405
+ operatingRange.inputRange.kind ||
406
+ entry.unit !==
407
+ operatingRange.inputRange.unit ||
408
+ !approximatelyEqual(entry.value, expected)) {
409
+ throw new InvalidScientificInputError("operatingRange spectral-node values must match the reduction values in the calibrated input domain.");
410
+ }
411
+ });
412
+ }
413
+ function validateResponseBinding(resolved, reduction) {
414
+ if (resolved.profileId !==
415
+ reduction.responseProfileId ||
416
+ resolved.colorSamplingProfileId !==
417
+ reduction.colorSamplingProfileId ||
418
+ resolved.channelId !==
419
+ reduction.channelId ||
420
+ resolved.sourceResponseKind !==
421
+ reduction.sourceResponseKind ||
422
+ resolved.responseScope !==
423
+ reduction.responseScope ||
424
+ resolved.scientificStatus !==
425
+ reduction.responseScientificStatus ||
426
+ canonicalJson(resolved.uncertainty) !==
427
+ canonicalJson(reduction.responseUncertainty) ||
428
+ canonicalJson(resolved.componentEvidence) !==
429
+ canonicalJson({
430
+ profile: reduction.componentEvidence
431
+ .spectral.profile,
432
+ channel: reduction.componentEvidence
433
+ .spectral.channel,
434
+ curves: reduction.componentEvidence
435
+ .spectral.curves
436
+ })) {
437
+ throw new InvalidScientificInputError("Resolved A/W response calibration metadata/evidence must exactly match the reduction.");
438
+ }
439
+ }
440
+ function validateExactResponseDataBinding(responseProfile, reduction) {
441
+ const response = responseProfile.channels.find((entry) => entry.channelId ===
442
+ reduction.channelId);
443
+ if (response === undefined ||
444
+ reduction.responseChannelBinding ===
445
+ undefined ||
446
+ canonicalJson(createSensorSpectralResponseChannelBinding(response)) !==
447
+ canonicalJson(reduction.responseChannelBinding)) {
448
+ throw new InvalidScientificInputError("Supplied spectral response channel data must exactly match the response-channel binding carried by the reduction.");
449
+ }
450
+ }
451
+ function validateElectricalBinding(profile, input) {
452
+ if (profile.responseApplicationProfileId !==
453
+ input.compatibility
454
+ .applicationProfileId ||
455
+ profile.spectralResponseProfileId !==
456
+ input.reduction
457
+ .responseProfileId ||
458
+ profile.colorSamplingProfileId !==
459
+ input.reduction
460
+ .colorSamplingProfileId ||
461
+ profile.channelId !==
462
+ input.reduction.channelId) {
463
+ throw new InvalidScientificInputError("Electrical applicability profile identities must exactly match the response pipeline.");
464
+ }
465
+ if (profile.conditionPolicy.kind ===
466
+ "exact-match-required") {
467
+ if (!electricalConditionsMatch(profile.referenceConditions, input.operatingElectricalConditions)) {
468
+ throw new InvalidScientificInputError("Operating electrical conditions must exactly match the A/W calibration reference conditions.");
469
+ }
470
+ return {
471
+ compatibility: "exact-match",
472
+ assumptionEvidence: []
473
+ };
474
+ }
475
+ return {
476
+ compatibility: "assumed-compatible",
477
+ assumptionEvidence: profile.conditionPolicy.evidence
478
+ };
479
+ }
480
+ /**
481
+ * Integrate per-wavelength A/W times radiant-power contributions to steady-state current magnitude
482
+ * with explicit electrical applicability.
483
+ *
484
+ * A/W response converts per-bin radiant power to quasi-static detector-terminal current magnitude.
485
+ * Electrical bias/load applicability is explicit. This is not EQE, electron rate, transimpedance
486
+ * voltage or RAW; rapidly varying current requires a separate temporal detector-response model.
487
+ * @param input - CalculateSensorResponsivityPhotocurrentInput. See the linked contract for coordinate, unit and profile binding semantics.
488
+ * @returns CalculationResult<SensorResponsivityPhotocurrent>. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
489
+ *
490
+ * @see docs/API_REFERENCE.md for the root export and exact type graph.
491
+ */
492
+ export function calculateSensorResponsivityPhotocurrent(input) {
493
+ validateAuthorizationChain(input.reduction, input.compatibility, input.operatingRange);
494
+ if (input.reduction
495
+ .sourceResponseKind !==
496
+ "effective-spectral-responsivity") {
497
+ throw new InvalidScientificInputError("A/W photocurrent conversion requires effective spectral responsivity, not EQE.");
498
+ }
499
+ const colorProfile = parseSensorColorSamplingProfile(input.colorSamplingProfile);
500
+ const responseProfile = parseSensorSpectralResponseProfile(input.spectralResponseProfile);
501
+ const electricalProfile = parseSensorResponsivityElectricalApplicabilityProfile(input.electricalApplicabilityProfile);
502
+ if (colorProfile.profileId !==
503
+ input.reduction
504
+ .colorSamplingProfileId ||
505
+ responseProfile.profileId !==
506
+ input.reduction
507
+ .responseProfileId ||
508
+ responseProfile
509
+ .colorSamplingProfileId !==
510
+ colorProfile.profileId) {
511
+ throw new InvalidScientificInputError("Supplied color/spectral response profiles must exactly match the reduction identities.");
512
+ }
513
+ validateExactResponseDataBinding(responseProfile, input.reduction);
514
+ const electrical = validateElectricalBinding(electricalProfile, input);
515
+ const nodes = validateReductionNodes(input.reduction);
516
+ validateOperatingRangeNodeBinding(input.reduction, nodes, input.operatingRange);
517
+ const currentSum = {
518
+ sum: 0,
519
+ correction: 0
520
+ };
521
+ const perWavelength = [];
522
+ let responseBindingValidated = false;
523
+ for (const node of nodes) {
524
+ const resolved = resolveParsedSensorSpectralResponseAtWavelength({
525
+ colorSamplingProfile: colorProfile,
526
+ spectralResponseProfile: responseProfile,
527
+ channelId: input.reduction.channelId,
528
+ wavelengthNanometers: node.wavelengthNanometers,
529
+ wavelengthBasis: input.reduction
530
+ .wavelengthBasis
531
+ });
532
+ if (!responseBindingValidated) {
533
+ validateResponseBinding(resolved.value, input.reduction);
534
+ responseBindingValidated =
535
+ true;
536
+ }
537
+ const responsivity = resolved.value.response;
538
+ const radiantPowerContributionWatts = node
539
+ .geometricApertureIncidentSpectralFluxWattsPerNanometer *
540
+ node.wavelengthMeasureNanometers;
541
+ const photocurrentMagnitudeContributionAmperes = radiantPowerContributionWatts *
542
+ responsivity.amperesPerWatt;
543
+ if (!Number.isFinite(radiantPowerContributionWatts) ||
544
+ !Number.isFinite(photocurrentMagnitudeContributionAmperes) ||
545
+ photocurrentMagnitudeContributionAmperes <
546
+ 0) {
547
+ throw new InvalidScientificInputError("A/W wavelength-node photocurrent calculation must remain finite and nonnegative.");
548
+ }
549
+ addCompensated(currentSum, photocurrentMagnitudeContributionAmperes);
550
+ perWavelength.push({
551
+ spectralSampleIndex: node.spectralSampleIndex,
552
+ wavelengthNanometers: node.wavelengthNanometers,
553
+ wavelengthMeasureNanometers: node.wavelengthMeasureNanometers,
554
+ geometricApertureIncidentSpectralFluxWattsPerNanometer: node
555
+ .geometricApertureIncidentSpectralFluxWattsPerNanometer,
556
+ radiantPowerContributionWatts,
557
+ spectralResponsivityAmperesPerWatt: responsivity.amperesPerWatt,
558
+ responseInterpolationUsed: resolved.value
559
+ .interpolationUsed,
560
+ photocurrentMagnitudeContributionAmperes
561
+ });
562
+ }
563
+ if (!Number.isFinite(currentSum.sum) ||
564
+ currentSum.sum < 0) {
565
+ throw new InvalidScientificInputError("Total A/W photocurrent magnitude must remain finite and nonnegative.");
566
+ }
567
+ return approximationResult({
568
+ colorSamplingProfileId: input.reduction
569
+ .colorSamplingProfileId,
570
+ responseProfileId: input.reduction
571
+ .responseProfileId,
572
+ responseApplicationProfileId: input.compatibility
573
+ .applicationProfileId,
574
+ operatingRangeProfileId: input.operatingRange
575
+ .operatingRangeProfileId,
576
+ electricalApplicabilityProfileId: electricalProfile.profileId,
577
+ site: {
578
+ ...input.reduction.site
579
+ },
580
+ channelId: input.reduction.channelId,
581
+ sourceResponseKind: "effective-spectral-responsivity",
582
+ responseScope: input.reduction.responseScope,
583
+ responseReferencePlane: input.compatibility
584
+ .requiredSourcePlane,
585
+ wavelengthBasis: input.reduction
586
+ .wavelengthBasis,
587
+ wavelengthRangeNanometers: {
588
+ ...input.reduction
589
+ .wavelengthRangeNanometers
590
+ },
591
+ electricalReferenceConditions: electricalProfile
592
+ .referenceConditions,
593
+ operatingElectricalConditions: input.operatingElectricalConditions,
594
+ electricalConditionPolicy: electricalProfile
595
+ .conditionPolicy,
596
+ electricalCompatibility: electrical.compatibility,
597
+ spectralNodeCount: nodes.length,
598
+ perWavelength,
599
+ photocurrentMagnitudeAmperes: currentSum.sum,
600
+ currentSignConvention: "magnitude-only-no-circuit-polarity",
601
+ summationMethod: "kahan-compensated",
602
+ responseApplicationPerformed: true,
603
+ spectralResponsivityApplied: true,
604
+ quantumEfficiencyApplied: false,
605
+ photonRateCalculated: false,
606
+ electronRateCalculated: false,
607
+ currentCalculated: true,
608
+ chargeCalculated: false,
609
+ temporalResponseModel: "quasi-static-steady-state-only",
610
+ detectorBandwidthModeled: false,
611
+ transimpedanceGainApplied: false,
612
+ voltageCalculated: false,
613
+ temporalIntegrationApplied: false,
614
+ exposureDurationApplied: false,
615
+ saturationAssessed: false,
616
+ readoutElectronicsLinearityAssessed: false,
617
+ shotNoiseApplied: false,
618
+ readNoiseApplied: false,
619
+ adcQuantizationApplied: false,
620
+ rawCodeValueProduced: false,
621
+ responseUncertaintyPropagated: false,
622
+ electricalApplicabilityUncertaintyPropagated: false,
623
+ quadratureConvergenceErrorEstimated: false,
624
+ componentEvidence: {
625
+ electricalApplicability: electricalProfile.evidence,
626
+ electricalConditionAssumption: electrical
627
+ .assumptionEvidence
628
+ }
629
+ }, "sensor-spectral-responsivity-photocurrent", "1.0.0", [
630
+ "Spectral responsivity in A/W is applied independently at every wavelength quadrature node as detector-terminal photocurrent magnitude per incident radiant power.",
631
+ "Current sign/polarity is deliberately not modeled; the result is a nonnegative photocurrent magnitude and does not imply a circuit current direction.",
632
+ "The A/W calibration is bound to explicit detector electrical conditions. Exact-match mode requires identical bias and readout-load semantics; approximation mode requires evidence and a stated limitation.",
633
+ "Virtual-ground current readout and finite input impedance are modeled as calibration-condition identities only; this function does not simulate amplifier circuits or prove impedance adequacy.",
634
+ "NIST photodiode guidance shows detector/electronics/loading can affect linear operation, so transimpedance/current-readout conditions are not treated as scientifically inert.",
635
+ "Structural compatibility, geometric-aperture linear superposition and per-spectral-bin operating-range applicability must already authorize the radiant-power→current path.",
636
+ "Response metadata/evidence and operating-range spectral-node values are rebound to the exact reduction so matching IDs alone or stale authorization cannot enable conversion.",
637
+ "The calculation does not use photon energy, QE, photon rate or electron rate. A/W remains a distinct current-domain response representation.",
638
+ "No transimpedance gain or voltage conversion is performed; current-to-voltage converter gain/offset/linearity remain downstream electronics contracts.",
639
+ "The A/W response is used only as a quasi-static steady-state power→current mapping. Detector impulse response, bandwidth, modulation-frequency response and transient settling are not modeled.",
640
+ "Outputs are instantaneous current only. Exposure-time integration to charge, saturation, noise, ADC/RAW conversion and reconstruction remain downstream.",
641
+ "Response/electrical uncertainties and quadrature convergence error are not propagated into a combined current uncertainty by this version."
642
+ ]);
643
+ }
644
+ //# sourceMappingURL=responsivity-photocurrent.js.map