00001
00025
00026
00027 #ifndef eoFrontSorter_h
00028 #define eoFrontSorter_h
00029
00030 #include <EO.h>
00031 #include <algorithm>
00032 #include <eoPop.h>
00033 #include <cassert>
00034
00035 namespace detail {
00036
00037
00038 struct FitnessInfo {
00039 std::vector<double> fitness;
00040 unsigned index;
00041
00042 FitnessInfo() {}
00043 FitnessInfo(const std::vector<double>& fitness_, unsigned index_) : fitness(fitness_), index(index_) {}
00044 };
00045
00046 struct CompareOn {
00047 unsigned dim;
00048 double tol;
00049
00050 CompareOn(unsigned d, double t) : dim(d), tol(t) {}
00051
00052 bool operator()(const FitnessInfo& a, const FitnessInfo& b) {
00053 return a.fitness[dim] > b.fitness[dim] && fabs(a.fitness[dim] - b.fitness[dim]) > tol;
00054 }
00055
00056 };
00057
00058 extern void front_sorter_impl(std::vector<FitnessInfo>& fitness, std::vector< std::vector<FitnessInfo> >& fronts, double tol);
00059
00060 }
00061
00065 template <class EOT>
00066 class eoFrontSorter : public eoUF< const eoPop<EOT>&, const std::vector< std::vector<detail::FitnessInfo> >& >
00067 {
00068
00069 std::vector<detail::FitnessInfo > fitness;
00070 std::vector< std::vector<detail::FitnessInfo> > fronts;
00071
00072 public :
00073
00074 typedef typename EOT::Fitness::fitness_traits Traits;
00075
00076 typedef std::vector< std::vector<detail::FitnessInfo> > front_t;
00077
00078 const std::vector<std::vector<detail::FitnessInfo> >& operator()(const eoPop<EOT>& _pop)
00079 {
00080 fitness.resize(_pop.size());
00081 for (unsigned i = 0; i < _pop.size(); ++i) {
00082 fitness[i] = detail::FitnessInfo(_pop[i].fitness().normalized(), i);
00083 }
00084
00085 detail::front_sorter_impl(fitness, fronts, Traits::tol());
00086
00087 return fronts;
00088 }
00089
00090 const std::vector<std::vector<detail::FitnessInfo> >& operator()(const std::vector<EOT*>& _pop)
00091 {
00092 fitness.resize(_pop.size());
00093 for (unsigned i = 0; i < _pop.size(); ++i) {
00094 fitness[i] = detail::FitnessInfo(_pop[i]->fitness().normalized(), i);
00095 }
00096
00097 detail::front_sorter_impl(fitness, fronts, Traits::tol());
00098
00099 return fronts;
00100 }
00101 };
00102
00103
00104 #endif