diff --git a/scripts/geneontology/go-distance/godist.c b/scripts/geneontology/go-distance/godist.c index d739e4b..8dfbd34 100644 --- a/scripts/geneontology/go-distance/godist.c +++ b/scripts/geneontology/go-distance/godist.c @@ -49,6 +49,7 @@ int godist_init() { printf(" %d edges\n", link_count); accumulate_evidence(get_bp()); + print_term(get_bp()); } void godist_exit() { @@ -83,6 +84,7 @@ int godist_read_term(FILE *fd) { struct node *n = (struct node*) malloc(sizeof(struct node)); n->parentc = 0; n->childrenc = 0; + n->visited = 0; for (i=0; i<12; i++) { n->evidence[i] = ev[i]; n->acc_evidence[i] = 0; @@ -91,8 +93,13 @@ int godist_read_term(FILE *fd) { /* add to hash table */ e.key = n->term; + e.data = (void*)n; res = hsearch(e, ENTER); - +/* if (res); + printf("hash-insert: %s", ((struct node*)res->data)->term); + else + printf("hash-insert: error"); +*/ term_array[term_array_size++] = n; } @@ -106,6 +113,14 @@ float go_distance(char *term1, char *term2) { void add_node(char *term, int parentc, struct node **parents) { + +} + +void clear_flags(struct node *n) { + int i; + for (i=0; ichildrenc; i++) + clear_flags(n->children[i]); + n->visited = 0; } void add_link(char *parent_id, char *child_id) { @@ -135,30 +150,43 @@ void add_link(char *parent_id, char *child_id) { printf("FIXME: increase child count"); return; } - parent->children[parent->childrenc++] = child; - child->parents[child->parentc++] = parent; + parent->children[parent->childrenc] = child; + parent->childrenc++; +/* printf("adding %x as child of %x\n", child, parent);*/ + child->parents[child->parentc] = parent; + child->parentc++; } struct node *get_bp() { ENTRY e, *ep; e.key = "GO:0008150"; ep = hsearch(e, FIND); - if (ep) - return ep; - if (ep == ESRCH) - printf("ESRCH\n"); - if (ep == ESRCH) - printf("ENOMEM\n"); + + if (ep) { +/* printf("BP is %x and %s\n", (int) ep->data, ep->key); + printf("%d\n", ((struct node*)ep->data)->childrenc ); + printf("%s\n", ((struct node*)ep->data)->term);*/ + return ep->data; + } return NULL; } void accumulate_evidence(struct node *n) { int i, j; + if (n->visited) + return; + + for (i=0; i<12; i++) + n->acc_evidence[i] = n->evidence[i]; + for (i=0; i<(n->childrenc); i++) { - accumulate_evidence(n->children[i]); - for (j=0; j<12; j++) - n->evidence[j] += n->children[i]->evidence[j]; + if (!n->children[i]->visited) { + accumulate_evidence(n->children[i]); + for (j=0; j<12; j++) + n->acc_evidence[j] += n->children[i]->acc_evidence[j]; + } } +/* printf(".");*/ } void print_terms() { @@ -168,3 +196,18 @@ void print_terms() { } } +void print_term(struct node *n) { + int i; + printf("%s\n", n->term); + printf(" children: %d\n", n->childrenc); + printf(" parents: %d\n", n->parentc); + printf(" evidence: "); + for (i=0; i<12; i++) + printf("%d ", n->evidence[i]); + printf("\n"); + printf(" accumulated evidence: "); + for (i=0; i<12; i++) + printf("%d ", n->acc_evidence[i]); + printf("\n"); +} + diff --git a/scripts/geneontology/go-distance/godist.h b/scripts/geneontology/go-distance/godist.h index 1fad156..32af743 100644 --- a/scripts/geneontology/go-distance/godist.h +++ b/scripts/geneontology/go-distance/godist.h @@ -27,6 +27,9 @@ struct node { /* Child count and children */ int childrenc; struct node *children[MAX_CHILDREN]; + + /* Flag to ensure that a node is only visited once in DAG operations */ + char visited; }; struct node* term_array[MAX_NODES];