我正在尝试使用GraphLab实现BFS算法。在我的vertex_data结构中,我使用向量来保存到目前为止已经遍历的路径。
struct vertex_data {
std::vector<int> current_path;
bool visited;
int destination;
vertex_data() {
destination = -1;
visited = false;
}
}
然后在apply()函数中,我试图将当前顶点id推送到该特定顶点的current_path:
class bfs: public graphlab::ivertex_program<graph_type, graphlab::empty,
vertex_data> {
private:
vertex_data msg;
public:
void apply(icontext_type& context, vertex_type& vertex, const gather_type& gather_result) {
int vid = vertex.id();
vertex.data().destination = msg.destination;
vertex.data().visited = true;
msg.current_path.push_back(vid);
vertex.data().current_path.push_back(vid);
}
}
文档中data()的定义也是:
vertex_data_type & data ()
Returns a reference to the data on the vertex.
GraphLab负责将vertex_data对象包装为vertex_data_type。 当我运行它时,我在push_back()函数中得到一些顶点的seg错误。 我检查了vid,它总是一个带有实际值的整数。 运行vertex.data()。current_path.size(),我得到0。
我尝试了几种方法,比如创建一个局部向量,并在vertex.data()中替换一个,然后在推送id之前调整大小。在第一种情况下,我在尝试更换时遇到了seg故障,而在第二种情况下,resize执行没有问题,但推送不断给我seg错误。
您对可能出现的问题有任何想法吗?
由于
答案 0 :(得分:0)
Graphlab中的类需要是可序列化的。因此,如果变量不是普通旧数据(POD),则需要编写自己的加载和保存函数。
在你的情况下,它应该是这样的(请注意,加载和保存列表应该是相同的顺序):
struct vertex_data {
std::vector<int> current_path;
bool visited;
int destination;
vertex_data() {
destination = -1;
visited = false;
}
void save(graphlab::oarchive& oarc) const {
oarc << current_path << visited << destination;
}
void load(graphlab::iarchive& iarc) {
iarc >> current_path >> visited >> destination;
}
}