Skip to content

Commit e5d179b

Browse files
committed
fix some adjlist bug
1 parent 97d7435 commit e5d179b

File tree

3 files changed

+140
-2
lines changed

3 files changed

+140
-2
lines changed

modules/graph/grin/c/test.c

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ GRIN_GRAPH get_graph(int argc, char** argv) {
2525
GRIN_PARTITION_LIST local_partitions = grin_get_local_partition_list(pg);
2626
GRIN_PARTITION partition =
2727
grin_get_partition_from_list(pg, local_partitions, 0);
28+
GRIN_PARTITION_ID partition_id = grin_get_partition_id(pg, partition);
29+
GRIN_PARTITION p1 = grin_get_partition_by_id(pg, partition_id);
30+
if (!grin_equal_partition(pg, partition, p1)) {
31+
printf("partition not match\n");
32+
}
33+
grin_destroy_partition(pg, p1);
2834
GRIN_GRAPH g = grin_get_local_graph_by_partition(pg, partition);
2935
grin_destroy_partition(pg, partition);
3036
grin_destroy_partition_list(pg, local_partitions);
@@ -35,6 +41,20 @@ GRIN_GRAPH get_graph(int argc, char** argv) {
3541
return g;
3642
}
3743

44+
45+
#ifdef GRIN_ENABLE_GRAPH_PARTITION
46+
GRIN_PARTITION get_partition(int argc, char** argv) {
47+
GRIN_PARTITIONED_GRAPH pg =
48+
grin_get_partitioned_graph_from_storage(argc - 1, &(argv[1]));
49+
GRIN_PARTITION_LIST local_partitions = grin_get_local_partition_list(pg);
50+
GRIN_PARTITION partition =
51+
grin_get_partition_from_list(pg, local_partitions, 0);
52+
grin_destroy_partition_list(pg, local_partitions);
53+
grin_destroy_partitioned_graph(pg);
54+
return partition;
55+
}
56+
#endif
57+
3858
#ifdef GRIN_ENABLE_GRAPH_PARTITION
3959
GRIN_PARTITIONED_GRAPH get_partitioend_graph(int argc, char** argv) {
4060
GRIN_PARTITIONED_GRAPH pg =
@@ -864,7 +884,124 @@ void test_property(int argc, char** argv) {
864884
test_error_code(argc, argv);
865885
}
866886

887+
888+
void test_partition_reference(int argc, char** argv) {
889+
printf("+++++++++++++++++++++ Test partition/reference +++++++++++++++++++++\n");
890+
GRIN_GRAPH g = get_graph(argc, argv);
891+
GRIN_PARTITION p0 = get_partition(argc, argv);
892+
893+
GRIN_VERTEX_LIST vlist = grin_get_vertex_list(g);
894+
GRIN_VERTEX_LIST_ITERATOR vli = grin_get_vertex_list_begin(g, vlist);
895+
GRIN_VERTEX_LIST mvlist = grin_select_master_for_vertex_list(g, vlist);
896+
grin_destroy_vertex_list(g, vlist);
897+
898+
size_t cnt = 0;
899+
while (!grin_is_vertex_list_end(g, vli)) {
900+
cnt++;
901+
GRIN_VERTEX v = grin_get_vertex_from_iter(g, vli);
902+
GRIN_VERTEX_REF vref = grin_get_vertex_ref_by_vertex(g, v);
903+
#ifdef GRIN_TRAIT_FAST_VERTEX_REF
904+
long long int sref = grin_serialize_vertex_ref_as_int64(g, vref);
905+
GRIN_VERTEX_REF vref1 = grin_deserialize_int64_to_vertex_ref(g, sref);
906+
#else
907+
const char* sref = grin_serialize_vertex_ref(g, vref);
908+
GRIN_VERTEX_REF vref1 = grin_deserialize_vertex_ref(g, sref);
909+
grin_destroy_string_value(g, sref);
910+
#endif
911+
GRIN_VERTEX v1 = grin_get_vertex_from_vertex_ref(g, vref1);
912+
if (!grin_equal_vertex(g, v, v1)) {
913+
printf("vertex not match\n");
914+
}
915+
916+
if (grin_is_master_vertex(g, v) && !grin_is_mirror_vertex(g, v)) {
917+
GRIN_PARTITION p = grin_get_master_partition_from_vertex_ref(g, vref);
918+
if (!grin_equal_partition(g, p, p0)) {
919+
printf("partition not match\n");
920+
}
921+
} else {
922+
printf("(Wrong) test only has one partition\n");
923+
}
924+
925+
grin_destroy_vertex_ref(g, vref);
926+
grin_destroy_vertex(g, v);
927+
grin_get_next_vertex_list_iter(g, vli);
928+
}
929+
printf("num of vertex checked: %zu\n", cnt);
930+
931+
#ifdef GRIN_ENABLE_VERTEX_LIST_ARRAY
932+
size_t mvlist_size = grin_get_vertex_list_size(g, mvlist);
933+
if (mvlist_size != cnt) {
934+
printf("(Wrong) master vertex list size not match\n");
935+
}
936+
#endif
937+
938+
grin_destroy_vertex_list(g, mvlist);
939+
grin_destroy_graph(g);
940+
}
941+
942+
void test_partition(int argc, char** argv) {
943+
#ifdef GRIN_ENABLE_GRAPH_PARTITION
944+
test_partition_reference(argc, argv);
945+
#endif
946+
}
947+
948+
949+
void test_topology_adjacent_list(int argc, char** argv) {
950+
GRIN_GRAPH g = get_graph(argc, argv);
951+
952+
GRIN_VERTEX v = get_one_vertex(g);
953+
954+
GRIN_ADJACENT_LIST al = grin_get_adjacent_list(g, OUT, v);
955+
GRIN_ADJACENT_LIST_ITERATOR ali = grin_get_adjacent_list_begin(g, al);
956+
grin_destroy_adjacent_list(g, al);
957+
size_t cnt = 0;
958+
959+
while (!grin_is_adjacent_list_end(g, ali)) {
960+
cnt++;
961+
962+
GRIN_EDGE e = grin_get_edge_from_adjacent_list_iter(g, ali);
963+
GRIN_VERTEX v1 = grin_get_src_vertex_from_edge(g, e);
964+
if (!grin_equal_vertex(g, v, v1)) {
965+
printf("vertex not match\n");
966+
}
967+
968+
GRIN_VERTEX v2 = grin_get_dst_vertex_from_edge(g, e);
969+
GRIN_VERTEX u = grin_get_neighbor_from_adjacent_list_iter(g, ali);
970+
if (!grin_equal_vertex(g, v2, u)) {
971+
printf("vertex not match\n");
972+
}
973+
974+
grin_destroy_vertex(g, v1);
975+
grin_destroy_vertex(g, v2);
976+
grin_destroy_vertex(g, u);
977+
grin_destroy_edge(g, e);
978+
grin_get_next_adjacent_list_iter(g, ali);
979+
}
980+
981+
printf("num of edge checked: %zu\n", cnt);
982+
983+
grin_destroy_adjacent_list_iter(g, ali);
984+
grin_destroy_vertex(g, v);
985+
grin_destroy_graph(g);
986+
}
987+
988+
void test_topology_structure(int argc, char** argv) {
989+
GRIN_GRAPH g = get_graph(argc, argv);
990+
991+
printf("vnum: %zu, enum: %zu\n", grin_get_vertex_num(g), grin_get_edge_num(g));
992+
993+
grin_destroy_graph(g);
994+
}
995+
996+
997+
void test_topology(int argc, char** argv) {
998+
test_topology_structure(argc, argv);
999+
test_topology_adjacent_list(argc, argv);
1000+
}
1001+
8671002
int main(int argc, char** argv) {
8681003
test_property(argc, argv);
1004+
test_partition(argc, argv);
1005+
test_topology(argc, argv);
8691006
return 0;
8701007
}

modules/graph/grin/src/topology/adjacentlist.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ void grin_get_next_adjacent_list_iter(GRIN_GRAPH g, GRIN_ADJACENT_LIST_ITERATOR
111111
if (_ali->current < _ali->data.size()) break;
112112
_ali->etype_current++;
113113
_ali->current = 0;
114+
if (_ali->etype_current >= _ali->etype_end) break;
114115
if (_ali->dir == GRIN_DIRECTION::IN) {
115116
_ali->data = _g->GetIncomingRawAdjList(_GRIN_GRAPH_T::vertex_t(_ali->vid), _ali->etype_current);
116117
} else {
@@ -124,7 +125,7 @@ bool grin_is_adjacent_list_end(GRIN_GRAPH g, GRIN_ADJACENT_LIST_ITERATOR ali) {
124125
return _ali->etype_current >= _ali->etype_end;
125126
}
126127

127-
GRIN_VERTEX grin_get_neighbor_from_iter(GRIN_GRAPH g, GRIN_ADJACENT_LIST_ITERATOR ali) {
128+
GRIN_VERTEX grin_get_neighbor_from_adjacent_list_iter(GRIN_GRAPH g, GRIN_ADJACENT_LIST_ITERATOR ali) {
128129
auto _ali = static_cast<GRIN_ADJACENT_LIST_ITERATOR_T*>(ali);
129130
auto _nbr = _ali->data.begin() + _ali->current;
130131
auto v = new GRIN_VERTEX_T(_nbr->vid);

0 commit comments

Comments
 (0)