2015-05-02 4 views
0

Я пытаюсь реализовать алгоритм BFS с помощью GraphLab. В моей структуре vertex_data я использую вектор, чтобы провести путь, пройденный до сих пор.std :: vector :: push_back throws segmentation fault in GraphLab apply()

struct vertex_data { 

    std::vector<int> current_path; 
    bool visited; 
    int destination; 
    vertex_data() { 
     destination = -1; 
     visited = false; 
    } 
} 

Затем в функции применяются() Я пытаюсь нажать текущий идентификатор вершины в 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); 
} 
} 

Также определение данных() в документации является:

vertex_data_type & data() 
    Returns a reference to the data on the vertex. 

GraphLab заботится о обертывание vertex_data объект как vertex_data_type. Когда я запускаю его, я получаю ошибку seg в функции push_back() для некоторых вершин. Я проверил vid и всегда является целым числом с фактическим значением. Выполнение vertex.data(). Current_path.size(), я получаю 0.

Я пробовал несколько подходов, например, создание локального вектора и замену его на vertex.data() и изменение размера перед нажатием id. В первом случае я получаю ошибку seg при попытке заменить, а во втором случае изменение размера выполняется без проблем, но нажатие продолжает давать мне ошибку seg.

Есть ли у вас какие-либо идеи о том, что может быть проблемой?

Благодаря

+0

Пожалуйста, покажите определение of 'vertex.data()' – Mat

+0

Интересно, что возвращает ваш 'data()'. – user3528438

+0

Вы уверены, что 'msg' на самом деле является экземпляром' struct vertex_data', а не, скажем, ссылкой на удаленный и перезаписанный мусор, который набирается как 'vertex_data', но может содержать что-нибудь? – abarnert

ответ

0

Классы в Graphlab нужно сериализовать. Поэтому вам нужно написать собственную функцию загрузки и сохранения, если переменные не являются обычными старыми данными (POD).

В вашем случае, это должно быть так (Обратите внимание, что загрузка и сохранение списка должен быть тот же порядок):

структура 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; 
} 

}

Смежные вопросы