20 #define EDGE_INC_FACTOR (1.2)
22 #define TSUF_INC_FACTOR (1.1)
24 #define QSUF_INC_FACTOR (1.1)
32 static long long int n_edge = 0;
34 static int *__edge_node =
NULL;
38 static size_t e_hash_size;
40 static size_t e_buf_size;
42 static int n_tsuf = 0;
44 static int *__tsuf_node =
NULL;
48 static size_t t_hash_size;
50 static size_t t_buf_size;
52 static int n_qsuf = 0;
54 static int *__qsuf_node =
NULL;
58 static size_t q_hash_size;
60 static size_t q_buf_size;
107 if (n_node < 1000000 && n_elem < 1000000) {
108 e_hash_size = (n_node > n_elem) ? n_node : n_elem;
109 e_buf_size = (n_node > n_elem) ? 10 * n_node : 10 * n_elem;
111 e_hash_size = (n_node > n_elem) ? n_node : n_elem;
112 e_buf_size = (n_node > n_elem) ? n_node : n_elem;
117 if (edge_node ==
NULL) {
137 if (e_hash_tbl ==
NULL) {
141 for (i = 0; i < e_hash_size; i++) {
142 e_hash_tbl[i] =
NULL;
169 if (n_node < 1000000 && n_elem < 1000000) {
170 t_hash_size = (n_node > n_elem) ? n_node : n_elem;
171 t_buf_size = (n_node > n_elem) ? 4 * n_node : 4 * n_elem;
173 t_hash_size = (n_node > n_elem) ? n_node : n_elem;
174 t_buf_size = (n_node > n_elem) ? n_node : n_elem;
179 if (tsuf_node ==
NULL) {
205 if (t_hash_tbl ==
NULL) {
209 for (i = 0; i < t_hash_size; i++) {
210 t_hash_tbl[i] =
NULL;
237 if (n_node < 1000000 && n_elem < 1000000) {
238 q_hash_size = (n_node > n_elem) ? n_node : n_elem;
239 q_buf_size = (n_node > n_elem) ? 5 * n_node : 5 * n_elem;
241 q_hash_size = (n_node > n_elem) ? n_node : n_elem;
242 q_buf_size = (n_node > n_elem) ? n_node : n_elem;
247 if (qsuf_node ==
NULL) {
279 if (q_hash_tbl ==
NULL) {
283 for (i = 0; i < q_hash_size; i++) {
284 q_hash_tbl[i] =
NULL;
318 e_buf_size = new_buf_size;
352 t_buf_size = new_buf_size;
392 q_buf_size = new_buf_size;
415 __edge_node = (
int *)
HECMW_malloc(
sizeof(
int) * n_edge * 2);
416 if (__edge_node ==
NULL) {
421 for (i = 0; i < n_edge; i++) {
422 __edge_node[2 * i] = edge_node->
node1[i];
423 __edge_node[2 * i + 1] = edge_node->
node2[i];
439 __tsuf_node = (
int *)
HECMW_malloc(
sizeof(
int) * n_tsuf * 3);
440 if (__tsuf_node ==
NULL) {
445 for (i = 0; i < n_tsuf; i++) {
446 __tsuf_node[3 * i] = tsuf_node->
node1[i];
447 __tsuf_node[3 * i + 1] = tsuf_node->
node2[i];
448 __tsuf_node[3 * i + 2] = tsuf_node->
node3[i];
464 __qsuf_node = (
int *)
HECMW_malloc(
sizeof(
int) * n_qsuf * 4);
465 if (__qsuf_node ==
NULL) {
470 for (i = 0; i < n_qsuf; i++) {
471 __qsuf_node[4 * i] = qsuf_node->
node1[i];
472 __qsuf_node[4 * i + 1] = qsuf_node->
node2[i];
473 __qsuf_node[4 * i + 2] = qsuf_node->
node3[i];
474 __qsuf_node[4 * i + 3] = qsuf_node->
node4[i];
492 for (i = 0; i < e_hash_size; i++) {
494 for (q = e_hash_tbl[i], p = e_hash_tbl[i]; p; p = q) {
498 e_hash_tbl[i] =
NULL;
517 for (i = 0; i < t_hash_size; i++) {
519 for (q = t_hash_tbl[i], p = t_hash_tbl[i]; p; p = q) {
523 t_hash_tbl[i] =
NULL;
544 for (i = 0; i < q_hash_size; i++) {
546 for (q = q_hash_tbl[i], p = q_hash_tbl[i]; p; p = q) {
550 q_hash_tbl[i] =
NULL;
569 static void reorder_node_edge(
int m1,
int m2,
int *n1,
int *n2) {
579 static void reorder_node_tsuf(
int m1,
int m2,
int m3,
int *n1,
int *n2,
608 static void reorder_node_qsuf(
int m1,
int m2,
int m3,
int m4,
int *n1,
int *n2,
610 int l1, l2, l3, l4, l5, l6;
662 reorder_node_edge(node1, node2, &n1, &n2);
664 ndot = ((size_t)n1 % e_hash_size) + ((size_t)n2 % e_hash_size);
665 idx = ndot % e_hash_size;
667 for (p = e_hash_tbl[idx]; p; p = p->
next) {
669 reorder_node_edge(edge_node->
node1[eid], edge_node->
node2[eid], &m1, &m2);
670 if ((n1 == m1) && (n2 == m2)) {
681 p->
next = e_hash_tbl[idx];
684 if (n_edge >= e_buf_size) {
692 edge_node->
node1[eid] = node1;
693 edge_node->
node2[eid] = node2;
705 int n1, n2, n3, m1, m2, m3;
711 reorder_node_tsuf(node1, node2, node3, &n1, &n2, &n3);
713 ndot1 = ((size_t)n1 % t_hash_size) * ((size_t)n2 % t_hash_size);
714 ndot = ((size_t)n3 % t_hash_size) * (ndot1 % t_hash_size);
715 idx = ndot % t_hash_size;
717 for (p = t_hash_tbl[idx]; p; p = p->
next) {
719 reorder_node_tsuf(tsuf_node->
node1[tid], tsuf_node->
node2[tid],
720 tsuf_node->
node3[tid], &m1, &m2, &m3);
721 if ((n1 == m1) && (n2 == m2) && (n3 == m3)) {
732 p->
next = t_hash_tbl[idx];
735 if (n_tsuf >= t_buf_size) {
744 tsuf_node->
node1[tid] = node1;
745 tsuf_node->
node2[tid] = node2;
746 tsuf_node->
node3[tid] = node3;
758 int n1, n2, n3, n4, m1, m2, m3, m4;
761 size_t ndot1, ndot2, ndot;
764 reorder_node_qsuf(node1, node2, node3, node4, &n1, &n2, &n3, &n4);
766 ndot1 = (n1 % q_hash_size) * (n2 % q_hash_size);
767 ndot2 = (n3 % q_hash_size) * (n4 % q_hash_size);
768 ndot = (ndot1 % q_hash_size) * (ndot2 % q_hash_size);
769 idx = ndot % q_hash_size;
771 for (p = q_hash_tbl[idx]; p; p = p->
next) {
773 reorder_node_qsuf(qsuf_node->
node1[qid], qsuf_node->
node2[qid],
774 qsuf_node->
node3[qid], qsuf_node->
node4[qid], &m1, &m2,
777 if ((n1 == m1) && (n2 == m2) && (n3 == m3) && (n4 == m4)) {
788 p->
next = q_hash_tbl[idx];
791 if (n_qsuf >= q_buf_size) {
799 qsuf_node->
node1[qid] = node1;
800 qsuf_node->
node2[qid] = node2;
801 qsuf_node->
node3[qid] = node3;
802 qsuf_node->
node4[qid] = node3;