use crate::foreign::vlfeat::generic::*;
use crate::foreign::vlfeat::hikmeans::*;
use nalgebra::DMatrix;
pub struct HIKM {
tree : *mut VlHIKMTree,
k : usize, dim : usize, depth : usize }
impl HIKM {
pub fn new(k : usize, dim : usize, depth : usize, n_iter : usize) -> Self {
unsafe {
let tree : *mut VlHIKMTree = vl_hikm_new(VlIKMAlgorithms_VL_IKM_ELKAN as i32);
vl_hikm_set_verbosity(tree, 0); vl_hikm_set_max_niters(tree, n_iter as i32);
vl_hikm_init(tree, dim as u64, k as u64, depth as u64);
Self{ tree, k, dim, depth }
}
}
pub fn train(&mut self, data : &[u8]) {
assert!(data.len() % self.dim == 0);
let n_obs = data.len() / self.dim;
unsafe {
vl_hikm_train (self.tree, data.as_ptr(), n_obs as u64);
}
}
pub fn predict(&mut self, data : &[u8]) -> DMatrix<u32> {
assert!(data.len() % self.dim == 0);
let n_obs = data.len() / self.dim;
let mut asgn = DMatrix::<u32>::zeros(self.depth, n_obs);
unsafe {
vl_hikm_push (self.tree, asgn.as_mut_slice().as_mut_ptr(), data.as_ptr(), n_obs as u64);
}
asgn
}
}
impl Drop for HIKM {
fn drop(&mut self) {
unsafe{ vl_hikm_delete(self.tree); }
}
}