char *pickRandomWord(struct rbTree *rbTree) /* Pick word from list randomly, but so that words more * commonly seen are picked more often. */ { pickedWord = NULL; curUses = 0; totalUses = 0; rbTreeTraverse(rbTree, addUse); useThreshold = rand() % totalUses; rbTreeTraverse(rbTree, pickIfInThreshold); assert(pickedWord != NULL); return pickedWord; }
void dumpOneRbTree(struct hashEl *hel) /* Given a hel that associates a chrom name with an rbTree of non-overlapping * ranges, dump out bed 4 like featureBits -bed. */ { struct rbTree *t = (struct rbTree *)hel->val; dumpChrom = hel->name; dumpSeq = 0; rbTreeTraverse(t, dumpRange); }
struct range *rangeTreeList(struct rbTree *tree) /* Return list of all ranges in tree in order. Not thread safe. * No need to free this when done, memory is local to tree. */ { rangeList = NULL; rbTreeTraverse(tree, rangeListAdd); slReverse(&rangeList); return rangeList; }
void rangeTreeWriteNodes(struct rbTree *tree, FILE *f) /* Write out one rangeTree structure to binary file f. * Note this does not include the name, which is stored only in index. * Ranges are written in start sequence (depth-first tree traversal). * Writes start and size but not val. * Not thread-safe. */ { tempF = f; rbTreeTraverse(tree, rangeWriteFile); }
static void removeUnusedVertices(struct rbTree *vertexTree, struct rbTree *edgeTree) /* Remove vertices not connected to any edges. */ { /* Get vertex list and clear counts. */ struct slRef *vRef, *vRefList = rbTreeItems(vertexTree); for (vRef = vRefList; vRef != NULL; vRef = vRef->next) { struct vertex *v = vRef->val; v->count = 0; } /* Inc counts of vertices connected to edges. */ rbTreeTraverse(edgeTree, incVertexUses); /* Remove unused vertices. */ for (vRef = vRefList; vRef != NULL; vRef = vRef->next) { struct vertex *v = vRef->val; if (v->count == 0) rbTreeRemove(vertexTree, v); } slFreeList(&vRefList); }