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
use std::collections::HashSet;

use super::*;

#[test]
fn both_gte_new_entries_hold_the_published_shape() {
  let gte_new: Vec<_> = all()
    .into_iter()
    .filter(|d| d.family == Family::GteNew)
    .collect();
  assert_eq!(
    gte_new.len(),
    2,
    "gte-multilingual-base and gte-base-en-v1.5, the family's only two catalog entries"
  );
  for d in &gte_new {
    assert_eq!(d.dim, 768, "{}", d.id);
    assert_eq!(d.default_max_length, 8192, "{}", d.id);
    assert_eq!(d.pooling, Pooling::Cls, "{}", d.id);
    assert!(
      d.query_template.is_none() && d.passage_template.is_none(),
      "{}",
      d.id
    );
    assert!(d.default_instruction.is_none(), "{}", d.id);
    assert!(d.dense_dirs.is_empty(), "{}", d.id);
    assert!(!d.layer_norm_after_pooling, "{}", d.id);
    assert_eq!(d.default_dtype, DType::F32, "{}", d.id);
    assert_eq!(d.license, "Apache-2.0", "{}", d.id);
    assert_eq!(d.phase, 2, "{}", d.id);
    assert!(!d.gated, "{}", d.id);
    assert_eq!(
      weights_format(&d.id),
      WeightsFormat::Safetensors,
      "{}",
      d.id
    );
    for dtype in [DType::F32, DType::F16] {
      assert!(!dtype_needs_accelerator(&d.id, dtype), "{} {dtype:?}", d.id);
    }
    assert!(dtype_needs_accelerator(&d.id, DType::BF16), "{}", d.id);
  }
}

/// 610 753 338 and 547 119 128 bytes on disk; only the multilingual card names an elastic dimension.
#[test]
fn the_two_entries_differ_only_in_mrl_and_size() {
  let m = lookup("Alibaba-NLP/gte-multilingual-base").expect("registered");
  assert!(m.mrl, "{}", m.id);
  assert_eq!(m.size_gb, 0.61, "{}", m.id);
  let e = lookup("Alibaba-NLP/gte-base-en-v1.5").expect("registered");
  assert!(!e.mrl, "{}", e.id);
  assert_eq!(e.size_gb, 0.55, "{}", e.id);
}

#[test]
fn mrl_is_the_previous_five_plus_the_multilingual_checkpoint() {
  let expected: HashSet<String> = [
    "Qwen/Qwen3-Embedding-0.6B",
    "Qwen/Qwen3-Embedding-4B",
    "Qwen/Qwen3-Embedding-8B",
    "google/embeddinggemma-300m",
    "nomic-ai/nomic-embed-text-v1.5",
    "Alibaba-NLP/gte-multilingual-base",
  ]
  .into_iter()
  .map(str::to_string)
  .collect();
  let actual: HashSet<String> = all().into_iter().filter(|d| d.mrl).map(|d| d.id).collect();
  assert_eq!(actual, expected);
}