+++ /dev/null
-
-#include "sparsematrix.hpp"
-#include "listvector.hpp"
-
-
-/***********************************************************************/
-
-SparseMatrix::SparseMatrix() : numNodes(0), minsIndex(0), smallDist(1e6){ m = MothurOut::getInstance(); }
-
-/***********************************************************************/
-
-int SparseMatrix::getNNodes(){
- return numNodes;
-}
-
-/***********************************************************************/
-
-float SparseMatrix::getSmallDist(){
- return smallDist;
-}
-
-/***********************************************************************/
-
-MatData SparseMatrix::rmCell(MatData data){
- try {
- if(data->vectorMap != NULL ){
- *(data->vectorMap) = NULL;
- data->vectorMap = NULL;
- }
- data = matrix.erase(data);
- numNodes--;
- return(data);
- // seems like i should be updating smallDist here, but the only time we remove cells is when
- // clustering and the clustering algorithm updates smallDist
- }
- catch(exception& e) {
- m->errorOut(e, "SparseMatrix", "rmCell");
- exit(1);
- }
-}
-
-/***********************************************************************/
-
-void SparseMatrix::addCell(PCell value){
- try {
- matrix.push_back(value);
- numNodes++;
- if(value.dist < smallDist){
- smallDist = value.dist;
- }
- }
- catch(exception& e) {
- m->errorOut(e, "SparseMatrix", "addCell");
- exit(1);
- }
-}
-
-/***********************************************************************/
-
-void SparseMatrix::clear(){
- try {
- matrix.clear();
- mins.clear();
- numNodes = 0;
- minsIndex = 0;
- smallDist = 1e6;
- }
- catch(exception& e) {
- m->errorOut(e, "SparseMatrix", "clear");
- exit(1);
- }
-}
-
-/***********************************************************************/
-
-MatData SparseMatrix::begin(){
- return matrix.begin();
-}
-
-/***********************************************************************/
-
-MatData SparseMatrix::end(){
- return matrix.end();
-}
-
-/***********************************************************************/
-
-void SparseMatrix::print(){
- try {
- int index = 0;
-
- cout << endl << "Index\tRow\tColumn\tDistance" << endl;
-
- for(MatData currentCell=matrix.begin();currentCell!=matrix.end();currentCell++){
- cout << index << '\t' << currentCell->row << '\t' << currentCell->column << '\t' << currentCell->dist << endl;
- index++;
- }
- }
- catch(exception& e) {
- m->errorOut(e, "SparseMatrix", "print");
- exit(1);
- }
-}
-
-/***********************************************************************/
-
-void SparseMatrix::print(ListVector* list){
- try {
- int index = 0;
-
- m->mothurOutEndLine(); m->mothurOut("Index\tRow\tColumn\tDistance"); m->mothurOutEndLine();
-
- for(MatData currentCell=matrix.begin();currentCell!=matrix.end();currentCell++){
- m->mothurOut(toString(index) + "\t" + toString(list->get(currentCell->row)) + "\t" + toString(list->get(currentCell->column)) + "\t" + toString(currentCell->dist)); m->mothurOutEndLine();
- index++;
- }
- }
- catch(exception& e) {
- m->errorOut(e, "SparseMatrix", "print");
- exit(1);
- }
-}
-
-/***********************************************************************/
-
-PCell* SparseMatrix::getSmallestCell(){
- try {
- // this is where I check to see if the next small distance has the correct distance
- // if it doesn't then I remove the offending Cell -> should also be able to check for
- // invalid iterator / pointer -- right???
-
- while(!mins.empty() && mins.back() == NULL){
- mins.pop_back();
- }
-
- // if the mins vector is empty go here...
- if(mins.empty()){
- mins.clear();
-
- smallDist = begin()->dist; //set the first candidate small distance
-
- for(MatData currentCell=begin();currentCell!=end();currentCell++){
-
- float dist = currentCell->dist;
-
- if(dist < smallDist){ //found a new smallest distance
- mins.clear();
- smallDist = dist;
- mins.push_back(&*currentCell); //this is the address of the data in the list being pointed to by the MatData iterator
- }
- else if(dist == smallDist){ //if a subsequent distance is the same as mins distance add the new iterator to the mins vector
- mins.push_back(&*currentCell); //this is the address of the data in the list being pointed to by the MatData iterator
- }
-
- }
- random_shuffle(mins.begin(), mins.end()); //randomize the order of the iterators in the mins vector
-
- for(int i=0;i<mins.size();i++){
- mins[i]->vectorMap = &mins[i]; //assign vectorMap to the address for the container
- }
-
- }
-
- smallCell = mins.back(); //make the smallestCell the last element of the vector
-
- mins.pop_back(); //remove the last element from the vector
-
- return smallCell;
- }
- catch(exception& e) {
- m->errorOut(e, "SparseMatrix", "getSmallestCell");
- exit(1);
- }
-}
-
-/***********************************************************************/
-