/*
	Search::ContextGraph - XS implementation

	(C) 2003 Schuyler Erle, Maciej Ceglowski
	
	This is free software, released
	under the GPL.  See LICENSE for more
	information.
	
*/
  
typedef struct edge_t {
    int	sink;
    float	weight;
    } Edge;

typedef enum node_type_t { UNUSED = 0, TERM, DOCUMENT } NodeType;

typedef struct node_t {
    //NodeType	type;
    int degree;
    int	capacity;
    float	energy;
    Edge *	edges;
    } Node;

typedef struct graph_t {
    int	size;
    int	capacity;
    Node *	nodes;
    float * energy;
    float	activationThreshold;
    float	collectionThreshold;
    float	startingEnergy;
    long 	maxDepth;
    long	numCalls;
    int		debug;
    int		indent;
    } Graph;

Edge *new_edge ( Edge *edge, long sink, float weight );
Node *new_node ( Node *node, NodeType type, long capacity );
int preallocate( Graph *graph, int capacity );
void presize( Graph *graph, long node, int size );
Graph *new_graph ( Graph *graph, long capacity,
	float activationThreshold, float collectionThreshold, long maxDepth );
void free_node (Node *node);
void free_graph (Graph *graph);
void reset_graph( Graph *graph );
Edge *add_edge ( Node *node, long sink, float weight );
Node *add_node ( Graph *graph, long id, NodeType type, long capacity );
int energize_node( Graph *graph, long id, float energy, int isStartingNode );
int compare_results( const void *a, const void *b );
Edge *collect_results( Graph *graph );
Edge *search_graph( Graph *graph, float startEnergy,
    long num_ids, long ids[]);