Skip to content
Snippets Groups Projects
Commit 907df317 authored by Zack Galbreath's avatar Zack Galbreath
Browse files

improve performance when reading a large Newick tree

Use vtkTreeDFSIterator when calculating the node weights of a tree
ready by vtkNewickTreeReader.  For a sample tree with 63498 vertices,
this change improves read time from 70.47s to 4.14s

Change-Id: I0e35ff89ce207657a958cf606a85984aa8ee3de0
parent 0b20a7ba
Branches
Tags
No related merge requests found
......@@ -774,25 +774,28 @@ vtkTree* vtkRAdapter::RToVTKTree(SEXP variable)
trueWeights->SetNumberOfTuples(tree->GetNumberOfVertices());
double maxWeight = 0.0;
for (vtkIdType vertex = 0; vertex < tree->GetNumberOfVertices(); ++vertex)
{
double weight = 0.0;
vtkIdType node = vertex;
vtkIdType parent = tree->GetParent(node);
while (parent != -1)
{
weight += weights->GetValue(tree->GetEdgeId(parent, node));
node = parent;
parent = tree->GetParent(node);
}
vtkNew<vtkTreeDFSIterator> treeIterator;
treeIterator->SetStartVertex(tree->GetRoot());
treeIterator->SetTree(tree);
while (treeIterator->HasNext())
{
vtkIdType vertex = treeIterator->Next();
vtkIdType parent = tree->GetParent(vertex);
double weight = 0.0;
if (parent >= 0)
{
weight = weights->GetValue(tree->GetEdgeId(parent, vertex));
}
weight += nodeWeights->GetValue(parent);
if (weight > maxWeight)
{
maxWeight = weight;
}
nodeWeights->SetValue(vertex, weight);
trueWeights->SetValue(vertex, weight);
if (weight > maxWeight)
{
maxWeight = weight;
}
nodeWeights->SetValue(vertex, weight);
trueWeights->SetValue(vertex, weight);
}
for (vtkIdType vertex = 0; vertex < tree->GetNumberOfVertices(); ++vertex)
{
if (tree->IsLeaf(vertex))
......@@ -800,7 +803,6 @@ vtkTree* vtkRAdapter::RToVTKTree(SEXP variable)
nodeWeights->SetValue(vertex, maxWeight);
}
}
nodeWeights->SetName("node weight");
tree->GetVertexData()->AddArray(nodeWeights.GetPointer());
......
......@@ -21,6 +21,7 @@
#include "vtkFieldData.h"
#include "vtkNew.h"
#include "vtkTree.h"
#include "vtkTreeDFSIterator.h"
#include "vtkInformation.h"
#include "vtkInformationVector.h"
#include "vtkMutableDirectedGraph.h"
......@@ -140,25 +141,28 @@ int vtkNewickTreeReader:: ReadNewickTree( char * const buffer, vtkTree & tree)
//set node weights
double maxWeight = 0.0;
for (vtkIdType vertex = 0; vertex < tree.GetNumberOfVertices(); ++vertex)
vtkNew<vtkTreeDFSIterator> treeIterator;
treeIterator->SetStartVertex(tree.GetRoot());
treeIterator->SetTree(&tree);
while (treeIterator->HasNext())
{
double weight = 0.0;
vtkIdType node = vertex;
vtkIdType parent = tree.GetParent(node);
while (parent != -1)
{
weight += weights->GetValue(tree.GetEdgeId(parent, node));
node = parent;
parent = tree.GetParent(node);
}
if (weight > maxWeight)
{
maxWeight = weight;
}
nodeWeights->SetValue(vertex, weight);
trueWeights->SetValue(vertex, weight);
vtkIdType vertex = treeIterator->Next();
vtkIdType parent = tree.GetParent(vertex);
double weight = 0.0;
if (parent >= 0)
{
weight = weights->GetValue(tree.GetEdgeId(parent, vertex));
}
weight += nodeWeights->GetValue(parent);
if (weight > maxWeight)
{
maxWeight = weight;
}
nodeWeights->SetValue(vertex, weight);
trueWeights->SetValue(vertex, weight);
}
for (vtkIdType vertex = 0; vertex < tree.GetNumberOfVertices(); ++vertex)
{
if (tree.IsLeaf(vertex))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment