diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2014-08-06 14:06:58 -0400 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2014-08-06 14:06:58 -0400 |
commit | 33d150622e0dde9de7abb32aae96e88dd7243ca5 (patch) | |
tree | 937cb277d9b47f17f8f9b4e1a4c6a66ca125f024 | |
parent | ebad47b184dc7dc831659426b86567442c512be0 (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.cpp | 84 |
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, |