diff --git a/cs677/pa4/Makefile b/cs677/pa4/Makefile index 5694c46..1b492ea 100644 --- a/cs677/pa4/Makefile +++ b/cs677/pa4/Makefile @@ -1,9 +1,10 @@ CXX := mpiCC TARGET := maximum-parsimony -OBJS := Sequence.o +OBJS := maximum-parsimony.o +OBJS += Sequence.o OBJS += ElementSet.o -OBJS += maximum-parsimony.o +OBJS += PTree.o all: $(TARGET) diff --git a/cs677/pa4/PTree.cc b/cs677/pa4/PTree.cc new file mode 100644 index 0000000..bb08cc0 --- /dev/null +++ b/cs677/pa4/PTree.cc @@ -0,0 +1,63 @@ + +#include +#include +#include "PTree.h" +#include "Sequence.h" +using namespace std; + +PTree::PTree(const vector & leaves) +{ + int num_leaves = leaves.size(); + if (num_leaves & (num_leaves - 1)) + { + cerr << "Ptree::Ptree(): Number of initializing leaves is not a power of 2!!" << endl; + } + else + { + vector * my_leaves = new vector(num_leaves); + for (int i = 0; i < num_leaves; i++) + { + (*my_leaves)[i] = *leaves[i]; + } + myLevels.push_back(my_leaves); + for (int level_index = 1, level_size = num_leaves / 2; + level_size; + level_index++, level_size /= 2) + { + vector * level = new vector(level_size); + for (int i = 0; i < level_size; i++) + { + (*level)[i] = + (*myLevels[level_index-1])[2*i].parent( + (*myLevels[level_index-1])[2*i+1] + ); + } + } + } +} + +PTree::~PTree() +{ + for (int i = 0, sz = myLevels.size(); i < sz; i++) + { + delete myLevels[i]; + } +} + +void PTree::print(ostream & out, int level, int index, + string prefix, string subprefix) const +{ + out << prefix; + out << myLevels[level][0][index]; + if (level > 0) + { + print(out, level - 1, index * 2, subprefix + "+-", subprefix + "| "); + print(out, level - 1, index * 2 + 1, subprefix + "`-", subprefix + " "); + } +} + +ostream & operator<<(ostream & out, const PTree & p) +{ + p.print(out, p.myLevels.size() - 1, 0, "", ""); + return out; +} diff --git a/cs677/pa4/PTree.h b/cs677/pa4/PTree.h new file mode 100644 index 0000000..1626c59 --- /dev/null +++ b/cs677/pa4/PTree.h @@ -0,0 +1,18 @@ + +#include +#include +#include "Sequence.h" + +class PTree +{ +private: + std::vector< std::vector< Sequence > * > myLevels; + +public: + PTree(const std::vector & leaves); + ~PTree(); + void print(std::ostream & out, int level, int index, + std::string prefix, std::string subprefix) const; + + friend std::ostream & operator<<(std::ostream & out, const PTree & p); +};