Hi stephan,
sorry about the lack of detail in my question.
Below you can find the code for a network factory class. The code reads a file (like this)
300
0 37 0 1 2 3 4 5 6 8 9 15 17 21 42 44 51 56 63 66 77 84 86 93 123 126 128 129 151 153 163 164 170 219 225 240 247 261 288 290
1 12 0 0 2 11 18 33 47 66 95 127 192 209 211
2 51 0 1 0 3 5 6 7 8 10 12 13 14 15 16 17 19 25 27 31 35 36 38 49 78 79 81 84 88 91 93 104 111 139 156 169 175 178 188 203 208 223 227 243 247 249 253 255 266 267 268 282 286
3 8 0 2 0 4 29 42 55 62 257
4 11 0 3 0 18 34 52 59 108 139 216 235 296
5 14 0 2 0 26 50 56 58 71 74 80 186 191 193 194 283
6 14 0 0 2 7 16 30 34 46 57 101 141 174 198 215 291
7 6 0 2 6 67 82 97 181
...
and when the member function 'create' is called, the network should be returned.
The error was a runtime error. I got the following answer from Xcode:
[Session started at 2006-09-19 09:57:00 +0200.]
#seed.in not found. Creating a new seed...
seed = 583597
gamenetwork has exited due to signal 10 (SIGBUS).
I examined your code and adapted mine to yours and noticed that the error disappears
when I change
g=new Graph();
to
g=new Graph(1);
in the member function parseFile. It seems that this is the error that I made (as I expected it is a silly one). Could you tell me why the '1' is required here?
Thanks for the help
Tom
==networkfact.h
#ifndef __NETWORKFACTORY_H
#define __NETWORKFACTORY_H
#include "factory.h"
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graph_traits.hpp>
using namespace std;
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS> Graph;
typedef Graph* Graphptr;
typedef boost::graph_traits<Graph>::edge_descriptor Edge;
typedef boost::graph_traits<Graph>::vertex_descriptor Vertex;
typedef boost::graph_traits<Graph>::vertex_iterator Vertex_iterator;
typedef boost::graph_traits<Graph>::edge_iterator Edge_iterator;
typedef boost::graph_traits<Graph>::vertices_size_type Vertex_type;
typedef boost::property_map<Graph, boost::vertex_index_t>::type IndexMap;
typedef Factory<Graph> GraphFactory; // the factory creates new graph instances
class NetworkFactory: public GraphFactory {
public:
NetworkFactory(string fname): _fname(fname){}; //the file contains a grpah specification.
~NetworkFactory(){};
Graphptr create();
private:
Graphptr parseFile(istream&);
void tokenize(const string&, vector<string>&, const string& delimiters = " ");
void processTokens(vector<string>&, Graphptr);
string _fname;
};
typedef NetworkFactory* NetworkFactoryptr;
#endif
==networkfact.cpp
#include "networkfact.h"
#include <boost/lexical_cast.hpp>
#include <sstream>
#include <fstream>
Graphptr NetworkFactory::parseFile(istream& is){
char c;
int numnodes=0;
Graphptr g=NULL;
while(!is.eof()){
c=is.get();
if(c=='#' || c == '\n'|| c == ' '){
string line;
getline(is,line,'\n'); //ignore line content
}
else{ //it is not a comment line but useful information.
is.putback(c);
string line;
getline(is,line,'\n');
//start parsing the line
vector<string> tokens;
tokenize(line,tokens);
if(tokens.size() == 1){
numnodes= boost::lexical_cast<int>(tokens[0]);
g=new Graph(1);
}
else {
if(g!=NULL)
processTokens(tokens,g);
}
}
}
return g;
}
void NetworkFactory::tokenize(const string& str, vector<string>& tokens, const string& delimiters){
// Skip delimiters at beginning.
string::size_type lastPos = str.find_first_not_of(delimiters, 0);
// Find first "non-delimiter".
string::size_type pos = str.find_first_of(delimiters, lastPos);
while (string::npos != pos || string::npos != lastPos)
{
// Found a token, add it to the vector.
tokens.push_back(str.substr(lastPos, pos - lastPos));
// Skip delimiters. Note the "not_of"
lastPos = str.find_first_not_of(delimiters, pos);
// Find next "non-delimiter"
pos = str.find_first_of(delimiters, lastPos);
}
}
void NetworkFactory::processTokens(vector<string>& tokens, Graphptr g){
if(tokens.size()>=3){
int current = boost::lexical_cast<int>(tokens[0]);
int numedges = boost::lexical_cast<int>(tokens[1]);
Vertex first=boost::vertex(current,*g);
for(int i=0;i<numedges;i++){
int other= boost::lexical_cast<int>(tokens[3+i]); //this has to be 3 because some other data is in position 2
Vertex second=boost::vertex(other,*g);
pair<Edge, bool> result=boost::edge(first,second,*g);
if(!result.second){
boost::add_edge(first,second,*g);
}
}
}
}
Graphptr NetworkFactory::create(){
ifstream netwfile(_fname.c_str());
if(netwfile.is_open()){
Graphptr res= parseFile(netwfile);
netwfile.close();
return res;
}
return NULL;
}