本文整理汇总了C++中CoverTree::Child方法的典型用法代码示例。如果您正苦于以下问题:C++ CoverTree::Child方法的具体用法?C++ CoverTree::Child怎么用?C++ CoverTree::Child使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CoverTree
的用法示例。
在下文中一共展示了CoverTree::Child方法的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: RemoveNewImplicitNodes
inline void CoverTree<MetricType, StatisticType, MatType, RootPointPolicy>::
RemoveNewImplicitNodes()
{
// If we created an implicit node, take its self-child instead (this could
// happen multiple times).
while (children[children.size() - 1]->NumChildren() == 1)
{
CoverTree* old = children[children.size() - 1];
children.erase(children.begin() + children.size() - 1);
// Now take its child.
children.push_back(&(old->Child(0)));
// Set its parent and parameters correctly, and rebuild the statistic.
old->Child(0).Parent() = this;
old->Child(0).ParentDistance() = old->ParentDistance();
old->Child(0).DistanceComps() = old->DistanceComps();
old->Child(0).Stat() = StatisticType(old->Child(0));
// Remove its child (so it doesn't delete it).
old->Children().erase(old->Children().begin() + old->Children().size() - 1);
// Now delete it.
delete old;
}
}
示例2: MatType
CoverTree<MetricType, StatisticType, MatType, RootPointPolicy>::CoverTree(
const CoverTree& other) :
dataset((other.parent == NULL && other.localDataset) ?
new MatType(*other.dataset) : other.dataset),
point(other.point),
scale(other.scale),
base(other.base),
stat(other.stat),
numDescendants(other.numDescendants),
parent(other.parent),
parentDistance(other.parentDistance),
furthestDescendantDistance(other.furthestDescendantDistance),
localMetric(false),
localDataset(other.parent == NULL && other.localDataset),
metric(other.metric),
distanceComps(0)
{
// Copy each child by hand.
for (size_t i = 0; i < other.NumChildren(); ++i)
{
children.push_back(new CoverTree(other.Child(i)));
children[i]->Parent() = this;
}
// Propagate matrix, but only if we are the root.
if (parent == NULL && localDataset)
{
std::queue<CoverTree*> queue;
for (size_t i = 0; i < NumChildren(); ++i)
queue.push(children[i]);
while (!queue.empty())
{
CoverTree* node = queue.front();
queue.pop();
node->dataset = dataset;
for (size_t i = 0; i < node->NumChildren(); ++i)
queue.push(node->children[i]);
}
}
}
示例3: dataset
CoverTree<MetricType, StatisticType, MatType, RootPointPolicy>::CoverTree(
const CoverTree& other) :
dataset((other.parent == NULL) ? new MatType(*other.dataset) : NULL),
point(other.point),
scale(other.scale),
base(other.base),
stat(other.stat),
numDescendants(other.numDescendants),
parent(other.parent),
parentDistance(other.parentDistance),
furthestDescendantDistance(other.furthestDescendantDistance),
localMetric(false),
localDataset(other.parent == NULL),
metric(other.metric),
distanceComps(0)
{
// Copy each child by hand.
for (size_t i = 0; i < other.NumChildren(); ++i)
{
children.push_back(new CoverTree(other.Child(i)));
children[i]->Parent() = this;
children[i]->dataset = this->dataset;
}
}
示例4: while
void CoverTree<MetricType, StatisticType, MatType, RootPointPolicy>::
SingleTreeTraverser<RuleType>::Traverse(
const size_t queryIndex,
CoverTree& referenceNode)
{
// This is a non-recursive implementation (which should be faster than a
// recursive implementation).
typedef CoverTreeMapEntry<MetricType, StatisticType, MatType, RootPointPolicy>
MapEntryType;
// We will use this map as a priority queue. Each key represents the scale,
// and then the vector is all the nodes in that scale which need to be
// investigated. Because no point in a scale can add a point in its own
// scale, we know that the vector for each scale is final when we get to it.
// In addition, map is organized in such a way that rbegin() will return the
// largest scale.
std::map<int, std::vector<MapEntryType> > mapQueue;
// Create the score for the children.
double rootChildScore = rule.Score(queryIndex, referenceNode);
if (rootChildScore == DBL_MAX)
{
numPrunes += referenceNode.NumChildren();
}
else
{
// Manually add the children of the first node.
// Often, a ruleset will return without doing any computation on cover trees
// using TreeTraits::FirstPointIsCentroid; this is an optimization that
// (theoretically) the compiler should get right.
double rootBaseCase = rule.BaseCase(queryIndex, referenceNode.Point());
// Don't add the self-leaf.
size_t i = 0;
if (referenceNode.Child(0).NumChildren() == 0)
{
++numPrunes;
i = 1;
}
for (/* i was set above. */; i < referenceNode.NumChildren(); ++i)
{
MapEntryType newFrame;
newFrame.node = &referenceNode.Child(i);
newFrame.score = rootChildScore;
newFrame.baseCase = rootBaseCase;
newFrame.parent = referenceNode.Point();
// Put it into the map.
mapQueue[newFrame.node->Scale()].push_back(newFrame);
}
}
// Now begin the iteration through the map, but only if it has anything in it.
if (mapQueue.empty())
return;
typename std::map<int, std::vector<MapEntryType> >::reverse_iterator rit =
mapQueue.rbegin();
// We will treat the leaves differently (below).
while ((*rit).first != INT_MIN)
{
// Get a reference to the current scale.
std::vector<MapEntryType>& scaleVector = (*rit).second;
// Before traversing all the points in this scale, sort by score.
std::sort(scaleVector.begin(), scaleVector.end());
// Now loop over each element.
for (size_t i = 0; i < scaleVector.size(); ++i)
{
// Get a reference to the current element.
const MapEntryType& frame = scaleVector.at(i);
CoverTree* node = frame.node;
const double score = frame.score;
const size_t parent = frame.parent;
const size_t point = node->Point();
double baseCase = frame.baseCase;
// First we recalculate the score of this node to find if we can prune it.
if (rule.Rescore(queryIndex, *node, score) == DBL_MAX)
{
++numPrunes;
continue;
}
// Create the score for the children.
const double childScore = rule.Score(queryIndex, *node);
// Now if this childScore is DBL_MAX we can prune all children. In this
// recursion setup pruning is all or nothing for children.
if (childScore == DBL_MAX)
{
numPrunes += node->NumChildren();
continue;
}
// If we are a self-child, the base case has already been evaluated.
//.........这里部分代码省略.........
示例5: distances
CoverTree<MetricType, StatisticType, MatType, RootPointPolicy>::CoverTree(
MatType&& data,
MetricType& metric,
const ElemType base) :
dataset(new MatType(std::move(data))),
point(RootPointPolicy::ChooseRoot(dataset)),
scale(INT_MAX),
base(base),
numDescendants(0),
parent(NULL),
parentDistance(0),
furthestDescendantDistance(0),
localMetric(false),
localDataset(true),
metric(&metric),
distanceComps(0)
{
// If there is only one point or zero points in the dataset... uh, we're done.
// Technically, if the dataset has zero points, our node is not correct...
if (dataset->n_cols <= 1)
return;
// Kick off the building. Create the indices array and the distances array.
arma::Col<size_t> indices = arma::linspace<arma::Col<size_t> >(1,
dataset->n_cols - 1, dataset->n_cols - 1);
// This is now [1 2 3 4 ... n]. We must be sure that our point does not
// occur.
if (point != 0)
indices[point - 1] = 0; // Put 0 back into the set; remove what was there.
arma::vec distances(dataset->n_cols - 1);
// Build the initial distances.
ComputeDistances(point, indices, distances, dataset->n_cols - 1);
// Create the children.
size_t farSetSize = 0;
size_t usedSetSize = 0;
CreateChildren(indices, distances, dataset->n_cols - 1, farSetSize,
usedSetSize);
// If we ended up creating only one child, remove the implicit node.
while (children.size() == 1)
{
// Prepare to delete the implicit child node.
CoverTree* old = children[0];
// Now take its children and set their parent correctly.
children.erase(children.begin());
for (size_t i = 0; i < old->NumChildren(); ++i)
{
children.push_back(&(old->Child(i)));
// Set its parent correctly, and rebuild the statistic.
old->Child(i).Parent() = this;
old->Child(i).Stat() = StatisticType(old->Child(i));
}
// Remove all the children so they don't get erased.
old->Children().clear();
// Reduce our own scale.
scale = old->Scale();
// Now delete it.
delete old;
}
// Use the furthest descendant distance to determine the scale of the root
// node.
scale = (int) ceil(log(furthestDescendantDistance) / log(base));
// Initialize statistic.
stat = StatisticType(*this);
Log::Info << distanceComps << " distance computations during tree "
<< "construction." << std::endl;
}
示例6: ReferenceRecursion
void CoverTree<MetricType, RootPointPolicy, StatisticType>::
DualTreeTraverser<RuleType>::Traverse(
CoverTree<MetricType, RootPointPolicy, StatisticType>& queryNode,
std::map<int, std::vector<DualCoverTreeMapEntry> >& referenceMap)
{
if (referenceMap.size() == 0)
return; // Nothing to do!
// First recurse down the reference nodes as necessary.
ReferenceRecursion(queryNode, referenceMap);
// Did the map get emptied?
if (referenceMap.size() == 0)
return; // Nothing to do!
// Now, reduce the scale of the query node by recursing. But we can't recurse
// if the query node is a leaf node.
if ((queryNode.Scale() != INT_MIN) &&
(queryNode.Scale() >= (*referenceMap.rbegin()).first))
{
// Recurse into the non-self-children first. The recursion order cannot
// affect the runtime of the algorithm, because each query child recursion's
// results are separate and independent. I don't think this is true in
// every case, and we may have to modify this section to consider scores in
// the future.
for (size_t i = 1; i < queryNode.NumChildren(); ++i)
{
// We need a copy of the map for this child.
std::map<int, std::vector<DualCoverTreeMapEntry> > childMap;
PruneMap(queryNode.Child(i), referenceMap, childMap);
Traverse(queryNode.Child(i), childMap);
}
std::map<int, std::vector<DualCoverTreeMapEntry> > selfChildMap;
PruneMap(queryNode.Child(0), referenceMap, selfChildMap);
Traverse(queryNode.Child(0), selfChildMap);
}
if (queryNode.Scale() != INT_MIN)
return; // No need to evaluate base cases at this level. It's all done.
// If we have made it this far, all we have is a bunch of base case
// evaluations to do.
Log::Assert((*referenceMap.begin()).first == INT_MIN);
Log::Assert(queryNode.Scale() == INT_MIN);
std::vector<DualCoverTreeMapEntry>& pointVector =
(*referenceMap.begin()).second;
for (size_t i = 0; i < pointVector.size(); ++i)
{
// Get a reference to the frame.
const DualCoverTreeMapEntry& frame = pointVector[i];
CoverTree<MetricType, RootPointPolicy, StatisticType>* refNode =
frame.referenceNode;
// If the point is the same as both parents, then we have already done this
// base case.
if ((refNode->Point() == refNode->Parent()->Point()) &&
(queryNode.Point() == queryNode.Parent()->Point()))
{
++numPrunes;
continue;
}
// Score the node, to see if we can prune it, after restoring the traversal
// info.
rule.TraversalInfo() = frame.traversalInfo;
double score = rule.Score(queryNode, *refNode);
if (score == DBL_MAX)
{
++numPrunes;
continue;
}
// If not, compute the base case.
rule.BaseCase(queryNode.Point(), pointVector[i].referenceNode->Point());
}
}
示例7: while
void CoverTree<MetricType, RootPointPolicy, StatisticType>::
DualTreeTraverser<RuleType>::ReferenceRecursion(
CoverTree& queryNode,
std::map<int, std::vector<DualCoverTreeMapEntry> >& referenceMap)
{
// First, reduce the maximum scale in the reference map down to the scale of
// the query node.
while (!referenceMap.empty())
{
// Hacky bullshit to imitate jl cover tree.
if (queryNode.Parent() == NULL && (*referenceMap.rbegin()).first <
queryNode.Scale())
break;
if (queryNode.Parent() != NULL && (*referenceMap.rbegin()).first <=
queryNode.Scale())
break;
// If the query node's scale is INT_MIN and the reference map's maximum
// scale is INT_MIN, don't try to recurse...
if ((queryNode.Scale() == INT_MIN) &&
((*referenceMap.rbegin()).first == INT_MIN))
break;
// Get a reference to the current largest scale.
std::vector<DualCoverTreeMapEntry>& scaleVector = (*referenceMap.rbegin()).second;
// Before traversing all the points in this scale, sort by score.
std::sort(scaleVector.begin(), scaleVector.end());
// Now loop over each element.
for (size_t i = 0; i < scaleVector.size(); ++i)
{
// Get a reference to the current element.
const DualCoverTreeMapEntry& frame = scaleVector.at(i);
CoverTree<MetricType, RootPointPolicy, StatisticType>* refNode =
frame.referenceNode;
// Create the score for the children.
double score = rule.Rescore(queryNode, *refNode, frame.score);
// Now if this childScore is DBL_MAX we can prune all children. In this
// recursion setup pruning is all or nothing for children.
if (score == DBL_MAX)
{
++numPrunes;
continue;
}
// If it is not pruned, we must evaluate the base case.
// Add the children.
for (size_t j = 0; j < refNode->NumChildren(); ++j)
{
rule.TraversalInfo() = frame.traversalInfo;
double childScore = rule.Score(queryNode, refNode->Child(j));
if (childScore == DBL_MAX)
{
++numPrunes;
continue;
}
// It wasn't pruned; evaluate the base case.
const double baseCase = rule.BaseCase(queryNode.Point(),
refNode->Child(j).Point());
DualCoverTreeMapEntry newFrame;
newFrame.referenceNode = &refNode->Child(j);
newFrame.score = childScore; // Use the score of the parent.
newFrame.baseCase = baseCase;
newFrame.traversalInfo = rule.TraversalInfo();
referenceMap[newFrame.referenceNode->Scale()].push_back(newFrame);
}
}
// Now clear the memory for this scale; it isn't needed anymore.
referenceMap.erase((*referenceMap.rbegin()).first);
}
}