44 #include <Bpp/App/ApplicationTools.h> 55 if (matrix.size() <= 3)
56 throw Exception(
"AbstractAgglomerativeDistanceMethod::setDistanceMatrix(): matrix must be at least of dimension 3.");
58 currentNodes_.clear();
59 if (tree_)
delete tree_;
65 for (
size_t i = 0; i < matrix_.size(); ++i)
67 currentNodes_[i] = getLeafNode(static_cast<int>(i), matrix_.getName(i));
69 int idNextNode =
static_cast<int>(matrix_.size());
70 vector<double> newDist(matrix_.size());
73 while (currentNodes_.size() > (rootTree_ ? 2 : 3))
76 ApplicationTools::displayGauge(matrix_.size() - currentNodes_.size(), matrix_.size() - (rootTree_ ? 2 : 3) - 1);
77 vector<size_t> bestPair = getBestPair();
78 vector<double> distances = computeBranchLengthsForPair(bestPair);
79 Node* best1 = currentNodes_[bestPair[0]];
80 Node* best2 = currentNodes_[bestPair[1]];
84 Node* parent = getParentNode(idNextNode, best1, best2);
86 for (map<size_t, Node *>::iterator i = currentNodes_.begin(); i != currentNodes_.end(); i++)
89 if (
id != bestPair[0] &&
id != bestPair[1])
91 assert (
id < newDist.size());
92 newDist[id] = computeDistancesFromPair(bestPair, distances,
id);
100 currentNodes_[bestPair[0]] = parent;
101 currentNodes_.erase(bestPair[1]);
102 for (map<size_t, Node *>::iterator i = currentNodes_.begin(); i != currentNodes_.end(); i++)
104 size_t id = i->first;
105 matrix_(bestPair[0],
id) = matrix_(
id, bestPair[0]) = newDist[id];
108 finalStep(idNextNode);
113 return new Node(
id, name);
virtual void addSon(size_t pos, Node *node)
virtual Node * getLeafNode(int id, const std::string &name)
Get a leaf node.
virtual void setDistanceMatrix(const DistanceMatrix &matrix)
Set the distance matrix to use.
virtual void computeTree()
Compute the tree corresponding to the distance matrix.
The phylogenetic node class.
virtual void setDistanceToFather(double distance)
Set or update the distance toward the father node.
virtual Node * getParentNode(int id, Node *son1, Node *son2)
Get an inner node.