/*  lil-gp Genetic Programming System, version 1.0, 11 July 1995
 *  Copyright (C) 1995  Michigan State University
 * 
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of version 2 of the GNU General Public License as
 *  published by the Free Software Foundation.
 * 
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 * 
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *  
 *  Douglas Zongker       (zongker@isl.cps.msu.edu)
 *  Dr. Bill Punch        (punch@isl.cps.msu.edu)
 *
 *  Computer Science Department
 *  A-714 Wells Hall
 *  Michigan State University
 *  East Lansing, Michigan  48824
 *  USA
 *  
 */

#ifndef _PROTOS_H
#define _PROTOS_H


extern randomgen globrand;
extern genspace gensp[GENSPACE_COUNT];
extern function_set *fset;
extern int fset_count;
extern treeinfo *tree_map;
extern int tree_count;
extern int ind_nodelimit;


/*** exch.c ***/

void exchange_subpopulations ( multipop *mpop );
void initialize_topology ( multipop *mpop );
void free_topology ( multipop *mpop );
void rebuild_exchange_topology ( multipop *mpop );


/*** change.c ***/

population *change_population ( population *pop, breedphase * );
void show_population ( population *p );
breedphase * initialize_one_breeding ( char *prefix );
void initialize_breeding ( multipop * );
void free_one_breeding ( breedphase * );
void free_breeding ( multipop * );
void rebuild_breeding ( multipop * );
char *get_breed_parameter ( char *prefix, char *format, ... );


/*** ckpoint.c ***/

void read_checkpoint ( char *filename, int *gen, multipop **mpop );
void write_checkpoint ( int gen, multipop *mpop, char *filename );
population *read_population ( ephem_const **eind, FILE *f );
void read_individual ( individual *ind, ephem_const **eind, FILE *f,
		      char *buffer );
void write_individual ( individual *ind, ephem_index *eind, FILE *f );
void read_tree_recurse ( int space, ephem_const **eind, FILE *fil, int tree,
			char *string );
function * get_function_by_name ( int tree, char *string, ephem_const **ep,
				 ephem_const **eind );
void write_population ( population *pop, ephem_index *eind, FILE *f );
void write_tree_recurse ( lnode **l, ephem_index *eind, FILE *fil );
void write_hex_block ( void *, int, FILE * );
void read_hex_block ( void *, int, FILE * );


/*** ephem.c ***/

void initialize_ephem_const ( void );
void free_ephem_const ( void );
void enlarge_ephem_space ( void );
void ephem_const_gc ( void );
ephem_const *new_ephemeral_const ( function *f );
int ephem_index_comp ( const void *a, const void *b );
ephem_index *write_ephem_list ( FILE *f );
int lookup_ephem ( ephem_index *ind, ephem_const *e );
ephem_const **read_ephem_list ( FILE *f );
void get_ephem_stats ( int *used, int *free, int *blocks, int *alloc );


/*** eval.c ***/

void set_current_individual ( individual * );
DATATYPE evaluate_tree ( lnode *, int );
DATATYPE evaluate_tree_recurse ( lnode **, int );


/*** fsetupdate.c ***/

void fset_update ( function_set *app_fset );


/*** gp.c ***/

void run_gp ( multipop *mpop, int startgen,
             event *t_eval, event *t_breed, int startfromcheckpoint );
int generation_information ( int gen, multipop *mpop, int stt_interval,
                            int bestn );
void evaluate_pop ( population *pop );
int accumulate_pop_stats ( popstats *total, popstats *n );
void calculate_pop_stats ( popstats *s, population *pop, int gen, int subpop );
void saved_individual_gc ( void );
saved_ind ** write_saved_individuals ( ephem_index *eind, FILE *f );
void write_stats_checkpoint ( multipop *mpop, ephem_index *eind, FILE *f );
saved_ind ** read_saved_individuals ( ephem_const **eind, FILE *f );
void read_stats_checkpoint ( multipop *mpop, ephem_const **eind, FILE *f );
globaldata *get_globaldata( void );
#if defined(POSIX_MT) || defined(SOLARIS_MT)
void initialize_threading( void );
void *evaluate_pop_chunk( void * );
#endif


/*** main.c ***/

int function_sets_init ( function_set *, int, user_treeinfo*, int );
int function_compare ( const void *a, const void *b );
void free_function_sets ( void );
void read_tree_limits ( void );
void initialize_random ( void );
void pre_parameter_defaults ( void );
void post_parameter_defaults ( void );
int process_commandline ( int argc, char **argv, int *gen, multipop ** );
void output_system_stats ( event *t_total, event *t_eval, event *t_breed );
void initial_message ( void );


/*** memory.c ***/

#ifdef TRACK_MEMORY
#define MALLOC track_malloc
#define FREE track_free
#define REALLOC track_realloc
#else
#define MALLOC malloc
#define FREE free
#define REALLOC realloc
#endif
void *track_malloc ( unsigned long );
void track_free ( void * );
void *track_realloc ( void *, int );
void get_memory_stats ( int *total, int *free, int *max,
                       int *mallocc, int *reallocc, int *freec );


/*** output.c ***/

int create_output_stream ( int id, char *ext, int reset, char *mode,
                          int autoflush );
void initialize_output_streams ( void );
void open_output_streams ( void );
void oputs ( int streamid, int detail, const char *string );
void oprintf ( int streamid, int detail, const char *format, ... );
FILE *output_filehandle ( int streamid );
void output_stream_close ( int streamid );
void output_stream_open ( int streamid );
void output_stream_flush ( int streamid );
void close_output_streams ( void );
void error ( int severity, char *format, ... );
void set_detail_level ( int );
int test_detail_level ( int );
void flush_output_streams ( void );


/*** params.c ***/

void initialize_parameters ( void );
void free_parameters ( void );
void add_parameter ( char *name, char *value, int copyflags );
int delete_parameter ( char *name );
char *get_parameter ( const char *name );
void print_parameters ( void );
void write_parameter_database ( FILE *f );
void read_parameter_database ( FILE *f );
void read_parameter_file ( char * );
int delete_comment ( char * );
int check_continuation ( char * );
int parse_one_parameter ( char *buffer );
int trim_string ( char *string );
int translate_binary ( char *string );
void binary_parameter ( char *name, int value );
void define_directive ( char *string );
void undefine_directive ( char *string );
int test_directive ( char *string );


/*** populate.c ***/

void generate_random_population ( population *p, int *mindepth,
                                 int *maxdepth, int *method, FILE **datum );
population *allocate_population ( int size );
void free_population ( population *p );
void free_multi_population ( multipop *mp );
population *initial_population ( int *, int *, int *, FILE ** );
multipop *initial_multi_population ( void );


/*** postscript.c ***/

int postscript_recurse ( lnode **, FILE *, int, int, int );
void make_postscript_tree ( lnode *, char *, int );


/*** random.c ***/

void random_seed ( randomgen *, int );
void random_destroy ( randomgen * );
int random_int ( randomgen *, int );
double random_double ( randomgen * );
void *random_get_state ( randomgen *, int * );
void random_set_state ( randomgen *, void * );


/*** select.c ***/

int exists_select_method ( char *string );
select_context_func_ptr get_select_context ( char *string );
void free_o_rama ( int, char *** );
int parse_o_rama ( char *string, char *** argv );
int rev_ind_compare ( const void *a, const void *b );
int select_interval ( sel_context *sc );


/*** fitness.c ***/

sel_context *select_afit_context ( int op, sel_context *sc,
                                  population *p, char *string );
int select_afit ( sel_context *sc );
sel_context *select_inverse_afit_context ( int op, sel_context *sc,
                                          population *p, char *string );
int select_inverse_afit ( sel_context *sc );
sel_context *select_afit_overselect_context ( int op, sel_context *sc,
                                             population *p, char *string );
int select_afit_overselect ( sel_context *sc );


/*** tournament.c ***/

sel_context *select_tournament_context ( int op, sel_context *sc,
                                        population *p, char *string );
int select_tournament ( sel_context *sc );


/*** bestworst.c ***/

int select_bestworst ( sel_context *sc );
sel_context *select_best_context ( int op, sel_context *sc,
                                  population *p, char *string );
int select_best_compare ( const void *a, const void *b );
sel_context *select_worst_context ( int op, sel_context *sc,
                                   population *p, char *string );
int select_worst_compare ( const void *a, const void *b );
sel_context *select_random_context ( int op, sel_context *sc,
                                    population *p, char *string );
int select_random ( sel_context *sc );


/*** tree.c ***/

int tree_nodes ( lnode *tree );
int tree_nodes_recurse ( lnode ** );
int tree_nodes_internal ( lnode * );
int tree_nodes_internal_recurse ( lnode ** );
int tree_nodes_external ( lnode * );
int tree_nodes_external_recurse ( lnode ** );
int generate_random_full_tree ( int space, int depth, function_set *, int return_type );
int generate_random_grow_tree ( int space, int depth, function_set *, int return_type );
int tree_depth ( lnode * );
int tree_depth_recurse ( lnode ** );
int tree_depth_to_subtree ( lnode *, lnode * );
int tree_depth_to_subtree_recurse ( lnode **, lnode *, int );
void print_tree ( lnode *, FILE * );
void print_tree_recurse ( lnode **, FILE * );
void print_tree_array ( lnode * );
void print_tree_array_recurse ( lnode **, int * );
lnode *get_subtree ( lnode *, int );
lnode *get_subtree_recurse ( lnode **, int * );
lnode *get_subtree_internal ( lnode *, int );
lnode *get_subtree_internal_recurse ( lnode **, int * );
lnode *get_subtree_external ( lnode *, int );
lnode *get_subtree_external_recurse ( lnode **, int * );
void copy_tree ( tree *to, tree *from );
void free_tree ( tree * );
int tree_size ( lnode * );
int tree_size_recurse ( lnode ** );
void copy_tree_replace_many ( int space, lnode *parent, lnode **replace,
                            lnode **with, int count, int *repcount );
void copy_tree_replace_many_recurse ( int space, lnode **lp, lnode **lr,
                                    lnode **lw, int count, int *repcount );
void skip_over_subtree ( lnode ** );
void reference_ephem_constants ( lnode *, int );
void reference_ephem_constants_recurse ( lnode **, int );


/*** pretty.c ***/

void gen_indents ( lnode **l, int **is, int start, int sameline );
void pretty_print_tree_recurse ( lnode **l, int **is, FILE *fil );
void pretty_print_tree_recurse_equ ( lnode **l, int **is, FILE *fil );
void pretty_print_tree ( lnode *data, FILE *fil );
void pretty_print_tree_equ ( lnode *data, FILE *fil );


/*** genspace.c ***/

void initialize_genspace ( void );
void free_genspace ( void );
lnode * gensp_next ( int space );
int gensp_next_int ( int space );
void gensp_dup_tree ( int space, tree *t );
void gensp_reset ( int space );
void gensp_print ( int space, int i, int j, FILE *out );


/*** individ.c ***/

void print_individual ( individual *ind, FILE *f );
void pretty_print_individual ( individual *ind, FILE *f );
void pretty_print_individual_equ ( individual *ind, FILE *f );
int individual_size ( individual *ind );
int individual_depth ( individual *ind );
void duplicate_individual ( individual *to, individual *from );


/*** crossover.c ***/

int operator_crossover_init ( char *options, breedphase *bp );
void operator_crossover_free ( void * );
void operator_crossover_start ( population *oldpop, void *data );
void operator_crossover_end ( void *data );
void operator_crossover ( population *oldpop, population *newpop, void *data );


/*** reproduce.c ***/

int operator_reproduce_init ( char *options, breedphase *bp );
void operator_reproduce_free ( void * );
void operator_reproduce_start ( population *oldpop, void *data );
void operator_reproduce_end ( void *data );
void operator_reproduce ( population *oldpop, population *newpop, void *data );


/*** mutate.c ***/

int operator_mutate_init ( char *options, breedphase *bp );
void operator_mutate_free ( void * );
void operator_mutate_start ( population *oldpop, void *data );
void operator_mutate_end ( void *data );
void operator_mutate ( population *oldpop, population *newpop, void *data );


/*** boltzman.c ***/

sel_context *select_boltzman_context (int op, 
				      sel_context *sc, 
				      population *p,
				      char *string );


/*** sigma.c ***/

sel_context *select_sigma_context (int op, 
				      sel_context *sc, 
				      population *p,
				      char *string );


#endif
