Пример #1
0
static void *
run_clip_permutation(void *args)
{
    CLIPSTATS_TREES *trees;
    JOB_COUNTER *jobcounter;
    RANDGEN_STATE randgen;
    WORKER *worker;
    gzFile fp=NULL;

    randgen_init(&randgen);
    worker = (WORKER *)args;
    jobcounter = worker->jobcounter;

    fp = gzopen(worker->readpool_input_path, "r");
    if (fp == NULL) {
        fprintf(stderr, "Failed to open input file %s\n", worker->readpool_input_path);
        return NULL;
    }

    trees = clipstatstrees_new();

#define BEGIN_JOBCOUNTER_EXCLUSIVE  pthread_mutex_lock(&jobcounter->lock);
#define END_JOBCOUNTER_EXCLUSIVE    pthread_mutex_unlock(&jobcounter->lock);
#define LOCK_AND_UPDATE_STATUS(worker, newstatus) do {  \
    pthread_mutex_lock(&(worker)->jobcounter->lock);    \
    (worker)->status = newstatus;                       \
    update_progression((worker));                       \
    pthread_mutex_unlock(&(worker)->jobcounter->lock);  \
} while (0)

    for (;;) {
        READ_QUEUE_SET *read_queue_set=NULL;
        struct timeval tv;

        /* Increase the job counter, exit the loop if all works done */
        BEGIN_JOBCOUNTER_EXCLUSIVE

        if (jobcounter->queued >= jobcounter->total) {
            END_JOBCOUNTER_EXCLUSIVE
            break;
        }

        jobcounter->queued++;
        gettimeofday(&worker->last_started, NULL);
        worker->status = WORKER_STATUS_READ_QUEUE_SHUFFLING;

        update_progression(worker);

        END_JOBCOUNTER_EXCLUSIVE

        /* Generate shuffled read queue from error profile */
        read_queue_set = generate_read_queue_set(&randgen,
                         worker->error_profile);
        if (read_queue_set == NULL) {
            LOCK_AND_UPDATE_STATUS(worker, WORKER_STATUS_ERROR);
            fclose(fp);
            return NULL;
        }

        /* Run simulated sequencing and get profiles */
        LOCK_AND_UPDATE_STATUS(worker, WORKER_STATUS_SIMULATING);

        gzrewind(fp);
        simulate_sequencing(fp, read_queue_set, trees);

        free_read_queue_set(read_queue_set);

        /* Increase the job counter for jobs done */
        BEGIN_JOBCOUNTER_EXCLUSIVE

        jobcounter->done++;
        worker->status = WORKER_STATUS_NOT_RUNNING;

        gettimeofday(&tv, NULL);
        worker->last_consumed = TIMEVAL_DIFF(worker->last_started, tv);
        update_progression(worker);

        END_JOBCOUNTER_EXCLUSIVE
    }
Пример #2
0
int main(void)
{
    mat *a,*b,*c,*d,*e,*f,*g,*h,*i,*j;
    const double b_init[] =
    {
        2.5,\
        2.0,\
        5.0
    };
    const double c_init[] =
    {
        1.0,10.0,6.7
    };
    
    a = mat_create(3,3);
    b = mat_create_from_ar(b_init,3,1);
    c = mat_create_from_ar(c_init,1,3);
    d = mat_create(2,2);
    e = mat_create(3,3);
    f = mat_create(3,3);
    g = mat_create(5,3);
    h = mat_create(3,5);
    i = mat_create(5,3);
    j = mat_create(3,1);
    
    randgen_init(12);
    latan_set_verb(DEBUG1);
    
    printf("---------- %-30s ----------\n","matrix product");
    printf("b =\n");
    mat_print(b,"%8.2f");
    printf("\n");
    printf("c =\n");
    mat_print(c,"%8.2f");
    printf("\n");
    printf("a <- b*c\n");
    mat_mul(a,b,'n',c,'n');
    printf("a =\n");
    mat_print(a,"%8.2f");
    printf("\n");

    printf("\n---------- %-30s ----------\n","sub-matrices");
    printf("d <- a(1:2,0:1)\n");
    mat_get_subm(d,a,1,0,2,1);
    printf("d =\n");
    mat_print(d,"%9.2f");
    printf("\n");
    printf("a(1,0:2) <- c\n");
    mat_set_subm(a,c,1,0,1,2);
    printf("a =\n");
    mat_print(a,"%8.2f");
    printf("\n");

    printf("\n---------- %-30s ----------\n","symmetric matrix product");
    printf("e <- a*t(a)\n");
    mat_mul(e,a,'n',a,'t');
    mat_print(e,"%8.2f");
    printf("\n");
    printf("e is assumed symmetric\n\n");
    mat_assume(e,MAT_SYM);
    printf("j <- e*b\n");
    mat_mul(j,e,'n',b,'t');
    mat_print(j,"%8.2f");
    printf("\n");
    printf("f <- a*e\n");
    mat_mul(f,a,'n',e,'n');
    mat_print(f,"%8.2f");
    printf("\n");
    printf("f <- e*t(a)\n");
    mat_mul(f,e,'n',a,'t');
    mat_print(f,"%8.2f");
    printf("\n");
    printf("g <- random(-1.0,1.0)\n");
    mat_rand_u(g,-1.0,1.0);
    mat_print(g,"%8.2f");
    printf("\n");
    printf("h <- e*t(g) (buffer should be created)\n");
    mat_mul(h,e,'n',g,'t');
    mat_print(h,"%8.2f");
    printf("\n");
    printf("i <- g*e\n");
    mat_mul(i,g,'n',e,'n');
    mat_print(i,"%8.2f");
    printf("\n");
    printf("e is not assumed symmetric anymore\n");
    mat_reset_assump(e);
    
    printf("\n---------- %-30s ----------\n","matrix inversion");
    printf("*** LU decomposition\n");
    printf("a <- random(-6.0,6.0)\n");
    mat_rand_u(a,-6.0,6.0);
    printf("a =\n");
    mat_print(a,"%8.2f");
    printf("\n");
    printf("e <- a^(-1)\n");
    mat_inv_LU(e,a);
    printf("e =\n");
    mat_print(e,"%8.2f");
    printf("\n");
    printf("f <- e*a\n");
    mat_mul(f,e,'n',a,'n');
    printf("f =\n");
    mat_print(f,"%8.2f");
    printf("\n");
    printf("*** pseudo-inverse with good-conditioned matrix\n");
    printf("a =\n");
    mat_print(a,"%8.2f");
    printf("\n");
    printf("e <- a^+\n");
    mat_pseudoinv(e,a);
    printf("e =\n");
    mat_print(e,"%8.2f");
    printf("\n");
    printf("f <- e*a\n");
    mat_mul(f,e,'n',a,'n');
    printf("f =\n");
    mat_print(f,"%8.2f");
    printf("\n");
    printf("*** symmetric pseudo-inverse with good-conditioned matrix\n");
    printf("a <- a*t(a)\n");
    mat_mul(a,a,'n',a,'t');
    mat_print(a,"%8.2f");
    printf("\n");
    printf("a is assumed symmetric and positive\n\n");
    mat_assume(a,(mat_flag)(MAT_SYM|MAT_POS));
    printf("e <- a^+\n");
    mat_pseudoinv(e,a);
    printf("e =\n");
    mat_print(e,"%8.2f");
    printf("\n");
    printf("f <- e*a\n");
    mat_mul(f,e,'n',a,'n');
    printf("f =\n");
    mat_print(f,"%8.2f");
    printf("\n");
    printf("*** Cholesky decomposition\n");
    printf("e <- a^(-1)\n");
    mat_inv_symChol(e,a);
    printf("e =\n");
    mat_print(e,"%8.2f");
    printf("\n");
    printf("f <- e*a\n");
    mat_mul(f,e,'n',a,'n');
    printf("f =\n");
    mat_print(f,"%8.2f");
    printf("\n");
    
    mat_destroy(a);
    mat_destroy(b);
    mat_destroy(c);
    mat_destroy(d);
    mat_destroy(e);
    mat_destroy(f);
    mat_destroy(g);
    mat_destroy(h);
    mat_destroy(i);
    mat_destroy(j);
    
    return EXIT_SUCCESS;
}
Пример #3
0
/*
**
** void start_randgen(int iSeed1, int iSeed2)
**
** Seeds the random number generator
**
*/
void start_randgen(int iSeed1, int iSeed2)
{
	randgen_init(iSeed1, iSeed2); 
}