|
Boost Users : |
From: Matthias Linkenheil (m.linkenheil_at_[hidden])
Date: 2005-03-18 08:10:25
Douglas Gregor schrieb:
>
> On Mar 10, 2005, at 12:09 PM, Matthias Linkenheil wrote:
>
>> okay, "ai" is not checked against the end iterator because the assert
>> function is called.
>> I don't know how to fix this problem so that the max flow result is
>> right.
>>
>> Suggestions are welcome?
>
>
> Do you happen to have a graph that illustrates the problem? I'm not
> very familiar with the algorithm itself, so a failing test case would
> really help us debug it. I've submitted a Sourceforge bug report to
> track progress on this problem.
>
> Doug
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>
Hello,
I used a 2D grid graph, when the access violation in the
push_relabel_max_flow algorithm occurs.
A failing test case is attached to this mail.
Perhaps it could help to debug this problem.
Regards,
M. Linkenheil
#pragma once
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
struct cap_typ{
double cap;
double inv_cap;
};
const x_size = 6;
const y_size = 6;
struct grey_values_typ{
int grey_value_base;
int grey_value_neighb;
};
class intensity
{
public:
int picture [x_size][y_size];
intensity(void);
struct cap_typ get_cap_right(int base, int right);
struct cap_typ get_cap_below(int base, int below);
~intensity(void);
private:
struct grey_values_typ *g_ptr;
struct cap_typ *c_ptr;
struct grey_values_typ *gr_va_ptr;
struct grey_values_typ get_grey_values_right(int base, int right);
struct grey_values_typ get_grey_values_below(int base, int below);
double get_capacity(int grey_value_p, int grey_value_q);
};
#include <boost/config.hpp>
#include <iostream>
#include <vector>
#include <utility>
#include <string>
#include <boost/graph/adjacency_list.hpp>
#include <boost/property_map.hpp>
#include <boost/graph/edmunds_karp_max_flow.hpp>
#include <boost/graph/push_relabel_max_flow.hpp>
#include <boost/graph/filtered_graph.hpp>
#include <boost/graph/graph_utility.hpp>
#include <boost/graph/breadth_first_search.hpp>
#include <boost/graph/visitors.hpp>
#include <stdlib.h>
#include <stdio.h>
#include "intensity.h"
/***************************************************************************************/
int main(int , char* [])
{
using namespace boost;
using namespace std;
intensity myintensity;
int node_nr = 0;
int below = 0;
int right = 0;
int matrix_counter = 0;
bool in1, in2;
struct cap_typ *cap_ptr;
cap_ptr = new struct cap_typ;
typedef adjacency_list_traits<vecS, vecS, directedS> Traits;
typedef property<vertex_index_t, int> VertexProperties;
typedef property<edge_capacity_t, double,
property<edge_residual_capacity_t, double,
property<edge_reverse_t, Traits::edge_descriptor> > > EdgeProperties;
typedef adjacency_list<vecS, vecS, directedS, VertexProperties, EdgeProperties > Graph;
typedef graph_traits<Graph>::edge_descriptor edge_descriptor;
typedef graph_traits<Graph>::vertex_descriptor vertex_descriptor;
const int V = x_size*y_size;
Graph g(V);
property_map<Graph, vertex_index_t>::type vid = get(vertex_index, g);
property_map<Graph, edge_capacity_t>::type cap = get(edge_capacity, g);
property_map<Graph, edge_reverse_t>::type rev_edge = get(edge_reverse, g);
property_map<Graph, edge_residual_capacity_t >::type res_cap = get(edge_residual_capacity, g);
edge_descriptor e1, e2;
matrix_counter = 0;
while (matrix_counter < ((x_size*y_size)-x_size-1)){
for (int spalten_counter = 0; spalten_counter <= (x_size-2); ++spalten_counter){
node_nr = matrix_counter;
right = matrix_counter + 1;
below = matrix_counter + x_size;
*cap_ptr=myintensity.get_cap_right(node_nr, right);
tie(e1, in1) = add_edge(vertex(node_nr, g), vertex(right, g), g);
tie(e2, in2) = add_edge(vertex(right, g), vertex(node_nr, g), g);
if (in1 && in2){
cap[e1] = cap_ptr->cap;
cap[e2] = cap_ptr->inv_cap;
rev_edge[e1] = e2;
rev_edge[e2] = e1;
}
*cap_ptr=myintensity.get_cap_below(node_nr, below);
tie(e1, in1) = add_edge(vertex(node_nr, g), vertex(below, g), g);
tie(e2, in2) = add_edge(vertex(below, g), vertex(node_nr, g), g);
if (in1 && in2){
cap[e1] = cap_ptr->cap;
cap[e2] = cap_ptr->inv_cap;
rev_edge[e1] = e2;
rev_edge[e2] = e1;
}
++matrix_counter;
}
++matrix_counter;
}
matrix_counter = ((x_size*y_size)-x_size);
for (int spalten_counter = 0; spalten_counter <= (x_size-2); ++spalten_counter){
node_nr = matrix_counter;
right = matrix_counter + 1;
*cap_ptr=myintensity.get_cap_right(node_nr, right);
tie(e1, in1) = add_edge(vertex(node_nr, g), vertex(right, g), g);
tie(e2, in2) = add_edge(vertex(right, g), vertex(node_nr, g), g);
if (in1 && in2){
cap[e1] = cap_ptr->cap;
cap[e2] = cap_ptr->inv_cap;
rev_edge[e1] = e2;
rev_edge[e2] = e1;
}
++matrix_counter;
}
matrix_counter = (x_size-1);
for (int zeilen_counter = 0; zeilen_counter <= (y_size-2); ++zeilen_counter){
node_nr = matrix_counter;
below = matrix_counter + x_size;
*cap_ptr=myintensity.get_cap_below(node_nr, below);
tie(e1, in1) = add_edge(vertex(node_nr, g), vertex(below, g), g);
tie(e2, in2) = add_edge(vertex(below, g), vertex(node_nr, g), g);
if (in1 && in2){
cap[e1] = cap_ptr->cap;
cap[e2] = cap_ptr->inv_cap;
rev_edge[e1] = e2;
rev_edge[e2] = e1;
}
matrix_counter = matrix_counter + x_size;
}
graph_traits<Graph>::vertex_iterator i, end;
graph_traits<Graph>::out_edge_iterator ei1, edge_end;
for (boost::tie(i,end) = vertices(g); i != end; ++i) {
cout << vid[*i] << " ";
for (boost::tie(ei1,edge_end) = out_edges(*i, g); ei1 != edge_end; ++ei1)
cout << " --" << cap[*ei1] << "--> " << vid[target(*ei1, g)] << " ";
cout << endl;
}
graph_traits<Graph>::vertex_descriptor s, t;
s = vertex(0 , g);
t = vertex(28 , g);
//double flow = edmunds_karp_max_flow(g, s, t);
double flow = push_relabel_max_flow(g, s, t);
cout<<"max flow :"<<flow<<endl;
char h;
cout<<"end"<<endl;
cin >> h;
return 0;
}
When using the push_relabel_max_flow algorithm on a 2D grid graph an access violation in push_relabel_max_flow.hpp line 554 occurs.
#include "intensity.h"
intensity::intensity(void)
{
g_ptr = new struct grey_values_typ;
c_ptr = new struct cap_typ;
gr_va_ptr = new struct grey_values_typ;
for (int m=0; m<y_size; ++m){
for (int n=0; n<x_size; ++n){
if (m <= (y_size/2)-1)
picture [n][m] = 255;
else
picture [n][m] = 0;
}
}
}
struct cap_typ intensity::get_cap_right(int base, int right)
{
*gr_va_ptr=get_grey_values_right(base, right);
c_ptr->cap = get_capacity(gr_va_ptr->grey_value_base, gr_va_ptr->grey_value_neighb);
c_ptr->inv_cap = get_capacity(gr_va_ptr->grey_value_neighb, gr_va_ptr->grey_value_base);
return *c_ptr;
}
struct cap_typ intensity::get_cap_below(int base, int below)
{
*gr_va_ptr=get_grey_values_below(base, below);
c_ptr->cap = get_capacity(gr_va_ptr->grey_value_base, gr_va_ptr->grey_value_neighb);
c_ptr->inv_cap = get_capacity(gr_va_ptr->grey_value_neighb, gr_va_ptr->grey_value_base);
return *c_ptr;
}
struct grey_values_typ intensity::get_grey_values_right(int base, int right){
int xPos;
int yPos;
int xPos_hilfsvar;
xPos = base % x_size;
yPos = base / y_size;
xPos_hilfsvar = xPos;
g_ptr->grey_value_base = picture[xPos][yPos];
++xPos_hilfsvar;
g_ptr->grey_value_neighb = picture[xPos_hilfsvar][yPos];
return *g_ptr;
}
struct grey_values_typ intensity::get_grey_values_below(int base, int below){
int xPos;
int yPos;
int yPos_hilfsvar;
xPos = base % x_size;
yPos = base / y_size;
yPos_hilfsvar = yPos;
g_ptr->grey_value_base = picture[xPos][yPos];
++yPos_hilfsvar;
g_ptr->grey_value_neighb = picture[xPos][yPos_hilfsvar];
return *g_ptr;
}
double intensity::get_capacity(int grey_value_p, int grey_value_q){
const sigma = 1;
const k = 1;
return k * exp(-(pow((grey_value_q - grey_value_p), 2)/pow(sigma, 2)));
}
intensity::~intensity(void)
{
delete g_ptr;
delete c_ptr;
delete gr_va_ptr;
}
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net