queso-0.53.0
Public Member Functions | Private Attributes | List of all members
ANNkd_split Class Reference

#include <kd_tree.h>

Inheritance diagram for ANNkd_split:
Inheritance graph
[legend]
Collaboration diagram for ANNkd_split:
Collaboration graph
[legend]

Public Member Functions

 ANNkd_split (int cd, ANNcoord cv, ANNcoord lv, ANNcoord hv, ANNkd_ptr lc=NULL, ANNkd_ptr hc=NULL)
 
 ~ANNkd_split ()
 
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)
 
- Public Member Functions inherited from ANNkd_node
virtual ~ANNkd_node ()
 

Private Attributes

int cut_dim
 
ANNcoord cut_val
 
ANNcoord cd_bnds [2]
 
ANNkd_ptr child [2]
 

Detailed Description

Definition at line 142 of file kd_tree.h.

Constructor & Destructor Documentation

ANNkd_split::ANNkd_split ( int  cd,
ANNcoord  cv,
ANNcoord  lv,
ANNcoord  hv,
ANNkd_ptr  lc = NULL,
ANNkd_ptr  hc = NULL 
)
inline

Definition at line 150 of file kd_tree.h.

References ANN_HI, and ANN_LO.

155  {
156  cut_dim = cd; // cutting dimension
157  cut_val = cv; // cutting value
158  cd_bnds[ANN_LO] = lv; // lower bound for rectangle
159  cd_bnds[ANN_HI] = hv; // upper bound for rectangle
160  child[ANN_LO] = lc; // left child
161  child[ANN_HI] = hc; // right child
162  }
ANNcoord cd_bnds[2]
Definition: kd_tree.h:146
Definition: ANNx.h:45
ANNkd_ptr child[2]
Definition: kd_tree.h:148
int cut_dim
Definition: kd_tree.h:144
Definition: ANNx.h:45
ANNcoord cut_val
Definition: kd_tree.h:145
ANNkd_split::~ANNkd_split ( )
inline

Definition at line 164 of file kd_tree.h.

References ANN_HI, ANN_LO, and KD_TRIVIAL.

165  {
166  if (child[ANN_LO]!= NULL && child[ANN_LO]!= KD_TRIVIAL)
167  delete child[ANN_LO];
168  if (child[ANN_HI]!= NULL && child[ANN_HI]!= KD_TRIVIAL)
169  delete child[ANN_HI];
170  }
Definition: ANNx.h:45
ANNkd_leaf * KD_TRIVIAL
Definition: kd_tree.cpp:50
ANNkd_ptr child[2]
Definition: kd_tree.h:148
Definition: ANNx.h:45

Member Function Documentation

void ANNkd_split::ann_FR_search ( ANNdist  box_dist)
virtual

Implements ANNkd_node.

Definition at line 100 of file kd_fix_rad_search.cpp.

References ANN_DIFF, ANN_FLOP, ANNkd_node::ann_FR_search(), ANN_HI, ANN_LO, ANN_POW, ANN_SPL, ANN_SUM, ANNkdFRMaxErr, ANNkdFRPtsVisited, ANNkdFRQ, ANNkdFRSqRad, ANNmaxPtsVisited, cd_bnds, child, cut_dim, and cut_val.

101 {
102  // check dist calc term condition
104 
105  // distance to cutting plane
106  ANNcoord cut_diff = ANNkdFRQ[cut_dim] - cut_val;
107 
108  if (cut_diff < 0) { // left of cutting plane
109  child[ANN_LO]->ann_FR_search(box_dist);// visit closer child first
110 
111  ANNcoord box_diff = cd_bnds[ANN_LO] - ANNkdFRQ[cut_dim];
112  if (box_diff < 0) // within bounds - ignore
113  box_diff = 0;
114  // distance to further box
115  box_dist = (ANNdist) ANN_SUM(box_dist,
116  ANN_DIFF(ANN_POW(box_diff), ANN_POW(cut_diff)));
117 
118  // visit further child if in range
119  if (box_dist * ANNkdFRMaxErr <= ANNkdFRSqRad)
120  child[ANN_HI]->ann_FR_search(box_dist);
121 
122  }
123  else { // right of cutting plane
124  child[ANN_HI]->ann_FR_search(box_dist);// visit closer child first
125 
126  ANNcoord box_diff = ANNkdFRQ[cut_dim] - cd_bnds[ANN_HI];
127  if (box_diff < 0) // within bounds - ignore
128  box_diff = 0;
129  // distance to further box
130  box_dist = (ANNdist) ANN_SUM(box_dist,
131  ANN_DIFF(ANN_POW(box_diff), ANN_POW(cut_diff)));
132 
133  // visit further child if close enough
134  if (box_dist * ANNkdFRMaxErr <= ANNkdFRSqRad)
135  child[ANN_LO]->ann_FR_search(box_dist);
136 
137  }
138  ANN_FLOP(13) // increment floating ops
139  ANN_SPL(1) // one more splitting node visited
140 }
ANNdist ANNkdFRSqRad
virtual void ann_FR_search(ANNdist)=0
ANNcoord cd_bnds[2]
Definition: kd_tree.h:146
#define ANN_SPL(n)
Definition: ANNperf.h:133
double ANNcoord
Definition: ANN.h:158
#define ANN_SUM(x, y)
Definition: ANN.h:362
int ANNkdFRPtsVisited
#define ANN_DIFF(x, y)
Definition: ANN.h:363
Definition: ANNx.h:45
ANNkd_ptr child[2]
Definition: kd_tree.h:148
#define ANN_FLOP(n)
Definition: ANNperf.h:131
int cut_dim
Definition: kd_tree.h:144
Definition: ANNx.h:45
double ANNkdFRMaxErr
double ANNdist
Definition: ANN.h:159
ANNpoint ANNkdFRQ
#define ANN_POW(v)
Definition: ANN.h:360
int ANNmaxPtsVisited
Definition: ANN.cpp:190
ANNcoord cut_val
Definition: kd_tree.h:145
void ANNkd_split::ann_pri_search ( ANNdist  box_dist)
virtual

Implements ANNkd_node.

Definition at line 139 of file kd_pr_search.cpp.

References ANN_DIFF, ANN_FLOP, ANN_HI, ANN_LO, ANN_POW, ANNkd_node::ann_pri_search(), ANN_SPL, ANN_SUM, ANNprQ, cd_bnds, child, cut_dim, cut_val, ANNpr_queue::insert(), and KD_TRIVIAL.

140 {
141  ANNdist new_dist; // distance to child visited later
142  // distance to cutting plane
143  ANNcoord cut_diff = ANNprQ[cut_dim] - cut_val;
144 
145  if (cut_diff < 0) { // left of cutting plane
146  ANNcoord box_diff = cd_bnds[ANN_LO] - ANNprQ[cut_dim];
147  if (box_diff < 0) // within bounds - ignore
148  box_diff = 0;
149  // distance to further box
150  new_dist = (ANNdist) ANN_SUM(box_dist,
151  ANN_DIFF(ANN_POW(box_diff), ANN_POW(cut_diff)));
152 
153  if (child[ANN_HI] != KD_TRIVIAL)// enqueue if not trivial
154  ANNprBoxPQ->insert(new_dist, child[ANN_HI]);
155  // continue with closer child
156  child[ANN_LO]->ann_pri_search(box_dist);
157  }
158  else { // right of cutting plane
159  ANNcoord box_diff = ANNprQ[cut_dim] - cd_bnds[ANN_HI];
160  if (box_diff < 0) // within bounds - ignore
161  box_diff = 0;
162  // distance to further box
163  new_dist = (ANNdist) ANN_SUM(box_dist,
164  ANN_DIFF(ANN_POW(box_diff), ANN_POW(cut_diff)));
165 
166  if (child[ANN_LO] != KD_TRIVIAL)// enqueue if not trivial
167  ANNprBoxPQ->insert(new_dist, child[ANN_LO]);
168  // continue with closer child
169  child[ANN_HI]->ann_pri_search(box_dist);
170  }
171  ANN_SPL(1) // one more splitting node visited
172  ANN_FLOP(8) // increment floating ops
173 }
ANNpoint ANNprQ
void insert(PQkey kv, PQinfo inf)
Definition: pr_queue.h:84
ANNpr_queue * ANNprBoxPQ
ANNcoord cd_bnds[2]
Definition: kd_tree.h:146
#define ANN_SPL(n)
Definition: ANNperf.h:133
double ANNcoord
Definition: ANN.h:158
#define ANN_SUM(x, y)
Definition: ANN.h:362
#define ANN_DIFF(x, y)
Definition: ANN.h:363
Definition: ANNx.h:45
ANNkd_leaf * KD_TRIVIAL
Definition: kd_tree.cpp:50
ANNkd_ptr child[2]
Definition: kd_tree.h:148
#define ANN_FLOP(n)
Definition: ANNperf.h:131
int cut_dim
Definition: kd_tree.h:144
virtual void ann_pri_search(ANNdist)=0
Definition: ANNx.h:45
double ANNdist
Definition: ANN.h:159
#define ANN_POW(v)
Definition: ANN.h:360
ANNcoord cut_val
Definition: kd_tree.h:145
void ANNkd_split::ann_search ( ANNdist  box_dist)
virtual

Implements ANNkd_node.

Definition at line 124 of file kd_search.cpp.

References ANN_DIFF, ANN_FLOP, ANN_HI, ANN_LO, ANN_POW, ANNkd_node::ann_search(), ANN_SPL, ANN_SUM, ANNkdQ, ANNmaxPtsVisited, ANNptsVisited, cd_bnds, child, cut_dim, and cut_val.

125 {
126  // check dist calc term condition
127  if (ANNmaxPtsVisited != 0 && ANNptsVisited > ANNmaxPtsVisited) return;
128 
129  // distance to cutting plane
130  ANNcoord cut_diff = ANNkdQ[cut_dim] - cut_val;
131 
132  if (cut_diff < 0) { // left of cutting plane
133  child[ANN_LO]->ann_search(box_dist);// visit closer child first
134 
135  ANNcoord box_diff = cd_bnds[ANN_LO] - ANNkdQ[cut_dim];
136  if (box_diff < 0) // within bounds - ignore
137  box_diff = 0;
138  // distance to further box
139  box_dist = (ANNdist) ANN_SUM(box_dist,
140  ANN_DIFF(ANN_POW(box_diff), ANN_POW(cut_diff)));
141 
142  // visit further child if close enough
143  if (box_dist * ANNkdMaxErr < ANNkdPointMK->max_key())
144  child[ANN_HI]->ann_search(box_dist);
145 
146  }
147  else { // right of cutting plane
148  child[ANN_HI]->ann_search(box_dist);// visit closer child first
149 
150  ANNcoord box_diff = ANNkdQ[cut_dim] - cd_bnds[ANN_HI];
151  if (box_diff < 0) // within bounds - ignore
152  box_diff = 0;
153  // distance to further box
154  box_dist = (ANNdist) ANN_SUM(box_dist,
155  ANN_DIFF(ANN_POW(box_diff), ANN_POW(cut_diff)));
156 
157  // visit further child if close enough
158  if (box_dist * ANNkdMaxErr < ANNkdPointMK->max_key())
159  child[ANN_LO]->ann_search(box_dist);
160 
161  }
162  ANN_FLOP(10) // increment floating ops
163  ANN_SPL(1) // one more splitting node visited
164 }
ANNcoord cd_bnds[2]
Definition: kd_tree.h:146
#define ANN_SPL(n)
Definition: ANNperf.h:133
virtual void ann_search(ANNdist)=0
double ANNcoord
Definition: ANN.h:158
#define ANN_SUM(x, y)
Definition: ANN.h:362
int ANNptsVisited
Definition: ANN.cpp:191
#define ANN_DIFF(x, y)
Definition: ANN.h:363
Definition: ANNx.h:45
ANNkd_ptr child[2]
Definition: kd_tree.h:148
#define ANN_FLOP(n)
Definition: ANNperf.h:131
int cut_dim
Definition: kd_tree.h:144
Definition: ANNx.h:45
virtual void ann_search(ANNdist)
Definition: kd_search.cpp:124
double ANNdist
Definition: ANN.h:159
ANNpoint ANNkdQ
Definition: kd_search.cpp:80
#define ANN_POW(v)
Definition: ANN.h:360
int ANNmaxPtsVisited
Definition: ANN.cpp:190
ANNcoord cut_val
Definition: kd_tree.h:145
void ANNkd_split::dump ( ostream &  out)
virtual

Implements ANNkd_node.

Definition at line 134 of file kd_dump.cpp.

References ANN_HI, and ANN_LO.

136 {
137  out << "split " << cut_dim << " " << cut_val << " ";
138  out << cd_bnds[ANN_LO] << " " << cd_bnds[ANN_HI] << "\n";
139 
140  child[ANN_LO]->dump(out); // print low child
141  child[ANN_HI]->dump(out); // print high child
142 }
ANNcoord cd_bnds[2]
Definition: kd_tree.h:146
virtual void dump(ostream &out)=0
Definition: ANNx.h:45
ANNkd_ptr child[2]
Definition: kd_tree.h:148
int cut_dim
Definition: kd_tree.h:144
Definition: ANNx.h:45
ANNcoord cut_val
Definition: kd_tree.h:145
void ANNkd_split::getStats ( int  dim,
ANNkdStats st,
ANNorthRect bnd_box 
)
virtual

Implements ANNkd_node.

Definition at line 160 of file kd_tree.cpp.

References ANN_HI, ANN_LO, child, cut_dim, cut_val, ANNkdStats::depth, ANNkd_node::getStats(), ANNorthRect::hi, ANNorthRect::lo, ANNkdStats::merge(), ANNkdStats::n_spl, and ANNkdStats::reset().

164 {
165  ANNkdStats ch_stats; // stats for children
166  // get stats for low child
167  ANNcoord hv = bnd_box.hi[cut_dim]; // save box bounds
168  bnd_box.hi[cut_dim] = cut_val; // upper bound for low child
169  ch_stats.reset(); // reset
170  child[ANN_LO]->getStats(dim, ch_stats, bnd_box);
171  st.merge(ch_stats); // merge them
172  bnd_box.hi[cut_dim] = hv; // restore bound
173  // get stats for high child
174  ANNcoord lv = bnd_box.lo[cut_dim]; // save box bounds
175  bnd_box.lo[cut_dim] = cut_val; // lower bound for high child
176  ch_stats.reset(); // reset
177  child[ANN_HI]->getStats(dim, ch_stats, bnd_box);
178  st.merge(ch_stats); // merge them
179  bnd_box.lo[cut_dim] = lv; // restore bound
180 
181  st.depth++; // increment depth
182  st.n_spl++; // increment number of splits
183 }
int depth
Definition: ANNperf.h:54
double ANNcoord
Definition: ANN.h:158
Definition: ANNx.h:45
ANNkd_ptr child[2]
Definition: kd_tree.h:148
int n_spl
Definition: ANNperf.h:52
void reset(int d=0, int n=0, int bs=0)
Definition: ANNperf.h:59
ANNpoint lo
Definition: ANNx.h:93
int cut_dim
Definition: kd_tree.h:144
Definition: ANNx.h:45
int dim
Definition: ann2fig.cpp:81
ANNpoint hi
Definition: ANNx.h:94
void merge(const ANNkdStats &st)
Definition: kd_tree.cpp:133
virtual void getStats(int dim, ANNkdStats &st, ANNorthRect &bnd_box)=0
ANNcoord cut_val
Definition: kd_tree.h:145
void ANNkd_split::print ( int  level,
ostream &  out 
)
virtual

Implements ANNkd_node.

Definition at line 67 of file kd_tree.cpp.

References ANN_HI, ANN_LO, cd_bnds, child, cut_dim, cut_val, and ANNkd_node::print().

70 {
71  child[ANN_HI]->print(level+1, out); // print high child
72  out << " ";
73  for (int i = 0; i < level; i++) // print indentation
74  out << "..";
75  out << "Split cd=" << cut_dim << " cv=" << cut_val;
76  out << " lbnd=" << cd_bnds[ANN_LO];
77  out << " hbnd=" << cd_bnds[ANN_HI];
78  out << "\n";
79  child[ANN_LO]->print(level+1, out); // print low child
80 }
ANNcoord cd_bnds[2]
Definition: kd_tree.h:146
Definition: ANNx.h:45
ANNkd_ptr child[2]
Definition: kd_tree.h:148
int cut_dim
Definition: kd_tree.h:144
virtual void print(int level, ostream &out)=0
Definition: ANNx.h:45
ANNcoord cut_val
Definition: kd_tree.h:145

Member Data Documentation

ANNcoord ANNkd_split::cd_bnds[2]
private

Definition at line 146 of file kd_tree.h.

Referenced by ann_FR_search(), ann_pri_search(), ann_search(), and print().

ANNkd_ptr ANNkd_split::child[2]
private

Definition at line 148 of file kd_tree.h.

Referenced by ann_FR_search(), ann_pri_search(), ann_search(), getStats(), and print().

int ANNkd_split::cut_dim
private

Definition at line 144 of file kd_tree.h.

Referenced by ann_FR_search(), ann_pri_search(), ann_search(), getStats(), and print().

ANNcoord ANNkd_split::cut_val
private

Definition at line 145 of file kd_tree.h.

Referenced by ann_FR_search(), ann_pri_search(), ann_search(), getStats(), and print().


The documentation for this class was generated from the following files:

Generated on Thu Jun 11 2015 13:52:33 for queso-0.53.0 by  doxygen 1.8.5