-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | High performance clustering algorithms
--   
--   Following clutering methods are included in this library:
--   
--   1 Agglomerative hierarchical clustering. Complete linkage O(n^2),
--   Single linkage O(n^2), Average linkage O(n^2), Weighted linkage
--   O(n^2), Ward's linkage O(n^2).
--   
--   2 KMeans clustering.
@package clustering
@version 0.4.0

module AI.Clustering.Hierarchical.Types
type Distance = Double
type DistFn a = a -> a -> Distance
type Size = Int
data Dendrogram a
Leaf :: !a -> Dendrogram a
Branch :: !Size -> !Distance -> !(Dendrogram a) -> !(Dendrogram a) -> Dendrogram a

-- | O(1) Return the size of a dendrogram
size :: Dendrogram a -> Int
data DistanceMat
DistanceMat :: !Int -> !(Vector Double) -> DistanceMat
(!) :: DistanceMat -> (Int, Int) -> Double
idx :: Int -> Int -> Int -> Int

-- | compute distance matrix
computeDists :: Vector v a => DistFn a -> v a -> DistanceMat

-- | compute distance matrix in parallel
computeDists' :: Vector v a => DistFn a -> v a -> DistanceMat
instance GHC.Show.Show AI.Clustering.Hierarchical.Types.DistanceMat
instance GHC.Classes.Eq a => GHC.Classes.Eq (AI.Clustering.Hierarchical.Types.Dendrogram a)
instance GHC.Show.Show a => GHC.Show.Show (AI.Clustering.Hierarchical.Types.Dendrogram a)
instance Data.Binary.Class.Binary a => Data.Binary.Class.Binary (AI.Clustering.Hierarchical.Types.Dendrogram a)
instance GHC.Base.Functor AI.Clustering.Hierarchical.Types.Dendrogram



-- | <i>Warning: To be used by developer only</i>
module AI.Clustering.Hierarchical.Internal

-- | nearest neighbor chain algorithm
nnChain :: DistanceMat -> DistUpdateFn -> Dendrogram Int

-- | all update functions perform destructive updates, and hence should not
--   be called by end users
--   
--   single linkage update formula
single :: DistUpdateFn

-- | complete linkage update formula
complete :: DistUpdateFn

-- | average linkage update formula
average :: DistUpdateFn

-- | weighted linkage update formula
weighted :: DistUpdateFn

-- | ward linkage update formula
ward :: DistUpdateFn


-- | High performance agglomerative hierarchical clustering library.
--   Example:
--   
--   <pre>
--   &gt;&gt;&gt; :set -XOverloadedLists
--   
--   &gt;&gt;&gt; import qualified Data.Vector as V
--   
--   &gt;&gt;&gt; let points = [[2, 3, 4], [2, 1, 2], [2, 1, 6], [2, 4, 6], [5, 1, 2]] :: V.Vector (V.Vector Double)
--   
--   &gt;&gt;&gt; let dendro = hclust Average points euclidean
--   
--   &gt;&gt;&gt; print dendro
--   Branch 5 4.463747440868191 (Branch 3 2.914213562373095 (Leaf (fromList [2.0,1.0,6.0]))
--   (Branch 2 2.23606797749979 (Leaf (fromList [2.0,3.0,4.0])) (Leaf (fromList [2.0,4.0,6.0]))))
--   (Branch 2 3.0 (Leaf (fromList [2.0,1.0,2.0])) (Leaf (fromList [5.0,1.0,2.0])))
--   
--   &gt;&gt;&gt; putStr $ drawDendrogram $ fmap show dendro
--   h: 4.4637
--   |
--   +- h: 2.9142
--   |  |
--   |  +- fromList [2.0,1.0,6.0]
--   |  |
--   |  `- h: 2.2361
--   |     |
--   |     +- fromList [2.0,3.0,4.0]
--   |     |
--   |     `- fromList [2.0,4.0,6.0]
--   |
--   `- h: 3.0000
--      |
--      +- fromList [2.0,1.0,2.0]
--      |
--      `- fromList [5.0,1.0,2.0]
--   </pre>
module AI.Clustering.Hierarchical
data Dendrogram a
Leaf :: !a -> Dendrogram a
Branch :: !Size -> !Distance -> !(Dendrogram a) -> !(Dendrogram a) -> Dendrogram a

-- | O(1) Return the size of a dendrogram
size :: Dendrogram a -> Int

-- | Different hierarchical clustering schemes.
data Linkage

-- | O(n^2) Single linkage, $d(A,B) = min_{a in A, b in B} d(a,b)$.
Single :: Linkage

-- | O(n^2) Complete linkage, $d(A,B) = max_{a in A, b in B} d(a,b)$.
Complete :: Linkage

-- | O(n^2) Average linkage or UPGMA, $d(A,B) = frac{sum_{a in A}sum_{b in
--   B}d(a,b)}{|A||B|}$.
Average :: Linkage

-- | O(n^2) Weighted linkage.
Weighted :: Linkage

-- | O(n^2) Ward's method.
Ward :: Linkage

-- | O(n^3) Centroid linkage, not implemented.
Centroid :: Linkage

-- | O(n^3) Median linkage, not implemented.
Median :: Linkage

-- | Perform hierarchical clustering.
hclust :: Vector v a => Linkage -> v a -> DistFn a -> Dendrogram a

-- | Normalize the tree heights so that the highest is 1.
normalize :: Dendrogram a -> Dendrogram a

-- | Cut a dendrogram at given height.
cutAt :: Dendrogram a -> Distance -> [Dendrogram a]

-- | Return the elements of a dendrogram in pre-order.
flatten :: Dendrogram a -> [a]

-- | 2-dimensional drawing of a dendrogram
drawDendrogram :: Dendrogram String -> String

-- | Compute euclidean distance between two points.
euclidean :: Vector v Double => DistFn (v Double)

-- | Hamming distance.
hamming :: (Vector v a, Vector v Bool, Eq a) => DistFn (v a)


-- | <i>Warning: To be used by developer only</i>
module AI.Clustering.KMeans.Internal
forgy :: (PrimMonad m, Vector v a) => Gen (PrimState m) -> Int -> v a -> (a -> Vector Double) -> m (Matrix Double)
kmeansPP :: (PrimMonad m, Vector v a) => Gen (PrimState m) -> Int -> v a -> (a -> Vector Double) -> m (Matrix Double)
sumSquares :: Vector Double -> Vector Double -> Double


-- | <a>description starting at first column</a>
module AI.Clustering.KMeans.Types
data KMeansOpts
KMeansOpts :: Method -> (Vector Word32) -> Bool -> Int -> KMeansOpts
[kmeansMethod] :: KMeansOpts -> Method

-- | Seed for random number generation
[kmeansSeed] :: KMeansOpts -> (Vector Word32)

-- | Wether to return clusters, may use a lot memory
[kmeansClusters] :: KMeansOpts -> Bool

-- | Maximum iteration
[kmeansMaxIter] :: KMeansOpts -> Int

-- | Default options. &gt; defaultKMeansOpts = KMeansOpts &gt; {
--   kmeansMethod = KMeansPP &gt; , kmeansSeed = U.fromList [1,2,3,4,5,6,7]
--   &gt; , kmeansClusters = True &gt; , kmeansMaxIter = 10 &gt; }
defaultKMeansOpts :: KMeansOpts

-- | Results from running kmeans
data KMeans a
KMeans :: Vector Int -> Matrix Double -> Maybe [[a]] -> Double -> KMeans a

-- | A vector of integers (0 ~ k-1) indicating the cluster to which each
--   point is allocated.
[membership] :: KMeans a -> Vector Int

-- | A matrix of cluster centers.
[centers] :: KMeans a -> Matrix Double
[clusters] :: KMeans a -> Maybe [[a]]

-- | the sum of squared error (SSE)
[sse] :: KMeans a -> Double

-- | Different initialization methods
data Method

-- | The Forgy method randomly chooses k unique observations from the data
--   set and uses these as the initial means.
Forgy :: Method

-- | K-means++ algorithm.
KMeansPP :: Method

-- | Provide a set of k centroids
Centers :: (Matrix Double) -> Method
instance GHC.Show.Show a => GHC.Show.Show (AI.Clustering.KMeans.Types.KMeans a)

module AI.Clustering.KMeans

-- | Results from running kmeans
data KMeans a
KMeans :: Vector Int -> Matrix Double -> Maybe [[a]] -> Double -> KMeans a

-- | A vector of integers (0 ~ k-1) indicating the cluster to which each
--   point is allocated.
[membership] :: KMeans a -> Vector Int

-- | A matrix of cluster centers.
[centers] :: KMeans a -> Matrix Double
[clusters] :: KMeans a -> Maybe [[a]]

-- | the sum of squared error (SSE)
[sse] :: KMeans a -> Double
data KMeansOpts
KMeansOpts :: Method -> (Vector Word32) -> Bool -> Int -> KMeansOpts
[kmeansMethod] :: KMeansOpts -> Method

-- | Seed for random number generation
[kmeansSeed] :: KMeansOpts -> (Vector Word32)

-- | Wether to return clusters, may use a lot memory
[kmeansClusters] :: KMeansOpts -> Bool

-- | Maximum iteration
[kmeansMaxIter] :: KMeansOpts -> Int

-- | Default options. &gt; defaultKMeansOpts = KMeansOpts &gt; {
--   kmeansMethod = KMeansPP &gt; , kmeansSeed = U.fromList [1,2,3,4,5,6,7]
--   &gt; , kmeansClusters = True &gt; , kmeansMaxIter = 10 &gt; }
defaultKMeansOpts :: KMeansOpts

-- | Perform K-means clustering
kmeans :: Int -> Matrix Double -> KMeansOpts -> KMeans (Vector Double)

-- | Perform K-means clustering, using a feature extraction function
kmeansBy :: Vector v a => Int -> v a -> (a -> Vector Double) -> KMeansOpts -> KMeans a

-- | Different initialization methods
data Method

-- | The Forgy method randomly chooses k unique observations from the data
--   set and uses these as the initial means.
Forgy :: Method

-- | K-means++ algorithm.
KMeansPP :: Method

-- | Provide a set of k centroids
Centers :: (Matrix Double) -> Method

-- | Assign data to clusters based on KMeans result
decode :: Vector Int -> [a] -> [[a]]

module AI.Clustering.Utils

-- | rearrange the rows of a matrix
orderBy :: (Vector v1 Int, Matrix m v2 a) => v1 Int -> m v2 a -> m v2 a
