mirror of
https://github.com/ruvnet/RuVector.git
synced 2026-07-13 19: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 578400d1d,
2026-06-21) but the crate was never a workspace member, so the shard aborted
with 'package ID ruvector-maxsim did not match any packages' before reaching
the timesfm candle test step in the same shard. Add the crate to workspace
members so the shard resolves and timesfm tests actually run.
The crate's self-imposed #![warn(missing_docs)] plus an unused param and a dead
ground_truth() helper would otherwise fail the workspace 'Clippy (deny warnings)'
job once it's a member, so: document the public error/types fields, underscore
the unused gen_corpus dims param, and drop the dead ground_truth() (main builds
ground truth inline). cargo clippy -p ruvector-maxsim --all-targets -- -D warnings
is clean; 19 tests pass.
Co-Authored-By: claude-flow <ruv@ruv.net>
* fix(clippy): clear pre-existing workspace clippy + fmt debt under -D warnings
The timesfm candle compile error was masking the rest of the workspace from
'Clippy (deny warnings)' (cargo clippy --workspace --all-targets -- -D warnings);
once timesfm/maxsim compile, these pre-existing lints (also red on main) surface.
All trivial, no behavior change:
- proof-gate: needless &seq.to_le_bytes() borrows (hash bytes identical via
AsRef), allow items_after_test_module, allow dead queries field in example
- photonlayer-wasm: swap approx-PI 3.14 test literal for 2.5 (arbitrary fill)
- coherence-hnsw / gnn example: allow(needless_range_loop) where index is reused
- gnn / hnsw-repair: allow(too_many_arguments) on bench fns; sort_by->sort_by_key;
&mut Vec -> &mut [_]
- graph bench: drop black_box around unit validate_node().unwrap()
- sota-bench: drop unused imports, .max().min()->.clamp(), remove redundant parens
- maxsim: rustfmt + Cargo.lock sync (now a workspace member)
cargo clippy --workspace --all-targets --no-deps -- -D warnings: clean (exit 0)
cargo fmt --all -- --check: clean (exit 0)
Co-Authored-By: claude-flow <ruv@ruv.net>
* fix(deny): ignore RUSTSEC-2026-0186 (memmap2 unsound, transitive)
cargo-deny's advisories check fails on RUSTSEC-2026-0186 — an 'unsound'
(not exploitable) Unchecked-pointer-offset advisory against memmap2 0.9.x,
pulled transitively via safetensors/candle mmap loading and other crates.
No fixed 0.9 release exists yet and we don't pass attacker-controlled offsets
to memmap2. Add it to the justified ignore list (re-review 2026-08-01),
matching the existing deny.toml pattern. 'cargo deny check advisories' is now
clean locally.
Co-Authored-By: claude-flow <ruv@ruv.net>
---------
Co-authored-by: ruvnet <ruvnet@gmail.com>
390 lines
14 KiB
YAML
390 lines
14 KiB
YAML
name: Workspace CI
|
||
|
||
on:
|
||
push:
|
||
branches: [main]
|
||
pull_request:
|
||
workflow_dispatch:
|
||
|
||
env:
|
||
CARGO_TERM_COLOR: always
|
||
RUST_BACKTRACE: 1
|
||
# Skip building unused proc-macro features in test bin link steps
|
||
CARGO_INCREMENTAL: 0
|
||
|
||
jobs:
|
||
fmt:
|
||
name: Rustfmt
|
||
runs-on: ubuntu-22.04
|
||
timeout-minutes: 30
|
||
continue-on-error: true
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
with:
|
||
submodules: recursive
|
||
|
||
- name: Install Rust stable
|
||
uses: dtolnay/rust-toolchain@stable
|
||
with:
|
||
components: rustfmt
|
||
|
||
- name: Check formatting
|
||
run: cargo fmt --all -- --check
|
||
|
||
check:
|
||
name: Cargo check
|
||
runs-on: ubuntu-22.04
|
||
timeout-minutes: 30
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
with:
|
||
submodules: recursive
|
||
|
||
- name: Install system dependencies
|
||
run: sudo apt-get update && sudo apt-get install -y libfontconfig1-dev
|
||
|
||
- name: Install Rust stable
|
||
uses: dtolnay/rust-toolchain@stable
|
||
|
||
- name: Cache Rust
|
||
uses: Swatinem/rust-cache@v2
|
||
|
||
- name: Cargo check (workspace)
|
||
run: cargo check --workspace --exclude ruvector-postgres
|
||
|
||
clippy:
|
||
name: Clippy
|
||
runs-on: ubuntu-22.04
|
||
timeout-minutes: 30
|
||
continue-on-error: true
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
with:
|
||
submodules: recursive
|
||
|
||
- name: Install system dependencies
|
||
run: sudo apt-get update && sudo apt-get install -y libfontconfig1-dev
|
||
|
||
- name: Install Rust stable
|
||
uses: dtolnay/rust-toolchain@stable
|
||
with:
|
||
components: clippy
|
||
|
||
- name: Cache Rust
|
||
uses: Swatinem/rust-cache@v2
|
||
|
||
- name: Clippy (workspace)
|
||
run: cargo clippy --workspace --exclude ruvector-postgres --all-targets -- -W warnings
|
||
|
||
# The full workspace test suite exceeds the 30-minute timeout on a single
|
||
# runner. We split the work into parallel matrix jobs grouped by domain so
|
||
# each shard fits comfortably under the timeout, and use `cargo-nextest` for
|
||
# faster test discovery and execution.
|
||
test:
|
||
name: Tests (${{ matrix.name }})
|
||
runs-on: ubuntu-22.04
|
||
# `core-and-rest` is the catch-all shard and compiles ~50 crates; on a
|
||
# cold cache the build alone has hit ~90min, so headroom matters more
|
||
# than tight feedback for this job. Faster shards still finish in ~10–20m.
|
||
# Iter 231 — bumped 150→180. Historical successful runs landed at
|
||
# 2h 30m 16s (just under the old cap); two PR-413 runs (iter 228 +
|
||
# iter 230) both hit the cap and got cancelled mid-test. Excluding
|
||
# the iter-219 hailo crates from the catch-all (iter 230) was a
|
||
# necessary but not sufficient fix — the shard was already at the
|
||
# ragged edge. Iter 232+ — natural duration drifted to 155–165 min
|
||
# (ci/supply-chain-guards branch), hitting the 180-min cap. Bumped
|
||
# 180→240 to restore headroom. The right long-term fix is to split
|
||
# heavy crates out into a new sibling shard.
|
||
timeout-minutes: 240
|
||
strategy:
|
||
fail-fast: false
|
||
matrix:
|
||
include:
|
||
- name: vector-index
|
||
packages: >-
|
||
-p ruvector-rabitq
|
||
-p ruvector-rulake
|
||
-p ruvector-diskann
|
||
-p ruvector-graph
|
||
-p ruvector-gnn
|
||
-p ruvector-cnn
|
||
- name: rvagent
|
||
packages: >-
|
||
-p rvagent-a2a
|
||
-p rvagent-acp
|
||
-p rvagent-backends
|
||
-p rvagent-cli
|
||
-p rvagent-core
|
||
-p rvagent-mcp
|
||
-p rvagent-middleware
|
||
-p rvagent-subagents
|
||
-p rvagent-tools
|
||
-p rvagent-wasm
|
||
- name: ruvix
|
||
packages: >-
|
||
-p ruvix-aarch64
|
||
-p ruvix-bench
|
||
-p ruvix-boot
|
||
-p ruvix-cap
|
||
-p ruvix-demo
|
||
-p ruvix-drivers
|
||
-p ruvix-hal
|
||
-p ruvix-integration
|
||
-p ruvix-nucleus
|
||
-p ruvix-proof
|
||
-p ruvix-queue
|
||
-p ruvix-region
|
||
-p ruvix-sched
|
||
-p ruvix-shell
|
||
-p ruvix-types
|
||
-p ruvix-vecgraph
|
||
- name: ml-research-heavy
|
||
# Heaviest crates split into their own shard so ml-research
|
||
# doesn't exceed the 45-min timeout.
|
||
packages: >-
|
||
-p ruvector-attention
|
||
-p ruvector-mincut
|
||
-p ruvector-fpga-transformer
|
||
-p ruvector-graph-transformer
|
||
- name: ml-research-rest
|
||
packages: >-
|
||
-p ruvector-scipix
|
||
-p ruvector-sparse-inference
|
||
-p ruvector-sparsifier
|
||
-p ruvector-solver
|
||
-p ruvector-domain-expansion
|
||
-p ruvector-robotics
|
||
- name: core-and-rest-heavy
|
||
# Hoist the known-heavy long-tail crates out of core-and-rest
|
||
# so neither shard exceeds the 90-min timeout.
|
||
packages: >-
|
||
-p ruvllm
|
||
-p ruvllm-cli
|
||
-p ruvector-dag
|
||
-p ruvector-nervous-system
|
||
-p ruvector-math
|
||
-p ruvector-consciousness
|
||
-p prime-radiant
|
||
-p mcp-brain
|
||
-p ruvector-decompiler
|
||
- name: core-and-rest-wasm
|
||
# Iter 232 — split out the 29 *-wasm crates from core-and-rest
|
||
# because the catch-all shard had grown to 115 crates and was
|
||
# consistently missing the 180min cap (iter-228 + iter-230 +
|
||
# iter-231 all cancelled at the timeout boundary). The wasm
|
||
# crates are a natural sub-group: thin bindings on top of host
|
||
# crates, easy to compile + test in isolation.
|
||
packages: >-
|
||
-p neural-trader-wasm
|
||
-p ruvector-acorn-wasm
|
||
-p ruvector-attention-unified-wasm
|
||
-p ruvector-attention-wasm
|
||
-p ruvector-cnn-wasm
|
||
-p ruvector-consciousness-wasm
|
||
-p ruvector-dag-wasm
|
||
-p ruvector-decompiler-wasm
|
||
-p ruvector-delta-wasm
|
||
-p ruvector-domain-expansion-wasm
|
||
-p ruvector-economy-wasm
|
||
-p ruvector-exotic-wasm
|
||
-p ruvector-fpga-transformer-wasm
|
||
-p ruvector-gnn-wasm
|
||
-p ruvector-graph-transformer-wasm
|
||
-p ruvector-graph-wasm
|
||
-p ruvector-learning-wasm
|
||
-p ruvector-math-wasm
|
||
-p ruvector-mincut-gated-transformer-wasm
|
||
-p ruvector-mincut-wasm
|
||
-p ruvector-nervous-system-wasm
|
||
-p ruvector-rabitq-wasm
|
||
-p ruvector-router-wasm
|
||
-p ruvector-solver-wasm
|
||
-p ruvector-sparsifier-wasm
|
||
-p ruvector-tiny-dancer-wasm
|
||
-p ruvector-verified-wasm
|
||
-p ruvector-wasm
|
||
# Iter 233 — `ruvllm-wasm` excluded from native nextest:
|
||
# 11 of its 195 tests (sona_instant + workers::feature_detect)
|
||
# fail or SIGABRT on native because they're wasm-target
|
||
# specific (need wasm-bindgen-test). Surfaced by iter-232's
|
||
# split; previously masked by the iter-228..231 timeout
|
||
# cancellations of the megaShard. Tracking as workspace
|
||
# follow-up — fix is to gate the affected modules behind
|
||
# `#[cfg(target_arch = "wasm32")]` or migrate to
|
||
# wasm-bindgen-test runners.
|
||
- name: research-nightly
|
||
# Nightly research PoC crates (iter 240+). Kept in a separate shard
|
||
# so their compile + test time doesn't inflate core-and-rest.
|
||
# timeout-minutes is intentionally tight — if a research crate
|
||
# takes more than 30 min it signals an unbounded benchmark in tests.
|
||
packages: >-
|
||
-p ruvector-lsm-ann
|
||
-p ruvector-matryoshka
|
||
-p ruvector-pq-search
|
||
-p ruvector-hybrid
|
||
-p ruvector-hnsw-repair
|
||
-p ruvector-coherence-hnsw
|
||
-p ruvector-maxsim
|
||
-p photonlayer-core
|
||
-p photonlayer-bench
|
||
-p photonlayer-cli
|
||
-p photonlayer-wasm
|
||
-p photonlayer-ruvector
|
||
timeout-minutes: 30
|
||
- name: core-and-rest
|
||
# Everything else: core, delta, server/cluster, etc.
|
||
# Uses --workspace + --exclude to subtract the groups above so we
|
||
# don't have to enumerate ~100 crates by hand.
|
||
packages: >-
|
||
--workspace
|
||
# Nightly research crates run in the research-nightly shard (iter 240+)
|
||
--exclude photonlayer-core
|
||
--exclude photonlayer-bench
|
||
--exclude photonlayer-cli
|
||
--exclude photonlayer-wasm
|
||
--exclude photonlayer-ruvector
|
||
--exclude ruvector-lsm-ann
|
||
--exclude ruvector-matryoshka
|
||
--exclude ruvector-pq-search
|
||
--exclude ruvector-hybrid
|
||
--exclude ruvector-hnsw-repair
|
||
--exclude ruvector-coherence-hnsw
|
||
--exclude ruvector-maxsim
|
||
--exclude ruvector-postgres
|
||
--exclude ruvector-decompiler
|
||
--exclude timesfm
|
||
--exclude ruvllm
|
||
--exclude ruvllm-cli
|
||
--exclude ruvector-dag
|
||
--exclude ruvector-nervous-system
|
||
--exclude ruvector-math
|
||
--exclude ruvector-consciousness
|
||
--exclude prime-radiant
|
||
--exclude mcp-brain
|
||
--exclude ruvector-rabitq
|
||
--exclude ruvector-rulake
|
||
--exclude ruvector-diskann
|
||
--exclude ruvector-graph
|
||
--exclude ruvector-gnn
|
||
--exclude ruvector-cnn
|
||
--exclude rvagent-a2a
|
||
--exclude rvagent-acp
|
||
--exclude rvagent-backends
|
||
--exclude rvagent-cli
|
||
--exclude rvagent-core
|
||
--exclude rvagent-mcp
|
||
--exclude rvagent-middleware
|
||
--exclude rvagent-subagents
|
||
--exclude rvagent-tools
|
||
--exclude rvagent-wasm
|
||
--exclude ruvix-aarch64
|
||
--exclude ruvix-bench
|
||
--exclude ruvix-boot
|
||
--exclude ruvix-cap
|
||
--exclude ruvix-demo
|
||
--exclude ruvix-drivers
|
||
--exclude ruvix-hal
|
||
--exclude ruvix-integration
|
||
--exclude ruvix-nucleus
|
||
--exclude ruvix-proof
|
||
--exclude ruvix-queue
|
||
--exclude ruvix-region
|
||
--exclude ruvix-sched
|
||
--exclude ruvix-shell
|
||
--exclude ruvix-types
|
||
--exclude ruvix-vecgraph
|
||
--exclude ruvector-attention
|
||
--exclude ruvector-mincut
|
||
--exclude ruvector-scipix
|
||
--exclude ruvector-fpga-transformer
|
||
--exclude ruvector-sparse-inference
|
||
--exclude ruvector-sparsifier
|
||
--exclude ruvector-solver
|
||
--exclude ruvector-graph-transformer
|
||
--exclude ruvector-domain-expansion
|
||
--exclude ruvector-robotics
|
||
--exclude hailort-sys
|
||
--exclude ruvector-hailo
|
||
--exclude ruvector-mmwave
|
||
--exclude ruvector-hailo-cluster
|
||
--exclude neural-trader-wasm
|
||
--exclude ruvector-acorn-wasm
|
||
--exclude ruvector-attention-unified-wasm
|
||
--exclude ruvector-attention-wasm
|
||
--exclude ruvector-cnn-wasm
|
||
--exclude ruvector-consciousness-wasm
|
||
--exclude ruvector-dag-wasm
|
||
--exclude ruvector-decompiler
|
||
--exclude timesfm-wasm
|
||
--exclude ruvector-delta-wasm
|
||
--exclude ruvector-domain-expansion-wasm
|
||
--exclude ruvector-economy-wasm
|
||
--exclude ruvector-exotic-wasm
|
||
--exclude ruvector-fpga-transformer-wasm
|
||
--exclude ruvector-gnn-wasm
|
||
--exclude ruvector-graph-transformer-wasm
|
||
--exclude ruvector-graph-wasm
|
||
--exclude ruvector-learning-wasm
|
||
--exclude ruvector-math-wasm
|
||
--exclude ruvector-mincut-gated-transformer-wasm
|
||
--exclude ruvector-mincut-wasm
|
||
--exclude ruvector-nervous-system-wasm
|
||
--exclude ruvector-rabitq-wasm
|
||
--exclude ruvector-router-wasm
|
||
--exclude ruvector-solver-wasm
|
||
--exclude ruvector-sparsifier-wasm
|
||
--exclude ruvector-tiny-dancer-wasm
|
||
--exclude ruvector-verified-wasm
|
||
--exclude ruvector-wasm
|
||
--exclude ruvllm-wasm
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
with:
|
||
submodules: recursive
|
||
|
||
- name: Install system dependencies
|
||
run: sudo apt-get update && sudo apt-get install -y libfontconfig1-dev
|
||
|
||
- name: Install Rust stable
|
||
uses: dtolnay/rust-toolchain@stable
|
||
|
||
- name: Cache Rust
|
||
uses: Swatinem/rust-cache@v2
|
||
with:
|
||
key: test-${{ matrix.name }}
|
||
|
||
- name: Install cargo-nextest
|
||
uses: taiki-e/install-action@v2
|
||
with:
|
||
tool: cargo-nextest
|
||
|
||
- name: Run tests (${{ matrix.name }})
|
||
run: cargo nextest run --no-fail-fast ${{ matrix.packages }}
|
||
|
||
- name: Run timesfm tests (candle feature, research-nightly only)
|
||
if: matrix.name == 'research-nightly'
|
||
run: cargo nextest run --no-fail-fast -p timesfm --features candle
|
||
|
||
- name: Run doctests (${{ matrix.name }})
|
||
# nextest does not run doctests; do them in a separate step. Cheap
|
||
# because compilation is already cached from the nextest run.
|
||
run: cargo test --doc ${{ matrix.packages }}
|
||
|
||
audit:
|
||
name: Security audit
|
||
runs-on: ubuntu-22.04
|
||
timeout-minutes: 30
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
with:
|
||
submodules: recursive
|
||
|
||
- name: Install cargo-audit
|
||
uses: taiki-e/install-action@v2
|
||
with:
|
||
tool: cargo-audit
|
||
|
||
- name: Run cargo audit
|
||
# Configuration (including the justified ignore list) lives in
|
||
# .cargo/audit.toml at the workspace root.
|
||
run: cargo audit
|