e123f7c9d3830fe6647229909e20893adbe14f16 kent Thu Aug 21 16:00:54 2014 -0700 Moving pairDistance stuff to library. diff --git src/lib/pairDistance.c src/lib/pairDistance.c new file mode 100644 index 0000000..2c42232 --- /dev/null +++ src/lib/pairDistance.c @@ -0,0 +1,80 @@ +/* pairDistance - help manage systems where you have a list of distances between pairs of + * elements */ + +#include "common.h" +#include "linefile.h" +#include "hash.h" +#include "pairDistance.h" +#include "sqlNum.h" + +struct pairDistance *pairDistanceReadAll(char *fileName) +/* Read in file of format into list of pairs */ +{ +struct lineFile *lf = lineFileOpen(fileName, TRUE); +struct pairDistance *list = NULL, *pair; +char *row[3]; +while (lineFileRow(lf, row)) + { + AllocVar(pair); + pair->a = cloneString(row[0]); + pair->b = cloneString(row[1]); + pair->distance = sqlDouble(row[2]); + slAddHead(&list, pair); + } +slReverse(&list); +return list; +} + +struct hash *pairDistanceHashList(struct pairDistance *pairList) +/* Return hash of all pairs keyed by pairDistanceName function on pair with pair values */ +{ +struct hash *hash = hashNew(0); +struct pairDistance *pair; +for (pair = pairList; pair != NULL; pair = pair->next) + { + char name[2*PATH_LEN]; + pairDistanceName(pair->a, pair->b, name, sizeof(name)); + hashAdd(hash, name, pair); + pairDistanceName(pair->b, pair->a, name, sizeof(name)); + hashAdd(hash, name, pair); + } +return hash; +} + +double pairDistanceHashLookup(struct hash *pairHash, char *aName, char *bName) +/* Return distance between a and b. */ +{ +char name[2*PATH_LEN]; +pairDistanceName(aName, bName, name, sizeof(name)); +struct pairDistance *pair = hashMustFindVal(pairHash, name); +return pair->distance; +} + +void pairDistanceInvert(struct pairDistance *list) +/* Go through and reverse distances, and make them positive. */ +{ +if (list == NULL) + return; +double min = list->distance, max = list->distance; +struct pairDistance *pair; +for (pair = list; pair != NULL; pair = pair->next) + { + double distance = pair->distance; + if (distance < min) min = distance; + if (distance > max) max = distance; + } +double range = max - min; +for (pair = list; pair != NULL; pair = pair->next) + { + double old = pair->distance; + pair->distance = range - (old - min); + } +} + +char *pairDistanceName(char *a, char *b, char *outBuf, int outBufSize) +/* Return name for pair */ +{ +safef(outBuf, outBufSize, "%s\t%s", a, b); +return outBuf; +} +