[package]
name = "wifi-densepose-train"
version = "0.3.2"
edition = "2021"
authors = ["rUv <ruv@ruv.net>", "WiFi-DensePose Contributors"]
license = "MIT OR Apache-2.0"
description = "Training pipeline for WiFi-DensePose pose estimation"
repository = "https://github.com/ruvnet/wifi-densepose"
documentation = "https://docs.rs/wifi-densepose-train"
keywords = ["wifi", "training", "pose-estimation", "deep-learning"]
categories = ["science", "computer-vision"]
readme = "README.md"

[[bin]]
name = "train"
path = "src/bin/train.rs"

[[bin]]
name = "verify-training"
path = "src/bin/verify_training.rs"
required-features = ["tch-backend"]

# AetherArena (ADR-149) deterministic score runner — the CI harness-gate entry
# point. Pure ruview_metrics (ndarray + sha2), no torch, so it builds and runs
# under --no-default-features for a fast, GPU-free PR gate.
[[bin]]
name = "aa_score_runner"
path = "src/bin/aa_score_runner.rs"

[features]
default = []
tch-backend = ["tch"]
cuda = ["tch-backend"]

[dependencies]
# Internal crates
wifi-densepose-signal = { version = "0.3.0", path = "../wifi-densepose-signal", default-features = false }
wifi-densepose-nn = { version = "0.3.0", path = "../wifi-densepose-nn" }

# Core
thiserror.workspace = true
anyhow.workspace = true
serde = { workspace = true, features = ["derive"] }
serde_json.workspace = true

# Tensor / math
ndarray.workspace = true
num-complex.workspace = true
num-traits.workspace = true

# PyTorch bindings (optional — only enabled by `tch-backend` feature)
tch = { workspace = true, optional = true }

# Graph algorithms (min-cut for optimal keypoint assignment)
petgraph.workspace = true

# ruvector integration (subpolynomial min-cut, sparse solvers, temporal compression, attention)
ruvector-mincut = { workspace = true }
ruvector-attn-mincut = { workspace = true }
ruvector-temporal-tensor = { workspace = true }
ruvector-solver = { workspace = true }
ruvector-attention = { workspace = true }

# Data loading
ndarray-npy.workspace = true
memmap2 = "0.9"
walkdir.workspace = true

# Serialization
csv.workspace = true
toml = "0.8"

# Logging / progress
tracing.workspace = true
tracing-subscriber.workspace = true
indicatif.workspace = true

# Async (subset of features needed by training pipeline)
tokio = { workspace = true, features = ["rt", "rt-multi-thread", "macros", "fs"] }

# Crypto (for proof hash)
sha2.workspace = true

# CLI
clap.workspace = true

# Time
chrono = { version = "0.4", features = ["serde"] }

[dev-dependencies]
criterion.workspace = true
proptest.workspace = true
tempfile = "3.10"
approx = "0.5"
# Used by tests/test_real_loader.rs to write .npy fixtures that exercise the
# real MmFiDataset disk-loading path (the deterministic proof uses the
# in-memory SyntheticCsiDataset, which bypasses .npy parsing).
ndarray.workspace = true
ndarray-npy.workspace = true

[[bench]]
name = "training_bench"
harness = false
