1 #include "../classes.h"
12 std::vector<Observation>::const_iterator it;
13 for(it=points.begin(); it!=points.end(); ++it) {
18 if(
_root==NULL)
return;
21 std::vector<CoverTreeNode*> nodes;
22 nodes.push_back(
_root);
23 while(!nodes.empty()) {
25 nodes.erase(nodes.begin());
27 nodes.insert(nodes.begin(),children.begin(),children.end());
34 double minDist = 1.e+50;
36 std::vector<CoverTreeNode*>::const_iterator it;
37 for(it=Q.begin();it!=Q.end();++it) {
38 double dist = p.
distance((*it)->getObservation());
44 return std::make_pair(minDist,minNode);
64 std::vector<distNodePair>
70 std::vector<std::pair<double, CoverTreeNode*> > Qj;
71 double sep = pow(
base,level);
72 double minDist = 1.e+50;
73 std::pair<double,CoverTreeNode*> minQiDist(1.e+50,NULL);
74 std::vector<std::pair<double, CoverTreeNode*> >::const_iterator it;
75 for(it=Qi.begin(); it!=Qi.end(); ++it) {
76 if(it->first<minQiDist.first) minQiDist = *it;
77 if(it->first<minDist) minDist=it->first;
78 if(it->first<=sep) Qj.push_back(*it);
79 std::vector<CoverTreeNode*> children = it->second->getChildren(level);
80 std::vector<CoverTreeNode*>::const_iterator it2;
81 for(it2=children.begin();it2!=children.end();++it2) {
82 double d = p.
distance((*it2)->getObservation());
83 if(d<minDist) minDist = d;
85 Qj.push_back(std::make_pair(d,*it2));
95 if(found && minQiDist.first <= sep) {
97 minQiDist.second->addChild(level,
109 if(
_root==NULL)
return std::vector<CoverTreeNode*>();
114 std::set<distNodePair> minNodes;
116 minNodes.insert(std::make_pair(maxDist,
_root));
117 std::vector<distNodePair> Qj(1,std::make_pair(maxDist,
_root));
119 std::vector<distNodePair>::const_iterator it;
120 int size = Qj.size();
121 for(
int i=0; i<size; i++) {
122 std::vector<CoverTreeNode*> children =
123 Qj[i].second->getChildren(level);
124 std::vector<CoverTreeNode*>::const_iterator it2;
125 for(it2=children.begin(); it2!=children.end(); ++it2) {
126 double d = p.
distance((*it2)->getObservation());
127 if(d < maxDist || minNodes.size() < k) {
128 minNodes.insert(std::make_pair(d,*it2));
131 if(minNodes.size() > k) minNodes.erase(--minNodes.end());
132 maxDist = (--minNodes.end())->first;
134 Qj.push_back(std::make_pair(d,*it2));
137 double sep = maxDist + pow(
base, level);
139 for(
int i=0; i<size; i++) {
140 if(Qj[i].first > sep) {
148 std::vector<CoverTreeNode*> kNN;
149 std::set<distNodePair>::const_iterator it;
150 for(it=minNodes.begin();it!=minNodes.end();++it) {
151 kNN.push_back(it->second);
156 if(
_root==NULL)
return std::vector<Observation>();
158 std::vector<Observation> kNN;
159 std::vector<CoverTreeNode*>::const_iterator it;
160 for(it=v.begin();it!=v.end();++it) {
161 const std::vector<Observation>& p = (*it)->getObservations();
162 kNN.insert(kNN.end(),p.begin(),p.end());
163 if(kNN.size() >= k)
break;
169 std::vector<CoverTreeNode*> Q;
171 for(
int i=0;i<d;i++) {
172 std::cout <<
"LEVEL " <<
_maxLevel-i <<
"\n";
173 std::vector<CoverTreeNode*>::const_iterator it;
174 for(it=Q.begin();it!=Q.end();++it) {
175 (*it)->getObservation().print();
176 std::vector<CoverTreeNode*>
177 children = (*it)->getChildren(
_maxLevel-i);
178 std::vector<CoverTreeNode*>::const_iterator it2;
179 for(it2=children.begin();it2!=children.end();++it2) {
181 (*it2)->getObservation().print();
184 std::vector<CoverTreeNode*> newQ;
185 for(it=Q.begin();it!=Q.end();++it) {
186 std::vector<CoverTreeNode*>
187 children = (*it)->getChildren(
_maxLevel-i);
188 newQ.insert(newQ.end(),children.begin(),children.end());
190 Q.insert(Q.end(),newQ.begin(),newQ.end());
196 if(
_root==NULL)
return;
220 std::map<int, std::vector<distNodePair> > coverSets;
233 std::vector<distNodePair>& Qi = coverSets[level];
234 std::vector<distNodePair>& Qj = coverSets[level-1];
235 double minDist = 1.e+50;
238 double sep = pow(
base, level);
239 std::vector<distNodePair>::const_iterator it;
244 for(it=Qi.begin();it!=Qi.end();++it) {
245 std::vector<CoverTreeNode*> children = it->second->getChildren(level);
246 double dist = it->first;
249 minNode = it->second;
254 std::vector<CoverTreeNode*>::const_iterator it2;
255 for(it2=children.begin();it2!=children.end();++it2) {
256 dist = p.
distance((*it2)->getObservation());
260 if(dist == 0.0) parent = it->second;
263 Qj.push_back(std::make_pair(dist,*it2));
278 if(parent!=NULL) parent->
removeChild(level, minNode);
279 std::vector<CoverTreeNode*> children = minNode->
getChildren(level-1);
280 std::vector<distNodePair>& Q = coverSets[level-1];
281 if(Q.size()==1 && Q[0].second==minNode) {
284 for(
unsigned int i=0;i<Q.size();i++) {
285 if(Q[i].second==minNode) {
292 std::vector<CoverTreeNode*>::const_iterator it;
293 for(it=children.begin();it!=children.end();++it) {
296 double minDQ = 1.e+50;
298 double sep = pow(
base,i);
301 std::vector<distNodePair>&
303 std::vector<distNodePair>::const_iterator it2;
305 for(it2=Q.begin();it2!=Q.end();++it2) {
306 double d = q.
distance(it2->second->getObservation());
309 minDQNode = it2->second;
318 Q.push_back(std::make_pair((*it)->distance(p),*it));
325 if (minDQNode != NULL)
339 if(find(_observations.begin(), _observations.end(), p) == _observations.end())
340 _observations.push_back(p);
343 _observations.push_back(p);
349 std::vector<CoverTreeNode*> children;
350 std::map<int,std::vector<CoverTreeNode*> >::const_iterator it;
351 for(it=_childMap.begin();it!=_childMap.end();++it) {
352 children.insert(children.end(), it->second.begin(), it->second.end());
357 std::map<int,std::vector<CoverTreeNode*> >::const_iterator
358 it = _childMap.find(level);
359 if(it!=_childMap.end()) {
362 return std::vector<CoverTreeNode*>();
365 return _observations[0];
371 return find(_observations.begin(), _observations.end(), p) != _observations.end();
374 return _observations.size() == 1;
380 std::vector<CoverTreeNode*> nodes;
381 nodes.push_back(
_root);
383 double sep = pow(
base,i);
384 std::vector<CoverTreeNode*>::const_iterator it, it2;
387 for(it=nodes.begin(); it!=nodes.end(); ++it) {
388 for(it2=nodes.begin(); it2!=nodes.end(); ++it2) {
389 double dist=(*it)->distance((*it2)->getObservation());
390 if(dist<=sep && dist!=0.0) {
391 std::cout <<
"Level " << i <<
" Separation invariant failed.\n";
396 std::vector<CoverTreeNode*> allChildren;
397 for(it=nodes.begin(); it!=nodes.end(); ++it) {
398 std::vector<CoverTreeNode*> children = (*it)->getChildren(i);
401 for(it2=children.begin(); it2!=children.end(); ++it2) {
402 double dist = (*it2)->distance((*it)->getObservation());
404 std::cout <<
"Level" << i <<
" covering tree invariant failed.n";
409 (allChildren.end(),children.begin(),children.end());
411 nodes.insert(nodes.begin(),allChildren.begin(),allChildren.end());
416 std::vector<CoverTreeNode*>& v = _childMap[level];
417 for(
unsigned int i=0;i<v.size();i++) {
426 std::vector<Observation>::iterator it =
427 find(_observations.begin(), _observations.end(), p);
428 if(it != _observations.end())
429 _observations.erase(it);