@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,542 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Module boundary and integration notes.
|
|
4
|
+
* Revalidate continuous spectral node identity, support and nanometre measures before reducing a
|
|
5
|
+
* supplied wavelength plan. Continuous spectral midpoint planning uses explicit nanometre measures and
|
|
6
|
+
* response-supported intervals. Knot/breakpoint alignment does not prove convergence. Discrete/delta
|
|
7
|
+
* lines require their own integrated measure and cannot be silently widened into continuous bins.
|
|
8
|
+
* Builds deterministic wavelength quadrature nodes for one exact sensor response channel without
|
|
9
|
+
* applying the response to a source spectrum. The requested wavelength range must lie fully inside the
|
|
10
|
+
* response channel's declared usable range. Response-curve knots and optional caller-provided
|
|
11
|
+
* continuous-spectrum/optics breakpoints partition that range. Each segment is then subdivided so no
|
|
12
|
+
* midpoint subinterval exceeds maximumSubintervalWidthNanometers. wavelengthMeasureNanometers is
|
|
13
|
+
* d-lambda in nanometres. It is not a dimensionless response weight. Future integration must use a
|
|
14
|
+
* source spectral density expressed per nanometre or explicitly convert units before multiplying by
|
|
15
|
+
* this measure. This function deliberately does not apply QE or A/W responsivity. Those
|
|
16
|
+
* representations have different compatible downstream signal domains: QE is photon-to-electron
|
|
17
|
+
* efficiency, while A/W responsivity relates incident radiant power to electrical current. A later
|
|
18
|
+
* versioned composition must also match responseScope to the source plane and collection-area
|
|
19
|
+
* semantics before integrating any signal.
|
|
20
|
+
* @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
|
|
21
|
+
* limits.
|
|
22
|
+
*/
|
|
23
|
+
import { approximationResult } from "../core/calculation-result.js";
|
|
24
|
+
import { InvalidScientificInputError } from "../core/validation.js";
|
|
25
|
+
import { parseSensorColorSamplingProfile } from "./color-sampling.js";
|
|
26
|
+
import { createSensorSpectralResponseChannelBinding, parseSensorSpectralResponseProfile, resolveSensorSpectralResponseAtWavelength } from "./spectral-response.js";
|
|
27
|
+
const MAX_SPECTRAL_QUADRATURE_NODES = 100_000;
|
|
28
|
+
function requirePositiveFinite(value, path) {
|
|
29
|
+
if (typeof value !== "number" ||
|
|
30
|
+
!Number.isFinite(value) ||
|
|
31
|
+
value <= 0) {
|
|
32
|
+
throw new InvalidScientificInputError(path + " must be finite and greater than zero.");
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
function channelResponse(profile, channelId) {
|
|
37
|
+
if (typeof channelId !== "string" ||
|
|
38
|
+
channelId.trim().length === 0) {
|
|
39
|
+
throw new InvalidScientificInputError("channelId must be a non-empty string.");
|
|
40
|
+
}
|
|
41
|
+
const response = profile.channels.find((entry) => entry.channelId === channelId);
|
|
42
|
+
if (response === undefined) {
|
|
43
|
+
throw new InvalidScientificInputError("No spectral response is declared for the requested channelId.");
|
|
44
|
+
}
|
|
45
|
+
return response;
|
|
46
|
+
}
|
|
47
|
+
function responseCurves(response) {
|
|
48
|
+
if (response.kind ===
|
|
49
|
+
"effective-external-quantum-efficiency") {
|
|
50
|
+
return [
|
|
51
|
+
response.externalQuantumEfficiency
|
|
52
|
+
];
|
|
53
|
+
}
|
|
54
|
+
if (response.kind ===
|
|
55
|
+
"effective-spectral-responsivity") {
|
|
56
|
+
return [
|
|
57
|
+
response.spectralResponsivity
|
|
58
|
+
];
|
|
59
|
+
}
|
|
60
|
+
return [
|
|
61
|
+
response.channelFilterTransmittance,
|
|
62
|
+
response.detectorExternalQuantumEfficiency
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
function usableResponseRange(curves) {
|
|
66
|
+
const minimum = Math.max(...curves.map((curve) => curve.samples[0]
|
|
67
|
+
.wavelengthNanometers));
|
|
68
|
+
const maximum = Math.min(...curves.map((curve) => curve.samples[curve.samples.length - 1].wavelengthNanometers));
|
|
69
|
+
if (!(minimum < maximum)) {
|
|
70
|
+
throw new InvalidScientificInputError("Spectral-response curves do not have a usable overlapping wavelength interval.");
|
|
71
|
+
}
|
|
72
|
+
return { minimum, maximum };
|
|
73
|
+
}
|
|
74
|
+
function parseRequestedRange(input, usable) {
|
|
75
|
+
if (typeof input !== "object" ||
|
|
76
|
+
input === null) {
|
|
77
|
+
throw new InvalidScientificInputError("wavelengthRangeNanometers must be an object.");
|
|
78
|
+
}
|
|
79
|
+
const minimum = requirePositiveFinite(input.minimum, "wavelengthRangeNanometers.minimum");
|
|
80
|
+
const maximum = requirePositiveFinite(input.maximum, "wavelengthRangeNanometers.maximum");
|
|
81
|
+
if (!(minimum < maximum)) {
|
|
82
|
+
throw new InvalidScientificInputError("wavelengthRangeNanometers.minimum must be less than maximum.");
|
|
83
|
+
}
|
|
84
|
+
if (minimum < usable.minimum ||
|
|
85
|
+
maximum > usable.maximum) {
|
|
86
|
+
throw new InvalidScientificInputError("Requested wavelength range must remain inside the usable spectral-response range; clipping, extrapolation, and implicit zero-fill are not permitted.");
|
|
87
|
+
}
|
|
88
|
+
return { minimum, maximum };
|
|
89
|
+
}
|
|
90
|
+
function additionalBreakpoints(value, range) {
|
|
91
|
+
if (value === undefined) {
|
|
92
|
+
return [];
|
|
93
|
+
}
|
|
94
|
+
if (!Array.isArray(value)) {
|
|
95
|
+
throw new InvalidScientificInputError("additionalBreakpointsNanometers must be an array when supplied.");
|
|
96
|
+
}
|
|
97
|
+
if (value.length >=
|
|
98
|
+
MAX_SPECTRAL_QUADRATURE_NODES) {
|
|
99
|
+
throw new InvalidScientificInputError("additionalBreakpointsNanometers contains too many entries for the spectral quadrature safety limit.");
|
|
100
|
+
}
|
|
101
|
+
let previous = Number.NEGATIVE_INFINITY;
|
|
102
|
+
return value.map((entry, index) => {
|
|
103
|
+
const wavelength = requirePositiveFinite(entry, "additionalBreakpointsNanometers[" +
|
|
104
|
+
index +
|
|
105
|
+
"]");
|
|
106
|
+
if (wavelength <= range.minimum ||
|
|
107
|
+
wavelength >= range.maximum) {
|
|
108
|
+
throw new InvalidScientificInputError("Additional spectral breakpoints must lie strictly inside the requested wavelength range.");
|
|
109
|
+
}
|
|
110
|
+
if (wavelength <= previous) {
|
|
111
|
+
throw new InvalidScientificInputError("additionalBreakpointsNanometers must be strictly increasing with no duplicates.");
|
|
112
|
+
}
|
|
113
|
+
previous = wavelength;
|
|
114
|
+
return wavelength;
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
function partitionBoundaries(curves, range, additional) {
|
|
118
|
+
const boundaries = new Set([
|
|
119
|
+
range.minimum,
|
|
120
|
+
range.maximum,
|
|
121
|
+
...additional
|
|
122
|
+
]);
|
|
123
|
+
for (const curve of curves) {
|
|
124
|
+
for (const sample of curve.samples) {
|
|
125
|
+
if (sample.wavelengthNanometers >
|
|
126
|
+
range.minimum &&
|
|
127
|
+
sample.wavelengthNanometers <
|
|
128
|
+
range.maximum) {
|
|
129
|
+
boundaries.add(sample.wavelengthNanometers);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return [...boundaries].sort((a, b) => a - b);
|
|
134
|
+
}
|
|
135
|
+
function planSegments(boundaries, maximumSubintervalWidthNanometers) {
|
|
136
|
+
const segments = [];
|
|
137
|
+
let totalNodeCount = 0;
|
|
138
|
+
for (let segmentIndex = 0; segmentIndex < boundaries.length - 1; segmentIndex += 1) {
|
|
139
|
+
const minimum = boundaries[segmentIndex];
|
|
140
|
+
const maximum = boundaries[segmentIndex + 1];
|
|
141
|
+
const width = maximum - minimum;
|
|
142
|
+
if (!Number.isFinite(width) ||
|
|
143
|
+
width <= 0) {
|
|
144
|
+
throw new InvalidScientificInputError("Spectral quadrature segment widths must be finite and greater than zero.");
|
|
145
|
+
}
|
|
146
|
+
const subdivisionCount = Math.ceil(width /
|
|
147
|
+
maximumSubintervalWidthNanometers);
|
|
148
|
+
if (!Number.isSafeInteger(subdivisionCount) ||
|
|
149
|
+
subdivisionCount <= 0) {
|
|
150
|
+
throw new InvalidScientificInputError("Spectral quadrature segment subdivision count must be a positive safe integer.");
|
|
151
|
+
}
|
|
152
|
+
totalNodeCount +=
|
|
153
|
+
subdivisionCount;
|
|
154
|
+
if (!Number.isSafeInteger(totalNodeCount)) {
|
|
155
|
+
throw new InvalidScientificInputError("Spectral quadrature node count must remain a safe integer.");
|
|
156
|
+
}
|
|
157
|
+
if (totalNodeCount >
|
|
158
|
+
MAX_SPECTRAL_QUADRATURE_NODES) {
|
|
159
|
+
throw new InvalidScientificInputError("Spectral quadrature node count exceeds the safety limit of " +
|
|
160
|
+
MAX_SPECTRAL_QUADRATURE_NODES +
|
|
161
|
+
".");
|
|
162
|
+
}
|
|
163
|
+
segments.push({
|
|
164
|
+
minimum,
|
|
165
|
+
maximum,
|
|
166
|
+
subdivisionCount,
|
|
167
|
+
subintervalWidthNanometers: width / subdivisionCount
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
if (segments.length === 0) {
|
|
171
|
+
throw new InvalidScientificInputError("Spectral quadrature requires at least one non-empty segment.");
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
segments,
|
|
175
|
+
totalNodeCount
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
const SPECTRAL_VALIDATION_TOLERANCE = 1e-10;
|
|
179
|
+
function requireNonNegativeSafeInteger(value, path) {
|
|
180
|
+
if (typeof value !== "number" ||
|
|
181
|
+
!Number.isSafeInteger(value) ||
|
|
182
|
+
value < 0) {
|
|
183
|
+
throw new InvalidScientificInputError(path + " must be a non-negative safe integer.");
|
|
184
|
+
}
|
|
185
|
+
return value;
|
|
186
|
+
}
|
|
187
|
+
function approximatelyEqual(actual, expected, tolerance = SPECTRAL_VALIDATION_TOLERANCE) {
|
|
188
|
+
const scale = Math.max(1, Math.abs(actual), Math.abs(expected));
|
|
189
|
+
return (Math.abs(actual - expected) <=
|
|
190
|
+
tolerance * scale);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Revalidate continuous spectral node identity, support and nanometre measures before reducing a
|
|
194
|
+
* supplied wavelength plan.
|
|
195
|
+
*
|
|
196
|
+
* Continuous spectral midpoint planning uses explicit nanometre measures and response-supported
|
|
197
|
+
* intervals. Knot/breakpoint alignment does not prove convergence. Discrete/delta lines require their
|
|
198
|
+
* own integrated measure and cannot be silently widened into continuous bins.
|
|
199
|
+
* @param quadrature - SensorSpectralQuadrature. See the linked contract for coordinate, unit and profile binding semantics.
|
|
200
|
+
* @returns Map<number, SensorSpectralQuadratureNode>. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
201
|
+
*
|
|
202
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
203
|
+
*/
|
|
204
|
+
export function validateSensorSpectralQuadrature(quadrature) {
|
|
205
|
+
if (typeof quadrature !== "object" ||
|
|
206
|
+
quadrature === null ||
|
|
207
|
+
!Array.isArray(quadrature.nodes)) {
|
|
208
|
+
throw new InvalidScientificInputError("spectralQuadrature must contain a nodes array.");
|
|
209
|
+
}
|
|
210
|
+
for (const [field, value] of [
|
|
211
|
+
["profileId", quadrature.profileId],
|
|
212
|
+
[
|
|
213
|
+
"colorSamplingProfileId",
|
|
214
|
+
quadrature.colorSamplingProfileId
|
|
215
|
+
],
|
|
216
|
+
["channelId", quadrature.channelId]
|
|
217
|
+
]) {
|
|
218
|
+
if (typeof value !== "string" ||
|
|
219
|
+
value.trim().length === 0) {
|
|
220
|
+
throw new InvalidScientificInputError("spectralQuadrature." +
|
|
221
|
+
field +
|
|
222
|
+
" must be a non-empty string.");
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (quadrature.wavelengthBasis !== "air" &&
|
|
226
|
+
quadrature.wavelengthBasis !== "vacuum" &&
|
|
227
|
+
quadrature.wavelengthBasis !== "unspecified") {
|
|
228
|
+
throw new InvalidScientificInputError("spectralQuadrature.wavelengthBasis is invalid.");
|
|
229
|
+
}
|
|
230
|
+
const rangeMinimum = requirePositiveFinite(quadrature.wavelengthRangeNanometers.minimum, "spectralQuadrature.wavelengthRangeNanometers.minimum");
|
|
231
|
+
const rangeMaximum = requirePositiveFinite(quadrature.wavelengthRangeNanometers.maximum, "spectralQuadrature.wavelengthRangeNanometers.maximum");
|
|
232
|
+
if (!(rangeMinimum < rangeMaximum)) {
|
|
233
|
+
throw new InvalidScientificInputError("spectralQuadrature wavelength range minimum must be less than maximum.");
|
|
234
|
+
}
|
|
235
|
+
const maximumSubintervalWidthNanometers = requirePositiveFinite(quadrature.maximumSubintervalWidthNanometers, "spectralQuadrature.maximumSubintervalWidthNanometers");
|
|
236
|
+
if (!Array.isArray(quadrature.segmentBoundariesNanometers) ||
|
|
237
|
+
quadrature.segmentBoundariesNanometers.length <
|
|
238
|
+
2) {
|
|
239
|
+
throw new InvalidScientificInputError("spectralQuadrature.segmentBoundariesNanometers must contain at least two boundaries.");
|
|
240
|
+
}
|
|
241
|
+
let previousBoundary = Number.NEGATIVE_INFINITY;
|
|
242
|
+
quadrature.segmentBoundariesNanometers.forEach((boundary, index) => {
|
|
243
|
+
const parsed = requirePositiveFinite(boundary, "spectralQuadrature.segmentBoundariesNanometers[" +
|
|
244
|
+
index +
|
|
245
|
+
"]");
|
|
246
|
+
if (parsed <= previousBoundary) {
|
|
247
|
+
throw new InvalidScientificInputError("spectralQuadrature.segmentBoundariesNanometers must be strictly increasing.");
|
|
248
|
+
}
|
|
249
|
+
previousBoundary = parsed;
|
|
250
|
+
});
|
|
251
|
+
const segmentCount = requireNonNegativeSafeInteger(quadrature.segmentCount, "spectralQuadrature.segmentCount");
|
|
252
|
+
if (segmentCount <= 0 ||
|
|
253
|
+
segmentCount !==
|
|
254
|
+
quadrature.segmentBoundariesNanometers.length -
|
|
255
|
+
1) {
|
|
256
|
+
throw new InvalidScientificInputError("spectralQuadrature.segmentCount must be positive and match the boundary count.");
|
|
257
|
+
}
|
|
258
|
+
if (!approximatelyEqual(quadrature.segmentBoundariesNanometers[0], rangeMinimum) ||
|
|
259
|
+
!approximatelyEqual(quadrature.segmentBoundariesNanometers[quadrature.segmentBoundariesNanometers.length -
|
|
260
|
+
1], rangeMaximum)) {
|
|
261
|
+
throw new InvalidScientificInputError("spectralQuadrature segment boundaries must exactly span the requested wavelength range.");
|
|
262
|
+
}
|
|
263
|
+
const totalNodeCount = requireNonNegativeSafeInteger(quadrature.totalNodeCount, "spectralQuadrature.totalNodeCount");
|
|
264
|
+
if (totalNodeCount <= 0 ||
|
|
265
|
+
totalNodeCount !== quadrature.nodes.length) {
|
|
266
|
+
throw new InvalidScientificInputError("spectralQuadrature.totalNodeCount must be positive and exactly match spectralQuadrature.nodes.length.");
|
|
267
|
+
}
|
|
268
|
+
if (totalNodeCount >
|
|
269
|
+
MAX_SPECTRAL_QUADRATURE_NODES) {
|
|
270
|
+
throw new InvalidScientificInputError("spectralQuadrature.totalNodeCount exceeds the spectral quadrature safety limit.");
|
|
271
|
+
}
|
|
272
|
+
if (quadrature.responseApplicationPerformed !==
|
|
273
|
+
false ||
|
|
274
|
+
quadrature.responseValuesIncluded !== false ||
|
|
275
|
+
quadrature.wavelengthIntegrationPerformed !==
|
|
276
|
+
false ||
|
|
277
|
+
quadrature.continuousSpectralDensityQuadratureOnly !==
|
|
278
|
+
true ||
|
|
279
|
+
quadrature.discreteLineSpectrumIncluded !==
|
|
280
|
+
false) {
|
|
281
|
+
throw new InvalidScientificInputError("spectralQuadrature semantics are incompatible with pre-response continuous-density composition.");
|
|
282
|
+
}
|
|
283
|
+
const span = rangeMaximum - rangeMinimum;
|
|
284
|
+
const nodesByIndex = new Map();
|
|
285
|
+
const seenSegmentSubdivisions = new Set();
|
|
286
|
+
const segmentSubdivisionCounts = new Map();
|
|
287
|
+
const segmentSeenCounts = new Map();
|
|
288
|
+
let measureSum = 0;
|
|
289
|
+
let normalizedWeightSum = 0;
|
|
290
|
+
quadrature.nodes.forEach((node, nodeArrayIndex) => {
|
|
291
|
+
const spectralSampleIndex = requireNonNegativeSafeInteger(node.spectralSampleIndex, "spectralQuadrature.nodes[" +
|
|
292
|
+
nodeArrayIndex +
|
|
293
|
+
"].spectralSampleIndex");
|
|
294
|
+
if (nodesByIndex.has(spectralSampleIndex)) {
|
|
295
|
+
throw new InvalidScientificInputError("spectralQuadrature contains duplicate spectralSampleIndex values.");
|
|
296
|
+
}
|
|
297
|
+
const segmentIndex = requireNonNegativeSafeInteger(node.segmentIndex, "spectralQuadrature.nodes[" +
|
|
298
|
+
nodeArrayIndex +
|
|
299
|
+
"].segmentIndex");
|
|
300
|
+
if (segmentIndex >= segmentCount) {
|
|
301
|
+
throw new InvalidScientificInputError("spectralQuadrature node segmentIndex is outside the declared segment range.");
|
|
302
|
+
}
|
|
303
|
+
const subdivisionIndex = requireNonNegativeSafeInteger(node.subdivisionIndex, "spectralQuadrature.nodes[" +
|
|
304
|
+
nodeArrayIndex +
|
|
305
|
+
"].subdivisionIndex");
|
|
306
|
+
const segmentSubdivisionCount = requireNonNegativeSafeInteger(node.segmentSubdivisionCount, "spectralQuadrature.nodes[" +
|
|
307
|
+
nodeArrayIndex +
|
|
308
|
+
"].segmentSubdivisionCount");
|
|
309
|
+
if (segmentSubdivisionCount <= 0 ||
|
|
310
|
+
subdivisionIndex >=
|
|
311
|
+
segmentSubdivisionCount) {
|
|
312
|
+
throw new InvalidScientificInputError("spectralQuadrature node subdivision identity is invalid.");
|
|
313
|
+
}
|
|
314
|
+
const priorSegmentCount = segmentSubdivisionCounts.get(segmentIndex);
|
|
315
|
+
if (priorSegmentCount !== undefined &&
|
|
316
|
+
priorSegmentCount !==
|
|
317
|
+
segmentSubdivisionCount) {
|
|
318
|
+
throw new InvalidScientificInputError("spectralQuadrature nodes disagree on a segment subdivision count.");
|
|
319
|
+
}
|
|
320
|
+
segmentSubdivisionCounts.set(segmentIndex, segmentSubdivisionCount);
|
|
321
|
+
const subdivisionKey = segmentIndex +
|
|
322
|
+
":" +
|
|
323
|
+
subdivisionIndex;
|
|
324
|
+
if (seenSegmentSubdivisions.has(subdivisionKey)) {
|
|
325
|
+
throw new InvalidScientificInputError("spectralQuadrature contains duplicate segment/subdivision identities.");
|
|
326
|
+
}
|
|
327
|
+
seenSegmentSubdivisions.add(subdivisionKey);
|
|
328
|
+
segmentSeenCounts.set(segmentIndex, (segmentSeenCounts.get(segmentIndex) ?? 0) + 1);
|
|
329
|
+
const wavelengthNanometers = requirePositiveFinite(node.wavelengthNanometers, "spectralQuadrature.nodes[" +
|
|
330
|
+
nodeArrayIndex +
|
|
331
|
+
"].wavelengthNanometers");
|
|
332
|
+
const wavelengthMeasureNanometers = requirePositiveFinite(node.wavelengthMeasureNanometers, "spectralQuadrature.nodes[" +
|
|
333
|
+
nodeArrayIndex +
|
|
334
|
+
"].wavelengthMeasureNanometers");
|
|
335
|
+
const normalizedWavelengthWeight = requirePositiveFinite(node.normalizedWavelengthWeight, "spectralQuadrature.nodes[" +
|
|
336
|
+
nodeArrayIndex +
|
|
337
|
+
"].normalizedWavelengthWeight");
|
|
338
|
+
const segmentMinimum = quadrature.segmentBoundariesNanometers[segmentIndex];
|
|
339
|
+
const segmentMaximum = quadrature.segmentBoundariesNanometers[segmentIndex + 1];
|
|
340
|
+
const expectedMeasure = (segmentMaximum -
|
|
341
|
+
segmentMinimum) /
|
|
342
|
+
segmentSubdivisionCount;
|
|
343
|
+
const expectedWavelength = segmentMinimum +
|
|
344
|
+
(subdivisionIndex + 0.5) *
|
|
345
|
+
expectedMeasure;
|
|
346
|
+
const expectedNormalizedWeight = expectedMeasure / span;
|
|
347
|
+
if (!approximatelyEqual(wavelengthMeasureNanometers, expectedMeasure) ||
|
|
348
|
+
!approximatelyEqual(wavelengthNanometers, expectedWavelength) ||
|
|
349
|
+
!approximatelyEqual(normalizedWavelengthWeight, expectedNormalizedWeight)) {
|
|
350
|
+
throw new InvalidScientificInputError("spectralQuadrature node geometry/measure does not match its declared segment/subdivision identity.");
|
|
351
|
+
}
|
|
352
|
+
if (wavelengthMeasureNanometers >
|
|
353
|
+
maximumSubintervalWidthNanometers &&
|
|
354
|
+
!approximatelyEqual(wavelengthMeasureNanometers, maximumSubintervalWidthNanometers)) {
|
|
355
|
+
throw new InvalidScientificInputError("spectralQuadrature node width exceeds maximumSubintervalWidthNanometers.");
|
|
356
|
+
}
|
|
357
|
+
measureSum +=
|
|
358
|
+
wavelengthMeasureNanometers;
|
|
359
|
+
normalizedWeightSum +=
|
|
360
|
+
normalizedWavelengthWeight;
|
|
361
|
+
if (!Number.isFinite(measureSum) ||
|
|
362
|
+
!Number.isFinite(normalizedWeightSum)) {
|
|
363
|
+
throw new InvalidScientificInputError("spectralQuadrature aggregate measures must remain finite.");
|
|
364
|
+
}
|
|
365
|
+
nodesByIndex.set(spectralSampleIndex, node);
|
|
366
|
+
});
|
|
367
|
+
for (let spectralSampleIndex = 0; spectralSampleIndex < totalNodeCount; spectralSampleIndex += 1) {
|
|
368
|
+
if (!nodesByIndex.has(spectralSampleIndex)) {
|
|
369
|
+
throw new InvalidScientificInputError("spectralQuadrature spectralSampleIndex values must form the exact contiguous range 0..totalNodeCount-1.");
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
for (let segmentIndex = 0; segmentIndex < segmentCount; segmentIndex += 1) {
|
|
373
|
+
const expected = segmentSubdivisionCounts.get(segmentIndex);
|
|
374
|
+
const seen = segmentSeenCounts.get(segmentIndex) ?? 0;
|
|
375
|
+
if (expected === undefined ||
|
|
376
|
+
seen !== expected) {
|
|
377
|
+
throw new InvalidScientificInputError("spectralQuadrature must contain every declared subdivision exactly once.");
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
if (!approximatelyEqual(measureSum, span) ||
|
|
381
|
+
!approximatelyEqual(normalizedWeightSum, 1) ||
|
|
382
|
+
!approximatelyEqual(quadrature.wavelengthMeasureSumNanometers, measureSum) ||
|
|
383
|
+
!approximatelyEqual(quadrature.normalizedWavelengthWeightSum, normalizedWeightSum)) {
|
|
384
|
+
throw new InvalidScientificInputError("spectralQuadrature aggregate wavelength measures/weights are inconsistent.");
|
|
385
|
+
}
|
|
386
|
+
return nodesByIndex;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Builds deterministic wavelength quadrature nodes for one exact sensor
|
|
390
|
+
* response channel without applying the response to a source spectrum.
|
|
391
|
+
*
|
|
392
|
+
* The requested wavelength range must lie fully inside the response channel's
|
|
393
|
+
* declared usable range. Response-curve knots and optional caller-provided
|
|
394
|
+
* continuous-spectrum/optics breakpoints partition that range. Each segment is
|
|
395
|
+
* then subdivided so no midpoint subinterval exceeds
|
|
396
|
+
* maximumSubintervalWidthNanometers.
|
|
397
|
+
*
|
|
398
|
+
* wavelengthMeasureNanometers is d-lambda in nanometres. It is not a
|
|
399
|
+
* dimensionless response weight. Future integration must use a source spectral
|
|
400
|
+
* density expressed per nanometre or explicitly convert units before
|
|
401
|
+
* multiplying by this measure.
|
|
402
|
+
*
|
|
403
|
+
* This function deliberately does not apply QE or A/W responsivity. Those
|
|
404
|
+
* representations have different compatible downstream signal domains: QE is
|
|
405
|
+
* photon-to-electron efficiency, while A/W responsivity relates incident
|
|
406
|
+
* radiant power to electrical current. A later versioned composition must also
|
|
407
|
+
* match responseScope to the source plane and collection-area semantics before
|
|
408
|
+
* integrating any signal.
|
|
409
|
+
*/
|
|
410
|
+
export function calculateSensorSpectralQuadrature(input) {
|
|
411
|
+
const maximumSubintervalWidthNanometers = requirePositiveFinite(input.maximumSubintervalWidthNanometers, "maximumSubintervalWidthNanometers");
|
|
412
|
+
if (input.wavelengthBasis !== "air" &&
|
|
413
|
+
input.wavelengthBasis !== "vacuum" &&
|
|
414
|
+
input.wavelengthBasis !== "unspecified") {
|
|
415
|
+
throw new InvalidScientificInputError("wavelengthBasis is invalid.");
|
|
416
|
+
}
|
|
417
|
+
const colorProfile = parseSensorColorSamplingProfile(input.colorSamplingProfile);
|
|
418
|
+
const responseProfile = parseSensorSpectralResponseProfile(input.spectralResponseProfile);
|
|
419
|
+
const response = channelResponse(responseProfile, input.channelId);
|
|
420
|
+
const curves = responseCurves(response);
|
|
421
|
+
if (!curves.every((curve) => curve.wavelengthBasis ===
|
|
422
|
+
input.wavelengthBasis)) {
|
|
423
|
+
throw new InvalidScientificInputError("wavelengthBasis must exactly match every response curve used by the requested channel.");
|
|
424
|
+
}
|
|
425
|
+
const usable = usableResponseRange(curves);
|
|
426
|
+
const range = parseRequestedRange(input.wavelengthRangeNanometers, usable);
|
|
427
|
+
const validationWavelength = range.minimum +
|
|
428
|
+
(range.maximum - range.minimum) /
|
|
429
|
+
2;
|
|
430
|
+
const representative = resolveSensorSpectralResponseAtWavelength({
|
|
431
|
+
colorSamplingProfile: colorProfile,
|
|
432
|
+
spectralResponseProfile: responseProfile,
|
|
433
|
+
channelId: input.channelId,
|
|
434
|
+
wavelengthNanometers: validationWavelength,
|
|
435
|
+
wavelengthBasis: input.wavelengthBasis
|
|
436
|
+
}).value;
|
|
437
|
+
const additional = additionalBreakpoints(input.additionalBreakpointsNanometers, range);
|
|
438
|
+
const boundaries = partitionBoundaries(curves, range, additional);
|
|
439
|
+
const { segments, totalNodeCount } = planSegments(boundaries, maximumSubintervalWidthNanometers);
|
|
440
|
+
const totalSpan = range.maximum - range.minimum;
|
|
441
|
+
const nodes = [];
|
|
442
|
+
let spectralSampleIndex = 0;
|
|
443
|
+
for (let segmentIndex = 0; segmentIndex < segments.length; segmentIndex += 1) {
|
|
444
|
+
const segment = segments[segmentIndex];
|
|
445
|
+
for (let subdivisionIndex = 0; subdivisionIndex <
|
|
446
|
+
segment.subdivisionCount; subdivisionIndex += 1) {
|
|
447
|
+
const wavelengthNanometers = segment.minimum +
|
|
448
|
+
(subdivisionIndex + 0.5) *
|
|
449
|
+
segment
|
|
450
|
+
.subintervalWidthNanometers;
|
|
451
|
+
nodes.push({
|
|
452
|
+
spectralSampleIndex,
|
|
453
|
+
segmentIndex,
|
|
454
|
+
subdivisionIndex,
|
|
455
|
+
segmentSubdivisionCount: segment.subdivisionCount,
|
|
456
|
+
wavelengthNanometers,
|
|
457
|
+
wavelengthMeasureNanometers: segment
|
|
458
|
+
.subintervalWidthNanometers,
|
|
459
|
+
normalizedWavelengthWeight: segment
|
|
460
|
+
.subintervalWidthNanometers /
|
|
461
|
+
totalSpan
|
|
462
|
+
});
|
|
463
|
+
spectralSampleIndex += 1;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
const normalizedWavelengthWeightSum = nodes.reduce((sum, node) => sum +
|
|
467
|
+
node.normalizedWavelengthWeight, 0);
|
|
468
|
+
const wavelengthMeasureSumNanometers = nodes.reduce((sum, node) => sum +
|
|
469
|
+
node.wavelengthMeasureNanometers, 0);
|
|
470
|
+
return approximationResult({
|
|
471
|
+
profileId: representative.profileId,
|
|
472
|
+
colorSamplingProfileId: representative
|
|
473
|
+
.colorSamplingProfileId,
|
|
474
|
+
channelId: representative.channelId,
|
|
475
|
+
sourceResponseKind: representative
|
|
476
|
+
.sourceResponseKind,
|
|
477
|
+
responseScope: representative.responseScope,
|
|
478
|
+
responseScientificStatus: representative
|
|
479
|
+
.scientificStatus,
|
|
480
|
+
responseUncertainty: representative.uncertainty,
|
|
481
|
+
responseChannelBinding: createSensorSpectralResponseChannelBinding(response),
|
|
482
|
+
...(representative.referenceConditions ===
|
|
483
|
+
undefined
|
|
484
|
+
? {}
|
|
485
|
+
: {
|
|
486
|
+
responseReferenceConditions: representative.referenceConditions
|
|
487
|
+
}),
|
|
488
|
+
wavelengthBasis: input.wavelengthBasis,
|
|
489
|
+
wavelengthBasisResolved: representative
|
|
490
|
+
.wavelengthBasisResolved,
|
|
491
|
+
wavelengthRangeNanometers: range,
|
|
492
|
+
responseDeclaredWavelengthRangeNanometers: usable,
|
|
493
|
+
quadratureScheme: "response-breakpoint-aware-bounded-midpoint",
|
|
494
|
+
segmentBoundarySource: "requested-range-plus-response-knots-plus-optional-additional-breakpoints",
|
|
495
|
+
segmentBoundariesNanometers: [...boundaries],
|
|
496
|
+
maximumSubintervalWidthNanometers,
|
|
497
|
+
segmentCount: segments.length,
|
|
498
|
+
totalNodeCount,
|
|
499
|
+
normalizedWavelengthWeightSum,
|
|
500
|
+
wavelengthMeasureSumNanometers,
|
|
501
|
+
nodes,
|
|
502
|
+
responseKnotAlignmentIncluded: true,
|
|
503
|
+
componentEvidence: {
|
|
504
|
+
colorSamplingProfile: colorProfile.evidence,
|
|
505
|
+
profile: representative
|
|
506
|
+
.componentEvidence.profile,
|
|
507
|
+
channel: representative
|
|
508
|
+
.componentEvidence.channel,
|
|
509
|
+
curves: representative
|
|
510
|
+
.componentEvidence.curves
|
|
511
|
+
},
|
|
512
|
+
responseValuesIncluded: false,
|
|
513
|
+
responseApplicationPerformed: false,
|
|
514
|
+
sourceSpectralValuesIncluded: false,
|
|
515
|
+
spectralIrradianceIncluded: false,
|
|
516
|
+
spectralPhotonIrradianceIncluded: false,
|
|
517
|
+
commonSpectralCoverageValidated: false,
|
|
518
|
+
continuousSpectralDensityQuadratureOnly: true,
|
|
519
|
+
discreteLineSpectrumIncluded: false,
|
|
520
|
+
opticalTransmissionIncludedByQuadrature: false,
|
|
521
|
+
wavelengthIntegrationPerformed: false,
|
|
522
|
+
spatialIntegrationPerformed: false,
|
|
523
|
+
temporalIntegrationPerformed: false,
|
|
524
|
+
photonsCalculated: false,
|
|
525
|
+
electronsCalculated: false,
|
|
526
|
+
rawCodeValueProduced: false,
|
|
527
|
+
convergenceErrorEstimated: false
|
|
528
|
+
}, "sensor-spectral-quadrature", "1.0.0", [
|
|
529
|
+
"The partition includes requested range edges, response-curve knots, and optional caller-supplied continuous-spectrum/optics breakpoints.",
|
|
530
|
+
"Every segment uses deterministic equal-width midpoint subintervals whose width is bounded by maximumSubintervalWidthNanometers.",
|
|
531
|
+
"Wavelength measures are d-lambda in nanometres and normalized wavelength weights are geometric wavelength measures only; neither is sensor-response weighting.",
|
|
532
|
+
"The requested range is validated against sensor-response support only. Scene-spectrum, optical-transmission, and other spectral-factor coverage are not established by this API.",
|
|
533
|
+
"The response profile, exact channel linkage, wavelength basis, response scope, and response-data provenance are validated and preserved, but response values are not applied at quadrature nodes.",
|
|
534
|
+
"QE and A/W responsivity remain different physical representations and require different compatible downstream photon/power semantics.",
|
|
535
|
+
"Future signal composition must match responseScope to the source plane and collection-area model so upstream transmission is not omitted or double-counted.",
|
|
536
|
+
"This midpoint plan targets continuous spectral-density integration. Discrete/delta-like line spectra require a separate explicit representation rather than being approximated by hidden point masses.",
|
|
537
|
+
"No source spectral values, spectral irradiance, spectral photon irradiance, optical transmission, spatial integration, temporal integration, photon/electron conversion, current calculation, or RAW output is calculated.",
|
|
538
|
+
"Response-knot alignment and a bounded wavelength step do not prove convergence for arbitrary source spectra or other wavelength-dependent factors.",
|
|
539
|
+
"No source-independent convergence/error estimate is reported because integration error depends on the downstream integrand."
|
|
540
|
+
]);
|
|
541
|
+
}
|
|
542
|
+
//# sourceMappingURL=spectral-quadrature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spectral-quadrature.js","sourceRoot":"","sources":["../../src/sensor/spectral-quadrature.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EACL,mBAAmB,EAEpB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAKpE,OAAO,EACL,+BAA+B,EAEhC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,0CAA0C,EAC1C,kCAAkC,EAClC,yCAAyC,EAK1C,MAAM,wBAAwB,CAAC;AAEhC,MAAM,6BAA6B,GAAG,OAAO,CAAC;AA6I9C,SAAS,qBAAqB,CAC5B,KAAc,EACd,IAAY;IAEZ,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvB,KAAK,IAAI,CAAC,EACV,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,IAAI,GAAG,wCAAwC,CAChD,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CACtB,OAAsC,EACtC,SAAiB;IAEjB,IACE,OAAO,SAAS,KAAK,QAAQ;QAC7B,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAC7B,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,uCAAuC,CACxC,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CACpC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CACzC,CAAC;IACF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,2BAA2B,CACnC,+DAA+D,CAChE,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CACrB,QACmD;IAEnD,IACE,QAAQ,CAAC,IAAI;QACb,uCAAuC,EACvC,CAAC;QACD,OAAO;YACL,QAAQ,CAAC,yBAAyB;SACnC,CAAC;IACJ,CAAC;IACD,IACE,QAAQ,CAAC,IAAI;QACb,iCAAiC,EACjC,CAAC;QACD,OAAO;YACL,QAAQ,CAAC,oBAAoB;SAC9B,CAAC;IACJ,CAAC;IACD,OAAO;QACL,QAAQ,CAAC,0BAA0B;QACnC,QAAQ,CAAC,iCAAiC;KAC3C,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,MAAuC;IAEvC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CACtB,GAAG,MAAM,CAAC,GAAG,CACX,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,OAAO,CAAC,CAAC,CAAE;SACd,oBAAoB,CAC1B,CACF,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CACtB,GAAG,MAAM,CAAC,GAAG,CACX,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,OAAO,CACX,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CACxB,CAAC,oBAAoB,CAC1B,CACF,CAAC;IAEF,IAAI,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,2BAA2B,CACnC,gFAAgF,CACjF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,mBAAmB,CAC1B,KACyC,EACzC,MACyC;IAEzC,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI,EACd,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,8CAA8C,CAC/C,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,qBAAqB,CACnC,KAAK,CAAC,OAAO,EACb,mCAAmC,CACpC,CAAC;IACF,MAAM,OAAO,GAAG,qBAAqB,CACnC,KAAK,CAAC,OAAO,EACb,mCAAmC,CACpC,CAAC;IAEF,IAAI,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,2BAA2B,CACnC,8DAA8D,CAC/D,CAAC;IACJ,CAAC;IAED,IACE,OAAO,GAAG,MAAM,CAAC,OAAO;QACxB,OAAO,GAAG,MAAM,CAAC,OAAO,EACxB,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,sJAAsJ,CACvJ,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,qBAAqB,CAC5B,KAAoC,EACpC,KACyC;IAEzC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,2BAA2B,CACnC,iEAAiE,CAClE,CAAC;IACJ,CAAC;IACD,IACE,KAAK,CAAC,MAAM;QACZ,6BAA6B,EAC7B,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,qGAAqG,CACtG,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,GACV,MAAM,CAAC,iBAAiB,CAAC;IAE3B,OAAO,KAAK,CAAC,GAAG,CACd,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACf,MAAM,UAAU,GACd,qBAAqB,CACnB,KAAK,EACL,kCAAkC;YAChC,KAAK;YACL,GAAG,CACN,CAAC;QACJ,IACE,UAAU,IAAI,KAAK,CAAC,OAAO;YAC3B,UAAU,IAAI,KAAK,CAAC,OAAO,EAC3B,CAAC;YACD,MAAM,IAAI,2BAA2B,CACnC,0FAA0F,CAC3F,CAAC;QACJ,CAAC;QACD,IAAI,UAAU,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,IAAI,2BAA2B,CACnC,iFAAiF,CAClF,CAAC;QACJ,CAAC;QACD,QAAQ,GAAG,UAAU,CAAC;QACtB,OAAO,UAAU,CAAC;IACpB,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,MAAuC,EACvC,KACyC,EACzC,UACmB;IAEnB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAS;QACjC,KAAK,CAAC,OAAO;QACb,KAAK,CAAC,OAAO;QACb,GAAG,UAAU;KACd,CAAC,CAAC;IAEH,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACnC,IACE,MAAM,CAAC,oBAAoB;gBACzB,KAAK,CAAC,OAAO;gBACf,MAAM,CAAC,oBAAoB;oBACzB,KAAK,CAAC,OAAO,EACf,CAAC;gBACD,UAAU,CAAC,GAAG,CACZ,MAAM,CAAC,oBAAoB,CAC5B,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CACzB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAChB,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,UAA6B,EAC7B,iCAAyC;IAKzC,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,KACE,IAAI,YAAY,GAAG,CAAC,EACpB,YAAY,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EACpC,YAAY,IAAI,CAAC,EACjB,CAAC;QACD,MAAM,OAAO,GACX,UAAU,CAAC,YAAY,CAAE,CAAC;QAC5B,MAAM,OAAO,GACX,UAAU,CAAC,YAAY,GAAG,CAAC,CAAE,CAAC;QAChC,MAAM,KAAK,GACT,OAAO,GAAG,OAAO,CAAC;QAEpB,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YACvB,KAAK,IAAI,CAAC,EACV,CAAC;YACD,MAAM,IAAI,2BAA2B,CACnC,0EAA0E,CAC3E,CAAC;QACJ,CAAC;QAED,MAAM,gBAAgB,GACpB,IAAI,CAAC,IAAI,CACP,KAAK;YACH,iCAAiC,CACpC,CAAC;QAEJ,IACE,CAAC,MAAM,CAAC,aAAa,CACnB,gBAAgB,CACjB;YACD,gBAAgB,IAAI,CAAC,EACrB,CAAC;YACD,MAAM,IAAI,2BAA2B,CACnC,gFAAgF,CACjF,CAAC;QACJ,CAAC;QAED,cAAc;YACZ,gBAAgB,CAAC;QAEnB,IACE,CAAC,MAAM,CAAC,aAAa,CACnB,cAAc,CACf,EACD,CAAC;YACD,MAAM,IAAI,2BAA2B,CACnC,4DAA4D,CAC7D,CAAC;QACJ,CAAC;QACD,IACE,cAAc;YACd,6BAA6B,EAC7B,CAAC;YACD,MAAM,IAAI,2BAA2B,CACnC,6DAA6D;gBAC3D,6BAA6B;gBAC7B,GAAG,CACN,CAAC;QACJ,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC;YACZ,OAAO;YACP,OAAO;YACP,gBAAgB;YAChB,0BAA0B,EACxB,KAAK,GAAG,gBAAgB;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,2BAA2B,CACnC,8DAA8D,CAC/D,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ;QACR,cAAc;KACf,CAAC;AACJ,CAAC;AAED,MAAM,6BAA6B,GAAG,KAAK,CAAC;AAE5C,SAAS,6BAA6B,CACpC,KAAc,EACd,IAAY;IAEZ,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;QAC5B,KAAK,GAAG,CAAC,EACT,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,IAAI,GAAG,uCAAuC,CAC/C,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CACzB,MAAc,EACd,QAAgB,EAChB,SAAS,GAAG,6BAA6B;IAEzC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAChB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CACnB,CAAC;IACF,OAAO,CACL,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC;QAC3B,SAAS,GAAG,KAAK,CAClB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gCAAgC,CAC9C,UAAoC;IAEpC,IACE,OAAO,UAAU,KAAK,QAAQ;QAC9B,UAAU,KAAK,IAAI;QACnB,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAChC,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,gDAAgD,CACjD,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI;QAC3B,CAAC,WAAW,EAAE,UAAU,CAAC,SAAS,CAAC;QACnC;YACE,wBAAwB;YACxB,UAAU,CAAC,sBAAsB;SAClC;QACD,CAAC,WAAW,EAAE,UAAU,CAAC,SAAS,CAAC;KAC3B,EAAE,CAAC;QACX,IACE,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EACzB,CAAC;YACD,MAAM,IAAI,2BAA2B,CACnC,qBAAqB;gBACnB,KAAK;gBACL,8BAA8B,CACjC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IACE,UAAU,CAAC,eAAe,KAAK,KAAK;QACpC,UAAU,CAAC,eAAe,KAAK,QAAQ;QACvC,UAAU,CAAC,eAAe,KAAK,aAAa,EAC5C,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,gDAAgD,CACjD,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,qBAAqB,CACxC,UAAU,CAAC,yBAAyB,CAAC,OAAO,EAC5C,sDAAsD,CACvD,CAAC;IACF,MAAM,YAAY,GAAG,qBAAqB,CACxC,UAAU,CAAC,yBAAyB,CAAC,OAAO,EAC5C,sDAAsD,CACvD,CAAC;IACF,IAAI,CAAC,CAAC,YAAY,GAAG,YAAY,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,2BAA2B,CACnC,wEAAwE,CACzE,CAAC;IACJ,CAAC;IAED,MAAM,iCAAiC,GACrC,qBAAqB,CACnB,UAAU,CAAC,iCAAiC,EAC5C,sDAAsD,CACvD,CAAC;IAEJ,IACE,CAAC,KAAK,CAAC,OAAO,CACZ,UAAU,CAAC,2BAA2B,CACvC;QACD,UAAU,CAAC,2BAA2B,CAAC,MAAM;YAC3C,CAAC,EACH,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,sFAAsF,CACvF,CAAC;IACJ,CAAC;IAED,IAAI,gBAAgB,GAClB,MAAM,CAAC,iBAAiB,CAAC;IAC3B,UAAU,CAAC,2BAA2B,CAAC,OAAO,CAC5C,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;QAClB,MAAM,MAAM,GAAG,qBAAqB,CAClC,QAAQ,EACR,iDAAiD;YAC/C,KAAK;YACL,GAAG,CACN,CAAC;QACF,IAAI,MAAM,IAAI,gBAAgB,EAAE,CAAC;YAC/B,MAAM,IAAI,2BAA2B,CACnC,6EAA6E,CAC9E,CAAC;QACJ,CAAC;QACD,gBAAgB,GAAG,MAAM,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,YAAY,GAChB,6BAA6B,CAC3B,UAAU,CAAC,YAAY,EACvB,iCAAiC,CAClC,CAAC;IACJ,IACE,YAAY,IAAI,CAAC;QACjB,YAAY;YACV,UAAU,CAAC,2BAA2B,CAAC,MAAM;gBAC3C,CAAC,EACL,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,gFAAgF,CACjF,CAAC;IACJ,CAAC;IAED,IACE,CAAC,kBAAkB,CACjB,UAAU,CAAC,2BAA2B,CAAC,CAAC,CAAE,EAC1C,YAAY,CACb;QACD,CAAC,kBAAkB,CACjB,UAAU,CAAC,2BAA2B,CACpC,UAAU,CAAC,2BAA2B,CAAC,MAAM;YAC3C,CAAC,CACH,EACF,YAAY,CACb,EACD,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,yFAAyF,CAC1F,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAClB,6BAA6B,CAC3B,UAAU,CAAC,cAAc,EACzB,mCAAmC,CACpC,CAAC;IACJ,IACE,cAAc,IAAI,CAAC;QACnB,cAAc,KAAK,UAAU,CAAC,KAAK,CAAC,MAAM,EAC1C,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,uGAAuG,CACxG,CAAC;IACJ,CAAC;IACD,IACE,cAAc;QACd,6BAA6B,EAC7B,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,iFAAiF,CAClF,CAAC;IACJ,CAAC;IAED,IACE,UAAU,CAAC,4BAA4B;QACrC,KAAK;QACP,UAAU,CAAC,sBAAsB,KAAK,KAAK;QAC3C,UAAU,CAAC,8BAA8B;YACvC,KAAK;QACP,UAAU,CAAC,uCAAuC;YAChD,IAAI;QACN,UAAU,CAAC,4BAA4B;YACrC,KAAK,EACP,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,iGAAiG,CAClG,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GACR,YAAY,GAAG,YAAY,CAAC;IAC9B,MAAM,YAAY,GAChB,IAAI,GAAG,EAAwC,CAAC;IAClD,MAAM,uBAAuB,GAC3B,IAAI,GAAG,EAAU,CAAC;IACpB,MAAM,wBAAwB,GAC5B,IAAI,GAAG,EAAkB,CAAC;IAC5B,MAAM,iBAAiB,GACrB,IAAI,GAAG,EAAkB,CAAC;IAC5B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAE5B,UAAU,CAAC,KAAK,CAAC,OAAO,CACtB,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE;QACvB,MAAM,mBAAmB,GACvB,6BAA6B,CAC3B,IAAI,CAAC,mBAAmB,EACxB,2BAA2B;YACzB,cAAc;YACd,uBAAuB,CAC1B,CAAC;QACJ,IACE,YAAY,CAAC,GAAG,CACd,mBAAmB,CACpB,EACD,CAAC;YACD,MAAM,IAAI,2BAA2B,CACnC,mEAAmE,CACpE,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAChB,6BAA6B,CAC3B,IAAI,CAAC,YAAY,EACjB,2BAA2B;YACzB,cAAc;YACd,gBAAgB,CACnB,CAAC;QACJ,IAAI,YAAY,IAAI,YAAY,EAAE,CAAC;YACjC,MAAM,IAAI,2BAA2B,CACnC,6EAA6E,CAC9E,CAAC;QACJ,CAAC;QAED,MAAM,gBAAgB,GACpB,6BAA6B,CAC3B,IAAI,CAAC,gBAAgB,EACrB,2BAA2B;YACzB,cAAc;YACd,oBAAoB,CACvB,CAAC;QACJ,MAAM,uBAAuB,GAC3B,6BAA6B,CAC3B,IAAI,CAAC,uBAAuB,EAC5B,2BAA2B;YACzB,cAAc;YACd,2BAA2B,CAC9B,CAAC;QACJ,IACE,uBAAuB,IAAI,CAAC;YAC5B,gBAAgB;gBACd,uBAAuB,EACzB,CAAC;YACD,MAAM,IAAI,2BAA2B,CACnC,0DAA0D,CAC3D,CAAC;QACJ,CAAC;QAED,MAAM,iBAAiB,GACrB,wBAAwB,CAAC,GAAG,CAC1B,YAAY,CACb,CAAC;QACJ,IACE,iBAAiB,KAAK,SAAS;YAC/B,iBAAiB;gBACf,uBAAuB,EACzB,CAAC;YACD,MAAM,IAAI,2BAA2B,CACnC,mEAAmE,CACpE,CAAC;QACJ,CAAC;QACD,wBAAwB,CAAC,GAAG,CAC1B,YAAY,EACZ,uBAAuB,CACxB,CAAC;QAEF,MAAM,cAAc,GAClB,YAAY;YACZ,GAAG;YACH,gBAAgB,CAAC;QACnB,IACE,uBAAuB,CAAC,GAAG,CACzB,cAAc,CACf,EACD,CAAC;YACD,MAAM,IAAI,2BAA2B,CACnC,uEAAuE,CACxE,CAAC;QACJ,CAAC;QACD,uBAAuB,CAAC,GAAG,CACzB,cAAc,CACf,CAAC;QACF,iBAAiB,CAAC,GAAG,CACnB,YAAY,EACZ,CAAC,iBAAiB,CAAC,GAAG,CACpB,YAAY,CACb,IAAI,CAAC,CAAC,GAAG,CAAC,CACZ,CAAC;QAEF,MAAM,oBAAoB,GACxB,qBAAqB,CACnB,IAAI,CAAC,oBAAoB,EACzB,2BAA2B;YACzB,cAAc;YACd,wBAAwB,CAC3B,CAAC;QACJ,MAAM,2BAA2B,GAC/B,qBAAqB,CACnB,IAAI,CAAC,2BAA2B,EAChC,2BAA2B;YACzB,cAAc;YACd,+BAA+B,CAClC,CAAC;QACJ,MAAM,0BAA0B,GAC9B,qBAAqB,CACnB,IAAI,CAAC,0BAA0B,EAC/B,2BAA2B;YACzB,cAAc;YACd,8BAA8B,CACjC,CAAC;QAEJ,MAAM,cAAc,GAClB,UAAU,CAAC,2BAA2B,CACpC,YAAY,CACZ,CAAC;QACL,MAAM,cAAc,GAClB,UAAU,CAAC,2BAA2B,CACpC,YAAY,GAAG,CAAC,CAChB,CAAC;QACL,MAAM,eAAe,GACnB,CAAC,cAAc;YACb,cAAc,CAAC;YACjB,uBAAuB,CAAC;QAC1B,MAAM,kBAAkB,GACtB,cAAc;YACd,CAAC,gBAAgB,GAAG,GAAG,CAAC;gBACtB,eAAe,CAAC;QACpB,MAAM,wBAAwB,GAC5B,eAAe,GAAG,IAAI,CAAC;QAEzB,IACE,CAAC,kBAAkB,CACjB,2BAA2B,EAC3B,eAAe,CAChB;YACD,CAAC,kBAAkB,CACjB,oBAAoB,EACpB,kBAAkB,CACnB;YACD,CAAC,kBAAkB,CACjB,0BAA0B,EAC1B,wBAAwB,CACzB,EACD,CAAC;YACD,MAAM,IAAI,2BAA2B,CACnC,oGAAoG,CACrG,CAAC;QACJ,CAAC;QAED,IACE,2BAA2B;YACzB,iCAAiC;YACnC,CAAC,kBAAkB,CACjB,2BAA2B,EAC3B,iCAAiC,CAClC,EACD,CAAC;YACD,MAAM,IAAI,2BAA2B,CACnC,0EAA0E,CAC3E,CAAC;QACJ,CAAC;QAED,UAAU;YACR,2BAA2B,CAAC;QAC9B,mBAAmB;YACjB,0BAA0B,CAAC;QAC7B,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC5B,CAAC,MAAM,CAAC,QAAQ,CACd,mBAAmB,CACpB,EACD,CAAC;YACD,MAAM,IAAI,2BAA2B,CACnC,2DAA2D,CAC5D,CAAC;QACJ,CAAC;QAED,YAAY,CAAC,GAAG,CACd,mBAAmB,EACnB,IAAI,CACL,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,KACE,IAAI,mBAAmB,GAAG,CAAC,EAC3B,mBAAmB,GAAG,cAAc,EACpC,mBAAmB,IAAI,CAAC,EACxB,CAAC;QACD,IACE,CAAC,YAAY,CAAC,GAAG,CACf,mBAAmB,CACpB,EACD,CAAC;YACD,MAAM,IAAI,2BAA2B,CACnC,yGAAyG,CAC1G,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KACE,IAAI,YAAY,GAAG,CAAC,EACpB,YAAY,GAAG,YAAY,EAC3B,YAAY,IAAI,CAAC,EACjB,CAAC;QACD,MAAM,QAAQ,GACZ,wBAAwB,CAAC,GAAG,CAC1B,YAAY,CACb,CAAC;QACJ,MAAM,IAAI,GACR,iBAAiB,CAAC,GAAG,CACnB,YAAY,CACb,IAAI,CAAC,CAAC;QACT,IACE,QAAQ,KAAK,SAAS;YACtB,IAAI,KAAK,QAAQ,EACjB,CAAC;YACD,MAAM,IAAI,2BAA2B,CACnC,0EAA0E,CAC3E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IACE,CAAC,kBAAkB,CACjB,UAAU,EACV,IAAI,CACL;QACD,CAAC,kBAAkB,CACjB,mBAAmB,EACnB,CAAC,CACF;QACD,CAAC,kBAAkB,CACjB,UAAU,CAAC,8BAA8B,EACzC,UAAU,CACX;QACD,CAAC,kBAAkB,CACjB,UAAU,CAAC,6BAA6B,EACxC,mBAAmB,CACpB,EACD,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,4EAA4E,CAC7E,CAAC;IACJ,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,iCAAiC,CAC/C,KACwC;IAExC,MAAM,iCAAiC,GACrC,qBAAqB,CACnB,KAAK,CAAC,iCAAiC,EACvC,mCAAmC,CACpC,CAAC;IAEJ,IACE,KAAK,CAAC,eAAe,KAAK,KAAK;QAC/B,KAAK,CAAC,eAAe,KAAK,QAAQ;QAClC,KAAK,CAAC,eAAe,KAAK,aAAa,EACvC,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,6BAA6B,CAC9B,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAChB,+BAA+B,CAC7B,KAAK,CAAC,oBAAoB,CAC3B,CAAC;IACJ,MAAM,eAAe,GACnB,kCAAkC,CAChC,KAAK,CAAC,uBAAuB,CAC9B,CAAC;IACJ,MAAM,QAAQ,GAAG,eAAe,CAC9B,eAAe,EACf,KAAK,CAAC,SAAS,CAChB,CAAC;IACF,MAAM,MAAM,GACV,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE3B,IACE,CAAC,MAAM,CAAC,KAAK,CACX,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,eAAe;QACrB,KAAK,CAAC,eAAe,CACxB,EACD,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,wFAAwF,CACzF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,mBAAmB,CAChC,MAAM,CACP,CAAC;IACF,MAAM,KAAK,GAAG,mBAAmB,CAC/B,KAAK,CAAC,yBAAyB,EAC/B,MAAM,CACP,CAAC;IACF,MAAM,oBAAoB,GACxB,KAAK,CAAC,OAAO;QACb,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YAC7B,CAAC,CAAC;IACN,MAAM,cAAc,GAClB,yCAAyC,CACvC;QACE,oBAAoB,EAClB,YAAY;QACd,uBAAuB,EACrB,eAAe;QACjB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,oBAAoB,EAClB,oBAAoB;QACtB,eAAe,EACb,KAAK,CAAC,eAAe;KACxB,CACF,CAAC,KAAK,CAAC;IAEV,MAAM,UAAU,GACd,qBAAqB,CACnB,KAAK,CAAC,+BAA+B,EACrC,KAAK,CACN,CAAC;IACJ,MAAM,UAAU,GACd,mBAAmB,CACjB,MAAM,EACN,KAAK,EACL,UAAU,CACX,CAAC;IACJ,MAAM,EACJ,QAAQ,EACR,cAAc,EACf,GAAG,YAAY,CACd,UAAU,EACV,iCAAiC,CAClC,CAAC;IAEF,MAAM,SAAS,GACb,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAChC,MAAM,KAAK,GACwB,EAAE,CAAC;IACtC,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAE5B,KACE,IAAI,YAAY,GAAG,CAAC,EACpB,YAAY,GAAG,QAAQ,CAAC,MAAM,EAC9B,YAAY,IAAI,CAAC,EACjB,CAAC;QACD,MAAM,OAAO,GACX,QAAQ,CAAC,YAAY,CAAE,CAAC;QAE1B,KACE,IAAI,gBAAgB,GAAG,CAAC,EACxB,gBAAgB;YAChB,OAAO,CAAC,gBAAgB,EACxB,gBAAgB,IAAI,CAAC,EACrB,CAAC;YACD,MAAM,oBAAoB,GACxB,OAAO,CAAC,OAAO;gBACf,CAAC,gBAAgB,GAAG,GAAG,CAAC;oBACtB,OAAO;yBACJ,0BAA0B,CAAC;YAElC,KAAK,CAAC,IAAI,CAAC;gBACT,mBAAmB;gBACnB,YAAY;gBACZ,gBAAgB;gBAChB,uBAAuB,EACrB,OAAO,CAAC,gBAAgB;gBAC1B,oBAAoB;gBACpB,2BAA2B,EACzB,OAAO;qBACJ,0BAA0B;gBAC/B,0BAA0B,EACxB,OAAO;qBACJ,0BAA0B;oBAC7B,SAAS;aACZ,CAAC,CAAC;YAEH,mBAAmB,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,MAAM,6BAA6B,GACjC,KAAK,CAAC,MAAM,CACV,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CACZ,GAAG;QACH,IAAI,CAAC,0BAA0B,EACjC,CAAC,CACF,CAAC;IACJ,MAAM,8BAA8B,GAClC,KAAK,CAAC,MAAM,CACV,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CACZ,GAAG;QACH,IAAI,CAAC,2BAA2B,EAClC,CAAC,CACF,CAAC;IAEJ,OAAO,mBAAmB,CACxB;QACE,SAAS,EACP,cAAc,CAAC,SAAS;QAC1B,sBAAsB,EACpB,cAAc;aACX,sBAAsB;QAC3B,SAAS,EACP,cAAc,CAAC,SAAS;QAC1B,kBAAkB,EAChB,cAAc;aACX,kBAAkB;QACvB,aAAa,EACX,cAAc,CAAC,aAAa;QAC9B,wBAAwB,EACtB,cAAc;aACX,gBAAgB;QACrB,mBAAmB,EACjB,cAAc,CAAC,WAAW;QAC5B,sBAAsB,EACpB,0CAA0C,CACxC,QAAQ,CACT;QACH,GAAG,CAAC,cAAc,CAAC,mBAAmB;YACtC,SAAS;YACP,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACE,2BAA2B,EACzB,cAAc,CAAC,mBAAmB;aACrC,CAAC;QACN,eAAe,EACb,KAAK,CAAC,eAAe;QACvB,uBAAuB,EACrB,cAAc;aACX,uBAAuB;QAC5B,yBAAyB,EACvB,KAAK;QACP,yCAAyC,EACvC,MAAM;QACR,gBAAgB,EACd,4CAA4C;QAC9C,qBAAqB,EACnB,0EAA0E;QAC5E,2BAA2B,EACzB,CAAC,GAAG,UAAU,CAAC;QACjB,iCAAiC;QACjC,YAAY,EACV,QAAQ,CAAC,MAAM;QACjB,cAAc;QACd,6BAA6B;QAC7B,8BAA8B;QAC9B,KAAK;QACL,6BAA6B,EAC3B,IAAI;QACN,iBAAiB,EAAE;YACjB,oBAAoB,EAClB,YAAY,CAAC,QAAQ;YACvB,OAAO,EACL,cAAc;iBACX,iBAAiB,CAAC,OAAO;YAC9B,OAAO,EACL,cAAc;iBACX,iBAAiB,CAAC,OAAO;YAC9B,MAAM,EACJ,cAAc;iBACX,iBAAiB,CAAC,MAAM;SAC9B;QACD,sBAAsB,EAAE,KAAK;QAC7B,4BAA4B,EAC1B,KAAK;QACP,4BAA4B,EAC1B,KAAK;QACP,0BAA0B,EACxB,KAAK;QACP,gCAAgC,EAC9B,KAAK;QACP,+BAA+B,EAC7B,KAAK;QACP,uCAAuC,EACrC,IAAI;QACN,4BAA4B,EAC1B,KAAK;QACP,uCAAuC,EACrC,KAAK;QACP,8BAA8B,EAC5B,KAAK;QACP,2BAA2B,EACzB,KAAK;QACP,4BAA4B,EAC1B,KAAK;QACP,iBAAiB,EAAE,KAAK;QACxB,mBAAmB,EAAE,KAAK;QAC1B,oBAAoB,EAAE,KAAK;QAC3B,yBAAyB,EAAE,KAAK;KACjC,EACD,4BAA4B,EAC5B,OAAO,EACP;QACE,0IAA0I;QAC1I,iIAAiI;QACjI,gKAAgK;QAChK,kLAAkL;QAClL,mMAAmM;QACnM,uIAAuI;QACvI,6JAA6J;QAC7J,wMAAwM;QACxM,4NAA4N;QAC5N,oJAAoJ;QACpJ,6HAA6H;KAC9H,CACF,CAAC;AACJ,CAAC"}
|