module Data.Clustering.Hierarchical
(
Dendrogram(..)
,Distance
,elements
,cutAt
,Linkage(..)
,dendrogram
) where
import Data.Clustering.Hierarchical.Internal.Types (Dendrogram(..), Linkage(..), Distance)
import qualified Data.Clustering.Hierarchical.Internal.DistanceMatrix as DM
import qualified Data.Clustering.Hierarchical.Internal.Optimal as O
elements :: Dendrogram a -> [a]
elements :: forall a. Dendrogram a -> [a]
elements = [a] -> Dendrogram a -> [a]
forall {a}. [a] -> Dendrogram a -> [a]
go []
where
go :: [a] -> Dendrogram a -> [a]
go [a]
acc (Leaf a
x) = a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
acc
go [a]
acc (Branch Distance
_ Dendrogram a
l Dendrogram a
r) = [a] -> Dendrogram a -> [a]
go ([a] -> Dendrogram a -> [a]
go [a]
acc Dendrogram a
r) Dendrogram a
l
cutAt :: Dendrogram a -> Distance -> [Dendrogram a]
cutAt :: forall a. Dendrogram a -> Distance -> [Dendrogram a]
cutAt Dendrogram a
dendro Distance
threshold = [Dendrogram a] -> Dendrogram a -> [Dendrogram a]
forall {a}. [Dendrogram a] -> Dendrogram a -> [Dendrogram a]
go [] Dendrogram a
dendro
where
go :: [Dendrogram a] -> Dendrogram a -> [Dendrogram a]
go [Dendrogram a]
acc x :: Dendrogram a
x@(Leaf a
_) = Dendrogram a
x Dendrogram a -> [Dendrogram a] -> [Dendrogram a]
forall a. a -> [a] -> [a]
: [Dendrogram a]
acc
go [Dendrogram a]
acc x :: Dendrogram a
x@(Branch Distance
d Dendrogram a
l Dendrogram a
r) | Distance
d Distance -> Distance -> Bool
forall a. Ord a => a -> a -> Bool
<= Distance
threshold = Dendrogram a
x Dendrogram a -> [Dendrogram a] -> [Dendrogram a]
forall a. a -> [a] -> [a]
: [Dendrogram a]
acc
| Bool
otherwise = [Dendrogram a] -> Dendrogram a -> [Dendrogram a]
go ([Dendrogram a] -> Dendrogram a -> [Dendrogram a]
go [Dendrogram a]
acc Dendrogram a
r) Dendrogram a
l
dendrogram :: Linkage
-> [a]
-> (a -> a -> Distance)
-> Dendrogram a
dendrogram :: forall a. Linkage -> [a] -> (a -> a -> Distance) -> Dendrogram a
dendrogram Linkage
SingleLinkage = [a] -> (a -> a -> Distance) -> Dendrogram a
forall a. [a] -> (a -> a -> Distance) -> Dendrogram a
O.singleLinkage
dendrogram Linkage
CompleteLinkage = [a] -> (a -> a -> Distance) -> Dendrogram a
forall a. [a] -> (a -> a -> Distance) -> Dendrogram a
DM.completeLinkage
dendrogram Linkage
CLINK = [a] -> (a -> a -> Distance) -> Dendrogram a
forall a. [a] -> (a -> a -> Distance) -> Dendrogram a
O.completeLinkage
dendrogram Linkage
UPGMA = [a] -> (a -> a -> Distance) -> Dendrogram a
forall a. [a] -> (a -> a -> Distance) -> Dendrogram a
DM.upgma
dendrogram Linkage
FakeAverageLinkage = [a] -> (a -> a -> Distance) -> Dendrogram a
forall a. [a] -> (a -> a -> Distance) -> Dendrogram a
DM.fakeAverageLinkage