#include #include #include "tree.h" #include "utils.h" #include "data.h" void change_leaves(tree *t, char *leaf_list) { list *llist = get_paths(leaf_list); char **leaves = (char **)list_to_array(llist); int n = llist->size; int i,j; int found = 0; for(i = 0; i < t->n; ++i){ t->leaf[i] = 0; for(j = 0; j < n; ++j){ if (0==strcmp(t->name[i], leaves[j])){ t->leaf[i] = 1; ++found; break; } } } fprintf(stderr, "Found %d leaves.\n", found); } float get_hierarchy_probability(float *x, tree *hier, int c) { float p = 1; while(c >= 0){ p = p * x[c]; c = hier->parent[c]; } return p; } void hierarchy_predictions(float *predictions, int n, tree *hier, int only_leaves) { int j; for(j = 0; j < n; ++j){ int parent = hier->parent[j]; if(parent >= 0){ predictions[j] *= predictions[parent]; } } if(only_leaves){ for(j = 0; j < n; ++j){ if(!hier->leaf[j]) predictions[j] = 0; } } } int hierarchy_top_prediction(float *predictions, tree *hier, float thresh, int stride) { float p = 1; int group = 0; int i; while (1) { float max = 0; int max_i = 0; for (i = 0; i < hier->group_size[group]; ++i) { int index = i + hier->group_offset[group]; float val = predictions[(i + hier->group_offset[group])*stride]; if (val > max) { max_i = index; max = val; } } if (p*max > thresh) { p = p*max; group = hier->child[max_i]; if (hier->child[max_i] < 0) return max_i; } else if (group == 0) { return max_i; } else { return hier->parent[hier->group_offset[group]]; } } return 0; } tree *read_tree(char *filename) { tree t = {0}; FILE *fp = fopen(filename, "r"); char *line; int last_parent = -1; int group_size = 0; int groups = 0; int n = 0; while((line=fgetl(fp)) != 0){ char* id = (char*)xcalloc(256, sizeof(char)); int parent = -1; sscanf(line, "%s %d", id, &parent); t.parent = (int*)xrealloc(t.parent, (n + 1) * sizeof(int)); t.parent[n] = parent; t.name = (char**)xrealloc(t.name, (n + 1) * sizeof(char*)); t.name[n] = id; if(parent != last_parent){ ++groups; t.group_offset = (int*)xrealloc(t.group_offset, groups * sizeof(int)); t.group_offset[groups - 1] = n - group_size; t.group_size = (int*)xrealloc(t.group_size, groups * sizeof(int)); t.group_size[groups - 1] = group_size; group_size = 0; last_parent = parent; } t.group = (int*)xrealloc(t.group, (n + 1) * sizeof(int)); t.group[n] = groups; ++n; ++group_size; } ++groups; t.group_offset = (int*)xrealloc(t.group_offset, groups * sizeof(int)); t.group_offset[groups - 1] = n - group_size; t.group_size = (int*)xrealloc(t.group_size, groups * sizeof(int)); t.group_size[groups - 1] = group_size; t.n = n; t.groups = groups; t.leaf = (int*)xcalloc(n, sizeof(int)); int i; for(i = 0; i < n; ++i) t.leaf[i] = 1; for(i = 0; i < n; ++i) if(t.parent[i] >= 0) t.leaf[t.parent[i]] = 0; fclose(fp); tree* tree_ptr = (tree*)xcalloc(1, sizeof(tree)); *tree_ptr = t; //error(0); return tree_ptr; }