本文整理汇总了C++中Tree::GetParent方法的典型用法代码示例。如果您正苦于以下问题:C++ Tree::GetParent方法的具体用法?C++ Tree::GetParent怎么用?C++ Tree::GetParent使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Tree
的用法示例。
在下文中一共展示了Tree::GetParent方法的11个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ComputeJacobian
void Jacobian::ComputeJacobian(const Tree& tree)
{
Invalidate();
jacobian_ = MatrixX(3,tree.GetNumJoint()-1); // à cause de son incrémentation débile
// Traverse this to find all end effectors
Vector3 temp;
Joint* n = tree.GetRoot();
while (n) {
if (n->IsEffector())
{
int i = n->GetEffectorNum();
// Find all ancestors (they will usually all be joints)
// Set the corresponding entries in the Jacobian J
Joint* m = tree.GetParent(n);
while (m) {
int j = m->GetJointNum();
assert (0 <=i && i<tree.GetNumEffector() && 0<=j && j<tree.GetNumJoint());
temp = m->GetS(); // joint pos.
temp -= n->GetS(); // -(end effector pos. - joint pos.)
Vector3 tmp2 = temp.cross(m->GetW()); // cross product with joint rotation axis
jacobian_.col(j-1) = tmp2;
m = tree.GetParent(m);
}
}
n = (n->IsEffector() ? 0 : tree.GetSuccessor(n));
}
}
示例2: ClusterByHeight
void ClusterByHeight(const Tree &tree, double dMaxHeight, unsigned Subtrees[],
unsigned *ptruSubtreeCount)
{
if (!tree.IsRooted())
Quit("ClusterByHeight: requires rooted tree");
#if TRACE
Log("ClusterByHeight, max height=%g\n", dMaxHeight);
#endif
unsigned uSubtreeCount = 0;
const unsigned uNodeCount = tree.GetNodeCount();
for (unsigned uNodeIndex = 0; uNodeIndex < uNodeCount; ++uNodeIndex)
{
if (tree.IsRoot(uNodeIndex))
continue;
unsigned uParent = tree.GetParent(uNodeIndex);
double dHeight = tree.GetNodeHeight(uNodeIndex);
double dParentHeight = tree.GetNodeHeight(uParent);
#if TRACE
Log("Node %3u Height %5.2f ParentHeight %5.2f\n",
uNodeIndex, dHeight, dParentHeight);
#endif
if (dParentHeight > dMaxHeight && dHeight <= dMaxHeight)
{
Subtrees[uSubtreeCount] = uNodeIndex;
#if TRACE
Log("Subtree[%u]=%u\n", uSubtreeCount, uNodeIndex);
#endif
++uSubtreeCount;
}
}
*ptruSubtreeCount = uSubtreeCount;
}
示例3: PhyEnumEdges
// Return false when done
bool PhyEnumEdges(const Tree &tree, PhyEnumEdgeState &ES)
{
unsigned uNode1 = uInsane;
if (!ES.m_bInit)
{
if (tree.GetNodeCount() <= 1)
{
ES.m_uNodeIndex1 = NULL_NEIGHBOR;
ES.m_uNodeIndex2 = NULL_NEIGHBOR;
return false;
}
uNode1 = tree.FirstDepthFirstNode();
ES.m_bInit = true;
}
else
{
uNode1 = tree.NextDepthFirstNode(ES.m_uNodeIndex1);
if (NULL_NEIGHBOR == uNode1)
return false;
if (tree.IsRooted() && tree.IsRoot(uNode1))
{
uNode1 = tree.NextDepthFirstNode(uNode1);
if (NULL_NEIGHBOR == uNode1)
return false;
}
}
unsigned uNode2 = tree.GetParent(uNode1);
ES.m_uNodeIndex1 = uNode1;
ES.m_uNodeIndex2 = uNode2;
return true;
}
示例4: main
//测试
int main()
{
cout<<"树的双亲表示法"<<endl;
Tree<char> newtree;
int n;
cout << "输入树节点数目:";
cin >> n;
newtree.CreatK(n);
cout << "当没有对应数据输出,表示没有" << endl;
cout << "第三个节点的树的值:" << newtree.GetData(3) << endl;
cout << "第三个节点的最左子树根节点值:" << newtree.GetLeftMostChild(3, n) << endl;
cout << "第三个节点的最右子树根节点值:" << newtree.GetRightMostChild(3, n) << endl;
cout << "第三个节点的父亲节点值:" << newtree.GetParent(3) << endl;
cout << "根节点值:" << newtree.GetRoot() << endl;
getchar();
return 0;
}
示例5: sgftree_test
// test for sgftree function
// [[Rcpp::export]]
void sgftree_test(std::string sgf)
{
std::vector<unsigned int> c;
Tree<std::string> t = MakeSgfBranchTree(sgf);
Rcpp::Rcout << "get_sgftree() has finished!\n";
Rcpp::Rcout << "SGF = " << sgf << "\n";
for (unsigned int i = 0; i < t.size(); i++)
{
Rcpp::Rcout << i << " : " << t.Get(i) <<
"\n parent = " << t.GetParent(i) << "\n children = ";
c = t.GetChildren(i);
for (unsigned int j = 0; j < c.size(); j++)
Rcpp::Rcout << c[j] << " ";
Rcpp::Rcout << "\n";
}
MakeSgfNodeTree(sgf);
}
示例6: MakeRootSeq
static void MakeRootSeq(const Seq &s, const Tree &GuideTree, unsigned uLeafNodeIndex,
const ProgNode Nodes[], Seq &sRoot)
{
sRoot.Copy(s);
unsigned uNodeIndex = uLeafNodeIndex;
for (;;)
{
unsigned uParent = GuideTree.GetParent(uNodeIndex);
if (NULL_NEIGHBOR == uParent)
break;
bool bRight = (GuideTree.GetLeft(uParent) == uNodeIndex);
uNodeIndex = uParent;
const PWPath &Path = Nodes[uNodeIndex].m_Path;
Seq sTmp;
PathSeq(sRoot, Path, bRight, sTmp);
sRoot.Copy(sTmp);
}
}
示例7: CalcClustalWWeights
void CalcClustalWWeights(const Tree &tree, WEIGHT Weights[])
{
#if TRACE
Log("CalcClustalWWeights\n");
tree.LogMe();
#endif
const unsigned uLeafCount = tree.GetLeafCount();
if (0 == uLeafCount)
return;
else if (1 == uLeafCount)
{
Weights[0] = (WEIGHT) 1.0;
return;
}
else if (2 == uLeafCount)
{
Weights[0] = (WEIGHT) 0.5;
Weights[1] = (WEIGHT) 0.5;
return;
}
if (!tree.IsRooted())
Quit("CalcClustalWWeights requires rooted tree");
const unsigned uNodeCount = tree.GetNodeCount();
unsigned *LeavesUnderNode = new unsigned[uNodeCount];
memset(LeavesUnderNode, 0, uNodeCount*sizeof(unsigned));
const unsigned uRootNodeIndex = tree.GetRootNodeIndex();
unsigned uLeavesUnderRoot = CountLeaves(tree, uRootNodeIndex, LeavesUnderNode);
if (uLeavesUnderRoot != uLeafCount)
Quit("WeightsFromTreee: Internal error, root count %u %u",
uLeavesUnderRoot, uLeafCount);
#if TRACE
Log("Node Leaves Length Strength\n");
Log("---- ------ -------- --------\n");
// 1234 123456 12345678 12345678
#endif
double *Strengths = new double[uNodeCount];
for (unsigned uNodeIndex = 0; uNodeIndex < uNodeCount; ++uNodeIndex)
{
if (tree.IsRoot(uNodeIndex))
{
Strengths[uNodeIndex] = 0.0;
continue;
}
const unsigned uParent = tree.GetParent(uNodeIndex);
const double dLength = tree.GetEdgeLength(uNodeIndex, uParent);
const unsigned uLeaves = LeavesUnderNode[uNodeIndex];
const double dStrength = dLength / (double) uLeaves;
Strengths[uNodeIndex] = dStrength;
#if TRACE
Log("%4u %6u %8g %8g\n", uNodeIndex, uLeaves, dLength, dStrength);
#endif
}
#if TRACE
Log("\n");
Log(" Seq Path..Weight\n");
Log("-------------------- ------------\n");
#endif
for (unsigned n = 0; n < uLeafCount; ++n)
{
const unsigned uLeafNodeIndex = tree.LeafIndexToNodeIndex(n);
#if TRACE
Log("%20.20s %4u ", tree.GetLeafName(uLeafNodeIndex), uLeafNodeIndex);
#endif
if (!tree.IsLeaf(uLeafNodeIndex))
Quit("CalcClustalWWeights: leaf");
double dWeight = 0;
unsigned uNode = uLeafNodeIndex;
while (!tree.IsRoot(uNode))
{
dWeight += Strengths[uNode];
uNode = tree.GetParent(uNode);
#if TRACE
Log("->%u(%g)", uNode, Strengths[uNode]);
#endif
}
if (dWeight < 0.0001)
{
#if TRACE
Log("zero->one");
#endif
dWeight = 1.0;
}
Weights[n] = (WEIGHT) dWeight;
#if TRACE
Log(" = %g\n", dWeight);
#endif
}
delete[] Strengths;
delete[] LeavesUnderNode;
Normalize(Weights, uLeafCount);
//.........这里部分代码省略.........
示例8: MakeSgfBranchTree
Tree<std::string> MakeSgfBranchTree(const std::string &sgf)
{
// parse SGF string and returns a tree of SGF nodes
// As a special case, where there is no branch in the input,
// returns a tree with a single node
Tree<std::string> out;
unsigned int i0;
unsigned int opencount = 0;
// This loop finds the beginning of the first branch
// Usually, a SGF starts at the first letter, but
// this handles cases where SGF contains few spaces or
// junk information before the first parenthesis
for (unsigned i = 0; i < sgf.size(); i++)
{
if (sgf[i] == '(') {
i0 = i + 1;
opencount = 1;
break;
}
}
// Return an empty tree if no branch is found
if (opencount == 0) return out;
unsigned int myid = 0;
int parentid = -1;
int mystart = i0;
bool intag = false; // indicates we are now in tag element
bool inbranch = true; // indicates we are not in a branch, not in-between
for (unsigned int i = i0; i < sgf.size(); i++)
{
// finish if all node is closed
if (opencount == 0) break;
if (!intag && sgf[i] == '(') {
// new branch opens
// so, add the current node to the tree
if (inbranch) out.AddNode(sgf.substr(mystart, i - mystart), parentid);
opencount++;
parentid = myid;
myid = out.size();
mystart = i + 1;
inbranch = true;
} else if (!intag && sgf[i] == ')') {
// current branch closes
if (inbranch) out.AddNode(sgf.substr(mystart, i - mystart), parentid);
opencount--;
if (opencount == 0) break;
myid = parentid;
parentid = out.GetParent(myid);
inbranch = false;
} else if (!intag && sgf[i] == '[') {
// new tag starts
intag = true;
} else if (intag && sgf[i] == ']' && sgf[i-1] != '\\') {
intag = false;
}
}
return out;
}
示例9: PruneTree
void Tree::PruneTree(const Tree &tree, unsigned Subfams[],
unsigned uSubfamCount)
{
if (!tree.IsRooted())
Quit("Tree::PruneTree: requires rooted tree");
Clear();
m_uNodeCount = 2*uSubfamCount - 1;
InitCache(m_uNodeCount);
const unsigned uUnprunedNodeCount = tree.GetNodeCount();
unsigned *uUnprunedToPrunedIndex = new unsigned[uUnprunedNodeCount];
unsigned *uPrunedToUnprunedIndex = new unsigned[m_uNodeCount];
for (unsigned n = 0; n < uUnprunedNodeCount; ++n)
uUnprunedToPrunedIndex[n] = NULL_NEIGHBOR;
for (unsigned n = 0; n < m_uNodeCount; ++n)
uPrunedToUnprunedIndex[n] = NULL_NEIGHBOR;
// Create mapping between unpruned and pruned node indexes
unsigned uInternalNodeIndex = uSubfamCount;
for (unsigned uSubfamIndex = 0; uSubfamIndex < uSubfamCount; ++uSubfamIndex)
{
unsigned uUnprunedNodeIndex = Subfams[uSubfamIndex];
uUnprunedToPrunedIndex[uUnprunedNodeIndex] = uSubfamIndex;
uPrunedToUnprunedIndex[uSubfamIndex] = uUnprunedNodeIndex;
for (;;)
{
uUnprunedNodeIndex = tree.GetParent(uUnprunedNodeIndex);
if (tree.IsRoot(uUnprunedNodeIndex))
break;
// Already visited this node?
if (NULL_NEIGHBOR != uUnprunedToPrunedIndex[uUnprunedNodeIndex])
break;
uUnprunedToPrunedIndex[uUnprunedNodeIndex] = uInternalNodeIndex;
uPrunedToUnprunedIndex[uInternalNodeIndex] = uUnprunedNodeIndex;
++uInternalNodeIndex;
}
}
const unsigned uUnprunedRootIndex = tree.GetRootNodeIndex();
uUnprunedToPrunedIndex[uUnprunedRootIndex] = uInternalNodeIndex;
uPrunedToUnprunedIndex[uInternalNodeIndex] = uUnprunedRootIndex;
#if TRACE
{
Log("Pruned to unpruned:\n");
for (unsigned i = 0; i < m_uNodeCount; ++i)
Log(" [%u]=%u", i, uPrunedToUnprunedIndex[i]);
Log("\n");
Log("Unpruned to pruned:\n");
for (unsigned i = 0; i < uUnprunedNodeCount; ++i)
{
unsigned n = uUnprunedToPrunedIndex[i];
if (n != NULL_NEIGHBOR)
Log(" [%u]=%u", i, n);
}
Log("\n");
}
#endif
if (uInternalNodeIndex != m_uNodeCount - 1)
Quit("Tree::PruneTree, Internal error");
// Nodes 0, 1 ... are the leaves
for (unsigned uSubfamIndex = 0; uSubfamIndex < uSubfamCount; ++uSubfamIndex)
{
char szName[32];
sprintf(szName, "Subfam_%u", uSubfamIndex + 1);
m_ptrName[uSubfamIndex] = strsave(szName);
}
for (unsigned uPrunedNodeIndex = uSubfamCount; uPrunedNodeIndex < m_uNodeCount;
++uPrunedNodeIndex)
{
unsigned uUnprunedNodeIndex = uPrunedToUnprunedIndex[uPrunedNodeIndex];
const unsigned uUnprunedLeft = tree.GetLeft(uUnprunedNodeIndex);
const unsigned uUnprunedRight = tree.GetRight(uUnprunedNodeIndex);
const unsigned uPrunedLeft = uUnprunedToPrunedIndex[uUnprunedLeft];
const unsigned uPrunedRight = uUnprunedToPrunedIndex[uUnprunedRight];
const double dLeftLength =
tree.GetEdgeLength(uUnprunedNodeIndex, uUnprunedLeft);
const double dRightLength =
tree.GetEdgeLength(uUnprunedNodeIndex, uUnprunedRight);
m_uNeighbor2[uPrunedNodeIndex] = uPrunedLeft;
m_uNeighbor3[uPrunedNodeIndex] = uPrunedRight;
m_dEdgeLength1[uPrunedLeft] = dLeftLength;
m_dEdgeLength1[uPrunedRight] = dRightLength;
//.........这里部分代码省略.........
示例10: DiffTreesE
void DiffTreesE(const Tree &NewTree, const Tree &OldTree,
unsigned NewNodeIndexToOldNodeIndex[])
{
#if TRACE
Log("DiffTreesE NewTree:\n");
NewTree.LogMe();
Log("\n");
Log("OldTree:\n");
OldTree.LogMe();
#endif
if (!NewTree.IsRooted() || !OldTree.IsRooted())
Quit("DiffTrees: requires rooted trees");
const unsigned uNodeCount = NewTree.GetNodeCount();
const unsigned uOldNodeCount = OldTree.GetNodeCount();
const unsigned uLeafCount = NewTree.GetLeafCount();
const unsigned uOldLeafCount = OldTree.GetLeafCount();
if (uNodeCount != uOldNodeCount || uLeafCount != uOldLeafCount)
Quit("DiffTreesE: different node counts");
{
unsigned *IdToOldNodeIndex = new unsigned[uNodeCount];
for (unsigned uOldNodeIndex = 0; uOldNodeIndex < uNodeCount; ++uOldNodeIndex)
{
if (OldTree.IsLeaf(uOldNodeIndex))
{
unsigned Id = OldTree.GetLeafId(uOldNodeIndex);
IdToOldNodeIndex[Id] = uOldNodeIndex;
}
}
// Initialize NewNodeIndexToOldNodeIndex[]
// All internal nodes are marked as changed, but may be updated later.
for (unsigned uNewNodeIndex = 0; uNewNodeIndex < uNodeCount; ++uNewNodeIndex)
{
if (NewTree.IsLeaf(uNewNodeIndex))
{
unsigned uId = NewTree.GetLeafId(uNewNodeIndex);
assert(uId < uLeafCount);
unsigned uOldNodeIndex = IdToOldNodeIndex[uId];
assert(uOldNodeIndex < uNodeCount);
NewNodeIndexToOldNodeIndex[uNewNodeIndex] = uOldNodeIndex;
}
else
NewNodeIndexToOldNodeIndex[uNewNodeIndex] = NODE_CHANGED;
}
delete[] IdToOldNodeIndex;
}
// Depth-first traversal of tree.
// The order guarantees that a node is visited before
// its parent is visited.
for (unsigned uNewNodeIndex = NewTree.FirstDepthFirstNode();
NULL_NEIGHBOR != uNewNodeIndex;
uNewNodeIndex = NewTree.NextDepthFirstNode(uNewNodeIndex))
{
if (NewTree.IsLeaf(uNewNodeIndex))
continue;
// If either child is changed, flag this node as changed and continue.
unsigned uNewLeft = NewTree.GetLeft(uNewNodeIndex);
unsigned uOldLeft = NewNodeIndexToOldNodeIndex[uNewLeft];
if (NODE_CHANGED == uOldLeft)
{
NewNodeIndexToOldNodeIndex[uNewLeft] = NODE_CHANGED;
continue;
}
unsigned uNewRight = NewTree.GetRight(uNewNodeIndex);
unsigned uOldRight = NewNodeIndexToOldNodeIndex[uNewRight];
if (NODE_CHANGED == NewNodeIndexToOldNodeIndex[uNewRight])
{
NewNodeIndexToOldNodeIndex[uNewRight] = NODE_CHANGED;
continue;
}
unsigned uOldParentLeft = OldTree.GetParent(uOldLeft);
unsigned uOldParentRight = OldTree.GetParent(uOldRight);
if (uOldParentLeft == uOldParentRight)
NewNodeIndexToOldNodeIndex[uNewNodeIndex] = uOldParentLeft;
else
NewNodeIndexToOldNodeIndex[uNewNodeIndex] = NODE_CHANGED;
}
#if TRACE
{
Log("NewToOld ");
for (unsigned uNewNodeIndex = 0; uNewNodeIndex < uNodeCount; ++uNewNodeIndex)
{
Log(" [%3u]=", uNewNodeIndex);
if (NODE_CHANGED == NewNodeIndexToOldNodeIndex[uNewNodeIndex])
Log(" X");
else
Log("%3u", NewNodeIndexToOldNodeIndex[uNewNodeIndex]);
if ((uNewNodeIndex+1)%8 == 0)
Log("\n ");
}
//.........这里部分代码省略.........
示例11: DiffTrees
//.........这里部分代码省略.........
// this node as a bachelor and continue.
unsigned uLeft1 = Tree1.GetLeft(uNodeIndex1);
if (bIsBachelor1[uLeft1])
{
bIsBachelor1[uNodeIndex1] = true;
continue;
}
unsigned uRight1 = Tree1.GetRight(uNodeIndex1);
if (bIsBachelor1[uRight1])
{
bIsBachelor1[uNodeIndex1] = true;
continue;
}
// Both children are married.
// Married nodes are guaranteed to have an id.
unsigned uIdLeft = NodeIndexToId1[uLeft1];
unsigned uIdRight = NodeIndexToId1[uRight1];
if (uIdLeft == uNodeCount || uIdRight == uNodeCount)
Quit("DiffTrees, check 5");
// uLeft2 is the spouse of uLeft1, and similarly for uRight2.
unsigned uLeft2 = IdToNodeIndex2[uIdLeft];
unsigned uRight2 = IdToNodeIndex2[uIdRight];
if (uLeft2 == uNodeCount || uRight2 == uNodeCount)
Quit("DiffTrees, check 6");
// If the spouses of uLeft1 and uRight1 have the same
// parent, then this parent is the spouse of uNodeIndex1.
// Otherwise, uNodeIndex1 is a diff.
unsigned uParentLeft2 = Tree2.GetParent(uLeft2);
unsigned uParentRight2 = Tree2.GetParent(uRight2);
#if TRACE
Log("L1=%u R1=%u L2=%u R2=%u PL2=%u PR2=%u\n",
uLeft1,
uRight1,
uLeft2,
uRight2,
uParentLeft2,
uParentRight2);
#endif
if (uParentLeft2 == uParentRight2)
{
NodeIndexToId1[uNodeIndex1] = uInternalNodeId;
IdToNodeIndex2[uInternalNodeId] = uParentLeft2;
++uInternalNodeId;
}
else
bIsBachelor1[uNodeIndex1] = true;
}
unsigned uDiffCount = 0;
for (unsigned uNodeIndex = 0; uNodeIndex < uNodeCount; ++uNodeIndex)
{
if (bIsBachelor1[uNodeIndex])
continue;
if (Tree1.IsRoot(uNodeIndex))
{
// Special case: if no bachelors, consider the
// root a diff.
if (!bIsBachelor1[uNodeIndex])