candding 0.1.0

Pure candle embeddings for Rust with no ONNX: dense, sparse, multi-vector and rerank models today, image models on the roadmap
Documentation
Embedding models implemented on `candle-core` and `candle-nn`, with no ONNX runtime: dense, sparse, multi-vector and rerank output, each catalog model tested against its reference implementation with a status per device and dtype. The [model catalog](https://candding.rust-dd.com/docs/models) lists every model and its statuses, and the [documentation site](https://candding.rust-dd.com) explains the concepts and holds the roadmap.

```toml
[dependencies]
candding = "0.1"
```

The first `build()` of a model downloads it into the Hugging Face cache through the default `download` feature, and `features = ["metal"]` adds the Apple GPU backend.

```rust,no_run
use candding::TextEmbedding;

fn main() -> candding::Result<()> {
  let model = TextEmbedding::builder("BAAI/bge-small-en-v1.5").build()?;
  let passages = model.passage_embed(&["Embeddings map text to vectors."], None)?;
  let queries = model.query_embed(&["what do embeddings do"], None)?;
  let score: f32 = queries[0].iter().zip(&passages[0]).map(|(q, p)| q * p).sum();
  println!("dim {} score {score:.4}", model.dim());
  Ok(())
}
```

| Output | Entry point |
|---|---|
| Dense vectors | [`TextEmbedding`] |
| Sparse `(index, weight)` rows | [`SparseTextEmbedding`], and [`Bm25TextEmbedding`] for `Qdrant/bm25` |
| Per-token matrices for late interaction | [`MultiVectorTextEmbedding`] |
| One score per query and document | [`TextCrossEncoder`] |

Anything `#[doc(hidden)]` is an implementation detail outside semver and can change in any release.