GDAL
gnmgraph.h
00001 /******************************************************************************
00002  * $Id: gnmgraph.h 36302 2016-11-19 16:54:08Z bishop $
00003  *
00004  * Project:  GDAL/OGR Geography Network support (Geographic Network Model)
00005  * Purpose:  GNM graph implementation.
00006  * Authors:  Mikhail Gusev (gusevmihs at gmail dot com)
00007  *           Dmitry Baryshnikov, polimax@mail.ru
00008  *
00009  ******************************************************************************
00010  * Copyright (c) 2014, Mikhail Gusev
00011  * Copyright (c) 2014-2015, NextGIS <info@nextgis.com>
00012  *
00013  * Permission is hereby granted, free of charge, to any person obtaining a
00014  * copy of this software and associated documentation files (the "Software"),
00015  * to deal in the Software without restriction, including without limitation
00016  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
00017  * and/or sell copies of the Software, and to permit persons to whom the
00018  * Software is furnished to do so, subject to the following conditions:
00019  *
00020  * The above copyright notice and this permission notice shall be included
00021  * in all copies or substantial portions of the Software.
00022  *
00023  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
00024  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00025  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
00026  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00027  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
00028  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
00029  * DEALINGS IN THE SOFTWARE.
00030  ****************************************************************************/
00031 
00032 #include "cpl_port.h"
00033 #include <map>
00034 #include <queue>
00035 #include <set>
00036 #include <vector>
00037 
00038 // Alias for some big data type to store identificators.
00039 #define GNMGFID GIntBig
00040 // Graph constants
00041 #define GNM_EDGE_DIR_BOTH       0   // bidirectional
00042 #define GNM_EDGE_DIR_SRCTOTGT   1   // from source to target
00043 #define GNM_EDGE_DIR_TGTTOSRC   2   // from target to source
00044 
00045 // Types declarations.
00046 typedef std::vector<GNMGFID> GNMVECTOR, *LPGNMVECTOR;
00047 typedef const std::vector<GNMGFID> GNMCONSTVECTOR;
00048 typedef const std::vector<GNMGFID>* LPGNMCONSTVECTOR;
00049 typedef std::pair<GNMGFID,GNMGFID> EDGEVERTEXPAIR;
00050 typedef std::vector< EDGEVERTEXPAIR > GNMPATH;
00051 
00053 struct GNMStdEdge
00054 {
00055     GNMGFID nSrcVertexFID; 
00056     GNMGFID nTgtVertexFID; 
00057     bool bIsBidir;         
00058     double dfDirCost;      
00059     double dfInvCost;      
00060     bool bIsBloked;        
00061 };
00062 
00064 struct GNMStdVertex
00065 {
00066     GNMVECTOR anOutEdgeFIDs; 
00067     bool bIsBloked;          
00068 };
00069 
00083 class CPL_DLL GNMGraph
00084 {
00085 public:
00086     GNMGraph();
00087     virtual ~GNMGraph();
00088 
00089     // GNMGraph
00090 
00099     virtual void AddVertex(GNMGFID nFID);
00100 
00105     virtual void DeleteVertex(GNMGFID nFID);
00106 
00116     virtual void AddEdge(GNMGFID nConFID, GNMGFID nSrcFID, GNMGFID nTgtFID,
00117                          bool bIsBidir, double dfCost, double dfInvCost);
00118 
00123     virtual void DeleteEdge(GNMGFID nConFID);
00124 
00131     virtual void ChangeEdge(GNMGFID nFID, double dfCost, double dfInvCost);
00132 
00138     virtual void ChangeBlockState (GNMGFID nFID, bool bBlock);
00139 
00145     virtual bool CheckVertexBlocked(GNMGFID nFID) const;
00146 
00154     virtual void ChangeAllBlockState (bool bBlock = false);
00155 
00168     virtual GNMPATH DijkstraShortestPath(GNMGFID nStartFID, GNMGFID nEndFID);
00169 
00189     virtual std::vector<GNMPATH> KShortestPaths(GNMGFID nStartFID,
00190                                                 GNMGFID nEndFID, size_t nK);
00191 
00205     virtual GNMPATH ConnectedComponents(const GNMVECTOR &anEmittersIDs);
00206 
00208     virtual void Clear();
00209 protected:
00226     virtual void DijkstraShortestPathTree(GNMGFID nFID,
00227                                   const std::map<GNMGFID, GNMStdEdge> &mstEdges,
00228                                         std::map<GNMGFID, GNMGFID> &mnPathTree);
00230     virtual GNMPATH DijkstraShortestPath(GNMGFID nStartFID, GNMGFID nEndFID,
00231                                  const std::map<GNMGFID, GNMStdEdge> &mstEdges);
00233     virtual LPGNMCONSTVECTOR GetOutEdges(GNMGFID nFID) const;
00234     virtual GNMGFID GetOppositVertex(GNMGFID nEdgeFID, GNMGFID nVertexFID) const;
00235     virtual void TraceTargets(std::queue<GNMGFID> &vertexQueue,
00236                                 std::set<GNMGFID> &markedVertIds,
00237                                 GNMPATH &connectedIds);
00238 protected:
00239     std::map<GNMGFID, GNMStdVertex> m_mstVertices;
00240     std::map<GNMGFID, GNMStdEdge>   m_mstEdges;
00242 };

Generated for GDAL by doxygen 1.7.6.1.