@photivra/engine 0.6.0 → 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 +186 -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 +138 -71
- 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 +87 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +85 -6
- package/dist/index.js.map +1 -1
- package/dist/motion/camera-rotation.d.ts +16 -0
- package/dist/motion/camera-rotation.d.ts.map +1 -1
- package/dist/motion/camera-rotation.js +16 -0
- package/dist/motion/camera-rotation.js.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts +13 -0
- package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.js +13 -0
- package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts +15 -0
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +1 -1
- package/dist/motion/capture-rotation-temporal-quadrature.js +15 -0
- package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
- package/dist/motion/capture-rotation-trajectory.d.ts +15 -0
- package/dist/motion/capture-rotation-trajectory.d.ts.map +1 -1
- package/dist/motion/capture-rotation-trajectory.js +15 -0
- package/dist/motion/capture-rotation-trajectory.js.map +1 -1
- 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 +11 -0
- 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 +18 -0
- package/dist/optics/radial-distortion.d.ts.map +1 -1
- package/dist/optics/radial-distortion.js +18 -0
- 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 +8 -0
- 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 +1 -0
- package/dist/sensor/capture-color-sampling-binding.d.ts.map +1 -1
- package/dist/sensor/capture-color-sampling-binding.js +14 -0
- package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
- 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.map +1 -1
- package/dist/sensor/capture-mode.js +13 -0
- package/dist/sensor/capture-mode.js.map +1 -1
- package/dist/sensor/color-sampling.d.ts.map +1 -1
- package/dist/sensor/color-sampling.js +19 -0
- package/dist/sensor/color-sampling.js.map +1 -1
- 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 +14 -0
- package/dist/sensor/exposure-window.d.ts.map +1 -1
- package/dist/sensor/exposure-window.js +14 -0
- package/dist/sensor/exposure-window.js.map +1 -1
- 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.map +1 -1
- package/dist/sensor/optical-stack.js +17 -0
- package/dist/sensor/optical-stack.js.map +1 -1
- 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 +12 -0
- package/dist/sensor/readout-exposure-linkage.d.ts.map +1 -1
- package/dist/sensor/readout-exposure-linkage.js +12 -0
- package/dist/sensor/readout-exposure-linkage.js.map +1 -1
- package/dist/sensor/readout-timing.d.ts +13 -0
- package/dist/sensor/readout-timing.d.ts.map +1 -1
- package/dist/sensor/readout-timing.js +13 -0
- package/dist/sensor/readout-timing.js.map +1 -1
- 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.map +1 -1
- package/dist/sensor/sampling-aperture.js +14 -0
- package/dist/sensor/sampling-aperture.js.map +1 -1
- 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 +44 -1
- package/dist/sensor/spatial-sample-reduction.d.ts.map +1 -1
- package/dist/sensor/spatial-sample-reduction.js +51 -5
- package/dist/sensor/spatial-sample-reduction.js.map +1 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts +24 -0
- package/dist/sensor/spatial-sampling-quadrature.d.ts.map +1 -1
- package/dist/sensor/spatial-sampling-quadrature.js +27 -0
- package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
- 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 +134 -24
- package/docs/AUTOMATION_COORDINATION.md +2 -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 +80 -10
- package/docs/LINEAR_CAPTURE_ENCODING.md +25 -0
- package/docs/MOTION_AND_SIGNAL.md +5 -3
- 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 +5050 -1047
- 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 +15 -3
|
@@ -0,0 +1,695 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Module boundary and integration notes.
|
|
4
|
+
* Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
|
|
5
|
+
* missing required fields and incompatible scientific data fail at this boundary. Generic
|
|
6
|
+
* stabilization evaluates declared angular disturbance with per-axis response, latency, limits and
|
|
7
|
+
* panning policy. Residual motion feeds the existing temporal mapping; no commercial IBIS/OIS
|
|
8
|
+
* calibration, arbitrary stop rating or inferred coordination is supplied.
|
|
9
|
+
* Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
|
|
10
|
+
* missing required fields and incompatible scientific data fail at this boundary. Generic
|
|
11
|
+
* stabilization evaluates declared angular disturbance with per-axis response, latency, limits and
|
|
12
|
+
* panning policy. Residual motion feeds the existing temporal mapping; no commercial IBIS/OIS
|
|
13
|
+
* calibration, arbitrary stop rating or inferred coordination is supplied.
|
|
14
|
+
* @see docs/STABILIZATION.md for equations, coordinate/unit conventions, blockers and support limits.
|
|
15
|
+
*/
|
|
16
|
+
import { approximationResult } from "../core/calculation-result.js";
|
|
17
|
+
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
18
|
+
import { parseEvidenceList } from "../core/evidence-provenance.js";
|
|
19
|
+
import { InvalidScientificInputError, requirePositiveInteger } from "../core/validation.js";
|
|
20
|
+
export const STABILIZATION_SYSTEM_PROFILE_SCHEMA_VERSION = "0.1.0";
|
|
21
|
+
export const STABILIZATION_DISTURBANCE_TRAJECTORY_VERSION = "0.1.0";
|
|
22
|
+
const AXES = new Set([
|
|
23
|
+
"pitch",
|
|
24
|
+
"yaw",
|
|
25
|
+
"roll"
|
|
26
|
+
]);
|
|
27
|
+
const ARCHITECTURES = new Set([
|
|
28
|
+
"off",
|
|
29
|
+
"sensor-shift",
|
|
30
|
+
"lens-optical",
|
|
31
|
+
"coordinated-physical"
|
|
32
|
+
]);
|
|
33
|
+
const CAPTURE_KINDS = new Set([
|
|
34
|
+
"still",
|
|
35
|
+
"video"
|
|
36
|
+
]);
|
|
37
|
+
function requireRecord(value, path) {
|
|
38
|
+
if (typeof value !== "object" ||
|
|
39
|
+
value === null ||
|
|
40
|
+
Array.isArray(value)) {
|
|
41
|
+
throw new InvalidConfigurationError(path + " must be an object.");
|
|
42
|
+
}
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
function requireNonEmptyString(value, path) {
|
|
46
|
+
if (typeof value !== "string" ||
|
|
47
|
+
value.trim().length === 0) {
|
|
48
|
+
throw new InvalidConfigurationError(path +
|
|
49
|
+
" must be a non-empty string.");
|
|
50
|
+
}
|
|
51
|
+
return value.trim();
|
|
52
|
+
}
|
|
53
|
+
function requireFinite(value, path) {
|
|
54
|
+
if (typeof value !== "number" ||
|
|
55
|
+
!Number.isFinite(value)) {
|
|
56
|
+
throw new InvalidConfigurationError(path + " must be finite.");
|
|
57
|
+
}
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
function requireNonNegativeFinite(value, path) {
|
|
61
|
+
const parsed = requireFinite(value, path);
|
|
62
|
+
if (parsed < 0) {
|
|
63
|
+
throw new InvalidConfigurationError(path +
|
|
64
|
+
" must be greater than or equal to zero.");
|
|
65
|
+
}
|
|
66
|
+
return parsed;
|
|
67
|
+
}
|
|
68
|
+
function requirePositiveFinite(value, path) {
|
|
69
|
+
const parsed = requireFinite(value, path);
|
|
70
|
+
if (parsed <= 0) {
|
|
71
|
+
throw new InvalidConfigurationError(path +
|
|
72
|
+
" must be greater than zero.");
|
|
73
|
+
}
|
|
74
|
+
return parsed;
|
|
75
|
+
}
|
|
76
|
+
function requireFraction(value, path) {
|
|
77
|
+
const parsed = requireFinite(value, path);
|
|
78
|
+
if (parsed < 0 ||
|
|
79
|
+
parsed > 1) {
|
|
80
|
+
throw new InvalidConfigurationError(path +
|
|
81
|
+
" must lie from zero through one.");
|
|
82
|
+
}
|
|
83
|
+
return parsed;
|
|
84
|
+
}
|
|
85
|
+
function parseLimitations(value, path) {
|
|
86
|
+
if (!Array.isArray(value)) {
|
|
87
|
+
throw new InvalidConfigurationError(path + " must be an array.");
|
|
88
|
+
}
|
|
89
|
+
const parsed = value.map((entry, index) => requireNonEmptyString(entry, path +
|
|
90
|
+
"[" +
|
|
91
|
+
index +
|
|
92
|
+
"]"));
|
|
93
|
+
if (new Set(parsed).size !==
|
|
94
|
+
parsed.length) {
|
|
95
|
+
throw new InvalidConfigurationError(path +
|
|
96
|
+
" must not contain duplicates.");
|
|
97
|
+
}
|
|
98
|
+
return parsed;
|
|
99
|
+
}
|
|
100
|
+
function parseFractionFact(value, path) {
|
|
101
|
+
const record = requireRecord(value, path);
|
|
102
|
+
return {
|
|
103
|
+
value: requireFraction(record.value, path + ".value"),
|
|
104
|
+
evidence: parseEvidenceList(record.evidence, path + ".evidence")
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function parseNonNegativeFact(value, path) {
|
|
108
|
+
const record = requireRecord(value, path);
|
|
109
|
+
return {
|
|
110
|
+
value: requireNonNegativeFinite(record.value, path + ".value"),
|
|
111
|
+
evidence: parseEvidenceList(record.evidence, path + ".evidence")
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function parsePositiveFact(value, path) {
|
|
115
|
+
const record = requireRecord(value, path);
|
|
116
|
+
return {
|
|
117
|
+
value: requirePositiveFinite(record.value, path + ".value"),
|
|
118
|
+
evidence: parseEvidenceList(record.evidence, path + ".evidence")
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function parseAxis(value, path) {
|
|
122
|
+
if (typeof value !== "string" ||
|
|
123
|
+
!AXES.has(value)) {
|
|
124
|
+
throw new InvalidConfigurationError(path + " is invalid.");
|
|
125
|
+
}
|
|
126
|
+
return value;
|
|
127
|
+
}
|
|
128
|
+
function parseAxisResponse(value, path) {
|
|
129
|
+
const record = requireRecord(value, path);
|
|
130
|
+
return {
|
|
131
|
+
axis: parseAxis(record.axis, path + ".axis"),
|
|
132
|
+
correctionGain: parseFractionFact(record.correctionGain, path +
|
|
133
|
+
".correctionGain"),
|
|
134
|
+
latencySeconds: parseNonNegativeFact(record.latencySeconds, path +
|
|
135
|
+
".latencySeconds"),
|
|
136
|
+
maximumCorrectionAngleRad: parsePositiveFact(record
|
|
137
|
+
.maximumCorrectionAngleRad, path +
|
|
138
|
+
".maximumCorrectionAngleRad")
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
function parsePanningPolicy(value, path) {
|
|
142
|
+
const record = requireRecord(value, path);
|
|
143
|
+
if (record.kind === "none") {
|
|
144
|
+
return {
|
|
145
|
+
kind: "none"
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
if (record.kind ===
|
|
149
|
+
"declared-axis-bypass") {
|
|
150
|
+
return {
|
|
151
|
+
kind: "declared-axis-bypass",
|
|
152
|
+
axis: parseAxis(record.axis, path + ".axis"),
|
|
153
|
+
evidence: parseEvidenceList(record.evidence, path + ".evidence")
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
throw new InvalidConfigurationError(path + ".kind is invalid.");
|
|
157
|
+
}
|
|
158
|
+
function parseCoordinatedAllocation(value, path) {
|
|
159
|
+
const record = requireRecord(value, path);
|
|
160
|
+
if (record
|
|
161
|
+
.totalCorrectionAppliedOnce !==
|
|
162
|
+
true) {
|
|
163
|
+
throw new InvalidConfigurationError(path +
|
|
164
|
+
".totalCorrectionAppliedOnce must be true.");
|
|
165
|
+
}
|
|
166
|
+
const bodyFraction = requireFraction(record.bodyFraction, path + ".bodyFraction");
|
|
167
|
+
const lensFraction = requireFraction(record.lensFraction, path + ".lensFraction");
|
|
168
|
+
if (Math.abs(bodyFraction +
|
|
169
|
+
lensFraction -
|
|
170
|
+
1) >
|
|
171
|
+
1e-12) {
|
|
172
|
+
throw new InvalidConfigurationError(path +
|
|
173
|
+
" bodyFraction + lensFraction must equal one.");
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
bodyFraction,
|
|
177
|
+
lensFraction,
|
|
178
|
+
evidence: parseEvidenceList(record.evidence, path + ".evidence"),
|
|
179
|
+
totalCorrectionAppliedOnce: true
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
|
|
184
|
+
* missing required fields and incompatible scientific data fail at this boundary.
|
|
185
|
+
*
|
|
186
|
+
* Generic stabilization evaluates declared angular disturbance with per-axis response, latency, limits
|
|
187
|
+
* and panning policy. Residual motion feeds the existing temporal mapping; no commercial IBIS/OIS
|
|
188
|
+
* calibration, arbitrary stop rating or inferred coordination is supplied.
|
|
189
|
+
* @param value - unknown. Treated as untrusted data; static typing alone is not validation.
|
|
190
|
+
* @returns StabilizationSystemProfile. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
191
|
+
*
|
|
192
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
193
|
+
*/
|
|
194
|
+
export function parseStabilizationSystemProfile(value) {
|
|
195
|
+
const record = requireRecord(value, "stabilizationSystemProfile");
|
|
196
|
+
if (record.schemaVersion !==
|
|
197
|
+
STABILIZATION_SYSTEM_PROFILE_SCHEMA_VERSION) {
|
|
198
|
+
throw new InvalidConfigurationError('stabilizationSystemProfile.schemaVersion must be "' +
|
|
199
|
+
STABILIZATION_SYSTEM_PROFILE_SCHEMA_VERSION +
|
|
200
|
+
'".');
|
|
201
|
+
}
|
|
202
|
+
if (record.profileKind !==
|
|
203
|
+
"generic-synthetic" ||
|
|
204
|
+
record.scientificStatus !==
|
|
205
|
+
"approximation") {
|
|
206
|
+
throw new InvalidConfigurationError('stabilizationSystemProfile schema 0.1.0 requires profileKind "generic-synthetic" and scientificStatus "approximation".');
|
|
207
|
+
}
|
|
208
|
+
if (typeof record.architecture !==
|
|
209
|
+
"string" ||
|
|
210
|
+
!ARCHITECTURES.has(record.architecture)) {
|
|
211
|
+
throw new InvalidConfigurationError("stabilizationSystemProfile.architecture is invalid.");
|
|
212
|
+
}
|
|
213
|
+
if (typeof record.captureKind !==
|
|
214
|
+
"string" ||
|
|
215
|
+
!CAPTURE_KINDS.has(record.captureKind)) {
|
|
216
|
+
throw new InvalidConfigurationError("stabilizationSystemProfile.captureKind is invalid.");
|
|
217
|
+
}
|
|
218
|
+
for (const key of [
|
|
219
|
+
"controlTransientModeled",
|
|
220
|
+
"spontaneousDriftModeled",
|
|
221
|
+
"cameraTranslationCorrectionModeled",
|
|
222
|
+
"digitalStabilizationIncluded",
|
|
223
|
+
"supportPolicyIncluded",
|
|
224
|
+
"stopRatingUsedAsDynamicResponse"
|
|
225
|
+
]) {
|
|
226
|
+
if (record[key] !== false) {
|
|
227
|
+
throw new InvalidConfigurationError("stabilizationSystemProfile." +
|
|
228
|
+
key +
|
|
229
|
+
" must be false in schema 0.1.0.");
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
if (!Array.isArray(record.axisResponses)) {
|
|
233
|
+
throw new InvalidConfigurationError("stabilizationSystemProfile.axisResponses must be an array.");
|
|
234
|
+
}
|
|
235
|
+
const axisResponses = record.axisResponses.map((entry, index) => parseAxisResponse(entry, "stabilizationSystemProfile.axisResponses[" +
|
|
236
|
+
index +
|
|
237
|
+
"]"));
|
|
238
|
+
const axes = axisResponses.map((entry) => entry.axis);
|
|
239
|
+
if (new Set(axes).size !==
|
|
240
|
+
axes.length) {
|
|
241
|
+
throw new InvalidConfigurationError("stabilizationSystemProfile.axisResponses must not contain duplicate axes.");
|
|
242
|
+
}
|
|
243
|
+
const architecture = record.architecture;
|
|
244
|
+
if (architecture === "off" &&
|
|
245
|
+
axisResponses.length !== 0) {
|
|
246
|
+
throw new InvalidConfigurationError("An off stabilization profile must not declare axis responses.");
|
|
247
|
+
}
|
|
248
|
+
if (architecture !== "off" &&
|
|
249
|
+
axisResponses.length === 0) {
|
|
250
|
+
throw new InvalidConfigurationError("An enabled physical stabilization profile must declare at least one axis response.");
|
|
251
|
+
}
|
|
252
|
+
const panningPolicy = parsePanningPolicy(record.panningPolicy, "stabilizationSystemProfile.panningPolicy");
|
|
253
|
+
if (architecture === "off" &&
|
|
254
|
+
panningPolicy.kind !== "none") {
|
|
255
|
+
throw new InvalidConfigurationError("An off stabilization profile must use panningPolicy.kind \"none\".");
|
|
256
|
+
}
|
|
257
|
+
if (panningPolicy.kind ===
|
|
258
|
+
"declared-axis-bypass" &&
|
|
259
|
+
!axisResponses.some((entry) => entry.axis ===
|
|
260
|
+
panningPolicy.axis)) {
|
|
261
|
+
throw new InvalidConfigurationError("Declared panning bypass axis must exist in axisResponses.");
|
|
262
|
+
}
|
|
263
|
+
const coordinatedAllocation = record.coordinatedAllocation ===
|
|
264
|
+
undefined
|
|
265
|
+
? undefined
|
|
266
|
+
: parseCoordinatedAllocation(record.coordinatedAllocation, "stabilizationSystemProfile.coordinatedAllocation");
|
|
267
|
+
if (architecture ===
|
|
268
|
+
"coordinated-physical" &&
|
|
269
|
+
coordinatedAllocation ===
|
|
270
|
+
undefined) {
|
|
271
|
+
throw new InvalidConfigurationError("Coordinated physical stabilization requires an explicit body/lens correction allocation.");
|
|
272
|
+
}
|
|
273
|
+
if (architecture !==
|
|
274
|
+
"coordinated-physical" &&
|
|
275
|
+
coordinatedAllocation !==
|
|
276
|
+
undefined) {
|
|
277
|
+
throw new InvalidConfigurationError("Only coordinated physical stabilization may declare coordinatedAllocation.");
|
|
278
|
+
}
|
|
279
|
+
return {
|
|
280
|
+
schemaVersion: STABILIZATION_SYSTEM_PROFILE_SCHEMA_VERSION,
|
|
281
|
+
profileId: requireNonEmptyString(record.profileId, "stabilizationSystemProfile.profileId"),
|
|
282
|
+
profileVersion: requireNonEmptyString(record.profileVersion, "stabilizationSystemProfile.profileVersion"),
|
|
283
|
+
profileKind: "generic-synthetic",
|
|
284
|
+
scientificStatus: "approximation",
|
|
285
|
+
architecture,
|
|
286
|
+
captureKind: record.captureKind,
|
|
287
|
+
axisResponses,
|
|
288
|
+
panningPolicy,
|
|
289
|
+
...(coordinatedAllocation ===
|
|
290
|
+
undefined
|
|
291
|
+
? {}
|
|
292
|
+
: {
|
|
293
|
+
coordinatedAllocation
|
|
294
|
+
}),
|
|
295
|
+
controlTransientModeled: false,
|
|
296
|
+
spontaneousDriftModeled: false,
|
|
297
|
+
cameraTranslationCorrectionModeled: false,
|
|
298
|
+
digitalStabilizationIncluded: false,
|
|
299
|
+
supportPolicyIncluded: false,
|
|
300
|
+
stopRatingUsedAsDynamicResponse: false,
|
|
301
|
+
evidence: parseEvidenceList(record.evidence, "stabilizationSystemProfile.evidence"),
|
|
302
|
+
limitations: parseLimitations(record.limitations, "stabilizationSystemProfile.limitations")
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
function parseAngularState(value, path) {
|
|
306
|
+
const record = requireRecord(value, path);
|
|
307
|
+
return {
|
|
308
|
+
pitch: requireFinite(record.pitch, path + ".pitch"),
|
|
309
|
+
yaw: requireFinite(record.yaw, path + ".yaw"),
|
|
310
|
+
roll: requireFinite(record.roll, path + ".roll")
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
|
|
315
|
+
* missing required fields and incompatible scientific data fail at this boundary.
|
|
316
|
+
*
|
|
317
|
+
* Generic stabilization evaluates declared angular disturbance with per-axis response, latency, limits
|
|
318
|
+
* and panning policy. Residual motion feeds the existing temporal mapping; no commercial IBIS/OIS
|
|
319
|
+
* calibration, arbitrary stop rating or inferred coordination is supplied.
|
|
320
|
+
* @param value - unknown. Treated as untrusted data; static typing alone is not validation.
|
|
321
|
+
* @returns StabilizationDisturbanceTrajectory. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
322
|
+
*
|
|
323
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
324
|
+
*/
|
|
325
|
+
export function parseStabilizationDisturbanceTrajectory(value) {
|
|
326
|
+
const record = requireRecord(value, "stabilizationDisturbanceTrajectory");
|
|
327
|
+
if (record.version !==
|
|
328
|
+
STABILIZATION_DISTURBANCE_TRAJECTORY_VERSION ||
|
|
329
|
+
record.timeReference !==
|
|
330
|
+
"first-opening-boundary-phase" ||
|
|
331
|
+
record
|
|
332
|
+
.initialAngularDisplacementIsZero !==
|
|
333
|
+
true ||
|
|
334
|
+
record
|
|
335
|
+
.cameraTranslationIncluded !==
|
|
336
|
+
false ||
|
|
337
|
+
record.subjectMotionIncluded !==
|
|
338
|
+
false ||
|
|
339
|
+
record.supportStateEncoded !==
|
|
340
|
+
false) {
|
|
341
|
+
throw new InvalidConfigurationError("stabilizationDisturbanceTrajectory metadata is invalid for version 0.1.0.");
|
|
342
|
+
}
|
|
343
|
+
if (!Array.isArray(record.samples) ||
|
|
344
|
+
record.samples.length < 2) {
|
|
345
|
+
throw new InvalidConfigurationError("stabilizationDisturbanceTrajectory.samples must contain at least two samples.");
|
|
346
|
+
}
|
|
347
|
+
let previousTime = Number.NEGATIVE_INFINITY;
|
|
348
|
+
const samples = record.samples.map((entry, index) => {
|
|
349
|
+
const path = "stabilizationDisturbanceTrajectory.samples[" +
|
|
350
|
+
index +
|
|
351
|
+
"]";
|
|
352
|
+
const sample = requireRecord(entry, path);
|
|
353
|
+
const time = requireNonNegativeFinite(sample
|
|
354
|
+
.timeSecondsFromCaptureReference, path +
|
|
355
|
+
".timeSecondsFromCaptureReference");
|
|
356
|
+
if (time <= previousTime) {
|
|
357
|
+
throw new InvalidConfigurationError("stabilizationDisturbanceTrajectory sample times must be strictly increasing.");
|
|
358
|
+
}
|
|
359
|
+
previousTime = time;
|
|
360
|
+
return {
|
|
361
|
+
timeSecondsFromCaptureReference: time,
|
|
362
|
+
angularDisplacementRad: parseAngularState(sample
|
|
363
|
+
.angularDisplacementRad, path +
|
|
364
|
+
".angularDisplacementRad")
|
|
365
|
+
};
|
|
366
|
+
});
|
|
367
|
+
const first = samples[0];
|
|
368
|
+
if (first
|
|
369
|
+
.timeSecondsFromCaptureReference !==
|
|
370
|
+
0 ||
|
|
371
|
+
first
|
|
372
|
+
.angularDisplacementRad
|
|
373
|
+
.pitch !== 0 ||
|
|
374
|
+
first
|
|
375
|
+
.angularDisplacementRad
|
|
376
|
+
.yaw !== 0 ||
|
|
377
|
+
first
|
|
378
|
+
.angularDisplacementRad
|
|
379
|
+
.roll !== 0) {
|
|
380
|
+
throw new InvalidConfigurationError("stabilizationDisturbanceTrajectory must begin at capture-reference t=0 with zero angular displacement.");
|
|
381
|
+
}
|
|
382
|
+
return {
|
|
383
|
+
version: STABILIZATION_DISTURBANCE_TRAJECTORY_VERSION,
|
|
384
|
+
trajectoryId: requireNonEmptyString(record.trajectoryId, "stabilizationDisturbanceTrajectory.trajectoryId"),
|
|
385
|
+
timeReference: "first-opening-boundary-phase",
|
|
386
|
+
samples,
|
|
387
|
+
initialAngularDisplacementIsZero: true,
|
|
388
|
+
cameraTranslationIncluded: false,
|
|
389
|
+
subjectMotionIncluded: false,
|
|
390
|
+
supportStateEncoded: false,
|
|
391
|
+
evidence: parseEvidenceList(record.evidence, "stabilizationDisturbanceTrajectory.evidence"),
|
|
392
|
+
limitations: parseLimitations(record.limitations, "stabilizationDisturbanceTrajectory.limitations")
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
function interpolateAxis(trajectory, timeSeconds, axis) {
|
|
396
|
+
const first = trajectory.samples[0];
|
|
397
|
+
const last = trajectory.samples[trajectory.samples.length -
|
|
398
|
+
1];
|
|
399
|
+
if (timeSeconds <
|
|
400
|
+
first
|
|
401
|
+
.timeSecondsFromCaptureReference ||
|
|
402
|
+
timeSeconds >
|
|
403
|
+
last
|
|
404
|
+
.timeSecondsFromCaptureReference) {
|
|
405
|
+
throw new InvalidScientificInputError("Requested stabilization evaluation time lies outside the disturbance trajectory support.");
|
|
406
|
+
}
|
|
407
|
+
if (timeSeconds ===
|
|
408
|
+
last
|
|
409
|
+
.timeSecondsFromCaptureReference) {
|
|
410
|
+
return last
|
|
411
|
+
.angularDisplacementRad[axis];
|
|
412
|
+
}
|
|
413
|
+
for (let index = 0; index <
|
|
414
|
+
trajectory.samples.length - 1; index += 1) {
|
|
415
|
+
const left = trajectory.samples[index];
|
|
416
|
+
const right = trajectory.samples[index + 1];
|
|
417
|
+
if (timeSeconds >=
|
|
418
|
+
left
|
|
419
|
+
.timeSecondsFromCaptureReference &&
|
|
420
|
+
timeSeconds <=
|
|
421
|
+
right
|
|
422
|
+
.timeSecondsFromCaptureReference) {
|
|
423
|
+
const duration = right
|
|
424
|
+
.timeSecondsFromCaptureReference -
|
|
425
|
+
left
|
|
426
|
+
.timeSecondsFromCaptureReference;
|
|
427
|
+
const phase = duration === 0
|
|
428
|
+
? 0
|
|
429
|
+
: (timeSeconds -
|
|
430
|
+
left
|
|
431
|
+
.timeSecondsFromCaptureReference) /
|
|
432
|
+
duration;
|
|
433
|
+
const a = left
|
|
434
|
+
.angularDisplacementRad[axis];
|
|
435
|
+
const b = right
|
|
436
|
+
.angularDisplacementRad[axis];
|
|
437
|
+
return (a +
|
|
438
|
+
(b - a) * phase);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
throw new InvalidScientificInputError("Disturbance trajectory interpolation failed.");
|
|
442
|
+
}
|
|
443
|
+
function axisValue(state, axis) {
|
|
444
|
+
return state[axis];
|
|
445
|
+
}
|
|
446
|
+
function setAxisValue(state, axis, value) {
|
|
447
|
+
state[axis] = value;
|
|
448
|
+
}
|
|
449
|
+
function clampSymmetric(value, limit) {
|
|
450
|
+
return Math.max(-limit, Math.min(limit, value));
|
|
451
|
+
}
|
|
452
|
+
function evaluateAtTime(disturbance, profile, timeSeconds) {
|
|
453
|
+
const current = {
|
|
454
|
+
pitch: interpolateAxis(disturbance, timeSeconds, "pitch"),
|
|
455
|
+
yaw: interpolateAxis(disturbance, timeSeconds, "yaw"),
|
|
456
|
+
roll: interpolateAxis(disturbance, timeSeconds, "roll")
|
|
457
|
+
};
|
|
458
|
+
const correction = {
|
|
459
|
+
pitch: 0,
|
|
460
|
+
yaw: 0,
|
|
461
|
+
roll: 0
|
|
462
|
+
};
|
|
463
|
+
const residual = {
|
|
464
|
+
...current
|
|
465
|
+
};
|
|
466
|
+
const responses = new Map(profile.axisResponses.map((response) => [
|
|
467
|
+
response.axis,
|
|
468
|
+
response
|
|
469
|
+
]));
|
|
470
|
+
const axes = ["pitch", "yaw", "roll"];
|
|
471
|
+
const resolvedAxes = axes.map((axis) => {
|
|
472
|
+
const response = responses.get(axis);
|
|
473
|
+
const bypassed = profile.panningPolicy.kind ===
|
|
474
|
+
"declared-axis-bypass" &&
|
|
475
|
+
profile.panningPolicy.axis ===
|
|
476
|
+
axis;
|
|
477
|
+
if (profile.architecture ===
|
|
478
|
+
"off" ||
|
|
479
|
+
response === undefined ||
|
|
480
|
+
bypassed) {
|
|
481
|
+
return {
|
|
482
|
+
axis,
|
|
483
|
+
disturbanceAngleRad: axisValue(current, axis),
|
|
484
|
+
delayedMeasuredAngleRad: 0,
|
|
485
|
+
requestedCorrectionAngleRad: 0,
|
|
486
|
+
appliedCorrectionAngleRad: 0,
|
|
487
|
+
residualAngleRad: axisValue(current, axis),
|
|
488
|
+
correctionGain: response?.correctionGain
|
|
489
|
+
.value ?? 0,
|
|
490
|
+
latencySeconds: response?.latencySeconds
|
|
491
|
+
.value ?? 0,
|
|
492
|
+
maximumCorrectionAngleRad: response
|
|
493
|
+
?.maximumCorrectionAngleRad
|
|
494
|
+
.value ?? 0,
|
|
495
|
+
bypassedForDeclaredPan: bypassed,
|
|
496
|
+
correctionLimitReached: false
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
const delayedTime = timeSeconds -
|
|
500
|
+
response
|
|
501
|
+
.latencySeconds.value;
|
|
502
|
+
const delayedMeasured = delayedTime < 0
|
|
503
|
+
? 0
|
|
504
|
+
: interpolateAxis(disturbance, delayedTime, axis);
|
|
505
|
+
const requested = delayedMeasured *
|
|
506
|
+
response
|
|
507
|
+
.correctionGain.value;
|
|
508
|
+
const applied = clampSymmetric(requested, response
|
|
509
|
+
.maximumCorrectionAngleRad
|
|
510
|
+
.value);
|
|
511
|
+
const residualAngle = axisValue(current, axis) -
|
|
512
|
+
applied;
|
|
513
|
+
setAxisValue(correction, axis, applied);
|
|
514
|
+
setAxisValue(residual, axis, residualAngle);
|
|
515
|
+
return {
|
|
516
|
+
axis,
|
|
517
|
+
disturbanceAngleRad: axisValue(current, axis),
|
|
518
|
+
delayedMeasuredAngleRad: delayedMeasured,
|
|
519
|
+
requestedCorrectionAngleRad: requested,
|
|
520
|
+
appliedCorrectionAngleRad: applied,
|
|
521
|
+
residualAngleRad: residualAngle,
|
|
522
|
+
correctionGain: response
|
|
523
|
+
.correctionGain.value,
|
|
524
|
+
latencySeconds: response
|
|
525
|
+
.latencySeconds.value,
|
|
526
|
+
maximumCorrectionAngleRad: response
|
|
527
|
+
.maximumCorrectionAngleRad
|
|
528
|
+
.value,
|
|
529
|
+
bypassedForDeclaredPan: false,
|
|
530
|
+
correctionLimitReached: applied !== requested
|
|
531
|
+
};
|
|
532
|
+
});
|
|
533
|
+
return {
|
|
534
|
+
timeSecondsFromCaptureReference: timeSeconds,
|
|
535
|
+
disturbanceAngularDisplacementRad: current,
|
|
536
|
+
appliedCorrectionAngularDisplacementRad: correction,
|
|
537
|
+
residualAngularDisplacementRad: residual,
|
|
538
|
+
axes: resolvedAxes
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
/**
|
|
542
|
+
* Evaluate the declared generic per-axis controller against an explicit angular disturbance trajectory
|
|
543
|
+
* and return residual motion with latency/limit diagnostics.
|
|
544
|
+
*
|
|
545
|
+
* Generic stabilization evaluates declared angular disturbance with per-axis response, latency, limits
|
|
546
|
+
* and panning policy. Residual motion feeds the existing temporal mapping; no commercial IBIS/OIS
|
|
547
|
+
* calibration, arbitrary stop rating or inferred coordination is supplied.
|
|
548
|
+
* @param input - CalculateStabilizedRotationTrajectoryInput. See the linked contract for coordinate, unit and profile binding semantics.
|
|
549
|
+
* @returns CalculationResult<StabilizedRotationTrajectory>. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
550
|
+
*
|
|
551
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
552
|
+
*/
|
|
553
|
+
export function calculateStabilizedRotationTrajectory(input) {
|
|
554
|
+
const disturbance = parseStabilizationDisturbanceTrajectory(input.disturbance);
|
|
555
|
+
const profile = parseStabilizationSystemProfile(input.profile);
|
|
556
|
+
if (input.captureKind !==
|
|
557
|
+
profile.captureKind) {
|
|
558
|
+
throw new InvalidScientificInputError("captureKind must exactly match the stabilization profile captureKind.");
|
|
559
|
+
}
|
|
560
|
+
const samples = disturbance.samples.map((sample) => evaluateAtTime(disturbance, profile, sample
|
|
561
|
+
.timeSecondsFromCaptureReference));
|
|
562
|
+
return approximationResult({
|
|
563
|
+
profileId: profile.profileId,
|
|
564
|
+
profileVersion: profile.profileVersion,
|
|
565
|
+
trajectoryId: disturbance.trajectoryId,
|
|
566
|
+
architecture: profile.architecture,
|
|
567
|
+
captureKind: input.captureKind,
|
|
568
|
+
timeReference: "first-opening-boundary-phase",
|
|
569
|
+
samples,
|
|
570
|
+
correctionModel: "delayed-linear-image-equivalent-angular-response",
|
|
571
|
+
supportStateConsumed: false,
|
|
572
|
+
translationCorrectionModeled: false,
|
|
573
|
+
digitalStabilizationApplied: false,
|
|
574
|
+
digitalStabilizationOwnedBy: "downstream-geometric-correction-composition",
|
|
575
|
+
coordinatedCorrectionDoubleCounted: false,
|
|
576
|
+
zeroDisturbanceCanCreateMotion: false
|
|
577
|
+
}, "generic-time-domain-physical-stabilization", "1.0.0", [
|
|
578
|
+
"The stabilization response is a generic synthetic image-equivalent rotational correction, not a manufacturer-specific IBIS/OIS calibration.",
|
|
579
|
+
"Correction uses explicit per-axis gain, latency and symmetric angular correction limits.",
|
|
580
|
+
"A coordinated profile allocates one total correction between body and lens for descriptive ownership only; the total correction is applied once.",
|
|
581
|
+
"Support state is not an input and never silently toggles stabilization.",
|
|
582
|
+
"Declared panning bypass suppresses correction only on the explicitly selected axis; pan intent is never inferred.",
|
|
583
|
+
"Camera translation/parallax correction is not modeled because translational image motion depends on scene depth.",
|
|
584
|
+
"Digital stabilization is a separate downstream geometric/crop/resampling domain.",
|
|
585
|
+
"CIPA-style stop ratings are not used as a dynamic response function.",
|
|
586
|
+
"The legacy stabilizationStopsEquivalent approximation remains unchanged."
|
|
587
|
+
]);
|
|
588
|
+
}
|
|
589
|
+
function localExposureForPoint(timing, point) {
|
|
590
|
+
const matches = timing.exposureWindows.samples.filter((sample) => sample.pointNative.x ===
|
|
591
|
+
point.x &&
|
|
592
|
+
sample.pointNative.y ===
|
|
593
|
+
point.y);
|
|
594
|
+
if (matches.length !== 1) {
|
|
595
|
+
throw new InvalidScientificInputError("Each stabilization sample point must match exactly one committed #12 exposure-window sample point.");
|
|
596
|
+
}
|
|
597
|
+
const match = matches[0];
|
|
598
|
+
return {
|
|
599
|
+
start: match
|
|
600
|
+
.startOffsetSecondsFromOpeningReference,
|
|
601
|
+
end: match
|
|
602
|
+
.endOffsetSecondsFromOpeningReference,
|
|
603
|
+
duration: match
|
|
604
|
+
.localExposureDurationSeconds
|
|
605
|
+
};
|
|
606
|
+
}
|
|
607
|
+
/**
|
|
608
|
+
* Feed the residual stabilized rotation into the existing local-exposure temporal mapping without
|
|
609
|
+
* changing shutter timing or inventing a blur radius.
|
|
610
|
+
*
|
|
611
|
+
* Generic stabilization evaluates declared angular disturbance with per-axis response, latency, limits
|
|
612
|
+
* and panning policy. Residual motion feeds the existing temporal mapping; no commercial IBIS/OIS
|
|
613
|
+
* calibration, arbitrary stop rating or inferred coordination is supplied.
|
|
614
|
+
* @param input - CalculateStabilizedCaptureTemporalSamplesInput. See the linked contract for coordinate, unit and profile binding semantics.
|
|
615
|
+
* @returns CalculationResult<StabilizedCaptureTemporalSamples>. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
616
|
+
*
|
|
617
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
618
|
+
*/
|
|
619
|
+
export function calculateStabilizedCaptureTemporalSamples(input) {
|
|
620
|
+
const disturbance = parseStabilizationDisturbanceTrajectory(input.disturbance);
|
|
621
|
+
const profile = parseStabilizationSystemProfile(input.profile);
|
|
622
|
+
if (input.captureKind !==
|
|
623
|
+
profile.captureKind) {
|
|
624
|
+
throw new InvalidScientificInputError("captureKind must exactly match the stabilization profile captureKind.");
|
|
625
|
+
}
|
|
626
|
+
requirePositiveInteger("temporalSampleCount", input.temporalSampleCount);
|
|
627
|
+
if (!Array.isArray(input.samplePointsNative) ||
|
|
628
|
+
input.samplePointsNative.length ===
|
|
629
|
+
0) {
|
|
630
|
+
throw new InvalidScientificInputError("samplePointsNative must be a non-empty array.");
|
|
631
|
+
}
|
|
632
|
+
const totalNodeCount = input.temporalSampleCount *
|
|
633
|
+
input.samplePointsNative.length;
|
|
634
|
+
if (!Number.isSafeInteger(totalNodeCount)) {
|
|
635
|
+
throw new InvalidScientificInputError("temporalSampleCount × samplePointsNative.length must remain a safe integer.");
|
|
636
|
+
}
|
|
637
|
+
const points = input.samplePointsNative.map((point) => {
|
|
638
|
+
const exposure = localExposureForPoint(input.timing, point);
|
|
639
|
+
const normalizedTimeWeight = 1 /
|
|
640
|
+
input.temporalSampleCount;
|
|
641
|
+
const timeMeasureSeconds = exposure.duration /
|
|
642
|
+
input.temporalSampleCount;
|
|
643
|
+
const nodes = Array.from({
|
|
644
|
+
length: input.temporalSampleCount
|
|
645
|
+
}, (_, temporalSampleIndex) => {
|
|
646
|
+
const localExposurePhase = (temporalSampleIndex +
|
|
647
|
+
0.5) /
|
|
648
|
+
input.temporalSampleCount;
|
|
649
|
+
const captureTime = exposure.start +
|
|
650
|
+
localExposurePhase *
|
|
651
|
+
exposure.duration;
|
|
652
|
+
return {
|
|
653
|
+
temporalSampleIndex,
|
|
654
|
+
localExposurePhase,
|
|
655
|
+
captureTimeSecondsFromReference: captureTime,
|
|
656
|
+
normalizedTimeWeight,
|
|
657
|
+
timeMeasureSeconds,
|
|
658
|
+
stabilization: evaluateAtTime(disturbance, profile, captureTime)
|
|
659
|
+
};
|
|
660
|
+
});
|
|
661
|
+
return {
|
|
662
|
+
destinationPointNative: {
|
|
663
|
+
...point
|
|
664
|
+
},
|
|
665
|
+
localExposureWindow: {
|
|
666
|
+
startSecondsFromCaptureReference: exposure.start,
|
|
667
|
+
endSecondsFromCaptureReference: exposure.end,
|
|
668
|
+
durationSeconds: exposure.duration
|
|
669
|
+
},
|
|
670
|
+
nodes
|
|
671
|
+
};
|
|
672
|
+
});
|
|
673
|
+
return approximationResult({
|
|
674
|
+
profileId: profile.profileId,
|
|
675
|
+
trajectoryId: disturbance.trajectoryId,
|
|
676
|
+
captureModeId: input.timing.captureModeId,
|
|
677
|
+
timingProfileId: input.timing.timingProfileId,
|
|
678
|
+
captureKind: input.captureKind,
|
|
679
|
+
architecture: profile.architecture,
|
|
680
|
+
timeReference: "first-opening-boundary-phase",
|
|
681
|
+
quadratureScheme: "uniform-midpoint",
|
|
682
|
+
temporalSampleCount: input.temporalSampleCount,
|
|
683
|
+
points,
|
|
684
|
+
sensorReadoutTimingUsedAsExposureTiming: false,
|
|
685
|
+
supportStateConsumed: false,
|
|
686
|
+
translationCorrectionModeled: false,
|
|
687
|
+
digitalStabilizationApplied: false
|
|
688
|
+
}, "capture-local-stabilization-temporal-sampling", "1.0.0", [
|
|
689
|
+
"Stabilization is evaluated at deterministic midpoint nodes inside each authoritative #12 local exposure window.",
|
|
690
|
+
"Sensor data-readout timing is not substituted for exposure timing.",
|
|
691
|
+
"The result is rotational disturbance/correction/residual state only; it does not itself calculate image-plane mapping, radiance, blur, PSF or output pixels.",
|
|
692
|
+
"Translation/parallax, subject motion, shutter shock, support vibration sources and digital stabilization remain separate domains."
|
|
693
|
+
]);
|
|
694
|
+
}
|
|
695
|
+
//# sourceMappingURL=system.js.map
|