blob: 293f9922a8dd1d1633cae65ef106c6a6b118a0c6 [file] [log] [blame]
/******************************************************************************
* FILE: pgapack.h: This file contains all constant and structure
* definitions definitions for PGAPack as well as all
* function declarations.
* Authors: David M. Levine, Philip L. Hallstrom, David M. Noelle,
* Brian P. Walenz
******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <limits.h>
#include <float.h>
#include <string.h>
#include <ctype.h>
#include <mpi.h>
/* If OPTIMIZED, remove various sanity checks, and debug output.
*
* PGADebugEntered(a) - Print a debug message about entering "a"
* PGADebugExited(a) - Print a debug message about exiting "a"
* PGAFailIfNotSetup(a) - Fail fatally if PGASetUp has not been called
* PGAFailIfSetup(a) - Fail fatally if PGASetUp has been called
* PGACheckDataType(a, D) - Fail fatally if the datatype is not D
*/
#ifndef OPTIMIZE
#define OPTIMIZE 0
#define PGADebugEntered(a) \
PGADebugPrint(ctx, PGA_DEBUG_ENTERED, a, "Entered", PGA_VOID, NULL)
#define PGADebugExited(a) \
PGADebugPrint(ctx, PGA_DEBUG_EXIT, a, "Exited", PGA_VOID, NULL)
#define PGAFailIfNotSetUp(Name) \
if (ctx->sys.SetUpCalled == PGA_FALSE) \
PGAError(ctx, "PGASetUp must be called before " Name, \
PGA_FATAL, PGA_VOID, NULL)
#define PGAFailIfSetUp(Name) \
if (ctx->sys.SetUpCalled == PGA_TRUE) \
PGAError(ctx, Name " must be called before PGASetUp", PGA_FATAL, \
PGA_VOID, NULL)
#define PGACheckDataType(Name, DataType) \
if (ctx->ga.datatype != DataType) \
PGAError(ctx, "DataType is incorrect for " Name,PGA_FATAL,PGA_VOID,NULL)
#else
#undef OPTIMIZE
#define OPTIMIZE 1
#define PGADebugPrint(a,b,c,x,y,z) ;
#define PGADebugEntered(a) ;
#define PGADebugExited(a) ;
#define PGAFailIfNotSetUp(Name) ;
#define PGAFailIfSetUp(Name) ;
#define PGACheckDataType(Name, DataType) ;
#endif
/*****************************************
* BINARY MACROS *
*****************************************/
#ifndef WL
#error WL must be defined on the command line!
#endif
#define ONEL ((PGABinary)1)
#define BIT(x,y) (y&(ONEL<<((WL-1)-(x)))) /* true if bit is 1, */
#define SET(x,y) (y|=(ONEL<<((WL-1)-(x)))) /* set a bit to 1 */
#define UNSET(x,y) (y&=(~(ONEL<<((WL-1)-(x)))))/* set a bit to 0, clear */
#define TOGGLE(x,y) (y^=(ONEL<<((WL-1)-(x)))) /* complement a bits value */
#define INDEX(ix,bx,bit,WL) ix=bit/WL;bx=bit%WL /* map global column (bit) */
/* to word (ix) and bit (bx) */
/*****************************************
* ABSTRACT DATA TYPES *
*****************************************/
#define PGA_DATATYPE_BINARY 1 /* Array of unsigned ints */
/* parsed into bits : binary.c */
#define PGA_DATATYPE_INTEGER 2 /* Array of ints : integer.c */
#define PGA_DATATYPE_REAL 3 /* Array of doubles : real.c */
#define PGA_DATATYPE_CHARACTER 4 /* Array of characters : character.c */
#define PGA_DATATYPE_USER 5 /* --user defined-- */
#define PGABinary unsigned long
#define PGAInteger signed long int
#define PGAReal double
#define PGACharacter signed char
#define PGA_INT 1
#define PGA_DOUBLE 2
#define PGA_CHAR 3
#define PGA_VOID 4
/*****************************************
* BOOLEANS *
*****************************************/
#define PGA_TRUE 1
#define PGA_FALSE 0
/*****************************************
* FLAGS *
*****************************************/
#define PGA_FATAL 1
#define PGA_WARNING 2
/*****************************************
* MISC CONSTANT *
*****************************************/
#define PGA_TEMP1 -1138
#define PGA_TEMP2 -4239
#define PGA_OLDPOP -6728
#define PGA_NEWPOP -8376
#define PGA_UNINITIALIZED_INT -3827
#define PGA_UNINITIALIZED_DOUBLE -968.3827
/*****************************************
* DEBUG LEVELS *
*****************************************/
#define PGA_DEBUG_ENTERED 12
#define PGA_DEBUG_EXIT 13
#define PGA_DEBUG_MALLOC 80
#define PGA_DEBUG_PRINTVAR 82
#define PGA_DEBUG_SEND 22
#define PGA_DEBUG_RECV 23
#define PGA_DEBUG_MAXPGAPACKFUNCTIONS 300
#define PGA_DEBUG_MAXFLAGS 1000
/*****************************************
* DIRECTION *
*****************************************/
#define PGA_MAXIMIZE 1 /* specify direction for fitness calc */
#define PGA_MINIMIZE 2 /* specify direction for fitness calc */
/*****************************************
* STOPPING CRITERIA *
*****************************************/
#define PGA_STOP_MAXITER 1 /* Stop: for maximum iterations */
#define PGA_STOP_NOCHANGE 2 /* Stop: no change in best string */
#define PGA_STOP_TOOSIMILAR 4 /* Stop: homogeneous population */
/*****************************************
* CROSSOVER *
*****************************************/
#define PGA_CROSSOVER_ONEPT 1 /* One point crossover */
#define PGA_CROSSOVER_TWOPT 2 /* Two point crossover */
#define PGA_CROSSOVER_UNIFORM 3 /* Uniform crossover */
/*****************************************
* SELECTION *
*****************************************/
#define PGA_SELECT_PROPORTIONAL 1 /* proportional selection */
#define PGA_SELECT_SUS 2 /* stochastic universal selection */
#define PGA_SELECT_TOURNAMENT 3 /* tournament selection */
#define PGA_SELECT_PTOURNAMENT 4 /* probabilistic tournament selection */
/*****************************************
* FITNESS *
*****************************************/
#define PGA_FITNESS_RAW 1 /* use raw fitness (evaluation) */
#define PGA_FITNESS_NORMAL 2 /* linear normalization fitness */
#define PGA_FITNESS_RANKING 3 /* linear ranking fitness */
/*****************************************
* FITNESS (MINIMIZATION) *
*****************************************/
#define PGA_FITNESSMIN_RECIPROCAL 1 /* reciprocal fitness */
#define PGA_FITNESSMIN_CMAX 2 /* cmax fitness */
/*****************************************
* MUTATION *
*****************************************/
#define PGA_MUTATION_CONSTANT 1 /* Real/Integer: Fixed value */
#define PGA_MUTATION_RANGE 2 /* Real/Integer: Uniform range */
#define PGA_MUTATION_UNIFORM 3 /* Real: +- Uniform random no. */
#define PGA_MUTATION_GAUSSIAN 4 /* Real: +- Gaussian random no. */
#define PGA_MUTATION_PERMUTE 5 /* Integer: Permutation (swap) */
/*****************************************
* POPULATION REPLACEMENT *
*****************************************/
#define PGA_POPREPL_BEST 1 /* Select best string */
#define PGA_POPREPL_RANDOM_NOREP 2 /* Select random string w/o replacement*/
#define PGA_POPREPL_RANDOM_REP 3 /* Select random string w/ replacement*/
/****************************************
* REPORT OPTIONS *
****************************************/
#define PGA_REPORT_ONLINE 1 /* Print the online analysis */
#define PGA_REPORT_OFFLINE 2 /* Print the offline analysis */
#define PGA_REPORT_HAMMING 4 /* Print the Hamming distance */
#define PGA_REPORT_STRING 8 /* Print the string */
#define PGA_REPORT_WORST 16 /* Print the worst individual */
#define PGA_REPORT_AVERAGE 32 /* Print the average of the population */
/*****************************************
* RANDOMIZER *
*****************************************/
#define PGA_RINIT_PERCENT 1 /* real percent offset */
#define PGA_RINIT_RANGE 2 /* real range */
#define PGA_IINIT_PERMUTE 1 /* integer permutation */
#define PGA_IINIT_RANGE 2 /* integer range (nonunique) */
#define PGA_CINIT_LOWER 1 /* all lowercase letters */
#define PGA_CINIT_UPPER 2 /* all uppercase letters */
#define PGA_CINIT_MIXED 3 /* both upper and lower case letters */
/*****************************************
* SET USER FUNCTION *
*****************************************/
#define PGA_USERFUNCTION_CREATESTRING 1
#define PGA_USERFUNCTION_MUTATION 2
#define PGA_USERFUNCTION_CROSSOVER 3
#define PGA_USERFUNCTION_PRINTSTRING 4
#define PGA_USERFUNCTION_COPYSTRING 5
#define PGA_USERFUNCTION_DUPLICATE 6
#define PGA_USERFUNCTION_INITSTRING 7
#define PGA_USERFUNCTION_BUILDDATATYPE 8
#define PGA_USERFUNCTION_STOPCOND 9
#define PGA_USERFUNCTION_ENDOFGEN 10
#define PGA_NUM_USERFUNCTIONS 10
/*****************************************
* MPI SEND/RECV TAGS *
*****************************************/
#define PGA_COMM_STRINGTOEVAL 1 /* MPI tag for sending string */
#define PGA_COMM_EVALOFSTRING 2 /* MPI tag for returning evaluation */
#define PGA_COMM_DONEWITHEVALS 3 /* MPI tag for ending parallel eval */
/*****************************************
* INDIVIDUAL STRUTURE *
*****************************************/
typedef struct { /* primary population data structure */
double evalfunc; /* evaluation function value */
double fitness; /* fitness function value */
int evaluptodate; /* flag whether evalfunc is current */
void *chrom; /* pointer to the GA string */
} PGAIndividual;
/*****************************************
* GA ALGORITHM STRUCTURE *
*****************************************/
typedef struct {
int datatype; /* data type: binary, integer, or real */
int optdir; /* direction of optimization */
int tw; /* total number of words, full + partial */
int fw; /* number of full (WL length) words */
int eb; /* number of extra bits in last NOT full word*/
int PopSize; /* Number of strings to use */
int StringLen; /* string lengths */
int StoppingRule; /* Termination Criteria */
int MaxIter; /* Maximum number of iterations to run */
int MaxNoChange; /* # of iters with no change before stopping */
int MaxSimilarity; /* % of pop the same before stopping */
int NumReplace; /* Number of string to replace each gen */
int PopReplace; /* Method of choosing ind.s to copy to newpop*/
int iter; /* iteration (generation) counter */
int ItersOfSame; /* # iters with no change in best */
int PercentSame; /* % of pop that is homogeneous */
int NoDuplicates; /* Don't allow duplicate strings */
int CrossoverType; /* Type of crossover for genetic algorithm */
int SelectType; /* Type of selection for genetic algorithm */
int SelectIndex; /* index of Select for next two individuals */
int FitnessType; /* Type of fitness transformation used */
int FitnessMinType; /* Transformation for minimization problems */
int MutateOnlyNoCross; /* Mutate only strings not from crossover */
int MutationType; /* Type of mutation used */
int MutateIntegerValue; /* Multiplier to mutate Integer strings with */
int MutateBoundedFlag; /* Confine integer alleles to given range */
double MutateRealValue; /* Multiplier to mutate Real strings with */
double MutationProb; /* Starting mutation probability */
double CrossoverProb; /* Crossover probability */
double UniformCrossProb; /* Prob of bit select in uniform crossover */
double PTournamentProb; /* Prob of selection in Prob. Tournament */
double FitnessRankMax; /* MAX value for use in ranking */
double FitnessCmaxValue; /* Cmax value used to convert minimizations */
double restartAlleleProb;/* prob of changing an allele in a restart */
int restart; /* whether to use the restart operator */
int restartFreq; /* frequency with which to restart */
int *selected; /* array of indices for selection */
int *sorted; /* array of sorted individual indices */
PGAIndividual *oldpop; /* pointer to population (old) */
PGAIndividual *newpop; /* pointer to population (new) */
} PGAAlgorithm;
/*****************************************
* OPERATIONS STRUCTURES *
*****************************************/
typedef struct PGAContext PGAContext;
typedef struct {
void (*CreateString)(PGAContext *, int, int, int);
int (*Mutation)(PGAContext *, int, int, double);
void (*Crossover)(PGAContext *, int, int, int, int, int, int);
void (*PrintString)(PGAContext *, FILE *, int, int);
void (*CopyString)(PGAContext *, int, int, int, int);
int (*Duplicate)(PGAContext *, int, int, int, int);
void (*InitString)(PGAContext *, int, int);
MPI_Datatype (*BuildDatatype)(PGAContext *, int, int);
int (*StopCond)(PGAContext *);
void (*EndOfGen)(PGAContext *);
} PGACOperations;
typedef struct {
int (*Mutation)(void *, void *, void *, void *);
void (*Crossover)(void *, void *, void *, void *, void *, void *, void *);
void (*PrintString)(void *, void *, void *, void *);
void (*CopyString)(void *, void *, void *, void *, void *);
int (*Duplicate)(void *, void *, void *, void *, void *);
void (*InitString)(void *, void *, void *);
int (*StopCond)(void *);
void (*EndOfGen)(void *);
} PGAFortranOperations;
/*****************************************
* PARALLEL STRUCTURE *
*****************************************/
typedef struct {
int MPIAlreadyInit; /* Flag whether MPI was previously initialized*/
int NumIslands; /* Number of islands in island model */
int NumDemes; /* Number of demes in neighborhood model */
MPI_Comm DefaultComm; /* Default communicator for PGARun */
int MPIStubLibrary; /* Boolean: real or stub version of MPI */
} PGAParallel;
/*****************************************
* REPORT STRUCTURE *
*****************************************/
typedef struct {
int PrintFreq; /* How often to print statistics reports*/
int PrintOptions;
double Offline;
double Online;
double Average;
double Best;
time_t starttime;
} PGAReport;
/*****************************************
* SYSTEM STRUCTURE *
*****************************************/
typedef struct {
int UserFortran; /* user routines in Fortran or C? */
int SetUpCalled; /* has PGASetUp been called? */
int PGAMaxInt; /* largest int of machine */
int PGAMinInt; /* smallest int of machine */
double PGAMaxDouble; /* largest double of machine */
double PGAMinDouble; /* smallest double of machine */
} PGASystem;
/*****************************************
* DEBUG STRUCTURE *
*****************************************/
typedef struct {
int PGADebugFlags[PGA_DEBUG_MAXFLAGS];
} PGADebug;
/*****************************************
* INITIALIZATION STRUCTURE *
*****************************************/
typedef struct {
int RandomInit; /* flag whether to randomize strings */
double BinaryProbability; /* probability that a Bit will be 1 */
int RealType; /* type of real initialization */
int IntegerType; /* type of integer initialization */
int CharacterType; /* type of character initialization */
int *IntegerMin; /* minimum of range of integers */
int *IntegerMax; /* maximum of range of integers */
double *RealMin; /* minimum of range of reals */
double *RealMax; /* maximum of range of reals */
int RandomSeed; /* integer to seed random numbers with */
} PGAInitialize;
/*****************************************
* SCRATCH DATA STRUCTURES *
*****************************************/
typedef struct {
int *intscratch; /* integer-scratch space */
double *dblscratch; /* double- scratch space */
} PGAScratch;
/*****************************************
* CONTEXT STRUCTURE *
*****************************************/
struct PGAContext {
PGAAlgorithm ga;
PGACOperations cops;
PGAFortranOperations fops;
PGAParallel par;
PGAReport rep;
PGASystem sys;
PGADebug debug;
PGAInitialize init;
PGAScratch scratch;
};
/*****************************************
* binary.c
*****************************************/
void PGASetBinaryAllele ( PGAContext *ctx, int p, int pop, int i, int val );
int PGAGetBinaryAllele ( PGAContext *ctx, int p, int pop, int i );
void PGASetBinaryInitProb ( PGAContext *ctx, double probability );
double PGAGetBinaryInitProb (PGAContext *ctx);
void PGABinaryCreateString(PGAContext *ctx, int p, int pop, int initflag);
int PGABinaryMutation( PGAContext *ctx, int p, int pop, double mr );
void PGABinaryOneptCrossover(PGAContext *ctx, int p1, int p2, int pop1, int c1,
int c2, int pop2);
void PGABinaryTwoptCrossover(PGAContext *ctx, int p1, int p2, int pop1, int c1,
int c2, int pop2);
void PGABinaryUniformCrossover(PGAContext *ctx, int p1, int p2, int pop1,
int c1, int c2, int pop2);
void PGABinaryPrintString( PGAContext *ctx, FILE *fp, int p, int pop );
void PGABinaryCopyString (PGAContext *ctx, int p1, int pop1, int p2, int pop2);
int PGABinaryDuplicate( PGAContext *ctx, int p1, int pop1, int p2, int pop2);
void PGABinaryInitString(PGAContext *ctx, int p, int pop);
MPI_Datatype PGABinaryBuildDatatype(PGAContext *ctx, int p, int pop);
int PGABinaryHammingDistance ( PGAContext *ctx, PGABinary *s1, PGABinary *s2 );
void PGABinaryPrint( PGAContext *ctx, FILE *fp, PGABinary *chrom, int nb );
/*****************************************
* char.c
*****************************************/
void PGASetCharacterAllele (PGAContext *ctx, int p, int pop, int i, char value);
char PGAGetCharacterAllele (PGAContext *ctx, int p, int pop, int i);
void PGASetCharacterInitType(PGAContext *ctx, int value);
void PGACharacterCreateString (PGAContext *ctx, int p, int pop, int InitFlag);
int PGACharacterMutation( PGAContext *ctx, int p, int pop, double mr );
void PGACharacterOneptCrossover(PGAContext *ctx, int p1, int p2, int pop1,
int c1, int c2, int pop2);
void PGACharacterTwoptCrossover( PGAContext *ctx, int p1, int p2, int pop1,
int c1, int c2, int pop2);
void PGACharacterUniformCrossover(PGAContext *ctx, int p1, int p2, int pop1,
int c1, int c2, int pop2);
void PGACharacterPrintString ( PGAContext *ctx, FILE *fp, int p, int pop);
void PGACharacterCopyString (PGAContext *ctx, int p1, int pop1, int p2,
int pop2);
int PGACharacterDuplicate( PGAContext *ctx, int p1, int pop1, int p2, int pop2);
void PGACharacterInitString(PGAContext *ctx, int p, int pop);
MPI_Datatype PGACharacterBuildDatatype(PGAContext *ctx, int p, int pop);
/*****************************************
* cmdline.c
*****************************************/
void PGAReadCmdLine( PGAContext *ctx, int *argc, char **argv );
void PGAParseDebugArg(PGAContext *ctx, char *st);
void PGAStripArgs(char **argv, int *argc, int *c, int num);
/*****************************************
* create.c
*****************************************/
PGAContext *PGACreate ( int *argc, char **argv,
int datatype, int len, int maxormin );
void PGASetUp ( PGAContext *ctx );
void PGASetRandomInitFlag(PGAContext *ctx, int RandomBoolean);
int PGAGetRandomInitFlag (PGAContext *ctx);
void PGACreatePop (PGAContext *ctx, int pop);
void PGACreateIndividual (PGAContext *ctx, int p, int pop, int initflag);
/*****************************************
* cross.c
*****************************************/
void PGACrossover ( PGAContext *ctx, int p1, int p2, int pop1,
int c1, int c2, int pop2 );
int PGAGetCrossoverType (PGAContext *ctx);
double PGAGetCrossoverProb (PGAContext *ctx);
double PGAGetUniformCrossoverProb (PGAContext *ctx);
void PGASetCrossoverType (PGAContext *ctx, int crossover_type);
void PGASetCrossoverProb( PGAContext *ctx, double crossover_prob);
void PGASetUniformCrossoverProb( PGAContext *ctx, double uniform_cross_prob);
/*****************************************
* debug.c
*****************************************/
void PGASortFuncNameIndex(PGAContext *ctx);
#if OPTIMIZE==0
void PGADebugPrint( PGAContext *ctx, int level, char *funcname,
char *msg, int datatype, void *data );
#endif
void PGASetDebugLevel(PGAContext *ctx, int level);
void PGAClearDebugLevel(PGAContext *ctx, int level);
void PGASetDebugLevelByName(PGAContext *ctx, char *funcname);
void PGAClearDebugLevelByName(PGAContext *ctx, char *funcname);
int PGAGetDebugLevelOfName(PGAContext *ctx, char *funcname);
int PGAGetDebugFlag(PGAContext *ctx, char *funcname);
void PGASetDebugFlag11(PGAContext *ctx, int Flag);
void PGASetDebugFlag20(PGAContext *ctx, int Flag);
void PGASetDebugFlag21(PGAContext *ctx, int Flag);
void PGASetDebugFlag30(PGAContext *ctx, int Flag);
void PGASetDebugFlag32(PGAContext *ctx, int Flag);
void PGASetDebugFlag34(PGAContext *ctx, int Flag);
void PGASetDebugFlag36(PGAContext *ctx, int Flag);
void PGASetDebugFlag40(PGAContext *ctx, int Flag);
void PGASetDebugFlag42(PGAContext *ctx, int Flag);
void PGASetDebugFlag44(PGAContext *ctx, int Flag);
void PGASetDebugFlag46(PGAContext *ctx, int Flag);
void PGASetDebugFlag48(PGAContext *ctx, int Flag);
void PGASetDebugFlag50(PGAContext *ctx, int Flag);
void PGASetDebugFlag52(PGAContext *ctx, int Flag);
void PGASetDebugFlag54(PGAContext *ctx, int Flag);
void PGASetDebugFlag56(PGAContext *ctx, int Flag);
void PGASetDebugFlag58(PGAContext *ctx, int Flag);
void PGASetDebugFlag60(PGAContext *ctx, int Flag);
void PGASetDebugFlag62(PGAContext *ctx, int Flag);
void PGASetDebugFlag64(PGAContext *ctx, int Flag);
void PGASetDebugFlag66(PGAContext *ctx, int Flag);
void PGAPrintDebugOptions(PGAContext *ctx);
/*****************************************
* duplcate.c
*****************************************/
int PGADuplicate(PGAContext *ctx, int p, int pop1, int pop2, int n);
void PGAChange( PGAContext *ctx, int p, int pop );
void PGASetNoDuplicatesFlag( PGAContext *ctx, int no_dup);
int PGAGetNoDuplicatesFlag (PGAContext *ctx);
/*****************************************
* evaluate.c
*****************************************/
void PGASetEvaluation ( PGAContext *ctx, int p, int pop, double val );
double PGAGetEvaluation ( PGAContext *ctx, int p, int pop );
void PGASetEvaluationUpToDateFlag ( PGAContext *ctx, int p, int pop,
int status );
int PGAGetEvaluationUpToDateFlag ( PGAContext *ctx, int p, int pop );
double PGAGetRealFromBinary(PGAContext *ctx, int p, int pop, int start,
int end, double lower, double upper);
double PGAGetRealFromGrayCode(PGAContext *ctx, int p, int pop, int start,
int end, double lower, double upper);
void PGAEncodeRealAsBinary(PGAContext *ctx, int p, int pop, int start,
int end, double low, double high, double val);
void PGAEncodeRealAsGrayCode(PGAContext *ctx, int p, int pop, int start,
int end, double low, double high, double val);
int PGAGetIntegerFromBinary(PGAContext *ctx, int p, int pop, int start,
int end);
int PGAGetIntegerFromGrayCode(PGAContext *ctx, int p, int pop, int start,
int end);
void PGAEncodeIntegerAsBinary(PGAContext *ctx, int p, int pop, int start,
int end, int val);
void PGAEncodeIntegerAsGrayCode(PGAContext *ctx, int p, int pop, int start,
int end, int val);
double PGAMapIntegerToReal (PGAContext *ctx, int v, int a, int b, double l,
double u);
int PGAMapRealToInteger(PGAContext *ctx, double r, double l, double u, int a,
int b);
/*****************************************
* fitness.c
*****************************************/
void PGAFitness ( PGAContext *ctx, int popindex );
int PGARank( PGAContext *ctx, int p, int *order, int n );
double PGAGetFitness ( PGAContext *ctx, int p, int pop );
int PGAGetFitnessType (PGAContext *ctx);
int PGAGetFitnessMinType (PGAContext *ctx);
double PGAGetMaxFitnessRank (PGAContext *ctx);
void PGASetFitnessType( PGAContext *ctx, int fitness_type);
void PGASetFitnessMinType( PGAContext *ctx, int fitness_type);
void PGASetMaxFitnessRank( PGAContext *ctx, double fitness_rank_max);
void PGAFitnessLinearNormal ( PGAContext *ctx, PGAIndividual *pop );
void PGAFitnessLinearRank ( PGAContext *ctx, PGAIndividual *pop );
void PGAFitnessMinReciprocal ( PGAContext *ctx, PGAIndividual *pop );
void PGAFitnessMinCmax ( PGAContext *ctx, PGAIndividual *pop );
void PGASetFitnessCmaxValue( PGAContext *ctx, double val);
double PGAGetFitnessCmaxValue (PGAContext *ctx);
/*****************************************
* hamming.c
*****************************************/
double PGAHammingDistance( PGAContext *ctx, int popindex);
/*****************************************
* heap.c
*****************************************/
void PGADblHeapSort ( PGAContext *ctx, double *a, int *idx, int n );
void PGAIntHeapSort ( PGAContext *ctx, int *a, int *idx, int n );
/*****************************************
* integer.c
*****************************************/
void PGASetIntegerAllele (PGAContext *ctx, int p, int pop, int i, int value);
int PGAGetIntegerAllele (PGAContext *ctx, int p, int pop, int i);
void PGASetIntegerInitPermute ( PGAContext *ctx, int min, int max);
void PGASetIntegerInitRange (PGAContext *ctx, int *min, int *max);
int PGAGetIntegerInitType (PGAContext *ctx);
int PGAGetMinIntegerInitValue (PGAContext *ctx, int i);
int PGAGetMaxIntegerInitValue (PGAContext *ctx, int i);
void PGAIntegerCreateString (PGAContext *ctx, int p, int pop, int InitFlag);
int PGAIntegerMutation( PGAContext *ctx, int p, int pop, double mr );
void PGAIntegerOneptCrossover(PGAContext *ctx, int p1, int p2, int pop1,
int c1, int c2, int pop2);
void PGAIntegerTwoptCrossover( PGAContext *ctx, int p1, int p2, int pop1,
int c1, int c2, int pop2);
void PGAIntegerUniformCrossover(PGAContext *ctx, int p1, int p2, int pop1,
int c1, int c2, int pop2);
void PGAIntegerPrintString ( PGAContext *ctx, FILE *fp, int p, int pop);
void PGAIntegerCopyString (PGAContext *ctx, int p1, int pop1, int p2, int pop2);
int PGAIntegerDuplicate( PGAContext *ctx, int p1, int pop1, int p2, int pop2);
void PGAIntegerInitString(PGAContext *ctx, int p, int pop);
MPI_Datatype PGAIntegerBuildDatatype(PGAContext *ctx, int p, int pop);
/*****************************************
* mpi_stub.c
*****************************************/
/*****************************************
* mutation.c
*****************************************/
int PGAMutate(PGAContext *ctx, int p, int pop);
void PGASetMutationType( PGAContext *ctx, int mutation_type);
int PGAGetMutationType (PGAContext *ctx);
void PGASetMutationRealValue( PGAContext *ctx, double val);
double PGAGetMutationRealValue (PGAContext *ctx);
void PGASetMutationIntegerValue( PGAContext *ctx, int val);
int PGAGetMutationIntegerValue (PGAContext *ctx);
void PGASetMutationBoundedFlag(PGAContext *ctx, int val);
int PGAGetMutationBoundedFlag(PGAContext *ctx);
void PGASetMutationProb(PGAContext *ctx, double mutation_prob);
double PGAGetMutationProb (PGAContext *ctx);
/*****************************************
* parallel.c
*****************************************/
void PGARunGM(PGAContext *ctx, double (*f)(PGAContext *, int, int),
MPI_Comm comm);
void PGAEvaluateSeq(PGAContext *ctx, int pop,
double (*f)(PGAContext *, int, int));
void PGAEvaluateCoop(PGAContext *ctx, int pop,
double (*f)(PGAContext *, int, int), MPI_Comm comm);
void PGAEvaluateMS(PGAContext *ctx, int pop,
double (*f)(PGAContext *c, int p, int pop), MPI_Comm comm);
void PGAEvaluateSlave(PGAContext *ctx, int pop,
double (*f)(PGAContext *, int, int), MPI_Comm comm);
void PGAEvaluate(PGAContext *ctx, int pop,
double (*f)(PGAContext *, int, int), MPI_Comm comm);
MPI_Datatype PGABuildDatatype(PGAContext *ctx, int p, int pop);
void PGASendIndividual(PGAContext *ctx, int p, int pop, int dest, int tag,
MPI_Comm comm);
void PGAReceiveIndividual(PGAContext *ctx, int p, int pop, int source, int tag,
MPI_Comm comm, MPI_Status *status);
void PGASendReceiveIndividual(PGAContext *ctx, int send_p, int send_pop,
int dest, int send_tag, int recv_p, int recv_pop,
int source, int recv_tag, MPI_Comm comm,
MPI_Status *status);
void PGARunIM(PGAContext *ctx, double (*f)(PGAContext *c, int p, int pop),
MPI_Comm tcomm);
void PGARunNM(PGAContext *ctx, double (*f)(PGAContext *c, int p, int pop),
MPI_Comm tcomm);
int PGAGetRank (PGAContext *ctx, MPI_Comm comm);
int PGAGetNumProcs (PGAContext *ctx, MPI_Comm comm);
void PGASetNumIslands( PGAContext *ctx, int n);
int PGAGetNumIslands (PGAContext *ctx);
void PGASetNumDemes( PGAContext *ctx, int numdemes);
int PGAGetNumDemes (PGAContext *ctx);
void PGASetCommunicator( PGAContext *ctx, MPI_Comm comm);
MPI_Comm PGAGetCommunicator( PGAContext *ctx);
/*****************************************
* pga.c
*****************************************/
void PGARun(PGAContext *ctx, double (*evaluate)(PGAContext *c, int p, int pop));
void PGARunMutationAndCrossover (PGAContext *ctx, int oldpop, int newpop);
void PGARunMutationOrCrossover ( PGAContext *ctx, int oldpop, int newpop );
void PGAUpdateGeneration(PGAContext *ctx, MPI_Comm comm);
int PGAGetDataType (PGAContext *ctx);
int PGAGetOptDirFlag (PGAContext *ctx);
int PGAGetStringLength (PGAContext *ctx);
int PGAGetVariableStringLength (PGAContext *ctx, int p, int pop);
int PGAGetGAIterValue (PGAContext *ctx);
void PGASetMutationOrCrossoverFlag( PGAContext *ctx, int flag);
void PGASetMutationAndCrossoverFlag( PGAContext *ctx, int flag);
int PGAGetMutationOrCrossoverFlag (PGAContext *ctx);
int PGAGetMutationAndCrossoverFlag (PGAContext *ctx);
/*****************************************
* pop.c
*****************************************/
void PGASortPop ( PGAContext *ctx, int pop );
int PGAGetPopSize (PGAContext *ctx);
int PGAGetNumReplaceValue (PGAContext *ctx);
int PGAGetPopReplaceType (PGAContext *ctx);
int PGAGetSortedPopIndex ( PGAContext *ctx, int n );
void PGASetPopSize (PGAContext *ctx, int popsize);
void PGASetNumReplaceValue( PGAContext *ctx, int pop_replace);
void PGASetPopReplaceType( PGAContext *ctx, int pop_replace);
/*****************************************
* random.c
*****************************************/
int PGARandomFlip ( PGAContext *ctx, double p );
int PGARandomInterval( PGAContext *ctx, int start, int end);
double PGARandom01( PGAContext *ctx, int newseed );
double PGARandomUniform( PGAContext *ctx, double start, double end);
double PGARandomGaussian( PGAContext *ctx, double mean, double sigma);
int PGAGetRandomSeed(PGAContext *ctx);
void PGASetRandomSeed(PGAContext *ctx, int seed);
/*****************************************
* real.c
*****************************************/
void PGASetRealAllele (PGAContext *ctx, int p, int pop, int i, double value);
double PGAGetRealAllele (PGAContext *ctx, int p, int pop, int i);
void PGASetRealInitPercent ( PGAContext *ctx, double *median, double *percent);
void PGASetRealInitRange (PGAContext *ctx, double *min, double *max);
double PGAGetMinRealInitValue (PGAContext *ctx, int i);
double PGAGetMaxRealInitValue (PGAContext *ctx, int i);
int PGAGetRealInitType (PGAContext *ctx);
void PGARealCreateString (PGAContext *ctx, int p, int pop, int initflag);
int PGARealMutation( PGAContext *ctx, int p, int pop, double mr );
void PGARealOneptCrossover( PGAContext *ctx, int p1, int p2, int pop1,
int c1, int c2, int pop2);
void PGARealTwoptCrossover( PGAContext *ctx, int p1, int p2, int pop1,
int c1, int c2, int pop2);
void PGARealUniformCrossover( PGAContext *ctx, int p1, int p2, int pop1,
int c1, int c2, int pop2);
void PGARealPrintString (PGAContext *ctx, FILE *fp, int p, int pop);
void PGARealCopyString ( PGAContext *ctx, int p1, int pop1, int p2, int pop2);
int PGARealDuplicate( PGAContext *ctx, int p1, int pop1, int p2, int pop2);
void PGARealInitString ( PGAContext *ctx, int p, int pop);
MPI_Datatype PGARealBuildDatatype(PGAContext *ctx, int p, int pop);
/*****************************************
* report.c
*****************************************/
void PGAPrintReport(PGAContext *ctx, FILE *fp, int pop);
void PGASetPrintOptions (PGAContext *ctx, int option);
void PGASetPrintFrequencyValue( PGAContext *ctx, int print_freq);
int PGAGetPrintFrequencyValue (PGAContext *ctx);
void PGAPrintPopulation ( PGAContext *ctx, FILE *fp, int pop );
void PGAPrintIndividual ( PGAContext *ctx, FILE *fp, int p, int pop );
void PGAPrintString ( PGAContext *ctx, FILE *file, int p, int pop );
void PGAPrintContextVariable ( PGAContext *ctx, FILE *fp );
/*****************************************
* restart.c
*****************************************/
void PGARestart(PGAContext *ctx, int source_pop, int dest_pop);
void PGASetRestartFlag(PGAContext *ctx, int val);
int PGAGetRestartFlag(PGAContext *ctx);
void PGASetRestartFrequencyValue(PGAContext *ctx, int numiter);
int PGAGetRestartFrequencyValue(PGAContext *ctx);
void PGASetRestartAlleleChangeProb(PGAContext *ctx, double prob);
double PGAGetRestartAlleleChangeProb(PGAContext *ctx);
/*****************************************
* select.c
*****************************************/
void PGASelect( PGAContext *ctx, int popix );
int PGASelectNextIndex ( PGAContext *ctx );
void PGASetSelectType( PGAContext *ctx, int select_type);
int PGAGetSelectType (PGAContext *ctx);
void PGASetPTournamentProb(PGAContext *ctx, double ptournament_prob);
double PGAGetPTournamentProb(PGAContext *ctx);
int PGASelectProportional(PGAContext *ctx, PGAIndividual *pop);
void PGASelectSUS( PGAContext *ctx, PGAIndividual *pop );
int PGASelectTournament( PGAContext *ctx, PGAIndividual *pop );
int PGASelectPTournament( PGAContext *ctx, PGAIndividual *pop );
/*****************************************
* stop.c
*****************************************/
int PGADone(PGAContext *ctx, MPI_Comm comm);
int PGACheckStoppingConditions( PGAContext *ctx);
void PGASetStoppingRuleType (PGAContext *ctx, int stoprule);
int PGAGetStoppingRuleType (PGAContext *ctx);
void PGASetMaxGAIterValue(PGAContext *ctx, int maxiter);
int PGAGetMaxGAIterValue (PGAContext *ctx);
void PGASetMaxNoChangeValue(PGAContext *ctx, int max_no_change);
void PGASetMaxSimilarityValue(PGAContext *ctx, int max_similarity);
/*****************************************
* system.c
*****************************************/
void PGAError( PGAContext *ctx, char *msg,
int level, int datatype, void *data );
void PGADestroy (PGAContext *ctx);
int PGAGetMaxMachineIntValue (PGAContext *ctx);
int PGAGetMinMachineIntValue (PGAContext *ctx);
double PGAGetMaxMachineDoubleValue (PGAContext *ctx);
double PGAGetMinMachineDoubleValue (PGAContext *ctx);
void PGAUsage( PGAContext *ctx );
void PGAPrintVersionNumber( PGAContext *ctx );
/*****************************************
* user.c
*****************************************/
void PGASetUserFunction(PGAContext *ctx, int constant, void *f);
/*****************************************
* utility.c
*****************************************/
double PGAMean ( PGAContext *ctx, double *a, int n);
double PGAStddev ( PGAContext *ctx, double *a, int n, double mean);
int PGARound(PGAContext *ctx, double x);
void PGACopyIndividual( PGAContext *ctx, int p1, int pop1, int p2, int pop2);
int PGACheckSum(PGAContext *ctx, int p, int pop);
int PGAGetWorstIndex(PGAContext *ctx, int pop);
int PGAGetBestIndex(PGAContext *ctx, int pop);
PGAIndividual *PGAGetIndividual ( PGAContext *ctx, int p, int pop);
void PGAUpdateAverage(PGAContext *ctx, int pop);
void PGAUpdateOnline(PGAContext *ctx, int pop);
void PGAUpdateOffline(PGAContext *ctx, int pop);
int PGAComputeSimilarity(PGAContext *ctx, PGAIndividual *pop);