/* The Evolving Distribution Objects framework (EDO) is a template-based, ANSI-C++ evolutionary computation library which helps you to write your own estimation of distribution algorithms. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Copyright (C) 2011 Thales group */ /* Authors: Johann Dréo */ #ifndef _edoRepairerApply_h #define _edoRepairerApply_h #include #include "edoRepairer.h" template < typename EOT, typename F = typename EOT::AtomType(typename EOT::AtomType) > class edoRepairerApply : public edoRepairer { public: edoRepairerApply( F function ) : _function(function) {} protected: F * _function; }; /** Apply an arbitrary unary function as a repairer on each item of the solution * * By default, the signature of the expected function is "EOT::AtomType(EOT::AtomType)" * * @ingroup Repairers */ template < typename EOT, typename F = typename EOT::AtomType(typename EOT::AtomType)> class edoRepairerApplyUnary : public edoRepairerApply { public: edoRepairerApplyUnary( F function ) : edoRepairerApply(function) {} virtual void operator()( EOT& sol ) { std::transform( sol.begin(), sol.end(), sol.begin(), *(this->_function) ); } }; /** Apply an arbitrary binary function as a repairer on each item of the solution, * the second argument of the function being fixed and given at instanciation. * * @see edoRepairerApplyUnary * * @ingroup Repairers */ template < typename EOT, typename F = typename EOT::AtomType(typename EOT::AtomType, typename EOT::AtomType)> class edoRepairerApplyBinary : public edoRepairerApply { public: typedef typename EOT::AtomType ArgType; edoRepairerApplyBinary( F function, ArgType arg ) : edoRepairerApply(function), _arg(arg) {} virtual void operator()( EOT& sol ) { // call the binary function on each item // TODO find a way to use std::transform here? Or would it be too bloated? for(typename EOT::iterator it = sol.begin(); it != sol.end(); ++it ) { *it = (*(this->_function))( *it, _arg ); } } protected: ArgType _arg; }; #endif // !_edoRepairerApply_h