#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 }