#include <bd_tree.h>


Public Member Functions | |
| ANNbd_shrink (int nb, ANNorthHSArray bds, ANNkd_ptr ic=NULL, ANNkd_ptr oc=NULL) | |
| ~ANNbd_shrink () | |
| virtual void | getStats (int dim, ANNkdStats &st, ANNorthRect &bnd_box) |
| virtual void | print (int level, ostream &out) |
| virtual void | dump (ostream &out) |
| virtual void | ann_search (ANNdist) |
| virtual void | ann_pri_search (ANNdist) |
| virtual void | ann_FR_search (ANNdist) |
Definition at line 61 of file bd_tree.h.
| ANNbd_shrink::ANNbd_shrink | ( | int | nb, |
| ANNorthHSArray | bds, | ||
| ANNkd_ptr | ic = NULL, |
||
| ANNkd_ptr | oc = NULL |
||
| ) | [inline] |
| ANNbd_shrink::~ANNbd_shrink | ( | ) | [inline] |
Definition at line 78 of file bd_tree.h.
References ANN_IN, ANN_OUT, and KD_TRIVIAL.
{
if (child[ANN_IN]!= NULL && child[ANN_IN]!= KD_TRIVIAL)
delete child[ANN_IN];
if (child[ANN_OUT]!= NULL&& child[ANN_OUT]!= KD_TRIVIAL)
delete child[ANN_OUT];
if (bnds != NULL)
delete [] bnds; // delete bounds
}
| void ANNbd_shrink::ann_FR_search | ( | ANNdist | box_dist ) | [virtual] |
Implements ANNkd_node.
Definition at line 39 of file bd_fix_rad_search.cpp.
References ANN_FLOP, ANNkd_node::ann_FR_search(), ANN_IN, ANN_OUT, ANN_SHR, ANN_SUM, ANNkdFRQ, ANNmaxPtsVisited, ANNptsVisited, and QuadProgPP::dist().
{
// check dist calc term cond.
if (ANNmaxPtsVisited != 0 && ANNptsVisited > ANNmaxPtsVisited) return;
ANNdist inner_dist = 0; // distance to inner box
for (int i = 0; i < n_bnds; i++) { // is query point in the box?
if (bnds[i].out(ANNkdFRQ)) { // outside this bounding side?
// add to inner distance
inner_dist = (ANNdist) ANN_SUM(inner_dist, bnds[i].dist(ANNkdFRQ));
}
}
if (inner_dist <= box_dist) { // if inner box is closer
child[ANN_IN]->ann_FR_search(inner_dist);// search inner child first
child[ANN_OUT]->ann_FR_search(box_dist);// ...then outer child
}
else { // if outer box is closer
child[ANN_OUT]->ann_FR_search(box_dist);// search outer child first
child[ANN_IN]->ann_FR_search(inner_dist);// ...then outer child
}
ANN_FLOP(3*n_bnds) // increment floating ops
ANN_SHR(1) // one more shrinking node
}
| void ANNbd_shrink::ann_pri_search | ( | ANNdist | box_dist ) | [virtual] |
Implements ANNkd_node.
Definition at line 39 of file bd_pr_search.cpp.
References ANN_FLOP, ANN_IN, ANN_OUT, ANNkd_node::ann_pri_search(), ANN_SHR, ANN_SUM, ANNprBoxPQ, ANNprQ, QuadProgPP::dist(), ANNpr_queue::insert(), and KD_TRIVIAL.
{
ANNdist inner_dist = 0; // distance to inner box
for (int i = 0; i < n_bnds; i++) { // is query point in the box?
if (bnds[i].out(ANNprQ)) { // outside this bounding side?
// add to inner distance
inner_dist = (ANNdist) ANN_SUM(inner_dist, bnds[i].dist(ANNprQ));
}
}
if (inner_dist <= box_dist) { // if inner box is closer
if (child[ANN_OUT] != KD_TRIVIAL) // enqueue outer if not trivial
ANNprBoxPQ->insert(box_dist,child[ANN_OUT]);
// continue with inner child
child[ANN_IN]->ann_pri_search(inner_dist);
}
else { // if outer box is closer
if (child[ANN_IN] != KD_TRIVIAL) // enqueue inner if not trivial
ANNprBoxPQ->insert(inner_dist,child[ANN_IN]);
// continue with outer child
child[ANN_OUT]->ann_pri_search(box_dist);
}
ANN_FLOP(3*n_bnds) // increment floating ops
ANN_SHR(1) // one more shrinking node
}
| void ANNbd_shrink::ann_search | ( | ANNdist | box_dist ) | [virtual] |
Implements ANNkd_node.
Definition at line 39 of file bd_search.cpp.
References ANN_FLOP, ANN_IN, ANN_OUT, ANNkd_node::ann_search(), ANN_SHR, ANN_SUM, ANNkdQ, ANNmaxPtsVisited, ANNptsVisited, and QuadProgPP::dist().
{
// check dist calc term cond.
if (ANNmaxPtsVisited != 0 && ANNptsVisited > ANNmaxPtsVisited) return;
ANNdist inner_dist = 0; // distance to inner box
for (int i = 0; i < n_bnds; i++) { // is query point in the box?
if (bnds[i].out(ANNkdQ)) { // outside this bounding side?
// add to inner distance
inner_dist = (ANNdist) ANN_SUM(inner_dist, bnds[i].dist(ANNkdQ));
}
}
if (inner_dist <= box_dist) { // if inner box is closer
child[ANN_IN]->ann_search(inner_dist); // search inner child first
child[ANN_OUT]->ann_search(box_dist); // ...then outer child
}
else { // if outer box is closer
child[ANN_OUT]->ann_search(box_dist); // search outer child first
child[ANN_IN]->ann_search(inner_dist); // ...then outer child
}
ANN_FLOP(3*n_bnds) // increment floating ops
ANN_SHR(1) // one more shrinking node
}
| void ANNbd_shrink::dump | ( | ostream & | out ) | [virtual] |
Implements ANNkd_node.
Definition at line 161 of file kd_dump.cpp.
| void ANNbd_shrink::getStats | ( | int | dim, |
| ANNkdStats & | st, | ||
| ANNorthRect & | bnd_box | ||
| ) | [virtual] |
Implements ANNkd_node.
Definition at line 71 of file bd_tree.cpp.
References ANN_IN, ANN_OUT, annBnds2Box(), ANNkdStats::depth, ANNkd_node::getStats(), ANNkdStats::merge(), ANNkdStats::n_shr, and ANNkdStats::reset().
{
ANNkdStats ch_stats; // stats for children
ANNorthRect inner_box(dim); // inner box of shrink
annBnds2Box(bnd_box, // enclosing box
dim, // dimension
n_bnds, // number of bounds
bnds, // bounds array
inner_box); // inner box (modified)
// get stats for inner child
ch_stats.reset(); // reset
child[ANN_IN]->getStats(dim, ch_stats, inner_box);
st.merge(ch_stats); // merge them
// get stats for outer child
ch_stats.reset(); // reset
child[ANN_OUT]->getStats(dim, ch_stats, bnd_box);
st.merge(ch_stats); // merge them
st.depth++; // increment depth
st.n_shr++; // increment number of shrinks
}
| void ANNbd_shrink::print | ( | int | level, |
| ostream & | out | ||
| ) | [virtual] |
Implements ANNkd_node.
Definition at line 41 of file bd_tree.cpp.
References ANN_IN, ANN_OUT, ANNorthHalfSpace::cd, ANNkd_node::print(), and ANNorthHalfSpace::sd.
{
child[ANN_OUT]->print(level+1, out); // print out-child
out << " ";
for (int i = 0; i < level; i++) // print indentation
out << "..";
out << "Shrink";
for (int j = 0; j < n_bnds; j++) { // print sides, 2 per line
if (j % 2 == 0) {
out << "\n"; // newline and indentation
for (int i = 0; i < level+2; i++) out << " ";
}
out << " ([" << bnds[j].cd << "]"
<< (bnds[j].sd > 0 ? ">=" : "< ")
<< bnds[j].cv << ")";
}
out << "\n";
child[ANN_IN]->print(level+1, out); // print in-child
}
1.7.2