Distances on Directed Graphs in R
at main 172 lines 5.7 kB view raw
1#pragma once 2 3// Modified from code by Shane Saunders 4 5#include <vector> 6#include <memory> 7#include <set> 8#include <cmath> // fabs 9#include <unordered_set> // used in bidirected search 10 11// inf_dbl used only in AStar2: 12#include <limits> 13 14#include "dgraph.h" 15 16constexpr long int INFINITE_INT = std::numeric_limits <long int>::max (); 17constexpr double INFINITE_DOUBLE = std::numeric_limits <double>::max (); 18 19class Heap; 20class HeapDesc; 21class DGraph; 22 23namespace PF{ 24 25/* DijkstraEdge is used for the std::set implementation, everything else is for 26 * Shane Saunders's heap sort versions */ 27struct DijkstraEdge 28{ 29 DijkstraEdge (double wt, size_t i): _wt (wt), _i (i) {} 30 31 double _wt; 32 size_t _i; 33 34 size_t geti () const { return _i; } 35 double getw () const { return _wt; } 36}; 37 38struct by_wt 39{ 40 bool operator () (const DijkstraEdge& lhs, const DijkstraEdge& rhs) const 41 { 42 if (fabs (lhs._wt - rhs._wt) < 1.0e-12) 43 return lhs._i < rhs._i; 44 else 45 return lhs._wt < rhs._wt; 46 } 47}; 48 49typedef std::set <DijkstraEdge, by_wt> EdgeSet; 50 51 52class PathFinder { 53 public: 54 PathFinder (size_t n, 55 const HeapDesc& heapD, 56 std::shared_ptr<const DGraph> g); 57 ~PathFinder(); 58 59 // Disable copy/assign as will crash 60 PathFinder(const PathFinder&) = delete; 61 PathFinder& operator=(const PathFinder&) = delete; 62 63 void init (std::shared_ptr<const DGraph> g); 64 void init_arrays ( 65 std::vector<double>& d, 66 std::vector<double>& w, 67 std::vector<long int>& prev, 68 bool *m_open_vec, 69 bool *m_closed_vec, 70 const size_t v, 71 const size_t n); 72 void scan_edges ( 73 const DGraphEdge *edge, 74 std::vector<double>& d, 75 std::vector<double>& w, 76 std::vector<long int>& prev, 77 bool *m_open_vec, 78 const bool *m_closed_vec, 79 const size_t &v0); 80 void scan_edges_heur ( // with A* heuristic 81 const DGraphEdge *edge, 82 std::vector<double>& d, 83 std::vector<double>& w, 84 std::vector<long int>& prev, 85 bool *m_open_vec, 86 const bool *m_closed_vec, 87 const size_t &v0, 88 const std::vector<double> &heur); 89 // with A* heuristic for dists-categorical 90 void scan_edge_types_heur ( 91 const DGraphEdge *edge, 92 std::vector<double>& d, 93 std::vector<double>& w, 94 std::vector<long int>& prev, 95 bool *m_open_vec, 96 const bool *m_closed_vec, 97 const size_t &v0, 98 const std::vector<double> &heur); 99 // run_sp_categorical for threshold dists 100 void scan_edge_types ( 101 const DGraphEdge *edge, 102 std::vector<double>& d, 103 std::vector<double>& w, 104 std::vector<long int>& prev, 105 bool *m_open_vec, 106 const bool *m_closed_vec, 107 const size_t &v0); 108 109 void Dijkstra ( 110 std::vector<double>& d, 111 std::vector<double>& w, 112 std::vector<long int>& prev, 113 const size_t v0, 114 const std::vector <size_t> &to_index); 115 void DijkstraNearest ( 116 std::vector<double>& d, 117 std::vector<double>& w, 118 std::vector<long int>& prev, 119 const size_t v0, 120 const std::vector <size_t> &to_index); 121 void DijkstraLimit ( // run_sp_categorical 122 std::vector<double>& d, 123 std::vector<double>& w, 124 std::vector<long int>& prev, 125 const size_t v0, 126 const double &dlim); 127 void DijkstraLimitEdgeType ( 128 std::vector<double>& d, 129 std::vector<double>& w, 130 std::vector<long int>& prev, 131 const size_t v0, 132 const double &dlim); 133 void AStar (std::vector<double>& d, 134 std::vector<double>& w, 135 std::vector<long int>& prev, 136 const std::vector<double>& heur, 137 const size_t v0, 138 const std::vector <size_t> &to_index); 139 void AStarEdgeType (std::vector<double>& d, 140 std::vector<double>& w, 141 std::vector<long int>& prev, 142 const std::vector<double>& heur, 143 const size_t v0, 144 const std::vector <size_t> &to_index); 145 void Dijkstra_set (std::vector <double>& d, 146 std::vector<double>& w, 147 std::vector<long int>& prev, 148 size_t v0); 149 void Centrality_vertex ( 150 std::vector <double>& cent, 151 const size_t s, 152 const double vert_wt, 153 const double dist_threshold); 154 void Centrality_edge ( 155 std::vector <double>& cent, 156 const size_t s, 157 const double vert_wt, 158 const size_t nedges, 159 const double dist_threshold); 160 161 private: 162 Heap *m_heap; // pointer: heap 163 // Convert to vector<bool>? (save memory, might be a performance hit though) 164 bool *m_open; // array: frontier set state of vertices 165 bool *m_closed; // also for bi-dir 166 167 std::shared_ptr<const DGraph> m_graph; // pointer: directed graph 168 169 EdgeSet edge_set; 170}; 171 172} // end namespace PF