조성현

add shortest path finding (in experiment)

...@@ -310,8 +310,10 @@ void GraphItem::reset_color() ...@@ -310,8 +310,10 @@ void GraphItem::reset_color()
310 } 310 }
311 } 311 }
312 312
313 -void GraphItem::topK_highlight() 313 +void GraphItem::topK_highlight_with_total()
314 { 314 {
315 + // 전체 그래프 기준 topK highlight
316 +
315 // 저자 노드별 실적 계산 317 // 저자 노드별 실적 계산
316 vertex_iterator vi, vi_end; 318 vertex_iterator vi, vi_end;
317 Graph::adjacency_iterator ai, ai_end; 319 Graph::adjacency_iterator ai, ai_end;
...@@ -374,29 +376,67 @@ void GraphItem::test() ...@@ -374,29 +376,67 @@ void GraphItem::test()
374 qDebug("* path highlighting start"); 376 qDebug("* path highlighting start");
375 vertex_iterator vi, vi_end; 377 vertex_iterator vi, vi_end;
376 //find start, end node's id 378 //find start, end node's id
377 - int start_idx, end_idx; 379 +
380 + auto vertex_idx = boost::get(vertex_index, *graph);
381 + auto nodeLabel = boost::get(vertex_name, *graph);
382 +
383 + int start_idx=-1, end_idx=-1;
378 for (boost::tie(vi, vi_end)=vertices(*graph); vi!=vi_end; ++vi) { 384 for (boost::tie(vi, vi_end)=vertices(*graph); vi!=vi_end; ++vi) {
379 - string node_name = boost::get(vertex_name, *graph, *vi); 385 + //string node_name = boost::get(vertex_name, *graph, *vi);
380 - if (node_name == "Seong Chul Cho") { 386 + const string& node_name = nodeLabel[*vi];
381 - start_idx = boost::get(vertex_index, *graph, *vi); 387 + if (node_name == "Jung Gon Kim") {
382 - } else if (node_name == "Hyung Jin Kim") { 388 + start_idx = vertex_idx[*vi];
383 - end_idx = boost::get(vertex_index, *graph, *vi); 389 + } else if (node_name == "Yong-Jin Kim") {
390 + end_idx = vertex_idx[*vi];
384 } 391 }
385 } 392 }
386 393
394 +
395 + if (start_idx==-1 || end_idx==-1) {
396 + qDebug() << start_idx << " " << end_idx;
397 + qDebug("no target node");
398 + return;
399 + }
400 + else if (start_idx == end_idx) {
401 + qDebug("start and end node are same!");
402 + return;
403 + }
404 +
387 vector<vertex_descriptor> parents(num_vertices(*graph)); 405 vector<vertex_descriptor> parents(num_vertices(*graph));
388 vector<double> distances(num_vertices(*graph)); 406 vector<double> distances(num_vertices(*graph));
389 vertex_descriptor start_vertex = boost::vertex(start_idx, *graph); 407 vertex_descriptor start_vertex = boost::vertex(start_idx, *graph);
408 +
409 + //shortest path using dijkstra
390 boost::dijkstra_shortest_paths(*graph, start_vertex, 410 boost::dijkstra_shortest_paths(*graph, start_vertex,
391 predecessor_map(boost::make_iterator_property_map(parents.begin(), boost::get(boost::vertex_index, *graph))). 411 predecessor_map(boost::make_iterator_property_map(parents.begin(), boost::get(boost::vertex_index, *graph))).
392 distance_map(boost::make_iterator_property_map(distances.begin(), get(boost::vertex_index, *graph)))); 412 distance_map(boost::make_iterator_property_map(distances.begin(), get(boost::vertex_index, *graph))));
413 +
414 + //check distances
415 + //qDebug() << "dist: " << distances[end_idx];
416 + //qDebug();
417 + //for (int i = 0; i < distances.size(); ++i) {
418 + // qDebug() << "dist[" << i << "]: " << distances[i];
419 + //}
420 + //qDebug();
421 + if (distances[end_idx] >= whole_node_cnt) {
422 + //no path (dist == 0)
423 + qDebug() << "no path!";
424 + return;
425 + }
426 +
393 //path finding 427 //path finding
394 qDebug("* path finding start"); 428 qDebug("* path finding start");
395 vertex_descriptor current = boost::vertex(end_idx, *graph); 429 vertex_descriptor current = boost::vertex(end_idx, *graph);
396 - while (current != boost::vertex(start_idx, *graph)) { 430 + qDebug() << "end: " << nodeLabel[current].c_str();
397 - 431 + while (1) {
432 + current = parents[vertex_idx[current]];
433 + qDebug() << nodeLabel[current].c_str();
434 + if (current == start_vertex) break;
398 } 435 }
399 qDebug("* path finding end"); 436 qDebug("* path finding end");
437 +
438 +
439 + qDebug("* path highlighting start");
400 qDebug("* path highlighting end"); 440 qDebug("* path highlighting end");
401 } 441 }
402 442
......
...@@ -28,7 +28,7 @@ public: ...@@ -28,7 +28,7 @@ public:
28 //methods 28 //methods
29 void might_know(); 29 void might_know();
30 void reset_color(); 30 void reset_color();
31 - void topK_highlight(); 31 + void topK_highlight_with_total();
32 32
33 //test 33 //test
34 void test(); 34 void test();
...@@ -41,8 +41,6 @@ protected: ...@@ -41,8 +41,6 @@ protected:
41 private: 41 private:
42 ifstream fin; 42 ifstream fin;
43 bm_type node_ids; 43 bm_type node_ids;
44 - //vector<pair<string, string>> edges;
45 - //vector<pair<int, int>> edges_indexes;
46 vector<vertex_descriptor> vdes; 44 vector<vertex_descriptor> vdes;
47 int whole_node_cnt = 0; 45 int whole_node_cnt = 0;
48 46
......
...@@ -58,7 +58,7 @@ void PaperGraphWidget::might_know() ...@@ -58,7 +58,7 @@ void PaperGraphWidget::might_know()
58 58
59 void PaperGraphWidget::topk() 59 void PaperGraphWidget::topk()
60 { 60 {
61 - graphItem->topK_highlight(); 61 + graphItem->topK_highlight_with_total();
62 scene->update(); 62 scene->update();
63 } 63 }
64 64
......