diff options
-rw-r--r-- | src/correlations.c | 147 |
1 files changed, 50 insertions, 97 deletions
diff --git a/src/correlations.c b/src/correlations.c index 3e7749c..e80c792 100644 --- a/src/correlations.c +++ b/src/correlations.c @@ -2,9 +2,9 @@ #include "fracture.h" struct fibn { - unsigned int value; - unsigned int priority; - unsigned int rank; + uint_t value; + uint_t priority; + uint_t rank; bool marked; struct fibn *first_child; struct fibn *parent; @@ -14,12 +14,14 @@ struct fibn { typedef struct { struct fibn *min; - unsigned int rank; - unsigned int trees; + uint_t rank; + uint_t trees; struct fibn **vertex_to_node; } fibh; -unsigned int fib_findmin(fibh *heap) { return heap->min->value; } +uint_t fib_findmin(fibh *heap) { + return heap->min->value; +} void ll_setparent(struct fibn *ll, struct fibn *parent) { struct fibn *curnode = ll->next; @@ -70,7 +72,7 @@ struct fibn *ll_delroot(struct fibn *ll) { return ll_beg; } -void fib_insert(fibh *heap, unsigned int value, unsigned int priority) { +void fib_insert(fibh *heap, uint_t value, uint_t priority) { struct fibn *newnode = calloc(1, sizeof(struct fibn)); newnode->value = value; newnode->priority = priority; @@ -89,7 +91,7 @@ void fib_insert(fibh *heap, unsigned int value, unsigned int priority) { } void fib_deletemin(fibh *heap) { - unsigned int min_rank = heap->min->rank; + uint_t min_rank = heap->min->rank; struct fibn *min_children = heap->min->first_child; struct fibn *trees = ll_delroot(heap->min); @@ -108,11 +110,11 @@ void fib_deletemin(fibh *heap) { heap->rank = 0; } else { // min had children or there were other trees - unsigned int min_val = UINT_MAX; + uint_t min_val = UINT_MAX; struct fibn *min_ptr = NULL; - unsigned int max_rank = 0; + uint_t max_rank = 0; struct fibn *curnode = trees; - for (unsigned int i = 0; i < heap->trees; i++) { + for (uint_t i = 0; i < heap->trees; i++) { if (curnode->priority < min_val) { min_ptr = curnode; min_val = curnode->priority; @@ -160,8 +162,7 @@ void fib_deletemin(fibh *heap) { } } -void fib_decreasekey(fibh *heap, unsigned int value, - unsigned int new_priority) { +void fib_decreasekey(fibh *heap, uint_t value, uint_t new_priority) { struct fibn *node = heap->vertex_to_node[value]; if (node != NULL) { node->priority = new_priority; @@ -197,17 +198,17 @@ void fib_decreasekey(fibh *heap, unsigned int value, } } -unsigned int *dijkstra(const graph_t *network, unsigned int source) { - unsigned int nv = network->dnv; - unsigned int *vei = network->dvei; - unsigned int *ve = network->dve; - unsigned int *ev = network->dev; +uint_t *dijkstra(const graph_t *network, uint_t source) { + uint_t nv = network->dnv; + uint_t *vei = network->dvei; + uint_t *ve = network->dve; + uint_t *ev = network->dev; - unsigned int *dist = (unsigned int *)calloc(nv, sizeof(unsigned int)); + uint_t *dist = (uint_t *)calloc(nv, sizeof(uint_t)); fibh *Q = (fibh *)calloc(1, sizeof(fibh)); Q->vertex_to_node = (struct fibn **)calloc(nv, sizeof(struct fibn *)); - for (unsigned int i = 0; i < nv; i++) { + for (uint_t i = 0; i < nv; i++) { if (i != source) { dist[i] = UINT_MAX; } @@ -216,13 +217,13 @@ unsigned int *dijkstra(const graph_t *network, unsigned int source) { } while (Q->min != NULL) { - unsigned int u = fib_findmin(Q); + uint_t u = fib_findmin(Q); fib_deletemin(Q); - for (unsigned int i = 0; i < vei[u + 1] - vei[u]; i++) { - unsigned int e = ve[vei[u] + i]; - unsigned int v = ev[2 * e] == u ? ev[2 * e + 1] : ev[2 * e]; - unsigned int alt = dist[u] + 1; + for (uint_t i = 0; i < vei[u + 1] - vei[u]; i++) { + uint_t e = ve[vei[u] + i]; + uint_t v = ev[2 * e] == u ? ev[2 * e + 1] : ev[2 * e]; + uint_t alt = dist[u] + 1; if (alt < dist[v]) { dist[v] = alt; fib_decreasekey(Q, v, alt); @@ -236,48 +237,48 @@ unsigned int *dijkstra(const graph_t *network, unsigned int source) { return dist; } -unsigned int **get_dists(const graph_t *network) { - unsigned int nv = network->dnv; - unsigned int **dists = (unsigned int **)malloc(nv * sizeof(unsigned int *)); +uint_t **get_dists(const graph_t *network) { + uint_t nv = network->dnv; + uint_t **dists = (uint_t **)malloc(nv * sizeof(uint_t *)); -#pragma omp parallel for - for (unsigned int i = 0; i < nv; i++) { + #pragma omp parallel for + for (uint_t i = 0; i < nv; i++) { dists[i] = dijkstra(network, i); } return dists; } -double *get_corr(net_t *instance, unsigned int **dists, cholmod_common *c) { - unsigned int nv = instance->graph->dnv; - unsigned int ne = instance->graph->ne; - unsigned int *ev = instance->graph->dev; +double *get_corr(net_t *instance, uint_t **dists, cholmod_common *c) { + uint_t nv = instance->graph->dnv; + uint_t ne = instance->graph->ne; + uint_t *ev = instance->graph->dev; bool nulldists = false; if (dists == NULL) { dists = get_dists(instance->graph); nulldists = true; } double *corr = calloc(nv, sizeof(double)); - unsigned int *marks = get_clusters(instance, c); - unsigned int *numat = calloc(nv, sizeof(unsigned int)); - - for (unsigned int i = 0; i < ne; i++) { - unsigned int v1 = ev[2 * i]; - unsigned int v2 = ev[2 * i + 1]; - for (unsigned int j = 0; j < ne; j++) { - unsigned int v3 = ev[2 * j]; - unsigned int v4 = ev[2 * j + 1]; - unsigned int dist1 = dists[v1][v3]; - unsigned int dist2 = dists[v1][v4]; - unsigned int dist3 = dists[v2][v3]; - unsigned int dist4 = dists[v2][v4]; - unsigned int dist = (dist1 + dist2 + dist3 + dist4) / 4; + uint_t *marks = get_clusters(instance, c); + uint_t *numat = calloc(nv, sizeof(uint_t)); + + for (uint_t i = 0; i < ne; i++) { + uint_t v1 = ev[2 * i]; + uint_t v2 = ev[2 * i + 1]; + for (uint_t j = 0; j < ne; j++) { + uint_t v3 = ev[2 * j]; + uint_t v4 = ev[2 * j + 1]; + uint_t dist1 = dists[v1][v3]; + uint_t dist2 = dists[v1][v4]; + uint_t dist3 = dists[v2][v3]; + uint_t dist4 = dists[v2][v4]; + uint_t dist = (dist1 + dist2 + dist3 + dist4) / 4; corr[dist] += instance->fuses[i] && instance->fuses[j]; numat[dist]++; } } - for (unsigned int i = 0; i < nv; i++) { + for (uint_t i = 0; i < nv; i++) { if (numat[i] > 0) { corr[i] /= numat[i]; } @@ -295,51 +296,3 @@ double *get_corr(net_t *instance, unsigned int **dists, cholmod_common *c) { return corr; } -/* -double *get_space_corr(net_t *instance, cholmod_common *c) { - unsigned int nv = instance->graph->dnv; - double *vc = instance->graph->dvx; - unsigned int ne = instance->graph->ne; - unsigned int *ev = instance->graph->dev; - double *corr = calloc(nv, sizeof(unsigned int)); - unsigned int *numat = calloc(nv, sizeof(unsigned int)); - - for (unsigned int i = 0; i < ne; i++) { - unsigned int v1 = ev[2 * i]; - unsigned int v2 = ev[2 * i + 1]; - double v1x = vc[2 * v1]; - double v1y = vc[2 * v1 + 1]; - double v2x = vc[2 * v2]; - double v2y = vc[2 * v2 + 1]; - double e1x = (v1x + v2x) / 2; - double e1y = (v1y + v2y) / 2; - for (unsigned int j = 0; j < ne; j++) { - unsigned int v3 = ev[2 * j]; - unsigned int v4 = ev[2 * j + 1]; - double v1x = vc[2 * v1]; - double v1y = vc[2 * v1 + 1]; - double v2x = vc[2 * v2]; - double v2y = vc[2 * v2 + 1]; - double e1x = (v1x + v2x) / 2; - double e1y = (v1y + v2y) / 2; - corr[dist] += instance->fuses[i] && instance->fuses[j]; - numat[dist]++; - } - } - - for (unsigned int i = 0; i < nv; i++) { - if (numat[i] > 0) { - corr[i] /= numat[i]; - } - } - - for (int i = 0; i < nv; i++) { - free(dists[i]); - } - - free(marks); - free(dists); - - return corr; -} -*/ |