本文整理汇总了C++中tree::getNodesNum方法的典型用法代码示例。如果您正苦于以下问题:C++ tree::getNodesNum方法的具体用法?C++ tree::getNodesNum怎么用?C++ tree::getNodesNum使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类tree
的用法示例。
在下文中一共展示了tree::getNodesNum方法的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: makeNodeBetweenTwoNodes
//insert a new node between fatherNode and sonNode
tree::nodeP makeNodeBetweenTwoNodes(tree& et,
tree::nodeP fatherNode,
tree::nodeP sonNode,
const string &interName){
//make sure that fatherNode is indeed the father and sonNode is the son (and not the opposite).
if (fatherNode->father() == sonNode) {
tree::nodeP tmp = fatherNode;
fatherNode = sonNode;
sonNode = tmp;
}
else if (sonNode->father() != fatherNode) {
errorMsg::reportError("Error in function 'cut_tree_in_two'. the two nodes are not neighbours ");
}
tree::nodeP theNewNodePTR = new tree::TreeNode(et.getNodesNum());
//fix the tree information for the new node.
theNewNodePTR->setName(interName);
MDOUBLE tmpLen = sonNode->dis2father() * 0.5;
theNewNodePTR->setDisToFather(tmpLen);
theNewNodePTR->setFather(fatherNode);
theNewNodePTR->setSon(sonNode);
//fix the tree information for the father node.
fatherNode->removeSon(sonNode);
fatherNode->setSon(theNewNodePTR);
//fix the tree information for the sonNode.
sonNode->setFather(theNewNodePTR);
sonNode->setDisToFather(tmpLen);
return theNewNodePTR;
}
示例2: fillComputeMarginal
void computeMarginalAlg::fillComputeMarginal(const tree& et,
const sequenceContainer& sc,
const stochasticProcess& sp,
const int pos,
const computePijHom& pi,
suffStatGlobalHomPos& ssc,
const suffStatGlobalHomPos& cup,
const suffStatGlobalHomPos& cdown,
doubleRep & posProb){
// filling the exact probs.
tree::nodeP mynode = NULL;
ssc.allocatePlace(et.getNodesNum(),pi.alphabetSize());
treeIterTopDownConst tIt(et);
for (mynode = tIt.first(); mynode != tIt.end(); mynode = tIt.next()) {
assert (mynode != NULL);
int letter;
if (mynode->isLeaf()) {
for(letter=0; letter<pi.alphabetSize();letter++) {
doubleRep val=convert(cup.get(mynode->id(),letter))?1.0:0.0;
ssc.set(mynode->id(),letter,val);
}
continue;
}
doubleRep sumProb =0;
for(letter=0; letter<pi.alphabetSize();letter++) {
doubleRep prob=0.0;
if (mynode->father()==NULL) prob=1.0; // special case of the root.
else {
for(int letter_in_f=0; letter_in_f<pi.alphabetSize();letter_in_f++) {
prob +=cdown.get(mynode->id(),letter_in_f)*
pi.getPij(mynode->id(),letter,letter_in_f);
}
}
prob = prob*sp.freq(letter)*
cup.get(mynode->id(),letter);
ssc.set(mynode->id(),letter,prob);
sumProb += prob;
}
for(letter=0; letter<pi.alphabetSize();letter++) {
doubleRep getV = ssc.get(mynode->id(),letter);
ssc.set(mynode->id(),letter,getV/sumProb);
}
// CHECKING:
/* LOG(5,<<" checking marginal of node: "<<mynode->name()<<endl);
MDOUBLE SSum =0;
for (int u=0; u < pi.alphabetSize(); ++u) {
LOG(5,<<ssc.get(mynode->id(),u)<<" ");
SSum +=ssc.get(mynode->id(),u);
}
LOG(5,<<"\nsum of marginals = "<<SSum<<endl);
*/
if (mynode->isRoot()) posProb = convert(sumProb);
}
}
示例3: sameTreeTolopogy
bool sameTreeTolopogy(tree t1, tree t2){
if (t1.getNodesNum() != t2.getNodesNum()) {
errorMsg::reportError("error in function same tree topology (1)");
}
tree::nodeP x = t2.getRoot();
while (x->getNumberOfSons() > 0) x= x->getSon(0);
t1.rootAt(t1.findNodeByName(x->name())->father()); // now they have the same root
t2.rootAt(t2.findNodeByName(x->name())->father()); // now they have the same root
map<int,string> names1;
treeIterDownTopConst tit1(t1);
for (tree::nodeP nodeM = tit1.first(); nodeM != tit1.end(); nodeM = tit1.next()) {
vector<string> nameOfChild;
for (int i=0; i < nodeM->getNumberOfSons();++i) {
nameOfChild.push_back(names1[nodeM->getSon(i)->id()]);
}
if (nodeM->getNumberOfSons()==0) nameOfChild.push_back(nodeM->name());
sort(nameOfChild.begin(),nameOfChild.end());
string res = "(";
for (int k=0; k < nameOfChild.size(); ++k) {
res += nameOfChild[k];
}
res += ")";
names1[nodeM->id()] = res;
}
map<int,string> names2;
treeIterDownTopConst tit2(t2);
for (tree::nodeP nodeM2 = tit2.first(); nodeM2 != tit2.end(); nodeM2 = tit2.next()) {
vector<string> nameOfChild;
for (int i=0; i < nodeM2->getNumberOfSons();++i) {
nameOfChild.push_back(names2[nodeM2->getSon(i)->id()]);
}
if (nodeM2->getNumberOfSons()==0) nameOfChild.push_back(nodeM2->name());
sort(nameOfChild.begin(),nameOfChild.end());
string res = "(";
for (int k=0; k < nameOfChild.size(); ++k) {
res += nameOfChild[k];
}
res += ")";
names2[nodeM2->id()] = res;
}
return names1[t1.getRoot()->id()] == names2[t2.getRoot()->id()];
}
示例4: fillComputeUpWithFactors
void computeUpAlg::fillComputeUpWithFactors(const tree& et,
const sequenceContainer& sc,
const int pos,
const stochasticProcess& sp,
suffStatGlobalHomPos& ssc,
vector<MDOUBLE>& factors) {
factors.resize(et.getNodesNum(),0.0);
seqContainerTreeMap sctm(sc,et);
ssc.allocatePlace(et.getNodesNum(),sp.alphabetSize());
treeIterDownTopConst tIt(et);
for (tree::nodeP mynode = tIt.first(); mynode != tIt.end(); mynode = tIt.next()) {
int letter;
if (mynode->getNumberOfSons() == 0) {// leaf
for(letter=0; letter<sp.alphabetSize();letter++) {
const int seqID = sctm.seqIdOfNodeI(mynode->id());
doubleRep val = sc.getAlphabet()->relations(sc[seqID][pos],letter);
ssc.set(mynode->id(),letter,val);
}
computeNodeFactorAndSetSsc(factors[mynode->id()],ssc,mynode->id(),sp.alphabetSize());
}
else {
for(letter=0; letter<sp.alphabetSize();letter++) {
doubleRep total_prob=1.0;
for(int i=0; i < mynode->getNumberOfSons();++i){
doubleRep prob=0.0;
for(int letInSon=0; letInSon<sp.alphabetSize();letInSon++) {
prob += ssc.get(mynode->getSon(i)->id(),letInSon)*
sp.Pij_t(letter,letInSon,mynode->getSon(i)->dis2father()*sp.getGlobalRate());// taking care of the glubal is new.
}
assert(prob>=0);
total_prob*=prob;
}
ssc.set(mynode->id(),letter,total_prob);
}
computeNodeFactorAndSetSsc(factors[mynode->id()],ssc,mynode->id(),sp.alphabetSize());
for(int k=0; k < mynode->getNumberOfSons();++k) {
factors[mynode->id()]+=factors[mynode->getSon(k)->id()];
}
}
}
}
示例5: cutTreeToTwo
// bigTree is passed by value and not by reference. Therefore, this method doens't change the original bigTree,
// but allocates a new bigTree to be split.
bool cutTreeToTwo(tree bigTree,
const string& nameOfNodeToCut,
tree &small1,
tree &small2){// cutting above the NodeToCut.
// we want to cut the tree in two.
// first step: we make a new node between the two nodes that have to be splited,
tree::nodeP node2splitOnNewTree = bigTree.findNodeByName(nameOfNodeToCut);
string interNode = "interNode";
if (node2splitOnNewTree->father() == NULL) return(false);
// assert(node2splitOnNewTree->father() != NULL);
tree::nodeP tmp = makeNodeBetweenTwoNodes(bigTree,node2splitOnNewTree->father(),node2splitOnNewTree, interNode);
bigTree.rootAt(tmp); // tmp is the interNode and it's now the root of the tree. Its sons are node2splitOnNewTree and its father.
string allNodes = "Runs/testBifurcating/beforeCut.tree";
bigTree.output(allNodes, tree::PHYLIP, true);
cutTreeToTwoSpecial(bigTree,tmp, small1,small2);
if (small1.getNodesNum() < 5 || small2.getNodesNum() < 5) return (false);
LOGDO(15,small1.output(myLog::LogFile(),tree::ANCESTORID));
LOGDO(15,small2.output(myLog::LogFile(),tree::ANCESTORID));
tree::nodeP toDel1 = small1.findNodeByName(interNode);
small1.removeLeaf(toDel1);
tree::nodeP toDel2 = small2.findNodeByName(interNode);
small2.removeLeaf(toDel2);
// this part fix the ids.
treeIterTopDown tIt(small1);
int newId =0;
for (tree::nodeP mynode = tIt.first(); mynode != tIt.end(); mynode = tIt.next()) {
mynode->setID(newId);
newId++;
}
treeIterTopDown tIt2(small2);
int newId2 =0;
for (tree::nodeP mynode2 = tIt2.first(); mynode2 != tIt2.end(); mynode2 = tIt2.next()) {
mynode2->setID(newId2);
newId2++;
}
return (true); // successes!
};
示例6: BBfillComputeDown
void BBfillComputeDown(const tree& et,
const sequenceContainer& sc,
const int pos,
const computePijHom& pi,
suffStatGlobalHomPos& ssc,
const suffStatGlobalHomPos& cup,
const vector<sequence>& ancS){
ssc.allocatePlace(et.getNodesNum(), pi.alphabetSize());
treeIterTopDownConst tIt(et);
for (tree::nodeP mynode = tIt.first(); mynode != tIt.end(); mynode = tIt.next()) {
int letter,letterInFather,bro,letterInSon;
if (mynode->father()==NULL) {// if root
for(letter=0; letter<pi.alphabetSize();letter++) {
ssc.set(mynode->id(),letter,1.0);
}
mynode = tIt.next(); //continue
}
tree::nodeP fatherNode=mynode->father();
const int n_bro=fatherNode->getNumberOfSons();
for(letter=0; letter<pi.alphabetSize();letter++) {
if ((ancS[mynode->father()->id()][pos]!=-2)&&(ancS[mynode->father()->id()][pos]!=letter)){
ssc.set(mynode->id(),letter,0);
continue;
} // this if takes care of internal node assignments...
doubleRep totalProb=1.0;
doubleRep fatherTerm=0;
if (fatherNode->father()!=NULL) {
for(letterInFather=0; letterInFather<pi.alphabetSize();letterInFather++)
fatherTerm += pi.getPij(fatherNode->id(),letter,letterInFather)*
ssc.get(fatherNode->id(),letterInFather);
}
else {
fatherTerm=1.0;
}
doubleRep brotherTerm=1.0;
for(bro = 0; bro < n_bro; bro++) {
tree::nodeP brother = fatherNode->getSon(bro);
if (brother != mynode) {
doubleRep tmp_bro=0.0;
for(letterInSon=0; letterInSon<pi.alphabetSize();letterInSon++) {
tmp_bro+=pi.getPij(fatherNode->getSon(bro)->id(),letter,letterInSon)*
cup.get(brother->id(),letterInSon);
}
brotherTerm *=tmp_bro;
}
}
totalProb = fatherTerm * brotherTerm;
ssc.set(mynode->id(),letter,totalProb);
}
}
}
示例7: fillPij
void computePijHom::fillPij(const tree& et, const stochasticProcess& sp, int derivationOrder, bool isReversible) {
_V.resize(et.getNodesNum());
treeIterTopDownConst tIt(et);
tree::nodeP myNode = tIt.first();
{// skipping the root, but allocating place for the root pij even if they are not use
// to maintain that all arrays have the same size.
_V[myNode->id()].resize(sp.alphabetSize());
}
LOGDO(50,et.output(myLog::LogFile(),tree::ANCESTOR));
LOGDO(50,et.output(myLog::LogFile(),tree::PHYLIP));
for (; myNode != tIt.end(); myNode = tIt.next()) {
if (!(myNode->isRoot()))
_V[myNode->id()].fillPij(myNode->dis2father()*sp.getGlobalRate(),sp,derivationOrder,isReversible);
// else
// myLog::LogFile()<<"ROOT IS "<<myNode->name()<<endl;
}
}
示例8: splitSonsFromNode
void splitSonsFromNode(tree & et, tree::nodeP fatherNode, vector<tree::nodeP> & son2split)
{
for (int k=0; k < son2split.size(); ++k) {
if (son2split[k]->father() != fatherNode )
errorMsg::reportError(" error in function bootstrap::splitSonsFromNode - nodes don't have the same father");
}
// if the split allready exists, we do not need to do anything.
if (son2split.size()==fatherNode->getNumberOfSons() // the branch above us is the required split
|| son2split.size() <=1 // the branch below us is it
|| (fatherNode->father()==NULL && son2split.size()==fatherNode->getNumberOfSons()-1)
// the branch above us is the required split
)
return;
tree::nodeP theNewNode = et.createNode(fatherNode,et.getNodesNum());
theNewNode->setName("N"+int2string(theNewNode->id()));
for (int i=0; i < son2split.size(); ++i) {
son2split[i]->setFather(theNewNode);
theNewNode->setSon(son2split[i]);
// remove from son list of father node.
fatherNode->removeSon(son2split[i]);
}
}
示例9: fillComputeUpSpecificGlobalRateFactors
void computeUpAlg::fillComputeUpSpecificGlobalRateFactors(const tree& et,
const sequenceContainer& sc,
const int pos,
const stochasticProcess& sp,
suffStatGlobalHomPos& ssc,
const MDOUBLE gRate,
vector<MDOUBLE>& factors) {
factors.resize(et.getNodesNum(),0.0);
seqContainerTreeMap sctm(sc,et);
ssc.allocatePlace(et.getNodesNum(),sp.alphabetSize());
treeIterDownTopConst tIt(et);
for (tree::nodeP mynode = tIt.first(); mynode != tIt.end(); mynode = tIt.next()) {
#ifdef VERBOS
LOG(5,<<endl<<endl<<"doing node: "<<mynode->name()<<endl);
#endif
int letter;
if (mynode->getNumberOfSons() == 0) {// leaf
for(letter=0; letter<sp.alphabetSize();letter++) {
const int seqID = sctm.seqIdOfNodeI(mynode->id());
doubleRep val = sc.getAlphabet()->relations(sc[seqID][pos],letter);
ssc.set(mynode->id(),letter,val);
}
computeNodeFactorAndSetSsc(factors[mynode->id()],ssc,mynode->id(),sp.alphabetSize());
}
else {
int letterWithTotalProbEqZero =0;
for(letter=0; letter<sp.alphabetSize();letter++) {
doubleRep total_prob=1.0;
for(int i=0; i < mynode->getNumberOfSons();++i){
doubleRep prob=0.0;
for(int letInSon=0; letInSon<sp.alphabetSize();letInSon++) {
assert(ssc.get(mynode->getSon(i)->id(),letInSon)>=0);
assert(sp.Pij_t(letter,letInSon,mynode->getSon(i)->dis2father()*gRate)>=0);
prob += ssc.get(mynode->getSon(i)->id(),letInSon)*
sp.Pij_t(letter,letInSon,mynode->getSon(i)->dis2father()*gRate);
}
assert(prob>=0);
total_prob*=prob;
}
if (total_prob ==0) ++letterWithTotalProbEqZero;
ssc.set(mynode->id(),letter,total_prob);
} // end of else
computeNodeFactorAndSetSsc(factors[mynode->id()],ssc,mynode->id(),sp.alphabetSize());
for(int k=0; k < mynode->getNumberOfSons();++k) {
factors[mynode->id()]+=factors[mynode->getSon(k)->id()];
}
if (letterWithTotalProbEqZero == sp.alphabetSize() && (mynode->getNumberOfSons() > 0)) {
LOG(5,<<" total prob =0");
for (int z=0; z <mynode->getNumberOfSons(); ++z) {
LOG(5,<<"son "<<z<<" is "<<mynode->getSon(z)->name()<<endl);
LOG(5,<<"dis2father is "<<mynode->getSon(z)->dis2father()<<endl);
for(int letInSon=0; letInSon<sp.alphabetSize();letInSon++) {
LOG(5,<<"let = "<<letInSon<<endl);
LOG(5,<<"ssc.get(mynode->sons[z]->id(),letInSon) = "<<convert(ssc.get(mynode->getSon(z)->id(),letInSon))<<endl);
// LOG(5,<<"sp.Pij_t(letter,letInSon,mynode->getSon(i)->dis2father()*gRate) = "<<sp.Pij_t(letter,letInSon,mynode->sons[i]->dis2father()*gRate)<<endl);
// LOG(5,<<"mynode->getSon(i)->dis2father() = "<<mynode->getSon(i)->dis2father()<<endl);
}
}
exit(3);
}
}
}