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 candle_core::DType;

use crate::registry;
use crate::registry::multi_vector;
use crate::registry::rerank;
use crate::registry::sparse;

const DTYPES: [DType; 3] = [DType::F32, DType::F16, DType::BF16];

#[test]
fn every_catalogs_answer_is_the_row_its_builder_refuses_from() {
  for d in registry::dense::all() {
    for dtype in DTYPES {
      let row = d.dtype_backends.row(dtype);
      assert_eq!(
        registry::dense::dtype_needs_accelerator(&d.id, dtype),
        row.needs_accelerator(),
        "dense {} {dtype:?}: {row:?}",
        d.id
      );
    }
  }
  for d in sparse::all() {
    for dtype in DTYPES {
      let row = d.dtype_backends.row(dtype);
      assert_eq!(
        sparse::dtype_needs_accelerator(&d.id, dtype),
        row.needs_accelerator(),
        "sparse {} {dtype:?}: {row:?}",
        d.id
      );
    }
  }
  for d in multi_vector::all() {
    for dtype in DTYPES {
      let row = d.dtype_backends.row(dtype);
      assert_eq!(
        multi_vector::dtype_needs_accelerator(&d.id, dtype),
        row.needs_accelerator(),
        "multi-vector {} {dtype:?}: {row:?}",
        d.id
      );
    }
  }
  for d in rerank::all() {
    for dtype in DTYPES {
      let row = d.dtype_backends.row(dtype);
      assert_eq!(
        rerank::dtype_needs_accelerator(&d.id, dtype),
        row.needs_accelerator(),
        "rerank {} {dtype:?}: {row:?}",
        d.id
      );
    }
  }
}

#[test]
fn needs_accelerator_is_a_processor_refusal_that_metal_serves() {
  use crate::registry::BackendSupport;
  use crate::registry::Support::*;
  let row = |cpu, metal| BackendSupport {
    cpu,
    metal,
    cuda: Untested,
  };
  assert!(row(Unsupported, Verified).needs_accelerator());
  assert!(row(Unsupported, Untested).needs_accelerator());
  assert!(!row(Unsupported, Unsupported).needs_accelerator());
  assert!(!row(Verified, Verified).needs_accelerator());
  assert!(!row(Pending, Verified).needs_accelerator());
  assert!(!BackendSupport::not_applicable().needs_accelerator());
}