mirror of
https://github.com/ruvnet/RuVector.git
synced 2026-07-09 17:28:42 +00:00
* feat(timesfm): TimesFM 1.0 200M decoder-only inference port to candle
Native Rust/candle port of google-research/timesfm (pytorch_patched_decoder.py)
for temporal embeddings + zero-shot forecasting inside RuVector. Behind an opt-in
`candle` feature (default = [], cpu-fallback pattern like ruvector-hailo); no
lockfile churn (candle 0.9.2 already pinned by ruvllm).
- config.rs: TimesfmConfig (1280 dim, 20 layers, 16 heads, 80 head_dim, patch 32/128)
- model.rs: ResidualBlock patch embedding, sinusoidal pos-emb (no RoPE), 20x decoder
(fused qkv, learnable per-head-dim softplus scaling, causal+padding mask), RevIN
instance norm, forward [B,N,128,10] + autoregressive decode to arbitrary horizon
- scripts/convert_weights.py: HF safetensors → VarBuilder key remap (--dry-run)
- 12 tests (shape + RevIN numerical regression); clippy -D warnings clean
Adversarial review caught + fixed a real RevIN bug (masked_mean_std did a global
mean/std instead of the reference's first-qualifying-patch selection) + added
regression tests. Honest scope: dimensionally + structurally faithful, but real
numerical weight-parity vs the published safetensors is NOT yet verified (tests
run on dummy weights). Open low-impact faithfulness deviations documented in code.
Co-Authored-By: claude-flow <ruv@ruv.net>
* style(timesfm): rustfmt the crate (format the RevIN-fix edits) — green the Rustfmt gate for this crate
Our crate is now fmt-clean + clippy-clean; the remaining workspace-wide fmt
diffs are pre-existing in other crates, out of scope for this PR.
Co-Authored-By: claude-flow <ruv@ruv.net>
* feat(timesfm): weight-parity validated against official PyTorch reference
Drives the candle TimesFM 1.0 200M port from "compiles on dummy weights" to
a real numerical PASS against google/timesfm-1.0-200m.
Measured (f32 CPU, deterministic 512-pt series, horizon 128):
max-abs-diff = 8.58e-6 MAE = 3.25e-6 rel-error = 5.83e-7
(target was <1e-2; we hit the f32 accumulation floor ~1e-5.)
Bridge: the real torch_model.ckpt state_dict (253 keys) maps 1:1 through
scripts/convert_weights.py with zero unmapped/missing keys.
Bug found + fixed (src/model.rs build_mask): the attention mask used
f32::NEG_INFINITY for masked positions. With real 0/1 paddings the padding
term `padding * -inf` computes `0 * -inf = NaN`, poisoning the whole mask
so softmax emitted NaN for every row (every forecast value was NaN). The
old `nan_to_zero` guard silently failed (where_cond dtype mismatch -> fallback
`NaN * 1 = NaN`). Replaced with the reference's large *finite* negative
(-0.7 * f32::MAX) and element-wise `minimum` merge, exactly matching
convert_paddings_to_mask + causal_mask + merge_masks. No NaN, exact parity.
Added:
- examples/parity.rs end-to-end parity runner with metrics + verdict
- tests/parity.rs gated integration test (skips cleanly w/o the
814MB artifacts; never fabricates a pass)
- scripts/gen_reference.py reference forecast generator (official decoder)
Co-Authored-By: claude-flow <ruv@ruv.net>
* bench(timesfm): forward-only latency bench — 45ms/forecast (200M, ctx512/h128, warm CPU); parity validated 8.58e-6
* feat(timesfm): predictive-pruning module for Darwin (ADR-191 §2)
Add crates/timesfm/src/prune.rs: forecast an optimization curve's plateau
from its first K points with TimesFM and decide PRUNE vs CONTINUE against a
viability threshold (lower=better, like exploitability). Decoupled — operates
on a generic Vec<f32>, no cross-repo poker-darwin dep.
- decide_prune(): forecast tail to target horizon, plateau = mean of last
horizon/4 steps; PRUNE iff plateau > threshold. Guards: non-finite forecast
=> CONTINUE conf 0 (never kill on a broken forecast); already-viable
(best_so_far <= threshold) => CONTINUE. Scale-invariant confidence.
- examples/predictive_prune.rs + tests/prune.rs: two synthetic curves with
REAL weights — doomed (floor 0.20) => PRUNE (forecast plateau 1.98, conf
0.72); healthy (already below 0.05) => CONTINUE. Both decisions correct.
Skips cleanly when weights absent (no fabricated pass).
- Honest calibration note: TimesFM mean-reverts upward on short synthetic
decays so absolute plateau is biased high; decision rides the robust
relative-ordering + already-viable signals, not absolute calibration.
- Doc-comment shows how poker-darwin calls this on its champion curve.
Tests: 12 shape + parity + prune = 14/14 green (candle); light build green.
Co-Authored-By: claude-flow <ruv@ruv.net>
* test(timesfm): bench24 harness for GCP 24-case deployment test (ADR-191 Phase B)
24 distinct forecast cases (varied period/trend/amp/noise/freq_id; ctx=512,
horizon=128) on real weights. Per-case latency + finiteness assert, aggregate
mean/p50/p95/p99, throughput, peak RSS, machine-readable JSON line. Non-finite
output is a hard FAIL (exit 1), never a silent pass.
Local baseline (ruvultra, 32-thread CPU): 24/24 finite, mean 42.5ms p95 44.2ms,
throughput 23.5 fps, peak RSS 1.55GB.
Co-Authored-By: claude-flow <ruv@ruv.net>
* fix(ci) + feat(timesfm): README, publish=true, research-nightly shard, rustfmt
CI fixes:
- timesfm added to research-nightly shard (-p timesfm)
- timesfm excluded from core-and-rest shard (--exclude timesfm)
- cargo fmt -p timesfm: model.rs + 4 example files formatted
- cargo fmt -p ruvector-graph: typed_graph_bench.rs + 4 src files
(pre-existing rustfmt failure blocking the PR)
crates/timesfm/README.md (new):
- Architecture diagram (ResidualBlock → 20× decoder → RevIN → output)
- Feature flags table (candle/cuda/metal/hub)
- Quick-start: inference + weight loading workflow
- Known limitations section (weight parity, MLP mask, pos-emb shift)
- References (ICML 2024 paper, HuggingFace model card)
crates/timesfm/Cargo.toml:
- publish = true (was false)
- readme = "README.md"
Co-Authored-By: claude-flow <ruv@ruv.net>
* chore: cargo fmt ruvector-proof-gate (pre-existing rustfmt CI blocker)
Co-Authored-By: claude-flow <ruv@ruv.net>
* chore: cargo fmt temporal-coherence + tiny-dancer-core (pre-existing)
Co-Authored-By: claude-flow <ruv@ruv.net>
* chore: cargo fmt tiny-dancer-node + ruvllm openmythos (pre-existing)
Co-Authored-By: claude-flow <ruv@ruv.net>
* chore: cargo fmt rvf-runtime/store.rs (pre-existing)
Co-Authored-By: claude-flow <ruv@ruv.net>
* fix(ci): timesfm tests run with --features candle in research-nightly
The research-nightly shard was running timesfm without --features candle,
causing a compile error (all model code is behind the feature gate).
Fix: remove timesfm from the shared nextest run; add a dedicated step
that runs only timesfm tests with --features candle.
Co-Authored-By: claude-flow <ruv@ruv.net>
* fix(ruvllm): remove broken private-item doc link (DepthLora)
Code Quality CI was failing: public doc in mod.rs linked to private
recurrent::DepthLora. Replace with plain backtick name.
Pre-existing issue surfaced by rustfmt touching the file.
Co-Authored-By: claude-flow <ruv@ruv.net>
* fix(ruvllm): fix all private-item rustdoc links in openmythos/mod.rs
Three doc comments linked to private items (LtiInjection, RecurrentBlock,
DepthLora) in the recurrent module. rustdoc's -D warnings caught them.
Replaced with plain-text names. Pre-existing, surfaced by rustfmt touching
the file.
Co-Authored-By: claude-flow <ruv@ruv.net>
* fix(ruvllm): fix private attention module doc link
Co-Authored-By: claude-flow <ruv@ruv.net>
* fix(timesfm): gate bench/bench24 examples behind candle feature
The bench and bench24 examples import candle_core/candle_nn/timesfm::model
unconditionally, breaking Clippy and stock workspace builds that run without
--features candle. Add [[example]] required-features = ["candle"] so they are
skipped when the feature is off, matching parity/predictive_prune which already
self-gate via #[cfg(feature = "candle")].
Co-Authored-By: claude-flow <ruv@ruv.net>
* fix(maxsim): add ruvector-maxsim to workspace + make clippy-clean
The research-nightly CI shard referenced -p ruvector-maxsim (added
|
||
|---|---|---|
| .. | ||
| agentic-robotics-benchmarks | ||
| agentic-robotics-core | ||
| agentic-robotics-embedded | ||
| agentic-robotics-mcp | ||
| agentic-robotics-node | ||
| agentic-robotics-rt | ||
| cognitum-gate-kernel | ||
| cognitum-gate-tilezero | ||
| emergent-time | ||
| emergent-time-wasm | ||
| hailort-sys | ||
| mcp-brain | ||
| mcp-brain-server | ||
| mcp-gate | ||
| micro-hnsw-wasm | ||
| neural-trader-coherence | ||
| neural-trader-core | ||
| neural-trader-replay | ||
| neural-trader-strategies | ||
| neural-trader-wasm | ||
| photonlayer-bench | ||
| photonlayer-cli | ||
| photonlayer-core | ||
| photonlayer-ruvector | ||
| photonlayer-wasm | ||
| prime-radiant | ||
| profiling | ||
| ruos-thermal | ||
| ruvector-acorn | ||
| ruvector-acorn-wasm | ||
| ruvector-agent-memory | ||
| ruvector-attention | ||
| ruvector-attention-cli | ||
| ruvector-attention-node | ||
| ruvector-attention-unified-wasm | ||
| ruvector-attention-wasm | ||
| ruvector-attn-mincut | ||
| ruvector-bench | ||
| ruvector-bet4-ivf-bench | ||
| ruvector-cli | ||
| ruvector-cluster | ||
| ruvector-cnn | ||
| ruvector-cnn-wasm | ||
| ruvector-cognitive-container | ||
| ruvector-coherence | ||
| ruvector-coherence-hnsw | ||
| ruvector-collections | ||
| ruvector-consciousness | ||
| ruvector-consciousness-wasm | ||
| ruvector-core | ||
| ruvector-crv | ||
| ruvector-dag | ||
| ruvector-dag-wasm | ||
| ruvector-decompiler | ||
| ruvector-decompiler-wasm | ||
| ruvector-delta-consensus | ||
| ruvector-delta-core | ||
| ruvector-delta-graph | ||
| ruvector-delta-index | ||
| ruvector-delta-wasm | ||
| ruvector-diskann | ||
| ruvector-diskann-node | ||
| ruvector-dither | ||
| ruvector-domain-expansion | ||
| ruvector-domain-expansion-wasm | ||
| ruvector-economy-wasm | ||
| ruvector-exotic-wasm | ||
| ruvector-filter | ||
| ruvector-fpga-transformer | ||
| ruvector-fpga-transformer-wasm | ||
| ruvector-gnn | ||
| ruvector-gnn-node | ||
| ruvector-gnn-rerank | ||
| ruvector-gnn-wasm | ||
| ruvector-graph | ||
| ruvector-graph-condense | ||
| ruvector-graph-condense-wasm | ||
| ruvector-graph-node | ||
| ruvector-graph-transformer | ||
| ruvector-graph-transformer-node | ||
| ruvector-graph-transformer-wasm | ||
| ruvector-graph-wasm | ||
| ruvector-hailo | ||
| ruvector-hailo-cluster | ||
| ruvector-hnsw-repair | ||
| ruvector-hybrid | ||
| ruvector-hyperbolic-hnsw | ||
| ruvector-hyperbolic-hnsw-wasm | ||
| ruvector-kalshi | ||
| ruvector-learning-wasm | ||
| ruvector-lsm-ann | ||
| ruvector-math | ||
| ruvector-math-wasm | ||
| ruvector-matryoshka | ||
| ruvector-maxsim | ||
| ruvector-metrics | ||
| ruvector-mincut | ||
| ruvector-mincut-brain-node | ||
| ruvector-mincut-gated-transformer | ||
| ruvector-mincut-gated-transformer-wasm | ||
| ruvector-mincut-node | ||
| ruvector-mincut-wasm | ||
| ruvector-mmwave | ||
| ruvector-nervous-system | ||
| ruvector-nervous-system-wasm | ||
| ruvector-node | ||
| ruvector-perception | ||
| ruvector-postgres | ||
| ruvector-pq-search | ||
| ruvector-profiler | ||
| ruvector-proof-gate | ||
| ruvector-rabitq | ||
| ruvector-rabitq-wasm | ||
| ruvector-raft | ||
| ruvector-rairs | ||
| ruvector-replication | ||
| ruvector-robotics | ||
| ruvector-router-cli | ||
| ruvector-router-core | ||
| ruvector-router-ffi | ||
| ruvector-router-wasm | ||
| ruvector-rulake | ||
| ruvector-server | ||
| ruvector-snapshot | ||
| ruvector-solver | ||
| ruvector-solver-node | ||
| ruvector-solver-wasm | ||
| ruvector-sota-bench | ||
| ruvector-sparse-inference | ||
| ruvector-sparse-inference-wasm | ||
| ruvector-sparsifier | ||
| ruvector-sparsifier-wasm | ||
| ruvector-temporal-coherence | ||
| ruvector-temporal-tensor | ||
| ruvector-temporal-tensor-wasm | ||
| ruvector-tiny-dancer-core | ||
| ruvector-tiny-dancer-node | ||
| ruvector-tiny-dancer-wasm | ||
| ruvector-verified | ||
| ruvector-verified-wasm | ||
| ruvector-wasm | ||
| ruvix | ||
| ruvllm | ||
| ruvllm-cli | ||
| ruvllm-wasm | ||
| ruvllm_retrieval_diffusion | ||
| ruvllm_sparse_attention | ||
| rvAgent | ||
| rvf | ||
| rvlite | ||
| rvm | ||
| sona | ||
| sonic-ct | ||
| sonic-ct-wasm | ||
| thermorust | ||
| timesfm | ||
| agentic-robotics-README.md | ||