Tree* TreeTools::MRPMultilabel(const vector<Tree*>& vecTr) { // matrix representation VectorSiteContainer* sites = TreeTools::MRPEncode(vecTr); // starting bioNJ tree const DNA* alphabet = dynamic_cast<const DNA*>(sites->getAlphabet()); JCnuc* jc = new JCnuc(alphabet); ConstantDistribution* constRate = new ConstantDistribution(1.); DistanceEstimation distFunc(jc, constRate, sites, 0, true); BioNJ bionjTreeBuilder(false, false); bionjTreeBuilder.setDistanceMatrix(*(distFunc.getMatrix())); bionjTreeBuilder.computeTree(); if (ApplicationTools::message) ApplicationTools::message->endLine(); TreeTemplate<Node>* startTree = new TreeTemplate<Node>(*bionjTreeBuilder.getTree()); // MP optimization DRTreeParsimonyScore* MPScore = new DRTreeParsimonyScore(*startTree, *sites, false); MPScore = OptimizationTools::optimizeTreeNNI(MPScore, 0); delete startTree; Tree* retTree = new TreeTemplate<Node>(MPScore->getTree()); delete MPScore; return retTree; }