@photivra/engine 0.5.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +674 -0
- package/CHANGELOG.md +218 -0
- package/CITATION.cff +1 -1
- package/CONTRIBUTING.md +76 -0
- package/DCO +33 -0
- package/NODE_SUPPORT.md +37 -0
- package/NOTICE +2 -0
- package/README.md +157 -56
- package/SECURITY.md +55 -0
- package/THIRD_PARTY.md +63 -0
- package/dist/camera/equivalent-focal-length.d.ts +9 -0
- package/dist/camera/equivalent-focal-length.d.ts.map +1 -1
- package/dist/camera/equivalent-focal-length.js +9 -0
- package/dist/camera/equivalent-focal-length.js.map +1 -1
- package/dist/camera/field-of-view.d.ts +13 -0
- package/dist/camera/field-of-view.d.ts.map +1 -1
- package/dist/camera/field-of-view.js +13 -0
- package/dist/camera/field-of-view.js.map +1 -1
- package/dist/camera/projected-object-size.d.ts +8 -0
- package/dist/camera/projected-object-size.d.ts.map +1 -1
- package/dist/camera/projected-object-size.js +8 -0
- package/dist/camera/projected-object-size.js.map +1 -1
- package/dist/capture/capture-export-metadata.d.ts +60 -0
- package/dist/capture/capture-export-metadata.d.ts.map +1 -0
- package/dist/capture/capture-export-metadata.js +62 -0
- package/dist/capture/capture-export-metadata.js.map +1 -0
- package/dist/capture/environment-raw-producer.d.ts +55 -0
- package/dist/capture/environment-raw-producer.d.ts.map +1 -0
- package/dist/capture/environment-raw-producer.js +88 -0
- package/dist/capture/environment-raw-producer.js.map +1 -0
- package/dist/capture/export-jpeg.d.ts +12 -0
- package/dist/capture/export-jpeg.d.ts.map +1 -0
- package/dist/capture/export-jpeg.js +126 -0
- package/dist/capture/export-jpeg.js.map +1 -0
- package/dist/capture/export-tiff.d.ts +45 -0
- package/dist/capture/export-tiff.d.ts.map +1 -0
- package/dist/capture/export-tiff.js +129 -0
- package/dist/capture/export-tiff.js.map +1 -0
- package/dist/capture/focus-control.d.ts +210 -0
- package/dist/capture/focus-control.d.ts.map +1 -0
- package/dist/capture/focus-control.js +664 -0
- package/dist/capture/focus-control.js.map +1 -0
- package/dist/capture/linear-encoding.d.ts +59 -0
- package/dist/capture/linear-encoding.d.ts.map +1 -0
- package/dist/capture/linear-encoding.js +98 -0
- package/dist/capture/linear-encoding.js.map +1 -0
- package/dist/capture/photographic-export.d.ts +135 -0
- package/dist/capture/photographic-export.d.ts.map +1 -0
- package/dist/capture/photographic-export.js +273 -0
- package/dist/capture/photographic-export.js.map +1 -0
- package/dist/capture/raw-frame-limits.d.ts +12 -0
- package/dist/capture/raw-frame-limits.d.ts.map +1 -0
- package/dist/capture/raw-frame-limits.js +13 -0
- package/dist/capture/raw-frame-limits.js.map +1 -0
- package/dist/capture/raw-frame-reconstruction.d.ts +48 -0
- package/dist/capture/raw-frame-reconstruction.d.ts.map +1 -0
- package/dist/capture/raw-frame-reconstruction.js +146 -0
- package/dist/capture/raw-frame-reconstruction.js.map +1 -0
- package/dist/capture/release-sequence.d.ts +120 -0
- package/dist/capture/release-sequence.d.ts.map +1 -0
- package/dist/capture/release-sequence.js +446 -0
- package/dist/capture/release-sequence.js.map +1 -0
- package/dist/capture/sensor-raw-frame.d.ts +34 -0
- package/dist/capture/sensor-raw-frame.d.ts.map +1 -0
- package/dist/capture/sensor-raw-frame.js +106 -0
- package/dist/capture/sensor-raw-frame.js.map +1 -0
- package/dist/capture/sensor-raw-producer.d.ts +51 -0
- package/dist/capture/sensor-raw-producer.d.ts.map +1 -0
- package/dist/capture/sensor-raw-producer.js +235 -0
- package/dist/capture/sensor-raw-producer.js.map +1 -0
- package/dist/capture/simulated-capture.d.ts +125 -0
- package/dist/capture/simulated-capture.d.ts.map +1 -0
- package/dist/capture/simulated-capture.js +248 -0
- package/dist/capture/simulated-capture.js.map +1 -0
- package/dist/color/capture-color.d.ts +73 -0
- package/dist/color/capture-color.d.ts.map +1 -0
- package/dist/color/capture-color.js +145 -0
- package/dist/color/capture-color.js.map +1 -0
- package/dist/color/sensor-color-development.d.ts +23 -0
- package/dist/color/sensor-color-development.d.ts.map +1 -0
- package/dist/color/sensor-color-development.js +56 -0
- package/dist/color/sensor-color-development.js.map +1 -0
- package/dist/color/white-balance.d.ts +175 -0
- package/dist/color/white-balance.d.ts.map +1 -0
- package/dist/color/white-balance.js +606 -0
- package/dist/color/white-balance.js.map +1 -0
- package/dist/composition/image-formation-plan.d.ts +481 -0
- package/dist/composition/image-formation-plan.d.ts.map +1 -0
- package/dist/composition/image-formation-plan.js +2499 -0
- package/dist/composition/image-formation-plan.js.map +1 -0
- package/dist/composition/plan-consumer.d.ts +53 -0
- package/dist/composition/plan-consumer.d.ts.map +1 -0
- package/dist/composition/plan-consumer.js +119 -0
- package/dist/composition/plan-consumer.js.map +1 -0
- package/dist/core/calculation-result.d.ts.map +1 -1
- package/dist/core/calculation-result.js +6 -0
- package/dist/core/calculation-result.js.map +1 -1
- package/dist/core/canonical-json.d.ts +18 -0
- package/dist/core/canonical-json.d.ts.map +1 -0
- package/dist/core/canonical-json.js +44 -0
- package/dist/core/canonical-json.js.map +1 -0
- package/dist/core/configuration-error.d.ts +6 -0
- package/dist/core/configuration-error.d.ts.map +1 -1
- package/dist/core/configuration-error.js +6 -0
- package/dist/core/configuration-error.js.map +1 -1
- package/dist/core/evidence-provenance.d.ts +6 -0
- package/dist/core/evidence-provenance.d.ts.map +1 -1
- package/dist/core/evidence-provenance.js +7 -0
- package/dist/core/evidence-provenance.js.map +1 -1
- package/dist/core/image-formation.d.ts +9 -3
- package/dist/core/image-formation.d.ts.map +1 -1
- package/dist/core/image-formation.js +29 -5
- package/dist/core/image-formation.js.map +1 -1
- package/dist/core/owned-data.d.ts +25 -0
- package/dist/core/owned-data.d.ts.map +1 -0
- package/dist/core/owned-data.js +34 -0
- package/dist/core/owned-data.js.map +1 -0
- package/dist/core/record-validation.d.ts +17 -0
- package/dist/core/record-validation.d.ts.map +1 -0
- package/dist/core/record-validation.js +44 -0
- package/dist/core/record-validation.js.map +1 -0
- package/dist/core/scientific-assurance.d.ts +101 -0
- package/dist/core/scientific-assurance.d.ts.map +1 -0
- package/dist/core/scientific-assurance.js +301 -0
- package/dist/core/scientific-assurance.js.map +1 -0
- package/dist/core/spectral-composition.d.ts +106 -0
- package/dist/core/spectral-composition.d.ts.map +1 -0
- package/dist/core/spectral-composition.js +334 -0
- package/dist/core/spectral-composition.js.map +1 -0
- package/dist/core/spectral.d.ts +34 -0
- package/dist/core/spectral.d.ts.map +1 -0
- package/dist/core/spectral.js +57 -0
- package/dist/core/spectral.js.map +1 -0
- package/dist/core/validation.d.ts +6 -0
- package/dist/core/validation.d.ts.map +1 -1
- package/dist/core/validation.js +6 -0
- package/dist/core/validation.js.map +1 -1
- package/dist/core/version.d.ts +14 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/core/version.js +15 -0
- package/dist/core/version.js.map +1 -0
- package/dist/equipment/exposure-capabilities.d.ts +125 -0
- package/dist/equipment/exposure-capabilities.d.ts.map +1 -0
- package/dist/equipment/exposure-capabilities.js +391 -0
- package/dist/equipment/exposure-capabilities.js.map +1 -0
- package/dist/equipment/generic-tier-assets.d.ts +82 -0
- package/dist/equipment/generic-tier-assets.d.ts.map +1 -0
- package/dist/equipment/generic-tier-assets.js +119 -0
- package/dist/equipment/generic-tier-assets.js.map +1 -0
- package/dist/equipment/generic-tier-presets.d.ts +57 -0
- package/dist/equipment/generic-tier-presets.d.ts.map +1 -0
- package/dist/equipment/generic-tier-presets.js +122 -0
- package/dist/equipment/generic-tier-presets.js.map +1 -0
- package/dist/equipment/iso-capabilities.d.ts +143 -0
- package/dist/equipment/iso-capabilities.d.ts.map +1 -0
- package/dist/equipment/iso-capabilities.js +578 -0
- package/dist/equipment/iso-capabilities.js.map +1 -0
- package/dist/equipment/metering-capabilities.d.ts +58 -0
- package/dist/equipment/metering-capabilities.d.ts.map +1 -0
- package/dist/equipment/metering-capabilities.js +151 -0
- package/dist/equipment/metering-capabilities.js.map +1 -0
- package/dist/equipment/release-capabilities.d.ts +33 -0
- package/dist/equipment/release-capabilities.d.ts.map +1 -0
- package/dist/equipment/release-capabilities.js +176 -0
- package/dist/equipment/release-capabilities.js.map +1 -0
- package/dist/exposure/exposure-duration-control.d.ts +72 -0
- package/dist/exposure/exposure-duration-control.d.ts.map +1 -0
- package/dist/exposure/exposure-duration-control.js +161 -0
- package/dist/exposure/exposure-duration-control.js.map +1 -0
- package/dist/exposure/exposure-mode-resolver.d.ts +637 -0
- package/dist/exposure/exposure-mode-resolver.d.ts.map +1 -0
- package/dist/exposure/exposure-mode-resolver.js +1905 -0
- package/dist/exposure/exposure-mode-resolver.js.map +1 -0
- package/dist/exposure/exposure.d.ts +8 -0
- package/dist/exposure/exposure.d.ts.map +1 -1
- package/dist/exposure/exposure.js +8 -0
- package/dist/exposure/exposure.js.map +1 -1
- package/dist/exposure/flash.d.ts +179 -0
- package/dist/exposure/flash.d.ts.map +1 -0
- package/dist/exposure/flash.js +644 -0
- package/dist/exposure/flash.js.map +1 -0
- package/dist/exposure/metering-scene-radiance.d.ts +72 -0
- package/dist/exposure/metering-scene-radiance.d.ts.map +1 -0
- package/dist/exposure/metering-scene-radiance.js +222 -0
- package/dist/exposure/metering-scene-radiance.js.map +1 -0
- package/dist/exposure/metering-target.d.ts +67 -0
- package/dist/exposure/metering-target.d.ts.map +1 -0
- package/dist/exposure/metering-target.js +265 -0
- package/dist/exposure/metering-target.js.map +1 -0
- package/dist/exposure/metering-temporal.d.ts +76 -0
- package/dist/exposure/metering-temporal.d.ts.map +1 -0
- package/dist/exposure/metering-temporal.js +210 -0
- package/dist/exposure/metering-temporal.js.map +1 -0
- package/dist/exposure/metering.d.ts +124 -0
- package/dist/exposure/metering.d.ts.map +1 -0
- package/dist/exposure/metering.js +422 -0
- package/dist/exposure/metering.js.map +1 -0
- package/dist/exposure/program-line.d.ts +29 -0
- package/dist/exposure/program-line.d.ts.map +1 -0
- package/dist/exposure/program-line.js +126 -0
- package/dist/exposure/program-line.js.map +1 -0
- package/dist/index.d.ts +101 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +99 -7
- package/dist/index.js.map +1 -1
- package/dist/motion/camera-rotation.d.ts +76 -0
- package/dist/motion/camera-rotation.d.ts.map +1 -1
- package/dist/motion/camera-rotation.js +111 -0
- package/dist/motion/camera-rotation.js.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts +113 -0
- package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +1 -0
- package/dist/motion/capture-rotation-inverse-mapping.js +184 -0
- package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -0
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts +104 -0
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +1 -0
- package/dist/motion/capture-rotation-temporal-quadrature.js +131 -0
- package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -0
- package/dist/motion/capture-rotation-trajectory.d.ts +113 -0
- package/dist/motion/capture-rotation-trajectory.d.ts.map +1 -0
- package/dist/motion/capture-rotation-trajectory.js +168 -0
- package/dist/motion/capture-rotation-trajectory.js.map +1 -0
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +119 -0
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +1 -0
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js +263 -0
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -0
- package/dist/motion/extended-object-projection.d.ts +175 -0
- package/dist/motion/extended-object-projection.d.ts.map +1 -0
- package/dist/motion/extended-object-projection.js +402 -0
- package/dist/motion/extended-object-projection.js.map +1 -0
- package/dist/motion/projected-motion.d.ts +11 -0
- package/dist/motion/projected-motion.d.ts.map +1 -1
- package/dist/motion/projected-motion.js +11 -0
- package/dist/motion/projected-motion.js.map +1 -1
- package/dist/optics/aperture.d.ts +9 -0
- package/dist/optics/aperture.d.ts.map +1 -1
- package/dist/optics/aperture.js +9 -0
- package/dist/optics/aperture.js.map +1 -1
- package/dist/optics/circle-of-confusion.d.ts +8 -0
- package/dist/optics/circle-of-confusion.d.ts.map +1 -1
- package/dist/optics/circle-of-confusion.js +8 -0
- package/dist/optics/circle-of-confusion.js.map +1 -1
- package/dist/optics/complex-pupil-psf.d.ts +128 -0
- package/dist/optics/complex-pupil-psf.d.ts.map +1 -0
- package/dist/optics/complex-pupil-psf.js +462 -0
- package/dist/optics/complex-pupil-psf.js.map +1 -0
- package/dist/optics/depth-of-field.d.ts +18 -0
- package/dist/optics/depth-of-field.d.ts.map +1 -1
- package/dist/optics/depth-of-field.js +29 -4
- package/dist/optics/depth-of-field.js.map +1 -1
- package/dist/optics/diffraction.d.ts +8 -0
- package/dist/optics/diffraction.d.ts.map +1 -1
- package/dist/optics/diffraction.js +8 -0
- package/dist/optics/diffraction.js.map +1 -1
- package/dist/optics/focus-breathing.d.ts +13 -0
- package/dist/optics/focus-breathing.d.ts.map +1 -1
- package/dist/optics/focus-breathing.js +13 -0
- package/dist/optics/focus-breathing.js.map +1 -1
- package/dist/optics/focus-state.d.ts +47 -0
- package/dist/optics/focus-state.d.ts.map +1 -0
- package/dist/optics/focus-state.js +78 -0
- package/dist/optics/focus-state.js.map +1 -0
- package/dist/optics/front-of-lens-filter.d.ts +114 -0
- package/dist/optics/front-of-lens-filter.d.ts.map +1 -0
- package/dist/optics/front-of-lens-filter.js +468 -0
- package/dist/optics/front-of-lens-filter.js.map +1 -0
- package/dist/optics/illumination-vignetting.d.ts +9 -0
- package/dist/optics/illumination-vignetting.d.ts.map +1 -1
- package/dist/optics/illumination-vignetting.js +9 -0
- package/dist/optics/illumination-vignetting.js.map +1 -1
- package/dist/optics/lateral-chromatic-aberration.d.ts +11 -0
- package/dist/optics/lateral-chromatic-aberration.d.ts.map +1 -1
- package/dist/optics/lateral-chromatic-aberration.js +23 -4
- package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
- package/dist/optics/lens-psf-profile.d.ts +217 -0
- package/dist/optics/lens-psf-profile.d.ts.map +1 -0
- package/dist/optics/lens-psf-profile.js +823 -0
- package/dist/optics/lens-psf-profile.js.map +1 -0
- package/dist/optics/polygon-diffraction.d.ts +67 -0
- package/dist/optics/polygon-diffraction.d.ts.map +1 -0
- package/dist/optics/polygon-diffraction.js +145 -0
- package/dist/optics/polygon-diffraction.js.map +1 -0
- package/dist/optics/profile-contract.d.ts +42 -0
- package/dist/optics/profile-contract.d.ts.map +1 -0
- package/dist/optics/profile-contract.js +92 -0
- package/dist/optics/profile-contract.js.map +1 -0
- package/dist/optics/psf-foundation.d.ts +16 -3
- package/dist/optics/psf-foundation.d.ts.map +1 -1
- package/dist/optics/psf-foundation.js +28 -15
- package/dist/optics/psf-foundation.js.map +1 -1
- package/dist/optics/radial-distortion.d.ts +22 -2
- package/dist/optics/radial-distortion.d.ts.map +1 -1
- package/dist/optics/radial-distortion.js +101 -23
- package/dist/optics/radial-distortion.js.map +1 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts +213 -0
- package/dist/optics/scene-to-sensor-irradiance.d.ts.map +1 -0
- package/dist/optics/scene-to-sensor-irradiance.js +662 -0
- package/dist/optics/scene-to-sensor-irradiance.js.map +1 -0
- package/dist/optics/scene-to-sensor-quadrature.d.ts +63 -0
- package/dist/optics/scene-to-sensor-quadrature.d.ts.map +1 -0
- package/dist/optics/scene-to-sensor-quadrature.js +82 -0
- package/dist/optics/scene-to-sensor-quadrature.js.map +1 -0
- package/dist/optics/sensor-environment-query.d.ts +60 -0
- package/dist/optics/sensor-environment-query.d.ts.map +1 -0
- package/dist/optics/sensor-environment-query.js +50 -0
- package/dist/optics/sensor-environment-query.js.map +1 -0
- package/dist/optics/sensor-psf-quadrature.d.ts +70 -0
- package/dist/optics/sensor-psf-quadrature.d.ts.map +1 -0
- package/dist/optics/sensor-psf-quadrature.js +101 -0
- package/dist/optics/sensor-psf-quadrature.js.map +1 -0
- package/dist/optics/sensor-psf-support.d.ts +20 -0
- package/dist/optics/sensor-psf-support.d.ts.map +1 -0
- package/dist/optics/sensor-psf-support.js +13 -0
- package/dist/optics/sensor-psf-support.js.map +1 -0
- package/dist/optics/stray-light.d.ts +91 -0
- package/dist/optics/stray-light.d.ts.map +1 -0
- package/dist/optics/stray-light.js +110 -0
- package/dist/optics/stray-light.js.map +1 -0
- package/dist/optics/thin-lens.d.ts +8 -0
- package/dist/optics/thin-lens.d.ts.map +1 -1
- package/dist/optics/thin-lens.js +8 -0
- package/dist/optics/thin-lens.js.map +1 -1
- package/dist/output/capture-corrected-sdr.d.ts +49 -0
- package/dist/output/capture-corrected-sdr.d.ts.map +1 -0
- package/dist/output/capture-corrected-sdr.js +149 -0
- package/dist/output/capture-corrected-sdr.js.map +1 -0
- package/dist/output/capture-geometry.d.ts.map +1 -1
- package/dist/output/capture-geometry.js +32 -11
- package/dist/output/capture-geometry.js.map +1 -1
- package/dist/output/capture-sdr.d.ts +49 -0
- package/dist/output/capture-sdr.d.ts.map +1 -0
- package/dist/output/capture-sdr.js +90 -0
- package/dist/output/capture-sdr.js.map +1 -0
- package/dist/output/crop.d.ts +6 -0
- package/dist/output/crop.d.ts.map +1 -1
- package/dist/output/crop.js +6 -0
- package/dist/output/crop.js.map +1 -1
- package/dist/output/geometric-transforms.d.ts +137 -0
- package/dist/output/geometric-transforms.d.ts.map +1 -0
- package/dist/output/geometric-transforms.js +225 -0
- package/dist/output/geometric-transforms.js.map +1 -0
- package/dist/output/lens-corrections.d.ts +121 -0
- package/dist/output/lens-corrections.d.ts.map +1 -0
- package/dist/output/lens-corrections.js +210 -0
- package/dist/output/lens-corrections.js.map +1 -0
- package/dist/output/sdr-rendering.d.ts +81 -0
- package/dist/output/sdr-rendering.d.ts.map +1 -0
- package/dist/output/sdr-rendering.js +106 -0
- package/dist/output/sdr-rendering.js.map +1 -0
- package/dist/output/subject-framing-crop.d.ts +8 -0
- package/dist/output/subject-framing-crop.d.ts.map +1 -1
- package/dist/output/subject-framing-crop.js +8 -0
- package/dist/output/subject-framing-crop.js.map +1 -1
- package/dist/schema/camera.d.ts +6 -0
- package/dist/schema/camera.d.ts.map +1 -1
- package/dist/schema/illumination-spectral.d.ts +51 -0
- package/dist/schema/illumination-spectral.d.ts.map +1 -0
- package/dist/schema/illumination-spectral.js +132 -0
- package/dist/schema/illumination-spectral.js.map +1 -0
- package/dist/schema/illumination-temporal.d.ts +156 -0
- package/dist/schema/illumination-temporal.d.ts.map +1 -0
- package/dist/schema/illumination-temporal.js +554 -0
- package/dist/schema/illumination-temporal.js.map +1 -0
- package/dist/schema/illumination.d.ts +138 -0
- package/dist/schema/illumination.d.ts.map +1 -0
- package/dist/schema/illumination.js +483 -0
- package/dist/schema/illumination.js.map +1 -0
- package/dist/schema/scene-radiance-temporal.d.ts +107 -0
- package/dist/schema/scene-radiance-temporal.d.ts.map +1 -0
- package/dist/schema/scene-radiance-temporal.js +259 -0
- package/dist/schema/scene-radiance-temporal.js.map +1 -0
- package/dist/schema/scene-radiance.d.ts +185 -0
- package/dist/schema/scene-radiance.d.ts.map +1 -0
- package/dist/schema/scene-radiance.js +535 -0
- package/dist/schema/scene-radiance.js.map +1 -0
- package/dist/schema/scene.d.ts +7 -0
- package/dist/schema/scene.d.ts.map +1 -1
- package/dist/schema/validation.d.ts.map +1 -1
- package/dist/schema/validation.js +7 -0
- package/dist/schema/validation.js.map +1 -1
- package/dist/sensor/accumulated-charge.d.ts +199 -0
- package/dist/sensor/accumulated-charge.d.ts.map +1 -0
- package/dist/sensor/accumulated-charge.js +450 -0
- package/dist/sensor/accumulated-charge.js.map +1 -0
- package/dist/sensor/architecture.d.ts +48 -13
- package/dist/sensor/architecture.d.ts.map +1 -1
- package/dist/sensor/architecture.js +58 -16
- package/dist/sensor/architecture.js.map +1 -1
- package/dist/sensor/camera-saturation-capacity.d.ts +138 -0
- package/dist/sensor/camera-saturation-capacity.d.ts.map +1 -0
- package/dist/sensor/camera-saturation-capacity.js +356 -0
- package/dist/sensor/camera-saturation-capacity.js.map +1 -0
- package/dist/sensor/capture-color-sampling-binding.d.ts +212 -0
- package/dist/sensor/capture-color-sampling-binding.d.ts.map +1 -0
- package/dist/sensor/capture-color-sampling-binding.js +437 -0
- package/dist/sensor/capture-color-sampling-binding.js.map +1 -0
- package/dist/sensor/capture-mode-timing.d.ts +63 -0
- package/dist/sensor/capture-mode-timing.d.ts.map +1 -0
- package/dist/sensor/capture-mode-timing.js +270 -0
- package/dist/sensor/capture-mode-timing.js.map +1 -0
- package/dist/sensor/capture-mode.d.ts +157 -0
- package/dist/sensor/capture-mode.d.ts.map +1 -0
- package/dist/sensor/capture-mode.js +447 -0
- package/dist/sensor/capture-mode.js.map +1 -0
- package/dist/sensor/color-sampling.d.ts +133 -0
- package/dist/sensor/color-sampling.d.ts.map +1 -0
- package/dist/sensor/color-sampling.js +245 -0
- package/dist/sensor/color-sampling.js.map +1 -0
- package/dist/sensor/constant-rate-temporal-integration.d.ts +126 -0
- package/dist/sensor/constant-rate-temporal-integration.d.ts.map +1 -0
- package/dist/sensor/constant-rate-temporal-integration.js +382 -0
- package/dist/sensor/constant-rate-temporal-integration.js.map +1 -0
- package/dist/sensor/dark-current.d.ts +169 -0
- package/dist/sensor/dark-current.d.ts.map +1 -0
- package/dist/sensor/dark-current.js +427 -0
- package/dist/sensor/dark-current.js.map +1 -0
- package/dist/sensor/environment-photo-signal.d.ts +123 -0
- package/dist/sensor/environment-photo-signal.d.ts.map +1 -0
- package/dist/sensor/environment-photo-signal.js +186 -0
- package/dist/sensor/environment-photo-signal.js.map +1 -0
- package/dist/sensor/eqe-electron-rate.d.ts +107 -0
- package/dist/sensor/eqe-electron-rate.d.ts.map +1 -0
- package/dist/sensor/eqe-electron-rate.js +561 -0
- package/dist/sensor/eqe-electron-rate.js.map +1 -0
- package/dist/sensor/eqe-local-exposure.d.ts +65 -0
- package/dist/sensor/eqe-local-exposure.d.ts.map +1 -0
- package/dist/sensor/eqe-local-exposure.js +84 -0
- package/dist/sensor/eqe-local-exposure.js.map +1 -0
- package/dist/sensor/eqe-temporal-exposure.d.ts +55 -0
- package/dist/sensor/eqe-temporal-exposure.d.ts.map +1 -0
- package/dist/sensor/eqe-temporal-exposure.js +62 -0
- package/dist/sensor/eqe-temporal-exposure.js.map +1 -0
- package/dist/sensor/exposure-window.d.ts +117 -0
- package/dist/sensor/exposure-window.d.ts.map +1 -0
- package/dist/sensor/exposure-window.js +305 -0
- package/dist/sensor/exposure-window.js.map +1 -0
- package/dist/sensor/iso-signal-chain.d.ts +148 -0
- package/dist/sensor/iso-signal-chain.d.ts.map +1 -0
- package/dist/sensor/iso-signal-chain.js +411 -0
- package/dist/sensor/iso-signal-chain.js.map +1 -0
- package/dist/sensor/local-exposure-binding.d.ts +87 -0
- package/dist/sensor/local-exposure-binding.d.ts.map +1 -0
- package/dist/sensor/local-exposure-binding.js +214 -0
- package/dist/sensor/local-exposure-binding.js.map +1 -0
- package/dist/sensor/optical-stack.d.ts +132 -0
- package/dist/sensor/optical-stack.d.ts.map +1 -0
- package/dist/sensor/optical-stack.js +303 -0
- package/dist/sensor/optical-stack.js.map +1 -0
- package/dist/sensor/photon-energy.d.ts +97 -0
- package/dist/sensor/photon-energy.d.ts.map +1 -0
- package/dist/sensor/photon-energy.js +390 -0
- package/dist/sensor/photon-energy.js.map +1 -0
- package/dist/sensor/physical-charge-capacity.d.ts +130 -0
- package/dist/sensor/physical-charge-capacity.d.ts.map +1 -0
- package/dist/sensor/physical-charge-capacity.js +345 -0
- package/dist/sensor/physical-charge-capacity.js.map +1 -0
- package/dist/sensor/pixel-pitch.d.ts +6 -0
- package/dist/sensor/pixel-pitch.d.ts.map +1 -1
- package/dist/sensor/pixel-pitch.js +6 -0
- package/dist/sensor/pixel-pitch.js.map +1 -1
- package/dist/sensor/radiometry-readiness.d.ts +10 -0
- package/dist/sensor/radiometry-readiness.d.ts.map +1 -1
- package/dist/sensor/radiometry-readiness.js +10 -0
- package/dist/sensor/radiometry-readiness.js.map +1 -1
- package/dist/sensor/raw-readout.d.ts +314 -0
- package/dist/sensor/raw-readout.d.ts.map +1 -0
- package/dist/sensor/raw-readout.js +914 -0
- package/dist/sensor/raw-readout.js.map +1 -0
- package/dist/sensor/raw-reconstruction.d.ts +170 -0
- package/dist/sensor/raw-reconstruction.d.ts.map +1 -0
- package/dist/sensor/raw-reconstruction.js +424 -0
- package/dist/sensor/raw-reconstruction.js.map +1 -0
- package/dist/sensor/readout-exposure-linkage.d.ts +123 -0
- package/dist/sensor/readout-exposure-linkage.d.ts.map +1 -0
- package/dist/sensor/readout-exposure-linkage.js +222 -0
- package/dist/sensor/readout-exposure-linkage.js.map +1 -0
- package/dist/sensor/readout-timing.d.ts +137 -0
- package/dist/sensor/readout-timing.d.ts.map +1 -0
- package/dist/sensor/readout-timing.js +243 -0
- package/dist/sensor/readout-timing.js.map +1 -0
- package/dist/sensor/response-application-compatibility.d.ts +136 -0
- package/dist/sensor/response-application-compatibility.d.ts.map +1 -0
- package/dist/sensor/response-application-compatibility.js +408 -0
- package/dist/sensor/response-application-compatibility.js.map +1 -0
- package/dist/sensor/response-operating-range.d.ts +173 -0
- package/dist/sensor/response-operating-range.d.ts.map +1 -0
- package/dist/sensor/response-operating-range.js +672 -0
- package/dist/sensor/response-operating-range.js.map +1 -0
- package/dist/sensor/responsivity-photocurrent.d.ts +158 -0
- package/dist/sensor/responsivity-photocurrent.d.ts.map +1 -0
- package/dist/sensor/responsivity-photocurrent.js +644 -0
- package/dist/sensor/responsivity-photocurrent.js.map +1 -0
- package/dist/sensor/sampling-aperture.d.ts +154 -0
- package/dist/sensor/sampling-aperture.d.ts.map +1 -0
- package/dist/sensor/sampling-aperture.js +388 -0
- package/dist/sensor/sampling-aperture.js.map +1 -0
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts +45 -0
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +1 -0
- package/dist/sensor/scene-eqe-temporal-exposure.js +64 -0
- package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -0
- package/dist/sensor/sensor-geometry.d.ts +12 -0
- package/dist/sensor/sensor-geometry.d.ts.map +1 -1
- package/dist/sensor/sensor-geometry.js +12 -0
- package/dist/sensor/sensor-geometry.js.map +1 -1
- package/dist/sensor/signal-noise.d.ts +10 -0
- package/dist/sensor/signal-noise.d.ts.map +1 -1
- package/dist/sensor/signal-noise.js +10 -0
- package/dist/sensor/signal-noise.js.map +1 -1
- package/dist/sensor/spatial-sample-reduction.d.ts +171 -0
- package/dist/sensor/spatial-sample-reduction.d.ts.map +1 -0
- package/dist/sensor/spatial-sample-reduction.js +345 -0
- package/dist/sensor/spatial-sample-reduction.js.map +1 -0
- package/dist/sensor/spatial-sampling-quadrature.d.ts +179 -0
- package/dist/sensor/spatial-sampling-quadrature.d.ts.map +1 -0
- package/dist/sensor/spatial-sampling-quadrature.js +224 -0
- package/dist/sensor/spatial-sampling-quadrature.js.map +1 -0
- package/dist/sensor/spatio-spectral-reduction.d.ts +187 -0
- package/dist/sensor/spatio-spectral-reduction.d.ts.map +1 -0
- package/dist/sensor/spatio-spectral-reduction.js +373 -0
- package/dist/sensor/spatio-spectral-reduction.js.map +1 -0
- package/dist/sensor/spectral-coverage.d.ts +24 -0
- package/dist/sensor/spectral-coverage.d.ts.map +1 -0
- package/dist/sensor/spectral-coverage.js +86 -0
- package/dist/sensor/spectral-coverage.js.map +1 -0
- package/dist/sensor/spectral-quadrature.d.ts +169 -0
- package/dist/sensor/spectral-quadrature.d.ts.map +1 -0
- package/dist/sensor/spectral-quadrature.js +542 -0
- package/dist/sensor/spectral-quadrature.js.map +1 -0
- package/dist/sensor/spectral-response.d.ts +192 -0
- package/dist/sensor/spectral-response.d.ts.map +1 -0
- package/dist/sensor/spectral-response.js +664 -0
- package/dist/sensor/spectral-response.js.map +1 -0
- package/dist/sensor/temporal-eqe-sum.d.ts +15 -0
- package/dist/sensor/temporal-eqe-sum.d.ts.map +1 -0
- package/dist/sensor/temporal-eqe-sum.js +30 -0
- package/dist/sensor/temporal-eqe-sum.js.map +1 -0
- package/dist/sensor/temporal-photo-signal.d.ts +38 -0
- package/dist/sensor/temporal-photo-signal.d.ts.map +1 -0
- package/dist/sensor/temporal-photo-signal.js +110 -0
- package/dist/sensor/temporal-photo-signal.js.map +1 -0
- package/dist/sensor/temporal-sample-binding.d.ts +6 -0
- package/dist/sensor/temporal-sample-binding.d.ts.map +1 -0
- package/dist/sensor/temporal-sample-binding.js +32 -0
- package/dist/sensor/temporal-sample-binding.js.map +1 -0
- package/dist/simulation/poc-simulation.d.ts.map +1 -1
- package/dist/simulation/poc-simulation.js +34 -11
- package/dist/simulation/poc-simulation.js.map +1 -1
- package/dist/stabilization/camera-shake.d.ts +11 -0
- package/dist/stabilization/camera-shake.d.ts.map +1 -1
- package/dist/stabilization/camera-shake.js +11 -0
- package/dist/stabilization/camera-shake.js.map +1 -1
- package/dist/stabilization/system.d.ts +218 -0
- package/dist/stabilization/system.d.ts.map +1 -0
- package/dist/stabilization/system.js +695 -0
- package/dist/stabilization/system.js.map +1 -0
- package/docs/API_REFERENCE.md +2017 -0
- package/docs/API_STYLE.md +132 -0
- package/docs/ARCHITECTURE.md +150 -23
- package/docs/AUTOMATION_COORDINATION.md +190 -0
- package/docs/CAPTURE_COLOR.md +25 -0
- package/docs/CAPTURE_CORRECTED_SDR.md +25 -0
- package/docs/CAPTURE_EXPORT_METADATA.md +27 -0
- package/docs/CAPTURE_SDR.md +20 -0
- package/docs/DEVELOPERS.md +60 -0
- package/docs/DIGITAL_OPTICS_FOUNDATION.md +69 -0
- package/docs/ENVIRONMENT_RAW_CAPTURE.md +187 -0
- package/docs/EXPORT_ACCEPTANCE.md +133 -0
- package/docs/GENERIC_TIER_PRESETS.md +269 -0
- package/docs/GEOMETRIC_PREPARATION_REUSE.md +141 -0
- package/docs/IMAGE_FORMATION.md +105 -9
- package/docs/LINEAR_CAPTURE_ENCODING.md +25 -0
- package/docs/MOTION_AND_SIGNAL.md +145 -1
- package/docs/NUMERICAL_CORRECTNESS.md +191 -0
- package/docs/PERFORMANCE_BASELINE.md +56 -0
- package/docs/PHOTOGRAPHIC_EXPORT.md +206 -0
- package/docs/PHYSICS_FOUNDATION.md +152 -5
- package/docs/POC_API.md +2 -0
- package/docs/POC_PROJECTION_REUSE.md +124 -0
- package/docs/PROCESSED_OUTPUT.md +157 -0
- package/docs/PRODUCTION_COMPOSITION.md +373 -0
- package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +131 -0
- package/docs/PROVENANCE.md +4 -0
- package/docs/PSF_FOUNDATION.md +110 -88
- package/docs/RAW_FRAME_ENVELOPE.md +56 -0
- package/docs/RAW_FRAME_RECONSTRUCTION.md +30 -0
- package/docs/RELEASE_1_0.md +65 -0
- package/docs/RELEASE_AUDIT.md +38 -0
- package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +298 -0
- package/docs/SCENE_SENSOR_QUADRATURE.md +98 -0
- package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +86 -0
- package/docs/SCIENTIFIC_ASSURANCE.md +280 -0
- package/docs/SCIENTIFIC_CONFORMANCE.md +83 -0
- package/docs/SDR_RENDERING.md +33 -0
- package/docs/SENSOR_ENVIRONMENT_QUERY.md +86 -0
- package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +104 -0
- package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +74 -0
- package/docs/SENSOR_PSF_QUADRATURE.md +90 -0
- package/docs/SENSOR_RAW_FRAME.md +20 -0
- package/docs/SENSOR_RAW_PRODUCER.md +77 -0
- package/docs/SIGNAL_CONFORMANCE.md +23 -0
- package/docs/SIMULATED_CAPTURE.md +65 -0
- package/docs/STABILIZATION.md +160 -17
- package/docs/TEMPORAL_PHOTO_RAW.md +83 -0
- package/docs/TIER_ACCEPTANCE.md +129 -0
- package/docs/TIER_PRESET_ACCEPTANCE.md +59 -0
- package/docs/USAGE.md +5604 -331
- package/docs/V1_COMPOSITION_MAP.md +123 -0
- package/docs/V1_HELPER_REUSE_REVIEW.md +60 -0
- package/docs/V1_PERFORMANCE_DISPOSITION.md +88 -0
- package/docs/api/camera-equivalent-focal-length.md +53 -0
- package/docs/api/camera-field-of-view.md +119 -0
- package/docs/api/camera-projected-object-size.md +54 -0
- package/docs/api/capture-capture-export-metadata.md +107 -0
- package/docs/api/capture-environment-raw-producer.md +56 -0
- package/docs/api/capture-focus-control.md +419 -0
- package/docs/api/capture-linear-encoding.md +99 -0
- package/docs/api/capture-photographic-export.md +172 -0
- package/docs/api/capture-raw-frame-reconstruction.md +87 -0
- package/docs/api/capture-release-sequence.md +252 -0
- package/docs/api/capture-sensor-raw-frame.md +66 -0
- package/docs/api/capture-sensor-raw-producer.md +98 -0
- package/docs/api/capture-simulated-capture.md +179 -0
- package/docs/api/color-capture-color.md +122 -0
- package/docs/api/color-white-balance.md +386 -0
- package/docs/api/composition-image-formation-plan.md +825 -0
- package/docs/api/composition-plan-consumer.md +98 -0
- package/docs/api/core-calculation-result.md +220 -0
- package/docs/api/core-configuration-error.md +19 -0
- package/docs/api/core-image-formation.md +204 -0
- package/docs/api/core-scientific-assurance.md +214 -0
- package/docs/api/core-spectral-composition.md +268 -0
- package/docs/api/core-spectral.md +78 -0
- package/docs/api/core-validation.md +34 -0
- package/docs/api/core-version.md +14 -0
- package/docs/api/equipment-exposure-capabilities.md +270 -0
- package/docs/api/equipment-generic-tier-assets.md +82 -0
- package/docs/api/equipment-generic-tier-presets.md +103 -0
- package/docs/api/equipment-iso-capabilities.md +295 -0
- package/docs/api/equipment-metering-capabilities.md +126 -0
- package/docs/api/equipment-release-capabilities.md +91 -0
- package/docs/api/exports.json +5656 -0
- package/docs/api/exposure-exposure-duration-control.md +115 -0
- package/docs/api/exposure-exposure-mode-resolver.md +966 -0
- package/docs/api/exposure-exposure.md +150 -0
- package/docs/api/exposure-flash.md +327 -0
- package/docs/api/exposure-metering-scene-radiance.md +154 -0
- package/docs/api/exposure-metering-target.md +134 -0
- package/docs/api/exposure-metering-temporal.md +77 -0
- package/docs/api/exposure-metering.md +172 -0
- package/docs/api/exposure-program-line.md +64 -0
- package/docs/api/motion-camera-rotation.md +215 -0
- package/docs/api/motion-capture-rotation-inverse-mapping.md +128 -0
- package/docs/api/motion-capture-rotation-temporal-quadrature.md +127 -0
- package/docs/api/motion-capture-rotation-trajectory.md +132 -0
- package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +171 -0
- package/docs/api/motion-extended-object-projection.md +312 -0
- package/docs/api/motion-projected-motion.md +60 -0
- package/docs/api/optics-aperture.md +69 -0
- package/docs/api/optics-circle-of-confusion.md +46 -0
- package/docs/api/optics-complex-pupil-psf.md +193 -0
- package/docs/api/optics-depth-of-field.md +92 -0
- package/docs/api/optics-diffraction.md +46 -0
- package/docs/api/optics-focus-breathing.md +119 -0
- package/docs/api/optics-focus-state.md +64 -0
- package/docs/api/optics-front-of-lens-filter.md +263 -0
- package/docs/api/optics-illumination-vignetting.md +95 -0
- package/docs/api/optics-lateral-chromatic-aberration.md +225 -0
- package/docs/api/optics-lens-psf-profile.md +380 -0
- package/docs/api/optics-polygon-diffraction.md +68 -0
- package/docs/api/optics-profile-contract.md +47 -0
- package/docs/api/optics-psf-foundation.md +181 -0
- package/docs/api/optics-radial-distortion.md +194 -0
- package/docs/api/optics-scene-to-sensor-irradiance.md +371 -0
- package/docs/api/optics-scene-to-sensor-quadrature.md +78 -0
- package/docs/api/optics-sensor-environment-query.md +58 -0
- package/docs/api/optics-sensor-psf-quadrature.md +81 -0
- package/docs/api/optics-stray-light.md +109 -0
- package/docs/api/optics-thin-lens.md +53 -0
- package/docs/api/output-capture-corrected-sdr.md +71 -0
- package/docs/api/output-capture-geometry.md +500 -0
- package/docs/api/output-capture-sdr.md +69 -0
- package/docs/api/output-crop.md +47 -0
- package/docs/api/output-geometric-transforms.md +199 -0
- package/docs/api/output-lens-corrections.md +162 -0
- package/docs/api/output-sdr-rendering.md +122 -0
- package/docs/api/output-subject-framing-crop.md +59 -0
- package/docs/api/schema-camera.md +84 -0
- package/docs/api/schema-illumination-spectral.md +77 -0
- package/docs/api/schema-illumination-temporal.md +289 -0
- package/docs/api/schema-illumination.md +246 -0
- package/docs/api/schema-scene-radiance-temporal.md +215 -0
- package/docs/api/schema-scene-radiance.md +415 -0
- package/docs/api/schema-scene.md +105 -0
- package/docs/api/schema-validation.md +25 -0
- package/docs/api/sensor-accumulated-charge.md +273 -0
- package/docs/api/sensor-architecture.md +155 -0
- package/docs/api/sensor-camera-saturation-capacity.md +215 -0
- package/docs/api/sensor-capture-color-sampling-binding.md +323 -0
- package/docs/api/sensor-capture-mode-timing.md +123 -0
- package/docs/api/sensor-capture-mode.md +321 -0
- package/docs/api/sensor-color-sampling.md +228 -0
- package/docs/api/sensor-constant-rate-temporal-integration.md +152 -0
- package/docs/api/sensor-dark-current.md +227 -0
- package/docs/api/sensor-environment-photo-signal.md +77 -0
- package/docs/api/sensor-eqe-electron-rate.md +166 -0
- package/docs/api/sensor-eqe-local-exposure.md +68 -0
- package/docs/api/sensor-eqe-temporal-exposure.md +73 -0
- package/docs/api/sensor-exposure-window.md +183 -0
- package/docs/api/sensor-iso-signal-chain.md +264 -0
- package/docs/api/sensor-local-exposure-binding.md +126 -0
- package/docs/api/sensor-optical-stack.md +211 -0
- package/docs/api/sensor-photon-energy.md +149 -0
- package/docs/api/sensor-physical-charge-capacity.md +196 -0
- package/docs/api/sensor-pixel-pitch.md +41 -0
- package/docs/api/sensor-radiometry-readiness.md +240 -0
- package/docs/api/sensor-raw-readout.md +499 -0
- package/docs/api/sensor-raw-reconstruction.md +260 -0
- package/docs/api/sensor-readout-exposure-linkage.md +172 -0
- package/docs/api/sensor-readout-timing.md +209 -0
- package/docs/api/sensor-response-application-compatibility.md +256 -0
- package/docs/api/sensor-response-operating-range.md +293 -0
- package/docs/api/sensor-responsivity-photocurrent.md +245 -0
- package/docs/api/sensor-sampling-aperture.md +221 -0
- package/docs/api/sensor-scene-eqe-temporal-exposure.md +56 -0
- package/docs/api/sensor-sensor-geometry.md +143 -0
- package/docs/api/sensor-signal-noise.md +75 -0
- package/docs/api/sensor-spatial-sample-reduction.md +186 -0
- package/docs/api/sensor-spatial-sampling-quadrature.md +188 -0
- package/docs/api/sensor-spatio-spectral-reduction.md +217 -0
- package/docs/api/sensor-spectral-coverage.md +33 -0
- package/docs/api/sensor-spectral-quadrature.md +183 -0
- package/docs/api/sensor-spectral-response.md +291 -0
- package/docs/api/sensor-temporal-photo-signal.md +62 -0
- package/docs/api/simulation-poc-simulation.md +364 -0
- package/docs/api/stabilization-camera-shake.md +71 -0
- package/docs/api/stabilization-system.md +442 -0
- package/docs/benchmarks/2026-10-01-main-baseline.json +694 -0
- package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +2190 -0
- package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +2423 -0
- package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +210 -0
- package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +187 -0
- package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +756 -0
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +711 -0
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +711 -0
- package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +885 -0
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +868 -0
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +868 -0
- package/docs/examples/production-capture.mjs +34 -0
- package/docs/examples/production-request.json +4613 -0
- package/docs/examples/quick-start.mjs +12 -0
- package/docs/validation/documentation-fragments.json +212 -0
- package/docs/validation/release-audit-inventory.json +1306 -0
- package/docs/validation/tier-acceptance-report-v1.json +2538 -0
- package/package.json +18 -4
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
# Generic equipment tier reference assets
|
|
2
|
+
|
|
3
|
+
Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
|
|
4
|
+
|
|
5
|
+
`resolveGenericEquipmentTierCatalog({ presetVersion: "1.0.0" })` returns immutable
|
|
6
|
+
Consumer, Prosumer and Professional body/lens reference bundles. These are
|
|
7
|
+
Photivra-owned synthetic educational approximations, with unquantified physical
|
|
8
|
+
uncertainty. They are not measured calibration, commercial camera emulation or a
|
|
9
|
+
universal ranking of real equipment.
|
|
10
|
+
|
|
11
|
+
The tier is a catalog key. Scientific functions consume the ordinary explicit
|
|
12
|
+
profiles; no tier multiplier enters their equations. Sensor format, native raster
|
|
13
|
+
and capture geometry remain caller-owned. All three initial lens forms are 50 mm
|
|
14
|
+
primes with a common f/4–f/16 capability range; prime/zoom and focal range are
|
|
15
|
+
separate asset properties rather than tier meanings. This first catalog contains
|
|
16
|
+
no zoom, macro, OIS or variable focal-length family.
|
|
17
|
+
|
|
18
|
+
## Exact selection and reference binding
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
import {
|
|
22
|
+
createGenericEquipmentTierSelection,
|
|
23
|
+
parseGenericEquipmentTierSelection,
|
|
24
|
+
resolveGenericEquipmentTierLensProfiles
|
|
25
|
+
} from "@photivra/engine";
|
|
26
|
+
|
|
27
|
+
const selection = createGenericEquipmentTierSelection({
|
|
28
|
+
presetVersion: "1.0.0",
|
|
29
|
+
bodyTier: "consumer",
|
|
30
|
+
lensTier: "professional"
|
|
31
|
+
});
|
|
32
|
+
const saved = parseGenericEquipmentTierSelection(
|
|
33
|
+
JSON.parse(JSON.stringify(selection))
|
|
34
|
+
);
|
|
35
|
+
const profiles = resolveGenericEquipmentTierLensProfiles({
|
|
36
|
+
selection: saved,
|
|
37
|
+
state: {
|
|
38
|
+
bodyId: "photivra-consumer-body", bodyVersion: "1.0.0",
|
|
39
|
+
lensId: "photivra-professional-prime", lensVersion: "1.0.0",
|
|
40
|
+
focalLengthMm: 50, aperture: 4, focusDistanceM: 5,
|
|
41
|
+
captureMode: "still", frameRateHz: 0, stabilizationMode: "off",
|
|
42
|
+
outputWidth: 600, outputHeight: 400
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Omitting `lensTier` pairs matching tiers; all nine pairings are allowed through
|
|
48
|
+
#109's capability resolver. The strict saved-selection parser binds exact IDs,
|
|
49
|
+
preset version and every profile reference, including versions on wrappers for
|
|
50
|
+
subsystems whose native profile lacks a version field. Unknown fields, missing
|
|
51
|
+
references, changed versions and a `latest` alias fail. It returns the canonical
|
|
52
|
+
immutable selection. Output dimensions must be explicit and valid; they do not
|
|
53
|
+
select sensor size. This module does not mutate the POC or production plan.
|
|
54
|
+
|
|
55
|
+
The optical resolver supports only the explicit still/reference acquisition
|
|
56
|
+
state above. Aperture capability does not authorize extrapolating optical data
|
|
57
|
+
outside f/4. Still stabilization must be off for this optical slice. It exposes:
|
|
58
|
+
|
|
59
|
+
- radial distortion and lateral-CA channel maps (the CA map already includes the
|
|
60
|
+
common radial base; do not apply that base twice);
|
|
61
|
+
- normalized illumination vignetting, separate breathing projection scale and
|
|
62
|
+
a synthetic flat 540–560 nm transmission reference;
|
|
63
|
+
- nine scalar Fraunhofer complex-pupil slices at center, mid-field (10, 6 mm),
|
|
64
|
+
corner (18, 12 mm), each at signed image-plane defocus −20, 0 and +20 µm;
|
|
65
|
+
- a 550 nm/vacuum clean-lens ghost/veil profile, and separately declared
|
|
66
|
+
reconstructed-linear geometry/CA/gain correction components.
|
|
67
|
+
|
|
68
|
+
The 5×5 pupil grids and OPD arrays are independently authored discrete reference
|
|
69
|
+
responses tagged to these exact contexts. They are not an inferred continuous
|
|
70
|
+
lens model or a physically calibrated prediction at arbitrary defocus. No
|
|
71
|
+
interpolation is offered. Normalized PSF shape energy remains one; relative pupil
|
|
72
|
+
throughput stays separate. Pupil clipping and illumination falloff are separate
|
|
73
|
+
contributions with distinct ownership. Their simultaneous production composition
|
|
74
|
+
is not defined here. LoCA, spectral bokeh, onion rings, texture rendering and
|
|
75
|
+
measured MTF are not implemented by these assets.
|
|
76
|
+
|
|
77
|
+
Correction transforms retain the established destination-to-source semantics.
|
|
78
|
+
Sequential common radial and channel-offset transforms are generic approximate
|
|
79
|
+
compensation; they do not claim the exact inverse of the combined optical CA
|
|
80
|
+
map. Gain is partial and amplifies sampled noise. Correction never recreates
|
|
81
|
+
photons, updates metering, regenerates noise or changes physical capture history.
|
|
82
|
+
The caller must provide any required source prefiltering; a resampler declaration
|
|
83
|
+
is a contract, not proof that prefiltering was performed.
|
|
84
|
+
|
|
85
|
+
## Curated declarations and tradeoffs
|
|
86
|
+
|
|
87
|
+
| Explicit body declaration | Consumer | Prosumer | Professional |
|
|
88
|
+
| --- | --- | --- | --- |
|
|
89
|
+
| Maximum standard exposure index | 6400 | 12800 | 25600 |
|
|
90
|
+
| Maximum declared cadence (fps) | 4 | 8 | 12 |
|
|
91
|
+
| Maximum logical sequence frames | 8 | 16 | 24 |
|
|
92
|
+
| Base electronic RMS read noise (electrons) | 6 | 3 | 2 |
|
|
93
|
+
| Data readout duration (seconds) | 0.030 | 0.015 | 0.008 |
|
|
94
|
+
| Pitch/yaw/roll stabilization gain | 0.35 | 0.65 | 0.85 |
|
|
95
|
+
| Continuous AF mode | unavailable | available | available |
|
|
96
|
+
| Highlight-weighted meter/ambience AWB | unavailable | available | available |
|
|
97
|
+
|
|
98
|
+
ISO selects explicit readout regimes on a finite power-of-two setting grid.
|
|
99
|
+
It is not a photon/noise equation. Full-well/storage physics is not inferred from
|
|
100
|
+
pre-ADC saturation or ADC white. AF uses the same ideal instantaneous actuator
|
|
101
|
+
for every tier; mode availability does not establish faster or more accurate
|
|
102
|
+
tracking. Data readout duration does not establish exposure scan or flash motion
|
|
103
|
+
geometry. Flash capabilities declare front/rear ordinary sync and no HSS; callers
|
|
104
|
+
must resolve actual exposure-window compatibility separately.
|
|
105
|
+
|
|
106
|
+
The lens declarations intentionally include a tradeoff: Professional has less
|
|
107
|
+
clipping/stray light and lower radial/CA coefficients, but more f/4 falloff and
|
|
108
|
+
peripheral gain cost than Prosumer. Near/far pupil character also differs rather
|
|
109
|
+
than every wavefront coefficient shrinking monotonically. No overall quality or
|
|
110
|
+
bokeh score is produced.
|
|
111
|
+
|
|
112
|
+
## Acceptance boundary
|
|
113
|
+
|
|
114
|
+
`test/generic-tier-presets.test.ts` reuses #130's canonical focal length, aperture,
|
|
115
|
+
focus, illumination wavelength and exposure time. It leaves that fixture unchanged.
|
|
116
|
+
A small explicit 9×9 sampled-ramp/noise target tests correction using one capture
|
|
117
|
+
and one noise identity for Off/On. The target is a sampled executor fixture, not a
|
|
118
|
+
radiometrically composed scene or a resolution/MTF claim. Multidimensional pupil
|
|
119
|
+
checks cover all declared field/defocus slices and separate passivity/energy.
|
|
120
|
+
Every advertised ISO setting resolves into an explicit regime. Matched angular
|
|
121
|
+
disturbance, corner radial/CA, off-frame ghost/veil and correction Jacobian/source
|
|
122
|
+
coverage checks consume the existing low-level APIs. The shifted output lattice
|
|
123
|
+
exposes missing support and joint crop rather than extending edges.
|
|
124
|
+
|
|
125
|
+
`test/fixtures/generic-tier-assets-v1.json` pins the complete canonical manifest
|
|
126
|
+
with SHA-256. Retuning an existing version requires deliberate fixture change and
|
|
127
|
+
review; accepted retuning must introduce a new preset/profile version while
|
|
128
|
+
retaining historical definitions required by saved simulations. This initial
|
|
129
|
+
resolver recognizes only 1.0.0 and rejects unavailable history without fallback.
|
|
130
|
+
|
|
131
|
+
Initial acceptance was partial; the current #116 disposition is documented in
|
|
132
|
+
[TIER_PRESET_ACCEPTANCE.md](TIER_PRESET_ACCEPTANCE.md). #119 remains the broader
|
|
133
|
+
cross-tier validation ticket. The following inventory describes the initial slice.
|
|
134
|
+
Remaining acceptance includes composed physical scene/corrected-image reports,
|
|
135
|
+
residual CA/distortion and retained-FOV/stretch/edge-response envelopes, controlled
|
|
136
|
+
bokeh/textured backgrounds and spectral effects where modeled, broader body
|
|
137
|
+
stabilization/AF/drive/meter/WB execution cases, and applicable output paths.
|
|
138
|
+
There is no separate tier-specific browser approximation to compare here; the
|
|
139
|
+
public implementation remains browser-safe and uses the ordinary reference APIs.
|
|
140
|
+
No private application acceptance is invented.
|
|
141
|
+
|
|
142
|
+
Initial tier assets landed at root API 0.105.0; the current root API is 0.116.0.
|
|
143
|
+
This acceptance-only extension does not change runtime/API or asset definitions. Selection schema 0.1.0, asset version 1.0.0, npm package,
|
|
144
|
+
POC and production contracts remain independent. Human scientific/provenance
|
|
145
|
+
review and contribution-specific DCO certification are still required.
|
|
146
|
+
|
|
147
|
+
## Correction residual and sampled-edge acceptance
|
|
148
|
+
|
|
149
|
+
`test/generic-tier-correction-acceptance.test.ts` extends #119 with the exact 1.0.0
|
|
150
|
+
assets on a 9×9 synthetic slanted-step target and fixed alternating noise. Correction
|
|
151
|
+
Off/On forks one sampled capture. Independent k1 radial arithmetic, finite-difference
|
|
152
|
+
Jacobians, bilinear weights and polynomial partial-reciprocal gain predict every
|
|
153
|
+
channel sample. These checks quantify sampled interpolation, not optical MTF or a
|
|
154
|
+
radiometrically composed scene.
|
|
155
|
+
|
|
156
|
+
Independent monotonic scalar bisection recovers ideal coordinates through each
|
|
157
|
+
combined physical radial/CA map. Common green distortion is compensated, while
|
|
158
|
+
sequential partial channel correction leaves a nonzero, reduced CA residual. The
|
|
159
|
+
bounded sampled points require less than 0.1 mm residual displacement; this is a
|
|
160
|
+
regression envelope for synthetic definitions, not measured accuracy or a continuous
|
|
161
|
+
field guarantee. Full 2×2 Jacobians, determinants and principal stretches are checked
|
|
162
|
+
independently. A shifted lattice checks exact missing-source support and the joint
|
|
163
|
+
valid crop. Retained channel pixel-center ray envelopes remain distinct from captured
|
|
164
|
+
pixel-edge FOV; the joint RGB crop cannot expand a channel's ray coverage.
|
|
165
|
+
|
|
166
|
+
No runtime, root API, schema, preset manifest, package or POC behavior changes.
|
|
167
|
+
This does not complete #116/#119: physical PSF/scene composition, broader body
|
|
168
|
+
execution and applicable export acceptance remain separately tracked.
|
|
169
|
+
|
|
170
|
+
## Body execution acceptance
|
|
171
|
+
|
|
172
|
+
`test/generic-tier-body-acceptance.test.ts` executes the exact 1.0.0 body
|
|
173
|
+
assets through existing public APIs using #130's matched optical/exposure state.
|
|
174
|
+
Fifteen cases cover all three tiers:
|
|
175
|
+
|
|
176
|
+
- Burst times follow the maximum of explicit cadence and exposure duration;
|
|
177
|
+
a slow shutter cannot overlap ordinary still exposures. Self-timer delay is
|
|
178
|
+
applied once. Frame seeds are reproducible/distinct within the tested sequence;
|
|
179
|
+
frame-count limits and unsupported focus bracketing reject.
|
|
180
|
+
- Single AF acquires and holds; focus/release priority gates remain separate.
|
|
181
|
+
Consumer rejects continuous AF; Prosumer/Professional follow the same known
|
|
182
|
+
target and require explicit reacquisition after loss. The common ideal actuator
|
|
183
|
+
does not establish real tracking speed or recognition performance.
|
|
184
|
+
- Uniform/highlight metering uses independently calculated weighted means and
|
|
185
|
+
target ratios, stays invariant to output crop, and rejects tone-mapped input.
|
|
186
|
+
- Observable pre-WB weighted patches yield independent logarithmic-strength AWB
|
|
187
|
+
gains. Clipped samples are excluded/reported, unsupported policies reject,
|
|
188
|
+
and a locked state preserves resolved gains without altering RAW/exposure.
|
|
189
|
+
- Global data-readout declarations retain nonzero duration with zero spatial
|
|
190
|
+
phase skew under all three shutter mechanisms. These tests do not establish
|
|
191
|
+
exposure-boundary scans, flash compatibility or rolling-motion behavior.
|
|
192
|
+
|
|
193
|
+
Assets, runtime contracts and all versions remain unchanged. These are bounded
|
|
194
|
+
synthetic body-policy execution checks, not measured camera calibration or full
|
|
195
|
+
capture/production/output acceptance. Physical scene/PSF composition, applicable
|
|
196
|
+
export wiring and broader stabilization/flash acceptance remain separate work.
|
|
197
|
+
|
|
198
|
+
## Readout-to-file acceptance
|
|
199
|
+
|
|
200
|
+
`test/generic-tier-output-acceptance.test.ts` binds the exact body 1.0.0
|
|
201
|
+
readout/signal-chain profiles to an explicitly declared owned 2×2 Bayer/native-still
|
|
202
|
+
test topology. The topology IDs are registered to those required by the assets;
|
|
203
|
+
matching channel names alone is not the binding. Charge expectations, physical
|
|
204
|
+
storage capacity and ideal test-color interpretation remain independent synthetic
|
|
205
|
+
fixture contracts. This tiny raster is structural regression evidence and is not
|
|
206
|
+
an external-editor acceptance file or a realistic pixel sampling model.
|
|
207
|
+
|
|
208
|
+
Nine cases verify that ISO 100/400 resolve the same base regime and ISO 800 selects
|
|
209
|
+
the explicitly declared high regime. Expected photons/charge and the realized
|
|
210
|
+
stored charge remain unchanged while electronic noise and conversion gain change.
|
|
211
|
+
Independent signed-signal/pedestal/quantization arithmetic predicts each RAW code.
|
|
212
|
+
The producer itself still consumes an explicit regime: changing ISO metadata
|
|
213
|
+
without changing that regime cannot alter its samples. Unsupported ISO settings
|
|
214
|
+
reject in the upstream capability resolver.
|
|
215
|
+
|
|
216
|
+
Both regimes export through all four orientations. Stored DNG codes match every
|
|
217
|
+
native produced sample; downstream +1 EV preserves codes, capture/noise and RAW
|
|
218
|
+
image identity while changing processed pixels. Repeated JPEG export is deterministic.
|
|
219
|
+
These are genuine producer-to-file checks, with upstream radiometry and producer
|
|
220
|
+
origin verification still explicitly unasserted. They do not establish tier lens
|
|
221
|
+
PSF/scene composition, calibrated color, full production activation or external
|
|
222
|
+
editor/high-resolution interoperability. Runtime, API/schema and asset versions
|
|
223
|
+
remain unchanged.
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
## Supported production and finite pupil scene acceptance
|
|
227
|
+
|
|
228
|
+
`test/generic-tier-production-acceptance.test.ts` runs every body/lens pairing
|
|
229
|
+
through the authoritative plan 0.7.0 environment route using the exact preset
|
|
230
|
+
transmission values and body readout/ISO profiles. A separately identified fixture
|
|
231
|
+
bridge explicitly binds the selected lens's transmission to its exposure-capability
|
|
232
|
+
profile ID; those two IDs represent different contracts. The test does not retune
|
|
233
|
+
or overwrite the saved 1.0.0 assets.
|
|
234
|
+
|
|
235
|
+
The owned 2×2 sensor registration, 540–560 nm flat EQE, charge capacity, dark
|
|
236
|
+
current and ideal output color are independent approximations, never facts inferred
|
|
237
|
+
from body tier. All three body selections produce the same expected photo charge
|
|
238
|
+
for a given lens. The lens transmission ratios independently predict photo-count
|
|
239
|
+
ratios; ISO regime changes preserve photo charge. Executed RAW is preserved through
|
|
240
|
+
processing and deterministic paired export. Both consumer manifests retain the same
|
|
241
|
+
immutable executed result. Unsupported wavelength support and stale commitments
|
|
242
|
+
reject before provider callbacks.
|
|
243
|
+
|
|
244
|
+
Production explicitly omits PSF and declares unity field throughput. It does not
|
|
245
|
+
claim to compose the assets' discrete 550 nm pupil data across a continuous spectrum,
|
|
246
|
+
combine pupil clipping with illumination falloff, or execute every lens effect.
|
|
247
|
+
That omission remains recorded as modeled-zero with evidence and limitations.
|
|
248
|
+
|
|
249
|
+
A separate finite monochromatic sampled scene evaluates all 27 exact field/defocus
|
|
250
|
+
pupil responses. An independent direct phase sum predicts each normalized PSF tap;
|
|
251
|
+
controlled texture/highlight samples are summed at every tap with metric pitch and
|
|
252
|
+
+Y-up/native +Y-down signs. The same sampled physical response feeds correction
|
|
253
|
+
Off/On, retaining capture/noise identity, full Jacobians and retained ray coverage.
|
|
254
|
+
This coarse sampled scene is neither measured MTF nor a continuous optical model,
|
|
255
|
+
color-fringing prediction or a perceptual bokeh score. No interpolation, sharpen
|
|
256
|
+
pass, hidden quality multiplier or external data is introduced.
|
|
257
|
+
|
|
258
|
+
See the acceptance disposition for #116 ownership, merged #119 validation and
|
|
259
|
+
scientific limits. Runtime/API/schema/asset/package/POC versions stay unchanged.
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
## Versioned cross-tier reports
|
|
263
|
+
|
|
264
|
+
The reviewed/merged #119 acceptance layer is [TIER_ACCEPTANCE.md](TIER_ACCEPTANCE.md).
|
|
265
|
+
It links a reproducible three-domain report, normative finite regression envelopes,
|
|
266
|
+
explicit multidimensional pupil/texture and crop/gain tradeoffs, and matched signed
|
|
267
|
+
stabilization/ordinary-flash checks. Existing body, correction and producer-to-file
|
|
268
|
+
acceptance remains part of that evidence. Measured calibration and unsupported
|
|
269
|
+
optical metrics are not invented; runtime/assets and all versions are unchanged.
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Call-local geometry preparation reuse: #43
|
|
2
|
+
|
|
3
|
+
Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
|
|
4
|
+
|
|
5
|
+
`calculateGeometricSamplingPlan()` already parses and copies a complete transform
|
|
6
|
+
list at its public boundary. It previously called the public scalar mapping API
|
|
7
|
+
for every destination pixel, reparsing/copying that same list and rebuilding its
|
|
8
|
+
preparation provenance each time. This change uses one private point evaluator
|
|
9
|
+
for the call-owned mapping. The public scalar API still prepares external input
|
|
10
|
+
on every call and uses that same evaluator.
|
|
11
|
+
|
|
12
|
+
This is a bounded internal optimization against merged main
|
|
13
|
+
`c1374c31473f893310d1ce4f0d5a737aaba43ab5`, not a new prepared/cache API. It consumes
|
|
14
|
+
no pending export/tier/POC draft. Root API 0.103.0, geometry schema/model versions,
|
|
15
|
+
POC, package and production contracts stay unchanged.
|
|
16
|
+
|
|
17
|
+
## Whole-consumer measurements
|
|
18
|
+
|
|
19
|
+
[Recorded evidence](benchmarks/2026-10-02-geometric-preparation-reuse.json) contains
|
|
20
|
+
two independent ordinary paired runs and one GC-assisted run. Both source trees
|
|
21
|
+
were built with `tsc`. Context is Node 24.19.0/V8 13.6.233.17-node.51, Linux x64,
|
|
22
|
+
AMD EPYC 9V74 and 9 logical CPUs on shared execution infrastructure. Each run
|
|
23
|
+
records the reference commit and candidate source-file SHA-256; the source/build
|
|
24
|
+
labels are operator-attested, and the fingerprint identifies the runtime change.
|
|
25
|
+
|
|
26
|
+
The consumers are merged `calculateGeometricSamplingPlan()` and the whole
|
|
27
|
+
`calculateLensCorrectedCapture()` executor: common radial map, channel-specific
|
|
28
|
+
CA, affine map, joint support, actual resampling, and peripheral gain. Both use
|
|
29
|
+
the same owned synthetic capture/noise identity. The sampled linear plane spans
|
|
30
|
+
24×24 mm, with explicit pitch and a separate physical profile normalization
|
|
31
|
+
radius. Nearest sampling is explicit; the bounded compressing coordinate maps
|
|
32
|
+
have no source-prefilter requirement. No prefilter is claimed or fabricated.
|
|
33
|
+
These are real bounded engine consumers, not a copied equation microbenchmark
|
|
34
|
+
or a complete physical production renderer.
|
|
35
|
+
|
|
36
|
+
| Consumer | Reference ms, ordinary run 1 | Candidate ms, run 1 | Candidate/reference, run 1 | Ratio, run 2 | GC-assisted ratio |
|
|
37
|
+
| --- | ---: | ---: | ---: | ---: | ---: |
|
|
38
|
+
| Plan 1×1 | 0.035 | 0.025 | 0.716 | 0.702 | 0.969 |
|
|
39
|
+
| Correction 1×1 | 0.303 | 0.261 | 0.864 | 0.833 | 0.869 |
|
|
40
|
+
| Plan 5×5 | 0.476 | 0.267 | 0.560 | 0.593 | 0.603 |
|
|
41
|
+
| Correction 5×5 | 3.364 | 2.124 | 0.631 | 0.635 | 0.651 |
|
|
42
|
+
| Plan 17×17 | 5.566 | 2.987 | 0.537 | 0.568 | 0.646 |
|
|
43
|
+
| Correction 17×17 | 39.255 | 24.333 | 0.620 | 0.612 | 0.606 |
|
|
44
|
+
| Plan 33×33 | 22.461 | 11.942 | 0.532 | 0.584 | 0.625 |
|
|
45
|
+
| Correction 33×33 | 155.051 | 100.624 | 0.649 | 0.618 | 0.642 |
|
|
46
|
+
| Plan 65×65 | 90.566 | 59.639 | 0.659 | 0.691 | 0.599 |
|
|
47
|
+
| Correction 65×65 | 640.165 | 468.194 | 0.731 | 0.740 | 0.749 |
|
|
48
|
+
|
|
49
|
+
There are five measured blocks, alternating reference/candidate order and rotating
|
|
50
|
+
scenario order. The 1×1/5×5 cases use 100 warmup calls and 100 calls per block;
|
|
51
|
+
larger cases use two warmups and one whole call per block. Raw block timing and
|
|
52
|
+
retained-heap deltas are preserved. Final runs occurred after release checks,
|
|
53
|
+
without concurrent task benchmarks/tests. Shared host activity is uncontrolled.
|
|
54
|
+
GC-assisted distributions are separate; do not infer GC causality from ratios.
|
|
55
|
+
|
|
56
|
+
The two ordinary runs show 26–39% shorter corrected-capture calls at 17×17 through
|
|
57
|
+
65×65. Corresponding sampling plans are about 31–47% shorter. Small cases also
|
|
58
|
+
improve in these runs, but microsecond-scale results have more timing noise.
|
|
59
|
+
These are not portable speed constants, browser frame times, observed product
|
|
60
|
+
traffic, full-resolution throughput or proof of an end-user latency benefit.
|
|
61
|
+
|
|
62
|
+
The decision is to retain this small internal candidate for review. The result
|
|
63
|
+
justifies removal of duplicate preparation in this concrete consumer, not a
|
|
64
|
+
public mutable prepared engine, extra solver, vignetting/rotation abstraction or
|
|
65
|
+
cross-input cache. #45's POC result is independent and not its evidence basis.
|
|
66
|
+
No browser-motivated public API is introduced; no browser performance claim is
|
|
67
|
+
made. The public implementation remains browser-safe, with the existing package
|
|
68
|
+
and static gates required.
|
|
69
|
+
|
|
70
|
+
## Preparation, profiling and memory
|
|
71
|
+
|
|
72
|
+
Separate preparation loops measured about 7–8 µs to parse/copy the three-transform
|
|
73
|
+
mapping; that cost remains at every public boundary. There is no new preparation
|
|
74
|
+
stage or long-lived state. The sampling-plan result still owns its normal mapping
|
|
75
|
+
and all per-pixel diagnostics. Call-local reuse avoids repeating the same work
|
|
76
|
+
for every point. Small grids above include one-off/amortization evidence rather
|
|
77
|
+
than assuming a prepared path is always free.
|
|
78
|
+
|
|
79
|
+
Separate CPU and allocation sampling used five whole 65×65 corrected captures
|
|
80
|
+
per path. Reference CPU stacks included `prepareGeometricMapping` in 882 of 2,657
|
|
81
|
+
samples inside the consumer (about 33%). Candidate had 1 of 1,779. This is sampled
|
|
82
|
+
inclusive attribution, not exact elapsed time or a claim that preparation costs
|
|
83
|
+
33% everywhere. Recursive finite checks, radial work and other categories overlap;
|
|
84
|
+
do not sum the category counts. Inlining and sampling affect attribution.
|
|
85
|
+
|
|
86
|
+
V8 Inspector heap sampling, at 32 KiB intervals and requesting inclusion of
|
|
87
|
+
objects collected by major/minor GC, estimated 6,946,184,128 sampled bytes for
|
|
88
|
+
reference and 4,840,744,824 for candidate over five captures (about 30% lower).
|
|
89
|
+
Preparation-inclusive estimates fell from 2,075,859,720 to 656,240 bytes. These are
|
|
90
|
+
statistical allocation estimates, not exact allocation counters, retained live
|
|
91
|
+
memory or GC-pause measurements. Instrumented runs are separate from all timing
|
|
92
|
+
comparisons. No raw inspector profiles/private paths are stored. Raw net retained
|
|
93
|
+
heap deltas are also retained; they are not allocation counts or context sizes.
|
|
94
|
+
|
|
95
|
+
## Correctness and copy boundary
|
|
96
|
+
|
|
97
|
+
External prepared objects remain untrusted: every public entry parses/copies the
|
|
98
|
+
current input before evaluating it. There is no persistent context or cache to
|
|
99
|
+
invalidate. The private evaluator is reached only with that call-owned mapping.
|
|
100
|
+
It retains per-point finite checks, every intermediate radial operating-envelope
|
|
101
|
+
check, arithmetic order, full Jacobians/principal stretches and the ordinary
|
|
102
|
+
point-result validation/provenance. Scalar and batch points use the same equation
|
|
103
|
+
implementation. No numerical tolerance is relaxed and no inverse iteration bound
|
|
104
|
+
is changed.
|
|
105
|
+
|
|
106
|
+
Affine derivative arrays are copied per result point. They must not alias another
|
|
107
|
+
pixel, the returned mapping, the caller or another call. This preserves the prior
|
|
108
|
+
copy semantics despite sharing the internal parsed mapping. Existing masks,
|
|
109
|
+
joint crops, source coverage, prefilter requirements, resampler identities and
|
|
110
|
+
retained-ray/FOV diagnostics are unchanged.
|
|
111
|
+
|
|
112
|
+
`test/geometric-preparation-reuse.test.ts` compares every point in a fixed 32-case
|
|
113
|
+
corpus (seed `0x43c1374c`) against scalar evaluation, covering all four quarter
|
|
114
|
+
turns, off-center lattices, noncommuting affine/radial order and varied coefficients.
|
|
115
|
+
It also tests mutation isolation, revalidation after prior success, folded/singular
|
|
116
|
+
input and intermediate-domain failure. Existing correction/geometry tests retain
|
|
117
|
+
noise/capture identity and blur/resampling guarantees. The paired benchmark checks
|
|
118
|
+
complete result/provenance equality with the unchanged reference for every measured
|
|
119
|
+
scenario before timing. The canonical #130 fixture is unchanged and is not used
|
|
120
|
+
as performance evidence.
|
|
121
|
+
|
|
122
|
+
## Reproduction and review
|
|
123
|
+
|
|
124
|
+
Build an independent reference checkout of the recorded main commit with
|
|
125
|
+
`npm ci` / `npm run build`, and build this candidate checkout. Run sequentially
|
|
126
|
+
without concurrent task checks or benchmarks; replace the reference-root below.
|
|
127
|
+
|
|
128
|
+
```sh
|
|
129
|
+
node scripts/benchmark-geometric-consumers.mjs --reference-root=/path/to/reference --reference-commit=c1374c31473f893310d1ce4f0d5a737aaba43ab5
|
|
130
|
+
node --expose-gc scripts/benchmark-geometric-consumers.mjs --reference-root=/path/to/reference --reference-commit=c1374c31473f893310d1ce4f0d5a737aaba43ab5 --profile=sample
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Repeat ordinary runs separately. Profiling is optional and separate from timing.
|
|
134
|
+
There is no timing CI threshold, new runtime dependency, third-party data, paid
|
|
135
|
+
service or production-stage activation. Human scientific/provenance review and
|
|
136
|
+
contribution-specific DCO certification remain required before merge; measurements
|
|
137
|
+
are not scientific or legal certification.
|
|
138
|
+
|
|
139
|
+
## Final V1 remeasurement
|
|
140
|
+
|
|
141
|
+
[Final V1 performance disposition](V1_PERFORMANCE_DISPOSITION.md) records current main #204, fresh paired timing/equivalence, preparation/memory profiles and dense executed environment-to-RAW evidence. PR #205 merged the final reviewed/signed no-further-change disposition; PR #206 merged final conformance. The measured engine commit remains the historical benchmark identity. Earlier candidate and pending-remeasurement statements above are historical.
|
package/docs/IMAGE_FORMATION.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Image-Formation Contract
|
|
2
2
|
|
|
3
|
+
Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
|
|
4
|
+
|
|
3
5
|
Photivra's image-formation contract defines **scientific ownership, coordinate semantics, and dependency/coupling boundaries** for current and future camera effects.
|
|
4
6
|
|
|
5
7
|
It is not a claim that every stage is implemented, and it is not a requirement that renderers execute one literal serial filter chain.
|
|
@@ -12,20 +14,22 @@ import { getImageFormationContract } from "@photivra/engine";
|
|
|
12
14
|
const contract = getImageFormationContract();
|
|
13
15
|
```
|
|
14
16
|
|
|
15
|
-
##
|
|
17
|
+
## Six scientific domains
|
|
16
18
|
|
|
17
|
-
The contract groups image formation into
|
|
19
|
+
The contract groups image formation into six domains:
|
|
18
20
|
|
|
19
21
|
1. **scene / ray geometry**
|
|
20
|
-
2. **
|
|
21
|
-
3. **
|
|
22
|
-
4. **
|
|
23
|
-
5. **
|
|
22
|
+
2. **scene radiance formation**
|
|
23
|
+
3. **lens mapping + pupil / throughput**
|
|
24
|
+
4. **field- and wavelength-dependent PSF**
|
|
25
|
+
5. **time-dependent exposure / readout**
|
|
26
|
+
6. **native sensor sampling -> orientation -> output / display**
|
|
24
27
|
|
|
25
28
|
These are scientific ownership domains. Some effects couple more than one domain.
|
|
26
29
|
|
|
27
30
|
Examples:
|
|
28
31
|
|
|
32
|
+
- scene illumination, material optical response, geometry/visibility, emission, indirect transport, and time belong upstream in `scene-radiance-evaluation`; source metadata or RGB renderer values are not sensor input;
|
|
29
33
|
- focus breathing changes projection/magnification and therefore couples lens mapping to scene projection;
|
|
30
34
|
- lateral chromatic aberration is wavelength/channel-dependent field mapping and may share wavelength basis with the PSF model;
|
|
31
35
|
- illumination vignetting is throughput-only;
|
|
@@ -34,6 +38,20 @@ Examples:
|
|
|
34
38
|
- rolling readout couples native sensor timing to temporal integration;
|
|
35
39
|
- camera rotation should be evaluable as a function of physical exposure time so global and rolling readout can consume the same motion model.
|
|
36
40
|
|
|
41
|
+
## Scene-radiance ownership
|
|
42
|
+
|
|
43
|
+
`scene-radiance-evaluation` is a partial foundation between `scene-ray-projection` and `lens-field-pupil-evaluation`.
|
|
44
|
+
|
|
45
|
+
Its authoritative quantity is **outgoing scene spectral radiance** produced from illumination, scene geometry/visibility, material response, emission, indirect transport, and physical time. The renderer-neutral scene request/result boundary supplies declared radiance samples; the production composer validates a bound sample and consumes #110 optical throughput. It does not execute a complete scene renderer or establish a measured radiance field.
|
|
46
|
+
|
|
47
|
+
The existing `SceneRadiometry` metadata remains separate. `absolute-luminance` is a photometric luminance anchor, not a wavelength-resolved radiance field. Likewise, a light-source SPD, RGB HDR environment, source irradiance, and sensor-plane spectral irradiance are different quantities and must not be substituted for one another.
|
|
48
|
+
|
|
49
|
+
See [Scene Radiance and Illumination](SCENE_RADIANCE_AND_ILLUMINATION.md).
|
|
50
|
+
|
|
51
|
+
Shared spectral planning now distinguishes continuous support from discrete lines. Continuous scene/optics/sensor factors may share an explicit air/vacuum coverage intersection and breakpoint union. Delta-like line spectra remain wavelength-integrated measures and are summed without a dλ multiplier; they are never converted into synthetic continuous density merely to enter the continuous sensor quadrature path.
|
|
52
|
+
|
|
53
|
+
Time-varying illumination now uses a separate temporal profile. Source waveforms are relative multipliers evaluated in physical seconds and must be explicitly registered to the capture `first-opening-boundary-phase` reference before flash/flicker can participate in exposure integration. The local exposure window—not total sensor data-readout duration—defines the integration interval. The temporal foundation returns multiplier/time measures only; source magnitude, material/visibility transport, outgoing radiance, optics, sensor response, metering and automatic exposure remain downstream/separate.
|
|
54
|
+
|
|
37
55
|
## Coordinate spaces
|
|
38
56
|
|
|
39
57
|
The contract explicitly distinguishes:
|
|
@@ -99,6 +117,34 @@ Exposure duration and sensor readout timing are independent:
|
|
|
99
117
|
|
|
100
118
|
This allows later rolling-shutter work to consume the same time-parameterized camera-motion model used for global exposure.
|
|
101
119
|
|
|
120
|
+
The standalone `calculateSensorReadoutTiming()` foundation now supplies an invariant native-raster spatial readout phase schedule. Its first model is a caller-declared uniform-linear single-axis approximation with independently evidenced data-readout duration and rolling spatial skew. It does not define exposure windows or shutter-curtain motion, and it does not infer physical hardware readout lines from the effective native image raster.
|
|
121
|
+
|
|
122
|
+
The additive `assessReadoutExposureTimingLinkage()` layer can validate an explicitly evidenced normalized spatial-phase relationship between rolling readout and an electronic exposure boundary. It never infers absolute temporal synchronization; total data-readout duration is not a surrogate for exposure timing, and matching direction/span alone is insufficient evidence of a shared clock.
|
|
123
|
+
|
|
124
|
+
The standalone `calculateCaptureExposureWindows()` foundation separately describes local opening/closing exposure boundaries. It uses the first opening-boundary phase as its explicit time reference, preserves independent nominal/opening/closing timing, validates positive local duration across the whole active rectangle, and keeps mechanical/EFCS/electronic actuator identity separate from timing. It does not automatically bind those exposure boundaries to sensor readout phase or to the existing camera-rotation time origin.
|
|
125
|
+
|
|
126
|
+
The standalone `calculateCaptureRotationTrajectories()` bridge now explicitly binds that first opening-boundary phase to `t = 0` of the existing pure-camera-rotation model and evaluates stationary reference rays at local exposure start/end. It remains forward temporal geometry only: it does not consume sensor readout timing, solve the implicit rolling-shutter image warp, or integrate motion blur over the exposure interval.
|
|
127
|
+
|
|
128
|
+
The additive `calculateCaptureRotationInverseMappings()` layer now supplies an instantaneous destination-to-reference mapping at a caller-selected phase within each local exposure window. Under the current pure-rotation model the inverse is analytic once destination location fixes local capture time, so no iterative solver is used. This remains pre-lens, pre-output temporal geometry and does not replace finite-exposure integration.
|
|
129
|
+
|
|
130
|
+
The additive `calculateCaptureRotationTemporalQuadrature()` layer now supplies deterministic uniform-midpoint time nodes and separate normalized-average/seconds-valued temporal measures across each local exposure. It preserves the instantaneous inverse mapping as the geometry source of truth but does not itself integrate radiance, visibility, shutter transmission, sensor response, PSF, or output pixels.
|
|
131
|
+
|
|
132
|
+
## Production composition consumer
|
|
133
|
+
|
|
134
|
+
The ownership graph is now consumed by a separate production-plan contract.
|
|
135
|
+
|
|
136
|
+
The production planner:
|
|
137
|
+
|
|
138
|
+
- expands required upstream stages from this graph;
|
|
139
|
+
- preserves coupled-stage metadata;
|
|
140
|
+
- never creates a second hidden stage order;
|
|
141
|
+
- records modeled-zero, omitted, unsupported, and blocked states explicitly;
|
|
142
|
+
- keeps renderer capability declaration separate from scientific stage ownership.
|
|
143
|
+
|
|
144
|
+
Current plan schema `0.7.0` supports the physical sample path, attached-RAW processing and the bounded [executed environment capture](PRODUCTION_ENVIRONMENT_CAPTURE.md). Complete declared environment input can execute all fourteen graph stages through RAW and optional output. Sample-only and attachment-only routes preserve their missing upstream blockers; temporal geometry alone does not integrate radiance. See [processed output](PROCESSED_OUTPUT.md) for the attachment boundary. See [V1 composition and consumer map](V1_COMPOSITION_MAP.md) for current consumers and required handoffs.
|
|
145
|
+
|
|
146
|
+
See [Production Image-Formation Plan](PRODUCTION_COMPOSITION.md).
|
|
147
|
+
|
|
102
148
|
## Renderer semantics
|
|
103
149
|
|
|
104
150
|
Renderer implementations may use a bounded real-time preview approximation or a higher-fidelity deterministic reference evaluation, but both must consume the same engine-owned scientific contract.
|
|
@@ -110,9 +156,11 @@ For geometric warps:
|
|
|
110
156
|
- scene depth/occlusion order is preserved across warps;
|
|
111
157
|
- renderer backend choice may change implementation/fidelity, not model semantics.
|
|
112
158
|
|
|
113
|
-
##
|
|
159
|
+
## Sensor ordering and standalone boundaries
|
|
160
|
+
|
|
161
|
+
The static ordering registry 0.4.0 retains broad foundation/reserved maturity labels; these are not route-specific capability checks. Plan 0.7.0 records actual bounded execution and blockers. The standalone layers below explain each primitive’s ownership and do not negate the separate executed environment route.
|
|
114
162
|
|
|
115
|
-
The contract
|
|
163
|
+
The contract owns this sensor ordering. Individual descriptive profiles do not execute the whole path; the bounded environment production route explicitly composes supported terms:
|
|
116
164
|
|
|
117
165
|
```text
|
|
118
166
|
optical PSF
|
|
@@ -129,6 +177,54 @@ optical PSF
|
|
|
129
177
|
|
|
130
178
|
Temporal exposure/readout couples into the photosite/charge stages rather than acting as an unrelated display blur.
|
|
131
179
|
|
|
180
|
+
The standalone capture-mode profile now describes acquisition sequence, per-frame effective sampling, optional inter-frame sensor offsets, reconstruction-stage labels, processed-image raster, and downstream dependencies. It does **not** implement the reserved CFA/photosite/reconstruction algorithms. A mode's processed raster remains upstream of physical orientation and final output crop/resampling and cannot redefine physical sensor geometry or FOV.
|
|
181
|
+
|
|
182
|
+
The standalone color-sampling topology profile now describes monochrome, arbitrary periodic mosaic phase/channel assignment, and layered color declarations with an explicitly unresolved spatial relationship. The periodic topology lives on a distinct native sensor sampling-site lattice rather than `NativeImageRaster`; no binding to effective image samples or physical photodiodes is inferred. This metadata foundation does not yet implement the reserved photosite/CFA sampling stage, spectral response, sparse site exceptions, RAW sampling, or reconstruction.
|
|
183
|
+
|
|
184
|
+
The additive native-effective-raster/color-site binding now provides the missing structural bridge between capture-mode effective samples and monochrome/periodic topology. It requires evidence for the exact native raster relationship and grouped-mode phase, preserves full-frame absolute CFA phase, and reports compact pre-reconstruction source regions/channel counts. This still does **not** implement the reserved photosite/CFA sampling stage: no signal weights, spectral response, photons/electrons, RAW values, aliasing, or reconstruction are calculated.
|
|
185
|
+
|
|
186
|
+
The standalone sensor optical-stack profile now makes the upstream stack boundary explicit without claiming a complete stack response. Ordered physical component roles and microlens presence are descriptive. Effective anti-aliasing response is separately modeled as unknown, absent, present-but-unresolved, or a normalized native-physical point-splitting approximation. The resolver exposes only that AA spatial term; cover/filter transmission/refraction, microlens angular/collection behavior, wavelength/field/polarization dependence, and convolution with the lens PSF remain future work. The profile alone is not a complete optical-stack simulation. The production environment route consumes the supported explicit spatial/response bindings and records approximation limits.
|
|
187
|
+
|
|
188
|
+
The standalone sensor sampling-aperture profile now supplies explicit native-physical registration for the color-site center lattice and a first geometric sensitive-region footprint. The rectangle is a normalized spatial-area averaging support plus a separately reported geometric area/fraction; it is **not** QE or radiometric collection efficiency. AA point splitting, microlens redirection, diffusion/crosstalk, spectral response, photons/electrons, and RAW values are still absent. This advances the geometry needed by the reserved `photosite-cfa-sampling` stage without claiming that stage is fully implemented.
|
|
189
|
+
|
|
190
|
+
The additive sensor spatial-quadrature layer now combines the resolved AA point-splitting term with the geometric aperture using deterministic native-physical midpoint nodes. AA is applied by inverse source lookup, the destination site's CFA channel remains fixed, and off-active-area pre-AA source support is preserved. The result is still a geometry/measure plan only: no optical field, spectral response, radiometry, temporal integration, RAW value, or reconstruction is calculated, so the `photosite-cfa-sampling` stage remains reserved.
|
|
191
|
+
|
|
192
|
+
The additive spatial-sample reducer can now apply those weights to caller-supplied nonnegative linear relative values or physical irradiance. It does not turn a channel ID into spectral filtering, does not integrate over time/wavelength, and does not calculate photons, electrons or RAW codes. Consequently this is still a pre-response site sample and the full `photosite-cfa-sampling` stage remains reserved.
|
|
193
|
+
|
|
194
|
+
The standalone sensor spectral-response profile now establishes explicit wavelength-dependent meaning for linked semantic channels. It can resolve effective external QE, effective A/W responsivity, or declared filter×detector-EQE at one wavelength while preserving response scope and reusable-data provenance. It performs no spectral irradiance integration, exposure-time integration, photon/electron conversion, or RAW reconstruction, so the complete `photosite-cfa-sampling` and downstream charge stages remain only partially founded/reserved.
|
|
195
|
+
|
|
196
|
+
The additive sensor spectral-quadrature plan supplies deterministic wavelength nodes and dλ measures without turning them into signal. Response knots and explicit caller breakpoints define segment boundaries, a maximum subinterval width bounds midpoint spacing, and the selected response scope/provenance remain visible. Sensor-response coverage is not treated as scene/optics coverage, response values are not applied, QE is not conflated with A/W responsivity, and continuous-density quadrature does not silently approximate discrete spectral lines.
|
|
197
|
+
|
|
198
|
+
The shared spectral-coverage layer can now derive the sensor channel's usable range and interpolation knots and combine them with separately declared scene/optics/material coverage. This is planning metadata only. Discrete illumination lines use a separate integrated-line measure path and are not accepted as additional continuous quadrature breakpoints.
|
|
199
|
+
|
|
200
|
+
The additive spatio-spectral reducer now performs the first explicit spatial × wavelength measure composition for caller-supplied sensor-plane E_lambda(x,y) in W/m²/nm. It requires exact color-profile/channel linkage, retains every required edge/off-frame spatial source sample, caps the Cartesian product, and produces pre-response wavelength-integrated irradiance plus geometric-aperture incident flux.
|
|
201
|
+
|
|
202
|
+
The additive response-application compatibility gate now checks whether that pre-response result is structurally eligible for a later spectral response. It requires exact response/color/aperture/stack linkage, source-plane compatibility with response scope, matching geometric-aperture normalization, explicit spatial response uniformity/separability, resolved wavelength basis, and compatible reference conditions or an explicit approximation. Full-site-cell and effective-collection-area normalizations remain blocked because the current reducer has not integrated those radiometric area bases.
|
|
203
|
+
|
|
204
|
+
The additive response operating-range gate evaluates optical input against an evidence-backed linearity range with explicit wavelength applicability, reference conditions, uncertainty and nonlinearity criterion. It distinguishes broadband-total evidence from per-spectral-bin applicability and requires an explicit maximum bin width for the latter. Wavelength-dependent response conversion is authorized only when each spectral bin and the spatially reduced aperture satisfy the declared linearity model. Exposure characteristic-curve linearity, accumulated-charge/full-well saturation, conversion gain, readout electronics and ADC linearity remain downstream temporal/electrical contracts.
|
|
205
|
+
|
|
206
|
+
The photon-energy wavelength foundation resolves the physical energy-per-photon basis used by EQE conversion. Vacuum wavelengths use exact SI h and c. Air wavelengths must first be converted to vacuum wavelength through a sourced phase refractive index at the exact wavelength, with explicit atmospheric-condition compatibility; no implicit air≈vacuum shortcut is allowed.
|
|
207
|
+
|
|
208
|
+
The EQE electron-rate foundation applies the photon-domain response conversion after all prior gates. It evaluates each wavelength-bin radiant-power contribution independently, divides by photon energy to obtain incident-photon rate, applies effective external QE through the authoritative spectral-response resolver, and sums expected generated-electron rates with compensated summation.
|
|
209
|
+
|
|
210
|
+
The sibling A/W responsivity foundation applies the current-domain response independently per wavelength bin and sums detector-terminal photocurrent magnitude. Its calibration is additionally bound to explicit detector bias and current-readout load conditions. This current is not treated as electron rate, accumulated charge, transimpedance voltage, or circuit-polarity truth.
|
|
211
|
+
|
|
212
|
+
Both paths still stop before exposure-time integration, accumulated-charge/full-well behavior, stochastic noise, analog electronics, ADC/RAW and reconstruction.
|
|
213
|
+
|
|
214
|
+
The local sensor-rate/exposure binding carries each engine-produced response rate back to its exact color-sampling site, through an evidenced one-to-one native-effective-raster relationship, and into the authoritative local shutter-window schedule. This establishes which local time interval belongs to that rate but deliberately does not assume the rate is constant through the interval.
|
|
215
|
+
|
|
216
|
+
The constant-rate temporal-integration foundation now permits rate × local-duration only under a stationarity declaration bound to the exact site/window. EQE rates produce fractional expected photon/electron counts; A/W current produces photocharge magnitude in coulombs without carrier inference.
|
|
217
|
+
|
|
218
|
+
The dark-current foundation adds pre-compensation thermally generated expected electrons to the EQE-side charge model using exact local exposure duration and explicit temperature applicability. It does not model black-level compensation, hot-pixel/defect excess, leakage/injection, dark-current nonuniformity unless separately evidenced, or dark-current shot-noise realization. A/W integrated charge is still not treated as stored pixel electrons.
|
|
219
|
+
|
|
220
|
+
The accumulated-charge completeness foundation combines photo, dark and explicitly incremental other stored-electron expectations only when all terms bind to one exact local exposure. Completeness is not inferred from missing components; an evidence-backed declaration must enumerate the supplied additional charge components and state that all material stored-electron contributors are accounted for.
|
|
221
|
+
|
|
222
|
+
The physical charge-capacity foundation compares the complete expected stored-electron total with an evidence-backed storage limit. It remains an expectation-domain assessment: no stochastic saturation probability, clamp, post-capacity charge, overflow amount, anti-blooming or neighbor redistribution is modeled.
|
|
223
|
+
|
|
224
|
+
The camera saturation-capacity foundation is separate: it compares dark-corrected photo-signal electron-equivalent expectation against a measured/calibrated camera response-chain capacity. Dark/other stored charge is not added to that signal-domain comparison, and physical full-well is not reused. The first camera-capacity contract does not identify whether analog electronics, ADC/digital clipping, or another stage is the actual limiter.
|
|
225
|
+
|
|
226
|
+
Stage-specific clipping transfer functions, stochastic noise, analog electronics, ADC/RAW and reconstruction remain downstream.
|
|
227
|
+
|
|
132
228
|
## Current implementation status
|
|
133
229
|
|
|
134
230
|
Each stage is labeled:
|
|
@@ -141,7 +237,7 @@ Do not infer capabilities from a stage merely because it is present in the contr
|
|
|
141
237
|
|
|
142
238
|
## Test Fixture relationship
|
|
143
239
|
|
|
144
|
-
|
|
240
|
+
External consumer fixtures may provide browser regression targets; engine implementation and independent conformance remain the scientific source of truth.
|
|
145
241
|
|
|
146
242
|
Engine analytical/invariant tests establish model correctness. Test Fixture images provide secondary integration and renderer evidence.
|
|
147
243
|
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Deterministic linear capture encoding: #15C
|
|
2
|
+
|
|
3
|
+
Release context: **package 1.0.0 candidate / root API 0.116.0**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0.md).
|
|
4
|
+
|
|
5
|
+
`calculateLinearCaptureEncoding()` produces format-neutral unsigned 16-bit linear codes from one bounded inline `SimulatedCapture` plane. The exact plane/image-state identity is mandatory. The master stays unchanged; color, WB application, source reference value and upstream capture-saturation history accompany the encoded data. It neither chooses a file format nor invents a color conversion.
|
|
6
|
+
|
|
7
|
+
Encoding schema `0.1.0` uses one uniform channel mapping. Let B be `blackValue`, b be `blackCode`, R be the source plane's `referenceWhiteValue`, and r be `referenceWhiteCode`. R must exceed B, codes satisfy 0 ≤ b < r ≤ 65535, and all derived ranges/scales must be finite and representable. The continuous code is `b + (sample-B)/(R-B)*(r-b)`; scale is `(r-b)/(R-B)` codes per relative source unit. Same normalization/scale on every channel preserves linear color ratios after subtracting the declared black baseline.
|
|
8
|
+
|
|
9
|
+
| Contract | Meaning |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| blackValue / blackCode | Relative source baseline and its integer code; blackCode can reserve room for negative samples. |
|
|
12
|
+
| referenceWhiteValue / referenceWhiteCode | Source normalization and its code; reference white can be below the code maximum to preserve headroom. |
|
|
13
|
+
| representable limits | B − b/scale and B + (65535−b)/scale; these are encoded range limits, not physical capture saturation. |
|
|
14
|
+
| headroomFactor | (65535−b)/(r−b), relative to the above-black reference-white interval. |
|
|
15
|
+
| negativeValues | Explicit reject of any sample < 0, or preserve-if-representable. The latter still obeys the independently declared out-of-range policy. |
|
|
16
|
+
| outOfRange | Explicit reject, or clip to 0/65535 with separate low/high source-sample counts. |
|
|
17
|
+
| rounding | Nearest code; exact binary64 half ties toward the larger code. No dither or hidden stochastic state. |
|
|
18
|
+
|
|
19
|
+
The implementation compares finite source values with representable limits before arithmetic, so extreme finite samples can clip without overflowing the mapping. Exact black/reference/endpoints return their declared codes; remaining in-range mapped values round with floor(code+0.5). Only endpoint arithmetic roundoff is bounded back to the code interval. Ideal in-range rounding error is at most 0.5/scale source units; this bound excludes clipping and binary64 arithmetic error. No promise of correctly rounded arbitrary-precision real arithmetic is made. NaN/Infinity/sparse source arrays and invalid or numerically unrepresentable ranges fail. Identical validated inputs produce identical codes across the supported JS runtimes.
|
|
20
|
+
|
|
21
|
+
An encoded maximum or quantized sample at 65535 does not prove sensor saturation, and a sample rounded to an endpoint is not counted as source clipping. Source `captureSaturation` remains upstream history in its original capture domain. `defaultRenderingExposureEv:null` means the encoder selects no rendering exposure or display white. It performs no gain/WB/adaptation, gamma/transfer curve, tone/look/gamut mapping, resampling, RAW reconstruction or recovery of upstream LDR losses.
|
|
22
|
+
|
|
23
|
+
Output is serializable numbers plus explicit metadata, in row-major interleaved source channel order. `captureMetadata` carries the sanitized source manifest without float planes: geometry/settings, resolved WB intent, adopted white, noise/source identities and model/evidence provenance remain available to serializers. `sourcePlane` carries color/WB/history/saturation and raster/channel identity without float storage. Packing bytes, endianness, checksums, TIFF/DNG tags and required format-specific range restrictions belong to #16; a serializer must honor the declared scientific meaning and reject mappings it cannot represent. XYZ, virtual channels and transformed RGB retain different identities, even if all can be quantized. Quantizing unresolved channels does not establish a usable sensor color profile or a DNG export-readiness claim. External float references remain manifests; this synchronous bounded executor rejects them rather than performing IO or trusting unverified bytes.
|
|
24
|
+
|
|
25
|
+
Tests share #130 camera/seed metadata with the color tests. They check reference/headroom/clipping invariants, exact half ties and neighbors, offset-preserved negatives, independent negative/range rejection, extreme finite clipping, nonunit source reference/black, retained saturation, color→encoding consistency, deterministic results, state substitution, private/malformed policies and invalid samples/ranges. Implementation and arithmetic fixtures are independently authored, without third-party code/data or new runtime dependencies. Human science/provenance review and contributor DCO certification remain required before inclusion.
|