import os
import numpy as np
from cffi import FFI
from common . ffi_wrapper import suffix
cluster_dir = os . path . join ( os . path . dirname ( os . path . abspath ( __file__ ) ) )
cluster_fn = os . path . join ( cluster_dir , " libfastcluster " + suffix ( ) )
ffi = FFI ( )
ffi . cdef ( """
int hclust_fast ( int n , double * distmat , int method , int * merge , double * height ) ;
void cutree_cdist ( int n , const int * merge , double * height , double cdist , int * labels ) ;
void hclust_pdist ( int n , int m , double * pts , double * out ) ;
void cluster_points_centroid ( int n , int m , double * pts , double dist , int * idx ) ;
""" )
hclust = ffi . dlopen ( cluster_fn )
def cluster_points_centroid ( pts , dist ) :
pts = np . ascontiguousarray ( pts , dtype = np . float64 )
pts_ptr = ffi . cast ( " double * " , pts . ctypes . data )
n , m = pts . shape
labels_ptr = ffi . new ( " int[] " , n )
hclust . cluster_points_centroid ( n , m , pts_ptr , dist * * 2 , labels_ptr )
return list ( labels_ptr )