COIN-OR::LEMON - Graph Library

Opened 10 years ago

Closed 10 years ago

#369 closed defect (invalid)

graphCopy crash

Reported by: Ben Strasser Owned by: Peter Kovacs
Priority: critical Milestone: LEMON 1.3 release
Component: core Version: release branch 1.1
Keywords: crash graphCopy Cc:
Revision id:

Description

The following code crashes:

#include <lemon/list_graph.h>
#include <lemon/core.h>
#include <lemon/lgf_reader.h>

typedef lemon::ListGraph Graph;
using lemon::INVALID;
	
int main(int argc, char*argv[]){
	Graph g;

	lemon::GraphReader<Graph>(g, "bug")
		.run();

	bool a = true;
	for(Graph::EdgeIt i(g); i!=INVALID;){
		Graph::Edge e = i;
		++i;
		if(a)
			g.erase(e);
		a = !a;
	}

	Graph g2;
	Graph::EdgeMap<Graph::Edge>edge_map(g2);

	lemon::graphCopy(g, g2)
		.edgeRef(edge_map)
		.run();
}

I have attached the graph in the bug file. The problem is in graphCopy because the following code works

#include <lemon/list_graph.h>
#include <lemon/core.h>
#include <lemon/lgf_reader.h>

typedef lemon::ListGraph Graph;
using lemon::INVALID;
	
int main(int argc, char*argv[]){
	Graph g;

	lemon::GraphReader<Graph>(g, "bug")
		.run();

	bool a = true;
	for(Graph::EdgeIt i(g); i!=INVALID;){
		Graph::Edge e = i;
		++i;
		if(a)
			g.erase(e);
		a = !a;
	}

	Graph g2;
	Graph::EdgeMap<Graph::Edge>edge_map(g2);

	Graph::NodeMap<Graph::Node>node_map(g);
	for(Graph::NodeIt i(g); i!=INVALID; ++i){
		Graph::Node u = g2.addNode();
		node_map[i] = u;
	}
		
	for(Graph::EdgeIt i(g); i!=INVALID; ++i){
		edge_map[
			g2.addEdge(
				node_map[g.u(i)],
				node_map[g.v(i)]
			)
		] = i;
	}

	/*lemon::graphCopy(g, g2)
		.edgeRef(edge_map)
		.run();*/
}

My version is according to lemon/config.h

#define LEMON_VERSION 1.1.1

It's one of the stable releases. It's not an svn version.

Thanks for looking into this.

Attachments (1)

bug (55.4 KB) - added by Ben Strasser 10 years ago.

Download all attachments as: .zip

Change History (6)

Changed 10 years ago by Ben Strasser

Attachment: bug added

comment:1 Changed 10 years ago by Ben Strasser

If it matters my compiler flags are

CFLAGS= -g -Wall -O0 LDFLAGS=-lemon -lglpk

and its version is

gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)

comment:2 in reply to:  description Changed 10 years ago by Peter Kovacs

Owner: changed from Alpar Juttner to Peter Kovacs
Status: newassigned

Replying to Ben:

The following code crashes:

It is not a bug, you just confused edgeRef() and edgeCrossRef().

In the context of graph copying, the From->To maps are called reference maps and the To->From maps are called cross reference maps. In your second code, you create a From->To node map and a To->From edge map, i.e. a node reference map and an edge cross reference map.

Therefore, the correct usage in your first code would be:

	lemon::graphCopy(g, g2)
		.edgeCrossRef(edge_map)
		.run();

This code works for me using your graph.

comment:3 in reply to:  description Changed 10 years ago by Peter Kovacs

Replying to Ben:

My version is according to lemon/config.h
#define LEMON_VERSION 1.1.1

You may use the latest release, LEMON 1.2 (it ensures full compatibility).

comment:4 Changed 10 years ago by Alpar Juttner

I think we can close the ticket.

In similar cases, it may be a good idea to first ask the lemon-user@lemon.cs.elte.hu mailing list, in order to check if the problem is indeed on the LEMON side.

comment:5 Changed 10 years ago by Alpar Juttner

Resolution: invalid
Status: assignedclosed
Note: See TracTickets for help on using tickets.