@winkjs/composer 0.0.2 → 0.4.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/LICENSE +1 -1
- package/README.md +42 -103
- package/package.json +53 -29
- package/src/composer.js +75 -0
- package/src/core/batch/aoo-encoder.js +148 -0
- package/src/core/batch/index.js +12 -0
- package/src/core/batch/sliding-window.js +91 -0
- package/src/core/codec/index.js +137 -0
- package/src/core/emitter-manager/mqtt/constants.js +102 -0
- package/src/core/emitter-manager/mqtt/emitter.js +780 -0
- package/src/core/emitter-manager/mqtt/index.js +190 -0
- package/src/core/emitter-manager/mqtt/mqtt-store.js +538 -0
- package/src/core/emitter-manager/terminal/assert-columns.js +98 -0
- package/src/core/emitter-manager/terminal/formatters.js +160 -0
- package/src/core/emitter-manager/terminal/index.js +341 -0
- package/src/core/env-vars.js +245 -0
- package/src/core/mqtt-protocol.js +47 -0
- package/src/core/partition-manager/index.js +7 -0
- package/src/core/partition-manager/init.js +44 -0
- package/src/core/partition-manager/introspect.js +15 -0
- package/src/core/partition-manager/publish-to.js +6 -0
- package/src/core/partition-manager/recompute.js +5 -0
- package/src/core/partition-manager/reset.js +5 -0
- package/src/core/partition-manager/update.js +264 -0
- package/src/core/partition-manager/validate-flow.js +157 -0
- package/src/core/semantics/digest.js +128 -0
- package/src/core/semantics/index.js +83 -0
- package/src/core/semantics/loader.js +571 -0
- package/src/core/semantics/schemas/asset-class-schema.js +218 -0
- package/src/core/semantics/schemas/column-schema.js +651 -0
- package/src/core/semantics/schemas/enum-schema.js +153 -0
- package/src/core/semantics/schemas/index.js +51 -0
- package/src/core/semantics/warnings.js +141 -0
- package/src/core/shutdown-manager/index.js +289 -0
- package/src/core/source-manager/csv/index.js +171 -0
- package/src/core/source-manager/csv/start.js +456 -0
- package/src/core/source-manager/mqtt/client.js +406 -0
- package/src/core/source-manager/mqtt/constants.js +147 -0
- package/src/core/source-manager/mqtt/dedup.js +244 -0
- package/src/core/source-manager/mqtt/index.js +260 -0
- package/src/core/source-manager/mqtt/status.js +546 -0
- package/src/core/source-manager/test-harness/comparator.js +226 -0
- package/src/core/source-manager/test-harness/field-generator.js +85 -0
- package/src/core/source-manager/test-harness/fuzz.js +87 -0
- package/src/core/source-manager/test-harness/index.js +115 -0
- package/src/core/source-manager/test-harness/prng.js +57 -0
- package/src/core/source-manager/test-harness/start.js +232 -0
- package/src/core/source-manager/test-harness/validate.js +213 -0
- package/src/core/storage-manager/questdb/assert-columns.js +120 -0
- package/src/core/storage-manager/questdb/ensure-tables.js +187 -0
- package/src/core/storage-manager/questdb/index.js +1251 -0
- package/src/core/storage-manager/questdb/persist-plan.js +488 -0
- package/src/core/storage-manager/questdb/writers.js +142 -0
- package/src/core/test-utils/sealed-record.js +80 -0
- package/src/core/test-utils/soak-signature.js +149 -0
- package/src/core/test-utils/tcp-proxy.js +106 -0
- package/src/core/tunable/helpers.js +254 -0
- package/src/core/tunable/index.js +87 -0
- package/src/core/utils/console-formatter/index.js +207 -0
- package/src/core/utils/create-smart-store-as/index.js +98 -0
- package/src/core/utils/create-smart-store-as/sanitize-field.js +46 -0
- package/src/core/utils/create-smart-store-as/smart-truncate.js +93 -0
- package/src/core/utils/flow/index.js +5 -0
- package/src/core/utils/flow/make-collision-checker.js +23 -0
- package/src/core/utils/flow/to-kebab.js +20 -0
- package/src/core/utils/half-life/index.js +111 -0
- package/src/core/utils/node/disable.js +11 -0
- package/src/core/utils/node/enable.js +11 -0
- package/src/core/utils/node/execute-triggers.js +40 -0
- package/src/core/utils/node/index.js +10 -0
- package/src/core/utils/node/pause.js +11 -0
- package/src/core/utils/node/populate-predicate-inputs.js +14 -0
- package/src/core/utils/node/publish-nan.js +19 -0
- package/src/core/utils/node/reset-predicate-inputs.js +11 -0
- package/src/core/utils/node/unpause.js +11 -0
- package/src/core/utils/node/validate-spec.js +22 -0
- package/src/core/utils/options/resolve-field-keyed.js +115 -0
- package/src/core/utils/quantize/index.js +75 -0
- package/src/core/utils/stats/formulas.js +67 -0
- package/src/core/utils/stats/index.js +3 -0
- package/src/core/utils/validate/composer-validators.js +141 -0
- package/src/core/utils/validate/helpers.js +206 -0
- package/src/core/utils/validate/index.js +12 -0
- package/src/core/utils/validate/type-validators.js +538 -0
- package/src/core/utils/validate/validate.js +107 -0
- package/src/core/utils/validate/validators.js +177 -0
- package/src/core/wiring/assert-handle.js +57 -0
- package/src/core/wiring/assert-module.js +63 -0
- package/src/core/wiring/index.js +5 -0
- package/src/core/wiring/node-type-to-module.js +17 -0
- package/src/core/wiring/wire-emitters.js +256 -0
- package/src/core/wiring/wire-linear-graph.js +25 -0
- package/src/core/wiring/wire-node.js +157 -0
- package/src/core/wiring/wire-semantics.js +173 -0
- package/src/core/wiring/wire-storages.js +344 -0
- package/src/flow/check-output-collisions.js +93 -0
- package/src/flow/consts.js +9 -0
- package/src/flow/deep-clone-spec.js +64 -0
- package/src/flow/driver.js +171 -0
- package/src/flow/expand-single-input-array.js +76 -0
- package/src/flow/expand-template-spec.js +93 -0
- package/src/flow/flow-api-schemas.js +300 -0
- package/src/flow/flow.js +658 -0
- package/src/flow/for-each.js +225 -0
- package/src/flow/get-signature-pattern.js +31 -0
- package/src/flow/get-target-array.js +46 -0
- package/src/flow/inspect.js +67 -0
- package/src/flow/load-node-module.js +81 -0
- package/src/flow/make-node-method.js +112 -0
- package/src/flow/resolve-pick-by-field.js +77 -0
- package/src/flow/resolve-tunables.js +76 -0
- package/src/flow/run.js +392 -0
- package/src/flow/serialize.js +161 -0
- package/src/flow/signatures-schema.js +222 -0
- package/src/flow/spec-builder.js +65 -0
- package/src/flow/validate-triggers.js +250 -0
- package/src/flow/validate.js +261 -0
- package/src/nodes/accumulate/index.js +21 -0
- package/src/nodes/accumulate/init.js +48 -0
- package/src/nodes/accumulate/introspect.js +123 -0
- package/src/nodes/accumulate/publish-to.js +34 -0
- package/src/nodes/accumulate/recompute.js +27 -0
- package/src/nodes/accumulate/reset.js +25 -0
- package/src/nodes/accumulate/update.js +42 -0
- package/src/nodes/appraise/calibrate.js +64 -0
- package/src/nodes/appraise/decision.js +66 -0
- package/src/nodes/appraise/deviation.js +140 -0
- package/src/nodes/appraise/index.js +23 -0
- package/src/nodes/appraise/init.js +165 -0
- package/src/nodes/appraise/integrate.js +45 -0
- package/src/nodes/appraise/introspect.js +352 -0
- package/src/nodes/appraise/publish-to.js +93 -0
- package/src/nodes/appraise/receptor.js +69 -0
- package/src/nodes/appraise/recompute.js +79 -0
- package/src/nodes/appraise/reset.js +53 -0
- package/src/nodes/appraise/update.js +130 -0
- package/src/nodes/archive/csv/index.js +6 -0
- package/src/nodes/archive/csv/init.js +36 -0
- package/src/nodes/archive/csv/load.js +70 -0
- package/src/nodes/archive/csv/reset.js +14 -0
- package/src/nodes/archive/csv/simple-parser.js +216 -0
- package/src/nodes/archive/csv/test.js +173 -0
- package/src/nodes/archive/csv/update.js +63 -0
- package/src/nodes/butterworth-filter/index.js +18 -0
- package/src/nodes/butterworth-filter/init.js +184 -0
- package/src/nodes/butterworth-filter/introspect.js +228 -0
- package/src/nodes/butterworth-filter/publish-to.js +21 -0
- package/src/nodes/butterworth-filter/recompute.js +13 -0
- package/src/nodes/butterworth-filter/reset.js +30 -0
- package/src/nodes/butterworth-filter/update.js +38 -0
- package/src/nodes/categorize/index.js +19 -0
- package/src/nodes/categorize/init.js +58 -0
- package/src/nodes/categorize/introspect.js +177 -0
- package/src/nodes/categorize/publish-to.js +29 -0
- package/src/nodes/categorize/recompute.js +14 -0
- package/src/nodes/categorize/reset.js +16 -0
- package/src/nodes/categorize/update.js +53 -0
- package/src/nodes/controller/index.js +9 -0
- package/src/nodes/controller/init.js +55 -0
- package/src/nodes/controller/introspect.js +91 -0
- package/src/nodes/controller/publish-to.js +8 -0
- package/src/nodes/controller/recompute.js +9 -0
- package/src/nodes/controller/reset.js +17 -0
- package/src/nodes/controller/update.js +63 -0
- package/src/nodes/diff/index.js +19 -0
- package/src/nodes/diff/init.js +37 -0
- package/src/nodes/diff/introspect.js +132 -0
- package/src/nodes/diff/publish-to.js +21 -0
- package/src/nodes/diff/recompute.js +12 -0
- package/src/nodes/diff/reset.js +12 -0
- package/src/nodes/diff/update.js +37 -0
- package/src/nodes/digest-moments/formulas.js +12 -0
- package/src/nodes/digest-moments/index.js +14 -0
- package/src/nodes/digest-moments/init.js +67 -0
- package/src/nodes/digest-moments/introspect.js +154 -0
- package/src/nodes/digest-moments/publish-to.js +34 -0
- package/src/nodes/digest-moments/recompute.js +14 -0
- package/src/nodes/digest-moments/reset.js +14 -0
- package/src/nodes/digest-moments/update.js +120 -0
- package/src/nodes/dwell-time-tracker/index.js +14 -0
- package/src/nodes/dwell-time-tracker/init.js +59 -0
- package/src/nodes/dwell-time-tracker/introspect.js +137 -0
- package/src/nodes/dwell-time-tracker/publish-to.js +22 -0
- package/src/nodes/dwell-time-tracker/recompute.js +8 -0
- package/src/nodes/dwell-time-tracker/reset.js +23 -0
- package/src/nodes/dwell-time-tracker/update.js +103 -0
- package/src/nodes/emit-if/helpers.js +94 -0
- package/src/nodes/emit-if/index.js +16 -0
- package/src/nodes/emit-if/init.js +67 -0
- package/src/nodes/emit-if/introspect.js +102 -0
- package/src/nodes/emit-if/publish-to.js +13 -0
- package/src/nodes/emit-if/recompute.js +12 -0
- package/src/nodes/emit-if/reset.js +27 -0
- package/src/nodes/emit-if/update.js +93 -0
- package/src/nodes/es-correlation/index.js +19 -0
- package/src/nodes/es-correlation/init.js +73 -0
- package/src/nodes/es-correlation/introspect.js +176 -0
- package/src/nodes/es-correlation/publish-to.js +32 -0
- package/src/nodes/es-correlation/recompute.js +56 -0
- package/src/nodes/es-correlation/reset.js +27 -0
- package/src/nodes/es-correlation/update.js +110 -0
- package/src/nodes/es-mean/index.js +20 -0
- package/src/nodes/es-mean/init.js +58 -0
- package/src/nodes/es-mean/introspect.js +129 -0
- package/src/nodes/es-mean/publish-to.js +19 -0
- package/src/nodes/es-mean/recompute.js +16 -0
- package/src/nodes/es-mean/reset.js +24 -0
- package/src/nodes/es-mean/update.js +69 -0
- package/src/nodes/es-pairwise-correlation/index.js +19 -0
- package/src/nodes/es-pairwise-correlation/init.js +98 -0
- package/src/nodes/es-pairwise-correlation/introspect.js +187 -0
- package/src/nodes/es-pairwise-correlation/publish-to.js +31 -0
- package/src/nodes/es-pairwise-correlation/recompute.js +69 -0
- package/src/nodes/es-pairwise-correlation/reset.js +29 -0
- package/src/nodes/es-pairwise-correlation/update.js +89 -0
- package/src/nodes/es-stats/index.js +21 -0
- package/src/nodes/es-stats/init.js +105 -0
- package/src/nodes/es-stats/introspect.js +157 -0
- package/src/nodes/es-stats/publish-to.js +42 -0
- package/src/nodes/es-stats/recompute.js +74 -0
- package/src/nodes/es-stats/reset.js +49 -0
- package/src/nodes/es-stats/update-envelope.js +44 -0
- package/src/nodes/es-stats/update-welford.js +64 -0
- package/src/nodes/es-stats/update.js +59 -0
- package/src/nodes/index.js +83 -0
- package/src/nodes/invert-flag/index.js +20 -0
- package/src/nodes/invert-flag/init.js +36 -0
- package/src/nodes/invert-flag/introspect.js +115 -0
- package/src/nodes/invert-flag/publish-to.js +23 -0
- package/src/nodes/invert-flag/recompute.js +12 -0
- package/src/nodes/invert-flag/reset.js +12 -0
- package/src/nodes/invert-flag/update.js +32 -0
- package/src/nodes/kalman1d/index.js +20 -0
- package/src/nodes/kalman1d/init.js +103 -0
- package/src/nodes/kalman1d/introspect.js +250 -0
- package/src/nodes/kalman1d/publish-to.js +34 -0
- package/src/nodes/kalman1d/recompute.js +23 -0
- package/src/nodes/kalman1d/reset.js +29 -0
- package/src/nodes/kalman1d/update.js +144 -0
- package/src/nodes/kernel/index.js +18 -0
- package/src/nodes/kernel/init.js +66 -0
- package/src/nodes/kernel/introspect.js +163 -0
- package/src/nodes/kernel/presets.js +74 -0
- package/src/nodes/kernel/publish-to.js +25 -0
- package/src/nodes/kernel/recompute.js +14 -0
- package/src/nodes/kernel/reset.js +20 -0
- package/src/nodes/kernel/update.js +69 -0
- package/src/nodes/lag/index.js +21 -0
- package/src/nodes/lag/init.js +87 -0
- package/src/nodes/lag/introspect.js +202 -0
- package/src/nodes/lag/publish-to.js +64 -0
- package/src/nodes/lag/recompute.js +33 -0
- package/src/nodes/lag/reset.js +49 -0
- package/src/nodes/lag/update.js +133 -0
- package/src/nodes/median3/index.js +19 -0
- package/src/nodes/median3/init.js +40 -0
- package/src/nodes/median3/introspect.js +116 -0
- package/src/nodes/median3/publish-to.js +21 -0
- package/src/nodes/median3/recompute.js +12 -0
- package/src/nodes/median3/reset.js +15 -0
- package/src/nodes/median3/update.js +58 -0
- package/src/nodes/moments-digest/copy-from.js +12 -0
- package/src/nodes/moments-digest/flush.js +17 -0
- package/src/nodes/moments-digest/index.js +132 -0
- package/src/nodes/moments-digest/init.js +84 -0
- package/src/nodes/moments-digest/introspect.js +122 -0
- package/src/nodes/moments-digest/prelude.js +28 -0
- package/src/nodes/moments-digest/publish-to.js +31 -0
- package/src/nodes/moments-digest/recompute.js +9 -0
- package/src/nodes/moments-digest/reset.js +20 -0
- package/src/nodes/moments-digest/update.js +182 -0
- package/src/nodes/node-names.js +67 -0
- package/src/nodes/page-hinkley/index.js +20 -0
- package/src/nodes/page-hinkley/init.js +66 -0
- package/src/nodes/page-hinkley/introspect.js +193 -0
- package/src/nodes/page-hinkley/publish-to.js +28 -0
- package/src/nodes/page-hinkley/recompute.js +14 -0
- package/src/nodes/page-hinkley/reset.js +23 -0
- package/src/nodes/page-hinkley/update.js +105 -0
- package/src/nodes/pass-if/index.js +21 -0
- package/src/nodes/pass-if/init.js +37 -0
- package/src/nodes/pass-if/introspect.js +93 -0
- package/src/nodes/pass-if/publish-to.js +15 -0
- package/src/nodes/pass-if/recompute.js +15 -0
- package/src/nodes/pass-if/reset.js +18 -0
- package/src/nodes/pass-if/update.js +37 -0
- package/src/nodes/persist-if/helpers.js +111 -0
- package/src/nodes/persist-if/index.js +9 -0
- package/src/nodes/persist-if/init.js +98 -0
- package/src/nodes/persist-if/introspect.js +106 -0
- package/src/nodes/persist-if/publish-to.js +21 -0
- package/src/nodes/persist-if/recompute.js +20 -0
- package/src/nodes/persist-if/reset.js +35 -0
- package/src/nodes/persist-if/update.js +112 -0
- package/src/nodes/persistence-check/index.js +14 -0
- package/src/nodes/persistence-check/init.js +38 -0
- package/src/nodes/persistence-check/introspect.js +144 -0
- package/src/nodes/persistence-check/publish-to.js +11 -0
- package/src/nodes/persistence-check/recompute.js +7 -0
- package/src/nodes/persistence-check/reset.js +12 -0
- package/src/nodes/persistence-check/update.js +57 -0
- package/src/nodes/process-index/index.js +15 -0
- package/src/nodes/process-index/init.js +48 -0
- package/src/nodes/process-index/introspect.js +182 -0
- package/src/nodes/process-index/publish-to.js +29 -0
- package/src/nodes/process-index/recompute.js +8 -0
- package/src/nodes/process-index/reset.js +8 -0
- package/src/nodes/process-index/update.js +75 -0
- package/src/nodes/ratio/index.js +14 -0
- package/src/nodes/ratio/init.js +37 -0
- package/src/nodes/ratio/introspect.js +155 -0
- package/src/nodes/ratio/publish-to.js +15 -0
- package/src/nodes/ratio/recompute.js +7 -0
- package/src/nodes/ratio/reset.js +7 -0
- package/src/nodes/ratio/update.js +47 -0
- package/src/nodes/sanitize/index.js +82 -0
- package/src/nodes/sanitize/init.js +82 -0
- package/src/nodes/sanitize/introspect.js +194 -0
- package/src/nodes/sanitize/publish-to.js +15 -0
- package/src/nodes/sanitize/recompute.js +8 -0
- package/src/nodes/sanitize/reset.js +14 -0
- package/src/nodes/sanitize/update.js +102 -0
- package/src/nodes/spike-guard/index.js +14 -0
- package/src/nodes/spike-guard/init.js +47 -0
- package/src/nodes/spike-guard/introspect.js +130 -0
- package/src/nodes/spike-guard/publish-to.js +35 -0
- package/src/nodes/spike-guard/recompute.js +14 -0
- package/src/nodes/spike-guard/reset.js +19 -0
- package/src/nodes/spike-guard/update.js +89 -0
- package/src/nodes/sse-emitter/index.js +7 -0
- package/src/nodes/sse-emitter/init.js +105 -0
- package/src/nodes/sse-emitter/introspect.js +134 -0
- package/src/nodes/sse-emitter/publish-to.js +6 -0
- package/src/nodes/sse-emitter/recompute.js +16 -0
- package/src/nodes/sse-emitter/reset.js +19 -0
- package/src/nodes/sse-emitter/update.js +69 -0
- package/src/nodes/sse-emitter/utils/broadcast-heartbeat.js +36 -0
- package/src/nodes/sse-emitter/utils/build-message.js +31 -0
- package/src/nodes/sse-emitter/utils/connection-manager.js +45 -0
- package/src/nodes/sse-emitter/utils/endpoint-initializer.js +20 -0
- package/src/nodes/sse-emitter/utils/health-monitor.js +38 -0
- package/src/nodes/sse-emitter/utils/qos-handler.js +41 -0
- package/src/nodes/state-change-detector/helpers.js +35 -0
- package/src/nodes/state-change-detector/index.js +12 -0
- package/src/nodes/state-change-detector/init.js +56 -0
- package/src/nodes/state-change-detector/introspect.js +146 -0
- package/src/nodes/state-change-detector/publish-to.js +20 -0
- package/src/nodes/state-change-detector/recompute.js +6 -0
- package/src/nodes/state-change-detector/reset.js +20 -0
- package/src/nodes/state-change-detector/update.js +97 -0
- package/src/nodes/sw-stats/index.js +14 -0
- package/src/nodes/sw-stats/init.js +51 -0
- package/src/nodes/sw-stats/introspect.js +131 -0
- package/src/nodes/sw-stats/publish-to.js +45 -0
- package/src/nodes/sw-stats/recompute.js +33 -0
- package/src/nodes/sw-stats/reset.js +15 -0
- package/src/nodes/sw-stats/update.js +39 -0
- package/src/nodes/swing-watch/index.js +17 -0
- package/src/nodes/swing-watch/init.js +144 -0
- package/src/nodes/swing-watch/introspect.js +188 -0
- package/src/nodes/swing-watch/publish-to.js +53 -0
- package/src/nodes/swing-watch/recompute.js +22 -0
- package/src/nodes/swing-watch/reset.js +55 -0
- package/src/nodes/swing-watch/update.js +767 -0
- package/src/nodes/tally/index.js +15 -0
- package/src/nodes/tally/init.js +32 -0
- package/src/nodes/tally/introspect.js +116 -0
- package/src/nodes/tally/publish-to.js +28 -0
- package/src/nodes/tally/recompute.js +10 -0
- package/src/nodes/tally/reset.js +10 -0
- package/src/nodes/tally/update.js +44 -0
- package/src/nodes/threshold/index.js +14 -0
- package/src/nodes/threshold/init.js +121 -0
- package/src/nodes/threshold/introspect.js +192 -0
- package/src/nodes/threshold/publish-to.js +11 -0
- package/src/nodes/threshold/recompute.js +8 -0
- package/src/nodes/threshold/reset.js +14 -0
- package/src/nodes/threshold/update.js +54 -0
- package/src/nodes/transform/helpers.js +39 -0
- package/src/nodes/transform/index.js +15 -0
- package/src/nodes/transform/init.js +35 -0
- package/src/nodes/transform/introspect.js +118 -0
- package/src/nodes/transform/publish-to.js +23 -0
- package/src/nodes/transform/recompute.js +12 -0
- package/src/nodes/transform/reset.js +11 -0
- package/src/nodes/transform/update.js +32 -0
- package/src/nodes/trend/compute-confidence.js +112 -0
- package/src/nodes/trend/index.js +14 -0
- package/src/nodes/trend/init.js +81 -0
- package/src/nodes/trend/introspect.js +151 -0
- package/src/nodes/trend/publish-to.js +22 -0
- package/src/nodes/trend/recompute.js +15 -0
- package/src/nodes/trend/reset.js +26 -0
- package/src/nodes/trend/update.js +93 -0
- package/src/nodes/tw-stats/copy-from.js +16 -0
- package/src/nodes/tw-stats/flush.js +12 -0
- package/src/nodes/tw-stats/index.js +41 -0
- package/src/nodes/tw-stats/init.js +92 -0
- package/src/nodes/tw-stats/introspect.js +171 -0
- package/src/nodes/tw-stats/publish-to.js +108 -0
- package/src/nodes/tw-stats/recompute.js +9 -0
- package/src/nodes/tw-stats/reset.js +16 -0
- package/src/nodes/tw-stats/update.js +113 -0
- package/src/nodes/unbalance/index.js +15 -0
- package/src/nodes/unbalance/init.js +59 -0
- package/src/nodes/unbalance/introspect.js +167 -0
- package/src/nodes/unbalance/publish-to.js +52 -0
- package/src/nodes/unbalance/recompute.js +11 -0
- package/src/nodes/unbalance/reset.js +10 -0
- package/src/nodes/unbalance/update.js +83 -0
- package/src/nodes/vector-distance/index.js +14 -0
- package/src/nodes/vector-distance/init.js +54 -0
- package/src/nodes/vector-distance/introspect.js +149 -0
- package/src/nodes/vector-distance/publish-to.js +35 -0
- package/src/nodes/vector-distance/recompute.js +11 -0
- package/src/nodes/vector-distance/reset.js +20 -0
- package/src/nodes/vector-distance/update.js +139 -0
- package/src/nodes/winnow/index.js +12 -0
- package/src/nodes/winnow/init.js +82 -0
- package/src/nodes/winnow/introspect.js +253 -0
- package/src/nodes/winnow/publish-to.js +51 -0
- package/src/nodes/winnow/recompute.js +14 -0
- package/src/nodes/winnow/reset.js +34 -0
- package/src/nodes/winnow/update.js +203 -0
- package/src/tools/training/features.js +227 -0
- package/src/tools/training/index.js +21 -0
- package/src/tools/training/logistic.js +238 -0
- package/src/tools/training/metrics.js +126 -0
- package/src/tools/training/scale.js +239 -0
- package/src/tools/training/validate.js +103 -0
- package/src/windowing/count-sliding/create.js +16 -0
- package/src/windowing/count-sliding/get-reverse-chronological-index.js +19 -0
- package/src/windowing/count-sliding/index.js +6 -0
- package/src/windowing/count-sliding/is-not-full.js +5 -0
- package/src/windowing/count-sliding/push.js +15 -0
- package/src/windowing/count-sliding/reset.js +11 -0
- package/src/windowing/count-sliding/size.js +5 -0
- package/src/windowing/time-sliding/create.js +25 -0
- package/src/windowing/time-sliding/push.js +42 -0
- package/CODE_OF_CONDUCT.md +0 -46
- package/CONTRIBUTING.md +0 -132
- package/docs/.nojekyll +0 -0
- package/docs/CONTRIBUTING.md +0 -134
- package/docs/README.md +0 -132
- package/docs/_coverpage.md +0 -26
- package/docs/_media/bg.png +0 -0
- package/docs/_media/wink-logo.png +0 -0
- package/docs/_navbar.md +0 -14
- package/docs/_sidebar.md +0 -2
- package/docs/index.html +0 -44
- package/eslint.config.js +0 -283
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// nodes/vector-distance/introspect.js
|
|
2
|
+
|
|
3
|
+
import { validators } from '../../core/utils/validate/index.js';
|
|
4
|
+
|
|
5
|
+
/** The type of this node */
|
|
6
|
+
const NODE_TYPE = 'Vector Distance';
|
|
7
|
+
|
|
8
|
+
/** Single source of truth for what this plugin can do */
|
|
9
|
+
const SUPPORTED_STATS = [
|
|
10
|
+
'mad', // Mean Absolute Distance
|
|
11
|
+
'rms', // Root Mean Square Distance
|
|
12
|
+
'maximum', // Maximum Distance (L∞)
|
|
13
|
+
'cosine', // Cosine Distance
|
|
14
|
+
'angular' // Angular Distance (radians)
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
/** Human-readable descriptions (for introspection) */
|
|
18
|
+
const STAT_DESCRIPTIONS = {
|
|
19
|
+
mad: 'Mean absolute distance between vectors',
|
|
20
|
+
// For correlations [-1,1]: bounded [0,2]
|
|
21
|
+
// For general vectors: bounded [0, ∞]
|
|
22
|
+
|
|
23
|
+
rms: 'Root mean square distance between vectors',
|
|
24
|
+
// For correlations [-1,1]: bounded [0,2]
|
|
25
|
+
// For general vectors: bounded [0, ∞]
|
|
26
|
+
|
|
27
|
+
maximum: 'Maximum single element difference',
|
|
28
|
+
// For correlations [-1,1]: bounded [0,2]
|
|
29
|
+
// For general vectors: bounded [0, ∞]
|
|
30
|
+
|
|
31
|
+
cosine: 'Cosine distance [0,2]', // Always [0,2] regardless of input
|
|
32
|
+
angular: 'Angular distance [0,π]' // Always [0,π] regardless of input
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/** Control methods available for triggers */
|
|
36
|
+
const SUPPORTED_CONTROL_METHODS = {
|
|
37
|
+
reset: 'Clears accumulated state and restarts computation',
|
|
38
|
+
enable: 'Enables node processing',
|
|
39
|
+
disable: 'Disables node processing',
|
|
40
|
+
pause: 'Pauses node processing while keeping state visible',
|
|
41
|
+
unpause: 'Resumes node processing after pause'
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/** Node capabilities for documentation */
|
|
45
|
+
const CAPABILITIES = {
|
|
46
|
+
description: 'Computes multiple distance metrics between numeric vectors',
|
|
47
|
+
features: [
|
|
48
|
+
'Five complementary distance metrics (MAD, RMS, Maximum, Cosine, Angular)',
|
|
49
|
+
'Works with any numeric vectors (correlations, features, histograms, embeddings)',
|
|
50
|
+
'Direct integration with change detectors (Page-Hinkley, CUSUM, Threshold)'
|
|
51
|
+
]
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// Attach static metadata once, from our constants by making a shallow copy.
|
|
55
|
+
export const getSupportedStats = () => SUPPORTED_STATS.slice();
|
|
56
|
+
export const getStatDescriptions = () => ( { ...STAT_DESCRIPTIONS } );
|
|
57
|
+
export const getSupportedControlMethods = () => ( { ...SUPPORTED_CONTROL_METHODS } );
|
|
58
|
+
export const getNodeType = () => NODE_TYPE;
|
|
59
|
+
export const getCapabilities = () => ( { ...CAPABILITIES, features: CAPABILITIES.features.slice() } );
|
|
60
|
+
|
|
61
|
+
// DSL Metadata for transpilation
|
|
62
|
+
// Metadata → describes how to build → Specs → initialize → Nodes
|
|
63
|
+
const DSL_METADATA = {
|
|
64
|
+
// Spec schema for validation
|
|
65
|
+
specSchema: {
|
|
66
|
+
nodeType: {
|
|
67
|
+
type: 'string',
|
|
68
|
+
required: true,
|
|
69
|
+
value: NODE_TYPE,
|
|
70
|
+
},
|
|
71
|
+
name: {
|
|
72
|
+
type: 'string',
|
|
73
|
+
required: true,
|
|
74
|
+
minLength: 1,
|
|
75
|
+
validator: validators.identifier, // Using standard validator
|
|
76
|
+
error: 'Name must be a valid identifier'
|
|
77
|
+
},
|
|
78
|
+
from: {
|
|
79
|
+
type: 'object',
|
|
80
|
+
required: true,
|
|
81
|
+
properties: {
|
|
82
|
+
x: {
|
|
83
|
+
type: 'string',
|
|
84
|
+
required: true,
|
|
85
|
+
minLength: 1,
|
|
86
|
+
validator: validators.noSpaces, // Using standard validator
|
|
87
|
+
error: 'Field name cannot contain spaces'
|
|
88
|
+
},
|
|
89
|
+
y: {
|
|
90
|
+
type: 'string',
|
|
91
|
+
required: true,
|
|
92
|
+
minLength: 1,
|
|
93
|
+
validator: validators.noSpaces, // Using standard validator
|
|
94
|
+
error: 'Field name cannot contain spaces'
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
stats: {
|
|
99
|
+
type: 'object',
|
|
100
|
+
required: true,
|
|
101
|
+
minProperties: 1,
|
|
102
|
+
propertyNames: SUPPORTED_STATS,
|
|
103
|
+
propertySchema: {
|
|
104
|
+
type: 'object',
|
|
105
|
+
required: true,
|
|
106
|
+
properties: {
|
|
107
|
+
storeAs: {
|
|
108
|
+
type: 'string',
|
|
109
|
+
required: true,
|
|
110
|
+
minLength: 1,
|
|
111
|
+
validator: validators.identifier, // Using standard validator
|
|
112
|
+
error: 'storeAs must be a valid identifier'
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
|
|
119
|
+
// Cross-field validators
|
|
120
|
+
crossFieldValidators: [
|
|
121
|
+
{
|
|
122
|
+
fields: [ 'from.x', 'from.y' ],
|
|
123
|
+
validator: ( spec ) => spec.from.x !== spec.from.y,
|
|
124
|
+
error: 'from.x and from.y must be different fields'
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
fields: [ 'stats' ],
|
|
128
|
+
validator: ( spec ) => {
|
|
129
|
+
// Ensure no duplicate storeAs values
|
|
130
|
+
const storeAsValues = Object.values( spec.stats ).map( ( s ) => s.storeAs );
|
|
131
|
+
return storeAsValues.length === new Set( storeAsValues ).size;
|
|
132
|
+
},
|
|
133
|
+
error: 'All storeAs values must be unique'
|
|
134
|
+
}
|
|
135
|
+
],
|
|
136
|
+
|
|
137
|
+
// How to build the spec from DSL params
|
|
138
|
+
// Pattern: NAME_X_Y_OUTPUTS_OPTIONS -> (name, x, y, stats, options)
|
|
139
|
+
buildSpec: ( name, x, y, stats, options ) => ( {
|
|
140
|
+
nodeType: NODE_TYPE,
|
|
141
|
+
name,
|
|
142
|
+
from: { x, y },
|
|
143
|
+
stats,
|
|
144
|
+
...options
|
|
145
|
+
} ),
|
|
146
|
+
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
export const getDSLMetadata = () => ({ ...DSL_METADATA });
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// nodes/vector-distance/publish-to.js
|
|
2
|
+
|
|
3
|
+
import { publishNaN } from '../../core/utils/node/index.js';
|
|
4
|
+
|
|
5
|
+
const publishTo = function ( state, msg ) {
|
|
6
|
+
if ( state.disable ) return;
|
|
7
|
+
// Propagate NaN if unhealthy
|
|
8
|
+
if ( state.inputValidationFailed ) {
|
|
9
|
+
publishNaN( state, msg );
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Publish each configured statistic directly
|
|
14
|
+
if ( state.stats.mad ) {
|
|
15
|
+
msg[ state.stats.mad.storeAs ] = state.distances.mad;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if ( state.stats.rms ) {
|
|
19
|
+
msg[ state.stats.rms.storeAs ] = state.distances.rms;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if ( state.stats.maximum ) {
|
|
23
|
+
msg[ state.stats.maximum.storeAs ] = state.distances.maximum;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if ( state.stats.cosine ) {
|
|
27
|
+
msg[ state.stats.cosine.storeAs ] = state.distances.cosine;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if ( state.stats.angular ) {
|
|
31
|
+
msg[ state.stats.angular.storeAs ] = state.distances.angular;
|
|
32
|
+
}
|
|
33
|
+
}; // publishTo()
|
|
34
|
+
|
|
35
|
+
export default publishTo;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// nodes/vector-distance/recompute.js
|
|
2
|
+
|
|
3
|
+
const recompute = function ( _state ) {
|
|
4
|
+
// For correlation distance, there's no accumulated state to recompute
|
|
5
|
+
// Each update is independent
|
|
6
|
+
// This function exists for API consistency
|
|
7
|
+
|
|
8
|
+
return true;
|
|
9
|
+
}; // recompute()
|
|
10
|
+
|
|
11
|
+
export default recompute;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// nodes/vector-distance/reset.js
|
|
2
|
+
|
|
3
|
+
const reset = function ( state ) {
|
|
4
|
+
// Reset all distance values
|
|
5
|
+
state.distances.mad = 0;
|
|
6
|
+
state.distances.rms = 0;
|
|
7
|
+
state.distances.maximum = 0;
|
|
8
|
+
state.distances.cosine = 0;
|
|
9
|
+
state.distances.angular = 0;
|
|
10
|
+
|
|
11
|
+
// Reset computation flag
|
|
12
|
+
state.computed = false;
|
|
13
|
+
|
|
14
|
+
// Reset workspace values
|
|
15
|
+
state.accumulator.fill( 0 );
|
|
16
|
+
|
|
17
|
+
return true;
|
|
18
|
+
}; // reset()
|
|
19
|
+
|
|
20
|
+
export default reset;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// nodes/vector-distance/update.js
|
|
2
|
+
|
|
3
|
+
/* eslint-disable no-bitwise */
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* vector-distance / update.js
|
|
7
|
+
*
|
|
8
|
+
* Purpose
|
|
9
|
+
* Compute distances between two vectors in a single pass:
|
|
10
|
+
* - Maximum single element difference
|
|
11
|
+
* - For correlations [-1,1]: bounded [0,2]
|
|
12
|
+
* - For general vectors: bounded [0, ∞]
|
|
13
|
+
* - RMS distance between vectors
|
|
14
|
+
* - For correlations [-1,1]: bounded [0,2]
|
|
15
|
+
* - For general vectors: bounded [0, ∞]
|
|
16
|
+
* - MAD distance between vectors
|
|
17
|
+
* - For correlations [-1,1]: bounded [0,2]
|
|
18
|
+
* - For general vectors: bounded [0, ∞]
|
|
19
|
+
* - Angular distance [0,π] regardless of input
|
|
20
|
+
* - Cosine distance [0,2] regardless of input
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
// ---- slot indices for Float64 accumulator --------------
|
|
24
|
+
const ACC_SUM_ABS = 0;
|
|
25
|
+
const ACC_SUM_SQ = 1;
|
|
26
|
+
const ACC_MAX = 2;
|
|
27
|
+
const ACC_DOT = 3;
|
|
28
|
+
const ACC_N1 = 4;
|
|
29
|
+
const ACC_N2 = 5;
|
|
30
|
+
|
|
31
|
+
// ---- helpers ----------------------------------------------------------------
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Quick structural validation. Strict same-length requirement.
|
|
35
|
+
* Returns null to indicate "do nothing" (pass-through).
|
|
36
|
+
*/
|
|
37
|
+
const validateVectors = function ( state, msg ) {
|
|
38
|
+
const xVal = msg[ state.x ];
|
|
39
|
+
const yVal = msg[ state.y ];
|
|
40
|
+
if ( !xVal || !yVal ) return null;
|
|
41
|
+
const nx = ( typeof xVal.length === 'number' ) ? xVal.length : -1;
|
|
42
|
+
const ny = ( typeof yVal.length === 'number' ) ? yVal.length : -1;
|
|
43
|
+
if ( ( nx <= 0 ) || ( ny <= 0 ) || ( nx !== ny ) ) return null;
|
|
44
|
+
|
|
45
|
+
for ( let i = 0; i < nx; i += 1 ) if ( !Number.isFinite( xVal[ i ] ) ) return null;
|
|
46
|
+
for ( let i = 0; i < nx; i += 1 ) if ( !Number.isFinite( yVal[ i ] ) ) return null;
|
|
47
|
+
return { xVal, yVal, n: nx };
|
|
48
|
+
}; // validateVectors()
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Tight single-pass accumulation. No type checks inside the loop
|
|
52
|
+
* (assumes upstream generated numeric vectors).
|
|
53
|
+
*/
|
|
54
|
+
const accumulate = function ( acc, v1, v2, n, mask ) {
|
|
55
|
+
for ( let i = 0; i < n; i += 1 ) {
|
|
56
|
+
const a = v1[ i ];
|
|
57
|
+
const b = v2[ i ];
|
|
58
|
+
const d = ( a - b );
|
|
59
|
+
|
|
60
|
+
if ( ( mask & 1 ) !== 0 ) {
|
|
61
|
+
const ad = Math.abs( d );
|
|
62
|
+
acc[ ACC_SUM_ABS ] += ad;
|
|
63
|
+
if ( ad > acc[ ACC_MAX ] ) acc[ ACC_MAX ] = ad;
|
|
64
|
+
}
|
|
65
|
+
if ( ( mask & 2 ) !== 0 ) {
|
|
66
|
+
acc[ ACC_SUM_SQ ] += ( d * d );
|
|
67
|
+
}
|
|
68
|
+
if ( ( mask & 4 ) !== 0 ) {
|
|
69
|
+
acc[ ACC_DOT ] += ( a * b );
|
|
70
|
+
acc[ ACC_N1 ] += ( a * a );
|
|
71
|
+
acc[ ACC_N2 ] += ( b * b );
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}; // accumulate()
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Convert accumulators into requested distances and update state.
|
|
78
|
+
* Clamps cosine similarity to avoid NaN from acos due to FP error.
|
|
79
|
+
*/
|
|
80
|
+
const finalize = function ( state, acc, n ) {
|
|
81
|
+
if ( state.stats.mad ) {
|
|
82
|
+
state.distances.mad = acc[ ACC_SUM_ABS ] / n;
|
|
83
|
+
}
|
|
84
|
+
if ( state.stats.rms ) {
|
|
85
|
+
state.distances.rms = Math.sqrt( acc[ ACC_SUM_SQ ] / n );
|
|
86
|
+
}
|
|
87
|
+
if ( state.stats.maximum ) {
|
|
88
|
+
state.distances.maximum = acc[ ACC_MAX ];
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if ( ( state.mask & 4 ) !== 0 ) {
|
|
92
|
+
const n1 = acc[ ACC_N1 ];
|
|
93
|
+
const n2 = acc[ ACC_N2 ];
|
|
94
|
+
|
|
95
|
+
// Zero-vector policy: treat as no directional information -> zero distances
|
|
96
|
+
if ( ( n1 === 0 ) || ( n2 === 0 ) ) {
|
|
97
|
+
if ( state.stats.cosine ) state.distances.cosine = 0;
|
|
98
|
+
if ( state.stats.angular ) state.distances.angular = 0;
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const denom = Math.sqrt( n1 ) * Math.sqrt( n2 );
|
|
103
|
+
let cosSim = acc[ ACC_DOT ] / denom;
|
|
104
|
+
|
|
105
|
+
// Clamp for numerical safety
|
|
106
|
+
if ( cosSim > 1 ) cosSim = 1;
|
|
107
|
+
else if ( cosSim < -1 ) cosSim = -1;
|
|
108
|
+
|
|
109
|
+
if ( state.stats.cosine ) state.distances.cosine = 1 - cosSim;
|
|
110
|
+
if ( state.stats.angular ) state.distances.angular = Math.acos( cosSim );
|
|
111
|
+
}
|
|
112
|
+
}; // finalize()
|
|
113
|
+
|
|
114
|
+
// ---- update (export default) ------------------------------------------------
|
|
115
|
+
|
|
116
|
+
const update = function ( state, msg ) {
|
|
117
|
+
if ( state.disable || state.pause ) return state;
|
|
118
|
+
// Reset on each update
|
|
119
|
+
state.inputValidationFailed = false;
|
|
120
|
+
const validated = validateVectors( state, msg );
|
|
121
|
+
if ( !validated ) {
|
|
122
|
+
// Reset on the downstream node may cause this state.
|
|
123
|
+
// Will wait until warms up or error goes away.
|
|
124
|
+
state.inputValidationFailed = true;
|
|
125
|
+
return state;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const { xVal, yVal, n } = validated;
|
|
129
|
+
|
|
130
|
+
const acc = state.accumulator;
|
|
131
|
+
acc.fill( 0 );
|
|
132
|
+
accumulate( acc, xVal, yVal, n, state.mask );
|
|
133
|
+
finalize( state, acc, n );
|
|
134
|
+
|
|
135
|
+
state.computed = true;
|
|
136
|
+
return state;
|
|
137
|
+
}; // update()
|
|
138
|
+
|
|
139
|
+
export default update;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// nodes/winnow/index.js
|
|
2
|
+
|
|
3
|
+
export { default as init } from './init.js';
|
|
4
|
+
export { default as update } from './update.js';
|
|
5
|
+
export { default as publishTo } from './publish-to.js';
|
|
6
|
+
export { default as reset } from './reset.js';
|
|
7
|
+
export { default as recompute } from './recompute.js';
|
|
8
|
+
export { default as disable } from '../../core/utils/node/disable.js';
|
|
9
|
+
export { default as enable } from '../../core/utils/node/enable.js';
|
|
10
|
+
export { default as pause } from '../../core/utils/node/pause.js';
|
|
11
|
+
export { default as unpause } from '../../core/utils/node/unpause.js';
|
|
12
|
+
export * from './introspect.js';
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Initialisation for the winnow node.
|
|
3
|
+
*
|
|
4
|
+
* Creates per-partition state: anchor tracking, slope projection,
|
|
5
|
+
* and adaptive threshold configuration. All allocations happen here
|
|
6
|
+
* — update() and publishTo() are zero-allocation hot paths.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { validateSpec } from '../../core/utils/node/index.js';
|
|
10
|
+
import * as introspect from './introspect.js';
|
|
11
|
+
import { resolveScalar } from '../../core/utils/options/resolve-field-keyed.js';
|
|
12
|
+
import { asTunable } from '../../core/tunable/index.js';
|
|
13
|
+
|
|
14
|
+
const init = function ( spec ) {
|
|
15
|
+
validateSpec( spec, introspect );
|
|
16
|
+
|
|
17
|
+
const state = Object.create( null );
|
|
18
|
+
|
|
19
|
+
// ── Standard flags (all nodes) ──────────────────────────────────
|
|
20
|
+
state.disable = false;
|
|
21
|
+
state.pause = false;
|
|
22
|
+
state.inputValidationFailed = false;
|
|
23
|
+
|
|
24
|
+
// ── Configuration from spec ─────────────────────────────────────
|
|
25
|
+
state.x = spec.from.x;
|
|
26
|
+
state.stats = spec.stats;
|
|
27
|
+
|
|
28
|
+
// Pre-built field names — no string ops in hot path
|
|
29
|
+
state.slopeField = spec.slopeField ?? introspect.DEFAULT_OPTIONS.slopeField;
|
|
30
|
+
state.noiseField = spec.noiseField ?? introspect.DEFAULT_OPTIONS.noiseField;
|
|
31
|
+
state.dirField = spec.dirField ?? introspect.DEFAULT_OPTIONS.dirField;
|
|
32
|
+
state.gateField = spec.gateField ?? introspect.DEFAULT_OPTIONS.gateField;
|
|
33
|
+
|
|
34
|
+
// Scalar options (support field-keyed specification)
|
|
35
|
+
state.chi2Threshold = resolveScalar( spec.chi2Threshold, state.x ) ??
|
|
36
|
+
introspect.DEFAULT_OPTIONS.chi2Threshold;
|
|
37
|
+
state.tightenBase = resolveScalar( spec.tightenBase, state.x ) ??
|
|
38
|
+
introspect.DEFAULT_OPTIONS.tightenBase;
|
|
39
|
+
state.maxGap = resolveScalar( spec.maxGap, state.x ) ??
|
|
40
|
+
introspect.DEFAULT_OPTIONS.maxGap;
|
|
41
|
+
|
|
42
|
+
// ── Pre-compiled tunable ────────────────────────────────────────
|
|
43
|
+
const resolvedK = resolveScalar( spec.K, state.x ) ?? introspect.DEFAULT_OPTIONS.K;
|
|
44
|
+
state.KFn = asTunable( resolvedK );
|
|
45
|
+
state.K = typeof resolvedK === 'number' ? resolvedK : introspect.DEFAULT_OPTIONS.K;
|
|
46
|
+
state.tunableErrorLogged = false;
|
|
47
|
+
|
|
48
|
+
// ── Accumulated state (per-partition core) ──────────────────────
|
|
49
|
+
state.anchor = null;
|
|
50
|
+
state.anchorSlope = 0;
|
|
51
|
+
state.anchorTime = 0;
|
|
52
|
+
state.lastPassedAt = 0;
|
|
53
|
+
state.prevDirection = null;
|
|
54
|
+
state.counter = 0;
|
|
55
|
+
|
|
56
|
+
// ── Outputs ─────────────────────────────────────────────────────
|
|
57
|
+
state.deviation = 0;
|
|
58
|
+
state.predicted = 0;
|
|
59
|
+
state.significant = false;
|
|
60
|
+
|
|
61
|
+
// ── 1-sample buffer for spike-region anchoring ──────────────────
|
|
62
|
+
// When bufferPrev is true, winnow holds the previous tick's input
|
|
63
|
+
// value and timestamp. On Check 2 (chi-squared gate fire), it
|
|
64
|
+
// publishes xPrev/tPrev — providing the (k-1) anchor that
|
|
65
|
+
// eliminates linear-interpolation overshoot around spikes.
|
|
66
|
+
state.bufferPrev = spec.bufferPrev ?? introspect.DEFAULT_OPTIONS.bufferPrev;
|
|
67
|
+
state.timestampField = spec.timestampField ?? null;
|
|
68
|
+
state.bufferedX = NaN;
|
|
69
|
+
state.bufferedT = NaN;
|
|
70
|
+
state.keptByGate = false;
|
|
71
|
+
state.xPrev = NaN;
|
|
72
|
+
state.tPrev = NaN;
|
|
73
|
+
state.hasXPrev = spec.stats.xPrev !== undefined;
|
|
74
|
+
state.hasTPrev = spec.stats.tPrev !== undefined;
|
|
75
|
+
|
|
76
|
+
// ── Metadata ────────────────────────────────────────────────────
|
|
77
|
+
state.nodeType = introspect.getNodeType();
|
|
78
|
+
|
|
79
|
+
return state;
|
|
80
|
+
}; // init()
|
|
81
|
+
|
|
82
|
+
export default init;
|