struct dgNodeRef *dgConstrainedPriorityOrder(struct diGraph *dg) /* Return traversal of graph in priority order subject to * constraint that all parents must be output before * their children regardless of node priority. * Graph must be cycle free. */ { struct dlList *sortedList = newDlList(); struct dgNode *graphNode; struct dlNode *listNode; struct dgNodeRef *refList = NULL, *ref; if (dgHasCycles(dg)) errAbort("Call to dgConstrainedPriorityOrder on graph with cycles."); /* Make up list sorted by priority. */ for (graphNode = dg->nodeList; graphNode != NULL; graphNode = graphNode->next) { dlAddValTail(sortedList, graphNode); graphNode->visited = FALSE; } dlSort(sortedList, cmpPriority); /* Loop taking first member of list with no untraversed parents. */ while (!dlEmpty(sortedList)) { for (listNode = sortedList->head; listNode->next != NULL; listNode = listNode->next) { graphNode = listNode->val; if (dgParentsAllVisited(graphNode)) { dlRemove(listNode); freeMem(listNode); AllocVar(ref); ref->node = graphNode; slAddHead(&refList, ref); graphNode->visited = TRUE; break; } } } freeDlList(&sortedList); slReverse(&refList); return refList; }
void separateEntities(struct dlList *easyList, struct dlList *hardList) /* Separate out hard (overlapping) entities onto hard list. */ { struct dlNode *node, *next, *listNode; int sepCount = 0; dlSort(easyList, cmpEntities); for (node = easyList->head; node->next != NULL; node = next) { struct entity *ent = node->val; int eStart = ent->start, eEnd = ent->end; next = node->next; for (listNode = easyList->head; listNode->next != NULL; listNode = listNode->next) { struct entity *listEnt = listNode->val; int lStart = listEnt->start, lEnd = listEnt->end; int start = max(eStart, lStart); int end = min(eEnd, lEnd); int overlap = end - start; if (listEnt != ent && overlap > 0) { int eRefCount = slCount(ent->cdaRefList); int lRefCount = slCount(listEnt->cdaRefList); /* Move the one with less cDNA to the hard list. */ if (eRefCount > lRefCount) { dlRemove(listNode); dlAddTail(hardList, listNode); if (listNode == next) next = node; } else { dlRemove(node); dlAddTail(hardList, node); } ++sepCount; break; } } } }