@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,672 @@
|
|
|
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. Operating-range
|
|
6
|
+
* assessment preserves incident power versus irradiance, wavelength support, reference conditions and
|
|
7
|
+
* declared nonlinearity criterion. Per-bin conversion requires spectral-bin applicability and spatial
|
|
8
|
+
* linear superposition. Valid mean input must not conceal an invalid bright local sub-aperture.
|
|
9
|
+
* Assess every declared spectral-bin input against operating applicability and superposition before
|
|
10
|
+
* authorizing instantaneous response conversion. Operating-range assessment preserves incident power
|
|
11
|
+
* versus irradiance, wavelength support, reference conditions and declared nonlinearity criterion.
|
|
12
|
+
* Per-bin conversion requires spectral-bin applicability and spatial linear superposition. Valid mean
|
|
13
|
+
* input must not conceal an invalid bright local sub-aperture.
|
|
14
|
+
* @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
|
|
15
|
+
* limits.
|
|
16
|
+
*/
|
|
17
|
+
import { calculatedResult } from "../core/calculation-result.js";
|
|
18
|
+
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
19
|
+
import { parseEvidenceList } from "../core/evidence-provenance.js";
|
|
20
|
+
import { InvalidScientificInputError } from "../core/validation.js";
|
|
21
|
+
function requireRecord(value, path) {
|
|
22
|
+
if (typeof value !== "object" ||
|
|
23
|
+
value === null ||
|
|
24
|
+
Array.isArray(value)) {
|
|
25
|
+
throw new InvalidConfigurationError(path + " must be an object.");
|
|
26
|
+
}
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
function requireNonEmptyString(value, path) {
|
|
30
|
+
if (typeof value !== "string" ||
|
|
31
|
+
value.trim().length === 0) {
|
|
32
|
+
throw new InvalidConfigurationError(path + " must be a non-empty string.");
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
function requireFiniteNonNegative(value, path) {
|
|
37
|
+
if (typeof value !== "number" ||
|
|
38
|
+
!Number.isFinite(value) ||
|
|
39
|
+
value < 0) {
|
|
40
|
+
throw new InvalidConfigurationError(path +
|
|
41
|
+
" must be finite and greater than or equal to zero.");
|
|
42
|
+
}
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
function requirePositiveFinite(value, path) {
|
|
46
|
+
if (typeof value !== "number" ||
|
|
47
|
+
!Number.isFinite(value) ||
|
|
48
|
+
value <= 0) {
|
|
49
|
+
throw new InvalidConfigurationError(path +
|
|
50
|
+
" must be finite and greater than zero.");
|
|
51
|
+
}
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
function parseUncertainty(value, path) {
|
|
55
|
+
const record = requireRecord(value, path);
|
|
56
|
+
if (record.kind === "relative") {
|
|
57
|
+
const fraction = requireFiniteNonNegative(record.fraction, path + ".fraction");
|
|
58
|
+
return {
|
|
59
|
+
kind: "relative",
|
|
60
|
+
fraction,
|
|
61
|
+
basis: requireNonEmptyString(record.basis, path + ".basis")
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
if (record.kind === "not-quantified") {
|
|
65
|
+
return {
|
|
66
|
+
kind: "not-quantified",
|
|
67
|
+
limitation: requireNonEmptyString(record.limitation, path + ".limitation")
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
throw new InvalidConfigurationError(path + ".kind is invalid.");
|
|
71
|
+
}
|
|
72
|
+
function parseReferenceConditions(value, path) {
|
|
73
|
+
const record = requireRecord(value, path);
|
|
74
|
+
const result = {};
|
|
75
|
+
if (record.temperatureC !== undefined) {
|
|
76
|
+
if (typeof record.temperatureC !==
|
|
77
|
+
"number" ||
|
|
78
|
+
!Number.isFinite(record.temperatureC)) {
|
|
79
|
+
throw new InvalidConfigurationError(path +
|
|
80
|
+
".temperatureC must be finite.");
|
|
81
|
+
}
|
|
82
|
+
result.temperatureC =
|
|
83
|
+
record.temperatureC;
|
|
84
|
+
}
|
|
85
|
+
if (record.incidenceAngleDegreesFromNormal !==
|
|
86
|
+
undefined) {
|
|
87
|
+
const angle = record
|
|
88
|
+
.incidenceAngleDegreesFromNormal;
|
|
89
|
+
if (typeof angle !== "number" ||
|
|
90
|
+
!Number.isFinite(angle) ||
|
|
91
|
+
angle < 0 ||
|
|
92
|
+
angle > 90) {
|
|
93
|
+
throw new InvalidConfigurationError(path +
|
|
94
|
+
".incidenceAngleDegreesFromNormal must be finite from 0 through 90.");
|
|
95
|
+
}
|
|
96
|
+
result.incidenceAngleDegreesFromNormal =
|
|
97
|
+
angle;
|
|
98
|
+
}
|
|
99
|
+
if (record.polarization !== undefined) {
|
|
100
|
+
if (record.polarization !==
|
|
101
|
+
"unpolarized" &&
|
|
102
|
+
record.polarization !==
|
|
103
|
+
"unspecified") {
|
|
104
|
+
throw new InvalidConfigurationError(path +
|
|
105
|
+
".polarization is invalid.");
|
|
106
|
+
}
|
|
107
|
+
result.polarization =
|
|
108
|
+
record.polarization;
|
|
109
|
+
}
|
|
110
|
+
if (result.temperatureC === undefined &&
|
|
111
|
+
result
|
|
112
|
+
.incidenceAngleDegreesFromNormal ===
|
|
113
|
+
undefined &&
|
|
114
|
+
result.polarization === undefined) {
|
|
115
|
+
throw new InvalidConfigurationError(path +
|
|
116
|
+
" must declare at least one condition.");
|
|
117
|
+
}
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
120
|
+
function parseReferenceConditionPolicy(value, path) {
|
|
121
|
+
const record = requireRecord(value, path);
|
|
122
|
+
if (record.kind ===
|
|
123
|
+
"exact-match-required") {
|
|
124
|
+
return {
|
|
125
|
+
kind: "exact-match-required"
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
if (record.kind === "assume-compatible") {
|
|
129
|
+
return {
|
|
130
|
+
kind: "assume-compatible",
|
|
131
|
+
limitation: requireNonEmptyString(record.limitation, path + ".limitation"),
|
|
132
|
+
evidence: parseEvidenceList(record.evidence, path + ".evidence")
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
throw new InvalidConfigurationError(path + ".kind is invalid.");
|
|
136
|
+
}
|
|
137
|
+
function parseInputRange(value, path) {
|
|
138
|
+
const record = requireRecord(value, path);
|
|
139
|
+
const minimumInclusive = requireFiniteNonNegative(record.minimumInclusive, path + ".minimumInclusive");
|
|
140
|
+
const maximumInclusive = requirePositiveFinite(record.maximumInclusive, path + ".maximumInclusive");
|
|
141
|
+
if (minimumInclusive >=
|
|
142
|
+
maximumInclusive) {
|
|
143
|
+
throw new InvalidConfigurationError(path +
|
|
144
|
+
".minimumInclusive must be less than maximumInclusive.");
|
|
145
|
+
}
|
|
146
|
+
if (record.kind ===
|
|
147
|
+
"wavelength-integrated-geometric-aperture-radiant-power") {
|
|
148
|
+
if (record.unit !== "W") {
|
|
149
|
+
throw new InvalidConfigurationError(path +
|
|
150
|
+
'.unit must be "W".');
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
kind: "wavelength-integrated-geometric-aperture-radiant-power",
|
|
154
|
+
unit: "W",
|
|
155
|
+
minimumInclusive,
|
|
156
|
+
maximumInclusive
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
if (record.kind ===
|
|
160
|
+
"wavelength-integrated-spatial-average-irradiance") {
|
|
161
|
+
if (record.unit !== "W/m^2") {
|
|
162
|
+
throw new InvalidConfigurationError(path +
|
|
163
|
+
'.unit must be "W/m^2".');
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
kind: "wavelength-integrated-spatial-average-irradiance",
|
|
167
|
+
unit: "W/m^2",
|
|
168
|
+
minimumInclusive,
|
|
169
|
+
maximumInclusive
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
throw new InvalidConfigurationError(path + ".kind is invalid.");
|
|
173
|
+
}
|
|
174
|
+
function parseWavelengthApplicability(value, path) {
|
|
175
|
+
const record = requireRecord(value, path);
|
|
176
|
+
if (record.wavelengthBasis !== "air" &&
|
|
177
|
+
record.wavelengthBasis !==
|
|
178
|
+
"vacuum") {
|
|
179
|
+
throw new InvalidConfigurationError(path +
|
|
180
|
+
'.wavelengthBasis must be "air" or "vacuum".');
|
|
181
|
+
}
|
|
182
|
+
const minimumNanometers = requirePositiveFinite(record.minimumNanometers, path + ".minimumNanometers");
|
|
183
|
+
const maximumNanometers = requirePositiveFinite(record.maximumNanometers, path + ".maximumNanometers");
|
|
184
|
+
if (minimumNanometers >=
|
|
185
|
+
maximumNanometers) {
|
|
186
|
+
throw new InvalidConfigurationError(path +
|
|
187
|
+
".minimumNanometers must be less than maximumNanometers.");
|
|
188
|
+
}
|
|
189
|
+
if (record.containment !==
|
|
190
|
+
"requested-range-must-be-contained") {
|
|
191
|
+
throw new InvalidConfigurationError(path +
|
|
192
|
+
'.containment must be "requested-range-must-be-contained".');
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
wavelengthBasis: record.wavelengthBasis,
|
|
196
|
+
minimumNanometers,
|
|
197
|
+
maximumNanometers,
|
|
198
|
+
containment: "requested-range-must-be-contained"
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
function parseLinearityCriterion(value, path) {
|
|
202
|
+
const record = requireRecord(value, path);
|
|
203
|
+
const maximumAbsoluteRelativeDeviation = requireFiniteNonNegative(record
|
|
204
|
+
.maximumAbsoluteRelativeDeviation, path +
|
|
205
|
+
".maximumAbsoluteRelativeDeviation");
|
|
206
|
+
if (maximumAbsoluteRelativeDeviation >
|
|
207
|
+
1) {
|
|
208
|
+
throw new InvalidConfigurationError(path +
|
|
209
|
+
".maximumAbsoluteRelativeDeviation must be a fraction from 0 through 1.");
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
maximumAbsoluteRelativeDeviation
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
function parseSpectralInputModel(value) {
|
|
216
|
+
if (value === undefined) {
|
|
217
|
+
return {
|
|
218
|
+
kind: "broadband-integrated-only"
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
const record = requireRecord(value, "sensorResponseOperatingRange.spectralInputModel");
|
|
222
|
+
if (record.kind ===
|
|
223
|
+
"broadband-integrated-only") {
|
|
224
|
+
return {
|
|
225
|
+
kind: "broadband-integrated-only"
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
if (record.kind !==
|
|
229
|
+
"per-spectral-bin") {
|
|
230
|
+
throw new InvalidConfigurationError("sensorResponseOperatingRange.spectralInputModel.kind is invalid.");
|
|
231
|
+
}
|
|
232
|
+
if (record.scientificStatus !==
|
|
233
|
+
"calibrated" &&
|
|
234
|
+
record.scientificStatus !==
|
|
235
|
+
"approximation") {
|
|
236
|
+
throw new InvalidConfigurationError("sensorResponseOperatingRange.spectralInputModel.scientificStatus is invalid.");
|
|
237
|
+
}
|
|
238
|
+
const maximumBinWidthNanometers = requirePositiveFinite(record.maximumBinWidthNanometers, "sensorResponseOperatingRange.spectralInputModel.maximumBinWidthNanometers");
|
|
239
|
+
const limitation = record.limitation === undefined
|
|
240
|
+
? undefined
|
|
241
|
+
: requireNonEmptyString(record.limitation, "sensorResponseOperatingRange.spectralInputModel.limitation");
|
|
242
|
+
if (record.scientificStatus ===
|
|
243
|
+
"approximation" &&
|
|
244
|
+
limitation === undefined) {
|
|
245
|
+
throw new InvalidConfigurationError("sensorResponseOperatingRange.spectralInputModel.limitation is required for an approximation.");
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
kind: "per-spectral-bin",
|
|
249
|
+
maximumBinWidthNanometers,
|
|
250
|
+
scientificStatus: record.scientificStatus,
|
|
251
|
+
evidence: parseEvidenceList(record.evidence, "sensorResponseOperatingRange.spectralInputModel.evidence"),
|
|
252
|
+
...(limitation === undefined
|
|
253
|
+
? {}
|
|
254
|
+
: { limitation })
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
function parseSpatialLinearityModel(value) {
|
|
258
|
+
if (value === undefined) {
|
|
259
|
+
return {
|
|
260
|
+
kind: "not-established",
|
|
261
|
+
limitation: "Spatial-distribution linear superposition was not declared."
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
const record = requireRecord(value, "sensorResponseOperatingRange.spatialLinearityModel");
|
|
265
|
+
if (record.kind === "not-established") {
|
|
266
|
+
return {
|
|
267
|
+
kind: "not-established",
|
|
268
|
+
limitation: requireNonEmptyString(record.limitation, "sensorResponseOperatingRange.spatialLinearityModel.limitation")
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
if (record.kind !==
|
|
272
|
+
"linear-superposition-over-geometric-aperture") {
|
|
273
|
+
throw new InvalidConfigurationError("sensorResponseOperatingRange.spatialLinearityModel.kind is invalid.");
|
|
274
|
+
}
|
|
275
|
+
if (record.scientificStatus !==
|
|
276
|
+
"calibrated" &&
|
|
277
|
+
record.scientificStatus !==
|
|
278
|
+
"approximation") {
|
|
279
|
+
throw new InvalidConfigurationError("sensorResponseOperatingRange.spatialLinearityModel.scientificStatus is invalid.");
|
|
280
|
+
}
|
|
281
|
+
const limitation = record.limitation === undefined
|
|
282
|
+
? undefined
|
|
283
|
+
: requireNonEmptyString(record.limitation, "sensorResponseOperatingRange.spatialLinearityModel.limitation");
|
|
284
|
+
if (record.scientificStatus ===
|
|
285
|
+
"approximation" &&
|
|
286
|
+
limitation === undefined) {
|
|
287
|
+
throw new InvalidConfigurationError("sensorResponseOperatingRange.spatialLinearityModel.limitation is required for an approximation.");
|
|
288
|
+
}
|
|
289
|
+
return {
|
|
290
|
+
kind: "linear-superposition-over-geometric-aperture",
|
|
291
|
+
scientificStatus: record.scientificStatus,
|
|
292
|
+
evidence: parseEvidenceList(record.evidence, "sensorResponseOperatingRange.spatialLinearityModel.evidence"),
|
|
293
|
+
...(limitation === undefined
|
|
294
|
+
? {}
|
|
295
|
+
: { limitation })
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
|
|
300
|
+
* missing required fields and incompatible scientific data fail at this boundary.
|
|
301
|
+
*
|
|
302
|
+
* Operating-range assessment preserves incident power versus irradiance, wavelength support, reference
|
|
303
|
+
* conditions and declared nonlinearity criterion. Per-bin conversion requires spectral-bin
|
|
304
|
+
* applicability and spatial linear superposition. Valid mean input must not conceal an invalid bright
|
|
305
|
+
* local sub-aperture.
|
|
306
|
+
* @param value - unknown. Treated as untrusted data; static typing alone is not validation.
|
|
307
|
+
* @returns SensorResponseOperatingRangeProfile. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
308
|
+
*
|
|
309
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
310
|
+
*/
|
|
311
|
+
export function parseSensorResponseOperatingRangeProfile(value) {
|
|
312
|
+
const record = requireRecord(value, "sensorResponseOperatingRange");
|
|
313
|
+
if (record.schemaVersion !== "0.1.0") {
|
|
314
|
+
throw new InvalidConfigurationError('sensorResponseOperatingRange.schemaVersion must be "0.1.0".');
|
|
315
|
+
}
|
|
316
|
+
if (record.scientificStatus !==
|
|
317
|
+
"calibrated" &&
|
|
318
|
+
record.scientificStatus !==
|
|
319
|
+
"approximation") {
|
|
320
|
+
throw new InvalidConfigurationError("sensorResponseOperatingRange.scientificStatus is invalid.");
|
|
321
|
+
}
|
|
322
|
+
const referenceConditions = record.referenceConditions ===
|
|
323
|
+
undefined
|
|
324
|
+
? undefined
|
|
325
|
+
: parseReferenceConditions(record.referenceConditions, "sensorResponseOperatingRange.referenceConditions");
|
|
326
|
+
const referenceConditionPolicy = parseReferenceConditionPolicy(record.referenceConditionPolicy, "sensorResponseOperatingRange.referenceConditionPolicy");
|
|
327
|
+
if (referenceConditionPolicy.kind ===
|
|
328
|
+
"exact-match-required" &&
|
|
329
|
+
referenceConditions === undefined) {
|
|
330
|
+
throw new InvalidConfigurationError("sensorResponseOperatingRange.referenceConditions is required when exact-match-required is selected.");
|
|
331
|
+
}
|
|
332
|
+
const uncertainty = parseUncertainty(record.uncertainty, "sensorResponseOperatingRange.uncertainty");
|
|
333
|
+
if (record.scientificStatus ===
|
|
334
|
+
"calibrated" &&
|
|
335
|
+
uncertainty.kind ===
|
|
336
|
+
"not-quantified") {
|
|
337
|
+
throw new InvalidConfigurationError("A calibrated sensor response operating range must declare quantified relative uncertainty.");
|
|
338
|
+
}
|
|
339
|
+
return {
|
|
340
|
+
schemaVersion: "0.1.0",
|
|
341
|
+
profileId: requireNonEmptyString(record.profileId, "sensorResponseOperatingRange.profileId"),
|
|
342
|
+
responseApplicationProfileId: requireNonEmptyString(record
|
|
343
|
+
.responseApplicationProfileId, "sensorResponseOperatingRange.responseApplicationProfileId"),
|
|
344
|
+
spectralResponseProfileId: requireNonEmptyString(record
|
|
345
|
+
.spectralResponseProfileId, "sensorResponseOperatingRange.spectralResponseProfileId"),
|
|
346
|
+
colorSamplingProfileId: requireNonEmptyString(record.colorSamplingProfileId, "sensorResponseOperatingRange.colorSamplingProfileId"),
|
|
347
|
+
channelId: requireNonEmptyString(record.channelId, "sensorResponseOperatingRange.channelId"),
|
|
348
|
+
scientificStatus: record.scientificStatus,
|
|
349
|
+
uncertainty,
|
|
350
|
+
evidence: parseEvidenceList(record.evidence, "sensorResponseOperatingRange.evidence"),
|
|
351
|
+
inputRange: parseInputRange(record.inputRange, "sensorResponseOperatingRange.inputRange"),
|
|
352
|
+
wavelengthApplicability: parseWavelengthApplicability(record.wavelengthApplicability, "sensorResponseOperatingRange.wavelengthApplicability"),
|
|
353
|
+
linearityCriterion: parseLinearityCriterion(record.linearityCriterion, "sensorResponseOperatingRange.linearityCriterion"),
|
|
354
|
+
spatialLinearityModel: parseSpatialLinearityModel(record.spatialLinearityModel),
|
|
355
|
+
spectralInputModel: parseSpectralInputModel(record.spectralInputModel),
|
|
356
|
+
...(referenceConditions ===
|
|
357
|
+
undefined
|
|
358
|
+
? {}
|
|
359
|
+
: { referenceConditions }),
|
|
360
|
+
referenceConditionPolicy
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
function conditionsMatch(reference, operating) {
|
|
364
|
+
if (reference.temperatureC !==
|
|
365
|
+
undefined &&
|
|
366
|
+
operating.temperatureC !==
|
|
367
|
+
reference.temperatureC) {
|
|
368
|
+
return false;
|
|
369
|
+
}
|
|
370
|
+
if (reference
|
|
371
|
+
.incidenceAngleDegreesFromNormal !==
|
|
372
|
+
undefined &&
|
|
373
|
+
operating
|
|
374
|
+
.incidenceAngleDegreesFromNormal !==
|
|
375
|
+
reference
|
|
376
|
+
.incidenceAngleDegreesFromNormal) {
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
if (reference.polarization !==
|
|
380
|
+
undefined &&
|
|
381
|
+
operating.polarization !==
|
|
382
|
+
reference.polarization) {
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
385
|
+
return true;
|
|
386
|
+
}
|
|
387
|
+
function requireReductionMetric(reduction, range) {
|
|
388
|
+
const value = range.kind ===
|
|
389
|
+
"wavelength-integrated-geometric-aperture-radiant-power"
|
|
390
|
+
? reduction
|
|
391
|
+
.wavelengthIntegratedGeometricApertureIncidentFluxWatts
|
|
392
|
+
: reduction
|
|
393
|
+
.wavelengthIntegratedSpatialAverageIrradianceWattsPerSquareMeter;
|
|
394
|
+
if (typeof value !== "number" ||
|
|
395
|
+
!Number.isFinite(value) ||
|
|
396
|
+
value < 0) {
|
|
397
|
+
throw new InvalidScientificInputError("The selected operating-range input metric must be finite and nonnegative.");
|
|
398
|
+
}
|
|
399
|
+
return value;
|
|
400
|
+
}
|
|
401
|
+
function spectralNodeInputValue(entry, range) {
|
|
402
|
+
const value = range.kind ===
|
|
403
|
+
"wavelength-integrated-geometric-aperture-radiant-power"
|
|
404
|
+
? entry
|
|
405
|
+
.wavelengthIntegratedGeometricApertureIncidentFluxContributionWatts
|
|
406
|
+
: entry
|
|
407
|
+
.wavelengthIntegratedSpatialAverageContributionWattsPerSquareMeter;
|
|
408
|
+
if (typeof value !== "number" ||
|
|
409
|
+
!Number.isFinite(value) ||
|
|
410
|
+
value < 0) {
|
|
411
|
+
throw new InvalidScientificInputError("Per-spectral-node operating-range input must be finite and nonnegative.");
|
|
412
|
+
}
|
|
413
|
+
return value;
|
|
414
|
+
}
|
|
415
|
+
function validateReductionIdentity(reduction, compatibility) {
|
|
416
|
+
if (reduction.responseProfileId !==
|
|
417
|
+
compatibility
|
|
418
|
+
.spectralResponseProfileId ||
|
|
419
|
+
reduction.colorSamplingProfileId !==
|
|
420
|
+
compatibility
|
|
421
|
+
.colorSamplingProfileId ||
|
|
422
|
+
reduction.channelId !==
|
|
423
|
+
compatibility.channelId) {
|
|
424
|
+
throw new InvalidScientificInputError("reduction and compatibility assessment identities do not match.");
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Assess every declared spectral-bin input against operating applicability and superposition before
|
|
429
|
+
* authorizing instantaneous response conversion.
|
|
430
|
+
*
|
|
431
|
+
* Operating-range assessment preserves incident power versus irradiance, wavelength support, reference
|
|
432
|
+
* conditions and declared nonlinearity criterion. Per-bin conversion requires spectral-bin
|
|
433
|
+
* applicability and spatial linear superposition. Valid mean input must not conceal an invalid bright
|
|
434
|
+
* local sub-aperture.
|
|
435
|
+
* @param input - AssessSensorResponseOperatingRangeInput. See the linked contract for coordinate, unit and profile binding semantics.
|
|
436
|
+
* @returns CalculationResult<SensorResponseOperatingRangeAssessment>. Read structured blockers before consuming an authorization.
|
|
437
|
+
*
|
|
438
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
439
|
+
*/
|
|
440
|
+
export function assessSensorResponseOperatingRange(input) {
|
|
441
|
+
validateReductionIdentity(input.reduction, input.compatibility);
|
|
442
|
+
const profile = parseSensorResponseOperatingRangeProfile(input.operatingRangeProfile);
|
|
443
|
+
const blockers = [];
|
|
444
|
+
if (!input.compatibility
|
|
445
|
+
.structuralCompatibilityEstablished ||
|
|
446
|
+
input.compatibility
|
|
447
|
+
.compatibilityStatus === "blocked") {
|
|
448
|
+
blockers.push("structural-compatibility-not-established");
|
|
449
|
+
}
|
|
450
|
+
if (profile.responseApplicationProfileId !==
|
|
451
|
+
input.compatibility
|
|
452
|
+
.applicationProfileId) {
|
|
453
|
+
blockers.push("response-application-profile-id-mismatch");
|
|
454
|
+
}
|
|
455
|
+
if (profile.spectralResponseProfileId !==
|
|
456
|
+
input.reduction
|
|
457
|
+
.responseProfileId) {
|
|
458
|
+
blockers.push("spectral-response-profile-id-mismatch");
|
|
459
|
+
}
|
|
460
|
+
if (profile.colorSamplingProfileId !==
|
|
461
|
+
input.reduction
|
|
462
|
+
.colorSamplingProfileId) {
|
|
463
|
+
blockers.push("color-sampling-profile-id-mismatch");
|
|
464
|
+
}
|
|
465
|
+
if (profile.channelId !==
|
|
466
|
+
input.reduction.channelId) {
|
|
467
|
+
blockers.push("channel-id-mismatch");
|
|
468
|
+
}
|
|
469
|
+
if (!input.reduction
|
|
470
|
+
.wavelengthBasisResolved) {
|
|
471
|
+
blockers.push("wavelength-basis-unresolved");
|
|
472
|
+
}
|
|
473
|
+
else if (input.reduction.wavelengthBasis !==
|
|
474
|
+
profile.wavelengthApplicability
|
|
475
|
+
.wavelengthBasis) {
|
|
476
|
+
blockers.push("wavelength-basis-mismatch");
|
|
477
|
+
}
|
|
478
|
+
const wavelengthRange = input.reduction
|
|
479
|
+
.wavelengthRangeNanometers;
|
|
480
|
+
if (wavelengthRange.minimum <
|
|
481
|
+
profile.wavelengthApplicability
|
|
482
|
+
.minimumNanometers ||
|
|
483
|
+
wavelengthRange.maximum >
|
|
484
|
+
profile.wavelengthApplicability
|
|
485
|
+
.maximumNanometers) {
|
|
486
|
+
blockers.push("wavelength-range-outside-linearity-applicability");
|
|
487
|
+
}
|
|
488
|
+
const metricValue = requireReductionMetric(input.reduction, profile.inputRange);
|
|
489
|
+
if (metricValue <
|
|
490
|
+
profile.inputRange.minimumInclusive) {
|
|
491
|
+
blockers.push("input-below-linearity-range");
|
|
492
|
+
}
|
|
493
|
+
if (metricValue >
|
|
494
|
+
profile.inputRange.maximumInclusive) {
|
|
495
|
+
blockers.push("input-above-linearity-range");
|
|
496
|
+
}
|
|
497
|
+
const spectralInputModel = profile.spectralInputModel ?? {
|
|
498
|
+
kind: "broadband-integrated-only"
|
|
499
|
+
};
|
|
500
|
+
const evaluatedSpectralNodeInputs = [];
|
|
501
|
+
if (spectralInputModel.kind ===
|
|
502
|
+
"per-spectral-bin") {
|
|
503
|
+
for (const entry of input.reduction.perWavelength) {
|
|
504
|
+
if (entry.wavelengthMeasureNanometers >
|
|
505
|
+
spectralInputModel
|
|
506
|
+
.maximumBinWidthNanometers) {
|
|
507
|
+
blockers.push("spectral-bin-width-outside-linearity-applicability");
|
|
508
|
+
}
|
|
509
|
+
const value = spectralNodeInputValue(entry, profile.inputRange);
|
|
510
|
+
evaluatedSpectralNodeInputs.push({
|
|
511
|
+
spectralSampleIndex: entry.spectralSampleIndex,
|
|
512
|
+
wavelengthNanometers: entry.wavelengthNanometers,
|
|
513
|
+
wavelengthMeasureNanometers: entry.wavelengthMeasureNanometers,
|
|
514
|
+
kind: profile.inputRange.kind,
|
|
515
|
+
unit: profile.inputRange.unit,
|
|
516
|
+
value
|
|
517
|
+
});
|
|
518
|
+
if (value <
|
|
519
|
+
profile.inputRange
|
|
520
|
+
.minimumInclusive) {
|
|
521
|
+
blockers.push("spectral-bin-input-below-linearity-range");
|
|
522
|
+
}
|
|
523
|
+
if (value >
|
|
524
|
+
profile.inputRange
|
|
525
|
+
.maximumInclusive) {
|
|
526
|
+
blockers.push("spectral-bin-input-above-linearity-range");
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
if (profile.spatialLinearityModel?.kind !==
|
|
531
|
+
"linear-superposition-over-geometric-aperture") {
|
|
532
|
+
blockers.push("spatial-linearity-superposition-not-established");
|
|
533
|
+
}
|
|
534
|
+
if (profile.referenceConditionPolicy.kind ===
|
|
535
|
+
"exact-match-required") {
|
|
536
|
+
const referenceConditions = profile.referenceConditions;
|
|
537
|
+
if (input.compatibility
|
|
538
|
+
.operatingConditions ===
|
|
539
|
+
undefined) {
|
|
540
|
+
blockers.push("operating-conditions-not-declared");
|
|
541
|
+
}
|
|
542
|
+
else if (!conditionsMatch(referenceConditions, input.compatibility
|
|
543
|
+
.operatingConditions)) {
|
|
544
|
+
blockers.push("linearity-operating-conditions-mismatch");
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
const compatible = blockers.length === 0;
|
|
548
|
+
const approximate = input.compatibility
|
|
549
|
+
.compatibilityStatus ===
|
|
550
|
+
"compatible-approximation" ||
|
|
551
|
+
profile.scientificStatus ===
|
|
552
|
+
"approximation" ||
|
|
553
|
+
profile.uncertainty.kind ===
|
|
554
|
+
"not-quantified" ||
|
|
555
|
+
(profile.spatialLinearityModel?.kind ===
|
|
556
|
+
"linear-superposition-over-geometric-aperture" &&
|
|
557
|
+
profile.spatialLinearityModel
|
|
558
|
+
.scientificStatus ===
|
|
559
|
+
"approximation") ||
|
|
560
|
+
(spectralInputModel.kind ===
|
|
561
|
+
"per-spectral-bin" &&
|
|
562
|
+
spectralInputModel
|
|
563
|
+
.scientificStatus ===
|
|
564
|
+
"approximation") ||
|
|
565
|
+
profile.referenceConditionPolicy.kind ===
|
|
566
|
+
"assume-compatible";
|
|
567
|
+
const spectralRateReady = compatible &&
|
|
568
|
+
spectralInputModel.kind ===
|
|
569
|
+
"per-spectral-bin";
|
|
570
|
+
const status = compatible
|
|
571
|
+
? spectralRateReady
|
|
572
|
+
? approximate
|
|
573
|
+
? "rate-conversion-authorized-approximation"
|
|
574
|
+
: "rate-conversion-authorized"
|
|
575
|
+
: approximate
|
|
576
|
+
? "broadband-range-compatible-approximation"
|
|
577
|
+
: "broadband-range-compatible"
|
|
578
|
+
: "blocked";
|
|
579
|
+
const referenceConditionEvidence = profile.referenceConditionPolicy.kind ===
|
|
580
|
+
"assume-compatible"
|
|
581
|
+
? profile.referenceConditionPolicy
|
|
582
|
+
.evidence
|
|
583
|
+
: [];
|
|
584
|
+
const spatialLinearityEvidence = profile.spatialLinearityModel?.kind ===
|
|
585
|
+
"linear-superposition-over-geometric-aperture"
|
|
586
|
+
? profile.spatialLinearityModel.evidence
|
|
587
|
+
: [];
|
|
588
|
+
return calculatedResult({
|
|
589
|
+
operatingRangeProfileId: profile.profileId,
|
|
590
|
+
responseApplicationProfileId: input.compatibility
|
|
591
|
+
.applicationProfileId,
|
|
592
|
+
spectralResponseProfileId: input.reduction
|
|
593
|
+
.responseProfileId,
|
|
594
|
+
colorSamplingProfileId: input.reduction
|
|
595
|
+
.colorSamplingProfileId,
|
|
596
|
+
channelId: input.reduction.channelId,
|
|
597
|
+
requiredSignalPath: input.compatibility
|
|
598
|
+
.requiredSignalPath,
|
|
599
|
+
inputRange: profile.inputRange,
|
|
600
|
+
evaluatedInput: {
|
|
601
|
+
kind: profile.inputRange.kind,
|
|
602
|
+
unit: profile.inputRange.unit,
|
|
603
|
+
value: metricValue
|
|
604
|
+
},
|
|
605
|
+
wavelengthApplicability: profile.wavelengthApplicability,
|
|
606
|
+
evaluatedWavelengthRangeNanometers: {
|
|
607
|
+
...wavelengthRange
|
|
608
|
+
},
|
|
609
|
+
linearityCriterion: profile.linearityCriterion,
|
|
610
|
+
spectralInputModel,
|
|
611
|
+
...(evaluatedSpectralNodeInputs.length ===
|
|
612
|
+
0
|
|
613
|
+
? {}
|
|
614
|
+
: {
|
|
615
|
+
evaluatedSpectralNodeInputs
|
|
616
|
+
}),
|
|
617
|
+
spectralNodeRangeCompatibilityAssessed: spectralInputModel.kind ===
|
|
618
|
+
"per-spectral-bin",
|
|
619
|
+
spatialLinearityModel: profile.spatialLinearityModel ?? {
|
|
620
|
+
kind: "not-established",
|
|
621
|
+
limitation: "Spatial-distribution linear superposition was not declared."
|
|
622
|
+
},
|
|
623
|
+
referenceConditionPolicy: profile.referenceConditionPolicy,
|
|
624
|
+
...(profile.referenceConditions ===
|
|
625
|
+
undefined
|
|
626
|
+
? {}
|
|
627
|
+
: {
|
|
628
|
+
referenceConditions: profile.referenceConditions
|
|
629
|
+
}),
|
|
630
|
+
...(input.compatibility
|
|
631
|
+
.operatingConditions ===
|
|
632
|
+
undefined
|
|
633
|
+
? {}
|
|
634
|
+
: {
|
|
635
|
+
operatingConditions: input.compatibility
|
|
636
|
+
.operatingConditions
|
|
637
|
+
}),
|
|
638
|
+
operatingRangeCompatibilityAssessed: true,
|
|
639
|
+
instantaneousResponseRangeCompatible: compatible,
|
|
640
|
+
status,
|
|
641
|
+
blockers,
|
|
642
|
+
responseRateConversionAuthorized: spectralRateReady,
|
|
643
|
+
responseApplicationPerformed: false,
|
|
644
|
+
temporalIntegrationAuthorized: false,
|
|
645
|
+
exposureDomainLinearityAssessed: false,
|
|
646
|
+
accumulatedChargeLinearityAssessed: false,
|
|
647
|
+
saturationAssessed: false,
|
|
648
|
+
photonConversionPerformed: false,
|
|
649
|
+
electronConversionPerformed: false,
|
|
650
|
+
currentConversionPerformed: false,
|
|
651
|
+
componentEvidence: {
|
|
652
|
+
operatingRange: profile.evidence,
|
|
653
|
+
referenceConditionAssumption: referenceConditionEvidence,
|
|
654
|
+
spatialLinearity: spatialLinearityEvidence,
|
|
655
|
+
structuralCompatibility: input.compatibility
|
|
656
|
+
.componentEvidence
|
|
657
|
+
}
|
|
658
|
+
}, "sensor-response-operating-range-assessment", "1.0.0", [
|
|
659
|
+
"This gate assesses instantaneous response-law applicability only; it does not apply response or integrate exposure.",
|
|
660
|
+
"The valid optical-input range is evidence-backed and must be expressed in the same wavelength-integrated power or irradiance domain produced by the pre-response reducer.",
|
|
661
|
+
"Broadband-integrated range compatibility alone cannot authorize wavelength-dependent response conversion; per-spectral-bin applicability must be explicitly established and every bin must remain inside the calibrated input range.",
|
|
662
|
+
"Per-spectral-bin applicability also declares a maximum supported bin width so a broad quadrature bin is not silently treated as an equivalent monochromatic calibration point.",
|
|
663
|
+
"Linearity can depend on optical input level and wavelength; the reduction wavelength range must remain inside the declared applicability range.",
|
|
664
|
+
"Post-spatial rate conversion additionally requires explicit linear superposition over the geometric aperture; otherwise sub-aperture illumination patterns could hide local nonlinear behavior.",
|
|
665
|
+
"The maximumAbsoluteRelativeDeviation criterion documents the tolerated response nonlinearity for the declared valid range; this function does not derive that criterion from synthetic data.",
|
|
666
|
+
"Reference conditions for the linearity calibration are separate from spectral-response reference conditions and must match when exact matching is required.",
|
|
667
|
+
"Exposure-domain linearity, accumulated-charge saturation/full-well behavior, and downstream electronics linearity are intentionally not assessed here.",
|
|
668
|
+
"A successful result authorizes only a future instantaneous rate conversion path: photon-rate→electrons for EQE/filter×EQE or radiant-power→current for A/W responsivity.",
|
|
669
|
+
"Temporal integration, saturation, noise, ADC/RAW conversion and reconstruction remain downstream."
|
|
670
|
+
]);
|
|
671
|
+
}
|
|
672
|
+
//# sourceMappingURL=response-operating-range.js.map
|