00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef _H_FPB
00011 #define _H_FPB
00012
00013 #include "Hilbert_R-Tree.h"
00014 #include <limits>
00015
00016
00017
00019 template< typename base_tree >
00020 class FPB_tree : public base_tree {
00021
00022 private:
00023
00029 virtual bool checkReady() const { return loaded; }
00030
00032 bool loaded;
00033
00037 vector< BB_container > cache;
00038
00046 vector< base_tree* > bulkLoad( vector< BB_container* > *input );
00047
00048 protected:
00049
00054 virtual Ordering< BB_container >* useOrdering() const;
00055
00056
00057 public:
00058
00063 FPB_tree() : base_tree() { loaded = false; this->deleteLeaves = false; }
00064
00071 FPB_tree( R_tree_props *props ) : base_tree( props ) { loaded = false; this->deleteLeaves = false; }
00072
00076 virtual ~FPB_tree() { }
00077
00083 virtual void ensureReady();
00084
00086 void bulkLoad();
00087
00097 virtual base_tree *insert( BB_container *element );
00098
00107 virtual base_tree *remove( BB_container *element );
00108
00116 virtual base_tree *search( BB_container *element );
00117
00119 virtual vector< int > containedIn( BB_type box ) const;
00120
00122 virtual vector< int > intersects( const vector< double > begin, const vector< double > end ) const;
00123
00125 virtual vector< int > intersects( Point point ) const;
00126
00128 virtual vector< int > intersects( vector<double> a, double b ) const;
00129
00131 virtual vector< int > neighboursOf( BB_container *item ) const;
00132
00133 };
00134
00135
00136
00137
00138
00139
00140 template< typename base_tree >
00141 void FPB_tree< base_tree >::ensureReady() {
00142 if ( !loaded ) {
00143 bulkLoad();
00144 }
00145 }
00146
00147 template< typename base_tree >
00148 Ordering< BB_container >* FPB_tree< base_tree >::useOrdering() const {
00149
00150 return &BB_container::HILC_ORDERING;
00151 }
00152
00153 template< typename base_tree >
00154 void FPB_tree< base_tree >::bulkLoad() {
00155 if ( loaded ) {
00156 cerr << "FPB_tree::bulkLoad() called while already bulkloaded!" << endl;
00157 exit( 1 );
00158 }
00159
00160 if ( cache.size() == 0 ) {
00161 cerr << "Error; tried to bulk load an empty set. Aborting..." << endl;
00162 return;
00163 }
00164
00165 vector< BB_container* > p_cache;
00166 vector< BB_container >::iterator it = cache.begin();
00167 for( ; it!=cache.end(); it++ )
00168 p_cache.push_back( &( *it ) );
00169
00170 #ifdef _DEBUG
00171 cout << "Entering sort... " << endl; fflush( stdout );
00172 #endif
00173
00174 useOrdering()->sort( &p_cache );
00175
00176 #ifdef _DEBUG
00177 cout << "Exitting sort... " << endl; fflush( stdout );
00178 #endif
00179
00180 vector< base_tree* > new_children = bulkLoad( &p_cache );
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198 this->setChildren( new_children, 0 );
00199
00200
00201
00202
00203
00204
00205 this->updateMBRLocal();
00206
00207
00208
00209
00210 this->postBulkLoad();
00211
00212 loaded = true;
00213 }
00214
00215 template< typename base_tree >
00216 vector< base_tree* > FPB_tree< base_tree >::bulkLoad( vector< BB_container* > *input ) {
00217
00218
00219 vector< base_tree* > singleTreeLevel;
00220
00221
00222 vector< BB_container* >::iterator it = input->begin();
00223 unsigned int added = 0;
00224 BB_type curBB;
00225 vector< BB_container* > nodeElems;
00226 for( ; it!=input->end(); it++ ) {
00227 if ( added == this->properties->maximum ) {
00228 singleTreeLevel.push_back( this->buildNode( nodeElems, new BB_type( curBB ) ) );
00229 nodeElems.clear();
00230 added = 0;
00231 }
00232 curBB = curBB && ( *(*it) );
00233 nodeElems.push_back( *it );
00234 added++;
00235 }
00236
00237
00238 if ( added > 0 )
00239 singleTreeLevel.push_back( this->buildNode( nodeElems, new BB_type( curBB ) ) );
00240
00241 added = 0;
00242 nodeElems.clear();
00243 curBB.clear();
00244
00245
00246 while ( singleTreeLevel.size() > this->properties->maximum ) {
00247 vector< base_tree* > newLevel;
00248 typename vector< base_tree* >::iterator it;
00249 vector< base_tree* > nodeElems;
00250 it = singleTreeLevel.begin();
00251 for( ; it!=singleTreeLevel.end(); it++ ) {
00252 if ( added == this->properties->maximum ) {
00253 newLevel.push_back( buildNode( nodeElems, new BB_type( curBB ) ) );
00254 nodeElems.clear();
00255 added = 0;
00256 }
00257 curBB.unite( (*it)->getMBR() );
00258
00259 nodeElems.push_back( *it );
00260 added++;
00261 }
00262 if ( added > 0 )
00263 newLevel.push_back( buildNode( nodeElems, new BB_type( curBB ) ) );
00264 added = 0;
00265 nodeElems.clear();
00266 curBB.clear();
00267
00268 singleTreeLevel.assign( newLevel.begin(), newLevel.end() );
00269 newLevel.clear();
00270 }
00271
00272
00273 return singleTreeLevel;
00274
00275 }
00276
00277 template< typename base_tree >
00278 base_tree* FPB_tree< base_tree >::insert( BB_container *element ) {
00279 if ( loaded ) {
00280 return base_tree::insert( element );
00281 } else {
00282 cache.push_back( BB_container( element ) );
00283 delete element;
00284 return this;
00285 }
00286 }
00287
00288 template< typename base_tree >
00289 base_tree* FPB_tree< base_tree >::remove( BB_container *element ) {
00290 if ( loaded ) {
00291 return base_tree::remove( element );
00292 } else {
00293 vector< BB_container >:: iterator it = cache.begin();
00294 for( ; it!=cache.end(); it++ )
00295 if ( &(*it) == element || (*it).getID() == element->getID() )
00296 cache.erase( it );
00297 return this;
00298 }
00299 }
00300
00301 template< typename base_tree >
00302 base_tree* FPB_tree< base_tree >::search( BB_container *element ) {
00303 if ( loaded ) {
00304 return base_tree::search( element );
00305 } else {
00306 vector< BB_container >:: iterator it = cache.begin();
00307 for( ; it!=cache.end(); it++ )
00308 if ( &(*it) == element || (*it).getID() == element->getID() )
00309 return this;
00310 return 0;
00311 }
00312 }
00313
00314 template< typename base_tree >
00315 vector< int > FPB_tree< base_tree >::containedIn( BB_type box ) const {
00316 if ( !checkReady() ) {
00317 cerr << "Trying to query while datastructure was not ready for access!" << endl;
00318 exit( 1 );
00319 }
00320 return base_tree::containedIn( box );
00321 }
00322
00323 template< typename base_tree >
00324 vector< int > FPB_tree< base_tree >::intersects( const vector< double > begin, const vector< double > end ) const {
00325 if ( !checkReady() ) {
00326 cerr << "Trying to query while datastructure was not ready for access!" << endl;
00327 exit( 1 );
00328 }
00329 return base_tree::intersects( begin, end );
00330 }
00331
00332 template< typename base_tree >
00333 vector< int > FPB_tree< base_tree >::intersects( Point point ) const {
00334 if ( !checkReady() ) {
00335 cerr << "Trying to query while datastructure was not ready for access!" << endl;
00336 exit( 1 );
00337 }
00338 return base_tree::intersects( point );
00339 }
00340
00341 template< typename base_tree >
00342 vector< int > FPB_tree< base_tree >::intersects( vector<double> a, double b ) const {
00343 if ( !checkReady() ) {
00344 cerr << "Trying to query while datastructure was not ready for access!" << endl;
00345 exit( 1 );
00346 }
00347 return base_tree::intersects( a, b );
00348 }
00349
00350 template< typename base_tree >
00351 vector< int > FPB_tree< base_tree >::neighboursOf( BB_container *item ) const {
00352 if ( !checkReady() ) {
00353 cerr << "Trying to query while datastructure was not ready for access!" << endl;
00354 exit( 1 );
00355 }
00356 return base_tree::neighboursOf( item );
00357 }
00358
00359 #endif