--- /dev/null
+#ifndef CLUSTER_H
+#define CLUSTER_H
+
+
+#include "mothur.h"
+#include "sparsematrix.hpp"
+#include "mothurout.h"
+
+class RAbundVector;
+class ListVector;
+
+typedef vector<MatData> MatVec;
+
+class Cluster {
+
+public:
+ Cluster(RAbundVector*, ListVector*, SparseMatrix*, float, string);
+ virtual void update(double&);
+ virtual string getTag() = 0;
+ virtual void setMapWanted(bool m);
+ virtual map<string, int> getSeqtoBin() { return seq2Bin; }
+
+protected:
+ void getRowColCells();
+ void removeCell(const MatData& cell, int vrow, int vcol, bool rmMatrix=true);
+
+ virtual bool updateDistance(MatData& colCell, MatData& rowCell) = 0;
+
+ virtual void clusterBins();
+ virtual void clusterNames();
+ virtual void updateMap();
+
+ RAbundVector* rabund;
+ ListVector* list;
+ SparseMatrix* dMatrix;
+
+ int smallRow;
+ int smallCol;
+ float smallDist;
+ bool mapWanted;
+ float cutoff;
+ map<string, int> seq2Bin;
+ string method;
+
+ vector<MatVec> seqVec; // contains vectors of cells related to a certain sequence
+ MatVec rowCells;
+ MatVec colCells;
+ ull nRowCells;
+ ull nColCells;
+ MothurOut* m;
+};
+
+/***********************************************************************/
+
+class CompleteLinkage : public Cluster {
+public:
+ CompleteLinkage(RAbundVector*, ListVector*, SparseMatrix*, float, string);
+ bool updateDistance(MatData& colCell, MatData& rowCell);
+ string getTag();
+
+private:
+
+};
+
+/***********************************************************************/
+
+class SingleLinkage : public Cluster {
+public:
+ SingleLinkage(RAbundVector*, ListVector*, SparseMatrix*, float, string);
+ void update(double&);
+ bool updateDistance(MatData& colCell, MatData& rowCell);
+ string getTag();
+
+private:
+
+};
+
+/***********************************************************************/
+
+class AverageLinkage : public Cluster {
+public:
+ AverageLinkage(RAbundVector*, ListVector*, SparseMatrix*, float, string);
+ bool updateDistance(MatData& colCell, MatData& rowCell);
+ string getTag();
+
+private:
+ int saveRow;
+ int saveCol;
+ int rowBin;
+ int colBin;
+ int totalBin;
+
+};
+
+/***********************************************************************/
+
+class WeightedLinkage : public Cluster {
+public:
+ WeightedLinkage(RAbundVector*, ListVector*, SparseMatrix*, float, string);
+ bool updateDistance(MatData& colCell, MatData& rowCell);
+ string getTag();
+
+private:
+ int saveRow;
+ int saveCol;
+};
+
+/***********************************************************************/
+
+#endif