Commit 1cde3ed4 authored by maitre's avatar maitre
Browse files

Cuda unstable, rc3 for std tpl

parent fa39069c
...@@ -67,7 +67,7 @@ Centre de Math ...@@ -67,7 +67,7 @@ Centre de Math
bool bDoubleQuotes,bWithinDisplayFunction,bWithinInitialiser,bWithinMutator,bWithinXover; bool bDoubleQuotes,bWithinDisplayFunction,bWithinInitialiser,bWithinMutator,bWithinXover;
bool bWaitingForSemiColon,bFinishNB_GEN,bFinishMINIMISE,bFinishMINIMIZE,bGenerationFunction; bool bWaitingForSemiColon,bFinishNB_GEN,bFinishMINIMISE,bFinishMINIMIZE,bGenerationFunction;
bool bCatchNextSemiColon,bWaitingToClosePopulation, bMethodsInGenome, bFinalizationFunction; bool bCatchNextSemiColon,bWaitingToClosePopulation, bMethodsInGenome, bFinalizationFunction;
bool bWithinCUDA_Initializer, bWithinMAKEFILEOPTION; bool bWithinCUDA_Initializer, bWithinMAKEFILEOPTION, bWithinCUDA_Evaluator;
CSymbol *pASymbol; CSymbol *pASymbol;
public: public:
...@@ -82,7 +82,7 @@ Centre de Math ...@@ -82,7 +82,7 @@ Centre de Math
bSymbolInserted=bDoubleQuotes=bWithinDisplayFunction=bWithinInitialiser=bWithinMutator=bWithinXover=0; bSymbolInserted=bDoubleQuotes=bWithinDisplayFunction=bWithinInitialiser=bWithinMutator=bWithinXover=0;
bWaitingForSemiColon=bFinishNB_GEN=bFinishMINIMISE=bFinishMINIMIZE=bGenerationFunction=0; bWaitingForSemiColon=bFinishNB_GEN=bFinishMINIMISE=bFinishMINIMIZE=bGenerationFunction=0;
bCatchNextSemiColon,bWaitingToClosePopulation=bMethodsInGenome=0; bCatchNextSemiColon,bWaitingToClosePopulation=bMethodsInGenome=0;
bWithinCUDA_Initializer=0, bWithinMAKEFILEOPTION; bWithinCUDA_Initializer=bWithinMAKEFILEOPTION =bWithinCUDA_Evaluator=0;
} }
// macros // macros
...@@ -179,6 +179,68 @@ exponent ([Ee][+-]?[0-9]+) ...@@ -179,6 +179,68 @@ exponent ([Ee][+-]?[0-9]+)
} }
} }
<TEMPLATE_ANALYSIS>"\\GENOME_SIZE" {
CListItem<CSymbol*> *pSym;
if (bVERBOSE) printf ("Inserting default genome size calculator.\n");
pGENOME->pSymbolList->reset();
size_t size_of_genome=0;
while (pSym=pGENOME->pSymbolList->walkToNextItem()){
/* if (pSym->Object->ObjectQualifier==1) continue; // 1=Static */
/* if ((pSym->Object->ObjectType==oArray)&&(TARGET==DREAM)) */
/* fprintf(fpOutputFile," %s = new %s[%d];\n",pSym->Object->sName,pSym->Object->pType->sName,pSym->Object->nSize/pSym->Object->pType->nSize); */
/* if (pSym->Object->ObjectType==oPointer){ */
/* if (TARGET==DREAM) fprintf(fpOutputFile," %s=null;\n",pSym->Object->sName); */
/* else fprintf(fpOutputFile," %s=NULL;\n",pSym->Object->sName); */
/* } */
DEBUG_PRT("%s has size : %lu",pSym->Object->sName,pSym->Object->nSize);
size_of_genome+=pSym->Object->nSize;
}
fprintf(fpOutputFile,"%d",size_of_genome);
DEBUG_PRT("Total genome size is %lu",size_of_genome);
}
<TEMPLATE_ANALYSIS>"\\COPY_CUDA_BUFFER" {
CListItem<CSymbol*> *pSym;
if (bVERBOSE) printf ("Inserting default genome constructor.\n");
pGENOME->pSymbolList->reset();
fprintf(fpOutputFile,"\tmemcpy(GENOME_ACCESS(id,buffer),this,Individual::sizeOfGenome);");
while (pSym=pGENOME->pSymbolList->walkToNextItem()){
if (pSym->Object->ObjectQualifier==1) continue; // 1=Static
if ((pSym->Object->ObjectType==oArray)&&(TARGET==DREAM))
fprintf(fpOutputFile," %s = new %s[%d];\n",pSym->Object->sName,pSym->Object->pType->sName,pSym->Object->nSize/pSym->Object->pType->nSize);
if (pSym->Object->ObjectType==oPointer){
if (TARGET==DREAM) fprintf(fpOutputFile," %s=null;\n",pSym->Object->sName);
else fprintf(fpOutputFile," %s=NULL;\n",pSym->Object->sName);
}
}
}
/* <TEMPLATE_ANALYSIS>"\\GENOME_CUDA_MOTION" { */
/* if (bVERBOSE) printf ("Inserting default genome cuda motion function.\n"); */
/* CListItem<CSymbol*> *pSym; */
/* if (bVERBOSE) printf ("Creating default copy constructor.\n"); */
/* fprintf (fpOutputFile,"// Memberwise copy\n"); */
/* pGENOME->pSymbolList->reset(); */
/* while (pSym=pGENOME->pSymbolList->walkToNextItem()){ */
/* if (pSym->Object->ObjectQualifier==1) continue; // 1=Static */
/* if (pSym->Object->ObjectType==oObject) */
/* fprintf(fpOutputFile," %s=genome.%s;\n",pSym->Object->sName,pSym->Object->sName); */
/* if (pSym->Object->ObjectType==oPointer) */
/* fprintf(fpOutputFile," %s=(genome.%s ? new %s(*(genome.%s)) : NULL);\n",pSym->Object->sName,pSym->Object->sName,pSym->Object->pType->sName,pSym->Object->sName); */
/* if (pSym->Object->ObjectType==oArray){ */
/* /\* fprintf(fpOutputFile," {for(int EASEA_Ndx=0; EASEA_Ndx<%d; EASEA_Ndx++)\n",pSym->Object->nSize/pSym->Object->pType->nSize); *\/ */
/* /\* fprintf(fpOutputFile," %s[EASEA_Ndx]=genome.%s[EASEA_Ndx];}\n",pSym->Object->sName,pSym->Object->sName); *\/ */
/* } */
/* } */
/* } */
<TEMPLATE_ANALYSIS>"\\GENOME_SERIAL" { <TEMPLATE_ANALYSIS>"\\GENOME_SERIAL" {
CListItem<CSymbol*> *pSym; CListItem<CSymbol*> *pSym;
...@@ -462,6 +524,14 @@ exponent ([Ee][+-]?[0-9]+) ...@@ -462,6 +524,14 @@ exponent ([Ee][+-]?[0-9]+)
yyin = fpGenomeFile; // switch to .ez file and analyser yyin = fpGenomeFile; // switch to .ez file and analyser
BEGIN COPY_EVALUATOR; BEGIN COPY_EVALUATOR;
} }
<TEMPLATE_ANALYSIS>"\\INSERT_CUDA_EVALUATOR" {
yyreset();
yyin = fpGenomeFile; // switch to .ez file and analyser
bWithinCUDA_Evaluator = 1;
BEGIN COPY_EVALUATOR;
}
<TEMPLATE_ANALYSIS>"\\ANALYSE_PARAMETERS" { <TEMPLATE_ANALYSIS>"\\ANALYSE_PARAMETERS" {
yyreset(); yyreset();
yyin = fpGenomeFile; // switch to .ez file and analyser yyin = fpGenomeFile; // switch to .ez file and analyser
...@@ -1421,7 +1491,10 @@ exponent ([Ee][+-]?[0-9]+) ...@@ -1421,7 +1491,10 @@ exponent ([Ee][+-]?[0-9]+)
if (bWithinDisplayFunction) fprintf(fpOutputFile,"(*this)"); if (bWithinDisplayFunction) fprintf(fpOutputFile,"(*this)");
else if ((TARGET==EO)&&(bWithinInitialiser)) fprintf(fpOutputFile, "(*genome)"); else if ((TARGET==EO)&&(bWithinInitialiser)) fprintf(fpOutputFile, "(*genome)");
else if ((TARGET==CUDA || TARGET==STD) && ((bWithinEvaluator) || bWithinMutator)) fprintf(fpOutputFile, "(*this)"); else if ((TARGET==CUDA || TARGET==STD) && ((bWithinEvaluator) || bWithinMutator))
if( bWithinCUDA_Evaluator)
fprintf(fpOutputFile, "(*INDIVIDUAL_ACCESS(devBuffer,id))");
else fprintf(fpOutputFile, "(*this)");
else if ((TARGET==EO)&&(bWithinMutator)) fprintf(fpOutputFile, "_genotype"); else if ((TARGET==EO)&&(bWithinMutator)) fprintf(fpOutputFile, "_genotype");
else fprintf(fpOutputFile,"genome");} // local genome name else fprintf(fpOutputFile,"genome");} // local genome name
...@@ -1497,7 +1570,12 @@ exponent ([Ee][+-]?[0-9]+) ...@@ -1497,7 +1570,12 @@ exponent ([Ee][+-]?[0-9]+)
else if (TARGET==EO) {fprintf(fpOutputFile,"genome.fitness(");bCatchNextSemiColon=true;}// changes function type// changes function type else if (TARGET==EO) {fprintf(fpOutputFile,"genome.fitness(");bCatchNextSemiColon=true;}// changes function type// changes function type
else if (TARGET==DREAM) {fprintf(fpOutputFile,"infoHabitant.setFitness(new Double(");bCatchNextSemiColon=true;}// changes function type else if (TARGET==DREAM) {fprintf(fpOutputFile,"infoHabitant.setFitness(new Double(");bCatchNextSemiColon=true;}// changes function type
else if( TARGET==CUDA || TARGET==STD) { else if( TARGET==CUDA || TARGET==STD) {
fprintf(fpOutputFile,"return fitness = "); if( bWithinCUDA_Evaluator ){
fprintf(fpOutputFile,"return ");
bWithinCUDA_Evaluator = 0;
}
else
fprintf(fpOutputFile,"return fitness = ");
bCatchNextSemiColon=false; bCatchNextSemiColon=false;
} }
bWithinEvaluator=0; bWithinEvaluator=0;
......
...@@ -43,8 +43,7 @@ void cross(GenomeClass *pChild, GenomeClass *pParent, int locus){ ...@@ -43,8 +43,7 @@ void cross(GenomeClass *pChild, GenomeClass *pParent, int locus){
\end \end
\Finalization function: \Finalization function:
std::cout << "fonction de finalization svp" << std::endl; std::cout << population ;
// std::cout << population ;
\end \end
\GenomeClass::initialiser: \GenomeClass::initialiser:
......
...@@ -18,7 +18,8 @@ __________________________________________________________*/ ...@@ -18,7 +18,8 @@ __________________________________________________________*/
float pMutPerGene=0.1; float pMutPerGene=0.1;
int n = 10; #define N_LIM 10
int n = N_LIM;
double (*Fitness)(double *, int); // pointeur sur la fonction de fitness designee dans argv[1] double (*Fitness)(double *, int); // pointeur sur la fonction de fitness designee dans argv[1]
double Sphere(double *, int); double Sphere(double *, int);
...@@ -26,9 +27,9 @@ double AckleyPath(double *, int); ...@@ -26,9 +27,9 @@ double AckleyPath(double *, int);
double Easom(double *, int); double Easom(double *, int);
double Griewangk(double *, int); double Griewangk(double *, int);
double Rastrigin(double *, int); double Rastrigin(double *, int);
double Rosenbrock(double *, int); float Rosenbrock(float *, int);
double Schwefel(double *, int); float Schwefel(float *, int);
double Weierstrass(double *, int); float Weierstrass(float *, int);
\end \end
...@@ -36,66 +37,66 @@ double Weierstrass(double *, int); ...@@ -36,66 +37,66 @@ double Weierstrass(double *, int);
//fitness function //fitness function
#include <math.h> #include <math.h>
inline double Sphere(double x[SIZE], int n) // Ex-DeJong function 1 inline float Sphere(float x[SIZE], int n) // Ex-DeJong function 1
{ {
double ret = 0; float ret = 0;
for (int i = 0;i<n; i++) ret += x[ i ] * x[ i ]; for (int i = 0;i<n; i++) ret += x[ i ] * x[ i ];
return ret; return ret;
} }
inline double AckleyPath(double x[SIZE], int n) inline float AckleyPath(float x[SIZE], int n)
{ {
//Parameters //Parameters
double a = 20.; float a = 20.;
double b = 0.2; float b = 0.2;
double c = 2*PI; float c = 2*PI;
double Scale = 32.768; // pour matcher avec les limites [-1,1] float Scale = 32.768; // pour matcher avec les limites [-1,1]
//Function computation //Function computation
double sum_x2 = 0.0; float sum_x2 = 0.0;
double sum_cos_cx = 0.0; float sum_cos_cx = 0.0;
for (int i=0; i<n; i++) { for (int i=0; i<n; i++) {
sum_x2 += Scale*Scale*x[i]*x[i]; sum_x2 += Scale*Scale*x[i]*x[i];
sum_cos_cx += cos(c*Scale*x[i]); sum_cos_cx += cos(c*Scale*x[i]);
} }
double res = -a * exp( -b * sqrt( 1/(double)n * sum_x2) ) - exp( 1/(double)n * sum_cos_cx ) + a + exp(1); float res = -a * exp( -b * sqrt( 1/(float)n * sum_x2) ) - exp( 1/(float)n * sum_cos_cx ) + a + exp(1);
return res; return res;
} }
inline double Easom(double x[SIZE], int n) inline float Easom(float x[SIZE], int n)
{ {
double res = 1.; float res = 1.;
//function computation //function computation
for (int i=0; i<n; i++) for (int i=0; i<n; i++)
res *= cos(100.*x[i])*exp(-(100.*x[i]-PI)*(100.*x[i]-PI)); res *= cos(100.*x[i])*exp(-(100.*x[i]-PI)*(100.*x[i]-PI));
return (1.-res); // pour avoir un minimum a 0. return (1.-res); // pour avoir un minimum a 0.
} }
inline double Griewangk(double x[SIZE], int n) inline float Griewangk(float x[SIZE], int n)
{ {
double res, sum = 0., prod =1.; float res, sum = 0., prod =1.;
double Scale = 600.; // pour matcher avec les limites [-1,1] float Scale = 600.; // pour matcher avec les limites [-1,1]
for (int i=1; i<=n; i++) { for (int i=1; i<=n; i++) {
prod *= cos( Scale*x[i]/sqrt( (double)i ) ); prod *= cos( Scale*x[i]/sqrt( (float)i ) );
sum += (Scale*Scale*x[i]*x[i]/4000.); sum += (Scale*Scale*x[i]*x[i]/4000.);
} }
res = sum - prod + 1.; res = sum - prod + 1.;
return res; return res;
} }
inline double Rastrigin(double x[SIZE], int n) inline float Rastrigin(float x[SIZE], int n)
{ {
double res = 0.; float res = 0.;
double Scale = 5.12; // pour matcher avec les limites [-1,1] float Scale = 5.12; // pour matcher avec les limites [-1,1]
for (int i = 0;i<n; i++) for (int i = 0;i<n; i++)
res += ((Scale*Scale*x[i]*x[i])-10*cos( 2*PI*Scale*x[i])); res += ((Scale*Scale*x[i]*x[i])-10*cos( 2*PI*Scale*x[i]));
return (10.*n + res); return (10.*n + res);
} }
inline double Rosenbrock(double x[SIZE], int n) inline float Rosenbrock(float x[SIZE], int n)
{ {
double res = 0.; float res = 0.;
double Scale = 2.048; // pour matcher avec les limites [-1,1] float Scale = 2.048; // pour matcher avec les limites [-1,1]
for (int i = 0;i<n; i++) for (int i = 0;i<n; i++)
res += 100.*((Scale*x[i+1] - Scale*Scale*x[i]*x[i])*(Scale*x[i+1] res += 100.*((Scale*x[i+1] - Scale*Scale*x[i]*x[i])*(Scale*x[i+1]
...@@ -103,40 +104,40 @@ inline double Rosenbrock(double x[SIZE], int n) ...@@ -103,40 +104,40 @@ inline double Rosenbrock(double x[SIZE], int n)
return (res); return (res);
} }
inline double Schwefel(double x[SIZE], int n) inline float Schwefel(float x[SIZE], int n)
{ {
double res = 0.; float res = 0.;
double Scale = 500.; // pour matcher avec les limites [-1,1] float Scale = 500.; // pour matcher avec les limites [-1,1]
for (int i = 0;i<n; i++) for (int i = 0;i<n; i++)
res += (-Scale*x[i]*sin( sqrt(Abs(Scale*x[i])))); res += (-Scale*x[i]*sin( sqrt(Abs(Scale*x[i]))));
return ((double)n*418.9829 + res); return ((float)n*418.9829 + res);
} }
inline double Weierstrass(double x[SIZE], int n) // Weierstrass multimidmensionnel h = 0.25 __device__ __host__ inline float Weierstrass(float x[SIZE], int n) // Weierstrass multimidmensionnel h = 0.25
{ {
double res = 0.; float res = 0.;
double val[SIZE]; float val[SIZE];
double b=2.; float b=2.;
double h = 0.25; float h = 0.25;
for (int i = 0;i<n; i++) { for (int i = 0;i<n; i++) {
val[i] = 0.; val[i] = 0.;
for (int k=0;k<ITER;k++) for (int k=0;k<ITER;k++)
val[i] += pow(b,-(double)k*h) * sin(pow(b,(double)k)*x[i]); val[i] += pow(b,-(float)k*h) * sin(pow(b,(float)k)*x[i]);
res += Abs(val[i]); res += Abs(val[i]);
} }
return (res); return (res);
} }
double gauss() float gauss()
/* Generates a normally distributed random value with variance 1 and 0 mean. /* Generates a normally distributed random value with variance 1 and 0 mean.
Algorithm based on "gasdev" from Numerical recipes' pg. 203. */ Algorithm based on "gasdev" from Numerical recipes' pg. 203. */
{ {
int iset = 0; int iset = 0;
double gset = 0.0; float gset = 0.0;
double v1 = 0.0, v2 = 0.0, r = 0.0; float v1 = 0.0, v2 = 0.0, r = 0.0;
double factor = 0.0; float factor = 0.0;
if (iset) { if (iset) {
iset = 0; iset = 0;
...@@ -144,8 +145,8 @@ double gauss() ...@@ -144,8 +145,8 @@ double gauss()
} }
else { else {
do { do {
v1 = (double)globalRandomGenerator->randFloat(0.,1.) * 2.0 - 1.0; v1 = (float)globalRandomGenerator->randFloat(0.,1.) * 2.0 - 1.0;
v2 = (double)globalRandomGenerator->randFloat(0.,1.) * 2.0 - 1.0; v2 = (float)globalRandomGenerator->randFloat(0.,1.) * 2.0 - 1.0;
r = v1 * v1 + v2 * v2; r = v1 * v1 + v2 * v2;
} }
while (r > 1.0); while (r > 1.0);
...@@ -183,7 +184,7 @@ double gauss() ...@@ -183,7 +184,7 @@ double gauss()
std::cout<<"************* n: "<<n<<std::endl; std::cout<<"************* n: "<<n<<std::endl;
// pour l'impression dans le fichier de resultats // pour l'impression dans le fichier de resultats
/* double MinTheo = 0.; */ /* float MinTheo = 0.; */
// printf("%s_T_ad n= %s MinTheo= %f ",argv[1],argv[2],MinTheo); // printf("%s_T_ad n= %s MinTheo= %f ",argv[1],argv[2],MinTheo);
\end \end
...@@ -193,22 +194,22 @@ cout << "finalization function called" << endl; ...@@ -193,22 +194,22 @@ cout << "finalization function called" << endl;
\User classes : \User classes :
GenomeClass { GenomeClass {
double x[SIZE]; float x[SIZE];
double sigma[SIZE]; // auto-adaptative mutation parameter float sigma[SIZE]; // auto-adaptative mutation parameter
} }
\end \end
\GenomeClass::initialiser : // "initializer" is also accepted \GenomeClass::initialiser : // "initializer" is also accepted
for(int i=0; i<n; i++ ) { for(int i=0; i<n; i++ ) {
Genome.x[i] = (double)random(X_MIN,X_MAX); Genome.x[i] = (float)random(X_MIN,X_MAX);
Genome.sigma[i]=(double)random(0.,0.5); Genome.sigma[i]=(float)random(0.,0.5);
} }
\end \end
\GenomeClass::crossover : \GenomeClass::crossover :
for (int i=0; i<n; i++) for (int i=0; i<n; i++)
{ {
double alpha = (double)globalRandomGenerator->getRandomIntMax(1.); // barycentric crossover float alpha = (float)globalRandomGenerator->getRandomIntMax(1.); // barycentric crossover
child1.x[i] = alpha*parent1.x[i] + (1.-alpha)*parent2.x[i]; child1.x[i] = alpha*parent1.x[i] + (1.-alpha)*parent2.x[i];
//if (&child2) child2.x[i] = alpha*parent2.x[i] + (1.-alpha)*parent1.x[i]; //if (&child2) child2.x[i] = alpha*parent2.x[i] + (1.-alpha)*parent1.x[i];
} }
...@@ -216,15 +217,15 @@ GenomeClass { ...@@ -216,15 +217,15 @@ GenomeClass {
\GenomeClass::mutator : // Must return the number of mutations \GenomeClass::mutator : // Must return the number of mutations
int NbMut=0; int NbMut=0;
double pond = 1./sqrt((double)n); float pond = 1./sqrt((float)n);
for (int i=0; i<n; i++) for (int i=0; i<n; i++)
if (tossCoin(pMutPerGene)){ if (tossCoin(pMutPerGene)){
NbMut++; NbMut++;
Genome.sigma[i] = Genome.sigma[i] * exp(SIGMA*pond*(double)gauss()); Genome.sigma[i] = Genome.sigma[i] * exp(SIGMA*pond*(float)gauss());
Genome.sigma[i] = MIN(0.5,Genome.sigma[0]); Genome.sigma[i] = MIN(0.5,Genome.sigma[0]);
Genome.sigma[i] = MAX(0.,Genome.sigma[0]); Genome.sigma[i] = MAX(0.,Genome.sigma[0]);
Genome.x[i] += Genome.sigma[i]*(double)gauss(); Genome.x[i] += Genome.sigma[i]*(float)gauss();
Genome.x[i] = MIN(X_MAX,Genome.x[i]); // pour eviter les depassements Genome.x[i] = MIN(X_MAX,Genome.x[i]); // pour eviter les depassements
Genome.x[i] = MAX(X_MIN,Genome.x[i]); Genome.x[i] = MAX(X_MIN,Genome.x[i]);
} }
...@@ -232,10 +233,10 @@ return NbMut; ...@@ -232,10 +233,10 @@ return NbMut;
\end \end
\GenomeClass::evaluator : // Returns the score \GenomeClass::evaluator : // Returns the score
double Score= 0.0; float Score= 0.0;
double Point[SIZE]; float Point[SIZE];
for (int i=0; i<n; i++) Point[i] = Genome.x[i]; for (int i=0; i<N_LIM; i++) Point[i] = Genome.x[i];
Score= Weierstrass(Point, n); Score= Weierstrass(Point, N_LIM);
return Score; return Score;
\end \end
......
EXEC = main.out EXEC = main.out
CPPFLAGS += -DUNIX_OS -Ialexyacc/include/ -g CPPFLAGS += -DUNIX_OS -Ialexyacc/include/ -g -Wno-deprecated
CPPC = g++ CPPC = g++
LDFLAGS = LDFLAGS =
......
This diff is collapsed.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment