aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2014-08-06 14:06:58 -0400
committerGlenn Elliott <gelliott@cs.unc.edu>2014-08-06 14:06:58 -0400
commit33d150622e0dde9de7abb32aae96e88dd7243ca5 (patch)
tree937cb277d9b47f17f8f9b4e1a4c6a66ca125f024
parentebad47b184dc7dc831659426b86567442c512be0 (diff)
Fix: Correctly ignore backedges in depth funcs.
pgm_get_min_depth() and pgm_get_max_depth() incorrectly handle the filtering out of backedges in depth computations. This patch corrects this oversight.
-rw-r--r--src/pgm.cpp84
1 files changed, 60 insertions, 24 deletions
diff --git a/src/pgm.cpp b/src/pgm.cpp
index ca3f351..d66641f 100644
--- a/src/pgm.cpp
+++ b/src/pgm.cpp
@@ -2915,30 +2915,42 @@ double pgm_get_max_depth(node_t target, pgm_weight_func_t wfunc, void* user)
2915 goto out; 2915 goto out;
2916 } 2916 }
2917 2917
2918 bedge_t* edge_array = new bedge_t[g->nr_edges]; 2918 int nr_foward_edges = 0;
2919 double* weights = new double[g->nr_edges];
2920 for(int i = 0; i < g->nr_edges; ++i) 2919 for(int i = 0; i < g->nr_edges; ++i)
2921 { 2920 {
2922 if(!g->edges[i].is_backedge) 2921 if(g->edges[i].is_backedge)
2923 { 2922 continue;
2924 edge_array[i] = 2923 ++nr_foward_edges;
2925 std::make_pair(g->edges[i].producer, g->edges[i].consumer);
2926 }
2927 } 2924 }
2925
2926 bedge_t* edge_array = new bedge_t[nr_foward_edges];
2927 double* weights = new double[nr_foward_edges];
2928 for(int i = 0, j = 0; i < g->nr_edges; ++i)
2929 {
2930 if(g->edges[i].is_backedge)
2931 continue;
2932
2933 edge_array[j++] =
2934 std::make_pair(g->edges[i].producer, g->edges[i].consumer);
2935 }
2936
2928 if(wfunc) 2937 if(wfunc)
2929 { 2938 {
2930 for(int i = 0; i < g->nr_edges; ++i) 2939 for(int i = 0, j = 0; i < g->nr_edges; ++i)
2931 { 2940 {
2941 if(g->edges[i].is_backedge)
2942 continue;
2943
2932 edge_t external_rep = {target.graph, i}; 2944 edge_t external_rep = {target.graph, i};
2933 weights[i] = -1.0*wfunc(external_rep, user); 2945 weights[j++] = -1.0*wfunc(external_rep, user);
2934 } 2946 }
2935 } 2947 }
2936 else 2948 else
2937 { 2949 {
2938 std::fill(weights, weights + g->nr_edges, -1.0); 2950 std::fill(weights, weights + nr_foward_edges, -1.0);
2939 } 2951 }
2940 2952
2941 bgraph_t bgraph(edge_array, edge_array + g->nr_edges, 2953 bgraph_t bgraph(edge_array, edge_array + nr_foward_edges,
2942 weights, g->nr_nodes); 2954 weights, g->nr_nodes);
2943 std::vector<bnode_t> p(boost::num_vertices(bgraph)); 2955 std::vector<bnode_t> p(boost::num_vertices(bgraph));
2944 std::vector<double> d(boost::num_vertices(bgraph)); 2956 std::vector<double> d(boost::num_vertices(bgraph));
@@ -2946,7 +2958,14 @@ double pgm_get_max_depth(node_t target, pgm_weight_func_t wfunc, void* user)
2946 dist = std::numeric_limits<double>::max(); 2958 dist = std::numeric_limits<double>::max();
2947 for(int i = 0; i < g->nr_nodes; ++i) 2959 for(int i = 0; i < g->nr_nodes; ++i)
2948 { 2960 {
2949 if(g->nodes[i].nr_in != 0) 2961 int nr_forward_in = 0;
2962 for(int j = 0; j < g->nodes[i].nr_in; ++j)
2963 {
2964 if(g->edges[g->nodes[i].in[j]].is_backedge)
2965 continue;
2966 nr_forward_in++;
2967 }
2968 if(nr_forward_in != 0)
2950 continue; 2969 continue;
2951 std::fill(d.begin(), d.end(), std::numeric_limits<double>::max()); 2970 std::fill(d.begin(), d.end(), std::numeric_limits<double>::max());
2952 d[i] = 0.0; 2971 d[i] = 0.0;
@@ -2991,30 +3010,40 @@ double pgm_get_min_depth(node_t target, pgm_weight_func_t wfunc, void* user)
2991 goto out; 3010 goto out;
2992 } 3011 }
2993 3012
2994 bedge_t* edge_array = new bedge_t[g->nr_edges]; 3013 int nr_foward_edges = 0;
2995 double* weights = new double[g->nr_edges];
2996 for(int i = 0; i < g->nr_edges; ++i) 3014 for(int i = 0; i < g->nr_edges; ++i)
2997 { 3015 {
2998 if(!g->edges[i].is_backedge) 3016 if(g->edges[i].is_backedge)
2999 { 3017 continue;
3000 edge_array[i] = 3018 ++nr_foward_edges;
3001 std::make_pair(g->edges[i].producer, g->edges[i].consumer); 3019 }
3002 } 3020
3021 bedge_t* edge_array = new bedge_t[nr_foward_edges];
3022 double* weights = new double[nr_foward_edges];
3023 for(int i = 0, j = 0; i < g->nr_edges; ++i)
3024 {
3025 if(g->edges[i].is_backedge)
3026 continue;
3027 edge_array[j++] =
3028 std::make_pair(g->edges[i].producer, g->edges[i].consumer);
3003 } 3029 }
3004 if(wfunc) 3030 if(wfunc)
3005 { 3031 {
3006 for(int i = 0; i < g->nr_edges; ++i) 3032 for(int i = 0, j = 0; i < g->nr_edges; ++i)
3007 { 3033 {
3034 if(g->edges[i].is_backedge)
3035 continue;
3036
3008 edge_t external_rep = {target.graph, i}; 3037 edge_t external_rep = {target.graph, i};
3009 weights[i] = wfunc(external_rep, user); 3038 weights[j++] = wfunc(external_rep, user);
3010 } 3039 }
3011 } 3040 }
3012 else 3041 else
3013 { 3042 {
3014 std::fill(weights, weights + g->nr_edges, 1.0); 3043 std::fill(weights, weights + nr_foward_edges, 1.0);
3015 } 3044 }
3016 3045
3017 bgraph_t bgraph(edge_array, edge_array + g->nr_edges, 3046 bgraph_t bgraph(edge_array, edge_array + nr_foward_edges,
3018 weights, g->nr_nodes); 3047 weights, g->nr_nodes);
3019 std::vector<bnode_t> p(boost::num_vertices(bgraph)); 3048 std::vector<bnode_t> p(boost::num_vertices(bgraph));
3020 std::vector<double> d(boost::num_vertices(bgraph)); 3049 std::vector<double> d(boost::num_vertices(bgraph));
@@ -3022,7 +3051,14 @@ double pgm_get_min_depth(node_t target, pgm_weight_func_t wfunc, void* user)
3022 dist = std::numeric_limits<double>::max(); 3051 dist = std::numeric_limits<double>::max();
3023 for(int i = 0; i < g->nr_nodes; ++i) 3052 for(int i = 0; i < g->nr_nodes; ++i)
3024 { 3053 {
3025 if(g->nodes[i].nr_in != 0) 3054 int nr_forward_in = 0;
3055 for(int j = 0; j < g->nodes[i].nr_in; ++j)
3056 {
3057 if(g->edges[g->nodes[i].in[j]].is_backedge)
3058 continue;
3059 nr_forward_in++;
3060 }
3061 if(nr_forward_in != 0)
3026 continue; 3062 continue;
3027 bnode_t bsource = boost::vertex(i, bgraph); 3063 bnode_t bsource = boost::vertex(i, bgraph);
3028 boost::dijkstra_shortest_paths(bgraph, bsource, 3064 boost::dijkstra_shortest_paths(bgraph, bsource,