int main (int argc, char **argv) { ILLrandstate *rstate; double *dlen; int *perm; int i, n, m, fr; int rval = 0; argc--; ILL_NEW (rstate, ILLrandstate); ILLutil_sprand (10, rstate); ILL_SAFE_MALLOC (dlen, argc, double); ILL_SAFE_MALLOC (perm, argc, int); for (i = 0; i < argc; i++) { sscanf (argv[i + 1], "%lf", dlen + i); } for (fr = 0; fr <= argc / 2; fr++) { n = argc - 2 * fr; m = n / 2; perm_init (perm, 0, argc); fprintf (stdout, "rselect: fr=%d n=%d m=%d: ", fr, n, m); for (i = 0; i < n; i++) { fprintf (stdout, "%.1f ", dlen[perm[fr + i]]); } ILLutil_rselect (perm, fr, fr + n - 1, m, dlen, rstate); fprintf (stdout, " -> "); for (i = 0; i < m; i++) { fprintf (stdout, "%.1f ", dlen[perm[fr + i]]); } fprintf (stdout, "\n"); } CLEANUP: exit (rval); }
static int find_permutation(TWGraph *gr, int **_perm, int **_invp, real threshold) { // Making permututation vector // // v-th vertex comes perm[v] // e.g. perm[0] <-- root // invp[root] <-- 0 int err = ERROR_NO_ERROR; int root; int *perm, *invp; int *level, *ind_ptr; int n = gr->size; level = (int*)malloc(sizeof(int)*(gr->size)); ind_ptr = (int*)malloc(sizeof(int)*(gr->size+1)); if (level == NULL || ind_ptr == NULL) { if (level) free(level); if (ind_ptr) free(ind_ptr); return ERROR_MEMORY_ALLOCATION; } // -2 -- not yet seen // -1 -- already in queue // 0..n -- already numbered err = perm_init(gr->size, _perm, _invp); if ( err != ERROR_NO_ERROR ) return err; perm = *_perm; invp = *_invp; while ( (root = perm_get_free_index(gr->size, invp)) != -1 ) { #ifdef _DEBUG_LEVEL_1 printf("[debug(1)]{find_permutation}: root = %d\n", root); #endif err = tnd_for_subgraph(gr, root, perm, invp, &n, ind_ptr, level, threshold); if (err != ERROR_NO_ERROR) ERROR_MESSAGE("tnd: tnd_for_subgraph failed", err); #ifdef _DEBUG_LEVEL_1 int __i; printf("[debug]{find_permutation}: current permutation: \n\t"); for (__i = 0; __i < gr->size; ++__i) printf("%d ", perm[__i]); printf("\n"); #endif } #ifdef _DEBUG_LEVEL_1 int __i; printf("[debug(1)]{find_permutation}:"); printf("\n i:"); for (__i = 0; __i < gr->size; __i++) printf("%4d ", __i); printf("\nperm:"); for (__i = 0; __i < gr->size; __i++) printf("%4d ", perm[__i]); printf("\ninvp:"); for (__i = 0; __i < gr->size; __i++) printf("%4d ", invp[__i]); printf("\n"); #endif if (level) free(level); if (ind_ptr) free(ind_ptr); return ERROR_NO_ERROR; }
static int find_permutation(TWGraph *gr, int **_perm, int **_invp, real threshold) { // Making permututation vector // // v-th vertex comes perm[v] // e.g. perm[0] <-- root // invp[root] <-- 0 int err = ERROR_NO_ERROR; int root; int *perm, *invp; // -2 -- not yet seen // -1 -- already in queue // 0..n -- already numbered err = perm_init(gr->size, _perm, _invp); if ( err != ERROR_NO_ERROR ) return err; perm = *_perm; invp = *_invp; int v, g, i, gg, gi, s = 0; int include_flag; TQueue queue; queue_init(&queue); while ( (root = find_periphery(gr, invp)) != -1 ) { #ifdef _DEBUG_LEVEL_1 printf("[debug(1)]{find_permutation}: root = %d\n", root); #endif // actually it is simple bs invp[root] = -1; queue_push(&queue, root); while (queue_pop(&queue, &v)) { if (invp[v] != -1) continue; for (i = gr->xadj[v]; i < gr->xadj[v+1]; i++) { g = gr->adjncy[i]; if ( ( invp[g] < 0 ) && ( FABS(gr->wvert[g]) < MIN2(threshold, FABS(gr->wvert[v])) ) ) { // g - candidate for including in front of queue #ifdef _ZRCM_SMART include_flag = 1; for (gi = gr->xadj[g]; gi < gr->xadj[g+1]; gi++) { gg = gr->adjncy[gi]; if ( (invp[gg] < 0) && (gg != v) && ( FABS(gr->wvert[gg]) > MAX2(threshold, FABS(gr->wvert[g])) ) ) { include_flag = 0; break; } } if (include_flag) { stack_push(&queue, v); v = g; } break; #else stack_push(&queue, v); v = g; break; #endif } } #ifdef DIRECT_CM perm[s] = v; invp[v] = s++; // put connected vertices closer #else perm[gr->size - 1 - s] = v; invp[v] = gr->size - 1 - s++; // put connected vertices closer #endif for (i = gr->xadj[v]; i < gr->xadj[v+1]; i++) { g = gr->adjncy[i]; if ( invp[g] == -2 ) { invp[g] = -1; queue_push(&queue, g); // put unindexed vertices to queue } } } #ifdef _DEBUG_LEVEL_1 printf("[debug]{find_permutation}: current permutation: \n\t"); for (i = 0; i < gr->size; ++i) printf("%d ", perm[i]); printf("\n"); #endif } #ifdef _DEBUG_LEVEL_1 int __i; printf("[debug(1)]{find_permutation}:"); printf("\n i:"); for (__i = 0; __i < gr->size; __i++) printf("%4d ", __i); printf("\nperm:"); for (__i = 0; __i < gr->size; __i++) printf("%4d ", perm[__i]); printf("\ninvp:"); for (__i = 0; __i < gr->size; __i++) printf("%4d ", invp[__i]); printf("\n"); #endif return ERROR_NO_ERROR; }