Пример #1
0
static void defineNewFinish(Multiplexer * multi) {
	multi->finish = fh_min(multi->finishes);

	if (fh_notempty(multi->starts)) {
		int min_start = fh_min(multi->starts);
		if (multi->finish > min_start) {
			multi->finish = min_start;
		}
	}
}
Пример #2
0
static void admitNewWiggleIteratorsIntoPlay(Multiplexer * multi) {
	while (fh_notempty(multi->starts) && fh_min(multi->starts) == multi->start) {
		int index = fh_extractmin(multi->starts);
		WiggleIterator * wi = multi->iters[index];
		fh_insert(multi->finishes, wi->finish, index);
		multi->inplay[index] = true;
		multi->values[index] = wi->value;
		multi->inplay_count++;
	}
}
Пример #3
0
static void popClosingWiggleIterators(Multiplexer * multi) {
	while (fh_notempty(multi->finishes) && fh_min(multi->finishes) == multi->finish) {
		int index = fh_extractmin(multi->finishes);
		WiggleIterator * wi = multi->iters[index];
		pop(wi);
		multi->inplay[index] = false;
		multi->inplay_count--;
		multi->values[index] = wi->default_value;
		if (!wi->done && !strcmp(wi->chrom, multi->chrom))
			fh_insert(multi->starts, wi->start, index);
	}
}
Пример #4
0
/* Maintain a fixed size heap */
static void fh_insert_fixed(struct fibheap *a, Edge *i, Edge **cur_min)
{
     if (a->fh_n < HEAP_SIZE) 
     {
         fh_insert(a, (void *)i);
     }
     else
     {
         if (edge_cmpr(cur_min, i) < 0)
         {
            /* Remove least value and renew */
            fh_extractmin(a);
            fh_insert(a, (void *)i);
            /* Keep a memory of the current min */
            *cur_min = (Edge *)fh_min(a);
         }
     }
}
Пример #5
0
static bool popCoreMultiplexer2(Multiplexer * multi) {
	popClosingWiggleIterators(multi);

	// Check that there are wis queued up
	// If no wis are waiting, either waiting on other chromosomes
	// or finished.
	if (fh_empty(multi->starts) && fh_empty(multi->finishes))
		queueUpWiggleIterators(multi);

	// If queues still empty
	if (multi->done)
		return false;

	// If no wi in play jump to next start
	if (multi->inplay_count)
		multi->start = multi->finish;
	else
		multi->start = fh_min(multi->starts);

	admitNewWiggleIteratorsIntoPlay(multi);
	defineNewFinish(multi);

	return multi->inplay_count == multi->count;
}