@photivra/engine 1.4.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 (1074) hide show
  1. package/CHANGELOG.md +401 -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 +118 -5
  56. package/dist/capture/native-raw-development.js +224 -59
  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 +67 -10
  62. package/dist/capture/native-raw.js +90 -24
  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 -4
  639. package/docs/api/capture-native-raw-dng.md +84 -0
  640. package/docs/api/capture-native-raw.md +23 -8
  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/DEVELOPERS.md +0 -68
  975. package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
  976. package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
  977. package/docs/EXPORT_ACCEPTANCE.md +0 -133
  978. package/docs/GENERIC_TIER_PRESETS.md +0 -269
  979. package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
  980. package/docs/IMAGE_FORMATION.md +0 -247
  981. package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
  982. package/docs/MOTION_AND_SIGNAL.md +0 -250
  983. package/docs/NATIVE_CAPTURE_SDR.md +0 -70
  984. package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
  985. package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
  986. package/docs/NATIVE_RAW_AND_PRINT.md +0 -47
  987. package/docs/NUMERICAL_CORRECTNESS.md +0 -191
  988. package/docs/PERFORMANCE_BASELINE.md +0 -56
  989. package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
  990. package/docs/PHYSICS_FOUNDATION.md +0 -426
  991. package/docs/POC_API.md +0 -278
  992. package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
  993. package/docs/POC_PROJECTION_REUSE.md +0 -124
  994. package/docs/PRINT_195_196_REVIEW.md +0 -93
  995. package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
  996. package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
  997. package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
  998. package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
  999. package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
  1000. package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
  1001. package/docs/PRINT_PLANNING.md +0 -75
  1002. package/docs/PRINT_REGION_STATISTICS.md +0 -38
  1003. package/docs/PROCESSED_OUTPUT.md +0 -157
  1004. package/docs/PRODUCTION_COMPOSITION.md +0 -373
  1005. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
  1006. package/docs/PROVENANCE.md +0 -115
  1007. package/docs/PSF_FOUNDATION.md +0 -165
  1008. package/docs/RAW_FRAME_ENVELOPE.md +0 -56
  1009. package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
  1010. package/docs/RELEASE_1_0.md +0 -66
  1011. package/docs/RELEASE_1_0_1.md +0 -61
  1012. package/docs/RELEASE_1_1_0.md +0 -25
  1013. package/docs/RELEASE_1_2_0.md +0 -51
  1014. package/docs/RELEASE_1_3_0.md +0 -15
  1015. package/docs/RELEASE_1_4_0.md +0 -23
  1016. package/docs/RELEASE_AUDIT.md +0 -39
  1017. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
  1018. package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
  1019. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
  1020. package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
  1021. package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
  1022. package/docs/SDR_RENDERING.md +0 -33
  1023. package/docs/SENSOR_APERTURE_RAYS.md +0 -23
  1024. package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
  1025. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
  1026. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
  1027. package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
  1028. package/docs/SENSOR_RAW_FRAME.md +0 -20
  1029. package/docs/SENSOR_RAW_PRODUCER.md +0 -77
  1030. package/docs/SIGNAL_CONFORMANCE.md +0 -23
  1031. package/docs/SIMULATED_CAPTURE.md +0 -65
  1032. package/docs/STABILIZATION.md +0 -234
  1033. package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
  1034. package/docs/TIER_ACCEPTANCE.md +0 -129
  1035. package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
  1036. package/docs/V1_COMPOSITION_MAP.md +0 -123
  1037. package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
  1038. package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
  1039. package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
  1040. package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
  1041. package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
  1042. package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
  1043. package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
  1044. package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
  1045. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
  1046. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
  1047. package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
  1048. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
  1049. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
  1050. package/docs/licenses/castleCSF-MIT.txt +0 -21
  1051. package/docs/validation/documentation-fragments.json +0 -212
  1052. package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
  1053. package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
  1054. package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
  1055. package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
  1056. package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
  1057. package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
  1058. package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
  1059. package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
  1060. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
  1061. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
  1062. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
  1063. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
  1064. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
  1065. package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
  1066. package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
  1067. package/docs/validation/print-196-candidate-capabilities.json +0 -28
  1068. package/docs/validation/print-196-candidate-evidence.json +0 -356
  1069. package/docs/validation/print-196-engine-acceptance.json +0 -81
  1070. package/docs/validation/print-detail-capabilities.json +0 -103
  1071. package/docs/validation/print-detail-jpeg-evidence.json +0 -116
  1072. package/docs/validation/print-detail-sdr-evidence.json +0 -81
  1073. package/docs/validation/release-audit-inventory.json +0 -1306
  1074. package/docs/validation/tier-acceptance-report-v1.json +0 -2538
@@ -1,31 +1,32 @@
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. Complex pupil
6
- * evaluation sums declared amplitude and phase on a bounded regular pupil grid. PSF shape is
7
- * normalized separately from pupil throughput; coherent phase, pupil energy and spectral/field
8
- * applicability cannot be replaced by a scalar blur radius. Numeric profiles require owned or
9
- * reusable-data provenance.
10
- * Evaluate a declared complex pupil with explicit amplitude/phase and sampling support; normalize PSF
11
- * shape and retain pupil throughput as a separate quantity. Complex pupil evaluation sums declared
12
- * amplitude and phase on a bounded regular pupil grid. PSF shape is normalized separately from pupil
13
- * throughput; coherent phase, pupil energy and spectral/field applicability cannot be replaced by a
14
- * scalar blur radius. Numeric profiles require owned or reusable-data provenance.
15
- * @see docs/PSF_FOUNDATION.md for equations, coordinate/unit conventions, blockers and support limits.
3
+ * PSF (point-spread function) from a declared complex pupil: amplitude and phase sampled on a grid.
4
+ *
5
+ * The profile parser validates untrusted input and returns the normalized typed contract. Unknown
6
+ * enum values, missing required fields and incompatible scientific data are rejected.
7
+ *
8
+ * The complex pupil is evaluated by summing the declared amplitude and phase over a bounded, regular
9
+ * pupil grid. The PSF shape is normalized separately from the pupil throughput. A single blur radius
10
+ * cannot stand in for coherent phase, pupil energy, or the wavelength and field range where the
11
+ * profile applies. Numeric profiles need provenance showing the data is owned or reusable.
12
+ * @see docs/PSF_FOUNDATION.md for the equations, units, coordinate conventions, known blockers and
13
+ * support limits.
16
14
  */
17
15
  import { approximationResult } from "../core/calculation-result.js";
18
16
  import { InvalidConfigurationError } from "../core/configuration-error.js";
19
17
  import { parseEvidenceList } from "../core/evidence-provenance.js";
20
18
  import { InvalidScientificInputError } from "../core/validation.js";
21
19
  import { parseFocusPlane } from "./focus-state.js";
20
+ import { requireInputKeys, rejectUnknownFields, rejectUnknownVariantFields, UNCERTAINTY_VARIANT_FIELDS } from "../core/record-validation.js";
22
21
  export const LENS_COMPLEX_PUPIL_PROFILE_SCHEMA_VERSION = "0.1.0";
23
- function requireRecord(value, path) {
22
+ function requireRecord(value, path, allowedKeys) {
24
23
  if (typeof value !== "object" ||
25
24
  value === null ||
26
25
  Array.isArray(value)) {
27
26
  throw new InvalidConfigurationError(path + " must be an object.");
28
27
  }
28
+ if (allowedKeys !== null)
29
+ rejectUnknownFields(value, allowedKeys, path);
29
30
  return value;
30
31
  }
31
32
  function requireNonEmptyString(value, path) {
@@ -86,7 +87,8 @@ function parseStatus(value, path) {
86
87
  return value;
87
88
  }
88
89
  function parseUncertainty(value, path) {
89
- const record = requireRecord(value, path);
90
+ const record = requireRecord(value, path, null);
91
+ rejectUnknownVariantFields(record, "kind", UNCERTAINTY_VARIANT_FIELDS, path);
90
92
  if (record.kind === "relative") {
91
93
  const fraction = requireFinite(record.fraction, path + ".fraction");
92
94
  if (fraction < 0) {
@@ -125,7 +127,7 @@ function parseLimitations(value, path) {
125
127
  return parsed;
126
128
  }
127
129
  function parseGrid(value) {
128
- const record = requireRecord(value, "lensComplexPupil.grid");
130
+ const record = requireRecord(value, "lensComplexPupil.grid", ["widthSamples", "heightSamples", "centerSampleX", "centerSampleY", "relativeAmplitude", "opticalPathDifferenceMicrometers", "pupilSamplePitchMmX", "pupilSamplePitchMmY"]);
129
131
  const widthSamples = requirePositiveSafeInteger(record.widthSamples, "lensComplexPupil.grid.widthSamples");
130
132
  const heightSamples = requirePositiveSafeInteger(record.heightSamples, "lensComplexPupil.grid.heightSamples");
131
133
  const total = widthSamples *
@@ -179,20 +181,20 @@ function parseGrid(value) {
179
181
  };
180
182
  }
181
183
  /**
182
- * Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
183
- * missing required fields and incompatible scientific data fail at this boundary.
184
+ * Validates an untrusted declaration and returns the normalized typed contract. Unknown enum values,
185
+ * missing required fields and incompatible scientific data are rejected here.
184
186
  *
185
- * Complex pupil evaluation sums declared amplitude and phase on a bounded regular pupil grid. PSF
186
- * shape is normalized separately from pupil throughput; coherent phase, pupil energy and
187
- * spectral/field applicability cannot be replaced by a scalar blur radius. Numeric profiles require
188
- * owned or reusable-data provenance.
189
- * @param value - unknown. Treated as untrusted data; static typing alone is not validation.
190
- * @returns LensComplexPupilProfile. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
187
+ * The complex pupil is evaluated by summing the declared amplitude and phase over a bounded, regular
188
+ * pupil grid. The PSF shape is normalized separately from the pupil throughput. A single blur radius
189
+ * cannot stand in for coherent phase, pupil energy, or the wavelength and field range where the
190
+ * profile applies. Numeric profiles need provenance showing the data is owned or reusable.
191
+ * @param value - unknown. Untrusted input; TypeScript types alone are not validation.
192
+ * @returns LensComplexPupilProfile. The result states its shape and scientific status; a successful call does not imply calibration.
191
193
  *
192
194
  * @see docs/API_REFERENCE.md for the root export and exact type graph.
193
195
  */
194
196
  export function parseLensComplexPupilProfile(value) {
195
- const record = requireRecord(value, "lensComplexPupil");
197
+ const record = requireRecord(value, "lensComplexPupil", ["schemaVersion", "opticalDomain", "representation", "pupilCoordinateSystem", "imageFieldAxes", "amplitudeMeaning", "wavefrontMeaning", "throughputOwnership", "kernelEnergyNormalization", "propagationModel", "sensorOpticalStackIncluded", "sensorSamplingIncluded", "reconstructionIncluded", "strayLightIncluded", "scientificStatus", "uncertainty", "context", "responseIncludes", "profileId", "profileVersion", "relativePupilThroughputFactor", "grid", "evidence", "limitations"]);
196
198
  if (record.schemaVersion !==
197
199
  LENS_COMPLEX_PUPIL_PROFILE_SCHEMA_VERSION) {
198
200
  throw new InvalidConfigurationError('lensComplexPupil.schemaVersion must be "' +
@@ -236,9 +238,9 @@ export function parseLensComplexPupilProfile(value) {
236
238
  "not-quantified") {
237
239
  throw new InvalidConfigurationError("Calibrated complex-pupil profiles must declare quantified relative uncertainty.");
238
240
  }
239
- const context = requireRecord(record.context, "lensComplexPupil.context");
240
- const field = requireRecord(context.fieldPointMm, "lensComplexPupil.context.fieldPointMm");
241
- const response = requireRecord(record.responseIncludes, "lensComplexPupil.responseIncludes");
241
+ const context = requireRecord(record.context, "lensComplexPupil.context", ["fieldPointMm", "focalLengthMm", "focus", "apertureFNumber", "wavelengthNm", "signedDefocusImagePlaneMicrometers"]);
242
+ const field = requireRecord(context.fieldPointMm, "lensComplexPupil.context.fieldPointMm", ["x", "y"]);
243
+ const response = requireRecord(record.responseIncludes, "lensComplexPupil.responseIncludes", ["diffraction", "aberration", "defocus", "pupilClippingShape"]);
242
244
  if (response.diffraction !==
243
245
  true ||
244
246
  typeof response.aberration !==
@@ -306,59 +308,151 @@ function pupilComplexValue(amplitude, opdMicrometers, wavelengthMicrometers) {
306
308
  Math.sin(phase)
307
309
  };
308
310
  }
309
- function calculateDiscreteFraunhoferKernel(profile, propagationDistanceMm) {
311
+ function supportSpan(grid, axis) {
312
+ let minimum = Number.POSITIVE_INFINITY;
313
+ let maximum = Number.NEGATIVE_INFINITY;
314
+ grid.relativeAmplitude.forEach((amplitude, index) => {
315
+ if (amplitude > 0) {
316
+ const coordinate = axis === "x"
317
+ ? index % grid.widthSamples
318
+ : Math.floor(index / grid.widthSamples);
319
+ minimum = Math.min(minimum, coordinate);
320
+ maximum = Math.max(maximum, coordinate);
321
+ }
322
+ });
323
+ return maximum - minimum + 1;
324
+ }
325
+ /**
326
+ * Sampling guard for the discrete Fraunhofer reference (Ban et al.,
327
+ * arXiv:2511.06936, eqs. 6-9, free: N*dp = lambda*f/dc, Q = lambda*F/dc and
328
+ * Q >= 2. Also see: Goodman, Introduction to Fourier Optics, sampling of
329
+ * DFT/FFT Fraunhofer propagation).
330
+ *
331
+ * A DFT (discrete Fourier transform) of size M over pupil pitch dp gives an
332
+ * image-plane pitch of lambda*z/(M*dp).
333
+ *
334
+ * The intensity PSF is the transform of the pupil autocorrelation. That
335
+ * autocorrelation is twice as wide as the pupil. So Nyquist sampling of the
336
+ * intensity needs Q = lambda*(z/D)/pitch = M*dp/D >= 2.
337
+ *
338
+ * For a pupil spanning S samples, the discrete autocorrelation has 2S-1 lags.
339
+ * So M >= 2S-1 is the exact condition for no circular wrap-around, and it
340
+ * implies Q = M/(S-1) > 2. The declared grid is zero padded to that size.
341
+ *
342
+ * The non-zero support must also fit inside the declared f/N cone. Its
343
+ * diameter D may not exceed z/N for the resolved propagation distance z; that
344
+ * is, the image-side cone D/z may not be wider than 1/N. With the nominal
345
+ * focal-plane reference (z = f) this is the entrance-aperture diameter f/N. An
346
+ * exit pupil declared at its own distance z uses that distance
347
+ * (docs/PSF_FOUNDATION.md).
348
+ */
349
+ function planPupilSampling(profile, propagationDistanceMm) {
350
+ const grid = profile.grid;
351
+ const supportX = supportSpan(grid, "x");
352
+ const supportY = supportSpan(grid, "y");
353
+ const diameterX = (supportX - 1) * grid.pupilSamplePitchMmX;
354
+ const diameterY = (supportY - 1) * grid.pupilSamplePitchMmY;
355
+ const declaredDiameter = propagationDistanceMm / profile.context.apertureFNumber;
356
+ // Relative allowance for floating-point rounding only.
357
+ const limit = declaredDiameter * (1 + 1e-9);
358
+ if (diameterX > limit || diameterY > limit) {
359
+ throw new InvalidScientificInputError("Complex-pupil amplitude support spans " +
360
+ diameterX.toPrecision(6) +
361
+ " x " +
362
+ diameterY.toPrecision(6) +
363
+ " mm between outermost non-zero samples, wider than the declared f/N cone diameter " +
364
+ declaredDiameter.toPrecision(6) +
365
+ " mm (propagationDistanceMm / apertureFNumber).");
366
+ }
367
+ const transformWidth = Math.max(grid.widthSamples, 2 * supportX - 1);
368
+ const transformHeight = Math.max(grid.heightSamples, 2 * supportY - 1);
369
+ return {
370
+ sampling: {
371
+ criterion: "discrete-intensity-alias-free-goodman-q-above-2",
372
+ pupilSupportSamplesX: supportX,
373
+ pupilSupportSamplesY: supportY,
374
+ pupilSupportDiameterMmX: diameterX,
375
+ pupilSupportDiameterMmY: diameterY,
376
+ declaredPupilDiameterMm: declaredDiameter,
377
+ pupilGridWidthSamples: grid.widthSamples,
378
+ pupilGridHeightSamples: grid.heightSamples,
379
+ transformWidthSamples: transformWidth,
380
+ transformHeightSamples: transformHeight,
381
+ zeroPaddingApplied: transformWidth !== grid.widthSamples ||
382
+ transformHeight !== grid.heightSamples,
383
+ samplingFactorQX: supportX > 1 ? transformWidth / (supportX - 1) : null,
384
+ samplingFactorQY: supportY > 1 ? transformHeight / (supportY - 1) : null
385
+ },
386
+ // Symmetric padding keeps zero frequency at the declared centre, shifted
387
+ // by the leading padding.
388
+ outputCenterX: grid.centerSampleX +
389
+ Math.floor((transformWidth - grid.widthSamples) / 2),
390
+ outputCenterY: grid.centerSampleY +
391
+ Math.floor((transformHeight - grid.heightSamples) / 2)
392
+ };
393
+ }
394
+ function twiddleTable(size) {
395
+ const cos = [];
396
+ const sin = [];
397
+ for (let index = 0; index < size; index += 1) {
398
+ const angle = (-2 * Math.PI * index) / size;
399
+ cos.push(Math.cos(angle));
400
+ sin.push(Math.sin(angle));
401
+ }
402
+ return { cos, sin };
403
+ }
404
+ function positiveModulo(value, size) {
405
+ const remainder = value % size;
406
+ return remainder < 0 ? remainder + size : remainder;
407
+ }
408
+ function calculateDiscreteFraunhoferKernel(profile, propagationDistanceMm, plan) {
310
409
  const grid = profile.grid;
311
410
  const width = grid.widthSamples;
312
411
  const height = grid.heightSamples;
313
- const wavelengthMicrometers = profile.context
314
- .wavelengthNm /
315
- 1000;
316
- const wavelengthMm = profile.context
317
- .wavelengthNm /
318
- 1_000_000;
319
- const pupil = grid.relativeAmplitude.map((amplitude, index) => pupilComplexValue(amplitude, grid
320
- .opticalPathDifferenceMicrometers[index], wavelengthMicrometers));
321
- const intensity = new Array(width * height).fill(0);
322
- for (let outY = 0; outY < height; outY += 1) {
323
- const ky = outY -
324
- grid.centerSampleY;
325
- for (let outX = 0; outX < width; outX += 1) {
326
- const kx = outX -
327
- grid.centerSampleX;
412
+ const outWidth = plan.sampling.transformWidthSamples;
413
+ const outHeight = plan.sampling.transformHeightSamples;
414
+ const wavelengthMicrometers = profile.context.wavelengthNm / 1000;
415
+ const wavelengthMm = profile.context.wavelengthNm / 1_000_000;
416
+ const pupil = grid.relativeAmplitude.map((amplitude, index) => pupilComplexValue(amplitude, grid.opticalPathDifferenceMicrometers[index], wavelengthMicrometers));
417
+ // Separable zero-padded DFT: pupil rows to image kx first, then columns.
418
+ // Padding samples are zero, so only declared pupil samples are summed.
419
+ const twiddleX = twiddleTable(outWidth);
420
+ const twiddleY = twiddleTable(outHeight);
421
+ const rowRe = new Float64Array(height * outWidth);
422
+ const rowIm = new Float64Array(height * outWidth);
423
+ for (let y = 0; y < height; y += 1) {
424
+ for (let outX = 0; outX < outWidth; outX += 1) {
425
+ const kx = outX - plan.outputCenterX;
426
+ let re = 0;
427
+ let im = 0;
428
+ for (let x = 0; x < width; x += 1) {
429
+ const source = pupil[y * width + x];
430
+ const t = positiveModulo(kx * (x - grid.centerSampleX), outWidth);
431
+ const cos = twiddleX.cos[t];
432
+ const sin = twiddleX.sin[t];
433
+ re += source.re * cos - source.im * sin;
434
+ im += source.re * sin + source.im * cos;
435
+ }
436
+ rowRe[y * outWidth + outX] = re;
437
+ rowIm[y * outWidth + outX] = im;
438
+ }
439
+ }
440
+ const intensity = new Array(outWidth * outHeight).fill(0);
441
+ for (let outY = 0; outY < outHeight; outY += 1) {
442
+ const ky = outY - plan.outputCenterY;
443
+ for (let outX = 0; outX < outWidth; outX += 1) {
328
444
  let re = 0;
329
445
  let im = 0;
330
446
  for (let y = 0; y < height; y += 1) {
331
- const py = y -
332
- grid.centerSampleY;
333
- for (let x = 0; x < width; x += 1) {
334
- const px = x -
335
- grid.centerSampleX;
336
- const source = pupil[y * width +
337
- x];
338
- const angle = -2 *
339
- Math.PI *
340
- (kx * px /
341
- width +
342
- ky * py /
343
- height);
344
- const cos = Math.cos(angle);
345
- const sin = Math.sin(angle);
346
- re +=
347
- source.re *
348
- cos -
349
- source.im *
350
- sin;
351
- im +=
352
- source.re *
353
- sin +
354
- source.im *
355
- cos;
356
- }
447
+ const sourceRe = rowRe[y * outWidth + outX];
448
+ const sourceIm = rowIm[y * outWidth + outX];
449
+ const t = positiveModulo(ky * (y - grid.centerSampleY), outHeight);
450
+ const cos = twiddleY.cos[t];
451
+ const sin = twiddleY.sin[t];
452
+ re += sourceRe * cos - sourceIm * sin;
453
+ im += sourceRe * sin + sourceIm * cos;
357
454
  }
358
- intensity[outY * width +
359
- outX] =
360
- re * re +
361
- im * im;
455
+ intensity[outY * outWidth + outX] = re * re + im * im;
362
456
  }
363
457
  }
364
458
  const sum = intensity.reduce((acc, value) => acc + value, 0);
@@ -367,16 +461,10 @@ function calculateDiscreteFraunhoferKernel(profile, propagationDistanceMm) {
367
461
  throw new InvalidScientificInputError("Complex-pupil propagation must produce finite positive PSF energy.");
368
462
  }
369
463
  const normalized = intensity.map((value) => value / sum);
370
- const samplePitchMmX = wavelengthMm *
371
- propagationDistanceMm /
372
- (width *
373
- grid
374
- .pupilSamplePitchMmX);
375
- const samplePitchMmY = wavelengthMm *
376
- propagationDistanceMm /
377
- (height *
378
- grid
379
- .pupilSamplePitchMmY);
464
+ const samplePitchMmX = wavelengthMm * propagationDistanceMm /
465
+ (outWidth * grid.pupilSamplePitchMmX);
466
+ const samplePitchMmY = wavelengthMm * propagationDistanceMm /
467
+ (outHeight * grid.pupilSamplePitchMmY);
380
468
  if (!Number.isFinite(samplePitchMmX) ||
381
469
  !Number.isFinite(samplePitchMmY) ||
382
470
  samplePitchMmX <= 0 ||
@@ -384,35 +472,37 @@ function calculateDiscreteFraunhoferKernel(profile, propagationDistanceMm) {
384
472
  throw new InvalidScientificInputError("Complex-pupil PSF sample pitch must remain finite and positive.");
385
473
  }
386
474
  return {
387
- widthSamples: width,
388
- heightSamples: height,
475
+ widthSamples: outWidth,
476
+ heightSamples: outHeight,
389
477
  samplePitchMicrometersX: samplePitchMmX *
390
478
  1000,
391
479
  samplePitchMicrometersY: samplePitchMmY *
392
480
  1000,
393
- centerSampleX: grid.centerSampleX,
394
- centerSampleY: grid.centerSampleY,
481
+ centerSampleX: plan.outputCenterX,
482
+ centerSampleY: plan.outputCenterY,
395
483
  normalizedIntensity: normalized
396
484
  };
397
485
  }
398
486
  /**
399
- * Evaluate a declared complex pupil with explicit amplitude/phase and sampling support; normalize PSF
400
- * shape and retain pupil throughput as a separate quantity.
487
+ * Evaluates a declared complex pupil with explicit amplitude, phase and sampling support. Returns the
488
+ * normalized PSF shape, and the pupil throughput as a separate quantity.
401
489
  *
402
- * Complex pupil evaluation sums declared amplitude and phase on a bounded regular pupil grid. PSF
403
- * shape is normalized separately from pupil throughput; coherent phase, pupil energy and
404
- * spectral/field applicability cannot be replaced by a scalar blur radius. Numeric profiles require
405
- * owned or reusable-data provenance.
406
- * @param input - CalculateLensComplexPupilPsfInput. See the linked contract for coordinate, unit and profile binding semantics.
407
- * @returns CalculationResult<LensComplexPupilPsf>. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
490
+ * The complex pupil is evaluated by summing the declared amplitude and phase over a bounded, regular
491
+ * pupil grid. The PSF shape is normalized separately from the pupil throughput. A single blur radius
492
+ * cannot stand in for coherent phase, pupil energy, or the wavelength and field range where the
493
+ * profile applies. Numeric profiles need provenance showing the data is owned or reusable.
494
+ * @param input - CalculateLensComplexPupilPsfInput. See that type for coordinates, units and profile binding.
495
+ * @returns CalculationResult<LensComplexPupilPsf>. The result states its shape and scientific status; a successful call does not imply calibration.
408
496
  *
409
497
  * @see docs/API_REFERENCE.md for the root export and exact type graph.
410
498
  */
411
499
  export function calculateLensComplexPupilPsf(input) {
500
+ requireInputKeys(input, "calculateLensComplexPupilPsf", ["profile", "propagationDistanceMm"]);
412
501
  const profile = parseLensComplexPupilProfile(input.profile);
413
502
  const propagationDistanceMm = input.propagationDistanceMm === undefined ? profile.context.focalLengthMm : input.propagationDistanceMm;
414
503
  requirePositiveFinite(propagationDistanceMm, "propagationDistanceMm");
415
- const kernel = calculateDiscreteFraunhoferKernel(profile, propagationDistanceMm);
504
+ const plan = planPupilSampling(profile, propagationDistanceMm);
505
+ const kernel = calculateDiscreteFraunhoferKernel(profile, propagationDistanceMm, plan);
416
506
  return approximationResult({
417
507
  propagationDistanceMm,
418
508
  propagationDistanceSource: input.propagationDistanceMm === undefined ? "nominal-focal-plane-reference" : "explicit",
@@ -430,6 +520,7 @@ export function calculateLensComplexPupilPsf(input) {
430
520
  }
431
521
  },
432
522
  kernel,
523
+ sampling: plan.sampling,
433
524
  relativePupilThroughputFactor: profile
434
525
  .relativePupilThroughputFactor,
435
526
  throughputOwnership: "separate-relative-pupil-throughput-factor",
@@ -451,8 +542,9 @@ export function calculateLensComplexPupilPsf(input) {
451
542
  pupilProfile: profile.evidence
452
543
  },
453
544
  uncertainty: profile.uncertainty
454
- }, "lens-complex-pupil-fraunhofer-psf", "1.1.0", [
545
+ }, "lens-complex-pupil-fraunhofer-psf", "2.0.0", [
455
546
  "The reference evaluator performs deterministic scalar Fraunhofer propagation of one explicit complex pupil amplitude plus optical-path-difference grid.",
547
+ "The pupil is zero padded so the DFT spans at least 2S-1 samples for a non-zero support of S samples per axis: the discrete intensity PSF then has no wrap-around aliasing and Goodman's sampling factor Q = lambda*N/pitch exceeds 2. Pupil support wider than the declared f/N aperture is rejected.",
456
548
  "Physical sample pitch uses the explicit propagation distance when supplied; omission preserves the nominal focal-plane reference. Finite focus metadata does not resolve the pupil-to-image geometry automatically.",
457
549
  "Diffraction and aberration phase are evaluated together in the same pupil propagation; callers must not stack an independent diffraction blur over this result.",
458
550
  "The output PSF is unit-energy normalized. The explicit relativePupilThroughputFactor is not multiplied into the kernel and remains owned by the separate optical-throughput path.",
@@ -1 +1 @@
1
- {"version":3,"file":"complex-pupil-psf.js","sourceRoot":"","sources":["../../src/optics/complex-pupil-psf.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"complex-pupil-psf.js","sourceRoot":"","sources":["../../src/optics/complex-pupil-psf.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * PSF (point-spread function) from a declared complex pupil: amplitude and phase sampled on a grid.\n *\n * The profile parser validates untrusted input and returns the normalized typed contract. Unknown\n * enum values, missing required fields and incompatible scientific data are rejected.\n *\n * The complex pupil is evaluated by summing the declared amplitude and phase over a bounded, regular\n * pupil grid. The PSF shape is normalized separately from the pupil throughput. A single blur radius\n * cannot stand in for coherent phase, pupil energy, or the wavelength and field range where the\n * profile applies. Numeric profiles need provenance showing the data is owned or reusable.\n * @see docs/PSF_FOUNDATION.md for the equations, units, coordinate conventions, known blockers and\n * support limits.\n */\n\nimport {\n approximationResult,\n type CalculationResult\n} from \"../core/calculation-result.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport {\n parseEvidenceList,\n type EvidenceProvenance\n} from \"../core/evidence-provenance.js\";\nimport { InvalidScientificInputError } from \"../core/validation.js\";\nimport {\n parseFocusPlane,\n type FocusPlane\n} from \"./focus-state.js\";\nimport type {\n LensPsfKernel,\n LensPsfScientificStatus,\n LensPsfUncertainty\n} from \"./lens-psf-profile.js\";\nimport { requireInputKeys, rejectUnknownFields, rejectUnknownVariantFields, UNCERTAINTY_VARIANT_FIELDS } from \"../core/record-validation.js\";\n\ntype UnknownRecord = Record<string, unknown>;\n\nexport const LENS_COMPLEX_PUPIL_PROFILE_SCHEMA_VERSION =\n \"0.1.0\" as const;\n\nexport interface LensComplexPupilGrid {\n widthSamples: number;\n heightSamples: number;\n pupilSamplePitchMmX: number;\n pupilSamplePitchMmY: number;\n centerSampleX: number;\n centerSampleY: number;\n relativeAmplitude:\n readonly number[];\n opticalPathDifferenceMicrometers:\n readonly number[];\n}\n\nexport interface LensComplexPupilProfile {\n schemaVersion:\n typeof LENS_COMPLEX_PUPIL_PROFILE_SCHEMA_VERSION;\n profileId: string;\n profileVersion: string;\n scientificStatus:\n LensPsfScientificStatus;\n opticalDomain:\n \"lens-primary-optical-path-only\";\n representation:\n \"complex-pupil-amplitude-plus-opd\";\n pupilCoordinateSystem:\n \"pupil-plane-metric-aligned-to-image-plane\";\n imageFieldAxes:\n \"+X right, +Y up\";\n amplitudeMeaning:\n \"relative-complex-pupil-amplitude-shape\";\n wavefrontMeaning:\n \"optical-path-difference-micrometers\";\n throughputOwnership:\n \"separate-relative-pupil-throughput-factor\";\n kernelEnergyNormalization:\n \"unit-energy-shape\";\n propagationModel:\n \"scalar-fraunhofer-discrete-reference\";\n context: {\n focalLengthMm: number;\n focus: FocusPlane;\n apertureFNumber: number;\n fieldPointMm: {\n x: number;\n y: number;\n };\n wavelengthNm: number;\n signedDefocusImagePlaneMicrometers:\n number;\n };\n responseIncludes: {\n diffraction: true;\n aberration: boolean;\n defocus: boolean;\n pupilClippingShape:\n boolean;\n };\n relativePupilThroughputFactor:\n number;\n grid: LensComplexPupilGrid;\n sensorOpticalStackIncluded:\n false;\n sensorSamplingIncluded:\n false;\n reconstructionIncluded:\n false;\n strayLightIncluded: false;\n evidence:\n readonly EvidenceProvenance[];\n uncertainty:\n LensPsfUncertainty;\n limitations: readonly string[];\n}\n\nexport interface CalculateLensComplexPupilPsfInput {\n profile:\n LensComplexPupilProfile;\n /** Physical propagation distance from pupil to image, in mm. If omitted, the\n * nominal focal-plane reference is used. At finite focus the caller must\n * resolve the supported principal-plane geometry; profile metadata does not. */\n propagationDistanceMm?: number;\n}\n\nexport interface LensComplexPupilPsf {\n propagationDistanceMm: number;\n propagationDistanceSource: \"explicit\" | \"nominal-focal-plane-reference\";\n profileId: string;\n profileVersion: string;\n scientificStatus:\n LensPsfScientificStatus;\n context:\n LensComplexPupilProfile[\"context\"];\n kernel: LensPsfKernel;\n /** Nyquist sampling diagnostics and the applied zero padding. */\n sampling: LensComplexPupilPsfSampling;\n relativePupilThroughputFactor:\n number;\n throughputOwnership:\n \"separate-relative-pupil-throughput-factor\";\n diffractionAndAberrationJointlyEvaluated:\n true;\n pupilClippingShapeIncluded:\n boolean;\n pupilClippingThroughputAppliedToKernel:\n false;\n scalarFraunhoferReference:\n true;\n full2dOrientationPreserved:\n true;\n geometricDistortionModified:\n false;\n lateralChromaticPositionShiftApplied:\n false;\n sensorOpticalStackIncluded:\n false;\n sensorSamplingIncluded: false;\n reconstructionIncluded: false;\n strayLightIncluded: false;\n scalarSharpnessScoreProduced:\n false;\n componentEvidence: {\n pupilProfile:\n readonly EvidenceProvenance[];\n };\n uncertainty:\n LensPsfUncertainty;\n}\n\nfunction requireRecord(\n value: unknown,\n path: string,\n allowedKeys: readonly string[] | null\n): UnknownRecord {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value)\n ) {\n throw new InvalidConfigurationError(\n path + \" must be an object.\"\n );\n }\n if (allowedKeys !== null) rejectUnknownFields(value, allowedKeys, path);\n return value as UnknownRecord;\n}\n\nfunction requireNonEmptyString(\n value: unknown,\n path: string\n): string {\n if (\n typeof value !== \"string\" ||\n value.trim().length === 0\n ) {\n throw new InvalidConfigurationError(\n path +\n \" must be a non-empty string.\"\n );\n }\n return value.trim();\n}\n\nfunction requireFinite(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value)\n ) {\n throw new InvalidConfigurationError(\n path + \" must be finite.\"\n );\n }\n return value;\n}\n\nfunction requirePositiveFinite(\n value: unknown,\n path: string\n): number {\n const parsed =\n requireFinite(value, path);\n if (parsed <= 0) {\n throw new InvalidConfigurationError(\n path +\n \" must be greater than zero.\"\n );\n }\n return parsed;\n}\n\nfunction requireUnitInterval(\n value: unknown,\n path: string\n): number {\n const parsed =\n requireFinite(value, path);\n if (\n parsed < 0 ||\n parsed > 1\n ) {\n throw new InvalidConfigurationError(\n path +\n \" must lie from zero through one.\"\n );\n }\n return parsed;\n}\n\nfunction requirePositiveSafeInteger(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isSafeInteger(value) ||\n value <= 0\n ) {\n throw new InvalidConfigurationError(\n path +\n \" must be a positive safe integer.\"\n );\n }\n return value;\n}\n\nfunction requireNonNegativeSafeInteger(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isSafeInteger(value) ||\n value < 0\n ) {\n throw new InvalidConfigurationError(\n path +\n \" must be a non-negative safe integer.\"\n );\n }\n return value;\n}\n\nfunction parseStatus(\n value: unknown,\n path: string\n): LensPsfScientificStatus {\n if (\n value !== \"calibrated\" &&\n value !== \"approximation\"\n ) {\n throw new InvalidConfigurationError(\n path + \" is invalid.\"\n );\n }\n return value;\n}\n\nfunction parseUncertainty(\n value: unknown,\n path: string\n): LensPsfUncertainty {\n const record =\n requireRecord(value, path, null);\n rejectUnknownVariantFields(record, \"kind\", UNCERTAINTY_VARIANT_FIELDS, path);\n if (record.kind === \"relative\") {\n const fraction =\n requireFinite(\n record.fraction,\n path + \".fraction\"\n );\n if (fraction < 0) {\n throw new InvalidConfigurationError(\n path +\n \".fraction must be nonnegative.\"\n );\n }\n return {\n kind: \"relative\",\n fraction,\n basis:\n requireNonEmptyString(\n record.basis,\n path + \".basis\"\n )\n };\n }\n if (\n record.kind ===\n \"not-quantified\"\n ) {\n return {\n kind: \"not-quantified\",\n limitation:\n requireNonEmptyString(\n record.limitation,\n path +\n \".limitation\"\n )\n };\n }\n throw new InvalidConfigurationError(\n path + \".kind is invalid.\"\n );\n}\n\nfunction parseLimitations(\n value: unknown,\n path: string\n): readonly string[] {\n if (!Array.isArray(value)) {\n throw new InvalidConfigurationError(\n path + \" must be an array.\"\n );\n }\n const parsed =\n value.map(\n (entry, index) =>\n requireNonEmptyString(\n entry,\n path +\n \"[\" +\n index +\n \"]\"\n )\n );\n if (\n new Set(parsed).size !==\n parsed.length\n ) {\n throw new InvalidConfigurationError(\n path +\n \" must not contain duplicates.\"\n );\n }\n return parsed;\n}\n\nfunction parseGrid(\n value: unknown\n): LensComplexPupilGrid {\n const record =\n requireRecord(\n value,\n \"lensComplexPupil.grid\", [\"widthSamples\", \"heightSamples\", \"centerSampleX\", \"centerSampleY\", \"relativeAmplitude\", \"opticalPathDifferenceMicrometers\", \"pupilSamplePitchMmX\", \"pupilSamplePitchMmY\"]\n );\n const widthSamples =\n requirePositiveSafeInteger(\n record.widthSamples,\n \"lensComplexPupil.grid.widthSamples\"\n );\n const heightSamples =\n requirePositiveSafeInteger(\n record.heightSamples,\n \"lensComplexPupil.grid.heightSamples\"\n );\n const total =\n widthSamples *\n heightSamples;\n if (\n !Number.isSafeInteger(total) ||\n total > 4096\n ) {\n throw new InvalidConfigurationError(\n \"lensComplexPupil grid must contain at most 4096 samples.\"\n );\n }\n const centerSampleX =\n requireNonNegativeSafeInteger(\n record.centerSampleX,\n \"lensComplexPupil.grid.centerSampleX\"\n );\n const centerSampleY =\n requireNonNegativeSafeInteger(\n record.centerSampleY,\n \"lensComplexPupil.grid.centerSampleY\"\n );\n if (\n centerSampleX >=\n widthSamples ||\n centerSampleY >=\n heightSamples\n ) {\n throw new InvalidConfigurationError(\n \"lensComplexPupil grid center must lie within the pupil array.\"\n );\n }\n if (\n !Array.isArray(\n record.relativeAmplitude\n ) ||\n record.relativeAmplitude\n .length !== total\n ) {\n throw new InvalidConfigurationError(\n \"lensComplexPupil.grid.relativeAmplitude length must equal widthSamples × heightSamples.\"\n );\n }\n if (\n !Array.isArray(\n record\n .opticalPathDifferenceMicrometers\n ) ||\n record\n .opticalPathDifferenceMicrometers\n .length !== total\n ) {\n throw new InvalidConfigurationError(\n \"lensComplexPupil.grid.opticalPathDifferenceMicrometers length must equal widthSamples × heightSamples.\"\n );\n }\n\n const relativeAmplitude =\n record.relativeAmplitude.map(\n (entry, index) =>\n requireUnitInterval(\n entry,\n \"lensComplexPupil.grid.relativeAmplitude[\" +\n index +\n \"]\"\n )\n );\n if (\n !relativeAmplitude.some(\n (value) =>\n value > 0\n )\n ) {\n throw new InvalidConfigurationError(\n \"lensComplexPupil must contain at least one non-zero pupil-amplitude sample.\"\n );\n }\n const opd =\n record\n .opticalPathDifferenceMicrometers\n .map(\n (entry, index) =>\n requireFinite(\n entry,\n \"lensComplexPupil.grid.opticalPathDifferenceMicrometers[\" +\n index +\n \"]\"\n )\n );\n\n return {\n widthSamples,\n heightSamples,\n pupilSamplePitchMmX:\n requirePositiveFinite(\n record\n .pupilSamplePitchMmX,\n \"lensComplexPupil.grid.pupilSamplePitchMmX\"\n ),\n pupilSamplePitchMmY:\n requirePositiveFinite(\n record\n .pupilSamplePitchMmY,\n \"lensComplexPupil.grid.pupilSamplePitchMmY\"\n ),\n centerSampleX,\n centerSampleY,\n relativeAmplitude,\n opticalPathDifferenceMicrometers:\n opd\n };\n}\n\n/**\n * Validates an untrusted declaration and returns the normalized typed contract. Unknown enum values,\n * missing required fields and incompatible scientific data are rejected here.\n *\n * The complex pupil is evaluated by summing the declared amplitude and phase over a bounded, regular\n * pupil grid. The PSF shape is normalized separately from the pupil throughput. A single blur radius\n * cannot stand in for coherent phase, pupil energy, or the wavelength and field range where the\n * profile applies. Numeric profiles need provenance showing the data is owned or reusable.\n * @param value - unknown. Untrusted input; TypeScript types alone are not validation.\n * @returns LensComplexPupilProfile. The result states its shape and scientific status; a successful call does not imply calibration.\n *\n * @see docs/API_REFERENCE.md for the root export and exact type graph.\n */\nexport function parseLensComplexPupilProfile(\n value: unknown\n): LensComplexPupilProfile {\n const record =\n requireRecord(\n value,\n \"lensComplexPupil\", [\"schemaVersion\", \"opticalDomain\", \"representation\", \"pupilCoordinateSystem\", \"imageFieldAxes\", \"amplitudeMeaning\", \"wavefrontMeaning\", \"throughputOwnership\", \"kernelEnergyNormalization\", \"propagationModel\", \"sensorOpticalStackIncluded\", \"sensorSamplingIncluded\", \"reconstructionIncluded\", \"strayLightIncluded\", \"scientificStatus\", \"uncertainty\", \"context\", \"responseIncludes\", \"profileId\", \"profileVersion\", \"relativePupilThroughputFactor\", \"grid\", \"evidence\", \"limitations\"]\n );\n if (\n record.schemaVersion !==\n LENS_COMPLEX_PUPIL_PROFILE_SCHEMA_VERSION\n ) {\n throw new InvalidConfigurationError(\n 'lensComplexPupil.schemaVersion must be \"' +\n LENS_COMPLEX_PUPIL_PROFILE_SCHEMA_VERSION +\n '\".'\n );\n }\n if (\n record.opticalDomain !==\n \"lens-primary-optical-path-only\" ||\n record.representation !==\n \"complex-pupil-amplitude-plus-opd\" ||\n record.pupilCoordinateSystem !==\n \"pupil-plane-metric-aligned-to-image-plane\" ||\n record.imageFieldAxes !==\n \"+X right, +Y up\" ||\n record.amplitudeMeaning !==\n \"relative-complex-pupil-amplitude-shape\" ||\n record.wavefrontMeaning !==\n \"optical-path-difference-micrometers\" ||\n record.throughputOwnership !==\n \"separate-relative-pupil-throughput-factor\" ||\n record.kernelEnergyNormalization !==\n \"unit-energy-shape\" ||\n record.propagationModel !==\n \"scalar-fraunhofer-discrete-reference\"\n ) {\n throw new InvalidConfigurationError(\n \"lensComplexPupil representation/coordinate/energy semantics are invalid.\"\n );\n }\n if (\n record.sensorOpticalStackIncluded !==\n false ||\n record.sensorSamplingIncluded !==\n false ||\n record.reconstructionIncluded !==\n false ||\n record.strayLightIncluded !==\n false\n ) {\n throw new InvalidConfigurationError(\n \"V1 complex pupil profiles must exclude sensor/reconstruction/stray-light effects.\"\n );\n }\n const status =\n parseStatus(\n record.scientificStatus,\n \"lensComplexPupil.scientificStatus\"\n );\n const uncertainty =\n parseUncertainty(\n record.uncertainty,\n \"lensComplexPupil.uncertainty\"\n );\n if (\n status === \"calibrated\" &&\n uncertainty.kind ===\n \"not-quantified\"\n ) {\n throw new InvalidConfigurationError(\n \"Calibrated complex-pupil profiles must declare quantified relative uncertainty.\"\n );\n }\n const context =\n requireRecord(\n record.context,\n \"lensComplexPupil.context\", [\"fieldPointMm\", \"focalLengthMm\", \"focus\", \"apertureFNumber\", \"wavelengthNm\", \"signedDefocusImagePlaneMicrometers\"]\n );\n const field =\n requireRecord(\n context.fieldPointMm,\n \"lensComplexPupil.context.fieldPointMm\", [\"x\", \"y\"]\n );\n const response =\n requireRecord(\n record.responseIncludes,\n \"lensComplexPupil.responseIncludes\", [\"diffraction\", \"aberration\", \"defocus\", \"pupilClippingShape\"]\n );\n if (\n response.diffraction !==\n true ||\n typeof response.aberration !==\n \"boolean\" ||\n typeof response.defocus !==\n \"boolean\" ||\n typeof response.pupilClippingShape !==\n \"boolean\"\n ) {\n throw new InvalidConfigurationError(\n \"lensComplexPupil.responseIncludes is invalid; diffraction must be included in this pupil propagation path.\"\n );\n }\n\n return {\n schemaVersion:\n LENS_COMPLEX_PUPIL_PROFILE_SCHEMA_VERSION,\n profileId:\n requireNonEmptyString(\n record.profileId,\n \"lensComplexPupil.profileId\"\n ),\n profileVersion:\n requireNonEmptyString(\n record.profileVersion,\n \"lensComplexPupil.profileVersion\"\n ),\n scientificStatus:\n status,\n opticalDomain:\n \"lens-primary-optical-path-only\",\n representation:\n \"complex-pupil-amplitude-plus-opd\",\n pupilCoordinateSystem:\n \"pupil-plane-metric-aligned-to-image-plane\",\n imageFieldAxes:\n \"+X right, +Y up\",\n amplitudeMeaning:\n \"relative-complex-pupil-amplitude-shape\",\n wavefrontMeaning:\n \"optical-path-difference-micrometers\",\n throughputOwnership:\n \"separate-relative-pupil-throughput-factor\",\n kernelEnergyNormalization:\n \"unit-energy-shape\",\n propagationModel:\n \"scalar-fraunhofer-discrete-reference\",\n context: {\n focalLengthMm:\n requirePositiveFinite(\n context.focalLengthMm,\n \"lensComplexPupil.context.focalLengthMm\"\n ),\n focus:\n parseFocusPlane(\n context.focus\n ),\n apertureFNumber:\n requirePositiveFinite(\n context.apertureFNumber,\n \"lensComplexPupil.context.apertureFNumber\"\n ),\n fieldPointMm: {\n x:\n requireFinite(\n field.x,\n \"lensComplexPupil.context.fieldPointMm.x\"\n ),\n y:\n requireFinite(\n field.y,\n \"lensComplexPupil.context.fieldPointMm.y\"\n )\n },\n wavelengthNm:\n requirePositiveFinite(\n context.wavelengthNm,\n \"lensComplexPupil.context.wavelengthNm\"\n ),\n signedDefocusImagePlaneMicrometers:\n requireFinite(\n context\n .signedDefocusImagePlaneMicrometers,\n \"lensComplexPupil.context.signedDefocusImagePlaneMicrometers\"\n )\n },\n responseIncludes: {\n diffraction: true,\n aberration:\n response.aberration as boolean,\n defocus:\n response.defocus as boolean,\n pupilClippingShape:\n response\n .pupilClippingShape as boolean\n },\n relativePupilThroughputFactor:\n requireUnitInterval(\n record\n .relativePupilThroughputFactor,\n \"lensComplexPupil.relativePupilThroughputFactor\"\n ),\n grid:\n parseGrid(record.grid),\n sensorOpticalStackIncluded:\n false,\n sensorSamplingIncluded:\n false,\n reconstructionIncluded:\n false,\n strayLightIncluded:\n false,\n evidence:\n parseEvidenceList(\n record.evidence,\n \"lensComplexPupil.evidence\"\n ),\n uncertainty,\n limitations:\n parseLimitations(\n record.limitations,\n \"lensComplexPupil.limitations\"\n )\n };\n}\n\ninterface ComplexValue {\n re: number;\n im: number;\n}\n\nfunction pupilComplexValue(\n amplitude: number,\n opdMicrometers: number,\n wavelengthMicrometers:\n number\n): ComplexValue {\n const phase =\n 2 *\n Math.PI *\n opdMicrometers /\n wavelengthMicrometers;\n return {\n re:\n amplitude *\n Math.cos(phase),\n im:\n amplitude *\n Math.sin(phase)\n };\n}\n\nexport interface LensComplexPupilPsfSampling {\n criterion: \"discrete-intensity-alias-free-goodman-q-above-2\";\n /** Number of pupil samples spanned by non-zero amplitude, per axis. */\n pupilSupportSamplesX: number;\n pupilSupportSamplesY: number;\n /**\n * Sampled pupil diameter D = (support samples - 1) x pupil pitch: the\n * centre-to-centre span of the outermost non-zero samples, in millimetres.\n */\n pupilSupportDiameterMmX: number;\n pupilSupportDiameterMmY: number;\n /**\n * Widest support allowed by the declared f-number at the resolved propagation distance:\n * propagationDistanceMm / apertureFNumber, in millimetres. For the nominal focal-plane reference\n * this is focalLengthMm / apertureFNumber.\n */\n declaredPupilDiameterMm: number;\n /** Declared pupil grid size before zero padding. */\n pupilGridWidthSamples: number;\n pupilGridHeightSamples: number;\n /** DFT size after zero padding; equals the output kernel size. */\n transformWidthSamples: number;\n transformHeightSamples: number;\n zeroPaddingApplied: boolean;\n /**\n * Achieved Goodman sampling factor Q = lambda*(z/D)/imagePitch =\n * transform samples / (support samples - 1). Always greater than 2. Null\n * when the support is a single sample on that axis (no finite diameter).\n */\n samplingFactorQX: number | null;\n samplingFactorQY: number | null;\n}\n\ninterface PupilSamplingPlan {\n sampling: LensComplexPupilPsfSampling;\n outputCenterX: number;\n outputCenterY: number;\n}\n\nfunction supportSpan(\n grid: LensComplexPupilGrid,\n axis: \"x\" | \"y\"\n): number {\n let minimum = Number.POSITIVE_INFINITY;\n let maximum = Number.NEGATIVE_INFINITY;\n grid.relativeAmplitude.forEach((amplitude, index) => {\n if (amplitude > 0) {\n const coordinate =\n axis === \"x\"\n ? index % grid.widthSamples\n : Math.floor(index / grid.widthSamples);\n minimum = Math.min(minimum, coordinate);\n maximum = Math.max(maximum, coordinate);\n }\n });\n return maximum - minimum + 1;\n}\n\n/**\n * Sampling guard for the discrete Fraunhofer reference (Ban et al.,\n * arXiv:2511.06936, eqs. 6-9, free: N*dp = lambda*f/dc, Q = lambda*F/dc and\n * Q >= 2. Also see: Goodman, Introduction to Fourier Optics, sampling of\n * DFT/FFT Fraunhofer propagation).\n *\n * A DFT (discrete Fourier transform) of size M over pupil pitch dp gives an\n * image-plane pitch of lambda*z/(M*dp).\n *\n * The intensity PSF is the transform of the pupil autocorrelation. That\n * autocorrelation is twice as wide as the pupil. So Nyquist sampling of the\n * intensity needs Q = lambda*(z/D)/pitch = M*dp/D >= 2.\n *\n * For a pupil spanning S samples, the discrete autocorrelation has 2S-1 lags.\n * So M >= 2S-1 is the exact condition for no circular wrap-around, and it\n * implies Q = M/(S-1) > 2. The declared grid is zero padded to that size.\n *\n * The non-zero support must also fit inside the declared f/N cone. Its\n * diameter D may not exceed z/N for the resolved propagation distance z; that\n * is, the image-side cone D/z may not be wider than 1/N. With the nominal\n * focal-plane reference (z = f) this is the entrance-aperture diameter f/N. An\n * exit pupil declared at its own distance z uses that distance\n * (docs/PSF_FOUNDATION.md).\n */\nfunction planPupilSampling(\n profile: LensComplexPupilProfile,\n propagationDistanceMm: number\n): PupilSamplingPlan {\n const grid = profile.grid;\n const supportX = supportSpan(grid, \"x\");\n const supportY = supportSpan(grid, \"y\");\n const diameterX = (supportX - 1) * grid.pupilSamplePitchMmX;\n const diameterY = (supportY - 1) * grid.pupilSamplePitchMmY;\n const declaredDiameter =\n propagationDistanceMm / profile.context.apertureFNumber;\n // Relative allowance for floating-point rounding only.\n const limit = declaredDiameter * (1 + 1e-9);\n if (diameterX > limit || diameterY > limit) {\n throw new InvalidScientificInputError(\n \"Complex-pupil amplitude support spans \" +\n diameterX.toPrecision(6) +\n \" x \" +\n diameterY.toPrecision(6) +\n \" mm between outermost non-zero samples, wider than the declared f/N cone diameter \" +\n declaredDiameter.toPrecision(6) +\n \" mm (propagationDistanceMm / apertureFNumber).\"\n );\n }\n const transformWidth = Math.max(grid.widthSamples, 2 * supportX - 1);\n const transformHeight = Math.max(grid.heightSamples, 2 * supportY - 1);\n return {\n sampling: {\n criterion: \"discrete-intensity-alias-free-goodman-q-above-2\",\n pupilSupportSamplesX: supportX,\n pupilSupportSamplesY: supportY,\n pupilSupportDiameterMmX: diameterX,\n pupilSupportDiameterMmY: diameterY,\n declaredPupilDiameterMm: declaredDiameter,\n pupilGridWidthSamples: grid.widthSamples,\n pupilGridHeightSamples: grid.heightSamples,\n transformWidthSamples: transformWidth,\n transformHeightSamples: transformHeight,\n zeroPaddingApplied:\n transformWidth !== grid.widthSamples ||\n transformHeight !== grid.heightSamples,\n samplingFactorQX:\n supportX > 1 ? transformWidth / (supportX - 1) : null,\n samplingFactorQY:\n supportY > 1 ? transformHeight / (supportY - 1) : null\n },\n // Symmetric padding keeps zero frequency at the declared centre, shifted\n // by the leading padding.\n outputCenterX:\n grid.centerSampleX +\n Math.floor((transformWidth - grid.widthSamples) / 2),\n outputCenterY:\n grid.centerSampleY +\n Math.floor((transformHeight - grid.heightSamples) / 2)\n };\n}\n\nfunction twiddleTable(size: number): { cos: number[]; sin: number[] } {\n const cos: number[] = [];\n const sin: number[] = [];\n for (let index = 0; index < size; index += 1) {\n const angle = (-2 * Math.PI * index) / size;\n cos.push(Math.cos(angle));\n sin.push(Math.sin(angle));\n }\n return { cos, sin };\n}\n\nfunction positiveModulo(value: number, size: number): number {\n const remainder = value % size;\n return remainder < 0 ? remainder + size : remainder;\n}\n\nfunction calculateDiscreteFraunhoferKernel(\n profile:\n LensComplexPupilProfile,\n propagationDistanceMm: number,\n plan: PupilSamplingPlan\n): LensPsfKernel {\n const grid = profile.grid;\n const width = grid.widthSamples;\n const height = grid.heightSamples;\n const outWidth = plan.sampling.transformWidthSamples;\n const outHeight = plan.sampling.transformHeightSamples;\n const wavelengthMicrometers = profile.context.wavelengthNm / 1000;\n const wavelengthMm = profile.context.wavelengthNm / 1_000_000;\n const pupil: ComplexValue[] =\n grid.relativeAmplitude.map(\n (amplitude, index) =>\n pupilComplexValue(\n amplitude,\n grid.opticalPathDifferenceMicrometers[index]!,\n wavelengthMicrometers\n )\n );\n\n // Separable zero-padded DFT: pupil rows to image kx first, then columns.\n // Padding samples are zero, so only declared pupil samples are summed.\n const twiddleX = twiddleTable(outWidth);\n const twiddleY = twiddleTable(outHeight);\n const rowRe = new Float64Array(height * outWidth);\n const rowIm = new Float64Array(height * outWidth);\n for (let y = 0; y < height; y += 1) {\n for (let outX = 0; outX < outWidth; outX += 1) {\n const kx = outX - plan.outputCenterX;\n let re = 0;\n let im = 0;\n for (let x = 0; x < width; x += 1) {\n const source = pupil[y * width + x]!;\n const t = positiveModulo(kx * (x - grid.centerSampleX), outWidth);\n const cos = twiddleX.cos[t]!;\n const sin = twiddleX.sin[t]!;\n re += source.re * cos - source.im * sin;\n im += source.re * sin + source.im * cos;\n }\n rowRe[y * outWidth + outX] = re;\n rowIm[y * outWidth + outX] = im;\n }\n }\n\n const intensity = new Array<number>(outWidth * outHeight).fill(0);\n for (let outY = 0; outY < outHeight; outY += 1) {\n const ky = outY - plan.outputCenterY;\n for (let outX = 0; outX < outWidth; outX += 1) {\n let re = 0;\n let im = 0;\n for (let y = 0; y < height; y += 1) {\n const sourceRe = rowRe[y * outWidth + outX]!;\n const sourceIm = rowIm[y * outWidth + outX]!;\n const t = positiveModulo(ky * (y - grid.centerSampleY), outHeight);\n const cos = twiddleY.cos[t]!;\n const sin = twiddleY.sin[t]!;\n re += sourceRe * cos - sourceIm * sin;\n im += sourceRe * sin + sourceIm * cos;\n }\n intensity[outY * outWidth + outX] = re * re + im * im;\n }\n }\n\n const sum =\n intensity.reduce(\n (acc, value) =>\n acc + value,\n 0\n );\n if (\n !Number.isFinite(sum) ||\n sum <= 0\n ) {\n throw new InvalidScientificInputError(\n \"Complex-pupil propagation must produce finite positive PSF energy.\"\n );\n }\n const normalized =\n intensity.map(\n (value) =>\n value / sum\n );\n\n const samplePitchMmX =\n wavelengthMm * propagationDistanceMm /\n (outWidth * grid.pupilSamplePitchMmX);\n const samplePitchMmY =\n wavelengthMm * propagationDistanceMm /\n (outHeight * grid.pupilSamplePitchMmY);\n\n if (\n !Number.isFinite(\n samplePitchMmX\n ) ||\n !Number.isFinite(\n samplePitchMmY\n ) ||\n samplePitchMmX <= 0 ||\n samplePitchMmY <= 0\n ) {\n throw new InvalidScientificInputError(\n \"Complex-pupil PSF sample pitch must remain finite and positive.\"\n );\n }\n\n return {\n widthSamples: outWidth,\n heightSamples: outHeight,\n samplePitchMicrometersX:\n samplePitchMmX *\n 1000,\n samplePitchMicrometersY:\n samplePitchMmY *\n 1000,\n centerSampleX: plan.outputCenterX,\n centerSampleY: plan.outputCenterY,\n normalizedIntensity:\n normalized\n };\n}\n\n/**\n * Evaluates a declared complex pupil with explicit amplitude, phase and sampling support. Returns the\n * normalized PSF shape, and the pupil throughput as a separate quantity.\n *\n * The complex pupil is evaluated by summing the declared amplitude and phase over a bounded, regular\n * pupil grid. The PSF shape is normalized separately from the pupil throughput. A single blur radius\n * cannot stand in for coherent phase, pupil energy, or the wavelength and field range where the\n * profile applies. Numeric profiles need provenance showing the data is owned or reusable.\n * @param input - CalculateLensComplexPupilPsfInput. See that type for coordinates, units and profile binding.\n * @returns CalculationResult<LensComplexPupilPsf>. The result states its shape and scientific status; a successful call does not imply calibration.\n *\n * @see docs/API_REFERENCE.md for the root export and exact type graph.\n */\nexport function calculateLensComplexPupilPsf(\n input:\n CalculateLensComplexPupilPsfInput\n): CalculationResult<LensComplexPupilPsf> {\n requireInputKeys(input, \"calculateLensComplexPupilPsf\", [\"profile\", \"propagationDistanceMm\"]);\n const profile =\n parseLensComplexPupilProfile(\n input.profile\n );\n const propagationDistanceMm = input.propagationDistanceMm === undefined ? profile.context.focalLengthMm : input.propagationDistanceMm;\n requirePositiveFinite(propagationDistanceMm, \"propagationDistanceMm\");\n const plan = planPupilSampling(profile, propagationDistanceMm);\n const kernel =\n calculateDiscreteFraunhoferKernel(\n profile,\n propagationDistanceMm,\n plan\n );\n\n return approximationResult(\n {\n propagationDistanceMm,\n propagationDistanceSource: input.propagationDistanceMm === undefined ? \"nominal-focal-plane-reference\" : \"explicit\",\n profileId:\n profile.profileId,\n profileVersion:\n profile.profileVersion,\n scientificStatus:\n profile.scientificStatus,\n context: {\n ...profile.context,\n focus: {\n ...profile.context.focus\n },\n fieldPointMm: {\n ...profile.context\n .fieldPointMm\n }\n },\n kernel,\n sampling: plan.sampling,\n relativePupilThroughputFactor:\n profile\n .relativePupilThroughputFactor,\n throughputOwnership:\n \"separate-relative-pupil-throughput-factor\",\n diffractionAndAberrationJointlyEvaluated:\n true,\n pupilClippingShapeIncluded:\n profile\n .responseIncludes\n .pupilClippingShape,\n pupilClippingThroughputAppliedToKernel:\n false,\n scalarFraunhoferReference:\n true,\n full2dOrientationPreserved:\n true,\n geometricDistortionModified:\n false,\n lateralChromaticPositionShiftApplied:\n false,\n sensorOpticalStackIncluded:\n false,\n sensorSamplingIncluded:\n false,\n reconstructionIncluded:\n false,\n strayLightIncluded:\n false,\n scalarSharpnessScoreProduced:\n false,\n componentEvidence: {\n pupilProfile:\n profile.evidence\n },\n uncertainty:\n profile.uncertainty\n },\n \"lens-complex-pupil-fraunhofer-psf\",\n \"2.0.0\",\n [\n \"The reference evaluator performs deterministic scalar Fraunhofer propagation of one explicit complex pupil amplitude plus optical-path-difference grid.\",\n \"The pupil is zero padded so the DFT spans at least 2S-1 samples for a non-zero support of S samples per axis: the discrete intensity PSF then has no wrap-around aliasing and Goodman's sampling factor Q = lambda*N/pitch exceeds 2. Pupil support wider than the declared f/N aperture is rejected.\",\n \"Physical sample pitch uses the explicit propagation distance when supplied; omission preserves the nominal focal-plane reference. Finite focus metadata does not resolve the pupil-to-image geometry automatically.\",\n \"Diffraction and aberration phase are evaluated together in the same pupil propagation; callers must not stack an independent diffraction blur over this result.\",\n \"The output PSF is unit-energy normalized. The explicit relativePupilThroughputFactor is not multiplied into the kernel and remains owned by the separate optical-throughput path.\",\n \"Pupil amplitude shape can represent mechanical clipping/cat-eye geometry without silently encoding unknown transmission loss.\",\n \"The pupil and image-plane axes preserve full 2D orientation; no radial or sagittal/tangential averaging is imposed.\",\n \"This scalar Fraunhofer grid is a bounded reference approximation, not a full vector electromagnetic, polarization, stray-light or sensor-system model.\",\n \"Sensor OLPF, microlens, CFA, sampling and reconstruction are downstream and excluded.\"\n ]\n );\n}\n"]}
@@ -1,12 +1,17 @@
1
1
  /**
2
- * Module boundary and integration notes.
3
- * Calculates thin-lens depth-of-field limits using the conventional hyperfocal-distance formulation.
4
- * The model is geometric and does not include diffraction, aberrations, focus breathing, pupil
5
- * magnification, or macro/high-magnification effects.
6
- * Calculates the geometric defocus-circle diameter at the sensor plane for a subject plane away from
7
- * the selected focus plane.
8
- * @see docs/PHYSICS_FOUNDATION.md for equations, coordinate/unit conventions, blockers and support
9
- * limits.
2
+ * Thin-lens depth of field (DoF) and defocus blur.
3
+ *
4
+ * Depth-of-field limits are exact for a thin lens. They use the hyperfocal distance
5
+ * H = f^2/(Nc) + f:
6
+ * near = s(H - f)/(H + s - 2f)
7
+ * far = s(H - f)/(H - s), infinite (null) when s >= H
8
+ * The model is geometric. It does not include diffraction, aberrations, focus breathing, pupil
9
+ * magnification or macro (high-magnification) effects.
10
+ *
11
+ * The defocus circle is the geometric blur-circle diameter at the sensor for a subject plane that is
12
+ * not at the focus distance.
13
+ * @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
14
+ * and support limits.
10
15
  */
11
16
  import { type CalculationResult } from "../core/calculation-result.js";
12
17
  export interface CalculateDepthOfFieldInput {
@@ -28,11 +33,16 @@ export interface DepthOfField {
28
33
  totalDepthOfFieldM: number | null;
29
34
  }
30
35
  /**
31
- * Calculates thin-lens depth-of-field limits using the conventional
32
- * hyperfocal-distance formulation.
36
+ * Calculates exact thin-lens depth-of-field limits. With hyperfocal
37
+ * distance H = f^2/(Nc) + f and focus distance s, the near limit is
38
+ * s(H - f)/(H + s - 2f) and the far limit is s(H - f)/(H - s), which is
39
+ * infinite (`null`) when s >= H. At both limits the geometric defocus circle
40
+ * from {@link calculateDefocusCircle} equals the supplied circle of confusion.
41
+ * The circle of confusion must be smaller than the aperture diameter f/N;
42
+ * otherwise the near limit would fall inside the focal length.
33
43
  *
34
- * The model is geometric and does not include diffraction, aberrations,
35
- * focus breathing, pupil magnification, or macro/high-magnification effects.
44
+ * The model is geometric. It does not include diffraction, aberrations,
45
+ * focus breathing, pupil magnification or macro (high-magnification) effects.
36
46
  *
37
47
  * @param input Lens, focus, aperture, and acceptable blur-circle inputs.
38
48
  * @returns Hyperfocal, near, and far depth-of-field distances.
@@ -54,13 +64,14 @@ export interface DefocusCircle {
54
64
  }
55
65
  /**
56
66
  * Calculates the geometric defocus-circle diameter at the sensor plane for a
57
- * subject plane away from the selected focus plane.
67
+ * subject plane away from the selected focus plane, using the stable closed
68
+ * form c = f^2 |s - d| / (N d (s - f)) (model 1.1.0).
58
69
  *
59
70
  * @param input Lens, aperture, focus-plane, and subject-plane distances.
60
71
  * @returns Geometric blur-circle diameter.
61
72
  */
62
73
  export declare function calculateDefocusCircle(input: CalculateDefocusCircleInput): CalculationResult<DefocusCircle>;
63
- /** @internal Immutable request-local identity; never a root public cache/API. */
74
+ /** @internal Immutable identity for one request. Not a public cache or API. */
64
75
  export interface ResolvedDefocusFocusProjection {
65
76
  readonly focalLengthMm: number;
66
77
  readonly focusDistanceM: number;
@@ -68,4 +79,3 @@ export interface ResolvedDefocusFocusProjection {
68
79
  }
69
80
  /** @internal Reuses a projection already calculated for this exact POC request. */
70
81
  export declare function calculateDefocusCircleUsingFocusProjection(input: CalculateDefocusCircleInput, projection?: ResolvedDefocusFocusProjection): CalculationResult<DefocusCircle>;
71
- //# sourceMappingURL=depth-of-field.d.ts.map