from __future__ import annotations
from os import PathLike
from typing import ClassVar, final
import numpy as np
from numpy.typing import NDArray
__all__ = [
"MISSING_DISTANCE",
"MISSING_LABEL",
"DistanceMetric",
"HNSWIndex",
"IVFPQFileSearcher",
"IVFPQIndex",
"__version__",
]
__version__: str
MISSING_LABEL: int
MISSING_DISTANCE: float
@final
class DistanceMetric:
L2: ClassVar[DistanceMetric]
Cosine: ClassVar[DistanceMetric]
Angular: ClassVar[DistanceMetric]
InnerProduct: ClassVar[DistanceMetric]
__hash__: None def __eq__(self, value: object, /) -> bool: ...
def __ne__(self, value: object, /) -> bool: ...
def __int__(self) -> int: ...
@final
class HNSWIndex:
def __new__(
cls,
dim: int,
m: int = 16,
ef_construction: int = 200,
ef_search: int = 50,
metric: DistanceMetric = ...,
auto_normalize: bool = False,
seed: int | None = None,
) -> HNSWIndex: ...
def add_items(
self,
vectors: NDArray[np.float32],
ids: NDArray[np.int64] | None = None,
) -> None:
def build(self) -> None:
def set_ef_search(self, ef: int) -> None:
def save(self, path: str | PathLike[str]) -> None:
@staticmethod
def load(path: str | PathLike[str]) -> HNSWIndex:
def search(
self,
query: NDArray[np.float32],
k: int,
ef: int | None = None,
) -> tuple[NDArray[np.int64], NDArray[np.float32]]:
def batch_search(
self,
queries: NDArray[np.float32],
k: int,
ef: int | None = None,
) -> tuple[NDArray[np.int64], NDArray[np.float32]]:
@property
def num_vectors(self) -> int:
@property
def dimension(self) -> int:
@property
def metric(self) -> DistanceMetric:
@property
def auto_normalize(self) -> bool:
@property
def m(self) -> int:
@property
def ef_construction(self) -> int:
@property
def ef_search(self) -> int:
@property
def memory_usage_bytes(self) -> int:
def __len__(self) -> int: ...
def __repr__(self) -> str: ...
@final
class IVFPQIndex:
def __new__(
cls,
dim: int,
num_clusters: int = 256,
num_codebooks: int | None = None,
codebook_size: int = 256,
nprobe: int = 1,
use_opq: bool = False,
seed: int = 42,
) -> IVFPQIndex: ...
def add_items(
self,
vectors: NDArray[np.float32],
ids: NDArray[np.int64] | None = None,
) -> None:
def build(
self,
training_sample_size: int | None = None,
kmeans_max_iter: int = 100,
) -> None:
def set_nprobe(self, nprobe: int) -> None:
def compact(self) -> None:
def save(self, path: str | PathLike[str]) -> None:
@staticmethod
def load(path: str | PathLike[str]) -> IVFPQIndex:
def search(
self,
query: NDArray[np.float32],
k: int,
nprobe: int | None = None,
rerank_pool: int | None = None,
) -> tuple[NDArray[np.int64], NDArray[np.float32]]:
def batch_search(
self,
queries: NDArray[np.float32],
k: int,
nprobe: int | None = None,
rerank_pool: int | None = None,
) -> tuple[NDArray[np.int64], NDArray[np.float32]]:
@property
def num_vectors(self) -> int:
@property
def dimension(self) -> int:
@property
def num_clusters(self) -> int:
@property
def num_codebooks(self) -> int:
@property
def codebook_size(self) -> int:
@property
def nprobe(self) -> int:
@property
def use_opq(self) -> bool:
def __len__(self) -> int: ...
def __repr__(self) -> str: ...
@final
class IVFPQFileSearcher:
@staticmethod
def load(path: str | PathLike[str], mmap: bool = False) -> IVFPQFileSearcher:
def set_nprobe(self, nprobe: int) -> None:
def search(
self,
query: NDArray[np.float32],
k: int,
nprobe: int | None = None,
rerank_pool: int | None = None,
) -> tuple[NDArray[np.int64], NDArray[np.float32]]:
def batch_search(
self,
queries: NDArray[np.float32],
k: int,
nprobe: int | None = None,
rerank_pool: int | None = None,
) -> tuple[NDArray[np.int64], NDArray[np.float32]]:
@property
def num_vectors(self) -> int:
@property
def dimension(self) -> int:
@property
def num_clusters(self) -> int:
@property
def num_codebooks(self) -> int:
@property
def codebook_size(self) -> int:
@property
def nprobe(self) -> int:
def __len__(self) -> int: ...
def __repr__(self) -> str: ...