Last changes for a little while.
This commit is contained in:
@@ -165,6 +165,8 @@ bool IsDescendantOf(
|
||||
{
|
||||
if (potentialChild.Parent() == &potentialParent)
|
||||
return true;
|
||||
else if (&potentialChild == &potentialParent)
|
||||
return true;
|
||||
else if (potentialChild.Parent() == NULL)
|
||||
return false;
|
||||
else
|
||||
@@ -205,8 +207,8 @@ void DualTreeKMeans<MetricType, MatType, TreeType>::TreeUpdate(
|
||||
const bool prunedLastIteration = node->Stat().HamerlyPruned();
|
||||
node->Stat().HamerlyPruned() = false;
|
||||
|
||||
if (node->Begin() == 37408)
|
||||
Log::Warn << "r37408c" << node->Count() << " has owner " <<
|
||||
if (node->Begin() == 23058)
|
||||
Log::Warn << "r23058c" << node->Count() << " has owner " <<
|
||||
node->Stat().Owner() << ".\n";
|
||||
|
||||
// The easy case: this node had an owner.
|
||||
@@ -229,8 +231,8 @@ node->Stat().Owner() << ".\n";
|
||||
if (node->Stat().SecondClosestBound() == DBL_MAX && node->Parent() == NULL)
|
||||
node->Stat().SecondClosestBound() = 0.0; // Don't prune the root.
|
||||
|
||||
if (node->Begin() == 37408)
|
||||
Log::Warn << "r37408c" << node->Count() << " scb " <<
|
||||
if (node->Begin() == 23058)
|
||||
Log::Warn << "r23058c" << node->Count() << " scb " <<
|
||||
node->Stat().SecondClosestBound() << " and lscb " <<
|
||||
node->Stat().LastSecondClosestBound() << ".\n";
|
||||
|
||||
@@ -266,7 +268,7 @@ node->Stat().LastSecondClosestBound() << ".\n";
|
||||
// of the second closest query node of the parent.
|
||||
if (node->Stat().SecondClosestQueryNode() != NULL)
|
||||
{
|
||||
if (node->Begin() == 37408)
|
||||
if (node->Begin() == 23058)
|
||||
{
|
||||
Log::Warn << "Second closest query node is q" << ((TreeType*)
|
||||
node->Stat().SecondClosestQueryNode())->Begin() << "c" << ((TreeType*)
|
||||
@@ -278,7 +280,7 @@ node->MinDistance((TreeType*) node->Stat().SecondClosestQueryNode()) << ".\n";
|
||||
}
|
||||
|
||||
if (node->Stat().ClosestQueryNode() != NULL)
|
||||
if (node->Begin() == 37408)
|
||||
if (node->Begin() == 23058)
|
||||
Log::Warn << "Closest query node: q" << ((TreeType*)
|
||||
node->Stat().ClosestQueryNode())->Begin() << "c" << ((TreeType*)
|
||||
node->Stat().ClosestQueryNode())->Count() << ", with MQND " <<
|
||||
@@ -325,7 +327,7 @@ node->Stat().MinQueryNodeDistance() << ".\n";
|
||||
if (secondClosestDistance < node->Stat().SecondClosestBound())
|
||||
node->Stat().SecondClosestBound() = secondClosestDistance;
|
||||
|
||||
if (node->Begin() == 37408)
|
||||
if (node->Begin() == 23058)
|
||||
Log::Warn << "After recalculation, closest for r" << node->Begin() << "c" << node->Count()
|
||||
<< " is " << closest << ", with mQND " << node->Stat().MinQueryNodeDistance() <<
|
||||
", MQND" << node->Stat().MaxQueryNodeDistance() << ", and scb " <<
|
||||
@@ -334,7 +336,7 @@ node->Stat().SecondClosestBound() << ", " << secondClosest << ".\n";
|
||||
|
||||
// if (node->Parent() != NULL &&
|
||||
//node->Parent()->Stat().SecondClosestQueryNode() != NULL)
|
||||
// if (node->Begin() == 37408)
|
||||
// if (node->Begin() == 23058)
|
||||
// Log::Warn << "Parent's (r" << node->Parent()->Begin() << "c"
|
||||
//<< node->Parent()->Count() << ") second closest query node is q" << ((TreeType*)
|
||||
//node->Parent()->Stat().SecondClosestQueryNode())->Begin() << "c" << ((TreeType*)
|
||||
@@ -353,20 +355,30 @@ node->Stat().SecondClosestBound() << ", " << secondClosest << ".\n";
|
||||
(TreeType*) parent->Stat().SecondClosestQueryNode();
|
||||
TreeType* parentCqn = (parent == NULL) ? NULL :
|
||||
(TreeType*) parent->Stat().ClosestQueryNode();
|
||||
if (parentScqn != NULL && node->Begin() == 23058)
|
||||
Log::Warn << "Parent (" << parent->Begin() << "c" << parent->Count() <<
|
||||
") SCB is " << parent->Stat().SecondClosestBound() << ", "
|
||||
<< "with q" << parentScqn->Begin() << "c" << parentScqn->Count() <<
|
||||
".\n";
|
||||
if (scqn != NULL && parentScqn != NULL &&
|
||||
!IsDescendantOf(*parentScqn, *scqn) &&
|
||||
!IsDescendantOf(*parentCqn, *scqn) &&
|
||||
(parent->Stat().SecondClosestBound() <
|
||||
node->Stat().SecondClosestBound()))
|
||||
{
|
||||
if (node->Begin() == 23058)
|
||||
Log::Warn << "Take parent's SCB of " <<
|
||||
parent->Stat().SecondClosestBound() << "; parent SCQN is " <<
|
||||
parentScqn->Begin() << "c" << parentScqn->Count() << ", parent CQN is " <<
|
||||
parentCqn->Begin() << "c" << parentCqn->Count() << ".\n";
|
||||
node->Stat().SecondClosestBound() = parent->Stat().SecondClosestBound();
|
||||
node->Stat().SecondClosestQueryNode() = parentScqn;
|
||||
}
|
||||
}
|
||||
|
||||
if (node->Begin() == 37408)
|
||||
if (node->Begin() == 23058)
|
||||
{
|
||||
Log::Warn << "Attempt Hamerly prune on r37408c" << node->Count() <<
|
||||
Log::Warn << "Attempt Hamerly prune on r23058c" << node->Count() <<
|
||||
" with MQND " << node->Stat().MaxQueryNodeDistance() << ", scb "
|
||||
<< node->Stat().SecondClosestBound() << ", owner " <<
|
||||
node->Stat().Owner() << ", and clusterDistances " << clusterDistances[clusters]
|
||||
@@ -374,7 +386,7 @@ node->Stat().Owner() << ", and clusterDistances " << clusterDistances[clusters]
|
||||
}
|
||||
|
||||
// Check the second bound. (This is time-consuming...)
|
||||
/* arma::vec minDistances(centroids.n_cols);
|
||||
arma::vec minDistances(centroids.n_cols);
|
||||
for (size_t j = 0; j < node->NumDescendants(); ++j)
|
||||
{
|
||||
arma::vec distances(centroids.n_cols);
|
||||
@@ -393,8 +405,8 @@ node->Stat().Owner() << ", and clusterDistances " << clusterDistances[clusters]
|
||||
}
|
||||
|
||||
if (j == 0)
|
||||
if (node->Begin() == 37408)
|
||||
Log::Warn << "r37408c" << node->Count() << ": " << minDistances.t();
|
||||
if (node->Begin() == 23058)
|
||||
Log::Warn << "r23058c" << node->Count() << ": " << minDistances.t();
|
||||
if (secondClosestDist < node->Stat().SecondClosestBound() - 1e-15)
|
||||
{
|
||||
Log::Warn << "r" << node->Begin() << "c" << node->Count() << ":\n";
|
||||
@@ -407,7 +419,7 @@ node->Stat().SecondClosestBound() << " is too loose! -- " << secondClosestDist
|
||||
<< "! (" << node->Stat().SecondClosestBound() - secondClosestDist
|
||||
<< ")\n";
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
|
||||
if (node->Stat().MaxQueryNodeDistance() < node->Stat().SecondClosestBound()
|
||||
@@ -416,7 +428,7 @@ node->Stat().SecondClosestBound() << " is too loose! -- " << secondClosestDist
|
||||
node->Stat().HamerlyPruned() = true;
|
||||
if (!node->Parent()->Stat().HamerlyPruned())
|
||||
{
|
||||
if (node->Begin() == 37408)
|
||||
if (node->Begin() == 23058)
|
||||
Log::Warn << "Mark r" << node->Begin() << "c" << node->Count() << " as "
|
||||
<< "Hamerly pruned.\n";
|
||||
hamerlyPruned += node->NumDescendants();
|
||||
|
||||
@@ -113,8 +113,8 @@ double DualTreeKMeansRules<MetricType, TreeType>::Score(
|
||||
|
||||
traversalInfo.LastReferenceNode() = &referenceNode;
|
||||
|
||||
if (referenceNode.Begin() == 37408)
|
||||
Log::Warn << "Visit r37408c" << referenceNode.Count() << ", q" <<
|
||||
if (referenceNode.Begin() == 23058)
|
||||
Log::Warn << "Visit r23058c" << referenceNode.Count() << ", q" <<
|
||||
queryNode.Begin() << "c" << queryNode.Count() << ".\n";
|
||||
|
||||
// If there's no closest query node assigned, but the parent has one, take
|
||||
@@ -123,8 +123,8 @@ queryNode.Begin() << "c" << queryNode.Count() << ".\n";
|
||||
referenceNode.Parent() != NULL &&
|
||||
referenceNode.Parent()->Stat().ClosestQueryNode() != NULL)
|
||||
{
|
||||
if (referenceNode.Begin() == 37408)
|
||||
Log::Warn << "Update closest query node for r37408c" <<
|
||||
if (referenceNode.Begin() == 23058)
|
||||
Log::Warn << "Update closest query node for r23058c" <<
|
||||
referenceNode.Count() << " to parent's, which is "
|
||||
<< ((TreeType*)
|
||||
referenceNode.Parent()->Stat().ClosestQueryNode())->Begin() << "c" <<
|
||||
@@ -139,8 +139,8 @@ referenceNode.Parent()->Stat().ClosestQueryNode())->Begin() << "c" <<
|
||||
// referenceNode.Stat().SecondClosestBound() = std::min(
|
||||
// referenceNode.Parent()->Stat().SecondClosestBound(),
|
||||
// referenceNode.Stat().SecondClosestBound());
|
||||
// if (referenceNode.Begin() == 37408)
|
||||
// Log::Warn << "Update second closest bound for r37408c" <<
|
||||
// if (referenceNode.Begin() == 23058)
|
||||
// Log::Warn << "Update second closest bound for r23058c" <<
|
||||
//referenceNode.Count() << " to parent's, which "
|
||||
// << "is " << referenceNode.Stat().SecondClosestBound() << ".\n";
|
||||
}
|
||||
@@ -148,8 +148,8 @@ referenceNode.Parent()->Stat().ClosestQueryNode())->Begin() << "c" <<
|
||||
double score = HamerlyTypeScore(referenceNode);
|
||||
if (score == DBL_MAX)
|
||||
{
|
||||
if (referenceNode.Begin() == 37408)
|
||||
Log::Warn << "Hamerly prune for r37408c" << referenceNode.Count() << ", q" << queryNode.Begin() << "c" <<
|
||||
if (referenceNode.Begin() == 23058)
|
||||
Log::Warn << "Hamerly prune for r23058c" << referenceNode.Count() << ", q" << queryNode.Begin() << "c" <<
|
||||
queryNode.Count() << ".\n";
|
||||
if (origPruned == size_t(-1))
|
||||
{
|
||||
@@ -175,8 +175,8 @@ queryNode.Count() << ".\n";
|
||||
const double minDistance = referenceNode.MinDistance(&queryNode);
|
||||
++distanceCalculations;
|
||||
score = PellegMooreScore(queryNode, referenceNode, minDistance);
|
||||
if (referenceNode.Begin() == 37408)
|
||||
Log::Warn << "mQND for r37408c" << referenceNode.Count() << " is "
|
||||
if (referenceNode.Begin() == 23058)
|
||||
Log::Warn << "mQND for r23058c" << referenceNode.Count() << " is "
|
||||
<< referenceNode.Stat().MinQueryNodeDistance() << "; minDistance "
|
||||
<< minDistance << ", scb " <<
|
||||
referenceNode.Stat().SecondClosestBound() << ".\n";
|
||||
@@ -195,8 +195,8 @@ referenceNode.Stat().SecondClosestBound() << ".\n";
|
||||
referenceNode.Stat().MinQueryNodeDistance();
|
||||
referenceNode.Stat().SecondClosestQueryNode() =
|
||||
referenceNode.Stat().ClosestQueryNode();
|
||||
if (referenceNode.Begin() == 37408)
|
||||
Log::Warn << "scb for r37408c" << referenceNode.Count() << " taken "
|
||||
if (referenceNode.Begin() == 23058)
|
||||
Log::Warn << "scb for r23058c" << referenceNode.Count() << " taken "
|
||||
<< "from minDistance, which is " <<
|
||||
referenceNode.Stat().MinQueryNodeDistance() << ".\n";
|
||||
}
|
||||
@@ -207,8 +207,8 @@ referenceNode.Stat().MinQueryNodeDistance() << ".\n";
|
||||
{
|
||||
referenceNode.Stat().SecondClosestBound() = minDistance;
|
||||
referenceNode.Stat().SecondClosestQueryNode() = &queryNode;
|
||||
if (referenceNode.Begin() == 37408)
|
||||
Log::Warn << "scb for r37408c" << referenceNode.Count() << " taken "
|
||||
if (referenceNode.Begin() == 23058)
|
||||
Log::Warn << "scb for r23058c" << referenceNode.Count() << " taken "
|
||||
<< "from minDistance for pruned query node, which is " <<
|
||||
minDistance << ".\n";
|
||||
}
|
||||
@@ -220,8 +220,8 @@ minDistance << ".\n";
|
||||
referenceNode.Stat().MinQueryNodeDistance() = minDistance;
|
||||
referenceNode.Stat().MaxQueryNodeDistance() = maxDistance;
|
||||
|
||||
if (referenceNode.Begin() == 37408)
|
||||
Log::Warn << "mQND for r37408c" << referenceNode.Count() << " updated to " << minDistance << " and "
|
||||
if (referenceNode.Begin() == 23058)
|
||||
Log::Warn << "mQND for r23058c" << referenceNode.Count() << " updated to " << minDistance << " and "
|
||||
<< "MQND to " << maxDistance << " with furthest query node " <<
|
||||
queryNode.Begin() << "c" << queryNode.Count() << ".\n";
|
||||
}
|
||||
@@ -229,8 +229,8 @@ minDistance << ".\n";
|
||||
else if (IsDescendantOf(*((TreeType*)
|
||||
referenceNode.Stat().ClosestQueryNode()), queryNode))
|
||||
{
|
||||
if (referenceNode.Begin() == 37408)
|
||||
Log::Warn << "Old closest for r37408c" << referenceNode.Count() <<
|
||||
if (referenceNode.Begin() == 23058)
|
||||
Log::Warn << "Old closest for r23058c" << referenceNode.Count() <<
|
||||
" is q" << ((TreeType*)
|
||||
referenceNode.Stat().ClosestQueryNode())->Begin() << "c" << ((TreeType*)
|
||||
referenceNode.Stat().ClosestQueryNode())->Count() << " with mQND " <<
|
||||
@@ -242,8 +242,8 @@ referenceNode.Stat().MaxQueryNodeDistance() << ".\n";
|
||||
referenceNode.Stat().MinQueryNodeDistance() = minDistance;
|
||||
referenceNode.Stat().MaxQueryNodeDistance() = maxDistance;
|
||||
|
||||
if (referenceNode.Begin() == 37408)
|
||||
Log::Warn << "mQND for r37408c" << referenceNode.Count() << " updated to " << minDistance << " and "
|
||||
if (referenceNode.Begin() == 23058)
|
||||
Log::Warn << "mQND for r23058c" << referenceNode.Count() << " updated to " << minDistance << " and "
|
||||
<< "MQND to " << maxDistance << " via descendant with fqn " <<
|
||||
queryNode.Begin() << "c" << queryNode.Count() << ".\n";
|
||||
}
|
||||
@@ -251,8 +251,8 @@ referenceNode.Stat().MaxQueryNodeDistance() << ".\n";
|
||||
{
|
||||
referenceNode.Stat().SecondClosestBound() = minDistance;
|
||||
referenceNode.Stat().SecondClosestQueryNode() = &queryNode;
|
||||
if (referenceNode.Begin() == 37408)
|
||||
Log::Warn << "scb for r37408c" << referenceNode.Count() << " updated to " << minDistance << " via "
|
||||
if (referenceNode.Begin() == 23058)
|
||||
Log::Warn << "scb for r23058c" << referenceNode.Count() << " updated to " << minDistance << " via "
|
||||
<< queryNode.Begin() << "c" << queryNode.Count() << ".\n";
|
||||
}
|
||||
}
|
||||
@@ -264,7 +264,7 @@ referenceNode.Stat().MaxQueryNodeDistance() << ".\n";
|
||||
++distanceCalculations;
|
||||
if (minDistance < referenceNode.Stat().SecondClosestBound())
|
||||
{
|
||||
if (referenceNode.Begin() == 37408)
|
||||
if (referenceNode.Begin() == 23058)
|
||||
Log::Warn << "After Elkan prune, update scb to " << minDistance <<
|
||||
".\n";
|
||||
|
||||
@@ -285,8 +285,8 @@ referenceNode.Stat().MaxQueryNodeDistance() << ".\n";
|
||||
if (score == DBL_MAX)
|
||||
{
|
||||
referenceNode.Stat().ClustersPruned() += queryNode.NumDescendants();
|
||||
if (referenceNode.Begin() == 37408)
|
||||
Log::Warn << "For r37408c" << referenceNode.Count() << ", q" <<
|
||||
if (referenceNode.Begin() == 23058)
|
||||
Log::Warn << "For r23058c" << referenceNode.Count() << ", q" <<
|
||||
queryNode.Begin() << "c" << queryNode.Count() << " is pruned. Min distance is"
|
||||
<< " " << queryNode.MinDistance(&referenceNode) << " and scb is " <<
|
||||
referenceNode.Stat().SecondClosestBound() << ".\n";
|
||||
@@ -344,7 +344,7 @@ double DualTreeKMeansRules<MetricType, TreeType>::HamerlyTypeScore(
|
||||
{
|
||||
if (referenceNode.Stat().HamerlyPruned())
|
||||
{
|
||||
// if (referenceNode.Begin() == 37408)
|
||||
// if (referenceNode.Begin() == 23058)
|
||||
// Log::Warn << "Hamerly prune! r" << referenceNode.Begin() << "c" <<
|
||||
//referenceNode.Count() << ".\n";
|
||||
return DBL_MAX;
|
||||
@@ -392,8 +392,8 @@ double DualTreeKMeansRules<MetricType, TreeType>::ElkanTypeScore(
|
||||
queryNode)) &&
|
||||
(&queryNode != (TreeType*) referenceNode.Stat().ClosestQueryNode()))
|
||||
{
|
||||
if (referenceNode.Begin() == 37408)
|
||||
Log::Warn << "Elkan prune r37408c" << referenceNode.Count() << ", q" <<
|
||||
if (referenceNode.Begin() == 23058)
|
||||
Log::Warn << "Elkan prune r23058c" << referenceNode.Count() << ", q" <<
|
||||
queryNode.Begin() << "c" << queryNode.Count() << "!\n";
|
||||
// Then we can conclude d_max(best(N_r), N_r) <= d_min(N_q, N_r) which
|
||||
// means that N_q cannot possibly hold any clusters that own any points in
|
||||
@@ -413,14 +413,14 @@ double DualTreeKMeansRules<MetricType, TreeType>::PellegMooreScore(
|
||||
// If the minimum distance to the node is greater than the bound, then every
|
||||
// cluster in the query node cannot possibly be the nearest neighbor of any of
|
||||
// the points in the reference node.
|
||||
// if (referenceNode.Begin() == 37408)
|
||||
// Log::Warn << "Pelleg-Moore prune attempt r37408c" << referenceNode.Count() << ", "
|
||||
// if (referenceNode.Begin() == 23058)
|
||||
// Log::Warn << "Pelleg-Moore prune attempt r23058c" << referenceNode.Count() << ", "
|
||||
// << "q" << queryNode.Begin() << "c" << queryNode.Count() << "; "
|
||||
// << "minDistance " << minDistance << ", MQND " <<
|
||||
//referenceNode.Stat().MaxQueryNodeDistance() << ".\n";
|
||||
if (minDistance > referenceNode.Stat().MaxQueryNodeDistance())
|
||||
{
|
||||
// if (referenceNode.Begin() == 37408)
|
||||
// if (referenceNode.Begin() == 23058)
|
||||
// Log::Warn << "Attempt successful!\n";
|
||||
return DBL_MAX;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user