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; } } }
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++; } }
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); } }
/* 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); } } }
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; }