/*
   File:        part.h
   Author:      Andrew W. Moore
   Created:     Sun Sep 13 18:03:41 EDT 1992
   Description: Header for Partition sets of kdspaces, 
                hides kdtree and partigame

   Copyright (C) 1992, Andrew W. Moore
*/

typedef struct part_struct
{
  int tess_id;
  char *geom_data;    /* Probably a kdtree leaf node */
  char *game_data;    /* Probably a game state */
  struct neighs_struct *neighs;
  bool is_garbage;
  bool neighs_valid;
  char *experience_data; /* See ../pgco/diar.h for how this is used */
  char *histos_data;     /* See ../pgco/diar.h for how this is used */
} part;

typedef struct part_list_struct
{
  part *part;
  struct part_list_struct *next;
} part_list;

typedef struct neighs_struct
{
  part *neigh;
  part_list *outcomes;
  char *game_data;    /* Probably a partigame-action-link */
  struct neighs_struct *next;
} neighs;

typedef struct split_spec_struct
{
  part *part;
  int split;
  float pivot;
  struct split_spec_struct *next;
} split_spec;

typedef struct tess_struct
{
  int size;
  char **geom_data;    /* Probably an array of kdtree nodes */
  char *game_data;     /* Probably a PartiGame */
  part_list *all_parts;
  bool game_tree_valid;
  bool game_scores_valid;
} tess;

#define EQUAL_PARTS(pt1,pt2) (EQ_PTR(pt1,pt2))

extern int part_id();                         /* (pt) */
extern bool is_part_cost_finite();            /* (pt) */
extern float part_cost();                     /* (pt) */
extern part_list *add_to_part_list();         /* (pt,ptl) */
extern void free_part_list_node();            /* (ptl) */
extern void free_part_list();                 /* (ptl) */
extern void fprintf_part_list();              /* (s,ptl) */
extern void fprintf_part();                   /* (s,m,pt,ts) */
extern void fprint_all_parts();               /* (s,m,ptl,ts) */
extern bool is_in_split_spec();               /* (sps,pt) */
extern split_spec *add_to_split_spec();       /* (pt,split,pivot,sps) */
extern void free_split_spec();                /* (sps) */
extern void fprint_split_spec_node();         /* (s,m,sps,ts) */
extern void fprint_split_spec();              /* (s,m,sps,ts) */
extern void make_geom_data();                 /* (ts,ts_id,dim,mid,scales) */
extern void init_tess();                      /* (ts,size) */
extern part *part_search();                   /* (te,tess_id,farr) */
extern neighs *find_neigh();                  /* (ne,pt) */
extern void free_neighs_node();               /* (ne) */
extern void perform_splits();                 /* (ts,all_splits) */
extern void build_game_structure();           /* (ts) */
extern void free_game_structure();            /* (ts) */
extern void part_and_game_observe();          /* (ts,src_pt,aim_pt,actl_pt) */
extern float middle_pivot();                  /* (ts,pt,comp) */
extern void solve_game();                     /* (ts,goal_pt) */
extern void gp_draw_geom_data();              /* (gp,ts,tess_id) */
extern void add_extra_neigh();                /* (pt,neigh_pt) */
extern void fprint_game();                    /* (s,ts) */
extern neighs *best_neigh();                  /* (p) */
extern bool is_safely_in_part();              /* (pt,pt_middle,pt_dim,farr) */
extern void draw_filled_part();               /* (gp,ts,tess_id,p) */
extern void draw_filled_part_list();          /* (gp,ts,tess_id,ptl) */
extern bool worst_neigh_infinite();           /* (p) */
extern bool is_eligable();                    /* (pt,tess_id) */
extern float volume_of_part();                /* (ts,pt) */
extern part_list *get_eligables();            /* (ts,tess_id) */
extern float largest_volume();                /* (ts,ptl) */
extern part_list *filter_out_low_volumes();   /* (ts,base_ptl,v) */
extern void split_middle_of_longest();        /* (ts,pt,res_comp,res_pivot) */
extern split_spec *split_spec_from_longest(); /* (ts,ptl) */
extern void hype_of_part();                   /* (pt,hy) */
extern part_list *get_biggest_eligables();    /* (gp,ts,tess_id) */
extern void m_and_s_of_part();                /* (ts,pt,middle,scales) */
extern part *find_closest_part();             /* (ts,ptl,farr) */
extern int number_partitions();               /* (ts) */
extern void print_partition_info();           /* (ts,run_mode) */

extern split_spec *split_spec_from_schedule(); /* (ts,ptl,sched) */

