Esempio n. 1
0
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);
}
Esempio n. 2
0
File: tnd.c Progetto: evatux/kaa
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;
}
Esempio n. 3
0
File: rcm.c Progetto: evatux/kaa
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;
}