inline void dijkstra_shortest_paths_no_init (const Graph& g, SourceInputIter s_begin, SourceInputIter s_end, PredecessorMap predecessor, DistanceMap distance, WeightMap weight, IndexMap index_map, Compare compare, Combine combine, DistZero zero, DijkstraVisitor vis, ColorMap color) { typedef indirect_cmp<DistanceMap, Compare> IndirectCmp; IndirectCmp icmp(distance, compare); typedef typename graph_traits<Graph>::vertex_descriptor Vertex; #ifdef BOOST_GRAPH_DIJKSTRA_TESTING if (!dijkstra_relaxed_heap) { typedef mutable_queue<Vertex, std::vector<Vertex>, IndirectCmp, IndexMap> MutableQueue; MutableQueue Q(num_vertices(g), icmp, index_map); detail::dijkstra_bfs_visitor<DijkstraVisitor, MutableQueue, WeightMap, PredecessorMap, DistanceMap, Combine, Compare> bfs_vis(vis, Q, weight, predecessor, distance, combine, compare, zero); breadth_first_visit(g, s_begin, s_end, Q, bfs_vis, color); return; } #endif // BOOST_GRAPH_DIJKSTRA_TESTING #ifdef BOOST_GRAPH_DIJKSTRA_USE_RELAXED_HEAP typedef relaxed_heap<Vertex, IndirectCmp, IndexMap> MutableQueue; MutableQueue Q(num_vertices(g), icmp, index_map); #else // Now the default: use a d-ary heap boost::scoped_array<std::size_t> index_in_heap_map_holder; typedef detail::vertex_property_map_generator<Graph, IndexMap, std::size_t> IndexInHeapMapHelper; typedef typename IndexInHeapMapHelper::type IndexInHeapMap; IndexInHeapMap index_in_heap = IndexInHeapMapHelper::build(g, index_map, index_in_heap_map_holder); typedef d_ary_heap_indirect<Vertex, 4, IndexInHeapMap, DistanceMap, Compare> MutableQueue; MutableQueue Q(distance, index_in_heap, compare); #endif // Relaxed heap detail::dijkstra_bfs_visitor<DijkstraVisitor, MutableQueue, WeightMap, PredecessorMap, DistanceMap, Combine, Compare> bfs_vis(vis, Q, weight, predecessor, distance, combine, compare, zero); breadth_first_visit(g, s_begin, s_end, Q, bfs_vis, color); }
inline void dijkstra_shortest_paths_no_init (const VertexListGraph& g, typename graph_traits<VertexListGraph>::vertex_descriptor s, PredecessorMap predecessor, DistanceMap distance, WeightMap weight, IndexMap index_map, Compare compare, Combine combine, DistInf inf, DistZero zero, DijkstraVisitor vis) { typedef indirect_cmp<DistanceMap, Compare> IndirectCmp; IndirectCmp icmp(distance, compare); typedef typename graph_traits<VertexListGraph>::vertex_descriptor Vertex; typedef mutable_queue<Vertex, std::vector<Vertex>, IndirectCmp, IndexMap> MutableQueue; MutableQueue Q(num_vertices(g), icmp, index_map); detail::dijkstra_bfs_visitor<DijkstraVisitor, MutableQueue, WeightMap, PredecessorMap, DistanceMap, Combine, Compare> bfs_vis(vis, Q, weight, predecessor, distance, combine, compare, zero); std::vector<default_color_type> color(num_vertices(g)); default_color_type c = white_color; breadth_first_visit(g, s, Q, bfs_vis, make_iterator_property_map(&color[0], index_map, c)); }
inline void astar_search_no_init (const VertexListGraph &g, typename graph_traits<VertexListGraph>::vertex_descriptor s, AStarHeuristic h, AStarVisitor vis, PredecessorMap predecessor, CostMap cost, DistanceMap distance, WeightMap weight, ColorMap color, VertexIndexMap index_map, CompareFunction compare, CombineFunction combine, CostInf /*inf*/, CostZero zero) { typedef typename graph_traits<VertexListGraph>::vertex_descriptor Vertex; typedef boost::vector_property_map<std::size_t, VertexIndexMap> IndexInHeapMap; IndexInHeapMap index_in_heap(index_map); typedef d_ary_heap_indirect<Vertex, 4, IndexInHeapMap, CostMap, CompareFunction> MutableQueue; MutableQueue Q(cost, index_in_heap, compare); detail::astar_bfs_visitor<AStarHeuristic, AStarVisitor, MutableQueue, PredecessorMap, CostMap, DistanceMap, WeightMap, ColorMap, CombineFunction, CompareFunction> bfs_vis(h, vis, Q, predecessor, cost, distance, weight, color, combine, compare, zero); breadth_first_visit(g, s, Q, bfs_vis, color); }
/* * The mex function runs a BFS or DFS with a visitor. */ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { mwIndex mrows, ncols; mwIndex n,nz; /* sparse matrix */ mwIndex *ia, *ja; /* start */ mwIndex u; const mxArray *vis; int call; if (nrhs != 4) { mexErrMsgTxt("2 inputs required."); } /* The first input must be a sparse matrix. */ mrows = mxGetM(prhs[0]); ncols = mxGetN(prhs[0]); if (mrows != ncols || !mxIsSparse(prhs[0])) { mexErrMsgTxt("Input must be a square sparse matrix."); } n = mrows; /* The second input must be a scalar. */ if (mxGetNumberOfElements(prhs[1]) > 1 || !mxIsDouble(prhs[1])) { mexErrMsgTxt("Invalid scalar."); } /* The third input must be a structure. */ if (!mxIsStruct(prhs[2])) { mexErrMsgTxt("Invalid structure."); } /* The fourth input must be a scalar. */ if (mxGetNumberOfElements(prhs[3]) > 1 || !mxIsDouble(prhs[3])) { mexErrMsgTxt("Invalid scalar."); } /* Get the sparse matrix */ /* recall that we've transposed the matrix */ ja = mxGetIr(prhs[0]); ia = mxGetJc(prhs[0]); nz = ia[n]; /* Get the scalar */ u = (mwIndex)mxGetScalar(prhs[1]); u = u-1; if (u < 0 || u >= n) { mexErrMsgIdAndTxt("matlab_bgl:invalidParameter", "start vertex (%i) not a valid vertex.", u+1); } vis = prhs[2]; call = (int)mxGetScalar(prhs[3]); if (call == 101) { bfs_vis(n, ja, ia, u, vis); } else if (call == 201) { /* call without the "full" option */ dfs_vis(n, ja, ia, u, 0, vis); } else if (call == 202) { /* call with the "full" option */ dfs_vis(n, ja, ia, u, 1, vis); } else { mexErrMsgTxt("Invalid call."); } #ifdef _DEBUG mexPrintf("done!\n"); #endif #ifdef _DEBUG mexPrintf("return\n"); #endif }