View Source Vettore.Distance (Vettore v0.3.1)

Independent distance, similarity, normalization, and reranking helpers.

Named distance functions return raw metric values:

  • distance metrics return a distance where lower is better
  • similarity metrics return a similarity where higher is better

Link to this section Summary

Functions

Chebyshev/L-infinity distance.

Compress a float vector into packed sign bits.

Cosine similarity. Defaults to L2-normalizing inputs and returns [-1.0, 1.0].

Compatibility alias for inner product.

Compatibility alias for L2 distance.

Hamming distance for equal-length bit/integer vectors.

Jaccard distance for truthy/non-truthy coordinates.

L2 distance.

Squared L2 distance.

Manhattan/L1 distance.

Negative inner product.

Normalizes a vector.

Hamming distance over packed bit vectors.

Jaccard distance over packed bit vectors.

Converts a raw metric value into the explicit result score and distance fields.

Link to this section Types

@type metric() ::
  :l2
  | :l2_squared
  | :cosine
  | :inner_product
  | :negative_inner_product
  | :manhattan
  | :chebyshev
  | :hamming
  | :jaccard
@type normalized_vector() :: [float()]
@type score_mode() :: :raw | :similarity
@type vector() :: [number()]

Link to this section Functions

@spec chebyshev(vector(), vector()) :: {:ok, float()} | {:error, term()}

Chebyshev/L-infinity distance.

examples

Examples

iex> Vettore.Distance.chebyshev([1.0, 2.0], [4.0, 6.0])
{:ok, 4.0}
Link to this function

compress_f32_vector(vector)

View Source
@spec compress_f32_vector(vector()) :: [non_neg_integer()]

Compress a float vector into packed sign bits.

examples

Examples

iex> Vettore.Distance.compress_f32_vector([1.0, -2.0, 0.0])
[5]
Link to this function

cosine(left, right, opts \\ [])

View Source
@spec cosine(vector(), vector(), keyword()) :: {:ok, float()} | {:error, term()}

Cosine similarity. Defaults to L2-normalizing inputs and returns [-1.0, 1.0].

examples

Examples

iex> Vettore.Distance.cosine([2.0, 0.0], [4.0, 0.0])
{:ok, 1.0}

iex> Vettore.Distance.cosine([2.0, 0.0], [4.0, 0.0], normalize: :none)
{:ok, 8.0}
Link to this function

dot_product(left, right)

View Source
@spec dot_product(vector(), vector()) :: {:ok, float()} | {:error, term()}

Compatibility alias for inner product.

examples

Examples

iex> Vettore.Distance.dot_product([1.0, 2.0], [3.0, 4.0])
{:ok, 11.0}
@spec euclidean(vector(), vector()) :: {:ok, float()} | {:error, term()}

Compatibility alias for L2 distance.

examples

Examples

iex> Vettore.Distance.euclidean([0.0, 0.0], [3.0, 4.0])
{:ok, 5.0}
@spec hamming(vector(), vector()) :: {:ok, float()} | {:error, term()}

Hamming distance for equal-length bit/integer vectors.

examples

Examples

iex> Vettore.Distance.hamming([1, 0, 1], [0, 0, 0])
{:ok, 2.0}
Link to this function

inner_product(left, right)

View Source
@spec inner_product(vector(), vector()) :: {:ok, float()} | {:error, term()}

Inner product.

examples

Examples

iex> Vettore.Distance.inner_product([1.0, 2.0, 3.0], [4.0, 5.0, 6.0])
{:ok, 32.0}

iex> Vettore.Distance.inner_product([1.0], [1.0, 2.0])
{:error, :dimension_mismatch}
@spec jaccard(vector(), vector()) :: {:ok, float()} | {:error, term()}

Jaccard distance for truthy/non-truthy coordinates.

examples

Examples

iex> {:ok, distance} = Vettore.Distance.jaccard([1, 0, 1], [0, 1, 1])
iex> Float.round(distance, 6)
0.666667
@spec l2(vector(), vector()) :: {:ok, float()} | {:error, term()}

L2 distance.

examples

Examples

iex> Vettore.Distance.l2([0.0, 0.0], [3.0, 4.0])
{:ok, 5.0}

iex> Vettore.Distance.l2([1.0], [1.0, 2.0])
{:error, :dimension_mismatch}
@spec l2_squared(vector(), vector()) :: {:ok, float()} | {:error, term()}

Squared L2 distance.

examples

Examples

iex> Vettore.Distance.l2_squared([0.0, 0.0], [3.0, 4.0])
{:ok, 25.0}

iex> Vettore.Distance.l2_squared([1.0, :bad], [1.0, 2.0])
{:error, :invalid_vector}
@spec manhattan(vector(), vector()) :: {:ok, float()} | {:error, term()}

Manhattan/L1 distance.

examples

Examples

iex> Vettore.Distance.manhattan([1.0, 2.0], [4.0, 6.0])
{:ok, 7.0}
Link to this function

mmr_rerank(initial, embeddings, metric, alpha, final_k)

View Source
@spec mmr_rerank(
  [{String.t(), number()}],
  [{String.t(), vector()}],
  metric() | atom() | String.t(),
  number(),
  pos_integer()
) ::
  {:ok, [{String.t(), number()}]}
  | {:error, :invalid_mmr_args | {:unknown_metric, term()}}

Collection-agnostic MMR reranker.

examples

Examples

iex> initial = [{"a", 0.9}, {"b", 0.8}, {"c", 0.1}]
iex> embeddings = [{"a", [1.0, 0.0]}, {"b", [1.0, 0.0]}, {"c", [0.0, 1.0]}]
iex> Vettore.Distance.mmr_rerank(initial, embeddings, :cosine, 0.5, 2)
{:ok, [{"a", 0.9}, {"c", 0.1}]}

iex> Vettore.Distance.mmr_rerank(initial, embeddings, :unknown, 0.5, 2)
{:error, {:unknown_metric, :unknown}}
Link to this function

negative_inner_product(left, right)

View Source
@spec negative_inner_product(vector(), vector()) :: {:ok, float()} | {:error, term()}

Negative inner product.

examples

Examples

iex> Vettore.Distance.negative_inner_product([1.0, 2.0, 3.0], [4.0, 5.0, 6.0])
{:ok, -32.0}
Link to this function

normalize(vector, method)

View Source
@spec normalize(vector(), :none | :l2 | :zscore | :minmax) ::
  {:ok, [float()]} | {:error, term()}

Normalizes a vector.

examples

Examples

iex> Vettore.Distance.normalize([3.0, 4.0], :l2)
{:ok, [0.6, 0.8]}

iex> Vettore.Distance.normalize([2.0, 4.0, 6.0], :minmax)
{:ok, [0.0, 0.5, 1.0]}

iex> Vettore.Distance.normalize([1.0], :unknown)
{:error, {:unknown_normalization, :unknown}}
Link to this function

packed_hamming(left, right, dimensions)

View Source
@spec packed_hamming([non_neg_integer()], [non_neg_integer()], pos_integer()) ::
  {:ok, float()} | {:error, term()}

Hamming distance over packed bit vectors.

examples

Examples

iex> left = Vettore.Distance.compress_f32_vector([1.0, -2.0, 0.0])
iex> right = Vettore.Distance.compress_f32_vector([-1.0, -2.0, 0.0])
iex> Vettore.Distance.packed_hamming(left, right, 3)
{:ok, 1.0}
Link to this function

packed_jaccard(left, right, dimensions)

View Source
@spec packed_jaccard([non_neg_integer()], [non_neg_integer()], pos_integer()) ::
  {:ok, float()} | {:error, term()}

Jaccard distance over packed bit vectors.

examples

Examples

iex> left = Vettore.Distance.compress_f32_vector([1.0, -2.0, 0.0])
iex> right = Vettore.Distance.compress_f32_vector([1.0, 2.0, -1.0])
iex> {:ok, distance} = Vettore.Distance.packed_jaccard(left, right, 3)
iex> Float.round(distance, 6)
0.666667
Link to this function

result_values(metric, raw, score_mode \\ :raw)

View Source
@spec result_values(metric() | atom(), number(), score_mode() | atom()) ::
  {float(), float() | nil}

Converts a raw metric value into the explicit result score and distance fields.

examples

Examples

iex> Vettore.Distance.result_values(:l2, 5.0, :raw)
{-5.0, 5.0}

iex> Vettore.Distance.result_values(:cosine, 0.25, :raw)
{0.25, 0.75}

iex> Vettore.Distance.result_values(:l2, 5.0, :similarity)
{0.16666666666666666, 5.0}