t-eoCheckpointing.cpp

00001 //-----------------------------------------------------------------------------
00002 
00003 // to avoid long name warnings
00004 #ifdef _MSC_VER
00005 #pragma warning(disable:4786)
00006 #endif
00007 
00008 #include <stdexcept>  // runtime_error
00009 
00010 //-----------------------------------------------------------------------------
00011 // tt.cpp:
00012 //
00013 //-----------------------------------------------------------------------------
00014 
00015 
00016 // general
00017 #include <utils/eoRNG.h>                // Random number generators
00018 #include <ga.h>
00019 #include <utils/eoParser.h>
00020 #include <utils/eoState.h>
00021 #include <eoGenContinue.h>
00022 //-----------------------------------------------------------------------------
00023 
00024 // include package checkpointing
00025 #include <utils/checkpointing>
00026 
00027 struct Dummy : public EO<double>
00028 {
00029     typedef double Type;
00030 };
00031 
00032 
00033 struct eoDummyPop : public eoPop<Dummy>
00034 {
00035 public :
00036     eoDummyPop(int s = 2) { resize(s); }
00037 };
00038 
00039 //-----------------------------------------------------------------------------
00040 
00041 int the_main(int argc, char **argv)
00042 { // ok, we have a command line parser and a state
00043 
00044     typedef eoBit<float> Chrom;
00045 
00046     eoParser parser(argc, argv);
00047 
00048     // Define Parameters
00049     eoValueParam<double> rate(0.01, "mutationRatePerBit", "Initial value for mutation rate per bit");
00050     eoValueParam<double> factor(0.99, "mutationFactor", "Decrease factor for mutation rate");
00051     eoValueParam<uint32_t> seed(time(0), "seed", "Random number seed");
00052     eoValueParam<std::string> load_name("", "Load","Load",'L');
00053     eoValueParam<std::string> save_name("", "Save","Save",'S');
00054 
00055     // Register them
00056     parser.processParam(rate,       "Genetic Operators");
00057     parser.processParam(factor,     "Genetic Operators");
00058     parser.processParam(load_name,  "Persistence");
00059     parser.processParam(save_name,  "Persistence");
00060     parser.processParam(seed,       "Rng seeding");
00061 
00062    eoState state;
00063    state.registerObject(parser);
00064 
00065    if (load_name.value() != "")
00066    { // load the parser. This is only neccessary when the user wants to
00067      // be able to change the parameters in the state file by hand.
00068        state.load(load_name.value()); // load the parser
00069    }
00070 
00071     // Create the algorithm here
00072     typedef Dummy EoType;
00073 
00074     eoDummyPop pop;
00075 
00076     eoGenContinue<EoType> genTerm(5); // run for 5 generations
00077 
00078     eoCheckPoint<EoType> checkpoint(genTerm);
00079     // The algorithm will now quit after five generations
00080 
00081     // Create a counter parameter
00082     eoValueParam<unsigned> generationCounter(0, "Generation");
00083 
00084     // Create an incrementor (wich is an eoUpdater). Note that the
00085     // Parameter's value is passed by reference, so every time the incrementer increments,
00086     // the data in generationCounter will change.
00087     eoIncrementor<unsigned> increment(generationCounter.value());
00088 
00089     // Add it to the checkpoint, this will result in the counter being incremented every generation
00090     checkpoint.add(increment);
00091 
00092     // The file monitor will print parameters to a comma seperated file
00093     eoFileMonitor monitor("monitor.csv");
00094 
00095     // the checkpoint mechanism can handle multiple monitors
00096     checkpoint.add(monitor);
00097 
00098     // the monitor can monitor parameters such as the generationCounter
00099     monitor.add(generationCounter);
00100 
00101     // Second moment stats: average and stdev
00102     eoSecondMomentStats<EoType> stats;
00103 
00104     // Add it to the checkpoint to get it called at the appropriate time
00105     checkpoint.add(stats);
00106 
00107     // Add it to the monitor to get it written to the file
00108     monitor.add(stats);
00109 
00110     // save state every third generation
00111     eoCountedStateSaver stateSaver1(3, state, "generation");
00112     // save state every 2 seconds
00113     eoTimedStateSaver   stateSaver2(2, state, "time");
00114 
00115     // And add the two savers to the checkpoint
00116     checkpoint.add(stateSaver1);
00117     checkpoint.add(stateSaver2);
00118 
00119     // Register the algorithm
00120     state.registerObject(rng);
00121     state.registerObject(pop);
00122 
00123     if (parser.userNeedsHelp())
00124     {
00125         parser.printHelp(std::cout);
00126         return 0;
00127     }
00128 
00129     // Either load or initialize
00130     if (load_name.value() != "")
00131     {
00132         state.load(load_name.value()); // load the rest
00133     }
00134     else
00135     {
00136         // else
00137 
00138         // initialize rng and population
00139 
00140         rng.reseed(seed.value());
00141 
00142         pop.resize(2);
00143 
00144         pop[0].fitness(1);
00145         pop[1].fitness(2);
00146     }
00147 
00148     while(checkpoint(pop))
00149     {
00150         pop[0].fitness(pop[0].fitness() + 1);
00151 
00152         time_t now = time(0);
00153 
00154         while (time(0) == now) {} // wait a second to test timed saver
00155 
00156         std::cout << "gen " << generationCounter.value() << std::endl;
00157     }
00158 
00159     // run the algorithm
00160 
00161     // Save when needed
00162     if (save_name.value() != "")
00163     {
00164         std::string file_name = save_name.value();
00165         save_name.value() = ""; // so that it does not appear in the parser section of the state file
00166         state.save(file_name);
00167     }
00168 
00169     return 1;
00170 }
00171 
00172 int main(int argc, char **argv)
00173 {
00174     try
00175     {
00176         the_main(argc, argv);
00177     }
00178     catch(std::exception& e)
00179     {
00180         std::cout << "Exception: " << e.what() << std::endl;
00181     }
00182 
00183 }

Generated on Thu Oct 19 05:06:43 2006 for EO by  doxygen 1.3.9.1