@photivra/engine 1.5.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1078) hide show
  1. package/CHANGELOG.md +393 -6
  2. package/CITATION.cff +1 -1
  3. package/NODE_SUPPORT.md +64 -12
  4. package/README.md +301 -182
  5. package/SECURITY.md +37 -28
  6. package/THIRD_PARTY.md +148 -4
  7. package/dist/camera/equivalent-focal-length.d.ts +13 -14
  8. package/dist/camera/equivalent-focal-length.js +15 -13
  9. package/dist/camera/equivalent-focal-length.js.map +1 -1
  10. package/dist/camera/field-of-view.d.ts +30 -19
  11. package/dist/camera/field-of-view.js +67 -18
  12. package/dist/camera/field-of-view.js.map +1 -1
  13. package/dist/camera/lens-projection.d.ts +170 -0
  14. package/dist/camera/lens-projection.js +444 -0
  15. package/dist/camera/lens-projection.js.map +1 -0
  16. package/dist/camera/projected-object-size.d.ts +10 -11
  17. package/dist/camera/projected-object-size.js +12 -10
  18. package/dist/camera/projected-object-size.js.map +1 -1
  19. package/dist/capture/capture-export-metadata.d.ts +9 -10
  20. package/dist/capture/capture-export-metadata.js +8 -5
  21. package/dist/capture/capture-export-metadata.js.map +1 -1
  22. package/dist/capture/dng-import.d.ts +91 -0
  23. package/dist/capture/dng-import.js +343 -0
  24. package/dist/capture/dng-import.js.map +1 -0
  25. package/dist/capture/environment-raw-producer.d.ts +37 -17
  26. package/dist/capture/environment-raw-producer.js +43 -19
  27. package/dist/capture/environment-raw-producer.js.map +1 -1
  28. package/dist/capture/export-jpeg.d.ts +35 -4
  29. package/dist/capture/export-jpeg.js +133 -47
  30. package/dist/capture/export-jpeg.js.map +1 -1
  31. package/dist/capture/export-tiff.d.ts +48 -24
  32. package/dist/capture/export-tiff.js +91 -31
  33. package/dist/capture/export-tiff.js.map +1 -1
  34. package/dist/capture/focus-control.d.ts +42 -65
  35. package/dist/capture/focus-control.js +56 -75
  36. package/dist/capture/focus-control.js.map +1 -1
  37. package/dist/capture/host-yield-cadence.d.ts +25 -0
  38. package/dist/capture/host-yield-cadence.js +25 -0
  39. package/dist/capture/host-yield-cadence.js.map +1 -0
  40. package/dist/capture/linear-encoding.d.ts +14 -12
  41. package/dist/capture/linear-encoding.js +14 -13
  42. package/dist/capture/linear-encoding.js.map +1 -1
  43. package/dist/capture/lossless-jpeg.d.ts +27 -0
  44. package/dist/capture/lossless-jpeg.js +237 -0
  45. package/dist/capture/lossless-jpeg.js.map +1 -0
  46. package/dist/capture/native-environment-lean.d.ts +227 -0
  47. package/dist/capture/native-environment-lean.js +974 -0
  48. package/dist/capture/native-environment-lean.js.map +1 -0
  49. package/dist/capture/native-environment-optical-stage.d.ts +97 -0
  50. package/dist/capture/native-environment-optical-stage.js +340 -0
  51. package/dist/capture/native-environment-optical-stage.js.map +1 -0
  52. package/dist/capture/native-environment-raw.d.ts +140 -6
  53. package/dist/capture/native-environment-raw.js +435 -34
  54. package/dist/capture/native-environment-raw.js.map +1 -1
  55. package/dist/capture/native-raw-development.d.ts +116 -9
  56. package/dist/capture/native-raw-development.js +221 -62
  57. package/dist/capture/native-raw-development.js.map +1 -1
  58. package/dist/capture/native-raw-dng.d.ts +60 -0
  59. package/dist/capture/native-raw-dng.js +167 -0
  60. package/dist/capture/native-raw-dng.js.map +1 -0
  61. package/dist/capture/native-raw.d.ts +65 -12
  62. package/dist/capture/native-raw.js +81 -19
  63. package/dist/capture/native-raw.js.map +1 -1
  64. package/dist/capture/packed-sensor-raw.d.ts +160 -0
  65. package/dist/capture/packed-sensor-raw.js +221 -0
  66. package/dist/capture/packed-sensor-raw.js.map +1 -0
  67. package/dist/capture/photographic-export.d.ts +58 -35
  68. package/dist/capture/photographic-export.js +177 -70
  69. package/dist/capture/photographic-export.js.map +1 -1
  70. package/dist/capture/raw-development-kernel.d.ts +52 -0
  71. package/dist/capture/raw-development-kernel.js +88 -0
  72. package/dist/capture/raw-development-kernel.js.map +1 -0
  73. package/dist/capture/raw-frame-limits.d.ts +7 -7
  74. package/dist/capture/raw-frame-limits.js +7 -6
  75. package/dist/capture/raw-frame-limits.js.map +1 -1
  76. package/dist/capture/raw-frame-reconstruction.d.ts +8 -9
  77. package/dist/capture/raw-frame-reconstruction.js +9 -8
  78. package/dist/capture/raw-frame-reconstruction.js.map +1 -1
  79. package/dist/capture/raw-white-level.d.ts +55 -0
  80. package/dist/capture/raw-white-level.js +165 -0
  81. package/dist/capture/raw-white-level.js.map +1 -0
  82. package/dist/capture/release-sequence.d.ts +5 -7
  83. package/dist/capture/release-sequence.js +15 -13
  84. package/dist/capture/release-sequence.js.map +1 -1
  85. package/dist/capture/sensor-raw-frame.d.ts +5 -6
  86. package/dist/capture/sensor-raw-frame.js +26 -9
  87. package/dist/capture/sensor-raw-frame.js.map +1 -1
  88. package/dist/capture/sensor-raw-producer.d.ts +21 -13
  89. package/dist/capture/sensor-raw-producer.js +86 -25
  90. package/dist/capture/sensor-raw-producer.js.map +1 -1
  91. package/dist/capture/simulated-capture.d.ts +15 -16
  92. package/dist/capture/simulated-capture.js +22 -12
  93. package/dist/capture/simulated-capture.js.map +1 -1
  94. package/dist/color/camera-color-matrix.d.ts +69 -0
  95. package/dist/color/camera-color-matrix.js +132 -0
  96. package/dist/color/camera-color-matrix.js.map +1 -0
  97. package/dist/color/capture-color.d.ts +17 -10
  98. package/dist/color/capture-color.js +50 -17
  99. package/dist/color/capture-color.js.map +1 -1
  100. package/dist/color/chromatic-adaptation.d.ts +63 -0
  101. package/dist/color/chromatic-adaptation.js +91 -0
  102. package/dist/color/chromatic-adaptation.js.map +1 -0
  103. package/dist/color/color-difference.d.ts +104 -0
  104. package/dist/color/color-difference.js +205 -0
  105. package/dist/color/color-difference.js.map +1 -0
  106. package/dist/color/color-matching-functions.d.ts +168 -0
  107. package/dist/color/color-matching-functions.js +309 -0
  108. package/dist/color/color-matching-functions.js.map +1 -0
  109. package/dist/color/colorimetry-math.d.ts +52 -0
  110. package/dist/color/colorimetry-math.js +144 -0
  111. package/dist/color/colorimetry-math.js.map +1 -0
  112. package/dist/color/gamut-mapping.d.ts +54 -0
  113. package/dist/color/gamut-mapping.js +107 -0
  114. package/dist/color/gamut-mapping.js.map +1 -0
  115. package/dist/color/illuminants.d.ts +182 -0
  116. package/dist/color/illuminants.js +434 -0
  117. package/dist/color/illuminants.js.map +1 -0
  118. package/dist/color/rgb-color-spaces.d.ts +79 -0
  119. package/dist/color/rgb-color-spaces.js +115 -0
  120. package/dist/color/rgb-color-spaces.js.map +1 -0
  121. package/dist/color/sensor-color-development.d.ts +33 -11
  122. package/dist/color/sensor-color-development.js +104 -30
  123. package/dist/color/sensor-color-development.js.map +1 -1
  124. package/dist/color/srgb-icc.d.ts +9 -2
  125. package/dist/color/srgb-icc.js +16 -5
  126. package/dist/color/srgb-icc.js.map +1 -1
  127. package/dist/color/srgb-transfer.d.ts +1 -2
  128. package/dist/color/srgb-transfer.js +1 -1
  129. package/dist/color/srgb-transfer.js.map +1 -1
  130. package/dist/color/white-balance.d.ts +68 -19
  131. package/dist/color/white-balance.js +168 -35
  132. package/dist/color/white-balance.js.map +1 -1
  133. package/dist/composition/image-formation-plan.d.ts +152 -128
  134. package/dist/composition/image-formation-plan.js +292 -138
  135. package/dist/composition/image-formation-plan.js.map +1 -1
  136. package/dist/composition/plan-consumer.d.ts +6 -7
  137. package/dist/composition/plan-consumer.js +14 -11
  138. package/dist/composition/plan-consumer.js.map +1 -1
  139. package/dist/core/calculation-result.d.ts +21 -14
  140. package/dist/core/calculation-result.js +209 -11
  141. package/dist/core/calculation-result.js.map +1 -1
  142. package/dist/core/canonical-json.d.ts +13 -8
  143. package/dist/core/canonical-json.js +34 -15
  144. package/dist/core/canonical-json.js.map +1 -1
  145. package/dist/core/configuration-error.d.ts +5 -4
  146. package/dist/core/configuration-error.js +5 -3
  147. package/dist/core/configuration-error.js.map +1 -1
  148. package/dist/core/evidence-provenance.d.ts +12 -12
  149. package/dist/core/evidence-provenance.js +10 -9
  150. package/dist/core/evidence-provenance.js.map +1 -1
  151. package/dist/core/image-formation.d.ts +11 -10
  152. package/dist/core/image-formation.js +11 -9
  153. package/dist/core/image-formation.js.map +1 -1
  154. package/dist/core/owned-data.d.ts +9 -17
  155. package/dist/core/owned-data.js +9 -16
  156. package/dist/core/owned-data.js.map +1 -1
  157. package/dist/core/portable-math.d.ts +15 -0
  158. package/dist/core/portable-math.js +56 -0
  159. package/dist/core/portable-math.js.map +1 -0
  160. package/dist/core/record-validation.d.ts +48 -9
  161. package/dist/core/record-validation.js +93 -19
  162. package/dist/core/record-validation.js.map +1 -1
  163. package/dist/core/scientific-assurance.d.ts +16 -14
  164. package/dist/core/scientific-assurance.js +22 -18
  165. package/dist/core/scientific-assurance.js.map +1 -1
  166. package/dist/core/spectral-composition.d.ts +13 -14
  167. package/dist/core/spectral-composition.js +30 -27
  168. package/dist/core/spectral-composition.js.map +1 -1
  169. package/dist/core/spectral.d.ts +5 -6
  170. package/dist/core/spectral.js +9 -7
  171. package/dist/core/spectral.js.map +1 -1
  172. package/dist/core/validation.d.ts +3 -6
  173. package/dist/core/validation.js +3 -5
  174. package/dist/core/validation.js.map +1 -1
  175. package/dist/core/version.d.ts +6 -6
  176. package/dist/core/version.js +6 -5
  177. package/dist/core/version.js.map +1 -1
  178. package/dist/equipment/exposure-capabilities.d.ts +10 -10
  179. package/dist/equipment/exposure-capabilities.js +40 -30
  180. package/dist/equipment/exposure-capabilities.js.map +1 -1
  181. package/dist/equipment/generic-tier-assets.d.ts +13 -6
  182. package/dist/equipment/generic-tier-assets.js +34 -15
  183. package/dist/equipment/generic-tier-assets.js.map +1 -1
  184. package/dist/equipment/generic-tier-presets.d.ts +5 -6
  185. package/dist/equipment/generic-tier-presets.js +15 -13
  186. package/dist/equipment/generic-tier-presets.js.map +1 -1
  187. package/dist/equipment/iso-capabilities.d.ts +21 -22
  188. package/dist/equipment/iso-capabilities.js +49 -44
  189. package/dist/equipment/iso-capabilities.js.map +1 -1
  190. package/dist/equipment/metering-capabilities.d.ts +5 -6
  191. package/dist/equipment/metering-capabilities.js +22 -19
  192. package/dist/equipment/metering-capabilities.js.map +1 -1
  193. package/dist/equipment/release-capabilities.d.ts +3 -4
  194. package/dist/equipment/release-capabilities.js +18 -14
  195. package/dist/equipment/release-capabilities.js.map +1 -1
  196. package/dist/exposure/exposure-duration-control.d.ts +19 -17
  197. package/dist/exposure/exposure-duration-control.js +27 -23
  198. package/dist/exposure/exposure-duration-control.js.map +1 -1
  199. package/dist/exposure/exposure-mode-resolver.d.ts +42 -39
  200. package/dist/exposure/exposure-mode-resolver.js +127 -82
  201. package/dist/exposure/exposure-mode-resolver.js.map +1 -1
  202. package/dist/exposure/exposure.d.ts +17 -16
  203. package/dist/exposure/exposure.js +22 -15
  204. package/dist/exposure/exposure.js.map +1 -1
  205. package/dist/exposure/flash-ttl.d.ts +135 -0
  206. package/dist/exposure/flash-ttl.js +193 -0
  207. package/dist/exposure/flash-ttl.js.map +1 -0
  208. package/dist/exposure/flash.d.ts +144 -36
  209. package/dist/exposure/flash.js +259 -59
  210. package/dist/exposure/flash.js.map +1 -1
  211. package/dist/exposure/metering-scene-radiance.d.ts +10 -10
  212. package/dist/exposure/metering-scene-radiance.js +42 -23
  213. package/dist/exposure/metering-scene-radiance.js.map +1 -1
  214. package/dist/exposure/metering-target.d.ts +8 -8
  215. package/dist/exposure/metering-target.js +30 -20
  216. package/dist/exposure/metering-target.js.map +1 -1
  217. package/dist/exposure/metering-temporal.d.ts +16 -15
  218. package/dist/exposure/metering-temporal.js +41 -19
  219. package/dist/exposure/metering-temporal.js.map +1 -1
  220. package/dist/exposure/metering.d.ts +64 -17
  221. package/dist/exposure/metering.js +159 -30
  222. package/dist/exposure/metering.js.map +1 -1
  223. package/dist/exposure/program-line.d.ts +5 -5
  224. package/dist/exposure/program-line.js +20 -13
  225. package/dist/exposure/program-line.js.map +1 -1
  226. package/dist/facade/camera-preset.d.ts +8 -0
  227. package/dist/facade/camera-preset.js +102 -0
  228. package/dist/facade/camera-preset.js.map +1 -0
  229. package/dist/facade/chart-radiance-batch.d.ts +57 -0
  230. package/dist/facade/chart-radiance-batch.js +121 -0
  231. package/dist/facade/chart-radiance-batch.js.map +1 -0
  232. package/dist/facade/chart-scenes.d.ts +177 -0
  233. package/dist/facade/chart-scenes.js +232 -0
  234. package/dist/facade/chart-scenes.js.map +1 -0
  235. package/dist/facade/host-yield.d.ts +7 -0
  236. package/dist/facade/host-yield.js +23 -0
  237. package/dist/facade/host-yield.js.map +1 -0
  238. package/dist/facade/scene-radiance.d.ts +117 -0
  239. package/dist/facade/scene-radiance.js +205 -0
  240. package/dist/facade/scene-radiance.js.map +1 -0
  241. package/dist/facade/simulate-capture.d.ts +284 -0
  242. package/dist/facade/simulate-capture.js +1026 -0
  243. package/dist/facade/simulate-capture.js.map +1 -0
  244. package/dist/gpu/chart-radiance-gpu.d.ts +17 -0
  245. package/dist/gpu/chart-radiance-gpu.js +176 -0
  246. package/dist/gpu/chart-radiance-gpu.js.map +1 -0
  247. package/dist/gpu/image-kernel-accelerator.d.ts +132 -0
  248. package/dist/gpu/image-kernel-accelerator.js +720 -0
  249. package/dist/gpu/image-kernel-accelerator.js.map +1 -0
  250. package/dist/gpu/image-kernel-execution.d.ts +92 -0
  251. package/dist/gpu/image-kernel-execution.js +84 -0
  252. package/dist/gpu/image-kernel-execution.js.map +1 -0
  253. package/dist/gpu/sensor-stage-gpu.d.ts +44 -0
  254. package/dist/gpu/sensor-stage-gpu.js +317 -0
  255. package/dist/gpu/sensor-stage-gpu.js.map +1 -0
  256. package/dist/gpu/temporal-sum-gpu.d.ts +23 -0
  257. package/dist/gpu/temporal-sum-gpu.js +150 -0
  258. package/dist/gpu/temporal-sum-gpu.js.map +1 -0
  259. package/dist/gpu/webgpu-runtime.d.ts +63 -0
  260. package/dist/gpu/webgpu-runtime.js +215 -0
  261. package/dist/gpu/webgpu-runtime.js.map +1 -0
  262. package/dist/gpu/wgsl-chart-kernel.d.ts +30 -0
  263. package/dist/gpu/wgsl-chart-kernel.js +165 -0
  264. package/dist/gpu/wgsl-chart-kernel.js.map +1 -0
  265. package/dist/gpu/wgsl-kernels.d.ts +53 -0
  266. package/dist/gpu/wgsl-kernels.js +365 -0
  267. package/dist/gpu/wgsl-kernels.js.map +1 -0
  268. package/dist/gpu/wgsl-sensor-kernel.d.ts +64 -0
  269. package/dist/gpu/wgsl-sensor-kernel.js +409 -0
  270. package/dist/gpu/wgsl-sensor-kernel.js.map +1 -0
  271. package/dist/index.d.ts +89 -25
  272. package/dist/index.js +59 -15
  273. package/dist/index.js.map +1 -1
  274. package/dist/motion/camera-rotation.d.ts +92 -40
  275. package/dist/motion/camera-rotation.js +84 -47
  276. package/dist/motion/camera-rotation.js.map +1 -1
  277. package/dist/motion/capture-rotation-inverse-mapping.d.ts +37 -34
  278. package/dist/motion/capture-rotation-inverse-mapping.js +32 -24
  279. package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
  280. package/dist/motion/capture-rotation-temporal-quadrature.d.ts +39 -35
  281. package/dist/motion/capture-rotation-temporal-quadrature.js +37 -28
  282. package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
  283. package/dist/motion/capture-rotation-trajectory.d.ts +32 -28
  284. package/dist/motion/capture-rotation-trajectory.js +36 -26
  285. package/dist/motion/capture-rotation-trajectory.js.map +1 -1
  286. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +23 -21
  287. package/dist/motion/capture-translation-parallax-temporal-quadrature.js +33 -14
  288. package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
  289. package/dist/motion/extended-object-projection.d.ts +19 -16
  290. package/dist/motion/extended-object-projection.js +38 -18
  291. package/dist/motion/extended-object-projection.js.map +1 -1
  292. package/dist/motion/projected-motion.d.ts +18 -17
  293. package/dist/motion/projected-motion.js +25 -17
  294. package/dist/motion/projected-motion.js.map +1 -1
  295. package/dist/motion/temporal-exposure-sum.d.ts +55 -0
  296. package/dist/motion/temporal-exposure-sum.js +141 -0
  297. package/dist/motion/temporal-exposure-sum.js.map +1 -0
  298. package/dist/motion/video-sequence.d.ts +111 -0
  299. package/dist/motion/video-sequence.js +179 -0
  300. package/dist/motion/video-sequence.js.map +1 -0
  301. package/dist/optics/aperture.d.ts +14 -15
  302. package/dist/optics/aperture.js +13 -11
  303. package/dist/optics/aperture.js.map +1 -1
  304. package/dist/optics/atmospheric-haze.d.ts +83 -0
  305. package/dist/optics/atmospheric-haze.js +113 -0
  306. package/dist/optics/atmospheric-haze.js.map +1 -0
  307. package/dist/optics/brown-conrady-distortion.d.ts +116 -0
  308. package/dist/optics/brown-conrady-distortion.js +291 -0
  309. package/dist/optics/brown-conrady-distortion.js.map +1 -0
  310. package/dist/optics/circle-of-confusion.d.ts +10 -10
  311. package/dist/optics/circle-of-confusion.js +15 -11
  312. package/dist/optics/circle-of-confusion.js.map +1 -1
  313. package/dist/optics/complex-pupil-psf.d.ts +64 -33
  314. package/dist/optics/complex-pupil-psf.js +190 -98
  315. package/dist/optics/complex-pupil-psf.js.map +1 -1
  316. package/dist/optics/depth-of-field.d.ts +25 -15
  317. package/dist/optics/depth-of-field.js +67 -27
  318. package/dist/optics/depth-of-field.js.map +1 -1
  319. package/dist/optics/diffraction.d.ts +14 -13
  320. package/dist/optics/diffraction.js +14 -10
  321. package/dist/optics/diffraction.js.map +1 -1
  322. package/dist/optics/focus-breathing.d.ts +88 -27
  323. package/dist/optics/focus-breathing.js +114 -23
  324. package/dist/optics/focus-breathing.js.map +1 -1
  325. package/dist/optics/focus-state.d.ts +18 -18
  326. package/dist/optics/focus-state.js +21 -15
  327. package/dist/optics/focus-state.js.map +1 -1
  328. package/dist/optics/front-of-lens-filter.d.ts +45 -14
  329. package/dist/optics/front-of-lens-filter.js +259 -88
  330. package/dist/optics/front-of-lens-filter.js.map +1 -1
  331. package/dist/optics/illumination-vignetting.d.ts +16 -17
  332. package/dist/optics/illumination-vignetting.js +40 -17
  333. package/dist/optics/illumination-vignetting.js.map +1 -1
  334. package/dist/optics/irradiance-convolution.d.ts +59 -0
  335. package/dist/optics/irradiance-convolution.js +138 -0
  336. package/dist/optics/irradiance-convolution.js.map +1 -0
  337. package/dist/optics/lateral-chromatic-aberration.d.ts +33 -30
  338. package/dist/optics/lateral-chromatic-aberration.js +33 -23
  339. package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
  340. package/dist/optics/lens-psf-kernels.d.ts +89 -0
  341. package/dist/optics/lens-psf-kernels.js +175 -0
  342. package/dist/optics/lens-psf-kernels.js.map +1 -0
  343. package/dist/optics/lens-psf-profile.d.ts +78 -46
  344. package/dist/optics/lens-psf-profile.js +335 -124
  345. package/dist/optics/lens-psf-profile.js.map +1 -1
  346. package/dist/optics/longitudinal-chromatic-aberration.d.ts +102 -0
  347. package/dist/optics/longitudinal-chromatic-aberration.js +210 -0
  348. package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -0
  349. package/dist/optics/polygon-diffraction.d.ts +80 -23
  350. package/dist/optics/polygon-diffraction.js +130 -25
  351. package/dist/optics/polygon-diffraction.js.map +1 -1
  352. package/dist/optics/profile-contract.d.ts +5 -6
  353. package/dist/optics/profile-contract.js +14 -11
  354. package/dist/optics/profile-contract.js.map +1 -1
  355. package/dist/optics/psf-foundation.d.ts +23 -23
  356. package/dist/optics/psf-foundation.js +24 -21
  357. package/dist/optics/psf-foundation.js.map +1 -1
  358. package/dist/optics/pupil-vignetting.d.ts +118 -0
  359. package/dist/optics/pupil-vignetting.js +264 -0
  360. package/dist/optics/pupil-vignetting.js.map +1 -0
  361. package/dist/optics/radial-distortion.d.ts +34 -33
  362. package/dist/optics/radial-distortion.js +37 -30
  363. package/dist/optics/radial-distortion.js.map +1 -1
  364. package/dist/optics/scene-to-sensor-irradiance.d.ts +47 -33
  365. package/dist/optics/scene-to-sensor-irradiance.js +73 -45
  366. package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
  367. package/dist/optics/scene-to-sensor-quadrature.d.ts +23 -18
  368. package/dist/optics/scene-to-sensor-quadrature.js +16 -11
  369. package/dist/optics/scene-to-sensor-quadrature.js.map +1 -1
  370. package/dist/optics/sensor-aperture-rays.d.ts +20 -4
  371. package/dist/optics/sensor-aperture-rays.js +32 -14
  372. package/dist/optics/sensor-aperture-rays.js.map +1 -1
  373. package/dist/optics/sensor-environment-query.d.ts +81 -16
  374. package/dist/optics/sensor-environment-query.js +145 -12
  375. package/dist/optics/sensor-environment-query.js.map +1 -1
  376. package/dist/optics/sensor-psf-quadrature.d.ts +12 -10
  377. package/dist/optics/sensor-psf-quadrature.js +18 -11
  378. package/dist/optics/sensor-psf-quadrature.js.map +1 -1
  379. package/dist/optics/sensor-psf-support.d.ts +8 -6
  380. package/dist/optics/sensor-psf-support.js +8 -5
  381. package/dist/optics/sensor-psf-support.js.map +1 -1
  382. package/dist/optics/stray-light.d.ts +22 -19
  383. package/dist/optics/stray-light.js +18 -12
  384. package/dist/optics/stray-light.js.map +1 -1
  385. package/dist/optics/thin-lens.d.ts +10 -9
  386. package/dist/optics/thin-lens.js +12 -8
  387. package/dist/optics/thin-lens.js.map +1 -1
  388. package/dist/optics/zernike-wavefront.d.ts +154 -0
  389. package/dist/optics/zernike-wavefront.js +352 -0
  390. package/dist/optics/zernike-wavefront.js.map +1 -0
  391. package/dist/output/capture-corrected-sdr.d.ts +16 -8
  392. package/dist/output/capture-corrected-sdr.js +16 -8
  393. package/dist/output/capture-corrected-sdr.js.map +1 -1
  394. package/dist/output/capture-geometry.d.ts +34 -36
  395. package/dist/output/capture-geometry.js +52 -32
  396. package/dist/output/capture-geometry.js.map +1 -1
  397. package/dist/output/capture-sdr.d.ts +7 -6
  398. package/dist/output/capture-sdr.js +11 -8
  399. package/dist/output/capture-sdr.js.map +1 -1
  400. package/dist/output/crop.d.ts +22 -6
  401. package/dist/output/crop.js +40 -6
  402. package/dist/output/crop.js.map +1 -1
  403. package/dist/output/geometric-transforms.d.ts +60 -23
  404. package/dist/output/geometric-transforms.js +111 -24
  405. package/dist/output/geometric-transforms.js.map +1 -1
  406. package/dist/output/lens-corrections.d.ts +27 -19
  407. package/dist/output/lens-corrections.js +29 -13
  408. package/dist/output/lens-corrections.js.map +1 -1
  409. package/dist/output/native-capture-sdr.d.ts +71 -16
  410. package/dist/output/native-capture-sdr.js +190 -33
  411. package/dist/output/native-capture-sdr.js.map +1 -1
  412. package/dist/output/png-encoder.d.ts +65 -0
  413. package/dist/output/png-encoder.js +461 -0
  414. package/dist/output/png-encoder.js.map +1 -0
  415. package/dist/output/print-contrast-reference.d.ts +10 -9
  416. package/dist/output/print-contrast-reference.js +10 -8
  417. package/dist/output/print-contrast-reference.js.map +1 -1
  418. package/dist/output/print-detail.d.ts +18 -17
  419. package/dist/output/print-detail.js +12 -10
  420. package/dist/output/print-detail.js.map +1 -1
  421. package/dist/output/print-jpeg.d.ts +26 -5
  422. package/dist/output/print-jpeg.js +117 -50
  423. package/dist/output/print-jpeg.js.map +1 -1
  424. package/dist/output/print-plan.d.ts +19 -19
  425. package/dist/output/print-plan.js +11 -10
  426. package/dist/output/print-plan.js.map +1 -1
  427. package/dist/output/print-region-statistics.d.ts +14 -15
  428. package/dist/output/print-region-statistics.js +11 -11
  429. package/dist/output/print-region-statistics.js.map +1 -1
  430. package/dist/output/sdr-rendering.d.ts +48 -10
  431. package/dist/output/sdr-rendering.js +114 -25
  432. package/dist/output/sdr-rendering.js.map +1 -1
  433. package/dist/output/subject-framing-crop.d.ts +6 -10
  434. package/dist/output/subject-framing-crop.js +23 -13
  435. package/dist/output/subject-framing-crop.js.map +1 -1
  436. package/dist/processing/demosaic.d.ts +90 -0
  437. package/dist/processing/demosaic.js +275 -0
  438. package/dist/processing/demosaic.js.map +1 -0
  439. package/dist/processing/denoise.d.ts +68 -0
  440. package/dist/processing/denoise.js +214 -0
  441. package/dist/processing/denoise.js.map +1 -0
  442. package/dist/processing/focus-stacking.d.ts +17 -0
  443. package/dist/processing/focus-stacking.js +80 -0
  444. package/dist/processing/focus-stacking.js.map +1 -0
  445. package/dist/processing/hdr.d.ts +54 -0
  446. package/dist/processing/hdr.js +172 -0
  447. package/dist/processing/hdr.js.map +1 -0
  448. package/dist/processing/image-ops.d.ts +66 -0
  449. package/dist/processing/image-ops.js +192 -0
  450. package/dist/processing/image-ops.js.map +1 -0
  451. package/dist/processing/panorama.d.ts +51 -0
  452. package/dist/processing/panorama.js +305 -0
  453. package/dist/processing/panorama.js.map +1 -0
  454. package/dist/processing/processing-task.d.ts +85 -0
  455. package/dist/processing/processing-task.js +164 -0
  456. package/dist/processing/processing-task.js.map +1 -0
  457. package/dist/processing/tone-mapping.d.ts +69 -0
  458. package/dist/processing/tone-mapping.js +310 -0
  459. package/dist/processing/tone-mapping.js.map +1 -0
  460. package/dist/schema/camera.d.ts +5 -4
  461. package/dist/schema/illumination-spectral.d.ts +13 -19
  462. package/dist/schema/illumination-spectral.js +23 -19
  463. package/dist/schema/illumination-spectral.js.map +1 -1
  464. package/dist/schema/illumination-temporal.d.ts +12 -15
  465. package/dist/schema/illumination-temporal.js +43 -28
  466. package/dist/schema/illumination-temporal.js.map +1 -1
  467. package/dist/schema/illumination.d.ts +5 -4
  468. package/dist/schema/illumination.js +55 -20
  469. package/dist/schema/illumination.js.map +1 -1
  470. package/dist/schema/scene-radiance-temporal.d.ts +9 -11
  471. package/dist/schema/scene-radiance-temporal.js +26 -23
  472. package/dist/schema/scene-radiance-temporal.js.map +1 -1
  473. package/dist/schema/scene-radiance.d.ts +17 -17
  474. package/dist/schema/scene-radiance.js +56 -34
  475. package/dist/schema/scene-radiance.js.map +1 -1
  476. package/dist/schema/scene.d.ts +14 -13
  477. package/dist/schema/validation.d.ts +0 -1
  478. package/dist/schema/validation.js +17 -15
  479. package/dist/schema/validation.js.map +1 -1
  480. package/dist/sensor/accumulated-charge.d.ts +45 -64
  481. package/dist/sensor/accumulated-charge.js +41 -47
  482. package/dist/sensor/accumulated-charge.js.map +1 -1
  483. package/dist/sensor/architecture.d.ts +22 -25
  484. package/dist/sensor/architecture.js +17 -16
  485. package/dist/sensor/architecture.js.map +1 -1
  486. package/dist/sensor/camera-saturation-capacity.d.ts +21 -28
  487. package/dist/sensor/camera-saturation-capacity.js +36 -34
  488. package/dist/sensor/camera-saturation-capacity.js.map +1 -1
  489. package/dist/sensor/capture-color-sampling-binding.d.ts +46 -51
  490. package/dist/sensor/capture-color-sampling-binding.js +39 -41
  491. package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
  492. package/dist/sensor/capture-mode-timing.d.ts +8 -9
  493. package/dist/sensor/capture-mode-timing.js +24 -21
  494. package/dist/sensor/capture-mode-timing.js.map +1 -1
  495. package/dist/sensor/capture-mode.d.ts +28 -30
  496. package/dist/sensor/capture-mode.js +33 -31
  497. package/dist/sensor/capture-mode.js.map +1 -1
  498. package/dist/sensor/color-sampling.d.ts +30 -33
  499. package/dist/sensor/color-sampling.js +32 -37
  500. package/dist/sensor/color-sampling.js.map +1 -1
  501. package/dist/sensor/constant-rate-temporal-integration.d.ts +19 -23
  502. package/dist/sensor/constant-rate-temporal-integration.js +28 -26
  503. package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
  504. package/dist/sensor/dark-current.d.ts +53 -49
  505. package/dist/sensor/dark-current.js +87 -46
  506. package/dist/sensor/dark-current.js.map +1 -1
  507. package/dist/sensor/environment-photo-signal.d.ts +71 -30
  508. package/dist/sensor/environment-photo-signal.js +127 -46
  509. package/dist/sensor/environment-photo-signal.js.map +1 -1
  510. package/dist/sensor/eqe-electron-rate.d.ts +14 -13
  511. package/dist/sensor/eqe-electron-rate.js +34 -14
  512. package/dist/sensor/eqe-electron-rate.js.map +1 -1
  513. package/dist/sensor/eqe-local-exposure.d.ts +24 -24
  514. package/dist/sensor/eqe-local-exposure.js +15 -11
  515. package/dist/sensor/eqe-local-exposure.js.map +1 -1
  516. package/dist/sensor/eqe-temporal-exposure.d.ts +11 -11
  517. package/dist/sensor/eqe-temporal-exposure.js +15 -10
  518. package/dist/sensor/eqe-temporal-exposure.js.map +1 -1
  519. package/dist/sensor/exposure-window.d.ts +48 -34
  520. package/dist/sensor/exposure-window.js +77 -36
  521. package/dist/sensor/exposure-window.js.map +1 -1
  522. package/dist/sensor/fixed-pattern-noise.d.ts +108 -0
  523. package/dist/sensor/fixed-pattern-noise.js +166 -0
  524. package/dist/sensor/fixed-pattern-noise.js.map +1 -0
  525. package/dist/sensor/iso-gain.d.ts +44 -0
  526. package/dist/sensor/iso-gain.js +119 -0
  527. package/dist/sensor/iso-gain.js.map +1 -0
  528. package/dist/sensor/iso-signal-chain.d.ts +25 -48
  529. package/dist/sensor/iso-signal-chain.js +52 -66
  530. package/dist/sensor/iso-signal-chain.js.map +1 -1
  531. package/dist/sensor/local-exposure-binding.d.ts +21 -21
  532. package/dist/sensor/local-exposure-binding.js +22 -18
  533. package/dist/sensor/local-exposure-binding.js.map +1 -1
  534. package/dist/sensor/optical-stack.d.ts +36 -40
  535. package/dist/sensor/optical-stack.js +34 -37
  536. package/dist/sensor/optical-stack.js.map +1 -1
  537. package/dist/sensor/photon-energy.d.ts +22 -28
  538. package/dist/sensor/photon-energy.js +42 -34
  539. package/dist/sensor/photon-energy.js.map +1 -1
  540. package/dist/sensor/physical-charge-capacity.d.ts +20 -30
  541. package/dist/sensor/physical-charge-capacity.js +35 -36
  542. package/dist/sensor/physical-charge-capacity.js.map +1 -1
  543. package/dist/sensor/pixel-pitch.d.ts +2 -3
  544. package/dist/sensor/pixel-pitch.js +4 -2
  545. package/dist/sensor/pixel-pitch.js.map +1 -1
  546. package/dist/sensor/radiometry-readiness.d.ts +13 -15
  547. package/dist/sensor/radiometry-readiness.js +20 -17
  548. package/dist/sensor/radiometry-readiness.js.map +1 -1
  549. package/dist/sensor/raw-readout.d.ts +173 -83
  550. package/dist/sensor/raw-readout.js +425 -160
  551. package/dist/sensor/raw-readout.js.map +1 -1
  552. package/dist/sensor/raw-reconstruction.d.ts +112 -44
  553. package/dist/sensor/raw-reconstruction.js +200 -47
  554. package/dist/sensor/raw-reconstruction.js.map +1 -1
  555. package/dist/sensor/readout-exposure-linkage.d.ts +103 -34
  556. package/dist/sensor/readout-exposure-linkage.js +125 -27
  557. package/dist/sensor/readout-exposure-linkage.js.map +1 -1
  558. package/dist/sensor/readout-timing.d.ts +43 -44
  559. package/dist/sensor/readout-timing.js +38 -30
  560. package/dist/sensor/readout-timing.js.map +1 -1
  561. package/dist/sensor/response-application-compatibility.d.ts +21 -28
  562. package/dist/sensor/response-application-compatibility.js +35 -34
  563. package/dist/sensor/response-application-compatibility.js.map +1 -1
  564. package/dist/sensor/response-operating-range.d.ts +26 -35
  565. package/dist/sensor/response-operating-range.js +40 -39
  566. package/dist/sensor/response-operating-range.js.map +1 -1
  567. package/dist/sensor/responsivity-photocurrent.d.ts +21 -29
  568. package/dist/sensor/responsivity-photocurrent.js +57 -40
  569. package/dist/sensor/responsivity-photocurrent.js.map +1 -1
  570. package/dist/sensor/sampling-aperture.d.ts +21 -25
  571. package/dist/sensor/sampling-aperture.js +29 -28
  572. package/dist/sensor/sampling-aperture.js.map +1 -1
  573. package/dist/sensor/scene-eqe-temporal-exposure.d.ts +14 -12
  574. package/dist/sensor/scene-eqe-temporal-exposure.js +13 -8
  575. package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -1
  576. package/dist/sensor/sensor-geometry.d.ts +28 -32
  577. package/dist/sensor/sensor-geometry.js +35 -20
  578. package/dist/sensor/sensor-geometry.js.map +1 -1
  579. package/dist/sensor/signal-noise.d.ts +14 -16
  580. package/dist/sensor/signal-noise.js +15 -13
  581. package/dist/sensor/signal-noise.js.map +1 -1
  582. package/dist/sensor/spatial-sample-reduction.d.ts +45 -60
  583. package/dist/sensor/spatial-sample-reduction.js +39 -48
  584. package/dist/sensor/spatial-sample-reduction.js.map +1 -1
  585. package/dist/sensor/spatial-sampling-quadrature.d.ts +46 -54
  586. package/dist/sensor/spatial-sampling-quadrature.js +31 -36
  587. package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
  588. package/dist/sensor/spatio-spectral-reduction.d.ts +32 -42
  589. package/dist/sensor/spatio-spectral-reduction.js +24 -29
  590. package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
  591. package/dist/sensor/spectral-coverage.d.ts +6 -9
  592. package/dist/sensor/spectral-coverage.js +9 -6
  593. package/dist/sensor/spectral-coverage.js.map +1 -1
  594. package/dist/sensor/spectral-quadrature.d.ts +46 -60
  595. package/dist/sensor/spectral-quadrature.js +38 -48
  596. package/dist/sensor/spectral-quadrature.js.map +1 -1
  597. package/dist/sensor/spectral-response.d.ts +53 -41
  598. package/dist/sensor/spectral-response.js +80 -47
  599. package/dist/sensor/spectral-response.js.map +1 -1
  600. package/dist/sensor/stochastic-seed.d.ts +50 -0
  601. package/dist/sensor/stochastic-seed.js +123 -0
  602. package/dist/sensor/stochastic-seed.js.map +1 -0
  603. package/dist/sensor/temporal-eqe-sum.d.ts +2 -4
  604. package/dist/sensor/temporal-eqe-sum.js +5 -6
  605. package/dist/sensor/temporal-eqe-sum.js.map +1 -1
  606. package/dist/sensor/temporal-photo-signal.d.ts +5 -6
  607. package/dist/sensor/temporal-photo-signal.js +11 -10
  608. package/dist/sensor/temporal-photo-signal.js.map +1 -1
  609. package/dist/sensor/temporal-sample-binding.d.ts +1 -2
  610. package/dist/sensor/temporal-sample-binding.js +3 -3
  611. package/dist/sensor/temporal-sample-binding.js.map +1 -1
  612. package/dist/simulation/poc-simulation.d.ts +16 -16
  613. package/dist/simulation/poc-simulation.js +20 -15
  614. package/dist/simulation/poc-simulation.js.map +1 -1
  615. package/dist/stabilization/camera-shake.d.ts +42 -18
  616. package/dist/stabilization/camera-shake.js +43 -20
  617. package/dist/stabilization/camera-shake.js.map +1 -1
  618. package/dist/stabilization/system.d.ts +44 -41
  619. package/dist/stabilization/system.js +196 -108
  620. package/dist/stabilization/system.js.map +1 -1
  621. package/docs/AGENT_GUIDE.md +183 -0
  622. package/docs/API_REFERENCE.md +761 -2
  623. package/docs/QUICK_START.md +495 -0
  624. package/docs/USAGE.md +1719 -714
  625. package/docs/api/camera-equivalent-focal-length.md +6 -7
  626. package/docs/api/camera-field-of-view.md +16 -8
  627. package/docs/api/camera-lens-projection.md +246 -0
  628. package/docs/api/camera-projected-object-size.md +6 -5
  629. package/docs/api/capture-capture-export-metadata.md +10 -10
  630. package/docs/api/capture-dng-import.md +134 -0
  631. package/docs/api/capture-environment-raw-producer.md +17 -11
  632. package/docs/api/capture-export-jpeg.md +16 -0
  633. package/docs/api/capture-focus-control.md +25 -47
  634. package/docs/api/capture-linear-encoding.md +21 -12
  635. package/docs/api/capture-lossless-jpeg.md +49 -0
  636. package/docs/api/capture-native-environment-optical-stage.md +75 -0
  637. package/docs/api/capture-native-environment-raw.md +161 -4
  638. package/docs/api/capture-native-raw-development.md +69 -8
  639. package/docs/api/capture-native-raw-dng.md +84 -0
  640. package/docs/api/capture-native-raw.md +21 -10
  641. package/docs/api/capture-packed-sensor-raw.md +156 -0
  642. package/docs/api/capture-photographic-export.md +69 -31
  643. package/docs/api/capture-raw-frame-reconstruction.md +8 -8
  644. package/docs/api/capture-raw-white-level.md +37 -0
  645. package/docs/api/capture-release-sequence.md +6 -7
  646. package/docs/api/capture-sensor-raw-frame.md +6 -6
  647. package/docs/api/capture-sensor-raw-producer.md +17 -11
  648. package/docs/api/capture-simulated-capture.md +15 -15
  649. package/docs/api/color-camera-color-matrix.md +103 -0
  650. package/docs/api/color-capture-color.md +22 -11
  651. package/docs/api/color-chromatic-adaptation.md +82 -0
  652. package/docs/api/color-color-difference.md +134 -0
  653. package/docs/api/color-color-matching-functions.md +259 -0
  654. package/docs/api/color-colorimetry-math.md +54 -0
  655. package/docs/api/color-gamut-mapping.md +72 -0
  656. package/docs/api/color-illuminants.md +280 -0
  657. package/docs/api/color-rgb-color-spaces.md +151 -0
  658. package/docs/api/color-sensor-color-development.md +27 -0
  659. package/docs/api/color-srgb-icc.md +2 -4
  660. package/docs/api/color-white-balance.md +95 -19
  661. package/docs/api/composition-image-formation-plan.md +124 -95
  662. package/docs/api/composition-plan-consumer.md +7 -7
  663. package/docs/api/core-calculation-result.md +18 -14
  664. package/docs/api/core-configuration-error.md +1 -1
  665. package/docs/api/core-image-formation.md +7 -7
  666. package/docs/api/core-scientific-assurance.md +12 -10
  667. package/docs/api/core-spectral-composition.md +14 -14
  668. package/docs/api/core-spectral.md +6 -6
  669. package/docs/api/core-validation.md +3 -3
  670. package/docs/api/core-version.md +7 -6
  671. package/docs/api/equipment-exposure-capabilities.md +11 -10
  672. package/docs/api/equipment-generic-tier-assets.md +7 -2
  673. package/docs/api/equipment-generic-tier-presets.md +6 -6
  674. package/docs/api/equipment-iso-capabilities.md +18 -18
  675. package/docs/api/equipment-metering-capabilities.md +6 -6
  676. package/docs/api/equipment-release-capabilities.md +4 -4
  677. package/docs/api/exports.json +2213 -8
  678. package/docs/api/exposure-exposure-duration-control.md +9 -9
  679. package/docs/api/exposure-exposure-mode-resolver.md +35 -31
  680. package/docs/api/exposure-exposure.md +10 -10
  681. package/docs/api/exposure-flash-ttl.md +182 -0
  682. package/docs/api/exposure-flash.md +183 -28
  683. package/docs/api/exposure-metering-scene-radiance.md +11 -10
  684. package/docs/api/exposure-metering-target.md +9 -8
  685. package/docs/api/exposure-metering-temporal.md +8 -8
  686. package/docs/api/exposure-metering.md +69 -9
  687. package/docs/api/exposure-program-line.md +6 -5
  688. package/docs/api/facade-chart-radiance-batch.md +96 -0
  689. package/docs/api/facade-chart-scenes.md +240 -0
  690. package/docs/api/facade-scene-radiance.md +122 -0
  691. package/docs/api/facade-simulate-capture.md +324 -0
  692. package/docs/api/gpu-image-kernel-accelerator.md +157 -0
  693. package/docs/api/gpu-image-kernel-execution.md +152 -0
  694. package/docs/api/motion-camera-rotation.md +43 -26
  695. package/docs/api/motion-capture-rotation-inverse-mapping.md +24 -23
  696. package/docs/api/motion-capture-rotation-temporal-quadrature.md +22 -22
  697. package/docs/api/motion-capture-rotation-trajectory.md +15 -15
  698. package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +15 -14
  699. package/docs/api/motion-extended-object-projection.md +10 -8
  700. package/docs/api/motion-projected-motion.md +8 -8
  701. package/docs/api/motion-temporal-exposure-sum.md +98 -0
  702. package/docs/api/motion-video-sequence.md +159 -0
  703. package/docs/api/optics-aperture.md +8 -8
  704. package/docs/api/optics-atmospheric-haze.md +104 -0
  705. package/docs/api/optics-brown-conrady-distortion.md +123 -0
  706. package/docs/api/optics-circle-of-confusion.md +5 -4
  707. package/docs/api/optics-complex-pupil-psf.md +57 -16
  708. package/docs/api/optics-depth-of-field.md +12 -6
  709. package/docs/api/optics-diffraction.md +8 -7
  710. package/docs/api/optics-focus-breathing.md +104 -16
  711. package/docs/api/optics-focus-state.md +9 -10
  712. package/docs/api/optics-front-of-lens-filter.md +72 -14
  713. package/docs/api/optics-illumination-vignetting.md +10 -10
  714. package/docs/api/optics-irradiance-convolution.md +95 -0
  715. package/docs/api/optics-lateral-chromatic-aberration.md +22 -21
  716. package/docs/api/optics-lens-psf-kernels.md +72 -0
  717. package/docs/api/optics-lens-psf-profile.md +48 -26
  718. package/docs/api/optics-longitudinal-chromatic-aberration.md +128 -0
  719. package/docs/api/optics-polygon-diffraction.md +78 -13
  720. package/docs/api/optics-profile-contract.md +4 -4
  721. package/docs/api/optics-psf-foundation.md +12 -12
  722. package/docs/api/optics-pupil-vignetting.md +132 -0
  723. package/docs/api/optics-radial-distortion.md +12 -12
  724. package/docs/api/optics-scene-to-sensor-irradiance.md +25 -14
  725. package/docs/api/optics-scene-to-sensor-quadrature.md +15 -12
  726. package/docs/api/optics-sensor-aperture-rays.md +3 -2
  727. package/docs/api/optics-sensor-environment-query.md +52 -9
  728. package/docs/api/optics-sensor-psf-quadrature.md +13 -10
  729. package/docs/api/optics-stray-light.md +12 -11
  730. package/docs/api/optics-thin-lens.md +4 -3
  731. package/docs/api/optics-zernike-wavefront.md +229 -0
  732. package/docs/api/output-capture-corrected-sdr.md +10 -7
  733. package/docs/api/output-capture-geometry.md +35 -36
  734. package/docs/api/output-capture-sdr.md +4 -4
  735. package/docs/api/output-crop.md +7 -4
  736. package/docs/api/output-geometric-transforms.md +65 -19
  737. package/docs/api/output-lens-corrections.md +17 -15
  738. package/docs/api/output-native-capture-sdr.md +26 -13
  739. package/docs/api/output-png-encoder.md +105 -0
  740. package/docs/api/output-print-contrast-reference.md +8 -8
  741. package/docs/api/output-print-detail.md +14 -14
  742. package/docs/api/output-print-jpeg.md +22 -5
  743. package/docs/api/output-print-plan.md +18 -18
  744. package/docs/api/output-print-region-statistics.md +14 -14
  745. package/docs/api/output-sdr-rendering.md +52 -10
  746. package/docs/api/output-subject-framing-crop.md +5 -6
  747. package/docs/api/processing-demosaic.md +120 -0
  748. package/docs/api/processing-denoise.md +148 -0
  749. package/docs/api/processing-focus-stacking.md +41 -0
  750. package/docs/api/processing-hdr.md +113 -0
  751. package/docs/api/processing-panorama.md +82 -0
  752. package/docs/api/processing-processing-task.md +107 -0
  753. package/docs/api/processing-tone-mapping.md +142 -0
  754. package/docs/api/schema-camera.md +6 -4
  755. package/docs/api/schema-illumination-spectral.md +10 -11
  756. package/docs/api/schema-illumination-temporal.md +13 -15
  757. package/docs/api/schema-illumination.md +4 -4
  758. package/docs/api/schema-scene-radiance-temporal.md +10 -11
  759. package/docs/api/schema-scene-radiance.md +18 -17
  760. package/docs/api/schema-scene.md +9 -9
  761. package/docs/api/schema-validation.md +1 -1
  762. package/docs/api/sensor-accumulated-charge.md +12 -20
  763. package/docs/api/sensor-architecture.md +15 -16
  764. package/docs/api/sensor-camera-saturation-capacity.md +9 -11
  765. package/docs/api/sensor-capture-color-sampling-binding.md +47 -51
  766. package/docs/api/sensor-capture-mode-timing.md +9 -9
  767. package/docs/api/sensor-capture-mode.md +29 -30
  768. package/docs/api/sensor-color-sampling.md +31 -33
  769. package/docs/api/sensor-constant-rate-temporal-integration.md +10 -11
  770. package/docs/api/sensor-dark-current.md +30 -14
  771. package/docs/api/sensor-environment-photo-signal.md +13 -6
  772. package/docs/api/sensor-eqe-electron-rate.md +9 -8
  773. package/docs/api/sensor-eqe-local-exposure.md +18 -17
  774. package/docs/api/sensor-eqe-temporal-exposure.md +12 -11
  775. package/docs/api/sensor-exposure-window.md +24 -24
  776. package/docs/api/sensor-fixed-pattern-noise.md +104 -0
  777. package/docs/api/sensor-iso-gain.md +63 -0
  778. package/docs/api/sensor-iso-signal-chain.md +13 -22
  779. package/docs/api/sensor-local-exposure-binding.md +12 -13
  780. package/docs/api/sensor-optical-stack.md +37 -40
  781. package/docs/api/sensor-photon-energy.md +10 -11
  782. package/docs/api/sensor-physical-charge-capacity.md +8 -13
  783. package/docs/api/sensor-pixel-pitch.md +1 -1
  784. package/docs/api/sensor-radiometry-readiness.md +9 -9
  785. package/docs/api/sensor-raw-readout.md +118 -52
  786. package/docs/api/sensor-raw-reconstruction.md +97 -20
  787. package/docs/api/sensor-readout-exposure-linkage.md +120 -24
  788. package/docs/api/sensor-readout-timing.md +33 -35
  789. package/docs/api/sensor-response-application-compatibility.md +9 -11
  790. package/docs/api/sensor-response-operating-range.md +14 -18
  791. package/docs/api/sensor-responsivity-photocurrent.md +9 -12
  792. package/docs/api/sensor-sampling-aperture.md +22 -25
  793. package/docs/api/sensor-scene-eqe-temporal-exposure.md +9 -8
  794. package/docs/api/sensor-sensor-geometry.md +23 -24
  795. package/docs/api/sensor-signal-noise.md +10 -10
  796. package/docs/api/sensor-spatial-sample-reduction.md +27 -30
  797. package/docs/api/sensor-spatial-sampling-quadrature.md +37 -39
  798. package/docs/api/sensor-spatio-spectral-reduction.md +27 -29
  799. package/docs/api/sensor-spectral-coverage.md +5 -5
  800. package/docs/api/sensor-spectral-quadrature.md +33 -35
  801. package/docs/api/sensor-spectral-response.md +28 -16
  802. package/docs/api/sensor-temporal-photo-signal.md +6 -6
  803. package/docs/api/simulation-poc-simulation.md +17 -16
  804. package/docs/api/stabilization-camera-shake.md +29 -10
  805. package/docs/api/stabilization-system.md +25 -21
  806. package/docs/examples/production-request.json +3821 -2157
  807. package/docs/examples/simulate-capture.mjs +14 -0
  808. package/llms.txt +35 -0
  809. package/package.json +32 -12
  810. package/AGENTS.md +0 -674
  811. package/CONTRIBUTING.md +0 -76
  812. package/DCO +0 -33
  813. package/dist/camera/equivalent-focal-length.d.ts.map +0 -1
  814. package/dist/camera/field-of-view.d.ts.map +0 -1
  815. package/dist/camera/projected-object-size.d.ts.map +0 -1
  816. package/dist/capture/capture-export-metadata.d.ts.map +0 -1
  817. package/dist/capture/environment-raw-producer.d.ts.map +0 -1
  818. package/dist/capture/export-jpeg.d.ts.map +0 -1
  819. package/dist/capture/export-tiff.d.ts.map +0 -1
  820. package/dist/capture/focus-control.d.ts.map +0 -1
  821. package/dist/capture/linear-encoding.d.ts.map +0 -1
  822. package/dist/capture/native-environment-raw.d.ts.map +0 -1
  823. package/dist/capture/native-raw-development.d.ts.map +0 -1
  824. package/dist/capture/native-raw.d.ts.map +0 -1
  825. package/dist/capture/photographic-export.d.ts.map +0 -1
  826. package/dist/capture/raw-frame-limits.d.ts.map +0 -1
  827. package/dist/capture/raw-frame-reconstruction.d.ts.map +0 -1
  828. package/dist/capture/release-sequence.d.ts.map +0 -1
  829. package/dist/capture/sensor-raw-frame.d.ts.map +0 -1
  830. package/dist/capture/sensor-raw-producer.d.ts.map +0 -1
  831. package/dist/capture/simulated-capture.d.ts.map +0 -1
  832. package/dist/color/capture-color.d.ts.map +0 -1
  833. package/dist/color/sensor-color-development.d.ts.map +0 -1
  834. package/dist/color/srgb-icc.d.ts.map +0 -1
  835. package/dist/color/srgb-transfer.d.ts.map +0 -1
  836. package/dist/color/white-balance.d.ts.map +0 -1
  837. package/dist/composition/image-formation-plan.d.ts.map +0 -1
  838. package/dist/composition/plan-consumer.d.ts.map +0 -1
  839. package/dist/core/calculation-result.d.ts.map +0 -1
  840. package/dist/core/canonical-json.d.ts.map +0 -1
  841. package/dist/core/configuration-error.d.ts.map +0 -1
  842. package/dist/core/evidence-provenance.d.ts.map +0 -1
  843. package/dist/core/image-formation.d.ts.map +0 -1
  844. package/dist/core/owned-data.d.ts.map +0 -1
  845. package/dist/core/record-validation.d.ts.map +0 -1
  846. package/dist/core/scientific-assurance.d.ts.map +0 -1
  847. package/dist/core/spectral-composition.d.ts.map +0 -1
  848. package/dist/core/spectral.d.ts.map +0 -1
  849. package/dist/core/validation.d.ts.map +0 -1
  850. package/dist/core/version.d.ts.map +0 -1
  851. package/dist/equipment/exposure-capabilities.d.ts.map +0 -1
  852. package/dist/equipment/generic-tier-assets.d.ts.map +0 -1
  853. package/dist/equipment/generic-tier-presets.d.ts.map +0 -1
  854. package/dist/equipment/iso-capabilities.d.ts.map +0 -1
  855. package/dist/equipment/metering-capabilities.d.ts.map +0 -1
  856. package/dist/equipment/release-capabilities.d.ts.map +0 -1
  857. package/dist/exposure/exposure-duration-control.d.ts.map +0 -1
  858. package/dist/exposure/exposure-mode-resolver.d.ts.map +0 -1
  859. package/dist/exposure/exposure.d.ts.map +0 -1
  860. package/dist/exposure/flash.d.ts.map +0 -1
  861. package/dist/exposure/metering-scene-radiance.d.ts.map +0 -1
  862. package/dist/exposure/metering-target.d.ts.map +0 -1
  863. package/dist/exposure/metering-temporal.d.ts.map +0 -1
  864. package/dist/exposure/metering.d.ts.map +0 -1
  865. package/dist/exposure/program-line.d.ts.map +0 -1
  866. package/dist/index.d.ts.map +0 -1
  867. package/dist/motion/camera-rotation.d.ts.map +0 -1
  868. package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +0 -1
  869. package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +0 -1
  870. package/dist/motion/capture-rotation-trajectory.d.ts.map +0 -1
  871. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +0 -1
  872. package/dist/motion/extended-object-projection.d.ts.map +0 -1
  873. package/dist/motion/projected-motion.d.ts.map +0 -1
  874. package/dist/optics/aperture.d.ts.map +0 -1
  875. package/dist/optics/circle-of-confusion.d.ts.map +0 -1
  876. package/dist/optics/complex-pupil-psf.d.ts.map +0 -1
  877. package/dist/optics/depth-of-field.d.ts.map +0 -1
  878. package/dist/optics/diffraction.d.ts.map +0 -1
  879. package/dist/optics/focus-breathing.d.ts.map +0 -1
  880. package/dist/optics/focus-state.d.ts.map +0 -1
  881. package/dist/optics/front-of-lens-filter.d.ts.map +0 -1
  882. package/dist/optics/illumination-vignetting.d.ts.map +0 -1
  883. package/dist/optics/lateral-chromatic-aberration.d.ts.map +0 -1
  884. package/dist/optics/lens-psf-profile.d.ts.map +0 -1
  885. package/dist/optics/polygon-diffraction.d.ts.map +0 -1
  886. package/dist/optics/profile-contract.d.ts.map +0 -1
  887. package/dist/optics/psf-foundation.d.ts.map +0 -1
  888. package/dist/optics/radial-distortion.d.ts.map +0 -1
  889. package/dist/optics/scene-to-sensor-irradiance.d.ts.map +0 -1
  890. package/dist/optics/scene-to-sensor-quadrature.d.ts.map +0 -1
  891. package/dist/optics/sensor-aperture-rays.d.ts.map +0 -1
  892. package/dist/optics/sensor-environment-query.d.ts.map +0 -1
  893. package/dist/optics/sensor-psf-quadrature.d.ts.map +0 -1
  894. package/dist/optics/sensor-psf-support.d.ts.map +0 -1
  895. package/dist/optics/stray-light.d.ts.map +0 -1
  896. package/dist/optics/thin-lens.d.ts.map +0 -1
  897. package/dist/output/capture-corrected-sdr.d.ts.map +0 -1
  898. package/dist/output/capture-geometry.d.ts.map +0 -1
  899. package/dist/output/capture-sdr.d.ts.map +0 -1
  900. package/dist/output/crop.d.ts.map +0 -1
  901. package/dist/output/geometric-transforms.d.ts.map +0 -1
  902. package/dist/output/lens-corrections.d.ts.map +0 -1
  903. package/dist/output/native-capture-sdr.d.ts.map +0 -1
  904. package/dist/output/print-contrast-reference.d.ts.map +0 -1
  905. package/dist/output/print-detail.d.ts.map +0 -1
  906. package/dist/output/print-jpeg.d.ts.map +0 -1
  907. package/dist/output/print-plan.d.ts.map +0 -1
  908. package/dist/output/print-region-statistics.d.ts.map +0 -1
  909. package/dist/output/sdr-rendering.d.ts.map +0 -1
  910. package/dist/output/subject-framing-crop.d.ts.map +0 -1
  911. package/dist/schema/camera.d.ts.map +0 -1
  912. package/dist/schema/camera.js +0 -3
  913. package/dist/schema/camera.js.map +0 -1
  914. package/dist/schema/illumination-spectral.d.ts.map +0 -1
  915. package/dist/schema/illumination-temporal.d.ts.map +0 -1
  916. package/dist/schema/illumination.d.ts.map +0 -1
  917. package/dist/schema/scene-radiance-temporal.d.ts.map +0 -1
  918. package/dist/schema/scene-radiance.d.ts.map +0 -1
  919. package/dist/schema/scene.d.ts.map +0 -1
  920. package/dist/schema/scene.js +0 -3
  921. package/dist/schema/scene.js.map +0 -1
  922. package/dist/schema/validation.d.ts.map +0 -1
  923. package/dist/sensor/accumulated-charge.d.ts.map +0 -1
  924. package/dist/sensor/architecture.d.ts.map +0 -1
  925. package/dist/sensor/camera-saturation-capacity.d.ts.map +0 -1
  926. package/dist/sensor/capture-color-sampling-binding.d.ts.map +0 -1
  927. package/dist/sensor/capture-mode-timing.d.ts.map +0 -1
  928. package/dist/sensor/capture-mode.d.ts.map +0 -1
  929. package/dist/sensor/color-sampling.d.ts.map +0 -1
  930. package/dist/sensor/constant-rate-temporal-integration.d.ts.map +0 -1
  931. package/dist/sensor/dark-current.d.ts.map +0 -1
  932. package/dist/sensor/environment-photo-signal.d.ts.map +0 -1
  933. package/dist/sensor/eqe-electron-rate.d.ts.map +0 -1
  934. package/dist/sensor/eqe-local-exposure.d.ts.map +0 -1
  935. package/dist/sensor/eqe-temporal-exposure.d.ts.map +0 -1
  936. package/dist/sensor/exposure-window.d.ts.map +0 -1
  937. package/dist/sensor/iso-signal-chain.d.ts.map +0 -1
  938. package/dist/sensor/local-exposure-binding.d.ts.map +0 -1
  939. package/dist/sensor/optical-stack.d.ts.map +0 -1
  940. package/dist/sensor/photon-energy.d.ts.map +0 -1
  941. package/dist/sensor/physical-charge-capacity.d.ts.map +0 -1
  942. package/dist/sensor/pixel-pitch.d.ts.map +0 -1
  943. package/dist/sensor/radiometry-readiness.d.ts.map +0 -1
  944. package/dist/sensor/raw-readout.d.ts.map +0 -1
  945. package/dist/sensor/raw-reconstruction.d.ts.map +0 -1
  946. package/dist/sensor/readout-exposure-linkage.d.ts.map +0 -1
  947. package/dist/sensor/readout-timing.d.ts.map +0 -1
  948. package/dist/sensor/response-application-compatibility.d.ts.map +0 -1
  949. package/dist/sensor/response-operating-range.d.ts.map +0 -1
  950. package/dist/sensor/responsivity-photocurrent.d.ts.map +0 -1
  951. package/dist/sensor/sampling-aperture.d.ts.map +0 -1
  952. package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +0 -1
  953. package/dist/sensor/sensor-geometry.d.ts.map +0 -1
  954. package/dist/sensor/signal-noise.d.ts.map +0 -1
  955. package/dist/sensor/spatial-sample-reduction.d.ts.map +0 -1
  956. package/dist/sensor/spatial-sampling-quadrature.d.ts.map +0 -1
  957. package/dist/sensor/spatio-spectral-reduction.d.ts.map +0 -1
  958. package/dist/sensor/spectral-coverage.d.ts.map +0 -1
  959. package/dist/sensor/spectral-quadrature.d.ts.map +0 -1
  960. package/dist/sensor/spectral-response.d.ts.map +0 -1
  961. package/dist/sensor/temporal-eqe-sum.d.ts.map +0 -1
  962. package/dist/sensor/temporal-photo-signal.d.ts.map +0 -1
  963. package/dist/sensor/temporal-sample-binding.d.ts.map +0 -1
  964. package/dist/simulation/poc-simulation.d.ts.map +0 -1
  965. package/dist/stabilization/camera-shake.d.ts.map +0 -1
  966. package/dist/stabilization/system.d.ts.map +0 -1
  967. package/docs/API_STYLE.md +0 -235
  968. package/docs/ARCHITECTURE.md +0 -356
  969. package/docs/AUTOMATION_COORDINATION.md +0 -190
  970. package/docs/CAPTURE_COLOR.md +0 -25
  971. package/docs/CAPTURE_CORRECTED_SDR.md +0 -25
  972. package/docs/CAPTURE_EXPORT_METADATA.md +0 -27
  973. package/docs/CAPTURE_SDR.md +0 -22
  974. package/docs/DENSE_PUPIL_QUALIFICATION.md +0 -121
  975. package/docs/DEVELOPERS.md +0 -68
  976. package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
  977. package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
  978. package/docs/EXPORT_ACCEPTANCE.md +0 -133
  979. package/docs/GENERIC_TIER_PRESETS.md +0 -269
  980. package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
  981. package/docs/IMAGE_FORMATION.md +0 -247
  982. package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
  983. package/docs/MOTION_AND_SIGNAL.md +0 -250
  984. package/docs/NATIVE_CAPTURE_SDR.md +0 -70
  985. package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
  986. package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
  987. package/docs/NATIVE_RAW_AND_PRINT.md +0 -54
  988. package/docs/NUMERICAL_CORRECTNESS.md +0 -191
  989. package/docs/PERFORMANCE_BASELINE.md +0 -56
  990. package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
  991. package/docs/PHYSICS_FOUNDATION.md +0 -426
  992. package/docs/POC_API.md +0 -278
  993. package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
  994. package/docs/POC_PROJECTION_REUSE.md +0 -124
  995. package/docs/PRINT_195_196_REVIEW.md +0 -93
  996. package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
  997. package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
  998. package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
  999. package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
  1000. package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
  1001. package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
  1002. package/docs/PRINT_PLANNING.md +0 -75
  1003. package/docs/PRINT_REGION_STATISTICS.md +0 -38
  1004. package/docs/PROCESSED_OUTPUT.md +0 -157
  1005. package/docs/PRODUCTION_COMPOSITION.md +0 -373
  1006. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
  1007. package/docs/PROVENANCE.md +0 -115
  1008. package/docs/PSF_FOUNDATION.md +0 -165
  1009. package/docs/RAW_FRAME_ENVELOPE.md +0 -56
  1010. package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
  1011. package/docs/RELEASE_1_0.md +0 -66
  1012. package/docs/RELEASE_1_0_1.md +0 -61
  1013. package/docs/RELEASE_1_1_0.md +0 -25
  1014. package/docs/RELEASE_1_2_0.md +0 -51
  1015. package/docs/RELEASE_1_3_0.md +0 -15
  1016. package/docs/RELEASE_1_4_0.md +0 -23
  1017. package/docs/RELEASE_1_5_0.md +0 -105
  1018. package/docs/RELEASE_AUDIT.md +0 -39
  1019. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
  1020. package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
  1021. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
  1022. package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
  1023. package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
  1024. package/docs/SDR_RENDERING.md +0 -33
  1025. package/docs/SENSOR_APERTURE_RAYS.md +0 -23
  1026. package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
  1027. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
  1028. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
  1029. package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
  1030. package/docs/SENSOR_RAW_FRAME.md +0 -20
  1031. package/docs/SENSOR_RAW_PRODUCER.md +0 -77
  1032. package/docs/SEPARABLE_EMISSION_DRAFT.md +0 -103
  1033. package/docs/SIGNAL_CONFORMANCE.md +0 -23
  1034. package/docs/SIMULATED_CAPTURE.md +0 -65
  1035. package/docs/STABILIZATION.md +0 -234
  1036. package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
  1037. package/docs/TIER_ACCEPTANCE.md +0 -129
  1038. package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
  1039. package/docs/V1_COMPOSITION_MAP.md +0 -123
  1040. package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
  1041. package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
  1042. package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
  1043. package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
  1044. package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
  1045. package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
  1046. package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
  1047. package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
  1048. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
  1049. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
  1050. package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
  1051. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
  1052. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
  1053. package/docs/licenses/castleCSF-MIT.txt +0 -21
  1054. package/docs/validation/dense-pupil-2026-10-06/pilot.jsonl +0 -6
  1055. package/docs/validation/documentation-fragments.json +0 -212
  1056. package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
  1057. package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
  1058. package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
  1059. package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
  1060. package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
  1061. package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
  1062. package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
  1063. package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
  1064. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
  1065. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
  1066. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
  1067. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
  1068. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
  1069. package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
  1070. package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
  1071. package/docs/validation/print-196-candidate-capabilities.json +0 -28
  1072. package/docs/validation/print-196-candidate-evidence.json +0 -356
  1073. package/docs/validation/print-196-engine-acceptance.json +0 -81
  1074. package/docs/validation/print-detail-capabilities.json +0 -103
  1075. package/docs/validation/print-detail-jpeg-evidence.json +0 -116
  1076. package/docs/validation/print-detail-sdr-evidence.json +0 -81
  1077. package/docs/validation/release-audit-inventory.json +0 -1306
  1078. package/docs/validation/tier-acceptance-report-v1.json +0 -2538
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixed-pattern-noise.js","sourceRoot":"","sources":["../../src/sensor/fixed-pattern-noise.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Fixed-pattern noise (FPN): the part of sensor noise that stays the same from shot to shot for one\n * physical sensor. It covers photo-response non-uniformity (PRNU), dark-signal non-uniformity (DSNU),\n * hot pixels and row and column readout offsets, as defined in EMVA Standard 1288 Release 4.0 (spatial\n * non-uniformity of the photo response and of the dark signal).\n *\n * The pattern is deterministic. It is seeded from an explicit sensor-instance seed and absolute\n * colour-sampling site coordinates, never from the per-capture noise seed, so the same sensor shows\n * the same pattern in every capture.\n *\n * Application points in the readout chain (see raw-readout.ts):\n * - PRNU multiplies the expected photo charge before photo shot-noise sampling;\n * - DSNU and hot pixels multiply the population-mean dark-current expectation before dark shot-noise\n * sampling, so their excess charge scales with exposure duration and with the declared\n * temperature model of the dark-current profile;\n * - row and column offsets are input-referred electron offsets added with read noise, before the\n * pre-ADC threshold.\n *\n * The dark-current model itself stays a population mean; this module is a separate spatial model that\n * must be attached explicitly. Values are declared by the caller (or are synthetic preset values).\n * Nothing here is a measured calibration.\n * @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support\n * limits.\n */\n\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { parseEvidenceList, type EvidenceBackedFact, type EvidenceProvenance } from \"../core/evidence-provenance.js\";\nimport { requireAllowlistedRecord, requirePublicOpaqueId, requireInputKeys } from \"../core/record-validation.js\";\nimport { InvalidScientificInputError } from \"../core/validation.js\";\nimport {\n createDeterministicUniformStream,\n deriveSensorFixedPatternSeedUint32,\n sampleDeterministicStandardNormal,\n SENSOR_FIXED_PATTERN_COLUMN_STREAM_ID,\n SENSOR_FIXED_PATTERN_DSNU_STREAM_ID,\n SENSOR_FIXED_PATTERN_HOT_PIXEL_STREAM_ID,\n SENSOR_FIXED_PATTERN_PRNU_STREAM_ID,\n SENSOR_FIXED_PATTERN_ROW_STREAM_ID\n} from \"./stochastic-seed.js\";\n\nexport const SENSOR_FIXED_PATTERN_NOISE_PROFILE_SCHEMA_VERSION = \"0.1.0\" as const;\n/** Versioned identity of the pattern-generation equations and seed schedule. */\nexport const SENSOR_FIXED_PATTERN_NOISE_MODEL = Object.freeze({ id: \"photivra-sensor-fixed-pattern\", version: \"1.0.0\" } as const);\n\n/**\n * Explicit fixed-pattern parameters for one sensor instance. Every component is required; a zero\n * standard deviation, fraction or RMS disables that component.\n */\nexport interface SensorFixedPatternNoiseProfile {\n schemaVersion: typeof SENSOR_FIXED_PATTERN_NOISE_PROFILE_SCHEMA_VERSION;\n profileId: string;\n /** The colour-sampling grid whose absolute site coordinates index the pattern. */\n colorSamplingProfileId: string;\n scientificStatus: \"approximation\";\n /** Identifies the physical sensor. Independent of every per-capture noise seed. */\n sensorInstanceSeedUint32: number;\n /** EMVA 1288 PRNU: spatial standard deviation of the photo response divided by its mean. */\n photoResponseNonUniformity: { relativeStandardDeviation: EvidenceBackedFact<number> };\n /** Spatial standard deviation of the dark-current rate divided by the population-mean rate. */\n darkSignalNonUniformity: { relativeStandardDeviation: EvidenceBackedFact<number> };\n /** Fraction of sites whose dark-current rate is the population mean times the multiplier. */\n hotPixels: { siteFraction: EvidenceBackedFact<number>; darkCurrentMultiplier: EvidenceBackedFact<number> };\n /** Fixed readout offset per row, in input-referred electrons, normally distributed with zero mean. */\n rowOffset: { rmsElectrons: EvidenceBackedFact<number> };\n /** Fixed readout offset per column, in input-referred electrons, normally distributed with zero mean. */\n columnOffset: { rmsElectrons: EvidenceBackedFact<number> };\n patternDistribution: \"normal-factors-truncated-at-zero\";\n evidence: readonly EvidenceProvenance[];\n limitations: readonly string[];\n}\n\n/** The deterministic pattern values of one colour-sampling site. */\nexport interface SensorFixedPatternSiteValues {\n profileId: string;\n modelId: typeof SENSOR_FIXED_PATTERN_NOISE_MODEL.id;\n modelVersion: typeof SENSOR_FIXED_PATTERN_NOISE_MODEL.version;\n site: { x: number; y: number };\n /** Multiplies the expected photo charge (1 = no PRNU); never negative. */\n photoResponseGainFactor: number;\n /** Multiplies the population-mean dark expectation (1 = no DSNU); never negative. */\n darkCurrentFactor: number;\n hotPixel: boolean;\n rowOffsetElectrons: number;\n columnOffsetElectrons: number;\n /** rowOffsetElectrons + columnOffsetElectrons, added at readout. */\n readoutOffsetElectrons: number;\n}\n\nconst FACT_KEYS = [\"value\", \"evidence\"];\n\nfunction fact(value: unknown, path: string, maximum: number, minimum = 0): EvidenceBackedFact<number> {\n const record = requireAllowlistedRecord(value, FACT_KEYS, path + \" must be an evidence-backed fact.\");\n const v = record.value;\n if (typeof v !== \"number\" || !Number.isFinite(v) || v < minimum || v > maximum) {\n throw new InvalidConfigurationError(path + \".value must be finite from \" + minimum + \" through \" + maximum + \".\");\n }\n return { value: v, evidence: parseEvidenceList(record.evidence, path + \".evidence\") };\n}\n\nfunction limitations(value: unknown): readonly string[] {\n if (!Array.isArray(value) || value.some((entry) => typeof entry !== \"string\" || entry.trim().length === 0)) {\n throw new InvalidConfigurationError(\"sensorFixedPatternNoise.limitations must be an array of non-empty strings.\");\n }\n if (new Set(value).size !== value.length) {\n throw new InvalidConfigurationError(\"sensorFixedPatternNoise.limitations must not contain duplicates.\");\n }\n return value.map((entry: string) => entry.trim());\n}\n\n/**\n * Validates an untrusted fixed-pattern noise profile. Unknown keys, out-of-range parameters and\n * missing evidence are rejected. The PRNU and DSNU relative standard deviations are limited to 0.5\n * and 5, and the hot-pixel multiplier to 1–1e6.\n * @param value - Untrusted data. TypeScript types alone are not validation.\n * @returns The validated profile.\n * @see docs/MOTION_AND_SIGNAL.md for the model and its sources.\n */\nexport function parseSensorFixedPatternNoiseProfile(value: unknown): SensorFixedPatternNoiseProfile {\n const r = requireAllowlistedRecord(value, [\"schemaVersion\", \"profileId\", \"colorSamplingProfileId\", \"scientificStatus\",\n \"sensorInstanceSeedUint32\", \"photoResponseNonUniformity\", \"darkSignalNonUniformity\", \"hotPixels\", \"rowOffset\", \"columnOffset\",\n \"patternDistribution\", \"evidence\", \"limitations\"], \"Invalid sensor fixed-pattern noise profile fields.\");\n if (r.schemaVersion !== SENSOR_FIXED_PATTERN_NOISE_PROFILE_SCHEMA_VERSION) {\n throw new InvalidConfigurationError('sensorFixedPatternNoise.schemaVersion must be \"' + SENSOR_FIXED_PATTERN_NOISE_PROFILE_SCHEMA_VERSION + '\".');\n }\n if (r.scientificStatus !== \"approximation\") {\n throw new InvalidConfigurationError('sensorFixedPatternNoise.scientificStatus must be \"approximation\".');\n }\n if (r.patternDistribution !== \"normal-factors-truncated-at-zero\") {\n throw new InvalidConfigurationError('sensorFixedPatternNoise.patternDistribution must be \"normal-factors-truncated-at-zero\".');\n }\n const seed = r.sensorInstanceSeedUint32;\n if (typeof seed !== \"number\" || !Number.isSafeInteger(seed) || seed < 0 || seed > 0xffff_ffff) {\n throw new InvalidConfigurationError(\"sensorFixedPatternNoise.sensorInstanceSeedUint32 must be an unsigned 32-bit integer.\");\n }\n const prnu = requireAllowlistedRecord(r.photoResponseNonUniformity, [\"relativeStandardDeviation\"], \"Invalid PRNU fields.\");\n const dsnu = requireAllowlistedRecord(r.darkSignalNonUniformity, [\"relativeStandardDeviation\"], \"Invalid DSNU fields.\");\n const hot = requireAllowlistedRecord(r.hotPixels, [\"siteFraction\", \"darkCurrentMultiplier\"], \"Invalid hot-pixel fields.\");\n const row = requireAllowlistedRecord(r.rowOffset, [\"rmsElectrons\"], \"Invalid row-offset fields.\");\n const column = requireAllowlistedRecord(r.columnOffset, [\"rmsElectrons\"], \"Invalid column-offset fields.\");\n return {\n schemaVersion: SENSOR_FIXED_PATTERN_NOISE_PROFILE_SCHEMA_VERSION,\n profileId: requirePublicOpaqueId(r.profileId, \"sensorFixedPatternNoise.profileId must be a public opaque identifier.\"),\n colorSamplingProfileId: requirePublicOpaqueId(r.colorSamplingProfileId, \"sensorFixedPatternNoise.colorSamplingProfileId must be a public opaque identifier.\"),\n scientificStatus: \"approximation\",\n sensorInstanceSeedUint32: seed,\n photoResponseNonUniformity: { relativeStandardDeviation: fact(prnu.relativeStandardDeviation, \"photoResponseNonUniformity.relativeStandardDeviation\", 0.5) },\n darkSignalNonUniformity: { relativeStandardDeviation: fact(dsnu.relativeStandardDeviation, \"darkSignalNonUniformity.relativeStandardDeviation\", 5) },\n hotPixels: { siteFraction: fact(hot.siteFraction, \"hotPixels.siteFraction\", 1),\n darkCurrentMultiplier: fact(hot.darkCurrentMultiplier, \"hotPixels.darkCurrentMultiplier\", 1e6, 1) },\n rowOffset: { rmsElectrons: fact(row.rmsElectrons, \"rowOffset.rmsElectrons\", 1e6) },\n columnOffset: { rmsElectrons: fact(column.rmsElectrons, \"columnOffset.rmsElectrons\", 1e6) },\n patternDistribution: \"normal-factors-truncated-at-zero\",\n evidence: parseEvidenceList(r.evidence, \"sensorFixedPatternNoise.evidence\"),\n limitations: limitations(r.limitations)\n };\n}\n\nfunction normal(seed: number, x: number, y: number, stream: number): number {\n return sampleDeterministicStandardNormal(createDeterministicUniformStream(deriveSensorFixedPatternSeedUint32(seed, x, y, stream)));\n}\n\n/**\n * Computes the fixed-pattern values of one absolute colour-sampling site.\n *\n * - PRNU gain g = max(0, 1 + σ_PRNU·z₁);\n * - hot pixel when u < f_hot, then dark factor d = m_hot; otherwise d = max(0, 1 + σ_DSNU·z₂);\n * - row offset σ_row·z(row y), column offset σ_col·z(column x), in input-referred electrons.\n *\n * Each z is a standard normal value and u a uniform value, each from its own stream hashed with\n * MurmurHash3 from (sensorInstanceSeed, x, y, stream). Row values use x = 0 and column values y = 0,\n * so a whole row or column shares one value. Cutting negative factors off at zero shifts the mean\n * factor by less than 1e-6 for σ ≤ 0.2.\n * @param input - A parsed or untrusted profile plus a nonnegative integer site.\n * @returns The site's fixed-pattern values.\n */\nexport function calculateSensorFixedPatternSite(input: {\n profile: SensorFixedPatternNoiseProfile; site: { x: number; y: number };\n}): SensorFixedPatternSiteValues {\n requireInputKeys(input, \"calculateSensorFixedPatternSite\", [\"profile\", \"site\"]);\n const profile = parseSensorFixedPatternNoiseProfile(input.profile);\n return evaluateParsedFixedPatternSite(profile, input.site);\n}\n\n/** Internal: the PRNU gain, dark-current factor and hot-pixel state of one site (no readout offsets). */\nexport function evaluateFixedPatternSiteFactors(profile: SensorFixedPatternNoiseProfile, x: number, y: number):\n { photoResponseGainFactor: number; darkCurrentFactor: number; hotPixel: boolean } {\n const seed = profile.sensorInstanceSeedUint32;\n const prnuSd = profile.photoResponseNonUniformity.relativeStandardDeviation.value;\n const dsnuSd = profile.darkSignalNonUniformity.relativeStandardDeviation.value;\n const hotFraction = profile.hotPixels.siteFraction.value;\n const photoResponseGainFactor = prnuSd === 0 ? 1 : Math.max(0, 1 + prnuSd * normal(seed, x, y, SENSOR_FIXED_PATTERN_PRNU_STREAM_ID));\n const hotPixel = hotFraction > 0 &&\n createDeterministicUniformStream(deriveSensorFixedPatternSeedUint32(seed, x, y, SENSOR_FIXED_PATTERN_HOT_PIXEL_STREAM_ID)).next() < hotFraction;\n const darkCurrentFactor = hotPixel ? profile.hotPixels.darkCurrentMultiplier.value :\n dsnuSd === 0 ? 1 : Math.max(0, 1 + dsnuSd * normal(seed, x, y, SENSOR_FIXED_PATTERN_DSNU_STREAM_ID));\n return { photoResponseGainFactor, darkCurrentFactor, hotPixel };\n}\n\n/** Internal: the fixed readout offset of row `y`, in input-referred electrons. */\nexport function evaluateFixedPatternRowOffset(profile: SensorFixedPatternNoiseProfile, y: number): number {\n const rms = profile.rowOffset.rmsElectrons.value;\n return rms === 0 ? 0 : rms * normal(profile.sensorInstanceSeedUint32, 0, y, SENSOR_FIXED_PATTERN_ROW_STREAM_ID);\n}\n\n/** Internal: the fixed readout offset of column `x`, in input-referred electrons. */\nexport function evaluateFixedPatternColumnOffset(profile: SensorFixedPatternNoiseProfile, x: number): number {\n const rms = profile.columnOffset.rmsElectrons.value;\n return rms === 0 ? 0 : rms * normal(profile.sensorInstanceSeedUint32, x, 0, SENSOR_FIXED_PATTERN_COLUMN_STREAM_ID);\n}\n\n/** Internal: the same calculation for an already parsed profile. */\nexport function evaluateParsedFixedPatternSite(profile: SensorFixedPatternNoiseProfile,\n site: { x: number; y: number }): SensorFixedPatternSiteValues {\n const { x, y } = site ?? {};\n if (!Number.isSafeInteger(x) || !Number.isSafeInteger(y) || x < 0 || y < 0 || x > 0xffff_ffff || y > 0xffff_ffff) {\n throw new InvalidScientificInputError(\"Fixed-pattern site coordinates must be nonnegative uint32 integers.\");\n }\n const { photoResponseGainFactor, darkCurrentFactor, hotPixel } = evaluateFixedPatternSiteFactors(profile, x, y);\n const rowOffsetElectrons = evaluateFixedPatternRowOffset(profile, y);\n const columnOffsetElectrons = evaluateFixedPatternColumnOffset(profile, x);\n return {\n profileId: profile.profileId,\n modelId: SENSOR_FIXED_PATTERN_NOISE_MODEL.id,\n modelVersion: SENSOR_FIXED_PATTERN_NOISE_MODEL.version,\n site: { x, y },\n photoResponseGainFactor,\n darkCurrentFactor,\n hotPixel,\n rowOffsetElectrons,\n columnOffsetElectrons,\n readoutOffsetElectrons: rowOffsetElectrons + columnOffsetElectrons\n };\n}\n"]}
@@ -0,0 +1,44 @@
1
+ import { type EvidenceBackedFact, type EvidenceProvenance } from "../core/evidence-provenance.js";
2
+ import { type SensorReadoutConversionRegime, type SensorReadoutExposureIndexGain } from "./raw-readout.js";
3
+ import type { GenericIsoStandardRegimeBand } from "./iso-signal-chain.js";
4
+ import type { SensorSpectralResponseScientificStatus } from "./spectral-response.js";
5
+ /** One conversion-gain mode, active from its minimum exposure index up to the next mode's. */
6
+ export interface IsoGainConversionGainMode {
7
+ mode: SensorReadoutExposureIndexGain["conversionGainMode"];
8
+ minimumExposureIndex: number;
9
+ readNoiseRmsElectrons: EvidenceBackedFact<number>;
10
+ /** Optional charge storage limit of this mode. Every regime's pre-ADC threshold must be at or below it. */
11
+ maximumChargeElectrons?: EvidenceBackedFact<number>;
12
+ }
13
+ export interface CreateIsoGainReadoutRegimesInput {
14
+ regimeIdPrefix: string;
15
+ scientificStatus: SensorSpectralResponseScientificStatus;
16
+ baseExposureIndex: number;
17
+ /** Strictly increasing settings, each at least the base exposure index. */
18
+ exposureIndices: readonly number[];
19
+ /** Q0: electron-equivalent signal that reaches digital saturation at the base exposure index. */
20
+ baseSaturationElectronEquivalent: EvidenceBackedFact<number>;
21
+ /** A_max: largest analog gain relative to the base regime (>= 1). */
22
+ maximumAnalogGain: EvidenceBackedFact<number>;
23
+ adc: {
24
+ bitDepth: number;
25
+ blackLevelCode: number;
26
+ digitalSaturationCode: number;
27
+ };
28
+ conversionGainModes: readonly IsoGainConversionGainMode[];
29
+ evidence: readonly EvidenceProvenance[];
30
+ limitations: readonly string[];
31
+ }
32
+ export interface IsoGainReadoutRegimes {
33
+ regimes: readonly SensorReadoutConversionRegime[];
34
+ /** One single-value band per setting, ready for a GenericIsoSignalChainProfile. */
35
+ standardRegimeBands: readonly GenericIsoStandardRegimeBand[];
36
+ }
37
+ /**
38
+ * Builds a readout regime and signal-chain band for each exposure index (see the module comment
39
+ * for the equations). The result is checked with the same rules as parseSensorReadoutConversionProfile.
40
+ * Each regime carries an `exposureIndexGain` record of how it was derived.
41
+ * @param input - The sensor parameters and ISO settings; untrusted values are validated.
42
+ * @returns The readout regimes and bands.
43
+ */
44
+ export declare function createIsoGainReadoutRegimes(input: CreateIsoGainReadoutRegimesInput): IsoGainReadoutRegimes;
@@ -0,0 +1,119 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ /**
3
+ * ISO gain: builds one explicit readout regime for each ISO (exposure index) setting from declared
4
+ * sensor parameters, so that raising ISO brightens the RAW the way a camera's programmable gain does.
5
+ *
6
+ * Model (exposure index S = 10 / H of CIPA DC-004-2020, free at https://www.cipa.jp/e/std/std-sec.html,
7
+ * also specified in ISO 12232:2019; EMVA Standard 1288 Release 4.0 linear camera model,
8
+ * where the system gain K in DN/e- multiplies the electron signal):
9
+ * R = S / S0 exposure-index ratio to the base exposure index S0
10
+ * a = min(R, A_max) analog (pre-ADC) gain relative to the base regime
11
+ * d = R / a post-ADC digital gain beyond the analog range
12
+ * g(S) = Q0 / (span * a) electrons per code (1/K), span = digitalSaturation - black
13
+ * Q_preADC(S) = Q0 / a electrons that drive the ADC to digital saturation
14
+ * So the electrons needed to reach digital saturation are Q0 * S0 / S.
15
+ *
16
+ * The exposure indices of CIPA DC-004 put the reference exposure H_ref in proportion to 1/S: standard
17
+ * output sensitivity (SOS) and REI (recommended exposure index) both use S = 10 / H (§3.2, §3.3). So a
18
+ * correct exposure for S gives the same black-subtracted fraction of digital saturation at every S.
19
+ *
20
+ * Read noise in electrons is declared per conversion-gain mode, never derived from S. (With dual
21
+ * conversion gain, the high-conversion-gain mode used at high S has lower input-referred read noise.)
22
+ *
23
+ * Inputs are explicit declarations; Photivra presets use synthetic teaching values. No camera
24
+ * calibration is implied.
25
+ * @see docs/MOTION_AND_SIGNAL.md for equations, sources and limits.
26
+ */
27
+ import { InvalidConfigurationError } from "../core/configuration-error.js";
28
+ import { parseEvidenceList } from "../core/evidence-provenance.js";
29
+ import { requireAllowlistedRecord, requirePublicOpaqueId } from "../core/record-validation.js";
30
+ import { parseSensorReadoutConversionProfile } from "./raw-readout.js";
31
+ function positive(value, path) {
32
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
33
+ throw new InvalidConfigurationError(path + " must be finite and greater than zero.");
34
+ }
35
+ return value;
36
+ }
37
+ function positiveFact(value, path) {
38
+ const r = requireAllowlistedRecord(value, ["value", "evidence"], path + " must be an evidence-backed fact.");
39
+ return { value: positive(r.value, path + ".value"), evidence: parseEvidenceList(r.evidence, path + ".evidence") };
40
+ }
41
+ /**
42
+ * Builds a readout regime and signal-chain band for each exposure index (see the module comment
43
+ * for the equations). The result is checked with the same rules as parseSensorReadoutConversionProfile.
44
+ * Each regime carries an `exposureIndexGain` record of how it was derived.
45
+ * @param input - The sensor parameters and ISO settings; untrusted values are validated.
46
+ * @returns The readout regimes and bands.
47
+ */
48
+ export function createIsoGainReadoutRegimes(input) {
49
+ const r = requireAllowlistedRecord(input, ["regimeIdPrefix", "scientificStatus", "baseExposureIndex", "exposureIndices",
50
+ "baseSaturationElectronEquivalent", "maximumAnalogGain", "adc", "conversionGainModes", "evidence", "limitations"], "Invalid ISO gain readout fields.");
51
+ const prefix = r.regimeIdPrefix === "" ? "" : requirePublicOpaqueId(r.regimeIdPrefix, "regimeIdPrefix must be empty or a public opaque identifier.");
52
+ const base = positive(r.baseExposureIndex, "baseExposureIndex");
53
+ const q0 = positiveFact(r.baseSaturationElectronEquivalent, "baseSaturationElectronEquivalent");
54
+ const aMax = positiveFact(r.maximumAnalogGain, "maximumAnalogGain");
55
+ if (aMax.value < 1)
56
+ throw new InvalidConfigurationError("maximumAnalogGain must be at least 1.");
57
+ const evidence = parseEvidenceList(r.evidence, "evidence");
58
+ const adc = requireAllowlistedRecord(r.adc, ["bitDepth", "blackLevelCode", "digitalSaturationCode"], "Invalid ISO gain ADC fields.");
59
+ if (!Array.isArray(r.exposureIndices) || r.exposureIndices.length === 0 || r.exposureIndices.length > 256) {
60
+ throw new InvalidConfigurationError("exposureIndices must contain 1 through 256 settings.");
61
+ }
62
+ const indices = r.exposureIndices.map((value, i) => positive(value, "exposureIndices[" + i + "]"));
63
+ if (indices[0] < base || indices.some((value, i) => i > 0 && value <= indices[i - 1])) {
64
+ throw new InvalidConfigurationError("exposureIndices must strictly increase from at least the base exposure index.");
65
+ }
66
+ if (!Array.isArray(r.conversionGainModes) || r.conversionGainModes.length === 0 || r.conversionGainModes.length > 8) {
67
+ throw new InvalidConfigurationError("conversionGainModes must contain 1 through 8 modes.");
68
+ }
69
+ const modes = r.conversionGainModes.map((value, i) => {
70
+ const m = requireAllowlistedRecord(value, ["mode", "minimumExposureIndex", "readNoiseRmsElectrons", "maximumChargeElectrons"], "Invalid conversion-gain mode fields.");
71
+ if (m.mode !== "single-conversion-gain" && m.mode !== "low-conversion-gain" && m.mode !== "high-conversion-gain") {
72
+ throw new InvalidConfigurationError("conversionGainModes[" + i + "].mode is invalid.");
73
+ }
74
+ const noise = requireAllowlistedRecord(m.readNoiseRmsElectrons, ["value", "evidence"], "Invalid read-noise fact.");
75
+ if (typeof noise.value !== "number" || !Number.isFinite(noise.value) || noise.value < 0) {
76
+ throw new InvalidConfigurationError("conversionGainModes[" + i + "].readNoiseRmsElectrons.value must be finite and nonnegative.");
77
+ }
78
+ return { mode: m.mode,
79
+ minimumExposureIndex: positive(m.minimumExposureIndex, "conversionGainModes[" + i + "].minimumExposureIndex"),
80
+ readNoiseRmsElectrons: { value: noise.value, evidence: parseEvidenceList(noise.evidence, "readNoiseRmsElectrons.evidence") },
81
+ ...(m.maximumChargeElectrons === undefined ? {} :
82
+ { maximumChargeElectrons: positiveFact(m.maximumChargeElectrons, "conversionGainModes[" + i + "].maximumChargeElectrons") }) };
83
+ });
84
+ if (modes[0].minimumExposureIndex !== base || modes.some((m, i) => i > 0 && m.minimumExposureIndex <= modes[i - 1].minimumExposureIndex)) {
85
+ throw new InvalidConfigurationError("conversionGainModes must start at the base exposure index and strictly increase.");
86
+ }
87
+ const gainEvidence = [...q0.evidence, ...aMax.evidence].filter((entry, i, all) => all.findIndex((other) => JSON.stringify(other) === JSON.stringify(entry)) === i);
88
+ const black = adc.blackLevelCode, saturation = adc.digitalSaturationCode;
89
+ const span = saturation - black;
90
+ const regimes = indices.map((exposureIndex) => {
91
+ const ratio = exposureIndex / base;
92
+ const analogGain = Math.min(ratio, aMax.value);
93
+ const digitalGain = ratio / analogGain;
94
+ const mode = modes.filter((m) => m.minimumExposureIndex <= exposureIndex).pop();
95
+ const preAdc = q0.value / analogGain;
96
+ if (mode.maximumChargeElectrons !== undefined && preAdc > mode.maximumChargeElectrons.value) {
97
+ throw new InvalidConfigurationError("A " + mode.mode + " regime would need more charge than its declared storage limit.");
98
+ }
99
+ const regimeEvidence = [...evidence];
100
+ return {
101
+ regimeId: prefix + "iso-" + exposureIndex,
102
+ scientificStatus: r.scientificStatus,
103
+ systemConversionGainElectronsPerCode: { value: preAdc / span, evidence: gainEvidence },
104
+ preAdcSaturationElectronEquivalent: { value: preAdc, evidence: gainEvidence },
105
+ readNoiseComponents: [{ componentId: "electronic", rmsElectrons: mode.readNoiseRmsElectrons, evidence: mode.readNoiseRmsElectrons.evidence }],
106
+ adc: { bitDepth: adc.bitDepth, blackLevelCode: black, digitalSaturationCode: saturation, transfer: "uniform-round-half-up",
107
+ ...(digitalGain === 1 ? {} : { digitalGain }) },
108
+ exposureIndexGain: { exposureIndex, baseExposureIndex: base, analogGain, digitalGain, conversionGainMode: mode.mode, evidence: regimeEvidence },
109
+ evidence: regimeEvidence,
110
+ limitations: r.limitations
111
+ };
112
+ });
113
+ // Reuse the regime parser to check the ADC, limitations and consistency.
114
+ const parsed = parseSensorReadoutConversionProfile({ schemaVersion: "0.1.0", profileId: prefix + "validation", colorSamplingProfileId: "validation",
115
+ channelId: "validation", regimeSelectionOwnedBy: "explicit-upstream-camera-state-not-inferred-from-iso", regimes, evidence }).regimes;
116
+ return { regimes: parsed, standardRegimeBands: indices.map((exposureIndex, i) => ({ minimumExposureIndex: exposureIndex,
117
+ maximumExposureIndex: exposureIndex, readoutRegimeId: parsed[i].regimeId })) };
118
+ }
119
+ //# sourceMappingURL=iso-gain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iso-gain.js","sourceRoot":"","sources":["../../src/sensor/iso-gain.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * ISO gain: builds one explicit readout regime for each ISO (exposure index) setting from declared\n * sensor parameters, so that raising ISO brightens the RAW the way a camera's programmable gain does.\n *\n * Model (exposure index S = 10 / H of CIPA DC-004-2020, free at https://www.cipa.jp/e/std/std-sec.html,\n * also specified in ISO 12232:2019; EMVA Standard 1288 Release 4.0 linear camera model,\n * where the system gain K in DN/e- multiplies the electron signal):\n * R = S / S0 exposure-index ratio to the base exposure index S0\n * a = min(R, A_max) analog (pre-ADC) gain relative to the base regime\n * d = R / a post-ADC digital gain beyond the analog range\n * g(S) = Q0 / (span * a) electrons per code (1/K), span = digitalSaturation - black\n * Q_preADC(S) = Q0 / a electrons that drive the ADC to digital saturation\n * So the electrons needed to reach digital saturation are Q0 * S0 / S.\n *\n * The exposure indices of CIPA DC-004 put the reference exposure H_ref in proportion to 1/S: standard\n * output sensitivity (SOS) and REI (recommended exposure index) both use S = 10 / H (§3.2, §3.3). So a\n * correct exposure for S gives the same black-subtracted fraction of digital saturation at every S.\n *\n * Read noise in electrons is declared per conversion-gain mode, never derived from S. (With dual\n * conversion gain, the high-conversion-gain mode used at high S has lower input-referred read noise.)\n *\n * Inputs are explicit declarations; Photivra presets use synthetic teaching values. No camera\n * calibration is implied.\n * @see docs/MOTION_AND_SIGNAL.md for equations, sources and limits.\n */\n\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { parseEvidenceList, type EvidenceBackedFact, type EvidenceProvenance } from \"../core/evidence-provenance.js\";\nimport { requireAllowlistedRecord, requirePublicOpaqueId } from \"../core/record-validation.js\";\nimport { parseSensorReadoutConversionProfile, type SensorReadoutConversionRegime,\n type SensorReadoutExposureIndexGain } from \"./raw-readout.js\";\nimport type { GenericIsoStandardRegimeBand } from \"./iso-signal-chain.js\";\nimport type { SensorSpectralResponseScientificStatus } from \"./spectral-response.js\";\n\n/** One conversion-gain mode, active from its minimum exposure index up to the next mode's. */\nexport interface IsoGainConversionGainMode {\n mode: SensorReadoutExposureIndexGain[\"conversionGainMode\"];\n minimumExposureIndex: number;\n readNoiseRmsElectrons: EvidenceBackedFact<number>;\n /** Optional charge storage limit of this mode. Every regime's pre-ADC threshold must be at or below it. */\n maximumChargeElectrons?: EvidenceBackedFact<number>;\n}\n\nexport interface CreateIsoGainReadoutRegimesInput {\n regimeIdPrefix: string;\n scientificStatus: SensorSpectralResponseScientificStatus;\n baseExposureIndex: number;\n /** Strictly increasing settings, each at least the base exposure index. */\n exposureIndices: readonly number[];\n /** Q0: electron-equivalent signal that reaches digital saturation at the base exposure index. */\n baseSaturationElectronEquivalent: EvidenceBackedFact<number>;\n /** A_max: largest analog gain relative to the base regime (>= 1). */\n maximumAnalogGain: EvidenceBackedFact<number>;\n adc: { bitDepth: number; blackLevelCode: number; digitalSaturationCode: number };\n conversionGainModes: readonly IsoGainConversionGainMode[];\n evidence: readonly EvidenceProvenance[];\n limitations: readonly string[];\n}\n\nexport interface IsoGainReadoutRegimes {\n regimes: readonly SensorReadoutConversionRegime[];\n /** One single-value band per setting, ready for a GenericIsoSignalChainProfile. */\n standardRegimeBands: readonly GenericIsoStandardRegimeBand[];\n}\n\nfunction positive(value: unknown, path: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n throw new InvalidConfigurationError(path + \" must be finite and greater than zero.\");\n }\n return value;\n}\n\nfunction positiveFact(value: unknown, path: string): EvidenceBackedFact<number> {\n const r = requireAllowlistedRecord(value, [\"value\", \"evidence\"], path + \" must be an evidence-backed fact.\");\n return { value: positive(r.value, path + \".value\"), evidence: parseEvidenceList(r.evidence, path + \".evidence\") };\n}\n\n/**\n * Builds a readout regime and signal-chain band for each exposure index (see the module comment\n * for the equations). The result is checked with the same rules as parseSensorReadoutConversionProfile.\n * Each regime carries an `exposureIndexGain` record of how it was derived.\n * @param input - The sensor parameters and ISO settings; untrusted values are validated.\n * @returns The readout regimes and bands.\n */\nexport function createIsoGainReadoutRegimes(input: CreateIsoGainReadoutRegimesInput): IsoGainReadoutRegimes {\n const r = requireAllowlistedRecord(input, [\"regimeIdPrefix\", \"scientificStatus\", \"baseExposureIndex\", \"exposureIndices\",\n \"baseSaturationElectronEquivalent\", \"maximumAnalogGain\", \"adc\", \"conversionGainModes\", \"evidence\", \"limitations\"],\n \"Invalid ISO gain readout fields.\");\n const prefix = r.regimeIdPrefix === \"\" ? \"\" : requirePublicOpaqueId(r.regimeIdPrefix, \"regimeIdPrefix must be empty or a public opaque identifier.\");\n const base = positive(r.baseExposureIndex, \"baseExposureIndex\");\n const q0 = positiveFact(r.baseSaturationElectronEquivalent, \"baseSaturationElectronEquivalent\");\n const aMax = positiveFact(r.maximumAnalogGain, \"maximumAnalogGain\");\n if (aMax.value < 1) throw new InvalidConfigurationError(\"maximumAnalogGain must be at least 1.\");\n const evidence = parseEvidenceList(r.evidence, \"evidence\");\n const adc = requireAllowlistedRecord(r.adc, [\"bitDepth\", \"blackLevelCode\", \"digitalSaturationCode\"], \"Invalid ISO gain ADC fields.\");\n if (!Array.isArray(r.exposureIndices) || r.exposureIndices.length === 0 || r.exposureIndices.length > 256) {\n throw new InvalidConfigurationError(\"exposureIndices must contain 1 through 256 settings.\");\n }\n const indices = r.exposureIndices.map((value: unknown, i: number) => positive(value, \"exposureIndices[\" + i + \"]\"));\n if (indices[0]! < base || indices.some((value, i) => i > 0 && value <= indices[i - 1]!)) {\n throw new InvalidConfigurationError(\"exposureIndices must strictly increase from at least the base exposure index.\");\n }\n if (!Array.isArray(r.conversionGainModes) || r.conversionGainModes.length === 0 || r.conversionGainModes.length > 8) {\n throw new InvalidConfigurationError(\"conversionGainModes must contain 1 through 8 modes.\");\n }\n const modes = r.conversionGainModes.map((value: unknown, i: number) => {\n const m = requireAllowlistedRecord(value, [\"mode\", \"minimumExposureIndex\", \"readNoiseRmsElectrons\", \"maximumChargeElectrons\"],\n \"Invalid conversion-gain mode fields.\");\n if (m.mode !== \"single-conversion-gain\" && m.mode !== \"low-conversion-gain\" && m.mode !== \"high-conversion-gain\") {\n throw new InvalidConfigurationError(\"conversionGainModes[\" + i + \"].mode is invalid.\");\n }\n const noise = requireAllowlistedRecord(m.readNoiseRmsElectrons, [\"value\", \"evidence\"], \"Invalid read-noise fact.\");\n if (typeof noise.value !== \"number\" || !Number.isFinite(noise.value) || noise.value < 0) {\n throw new InvalidConfigurationError(\"conversionGainModes[\" + i + \"].readNoiseRmsElectrons.value must be finite and nonnegative.\");\n }\n return { mode: m.mode as IsoGainConversionGainMode[\"mode\"],\n minimumExposureIndex: positive(m.minimumExposureIndex, \"conversionGainModes[\" + i + \"].minimumExposureIndex\"),\n readNoiseRmsElectrons: { value: noise.value, evidence: parseEvidenceList(noise.evidence, \"readNoiseRmsElectrons.evidence\") },\n ...(m.maximumChargeElectrons === undefined ? {} :\n { maximumChargeElectrons: positiveFact(m.maximumChargeElectrons, \"conversionGainModes[\" + i + \"].maximumChargeElectrons\") }) };\n });\n if (modes[0]!.minimumExposureIndex !== base || modes.some((m, i) => i > 0 && m.minimumExposureIndex <= modes[i - 1]!.minimumExposureIndex)) {\n throw new InvalidConfigurationError(\"conversionGainModes must start at the base exposure index and strictly increase.\");\n }\n const gainEvidence = [...q0.evidence, ...aMax.evidence].filter((entry, i, all) =>\n all.findIndex((other) => JSON.stringify(other) === JSON.stringify(entry)) === i);\n const black = adc.blackLevelCode as number, saturation = adc.digitalSaturationCode as number;\n const span = saturation - black;\n const regimes = indices.map((exposureIndex) => {\n const ratio = exposureIndex / base;\n const analogGain = Math.min(ratio, aMax.value);\n const digitalGain = ratio / analogGain;\n const mode = modes.filter((m) => m.minimumExposureIndex <= exposureIndex).pop()!;\n const preAdc = q0.value / analogGain;\n if (mode.maximumChargeElectrons !== undefined && preAdc > mode.maximumChargeElectrons.value) {\n throw new InvalidConfigurationError(\"A \" + mode.mode + \" regime would need more charge than its declared storage limit.\");\n }\n const regimeEvidence = [...evidence];\n return {\n regimeId: prefix + \"iso-\" + exposureIndex,\n scientificStatus: r.scientificStatus as SensorSpectralResponseScientificStatus,\n systemConversionGainElectronsPerCode: { value: preAdc / span, evidence: gainEvidence },\n preAdcSaturationElectronEquivalent: { value: preAdc, evidence: gainEvidence },\n readNoiseComponents: [{ componentId: \"electronic\", rmsElectrons: mode.readNoiseRmsElectrons, evidence: mode.readNoiseRmsElectrons.evidence }],\n adc: { bitDepth: adc.bitDepth as number, blackLevelCode: black, digitalSaturationCode: saturation, transfer: \"uniform-round-half-up\" as const,\n ...(digitalGain === 1 ? {} : { digitalGain }) },\n exposureIndexGain: { exposureIndex, baseExposureIndex: base, analogGain, digitalGain, conversionGainMode: mode.mode, evidence: regimeEvidence },\n evidence: regimeEvidence,\n limitations: r.limitations as readonly string[]\n };\n });\n // Reuse the regime parser to check the ADC, limitations and consistency.\n const parsed = parseSensorReadoutConversionProfile({ schemaVersion: \"0.1.0\", profileId: prefix + \"validation\", colorSamplingProfileId: \"validation\",\n channelId: \"validation\", regimeSelectionOwnedBy: \"explicit-upstream-camera-state-not-inferred-from-iso\", regimes, evidence }).regimes;\n return { regimes: parsed, standardRegimeBands: indices.map((exposureIndex, i) => ({ minimumExposureIndex: exposureIndex,\n maximumExposureIndex: exposureIndex, readoutRegimeId: parsed[i]!.regimeId })) };\n}\n"]}
@@ -72,69 +72,47 @@ export interface GenericIsoSignalChainPresetCatalog {
72
72
  realCameraRankingClaimed: false;
73
73
  }
74
74
  /**
75
- * Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
76
- * missing required fields and incompatible scientific data fail at this boundary.
75
+ * Validates untrusted input and returns it as a normalized, typed value. Unknown enum values,
76
+ * missing required fields and inconsistent scientific data are rejected.
77
77
  *
78
- * The selected ISO/capture-mode state binds an explicit generic readout regime. Photons and photo/dark
79
- * shot-noise expectations remain upstream; regime gain, read noise and clipping are separately
80
- * declared. Generic tier labels do not calibrate or rank commercial equipment.
81
- * @param value - unknown. Treated as untrusted data; static typing alone is not validation.
82
- * @returns GenericIsoSignalChainProfile. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
78
+ * The profile binds each ISO and capture-mode state to an explicit readout regime, whose gain,
79
+ * read noise and clipping are declared separately.
80
+ * @param value - Untrusted data. TypeScript types alone are not validation.
81
+ * @returns The result. Success does not imply calibration.
83
82
  *
84
- * @see docs/API_REFERENCE.md for the root export and exact type graph.
83
+ * @see docs/API_REFERENCE.md for the package export and its full type definitions.
85
84
  */
86
85
  export declare function parseGenericIsoSignalChainProfile(value: unknown): GenericIsoSignalChainProfile;
87
86
  /**
88
- * Select the explicit readout regime bound to the resolved ISO and capture-mode state; do not derive
89
- * gain/noise from an ISO number.
87
+ * Picks the explicit readout regime bound to the resolved ISO and capture-mode state. Gain and noise
88
+ * are never derived from the ISO number.
89
+ * @param input - The input; see `ResolveGenericIsoSignalChainInput` for its fields, units and coordinates.
90
+ * @returns The result. Success does not imply calibration.
90
91
  *
91
- * The selected ISO/capture-mode state binds an explicit generic readout regime. Photons and photo/dark
92
- * shot-noise expectations remain upstream; regime gain, read noise and clipping are separately
93
- * declared. Generic tier labels do not calibrate or rank commercial equipment.
94
- * @param input - ResolveGenericIsoSignalChainInput. See the linked contract for coordinate, unit and profile binding semantics.
95
- * @returns ResolvedGenericIsoSignalChain. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
96
- *
97
- * @see docs/API_REFERENCE.md for the root export and exact type graph.
92
+ * @see docs/API_REFERENCE.md for the package export and its full type definitions.
98
93
  */
99
94
  export declare function resolveGenericIsoSignalChain(input: ResolveGenericIsoSignalChainInput): ResolvedGenericIsoSignalChain;
100
95
  /**
101
- * Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
102
- * missing required fields and incompatible scientific data fail at this boundary.
96
+ * Validates untrusted input and returns it as a normalized, typed value. Unknown enum values,
97
+ * missing required fields and inconsistent scientific data are rejected.
103
98
  *
104
- * The selected ISO/capture-mode state binds an explicit generic readout regime. Photons and photo/dark
105
- * shot-noise expectations remain upstream; regime gain, read noise and clipping are separately
106
- * declared. Generic tier labels do not calibrate or rank commercial equipment.
107
- * @param value - unknown. Treated as untrusted data; static typing alone is not validation.
108
- * @returns GenericIsoSignalChainPresetCatalog. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
99
+ * Generic tier labels in the catalogue do not calibrate or rank real cameras.
100
+ * @param value - Untrusted data. TypeScript types alone are not validation.
101
+ * @returns The result. Success does not imply calibration.
109
102
  *
110
- * @see docs/API_REFERENCE.md for the root export and exact type graph.
103
+ * @see docs/API_REFERENCE.md for the package export and its full type definitions.
111
104
  */
112
105
  export declare function parseGenericIsoSignalChainPresetCatalog(value: unknown): GenericIsoSignalChainPresetCatalog;
113
106
  /**
114
- * Select a generic catalog preset and return its explicit profile binding without claiming
115
- * manufacturer calibration.
107
+ * Picks a generic preset from the catalogue and returns the signal-chain profile it uses. It makes
108
+ * no claim of manufacturer calibration.
116
109
  *
117
- * The selected ISO/capture-mode state binds an explicit generic readout regime. Photons and photo/dark
118
- * shot-noise expectations remain upstream; regime gain, read noise and clipping are separately
119
- * declared. Generic tier labels do not calibrate or rank commercial equipment.
120
- * @param input - {
121
- catalog:
122
- GenericIsoSignalChainPresetCatalog;
123
- preset:
124
- GenericIsoSignalChainPreset;
125
- }. See the linked contract for coordinate, unit and profile binding semantics.
126
- * @returns {
127
- preset:
128
- GenericIsoSignalChainPreset;
129
- signalChainProfileId:
130
- string;
131
- performanceOrderingClaimed:
132
- false;
133
- realCameraRankingClaimed:
134
- false;
135
- }. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
110
+ * Generic tier labels do not calibrate or rank real cameras.
111
+ * @param input - The preset catalogue and the chosen preset.
112
+ * @returns The preset and its signal-chain profile ID. `performanceOrderingClaimed` and
113
+ * `realCameraRankingClaimed` are always false. Success does not imply calibration.
136
114
  *
137
- * @see docs/API_REFERENCE.md for the root export and exact type graph.
115
+ * @see docs/API_REFERENCE.md for the package export and its full type definitions.
138
116
  */
139
117
  export declare function resolveGenericIsoSignalChainPreset(input: {
140
118
  catalog: GenericIsoSignalChainPresetCatalog;
@@ -145,4 +123,3 @@ export declare function resolveGenericIsoSignalChainPreset(input: {
145
123
  performanceOrderingClaimed: false;
146
124
  realCameraRankingClaimed: false;
147
125
  };
148
- //# sourceMappingURL=iso-signal-chain.d.ts.map
@@ -1,15 +1,11 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
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. The selected
6
- * ISO/capture-mode state binds an explicit generic readout regime. Photons and photo/dark shot-noise
7
- * expectations remain upstream; regime gain, read noise and clipping are separately declared. Generic
8
- * tier labels do not calibrate or rank commercial equipment.
9
- * Select the explicit readout regime bound to the resolved ISO and capture-mode state; do not derive
10
- * gain/noise from an ISO number. The selected ISO/capture-mode state binds an explicit generic readout
11
- * regime. Photons and photo/dark shot-noise expectations remain upstream; regime gain, read noise and
12
- * clipping are separately declared. Generic tier labels do not calibrate or rank commercial equipment.
3
+ * ISO signal chain: picks the explicit readout regime (gain, read noise, clipping) that belongs to the
4
+ * selected ISO and capture mode.
5
+ *
6
+ * Gain and noise are never derived from the ISO number itself; each regime is declared. Photons and
7
+ * photo or dark shot noise are computed earlier in the chain. Generic tier labels do not calibrate or
8
+ * rank real cameras.
13
9
  * @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
14
10
  * limits.
15
11
  */
@@ -18,14 +14,17 @@ import { parseEvidenceList } from "../core/evidence-provenance.js";
18
14
  import { InvalidScientificInputError } from "../core/validation.js";
19
15
  import { parseIsoCapabilityProfile, resolveIsoCapability } from "../equipment/iso-capabilities.js";
20
16
  import { parseSensorReadoutConversionProfile, resolveSensorReadoutRegime } from "./raw-readout.js";
17
+ import { requireInputKeys, rejectUnknownFields } from "../core/record-validation.js";
21
18
  export const GENERIC_ISO_SIGNAL_CHAIN_PROFILE_SCHEMA_VERSION = "0.1.0";
22
19
  export const GENERIC_ISO_SIGNAL_CHAIN_PRESET_CATALOG_SCHEMA_VERSION = "0.1.0";
23
- function requireRecord(value, path) {
20
+ function requireRecord(value, path, allowedKeys) {
24
21
  if (typeof value !== "object" ||
25
22
  value === null ||
26
23
  Array.isArray(value)) {
27
24
  throw new InvalidConfigurationError(path + " must be an object.");
28
25
  }
26
+ if (allowedKeys !== null)
27
+ rejectUnknownFields(value, allowedKeys, path);
29
28
  return value;
30
29
  }
31
30
  function requireNonEmptyString(value, path) {
@@ -61,7 +60,7 @@ function parseLimitations(value, path) {
61
60
  return parsed;
62
61
  }
63
62
  function parseStandardBand(value, path) {
64
- const record = requireRecord(value, path);
63
+ const record = requireRecord(value, path, ["minimumExposureIndex", "maximumExposureIndex", "readoutRegimeId"]);
65
64
  const minimumExposureIndex = requirePositiveFinite(record.minimumExposureIndex, path +
66
65
  ".minimumExposureIndex");
67
66
  const maximumExposureIndex = requirePositiveFinite(record.maximumExposureIndex, path +
@@ -79,7 +78,7 @@ function parseStandardBand(value, path) {
79
78
  };
80
79
  }
81
80
  function parseCaptureModeBinding(value, path) {
82
- const record = requireRecord(value, path);
81
+ const record = requireRecord(value, path, ["standardRegimeBands", "expandedRegimeBindings", "captureModeId", "evidence"]);
83
82
  if (!Array.isArray(record.standardRegimeBands) ||
84
83
  record.standardRegimeBands
85
84
  .length === 0) {
@@ -109,7 +108,7 @@ function parseCaptureModeBinding(value, path) {
109
108
  ".expandedRegimeBindings[" +
110
109
  index +
111
110
  "]";
112
- const binding = requireRecord(entry, entryPath);
111
+ const binding = requireRecord(entry, entryPath, ["expandedSettingId", "readoutRegimeId"]);
113
112
  return {
114
113
  expandedSettingId: requireNonEmptyString(binding.expandedSettingId, entryPath +
115
114
  ".expandedSettingId"),
@@ -131,19 +130,18 @@ function parseCaptureModeBinding(value, path) {
131
130
  };
132
131
  }
133
132
  /**
134
- * Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
135
- * missing required fields and incompatible scientific data fail at this boundary.
133
+ * Validates untrusted input and returns it as a normalized, typed value. Unknown enum values,
134
+ * missing required fields and inconsistent scientific data are rejected.
136
135
  *
137
- * The selected ISO/capture-mode state binds an explicit generic readout regime. Photons and photo/dark
138
- * shot-noise expectations remain upstream; regime gain, read noise and clipping are separately
139
- * declared. Generic tier labels do not calibrate or rank commercial equipment.
140
- * @param value - unknown. Treated as untrusted data; static typing alone is not validation.
141
- * @returns GenericIsoSignalChainProfile. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
136
+ * The profile binds each ISO and capture-mode state to an explicit readout regime, whose gain,
137
+ * read noise and clipping are declared separately.
138
+ * @param value - Untrusted data. TypeScript types alone are not validation.
139
+ * @returns The result. Success does not imply calibration.
142
140
  *
143
- * @see docs/API_REFERENCE.md for the root export and exact type graph.
141
+ * @see docs/API_REFERENCE.md for the package export and its full type definitions.
144
142
  */
145
143
  export function parseGenericIsoSignalChainProfile(value) {
146
- const record = requireRecord(value, "genericIsoSignalChainProfile");
144
+ const record = requireRecord(value, "genericIsoSignalChainProfile", ["schemaVersion", "scientificStatus", "behaviorMeaning", "photonShotNoiseOwnedUpstream", "processedImageBehaviorIncluded", "fixedPatternNoiseModeled", "lowSignalColorDegradationModeled", "captureModeBindings", "profileId", "profileVersion", "isoCapabilityProfileId", "readoutProfileId", "evidence", "limitations"]);
147
145
  if (record.schemaVersion !==
148
146
  GENERIC_ISO_SIGNAL_CHAIN_PROFILE_SCHEMA_VERSION) {
149
147
  throw new InvalidConfigurationError('genericIsoSignalChainProfile.schemaVersion must be "' +
@@ -236,18 +234,15 @@ function regimeIdForIso(binding, iso) {
236
234
  };
237
235
  }
238
236
  /**
239
- * Select the explicit readout regime bound to the resolved ISO and capture-mode state; do not derive
240
- * gain/noise from an ISO number.
241
- *
242
- * The selected ISO/capture-mode state binds an explicit generic readout regime. Photons and photo/dark
243
- * shot-noise expectations remain upstream; regime gain, read noise and clipping are separately
244
- * declared. Generic tier labels do not calibrate or rank commercial equipment.
245
- * @param input - ResolveGenericIsoSignalChainInput. See the linked contract for coordinate, unit and profile binding semantics.
246
- * @returns ResolvedGenericIsoSignalChain. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
237
+ * Picks the explicit readout regime bound to the resolved ISO and capture-mode state. Gain and noise
238
+ * are never derived from the ISO number.
239
+ * @param input - The input; see `ResolveGenericIsoSignalChainInput` for its fields, units and coordinates.
240
+ * @returns The result. Success does not imply calibration.
247
241
  *
248
- * @see docs/API_REFERENCE.md for the root export and exact type graph.
242
+ * @see docs/API_REFERENCE.md for the package export and its full type definitions.
249
243
  */
250
244
  export function resolveGenericIsoSignalChain(input) {
245
+ requireInputKeys(input, "resolveGenericIsoSignalChain", ["profile", "isoCapability", "requestedIsoSetting", "captureModeId", "readoutProfile"]);
251
246
  const profile = parseGenericIsoSignalChainProfile(input.profile);
252
247
  const isoCapability = parseIsoCapabilityProfile(input.isoCapability);
253
248
  const readoutProfile = parseSensorReadoutConversionProfile(input.readoutProfile);
@@ -263,7 +258,7 @@ export function resolveGenericIsoSignalChain(input) {
263
258
  "string" ||
264
259
  input.captureModeId.trim()
265
260
  .length === 0) {
266
- throw new InvalidScientificInputError("captureModeId must be a non-empty string.");
261
+ throw new InvalidConfigurationError("captureModeId must be a non-empty string.");
267
262
  }
268
263
  const binding = profile.captureModeBindings.find((entry) => entry.captureModeId ===
269
264
  input.captureModeId);
@@ -281,6 +276,13 @@ export function resolveGenericIsoSignalChain(input) {
281
276
  profile: readoutProfile,
282
277
  regimeId: regime.regimeId
283
278
  });
279
+ const gain = readout.regime
280
+ .exposureIndexGain;
281
+ if (gain !== undefined &&
282
+ gain.exposureIndex !==
283
+ iso.reportedExposureIndex) {
284
+ throw new InvalidScientificInputError("The bound readout regime declares an ISO-gain derivation for a different exposure index.");
285
+ }
284
286
  return {
285
287
  profileId: profile.profileId,
286
288
  profileVersion: profile.profileVersion,
@@ -305,19 +307,17 @@ const PRESETS = new Set([
305
307
  "best"
306
308
  ]);
307
309
  /**
308
- * Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
309
- * missing required fields and incompatible scientific data fail at this boundary.
310
+ * Validates untrusted input and returns it as a normalized, typed value. Unknown enum values,
311
+ * missing required fields and inconsistent scientific data are rejected.
310
312
  *
311
- * The selected ISO/capture-mode state binds an explicit generic readout regime. Photons and photo/dark
312
- * shot-noise expectations remain upstream; regime gain, read noise and clipping are separately
313
- * declared. Generic tier labels do not calibrate or rank commercial equipment.
314
- * @param value - unknown. Treated as untrusted data; static typing alone is not validation.
315
- * @returns GenericIsoSignalChainPresetCatalog. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
313
+ * Generic tier labels in the catalogue do not calibrate or rank real cameras.
314
+ * @param value - Untrusted data. TypeScript types alone are not validation.
315
+ * @returns The result. Success does not imply calibration.
316
316
  *
317
- * @see docs/API_REFERENCE.md for the root export and exact type graph.
317
+ * @see docs/API_REFERENCE.md for the package export and its full type definitions.
318
318
  */
319
319
  export function parseGenericIsoSignalChainPresetCatalog(value) {
320
- const record = requireRecord(value, "genericIsoSignalChainPresetCatalog");
320
+ const record = requireRecord(value, "genericIsoSignalChainPresetCatalog", ["schemaVersion", "performanceOrderingClaimed", "realCameraRankingClaimed", "entries", "catalogId", "catalogVersion"]);
321
321
  if (record.schemaVersion !==
322
322
  GENERIC_ISO_SIGNAL_CHAIN_PRESET_CATALOG_SCHEMA_VERSION) {
323
323
  throw new InvalidConfigurationError('genericIsoSignalChainPresetCatalog.schemaVersion must be "' +
@@ -338,7 +338,7 @@ export function parseGenericIsoSignalChainPresetCatalog(value) {
338
338
  const path = "genericIsoSignalChainPresetCatalog.entries[" +
339
339
  index +
340
340
  "]";
341
- const parsed = requireRecord(entry, path);
341
+ const parsed = requireRecord(entry, path, ["preset", "signalChainProfileId", "evidence"]);
342
342
  if (typeof parsed.preset !==
343
343
  "string" ||
344
344
  !PRESETS.has(parsed.preset)) {
@@ -368,35 +368,21 @@ export function parseGenericIsoSignalChainPresetCatalog(value) {
368
368
  };
369
369
  }
370
370
  /**
371
- * Select a generic catalog preset and return its explicit profile binding without claiming
372
- * manufacturer calibration.
371
+ * Picks a generic preset from the catalogue and returns the signal-chain profile it uses. It makes
372
+ * no claim of manufacturer calibration.
373
373
  *
374
- * The selected ISO/capture-mode state binds an explicit generic readout regime. Photons and photo/dark
375
- * shot-noise expectations remain upstream; regime gain, read noise and clipping are separately
376
- * declared. Generic tier labels do not calibrate or rank commercial equipment.
377
- * @param input - {
378
- catalog:
379
- GenericIsoSignalChainPresetCatalog;
380
- preset:
381
- GenericIsoSignalChainPreset;
382
- }. See the linked contract for coordinate, unit and profile binding semantics.
383
- * @returns {
384
- preset:
385
- GenericIsoSignalChainPreset;
386
- signalChainProfileId:
387
- string;
388
- performanceOrderingClaimed:
389
- false;
390
- realCameraRankingClaimed:
391
- false;
392
- }. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
374
+ * Generic tier labels do not calibrate or rank real cameras.
375
+ * @param input - The preset catalogue and the chosen preset.
376
+ * @returns The preset and its signal-chain profile ID. `performanceOrderingClaimed` and
377
+ * `realCameraRankingClaimed` are always false. Success does not imply calibration.
393
378
  *
394
- * @see docs/API_REFERENCE.md for the root export and exact type graph.
379
+ * @see docs/API_REFERENCE.md for the package export and its full type definitions.
395
380
  */
396
381
  export function resolveGenericIsoSignalChainPreset(input) {
382
+ requireInputKeys(input, "resolveGenericIsoSignalChainPreset", ["catalog", "preset"]);
397
383
  const catalog = parseGenericIsoSignalChainPresetCatalog(input.catalog);
398
384
  if (!PRESETS.has(input.preset)) {
399
- throw new InvalidScientificInputError("preset must be good, better, or best.");
385
+ throw new InvalidConfigurationError("preset must be good, better, or best.");
400
386
  }
401
387
  const entry = catalog.entries.find((candidate) => candidate.preset ===
402
388
  input.preset);