diff --git a/eo/src/pyeo/PyEO.cpp b/eo/src/pyeo/PyEO.cpp index 085eb728..ce8c6164 100644 --- a/eo/src/pyeo/PyEO.cpp +++ b/eo/src/pyeo/PyEO.cpp @@ -173,7 +173,7 @@ BOOST_PYTHON_MODULE(PyEO) ; class_ >("eoPop", init<>() ) - .def( init< unsigned, eoInit& >() ) + .def( init< unsigned, eoInit& >()[with_custodian_and_ward<1,3>()] ) .def("append", &eoPop::append) .def("__str__", to_string >) .def("__len__", &eoPop::size) diff --git a/eo/src/pyeo/PyEO.h b/eo/src/pyeo/PyEO.h index cf9a4933..086d830c 100644 --- a/eo/src/pyeo/PyEO.h +++ b/eo/src/pyeo/PyEO.h @@ -41,7 +41,6 @@ class PyFitness : public boost::python::object template PyFitness(const T& o) : object(o) {} - static unsigned nObjectives() { return objective_info.size(); } static double tol() { return 1e-6; } @@ -117,7 +116,7 @@ struct PyEO : public EO< PyFitness > object getGenome() const { return genome; } void setGenome(object g) { genome = g; } object genome; - + std::string to_string() const { std::string result; diff --git a/eo/src/pyeo/algos.cpp b/eo/src/pyeo/algos.cpp index baa137bb..b8c69558 100644 --- a/eo/src/pyeo/algos.cpp +++ b/eo/src/pyeo/algos.cpp @@ -36,7 +36,18 @@ void algos() eoQuadOp&, float, eoMonOp&, float, eoEvalFunc&, - eoContinue&>()) + eoContinue&>() + [ + with_custodian_and_ward<1,2, + with_custodian_and_ward<1,3, + with_custodian_and_ward<1,5, + with_custodian_and_ward<1,7, + with_custodian_and_ward<1,8> + > + > + > + >() + ]) .def("__call__", &eoSGA::operator()) ; diff --git a/eo/src/pyeo/breeders.cpp b/eo/src/pyeo/breeders.cpp index 466286f5..4610e947 100644 --- a/eo/src/pyeo/breeders.cpp +++ b/eo/src/pyeo/breeders.cpp @@ -25,9 +25,9 @@ #include "PyEO.h" #include "def_abstract_functor.h" -#define DEF(x) class_, bases > >(#x).def("__call__", &eoBreed::operator()) -#define DEF2(x, i1) class_, bases > >(#x, init() ).def("__call__", &eoBreed::operator()) -#define DEF3(x, i1, i2) class_, bases > >(#x, init() ).def("__call__", &eoBreed::operator()) +#define DEF3(x, i1, i2) class_, bases > >(#x, \ + init()[with_custodian_and_ward<1,2,with_custodian_and_ward<1,3> >()])\ + .def("__call__", &eoBreed::operator()) void breeders() { @@ -36,14 +36,14 @@ void breeders() DEF3(eoSelectTransform, eoSelect&, eoTransform&); DEF3(eoGeneralBreeder, eoSelectOne&, eoGenOp&) - .def( init&, eoGenOp&, double>() ) - .def( init&, eoGenOp&, double, bool>() ) + .def( init&, eoGenOp&, double>()[WC2]) + .def( init&, eoGenOp&, double, bool>()[WC2] ) .def( init&, eoGenOp&, eoHowMany>() ); DEF3(eoOneToOneBreeder, eoGenOp&, eoEvalFunc&) - .def( init&, eoEvalFunc&, double>() ) - .def( init&, eoEvalFunc&, double, eoHowMany>() ); + .def( init&, eoEvalFunc&, double>()[WC2] ) + .def( init&, eoEvalFunc&, double, eoHowMany>()[WC2] ); } diff --git a/eo/src/pyeo/continuators.cpp b/eo/src/pyeo/continuators.cpp index a7231a87..974f5d5f 100644 --- a/eo/src/pyeo/continuators.cpp +++ b/eo/src/pyeo/continuators.cpp @@ -50,14 +50,14 @@ void continuators() .def("__call__", &eoGenContinue::operator()) ; - class_, bases > >("eoCombinedContinue", init&>()) - .def( init&, eoContinue& >() ) - .def("add", &eoCombinedContinue::add) + class_, bases > >("eoCombinedContinue", init&>()[WC1]) + .def( init&, eoContinue& >()[WC2] ) + .def("add", &eoCombinedContinue::add, WC1) .def("__call__", &eoCombinedContinue::operator()) ; class_, bases > >("eoEvalContinue", - init&, unsigned long>()) + init&, unsigned long>()[WC1]) .def("__call__", &eoEvalContinue::operator()) ; @@ -76,11 +76,13 @@ void addSortedStat(eoCheckPoint& c, eoSortedStatBase& s) { c.add(s); void add_checkpoint() { class_, bases< eoContinue > >("eoCheckPoint", - init&>()) - .def("add", addContinue) + + init&> ()[with_custodian_and_ward<1,2>()] + ) + .def("add", addContinue, with_custodian_and_ward<1,2>() ) .def("add", addMonitor, with_custodian_and_ward<1,2>() ) - .def("add", addStat) - .def("add", addSortedStat) + .def("add", addStat, with_custodian_and_ward<1,2>()) + .def("add", addSortedStat, with_custodian_and_ward<1,2>()) .def("__call__", &eoCheckPoint::operator()) ; } diff --git a/eo/src/pyeo/def_abstract_functor.h b/eo/src/pyeo/def_abstract_functor.h index fe937952..7324dc48 100644 --- a/eo/src/pyeo/def_abstract_functor.h +++ b/eo/src/pyeo/def_abstract_functor.h @@ -23,6 +23,10 @@ #include +// DEFINES for call +#define WC1 boost::python::with_custodian_and_ward<1,2>() +#define WC2 boost::python::with_custodian_and_ward<1,2, with_custodian_and_ward<1,3> >() + namespace eoutils { using namespace boost::python; diff --git a/eo/src/pyeo/geneticOps.cpp b/eo/src/pyeo/geneticOps.cpp index 9e4379ff..777a0f5c 100644 --- a/eo/src/pyeo/geneticOps.cpp +++ b/eo/src/pyeo/geneticOps.cpp @@ -25,6 +25,7 @@ #include #include "PyEO.h" +#include "def_abstract_functor.h" class GenOpWrapper : public eoGenOp { @@ -138,12 +139,12 @@ void geneticOps() ; class_, bases >, boost::noncopyable>("eoSequentialOp", init<>()) - .def("add", &eoSequentialOp::add) + .def("add", &eoSequentialOp::add, WC1) .def("apply", &eoSequentialOp::apply) ; class_, bases >, boost::noncopyable>("eoProportionalOp", init<>()) - .def("add", &eoProportionalOp::add) + .def("add", &eoProportionalOp::add, WC1) .def("apply", &eoProportionalOp::apply) ; diff --git a/eo/src/pyeo/random_numbers.cpp b/eo/src/pyeo/random_numbers.cpp index 0088b1c1..c2cbd993 100644 --- a/eo/src/pyeo/random_numbers.cpp +++ b/eo/src/pyeo/random_numbers.cpp @@ -22,6 +22,7 @@ #include #include +#include using namespace boost::python; @@ -47,6 +48,26 @@ void rng_from_string(eoRng& _rng, std::string s) _rng.readFrom(is); } +int spin(eoRng& _rng, numeric::array values, double total) +{ + if (total == 0.0) + { + unsigned sz = len(values); + for (unsigned i = 0; i < sz; ++i) + { + total += extract(values[i]); //extract? + } + } + + double chance = _rng.uniform() * total; + + int i = 0; + while (chance >= 0.0) + chance -= extract(values[i++]); + + return --i; +} + void random_numbers() { class_("eoRng", init()) @@ -60,6 +81,7 @@ void random_numbers() .def("negexp", &eoRng::negexp) .def("to_string", rng_to_string) .def("from_string", rng_from_string) + .def("roulette_wheel", spin) ; def("rng", get_rng, return_value_policy()); diff --git a/eo/src/pyeo/replacement.cpp b/eo/src/pyeo/replacement.cpp index 683aa233..ecfcf284 100644 --- a/eo/src/pyeo/replacement.cpp +++ b/eo/src/pyeo/replacement.cpp @@ -29,7 +29,9 @@ #define DEF(x) class_, bases > >(#x).def("__call__", &eoReplacement::operator()) #define DEF2(x, i1) class_, bases > >(#x, init() ).def("__call__", &eoReplacement::operator()) -#define DEF3(x, i1, i2) class_, bases > >(#x, init() ).def("__call__", &eoReplacement::operator()) +#define DEF3(x, i1, i2) class_, bases > >(#x, \ + init() [WC2])\ + .def("__call__", &eoReplacement::operator()) void replacement() { @@ -37,8 +39,11 @@ void replacement() // eoReplacement.h DEF(eoGenerationalReplacement); - DEF2(eoWeakElitistReplacement, eoReplacement& ); - + + class_, bases > > + ("eoWeakElitistReplacement", + init< eoReplacement& >()[WC1]); + // eoMergeReduce.h DEF3(eoMergeReduce, eoMerge&, eoReduce& ); DEF(eoPlusReplacement); @@ -52,10 +57,10 @@ void replacement() DEF2(eoSSGAStochTournamentReplacement, double); // eoReduceMergeReduce.h - class_, bases > >("eoReplacement", - init&, - eoHowMany, eoReduce&, eoReduce&>()) - .def("__call__", &eoReplacement::operator()); + //class_, bases > >("eoReplacement", +// init&, +// eoHowMany, eoReduce&, eoReduce&>()) +// .def("__call__", &eoReplacement::operator()); //eoMGGReplacement DEF(eoMGGReplacement) diff --git a/eo/src/pyeo/selectOne.cpp b/eo/src/pyeo/selectOne.cpp index 3216a753..877f0595 100644 --- a/eo/src/pyeo/selectOne.cpp +++ b/eo/src/pyeo/selectOne.cpp @@ -27,6 +27,7 @@ #include "PyEO.h" #include "pickle.h" +#include "def_abstract_functor.h" class eoSelectOneWrapper : public eoSelectOne { @@ -85,7 +86,7 @@ void selectOne() add_select >("eoDetTournamentSelect", init<>(), init() ); add_select >("eoStochTournamentSelect", init<>(), init() ); add_select >("eoTruncatedSelectOne", - init&, double>(), init&, eoHowMany >() ); + init&, double>()[WC1], init&, eoHowMany >()[WC1] ); // eoProportionalSelect is not feasible to implement at this point as fitness is not recognizable as a float // use eoDetTournament instead: with a t-size of 2 it is equivalent to eoProportional with linear scaling diff --git a/eo/src/pyeo/selectors.cpp b/eo/src/pyeo/selectors.cpp index 25be973b..4d5cfae7 100644 --- a/eo/src/pyeo/selectors.cpp +++ b/eo/src/pyeo/selectors.cpp @@ -30,8 +30,8 @@ #include "def_abstract_functor.h" #define DEF(x) class_, bases > >(#x).def("__call__", &eoSelect::operator()) -#define DEF2(x, i1) class_, bases > >(#x, init() ).def("__call__", &eoSelect::operator()) -#define DEF3(x, i1, i2) class_, bases > >(#x, init() ).def("__call__", &eoSelect::operator()) +#define DEF2(x, i1) class_, bases > >(#x, init()[WC1] ).def("__call__", &eoSelect::operator()) +#define DEF3(x, i1, i2) class_, bases > >(#x, init()[WC1] ).def("__call__", &eoSelect::operator()) void selectors() { @@ -39,21 +39,21 @@ void selectors() DEF(eoDetSelect).def( init() ).def( init() ); DEF3(eoSelectMany, eoSelectOne&, double) - .def( init< eoSelectOne&, double, bool>() ) - .def( init< eoSelectOne&, eoHowMany>() ); + .def( init< eoSelectOne&, double, bool>()[WC1] ) + .def( init< eoSelectOne&, eoHowMany>()[WC1] ); DEF2(eoSelectNumber, eoSelectOne&) - .def( init< eoSelectOne&, unsigned>()); + .def( init< eoSelectOne&, unsigned>()[WC1]); DEF2(eoSelectPerc, eoSelectOne&) - .def( init&, float>() ); + .def( init&, float>()[WC1] ); DEF3(eoTruncSelect, eoSelectOne&, eoHowMany); class_, bases > >("eoTruncatedSelectMany", - init&, double, double> ()) - .def(init&, double, double, bool> ()) - .def(init&, double, double, bool, bool> ()) - .def(init&, eoHowMany, eoHowMany> ()); + init&, double, double>()[WC1]) + .def(init&, double, double, bool> ()[WC1]) + .def(init&, double, double, bool, bool> ()[WC1]) + .def(init&, eoHowMany, eoHowMany> ()[WC1]); } diff --git a/eo/src/pyeo/statistics.cpp b/eo/src/pyeo/statistics.cpp index 7ffac706..8dacf46e 100644 --- a/eo/src/pyeo/statistics.cpp +++ b/eo/src/pyeo/statistics.cpp @@ -37,7 +37,7 @@ const PyEO& popview_getitem(const std::vector& pop, int it) return *pop[item]; } - + void statistics() { class_, StatBaseWrapper, boost::noncopyable> @@ -56,6 +56,4 @@ void statistics() .def("lastCall", &eoSortedStatBase::lastCall) .def("__call__", &SortedStatBaseWrapper::operator()) ; - - } diff --git a/eo/src/pyeo/test/test_breeders.py b/eo/src/pyeo/test/test_breeders.py index ae77a849..fb8f19b7 100644 --- a/eo/src/pyeo/test/test_breeders.py +++ b/eo/src/pyeo/test/test_breeders.py @@ -1,16 +1,12 @@ from maxone import * import unittest -evaluate = EvalFunc() -init = Init(20) -mutate = Mutate() -xover = Crossover() - -class TestSGA(unittest.TestCase): +class TestBreeders(unittest.TestCase): def runtest(self, breed): - pop = eoPop(50, init) + pop = eoPop(50, Init(20)) + evaluate = EvalFunc() for indy in pop: evaluate(indy) newpop = eoPop(); @@ -24,12 +20,10 @@ class TestSGA(unittest.TestCase): def testGeneralBreeder(self): seq = eoSequentialOp(); - seq.add(xover, 0.7) - seq.add(mutate, 0.9) + seq.add(Crossover(), 0.7) + seq.add(Mutate(), 0.1) - sel = eoDetTournamentSelect(3) - - breed = eoGeneralBreeder(sel, seq) + breed = eoGeneralBreeder(eoDetTournamentSelect(3), seq) self.runtest(breed) diff --git a/eo/src/pyeo/test/test_mo.py b/eo/src/pyeo/test/test_mo.py index d224fcfd..ac847290 100644 --- a/eo/src/pyeo/test/test_mo.py +++ b/eo/src/pyeo/test/test_mo.py @@ -95,7 +95,8 @@ class NSGA_II(eoAlgo): i += 1 if i%100 == 0: - pass #do_plot(pop) + pass + do_plot(pop) worths = self.perf2worth.getValue() @@ -163,9 +164,8 @@ class TestNSGA_II(unittest.TestCase): def testNSGA_II(self): - init = MyInit(); evaluate = AnEval(); - pop = eoPop(25, init) + pop = eoPop(25, MyInit()) for indy in pop: evaluate(indy) nsga = NSGA_II(50)