Removed RectangleTree::Points()

This commit is contained in:
Mikhail Lozhnikov
2016-06-28 00:38:37 +03:00
parent 9dd66c7312
commit 707efdc2a6
10 changed files with 62 additions and 79 deletions
@@ -67,14 +67,14 @@ DualTreeTraverser<RuleType>::Traverse(RectangleTree& queryNode,
{
// Restore the traversal information.
rule.TraversalInfo() = traversalInfo;
const double childScore = rule.Score(queryNode.Points()[query],
const double childScore = rule.Score(queryNode.Point(query),
referenceNode);
if (childScore == DBL_MAX)
continue; // We don't require a search in this reference node.
for(size_t ref = 0; ref < referenceNode.Count(); ++ref)
rule.BaseCase(queryNode.Points()[query], referenceNode.Points()[ref]);
rule.BaseCase(queryNode.Point(query), referenceNode.Point(ref));
numBaseCases += referenceNode.Count();
}
@@ -47,10 +47,10 @@ HandlePointInsertion(TreeType* node, const size_t point)
// Move points.
for (size_t i = node->NumPoints(); i > pos; i--)
node->Points()[i] = node->Points()[i - 1];
node->Point(i) = node->Point(i - 1);
// Insert the point.
node->Points()[pos] = point;
node->Point(pos) = point;
node->Count()++;
}
else
@@ -105,7 +105,7 @@ HandlePointDeletion(TreeType* node, const size_t localIndex)
hilbertValue.DeletePoint(node,localIndex);
for (size_t i = localIndex + 1; localIndex < node->NumPoints(); i++)
node->Points()[i - 1] = node->Points()[i];
node->Point(i - 1) = node->Point(i);
node->NumPoints()--;
return true;
@@ -284,7 +284,7 @@ RedistributePointsEvenly(TreeType* parent,
for (size_t i = firstSibling; i <= lastSibling; i++)
{
for (size_t j = 0; j < parent->Children()[i]->NumPoints(); j++)
points[iPoint++] = parent->Children()[i]->Points()[j];
points[iPoint++] = parent->Children()[i]->Point(j);
}
iPoint = 0;
@@ -298,13 +298,13 @@ RedistributePointsEvenly(TreeType* parent,
for (j = 0; j < numPointsPerNode; j++)
{
parent->Children()[i]->Bound() |= parent->Dataset().col(points[iPoint]);
parent->Children()[i]->Points()[j] = points[iPoint];
parent->Children()[i]->Point(j) = points[iPoint];
iPoint++;
}
if (numRestPoints > 0)
{
parent->Children()[i]->Bound() |= parent->Dataset().col(points[iPoint]);
parent->Children()[i]->Points()[j] = points[iPoint];
parent->Children()[i]->Point(j) = points[iPoint];
parent->Children()[i]->Count() = numPointsPerNode + 1;
numRestPoints--;
iPoint++;
@@ -78,9 +78,9 @@ void RStarTreeSplit::SplitLeafNode(TreeType *tree,std::vector<bool>& relevels)
for (size_t i = 0; i < p; i++)
{
// We start from the end of sorted.
pointIndices[i] = tree->Points()[sorted[sorted.size() - 1 - i].n];
pointIndices[i] = tree->Point(sorted[sorted.size() - 1 - i].n);
root->DeletePoint(tree->Points()[sorted[sorted.size() - 1 - i].n],
root->DeletePoint(tree->Point(sorted[sorted.size() - 1 - i].n),
relevels);
}
@@ -224,9 +224,9 @@ void RStarTreeSplit::SplitLeafNode(TreeType *tree,std::vector<bool>& relevels)
for (size_t i = 0; i < tree->Count(); i++)
{
if (i < bestAreaIndexOnBestAxis + tree->MinLeafSize())
treeOne->InsertPoint(tree->Points()[sorted[i].n]);
treeOne->InsertPoint(tree->Point(sorted[i].n));
else
treeTwo->InsertPoint(tree->Points()[sorted[i].n]);
treeTwo->InsertPoint(tree->Point(sorted[i].n));
}
}
else
@@ -234,9 +234,9 @@ void RStarTreeSplit::SplitLeafNode(TreeType *tree,std::vector<bool>& relevels)
for (size_t i = 0; i < tree->Count(); i++)
{
if (i < bestOverlapIndexOnBestAxis + tree->MinLeafSize())
treeOne->InsertPoint(tree->Points()[sorted[i].n]);
treeOne->InsertPoint(tree->Point(sorted[i].n));
else
treeTwo->InsertPoint(tree->Points()[sorted[i].n]);
treeTwo->InsertPoint(tree->Point(sorted[i].n));
}
}
@@ -199,10 +199,10 @@ void RTreeSplit::GetBoundSeeds(const TreeType *tree,int& iRet, int& jRet)
ElemType score = 1.0;
for (size_t k = 0; k < tree->Bound().Dim(); k++)
{
const ElemType hiMax = std::max(tree->Children()[i]->Bound()[k].Hi(),
tree->Children()[j]->Bound()[k].Hi());
const ElemType loMin = std::min(tree->Children()[i]->Bound()[k].Lo(),
tree->Children()[j]->Bound()[k].Lo());
const ElemType hiMax = std::max(tree->Child(i).Bound()[k].Hi(),
tree->Child(j).Bound()[k].Hi());
const ElemType loMin = std::min(tree->Child(i).Bound()[k].Lo(),
tree->Child(j).Bound()[k].Lo());
score *= (hiMax - loMin);
}
@@ -235,20 +235,20 @@ void RTreeSplit::AssignPointDestNode(TreeType* oldTree,
treeOne->Count() = 0;
treeTwo->Count() = 0;
treeOne->InsertPoint(oldTree->Points()[intI]);
treeTwo->InsertPoint(oldTree->Points()[intJ]);
treeOne->InsertPoint(oldTree->Point(intI));
treeTwo->InsertPoint(oldTree->Point(intJ));
// If intJ is the last point in the tree, we need to switch the order so that
// we remove the correct points.
if (intI > intJ)
{
oldTree->Points()[intI] = oldTree->Points()[--end]; // Decrement end.
oldTree->Points()[intJ] = oldTree->Points()[--end]; // Decrement end.
oldTree->Point(intI) = oldTree->Point(--end); // Decrement end.
oldTree->Point(intJ) = oldTree->Point(--end); // Decrement end.
}
else
{
oldTree->Points()[intJ] = oldTree->Points()[--end]; // Decrement end.
oldTree->Points()[intI] = oldTree->Points()[--end]; // Decrement end.
oldTree->Point(intJ) = oldTree->Point(--end); // Decrement end.
oldTree->Point(intI) = oldTree->Point(--end); // Decrement end.
}
size_t numAssignedOne = 1;
@@ -324,16 +324,16 @@ void RTreeSplit::AssignPointDestNode(TreeType* oldTree,
// to the appropriate rectangle.
if (bestRect == 1)
{
treeOne->InsertPoint(oldTree->Points()[bestIndex]);
treeOne->InsertPoint(oldTree->Point(bestIndex));
numAssignedOne++;
}
else
{
treeTwo->InsertPoint(oldTree->Points()[bestIndex]);
treeTwo->InsertPoint(oldTree->Point(bestIndex));
numAssignedTwo++;
}
oldTree->Points()[bestIndex] = oldTree->Points()[--end]; // Decrement end.
oldTree->Point(bestIndex) = oldTree->Point(--end); // Decrement end.
}
// See if we need to satisfy the minimum fill.
@@ -342,12 +342,12 @@ void RTreeSplit::AssignPointDestNode(TreeType* oldTree,
if (numAssignedOne < numAssignedTwo)
{
for (size_t i = 0; i < end; i++)
treeOne->InsertPoint(oldTree->Points()[i]);
treeOne->InsertPoint(oldTree->Point(i));
}
else
{
for (size_t i = 0; i < end; i++)
treeTwo->InsertPoint(oldTree->Points()[i]);
treeTwo->InsertPoint(oldTree->Point(i));
}
}
}
@@ -432,7 +432,7 @@ void RTreeSplit::AssignNodeDestNode(TreeType* oldTree,
// For each of the new rectangles, find the width in this dimension if
// we add the rectangle at index to the new rectangle.
const math::RangeType<ElemType>& range =
oldTree->Children()[index]->Bound()[i];
oldTree->Child(index).Bound()[i];
newVolOne *= treeOne->Bound()[i].Contains(range) ?
treeOne->Bound()[i].Width() : (range.Contains(treeOne->Bound()[i]) ?
range.Width() : (range.Lo() < treeOne->Bound()[i].Lo() ?
@@ -328,11 +328,6 @@ class RectangleTree
//! Modify the dataset which the tree is built on. Be careful!
MatType& Dataset() { return const_cast<MatType&>(*dataset); }
//! Get the points vector for this node.
const std::vector<size_t>& Points() const { return points; }
//! Modify the points vector for this node. Be careful!
std::vector<size_t>& Points() { return points; }
//! Get the metric which the tree uses.
MetricType Metric() const { return MetricType(); }
@@ -424,7 +419,10 @@ class RectangleTree
*
* @param index Index of point for which a dataset index is wanted.
*/
size_t Point(const size_t index) const;
const size_t& Point(const size_t index) const { return points[index]; }
//! Modify the index of a particular point in this node.
size_t& Point(const size_t index) { return points[index]; }
//! Return the minimum distance to another node.
ElemType MinDistance(const RectangleTree* other) const
@@ -154,7 +154,7 @@ RectangleTree(
parentDistance(other.ParentDistance()),
dataset(deepCopy ? new MatType(*other.dataset) : &other.Dataset()),
ownsDataset(deepCopy),
points(other.Points()),
points(other.points),
auxiliaryInfo(other.auxiliaryInfo)
{
if (deepCopy)
@@ -659,21 +659,6 @@ inline size_t RectangleTree<MetricType, StatisticType, MatType, SplitType,
}
}
/**
* Return the index of a particular point contained in this node.
*/
template<typename MetricType,
typename StatisticType,
typename MatType,
typename SplitType,
typename DescentType,
template<typename> class AuxiliaryInformationType>
inline size_t RectangleTree<MetricType, StatisticType, MatType, SplitType,
DescentType, AuxiliaryInformationType>::Point(const size_t index) const
{
return points[index];
}
/**
* Split the tree. This calls the SplitType code to split a node. This method
* should only be called on a leaf node.
@@ -878,7 +863,7 @@ void RectangleTree<MetricType, StatisticType, MatType, SplitType, DescentType,
for (size_t i = 0; i < child->Count(); i++)
{
// In case the tree has a height of two.
points[i] = child->Points()[i];
points[i] = child->Point(i);
}
auxiliaryInfo = child->AuxiliaryInfo();
@@ -49,7 +49,7 @@ SingleTreeTraverser<RuleType>::Traverse(
if (referenceNode.IsLeaf())
{
for (size_t i = 0; i < referenceNode.Count(); i++)
rule.BaseCase(queryIndex, referenceNode.Points()[i]);
rule.BaseCase(queryIndex, referenceNode.Point(i));
return;
}
@@ -67,7 +67,7 @@ void XTreeSplit::SplitLeafNode(TreeType *tree,std::vector<bool>& relevels)
for (size_t i = 0; i < sorted.size(); i++)
{
sorted[i].d = tree->Metric().Evaluate(center,
tree->Dataset().col(tree->Points()[i]));
tree->Dataset().col(tree->Point(i)));
sorted[i].n = i;
}
@@ -77,9 +77,9 @@ void XTreeSplit::SplitLeafNode(TreeType *tree,std::vector<bool>& relevels)
for (size_t i = 0; i < p; i++)
{
// We start from the end of sorted.
pointIndices[i] = tree->Points()[sorted[sorted.size() - 1 - i].n];
pointIndices[i] = tree->Point(sorted[sorted.size() - 1 - i].n);
root->DeletePoint(tree->Points()[sorted[sorted.size() - 1 - i].n],
root->DeletePoint(tree->Point(sorted[sorted.size() - 1 - i].n),
relevels);
}
@@ -115,7 +115,7 @@ void XTreeSplit::SplitLeafNode(TreeType *tree,std::vector<bool>& relevels)
// Since we only have points in the leaf nodes, we only need to sort once.
std::vector<sortStruct<ElemType>> sorted(tree->Count());
for (size_t i = 0; i < sorted.size(); i++) {
sorted[i].d = tree->Dataset().col(tree->Points()[i])[j];
sorted[i].d = tree->Dataset().col(tree->Point(i))[j];
sorted[i].n = i;
}
@@ -148,25 +148,25 @@ void XTreeSplit::SplitLeafNode(TreeType *tree,std::vector<bool>& relevels)
std::vector<ElemType> minG2(maxG1.size());
for (size_t k = 0; k < tree->Bound().Dim(); k++)
{
minG1[k] = maxG1[k] = tree->Dataset().col(tree->Points()[sorted[0].n])[k];
minG1[k] = maxG1[k] = tree->Dataset().col(tree->Point(sorted[0].n))[k];
minG2[k] = maxG2[k] = tree->Dataset().col(
tree->Points()[sorted[sorted.size() - 1].n])[k];
tree->Point(sorted[sorted.size() - 1].n))[k];
for (size_t l = 1; l < tree->Count() - 1; l++)
{
if (l < cutOff)
{
if (tree->Dataset().col(tree->Points()[sorted[l].n])[k] < minG1[k])
minG1[k] = tree->Dataset().col(tree->Points()[sorted[l].n])[k];
else if (tree->Dataset().col(tree->Points()[sorted[l].n])[k] > maxG1[k])
maxG1[k] = tree->Dataset().col(tree->Points()[sorted[l].n])[k];
if (tree->Dataset().col(tree->Point(sorted[l].n))[k] < minG1[k])
minG1[k] = tree->Dataset().col(tree->Point(sorted[l].n))[k];
else if (tree->Dataset().col(tree->Point(sorted[l].n))[k] > maxG1[k])
maxG1[k] = tree->Dataset().col(tree->Point(sorted[l].n))[k];
}
else
{
if (tree->Dataset().col(tree->Points()[sorted[l].n])[k] < minG2[k])
minG2[k] = tree->Dataset().col(tree->Points()[sorted[l].n])[k];
else if (tree->Dataset().col(tree->Points()[sorted[l].n])[k] > maxG2[k])
maxG2[k] = tree->Dataset().col(tree->Points()[sorted[l].n])[k];
if (tree->Dataset().col(tree->Point(sorted[l].n))[k] < minG2[k])
minG2[k] = tree->Dataset().col(tree->Point(sorted[l].n))[k];
else if (tree->Dataset().col(tree->Point(sorted[l].n))[k] > maxG2[k])
maxG2[k] = tree->Dataset().col(tree->Point(sorted[l].n))[k];
}
}
}
@@ -214,7 +214,7 @@ void XTreeSplit::SplitLeafNode(TreeType *tree,std::vector<bool>& relevels)
std::vector<sortStruct<ElemType>> sorted(tree->Count());
for (size_t i = 0; i < sorted.size(); i++)
{
sorted[i].d = tree->Dataset().col(tree->Points()[i])[bestAxis];
sorted[i].d = tree->Dataset().col(tree->Point(i))[bestAxis];
sorted[i].n = i;
}
@@ -233,9 +233,9 @@ void XTreeSplit::SplitLeafNode(TreeType *tree,std::vector<bool>& relevels)
for (size_t i = 0; i < tree->Count(); i++)
{
if (i < bestAreaIndexOnBestAxis + tree->MinLeafSize())
treeOne->InsertPoint(tree->Points()[sorted[i].n]);
treeOne->InsertPoint(tree->Point(sorted[i].n));
else
treeTwo->InsertPoint(tree->Points()[sorted[i].n]);
treeTwo->InsertPoint(tree->Point(sorted[i].n));
}
}
else
@@ -243,9 +243,9 @@ void XTreeSplit::SplitLeafNode(TreeType *tree,std::vector<bool>& relevels)
for (size_t i = 0; i < tree->Count(); i++)
{
if (i < bestOverlapIndexOnBestAxis + tree->MinLeafSize())
treeOne->InsertPoint(tree->Points()[sorted[i].n]);
treeOne->InsertPoint(tree->Point(sorted[i].n));
else
treeTwo->InsertPoint(tree->Points()[sorted[i].n]);
treeTwo->InsertPoint(tree->Point(sorted[i].n));
}
}
+6 -6
View File
@@ -77,7 +77,7 @@ std::vector<arma::vec*> GetAllPointsInTree(const TreeType& tree)
{
for (size_t i = 0; i < tree.Count(); i++)
{
arma::vec* c = new arma::vec(tree.Dataset().col(tree.Points()[i]));
arma::vec* c = new arma::vec(tree.Dataset().col(tree.Point(i)));
vec.push_back(c);
}
}
@@ -130,7 +130,7 @@ void CheckContainment(const TreeType& tree)
{
for (size_t i = 0; i < tree.Count(); i++)
BOOST_REQUIRE(tree.Bound().Contains(
tree.Dataset().unsafe_col(tree.Points()[i])));
tree.Dataset().unsafe_col(tree.Point(i))));
}
else
{
@@ -159,9 +159,9 @@ void CheckExactContainment(const TreeType& tree)
for(size_t j = 0; j < tree.Count(); j++)
{
if (tree.Dataset().col(tree.Point(j))[i] < min)
min = tree.Dataset().col(tree.Points()[j])[i];
min = tree.Dataset().col(tree.Point(j))[i];
if (tree.Dataset().col(tree.Point(j))[i] > max)
max = tree.Dataset().col(tree.Points()[j])[i];
max = tree.Dataset().col(tree.Point(j))[i];
}
BOOST_REQUIRE_EQUAL(max, tree.Bound()[i].Hi());
BOOST_REQUIRE_EQUAL(min, tree.Bound()[i].Lo());
@@ -619,7 +619,7 @@ void CheckHilbertOrdering(const TreeType& tree)
0);
BOOST_REQUIRE_EQUAL(tree.AuxiliaryInfo().HilbertValue().CompareWith(
tree.Dataset().col(tree.Points()[tree.NumPoints() - 1])),
tree.Dataset().col(tree.Point(tree.NumPoints() - 1))),
0);
}
else
@@ -665,7 +665,7 @@ void CheckDiscreteHilbertValueSync(const TreeType& tree)
for (size_t i = 0; i < tree.NumPoints(); i++)
{
arma::Col<HilbertElemType> pointValue =
HilbertValue::CalculateValue(tree.Dataset().col(tree.Points()[i]));
HilbertValue::CalculateValue(tree.Dataset().col(tree.Point(i)));
const int equal = HilbertValue::CompareValues(
value.LocalHilbertValues()->col(i), pointValue);