本文整理汇总了C++中TreeTemplate::getRootId方法的典型用法代码示例。如果您正苦于以下问题:C++ TreeTemplate::getRootId方法的具体用法?C++ TreeTemplate::getRootId怎么用?C++ TreeTemplate::getRootId使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类TreeTemplate
的用法示例。
在下文中一共展示了TreeTemplate::getRootId方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: computeRewardVectors
ProbabilisticRewardMapping* RewardMappingTools::computeRewardVectors(
const DRTreeLikelihood& drtl,
const vector<int>& nodeIds,
Reward& reward,
bool verbose) throw (Exception)
{
// Preamble:
if (!drtl.isInitialized())
throw Exception("RewardMappingTools::computeRewardVectors(). Likelihood object is not initialized.");
// A few variables we'll need:
const TreeTemplate<Node> tree(drtl.getTree());
const SiteContainer* sequences = drtl.getData();
const DiscreteDistribution* rDist = drtl.getRateDistribution();
size_t nbSites = sequences->getNumberOfSites();
size_t nbDistinctSites = drtl.getLikelihoodData()->getNumberOfDistinctSites();
size_t nbStates = sequences->getAlphabet()->getSize();
size_t nbClasses = rDist->getNumberOfCategories();
vector<const Node*> nodes = tree.getNodes();
const vector<size_t>* rootPatternLinks
= &drtl.getLikelihoodData()->getRootArrayPositions();
nodes.pop_back(); // Remove root node.
size_t nbNodes = nodes.size();
// We create a new ProbabilisticRewardMapping object:
ProbabilisticRewardMapping* rewards = new ProbabilisticRewardMapping(tree, &reward, nbSites);
// Store likelihood for each rate for each site:
VVVdouble lik;
drtl.computeLikelihoodAtNode(tree.getRootId(), lik);
Vdouble Lr(nbDistinctSites, 0);
Vdouble rcProbs = rDist->getProbabilities();
Vdouble rcRates = rDist->getCategories();
for (size_t i = 0; i < nbDistinctSites; i++)
{
VVdouble* lik_i = &lik[i];
for (size_t c = 0; c < nbClasses; c++)
{
Vdouble* lik_i_c = &(*lik_i)[c];
double rc = rDist->getProbability(c);
for (size_t s = 0; s < nbStates; s++)
{
Lr[i] += (*lik_i_c)[s] * rc;
}
}
}
// Compute the reward for each class and each branch in the tree:
if (verbose)
ApplicationTools::displayTask("Compute joint node-pairs likelihood", true);
for (size_t l = 0; l < nbNodes; ++l)
{
// For each node,
const Node* currentNode = nodes[l];
if (nodeIds.size() > 0 && !VectorTools::contains(nodeIds, currentNode->getId()))
continue;
const Node* father = currentNode->getFather();
double d = currentNode->getDistanceToFather();
if (verbose)
ApplicationTools::displayGauge(l, nbNodes - 1);
Vdouble rewardsForCurrentNode(nbDistinctSites);
// Now we've got to compute likelihoods in a smart manner... ;)
VVVdouble likelihoodsFatherConstantPart(nbDistinctSites);
for (size_t i = 0; i < nbDistinctSites; i++)
{
VVdouble* likelihoodsFatherConstantPart_i = &likelihoodsFatherConstantPart[i];
likelihoodsFatherConstantPart_i->resize(nbClasses);
for (size_t c = 0; c < nbClasses; c++)
{
Vdouble* likelihoodsFatherConstantPart_i_c = &(*likelihoodsFatherConstantPart_i)[c];
likelihoodsFatherConstantPart_i_c->resize(nbStates);
double rc = rDist->getProbability(c);
for (size_t s = 0; s < nbStates; s++)
{
// (* likelihoodsFatherConstantPart_i_c)[s] = rc * model->freq(s);
// freq is already accounted in the array
(*likelihoodsFatherConstantPart_i_c)[s] = rc;
}
}
}
// First, what will remain constant:
size_t nbSons = father->getNumberOfSons();
for (size_t n = 0; n < nbSons; n++)
{
const Node* currentSon = father->getSon(n);
if (currentSon->getId() != currentNode->getId())
{
const VVVdouble* likelihoodsFather_son = &drtl.getLikelihoodData()->getLikelihoodArray(father->getId(), currentSon->getId());
// Now iterate over all site partitions:
auto_ptr<TreeLikelihood::ConstBranchModelIterator> mit(drtl.getNewBranchModelIterator(currentSon->getId()));
VVVdouble pxy;
//.........这里部分代码省略.........
示例2: midRoot
void TreeTemplateTools::midRoot(TreeTemplate<Node>& tree, short criterion, bool forceBranchRoot)
{
if (criterion != MIDROOT_VARIANCE && criterion != MIDROOT_SUM_OF_SQUARES)
throw Exception("TreeTemplateTools::midRoot(). Illegal criterion value '" + TextTools::toString(criterion) + "'");
if (tree.isRooted())
tree.unroot();
Node* ref_root = tree.getRootNode();
//
// The bestRoot object records :
// -- the current best branch : .first
// -- the current best value of the criterion : .second["value"]
// -- the best position of the root on the branch : .second["position"]
// 0 is toward the original root, 1 is away from it
//
pair<Node*, map<string, double> > best_root_branch;
best_root_branch.first = ref_root; // nota: the root does not correspond to a branch as it has no father
best_root_branch.second ["position"] = -1;
best_root_branch.second ["score"] = numeric_limits<double>::max();
// find the best root
getBestRootInSubtree_(tree, criterion, ref_root, best_root_branch);
tree.rootAt(ref_root); // back to the original root
// reroot
const double pos = best_root_branch.second["position"];
if (pos < 1e-6 or pos > 1 - 1e-6)
// The best root position is on a node (this is often the case with the sum of squares criterion)
tree.rootAt(pos < 1e-6 ? best_root_branch.first->getFather() : best_root_branch.first);
else
// The best root position is somewhere on a branch (a new Node is created)
{
Node* new_root = new Node();
new_root->setId( TreeTools::getMPNUId(tree, tree.getRootId()) );
double root_branch_length = best_root_branch.first->getDistanceToFather();
Node* best_root_father = best_root_branch.first->getFather();
best_root_father->removeSon(best_root_branch.first);
best_root_father->addSon(new_root);
new_root->addSon(best_root_branch.first);
new_root->setDistanceToFather(max(pos * root_branch_length, 1e-6));
best_root_branch.first->setDistanceToFather(max((1 - pos) * root_branch_length, 1e-6));
// The two branches leaving the root must have the same branch properties
const vector<string> branch_properties = best_root_branch.first->getBranchPropertyNames();
for (vector<string>::const_iterator p = branch_properties.begin(); p != branch_properties.end(); ++p)
{
new_root->setBranchProperty(*p, *best_root_branch.first->getBranchProperty(*p));
}
tree.rootAt(new_root);
}
if (forceBranchRoot) // if we want the root to be on a branch, not on a node
{
Node* orig_root = tree.getRootNode();
vector<Node*> root_sons = orig_root->getSons();
if (root_sons.size() > 2)
{
Node* nearest = root_sons.at(0);
for (vector<Node*>::iterator n = root_sons.begin(); n !=
root_sons.end(); ++n)
{
if ((**n).getDistanceToFather() < nearest->getDistanceToFather())
nearest = *n;
}
const double d = nearest->getDistanceToFather();
Node* new_root = new Node();
new_root->setId( TreeTools::getMPNUId(tree, tree.getRootId()) );
orig_root->removeSon(nearest);
orig_root->addSon(new_root);
new_root->addSon(nearest);
new_root->setDistanceToFather(d / 2.);
nearest->setDistanceToFather(d / 2.);
const vector<string> branch_properties = nearest->getBranchPropertyNames();
for (vector<string>::const_iterator p = branch_properties.begin(); p != branch_properties.end(); ++p)
{
new_root->setBranchProperty(*p, *nearest->getBranchProperty(*p));
}
tree.rootAt(new_root);
}
}
}