#ifndef GODIST_H
#define GODIST_H

#include <search.h>

#define MAX_NODES 15000
#define MAX_PARENTS 100
#define MAX_CHILDREN 100

enum EVIDENCE { MP = 1, 
                IGI = 1 << 1, 
		IPI = 1 << 2, 
		ISS = 1 << 3, 
		IDA = 1 << 4, 
		IEP = 1 << 5,
		IEA = 1 << 6, 
		TAS = 1 << 7, 
		NAS = 1 << 8, 
		ND =  1 << 9, 
		RCA = 1 << 10, 
		IC =  1 << 11 };

struct node;
struct node {
    /* GO term id. E.g: "GO:0005180" */
    char term[11];
    /* Information content */
    float ic;
    /* Depth in tree */
    int depth;
    /* Evidence codes */
    int evidence[12];
    /* Accumulated evidence codes */
    int acc_evidence[12];

    /* Working memory */
    int temp_acc[12];

    /* Parent count and parents */
    int parentc;
    struct node *parents[MAX_PARENTS];

    /* 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];
long term_array_size;
int link_count;
int total_ann;
int evidence; /* bitvector with one bit per evidence code */

/* Ontology initialisation functions. */
int godist_init();
int godist_read_assoc(FILE *fd);
int godist_read_term(FILE *fd);
void accumulate_evidence(struct node*);

/* Distance metric functions */
float resnik_distance(char *term1, char *term2);
float fussimeg_distance(char *term1, char *term2);
void calc_ic(struct node *n, unsigned int evidence);

void clear_flags(struct node *n);
void print_term(struct node *n);

void add_ancestors(int *ancc, struct node *anc[], struct node *n);

void calculate_ics(unsigned int);
void acc_ev(struct node*);

#endif

