]> git.donarmstrong.com Git - mothur.git/blobdiff - averagelinkage.cpp
changes while testing
[mothur.git] / averagelinkage.cpp
index 1ab5160f07720f2330c7a627654e8ed264098e54..8627253777c1b09a1b4b16d1ff2ad4f90468248c 100644 (file)
@@ -1,78 +1,56 @@
+#ifndef AVERAGE_H
+#define AVERAGE_H
 
+//test
+#include "mothur.h"
 #include "cluster.hpp"
 #include "rabundvector.hpp"
-#include "sparsematrix.hpp"
-#include <exception>
+#include "sparsedistancematrix.h"
 
 /* This class implements the average UPGMA, average neighbor clustering algorithm */
 
 /***********************************************************************/
 
-AverageLinkage::AverageLinkage(RAbundVector* rav, ListVector* lv, SparseMatrix* dm) :
-Cluster(rav, lv, dm)
-{}
+AverageLinkage::AverageLinkage(RAbundVector* rav, ListVector* lv, SparseDistanceMatrix* dm, float c, string s, float a) :
+Cluster(rav, lv, dm, c, s, a)
+{
+       saveRow = -1;
+       saveCol = -1;
+}
+
 
 /***********************************************************************/
-//THis function clusters based on the average method
-void AverageLinkage::update(){
-       try{
-               getRowColCells();               
-       
-               vector<int> found(nColCells, 0);
-       
-               int rowBin = rabund->get(smallRow);
-               int colBin = rabund->get(smallCol);
-               int totalBin = rowBin + colBin;
-       
-               for(int i=1;i<nRowCells;i++){
-               
-                       int search;
-               
-                       if(rowCells[i]->row == smallRow){
-                               search = rowCells[i]->column;
-                       }
-                       else{
-                               search = rowCells[i]->row;
-                       }
-               
-                       for(int j=1;j<nColCells;j++){
-                       
-                               if(colCells[j]->row == search || colCells[j]->column == search){
-                                       colCells[j]->dist = (colBin * colCells[j]->dist + rowBin * rowCells[i]->dist) / totalBin;               
-                               
-                                       found[j] = 1;
-                               
-                                       if(colCells[j]->vectorMap != NULL){
-                                               *(colCells[j]->vectorMap) = NULL;
-                                               colCells[j]->vectorMap = NULL;
-                                       }
-                               
-                                       break;
-                               }
-                       
-                       }                       
-                       dMatrix->rmCell(rowCells[i]);
-               }       
-       
-               clusterBins();
-               clusterNames();
-       
-               for(int i=0;i<nColCells;i++){
-                       if(found[i] == 0){
-                               dMatrix->rmCell(colCells[i]);
-                       }
+//This function returns the tag of the method.
+string AverageLinkage::getTag() {
+       return("an");
+}
+
+
+/***********************************************************************/
+//This function updates the distance based on the average linkage method.
+bool AverageLinkage::updateDistance(PDistCell& colCell, PDistCell& rowCell) {
+       try {
+               if ((saveRow != smallRow) || (saveCol != smallCol)) {
+                       rowBin = rabund->get(smallRow);
+                       colBin = rabund->get(smallCol);
+                       totalBin = rowBin + colBin;
+                       saveRow = smallRow;
+                       saveCol = smallCol;
                }
+               //cout << "colcell.dist = " << colCell.dist << '\t' << smallRow << '\t' << smallCol << '\t' << rowCell.dist << endl;
+               colCell.dist = (colBin * colCell.dist + rowBin * rowCell.dist) / totalBin;
+        
+               return(true);
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the AverageLinkage class Function update. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               m->errorOut(e, "AverageLinkage", "updateDistance");
                exit(1);
        }
-       catch(...) {
-               cout << "An unknown error has occurred in the AverageLinkage class function update. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }
-
-       
 }
 
 /***********************************************************************/
+
+
+/***********************************************************************/
+
+#endif