add geometry compressor
This commit is contained in:
		
							parent
							
								
									349df0dc94
								
							
						
					
					
						commit
						a8e8833a8d
					
				| @ -34,15 +34,17 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| #include "../DataStructures/DeallocatingVector.h" | ||||
| #include "../DataStructures/DynamicGraph.h" | ||||
| #include "../DataStructures/EdgeBasedNode.h" | ||||
| #include "../Extractor/ExtractorStructs.h" | ||||
| #include "../DataStructures/HashTable.h" | ||||
| #include "../DataStructures/ImportEdge.h" | ||||
| #include "../DataStructures/QueryEdge.h" | ||||
| #include "../DataStructures/Percent.h" | ||||
| #include "../DataStructures/QueryEdge.h" | ||||
| #include "../DataStructures/TurnInstructions.h" | ||||
| #include "../Extractor/ExtractorStructs.h" | ||||
| #include "../Util/LuaUtil.h" | ||||
| #include "../Util/SimpleLogger.h" | ||||
| 
 | ||||
| #include "GeometryCompressor.h" | ||||
| 
 | ||||
| #include <boost/foreach.hpp> | ||||
| #include <boost/make_shared.hpp> | ||||
| #include <boost/noncopyable.hpp> | ||||
|  | ||||
							
								
								
									
										94
									
								
								Contractor/GeometryCompressor.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								Contractor/GeometryCompressor.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,94 @@ | ||||
| /*
 | ||||
| 
 | ||||
| Copyright (c) 2013, Project OSRM, Dennis Luxen, others | ||||
| All rights reserved. | ||||
| 
 | ||||
| Redistribution and use in source and binary forms, with or without modification, | ||||
| are permitted provided that the following conditions are met: | ||||
| 
 | ||||
| Redistributions of source code must retain the above copyright notice, this list | ||||
| of conditions and the following disclaimer. | ||||
| Redistributions in binary form must reproduce the above copyright notice, this | ||||
| list of conditions and the following disclaimer in the documentation and/or | ||||
| other materials provided with the distribution. | ||||
| 
 | ||||
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | ||||
| ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR | ||||
| ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||||
| ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| 
 | ||||
| */ | ||||
| 
 | ||||
| #include "GeometryCompressor.h" | ||||
| 
 | ||||
| int current_free_list_maximum = 0; | ||||
| int UniqueNumber () { return ++current_free_list_maximum; } | ||||
| 
 | ||||
| GeometryCompressor::GeometryCompressor() { | ||||
|     m_free_list.resize(100); | ||||
|     IncreaseFreeList(); | ||||
| } | ||||
| 
 | ||||
| void GeometryCompressor::IncreaseFreeList() { | ||||
|     m_compressed_geometries.resize(m_compressed_geometries.size() + 100); | ||||
|     std::generate_n (m_free_list.rend(), 100, UniqueNumber); | ||||
| } | ||||
| 
 | ||||
| void GeometryCompressor::AppendNodeIDsToGeomtry( NodeID node_id, NodeID contracted_node_id ) { | ||||
|     //check if node_id already has a list
 | ||||
|     boost::unordered_map<unsigned, unsigned>::const_iterator map_iterator; | ||||
|     map_iterator = m_node_id_to_index_map.find( node_id ); | ||||
| 
 | ||||
|     unsigned geometry_bucket_index = std::numeric_limits<unsigned>::max(); | ||||
|     if( m_node_id_to_index_map.end() == map_iterator ) { | ||||
|         //if not, create one
 | ||||
|         if( m_free_list.empty() ) { | ||||
|             IncreaseFreeList(); | ||||
|         } | ||||
|         geometry_bucket_index = m_free_list.back(); | ||||
|         m_free_list.pop_back(); | ||||
|     } else { | ||||
|         geometry_bucket_index = map_iterator->second; | ||||
|     } | ||||
| 
 | ||||
|     BOOST_ASSERT( std::numeric_limits<unsigned>::max() != geometry_bucket_index ); | ||||
|     BOOST_ASSERT( geometry_bucket_index < m_compressed_geometries.size() ); | ||||
| 
 | ||||
|     //append contracted_node_id to m_compressed_geometries[node_id]
 | ||||
|     m_compressed_geometries[geometry_bucket_index].push_back(contracted_node_id); | ||||
| 
 | ||||
|     //append m_compressed_geometries[contracted_node_id] to m_compressed_geometries[node_id]
 | ||||
|     map_iterator = m_node_id_to_index_map.find(contracted_node_id); | ||||
|     if ( m_node_id_to_index_map.end() != map_iterator) { | ||||
|         const unsigned bucket_index_to_remove = map_iterator->second; | ||||
|         BOOST_ASSERT( bucket_index_to_remove < m_compressed_geometries.size() ); | ||||
| 
 | ||||
|         m_compressed_geometries[geometry_bucket_index].insert( | ||||
|             m_compressed_geometries[geometry_bucket_index].end(), | ||||
|             m_compressed_geometries[bucket_index_to_remove].begin(), | ||||
|             m_compressed_geometries[bucket_index_to_remove].end() | ||||
|         ); | ||||
|         //remove m_compressed_geometries[contracted_node_id], add to free list
 | ||||
|         m_compressed_geometries[bucket_index_to_remove].clear(); | ||||
|         m_free_list.push_back(bucket_index_to_remove); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void GeometryCompressor::PrintStatistics() const { | ||||
|     unsigned compressed_node_count = 0; | ||||
|     const unsigned surviving_node_count = m_compressed_geometries.size(); | ||||
| 
 | ||||
|     BOOST_FOREACH(const std::vector<unsigned> & current_vector, m_compressed_geometries) { | ||||
|         compressed_node_count += current_vector.size(); | ||||
|     } | ||||
|     SimpleLogger().Write() << | ||||
|         "surv: " << surviving_node_count << | ||||
|         ", comp: " << compressed_node_count << | ||||
|         ", comp ratio: " << ((float)surviving_node_count/compressed_node_count); | ||||
| } | ||||
							
								
								
									
										58
									
								
								Contractor/GeometryCompressor.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								Contractor/GeometryCompressor.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,58 @@ | ||||
| /*
 | ||||
| 
 | ||||
| Copyright (c) 2013, Project OSRM, Dennis Luxen, others | ||||
| All rights reserved. | ||||
| 
 | ||||
| Redistribution and use in source and binary forms, with or without modification, | ||||
| are permitted provided that the following conditions are met: | ||||
| 
 | ||||
| Redistributions of source code must retain the above copyright notice, this list | ||||
| of conditions and the following disclaimer. | ||||
| Redistributions in binary form must reproduce the above copyright notice, this | ||||
| list of conditions and the following disclaimer in the documentation and/or | ||||
| other materials provided with the distribution. | ||||
| 
 | ||||
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | ||||
| ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR | ||||
| ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||||
| ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| 
 | ||||
| */ | ||||
| 
 | ||||
| #include "../Util/SimpleLogger.h" | ||||
| #include "../typedefs.h" | ||||
| 
 | ||||
| #include <boost/assert.hpp> | ||||
| #include <boost/foreach.hpp> | ||||
| #include <boost/unordered_map.hpp> | ||||
| 
 | ||||
| #include <algorithm> | ||||
| #include <limits> | ||||
| #include <vector> | ||||
| 
 | ||||
| #ifndef GEOMETRY_COMPRESSOR_H | ||||
| #define GEOMETRY_COMPRESSOR_H | ||||
| 
 | ||||
| class GeometryCompressor { | ||||
| public: | ||||
|     GeometryCompressor(); | ||||
|     void AppendNodeIDsToGeomtry( NodeID node_id, NodeID contracted_node_id ); | ||||
|     void PrintStatistics() const; | ||||
| 
 | ||||
| private: | ||||
| 
 | ||||
|     void IncreaseFreeList(); | ||||
| 
 | ||||
|     std::vector<std::vector<unsigned> > m_compressed_geometries; | ||||
|     std::vector<unsigned> m_free_list; | ||||
|     boost::unordered_map<unsigned, unsigned> m_node_id_to_index_map; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| #endif //GEOMETRY_COMPRESSOR_H
 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user