From 13c70628584d1e76f74c6d613290ecd1df22a183 Mon Sep 17 00:00:00 2001 From: evomarc Date: Tue, 25 May 2004 07:57:52 +0000 Subject: [PATCH] Adding the statistics in createSimple (create.sh is becoming obsolete) --- eo/tutorial/Templates/MakeSimple.tmpl | 6 +- eo/tutorial/Templates/MyStructSEA.cpp | 106 ++++++++++++++++++++++++-- eo/tutorial/Templates/README | 16 +++- eo/tutorial/Templates/createSimple | 3 +- eo/tutorial/Templates/stat.tmpl | 64 ++++++++++++++++ 5 files changed, 184 insertions(+), 11 deletions(-) create mode 100644 eo/tutorial/Templates/stat.tmpl diff --git a/eo/tutorial/Templates/MakeSimple.tmpl b/eo/tutorial/Templates/MakeSimple.tmpl index 188793f62..85ddd69d6 100644 --- a/eo/tutorial/Templates/MakeSimple.tmpl +++ b/eo/tutorial/Templates/MakeSimple.tmpl @@ -5,9 +5,9 @@ DIR_EO = ../../src # END eventually modify the name of EO dir LIB_EO = $(DIR_EO)/utils/libeoutils.a $(DIR_EO)/libeo.a -.cpp: ; c++ -DPACKAGE=\"eo\" -DVERSION=\"0.9.3\" -I. -I$(DIR_EO) -Wall -g -o $@ $*.cpp $(LIB_EO) +.cpp: ; c++ -DPACKAGE=\"eo\" -DVERSION=\"0.9.3\" -I. -I$(DIR_EO) -Wall -Wno-deprecated -g -o $@ $*.cpp $(LIB_EO) -.cpp.o: ; c++ -DPACKAGE=\"eo\" -DVERSION=\"0.9.3\" -I. -I$(DIR_EO) -Wall -g -c $*.cpp +.cpp.o: ; c++ -DPACKAGE=\"eo\" -DVERSION=\"0.9.3\" -I. -I$(DIR_EO) -Wall -Wno-deprecated -g -c $*.cpp # local sources SOURCES = MyStructEA.cpp \ @@ -18,7 +18,7 @@ SOURCES = MyStructEA.cpp \ eoMyStructQuadCrossover.h MyStructEA : MyStructEA.cpp - c++ -I. -I$(DIR_EO) -g -o $@ MyStructEA.cpp $(LIB_EO) -lm + c++ -I. -I$(DIR_EO) -Wno-deprecated -g -o $@ MyStructEA.cpp $(LIB_EO) -lm tar : ; tar czvf MyStruct.tgz *.h *.cpp Makefile diff --git a/eo/tutorial/Templates/MyStructSEA.cpp b/eo/tutorial/Templates/MyStructSEA.cpp index d4cc48014..bf2a3ad80 100644 --- a/eo/tutorial/Templates/MyStructSEA.cpp +++ b/eo/tutorial/Templates/MyStructSEA.cpp @@ -53,6 +53,9 @@ using namespace std; #include "eoMyStructQuadCrossover.h" #include "eoMyStructMutation.h" +/* and (possibly) your personal statistics */ +#include "eoMyStructStat.h" + // GENOTYPE eoMyStruct ***MUST*** be templatized over the fitness //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* @@ -92,9 +95,9 @@ eoCheckPoint& make_checkpoint(eoParser& _parser, eoState& _state, eoEvalFu // evolution engine (selection and replacement) #include -eoAlgo& make_algo_scalar(eoParser& _parser, eoState& _state, eoEvalFunc& _eval, eoContinue& _continue, eoGenOp& _op) +eoAlgo& make_algo_scalar(eoParser& _parser, eoState& _state, eoEvalFunc& _eval, eoContinue& _continue, eoGenOp& _op, eoDistance *_dist = NULL) { - return do_make_algo_scalar(_parser, _state, _eval, _continue, _op); + return do_make_algo_scalar(_parser, _state, _eval, _continue, _op, _dist); } // simple call to the algo. stays there for consistency reasons @@ -133,6 +136,15 @@ try // - call it from here: // eoMyStructInit init(parser); + // if you want to do sharing, you'll need a distance. + // see file utils/eoDistance.h + // + // IF you representation has an operator[]() double-castable, + // then you can use for instance the quadratic distance (L2 norm) + // eoQuadDistance dist; + // or the Hamming distance (L1 norm) + // eoHammingDistance dist; + // Build the variation operator (any seq/prop construct) // here, a simple example with only 1 crossover (2->2, a QuadOp) and @@ -165,7 +177,7 @@ try /////////////// Same thing for MUTATION // a (first) mutation (possibly use the parser in its Ctor) - eoMyStructMutation mut /* (eoParser parser) */; + eoMyStructMutation mut /* (parser) */; // IF MORE THAN ONE: @@ -205,10 +217,12 @@ try eoSGAGenOp op(cross, pCross, mut, pMut); - //// Now the representation-independent things + //// Now some representation-independent things // - // YOU SHOULD NOT NEED TO MODIFY ANYTHING BEYOND THIS POINT + // You do not need to modify anything beyond this point // unless you want to add specific statistics to the checkpoint + // in which case you should uncomment the corresponding block + // and possibly modify the parameters in the stat object creation ////////////////////////////////////////////// // initialize the population @@ -219,8 +233,90 @@ try eoContinue & term = make_continue(parser, state, eval); // output eoCheckPoint & checkpoint = make_checkpoint(parser, state, eval, term); + + + // UNCOMMENT the following commented block if you want to add you stats + + // if uncommented, it is assumed that you will want to print some stat. + // if not, then the following objects will be created uselessly - but what the heck! + + eoMyStructStat myStat; // or maybe myStat(parser); + checkpoint.add(myStat); + // This one is probably redundant with the one in make_checkpoint, but w.t.h. + eoIncrementorParam generationCounter("Gen."); + checkpoint.add(generationCounter); + // need to get the name of the redDir param (if any) + std::string dirName = parser.getORcreateParam(std::string("Res"), "resDir", "Directory to store DISK outputs", '\0', "Output - Disk").value() + "/"; + + + // those need to be pointers because of the if's + eoStdoutMonitor *myStdOutMonitor; + eoFileMonitor *myFileMonitor; +#if !defined(NO_GNUPLOT) + eoGnuplot1DMonitor *myGnuMonitor; +#endif + + // now check how you want to output the stat: + bool printMyStructStat = parser.createParam(true, "coutMyStructStat", "Affiche ma stat à l'écran", '\0', "Mon Probleme").value(); + bool fileMyStructStat = parser.createParam(false, "fileMyStructStat", "Stocke ma stat Dans un fichier", '\0', "Mon Probleme").value(); + bool plotMyStructStat = parser.createParam(false, "plotMyStructStat", "Affiche graphiquement ma stat pendant l'évolution", '\0', "Mon Probleme").value(); + + // should we write it on StdOut ? + if (printMyStructStat) + { + myStdOutMonitor = new eoStdoutMonitor(false); + // don't forget to store the memory in the state + state.storeFunctor(myStdOutMonitor); + // and of course to add the monitor to the checkpoint + checkpoint.add(*myStdOutMonitor); + // and the different fields to the monitor + myStdOutMonitor->add(generationCounter); + myStdOutMonitor->add(eval); + myStdOutMonitor->add(myStat); + } + + // first check the directory (and creates it if not exists already): + if (fileMyStructStat || plotMyStructStat) + if (! testDirRes(dirName, true) ) + throw runtime_error("Problem with resDir"); + + // should we write it to a file ? + if (fileMyStructStat) + { + myFileMonitor = new eoFileMonitor(dirName + "myStat.xg"); + // don't forget to store the memory in the state + state.storeFunctor(myFileMonitor); + // and of course to add the monitor to the checkpoint + checkpoint.add(*myFileMonitor); + // and the different fields to the monitor + myFileMonitor->add(generationCounter); + myFileMonitor->add(eval); + myFileMonitor->add(myStat); + } + +#if !defined(NO_GNUPLOT) + // should we PLOT it on StdOut ? (one dot per generation, incremental plot) + if (plotMyStructStat) + { + myGnuMonitor = new eoGnuplot1DMonitor(dirName+"plot_myStat.xg",minimizing_fitness()); + // NOTE: you cand send commands to gnuplot at any time with the method + // myGnuMonitor->gnuplotCommand(string) + // par exemple, gnuplotCommand("set logscale y") + + // don't forget to store the memory in the state + state.storeFunctor(myGnuMonitor); + // and of course to add the monitor to the checkpoint + checkpoint.add(*myGnuMonitor); + // and the different fields to the monitor (X = eval, Y = myStat) + myGnuMonitor->add(eval); + myGnuMonitor->add(myStat); + } +#endif + // algorithm (need the operator!) eoAlgo& ga = make_algo_scalar(parser, state, eval, checkpoint, op); + // and the distance if you want to do sharing + // eoAlgo& ga = make_algo_scalar(parser, state, eval, checkpoint, op, &dist); ///// End of construction of the algorithm diff --git a/eo/tutorial/Templates/README b/eo/tutorial/Templates/README index 91c85d6a7..d0904df8d 100644 --- a/eo/tutorial/Templates/README +++ b/eo/tutorial/Templates/README @@ -1,3 +1,15 @@ +Quick NOTE: This version of README is obsolete (May 25, 2004) +In particular, a simpler version of the algorithm can be generated +using the script + createSimple + +with the same syntax. It is also more powerful, allowing for instance +to create you own statistics on the population, saving it in a file +and/or plotting on on-line during the run (see eoStat.tmpl). +More details some day, when I have some time ... + +============= Old README (most is still accurate, though) ========== + This directory contains sample files that should make it easy to create an EO algorithm to evolve any type of structure (EO comes with two examples, bitstrings and vector of real variables, @@ -9,7 +21,7 @@ objective fitness - or be patient :-) This file will help you to build the same algorithm than the ones in the Lesson4 of the tutorial, but with YOUR genotype instead of -bitstrings or vector +bitstrings or vector. More details in Lesson5 of the tutorial. It is assumed in the following that you have read the first part of the tutorial (Lessons 1 to 4). @@ -89,7 +101,7 @@ want to become active), and run % eoAppliEA @eoAppliEA.param -(see the Lesson 4 of the tutorial for more details now). +(see the Lesson 5 of the tutorial for more details now). HINTS ----- diff --git a/eo/tutorial/Templates/createSimple b/eo/tutorial/Templates/createSimple index a329bc5c1..9d7184754 100755 --- a/eo/tutorial/Templates/createSimple +++ b/eo/tutorial/Templates/createSimple @@ -37,7 +37,7 @@ endif if (-f $TargetDir/Makefile) then echo A Makefile already exists there. - echo I'm creating Makefile.$1. You'll have to merge them both, + echo "I'm creating Makefile.$1. You'll have to merge them both," echo OR to call make -f Makefile.$1 set MakeName = Makefile.$1 else @@ -48,6 +48,7 @@ echo Creating source files for application $1 in $TargetDir/ sed s/MyStruct/$1/g eoMyStruct.tmpl > $TargetDir/eo$1.h sed s/MyStruct/$1/g init.tmpl > $TargetDir/eo$1Init.h +sed s/MyStruct/$1/g stat.tmpl > $TargetDir/eo$1Stat.h sed s/MyStruct/$1/g evalFunc.tmpl > $TargetDir/eo$1EvalFunc.h sed s/MyStruct/$1/g mutation.tmpl > $TargetDir/eo$1Mutation.h sed s/MyStruct/$1/g quadCrossover.tmpl > $TargetDir/eo$1QuadCrossover.h diff --git a/eo/tutorial/Templates/stat.tmpl b/eo/tutorial/Templates/stat.tmpl new file mode 100644 index 000000000..cc3d1f84f --- /dev/null +++ b/eo/tutorial/Templates/stat.tmpl @@ -0,0 +1,64 @@ +/** -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +The above line is usefulin Emacs-like editors + */ + +/* +Template for computing statistics on eoPop +============================================ +*/ + +#ifndef _eoMyStructStat_h +#define _eoMyStructStat_h + +// include the base definition of eoInit +#include + +/** + * Always write a comment in this format before class definition + * if you want the class to be documented by Doxygen + * + * ASSUMPTION on the class GenoypeT: + * it needs to derive from EO (i.e. has a Fitness). + * + * It is assumed that you want to compute a double. + * In case you want something else, then your stat should derive from + * eoStat + * where class T is the class of the computed statistics + */ +template +class eoMyStructStat : public eoStat +{ +public : + typedef typename EOT::Fitness Fitness; + +// START eventually add or modify the anyVariable argument + /** Ctor - you change the default name of course. + * @param + * _description : inherited from eoValueParam (eoStat is an from eoVapueParam) + */ + eoMyStructStat(std::string _description = "eoMyStructStat ") : + eoStat(0.0, _description) +// END eventually add or modify the anyVariable argument + { + // START Code of Ctor of an eoMonReelStat object + // END Code of Ctor of an eoMonReelStat object + } + + void operator()(const eoPop& _pop){ + double tmpStat; + // START Code for computing the statistics - in tmpStat + // tmpStat = blablabla + // END Code for computing the statistics + value() = tmpStat; // store the stat in the eoParam value() field + } + + virtual std::string className(void) const { return "eoMyStructStat"; } +private : +// START Private data of an eoMyStructStat object + // varType anyVariable; // for example ... +// END Private data of an eoMyStructStat object +}; + +#endif +