use std::iter::Sum;
use ndarray::{Array1, Array2, ArrayBase, ArrayViewMut1, ArrayViewMut2, Data, Ix1, Ix2, NdFloat};
use num_traits::{AsPrimitive, Bounded, Zero};
use rand::{CryptoRng, RngCore, SeedableRng};
use rand_chacha::ChaCha8Rng;
use crate::error::ReductiveError;
use crate::pq::Pq;
pub trait TrainPq<A> {
fn train_pq<S>(
n_subquantizers: usize,
n_subquantizer_bits: u32,
n_iterations: usize,
n_attempts: usize,
instances: ArrayBase<S, Ix2>,
) -> Result<Pq<A>, ReductiveError>
where
S: Sync + Data<Elem = A>,
{
Self::train_pq_using(
n_subquantizers,
n_subquantizer_bits,
n_iterations,
n_attempts,
instances,
&mut ChaCha8Rng::from_entropy(),
)
}
fn train_pq_using<S, R>(
n_subquantizers: usize,
n_subquantizer_bits: u32,
n_iterations: usize,
n_attempts: usize,
instances: ArrayBase<S, Ix2>,
rng: &mut R,
) -> Result<Pq<A>, ReductiveError>
where
S: Sync + Data<Elem = A>,
R: CryptoRng + RngCore + SeedableRng + Send;
}
pub trait QuantizeVector<A> {
fn quantize_batch<I, S>(&self, x: ArrayBase<S, Ix2>) -> Array2<I>
where
I: AsPrimitive<usize> + Bounded + Zero,
S: Data<Elem = A>,
usize: AsPrimitive<I>;
fn quantize_batch_into<I, S>(&self, x: ArrayBase<S, Ix2>, quantized: ArrayViewMut2<I>)
where
I: AsPrimitive<usize> + Bounded + Zero,
S: Data<Elem = A>,
usize: AsPrimitive<I>;
fn quantize_vector<I, S>(&self, x: ArrayBase<S, Ix1>) -> Array1<I>
where
I: AsPrimitive<usize> + Bounded + Zero,
S: Data<Elem = A>,
usize: AsPrimitive<I>;
fn quantized_len(&self) -> usize;
}
pub trait Reconstruct<A>
where
A: NdFloat + Sum,
{
fn reconstruct_batch<I, S>(&self, quantized: ArrayBase<S, Ix2>) -> Array2<A>
where
I: AsPrimitive<usize>,
S: Data<Elem = I>,
{
let mut reconstructions = Array2::zeros((quantized.nrows(), self.reconstructed_len()));
self.reconstruct_batch_into(quantized, reconstructions.view_mut());
reconstructions
}
fn reconstruct_batch_into<I, S>(
&self,
quantized: ArrayBase<S, Ix2>,
reconstructions: ArrayViewMut2<A>,
) where
I: AsPrimitive<usize>,
S: Data<Elem = I>;
fn reconstruct<I, S>(&self, quantized: ArrayBase<S, Ix1>) -> Array1<A>
where
I: AsPrimitive<usize>,
S: Data<Elem = I>,
{
let mut reconstruction = Array1::zeros((self.reconstructed_len(),));
self.reconstruct_into(quantized, reconstruction.view_mut());
reconstruction
}
fn reconstruct_into<I, S>(
&self,
quantized: ArrayBase<S, Ix1>,
reconstruction: ArrayViewMut1<A>,
) where
I: AsPrimitive<usize>,
S: Data<Elem = I>;
fn reconstructed_len(&self) -> usize;
}