diff --git a/edo/src/edoTransform.h b/edo/src/edoTransform.h new file mode 100644 index 000000000..20421d5b1 --- /dev/null +++ b/edo/src/edoTransform.h @@ -0,0 +1,111 @@ +/* +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) 2013 Thales group +*/ +/* +Authors: + Johann Dréo +*/ + +#ifndef _edoTransform_h +#define _edoTransform_h + +#include // eoTransform + +/** @defgroup Wrappers + * + * Wrappers to interact with other parts of the framework + */ + +/** Abstract base class for wrapping an estimator and a sampler as an eoTransform + * + * @ingroup Wrappers + */ +template +class edoTransform : public eoTransform< eoPop& > +{ +public: + typedef typename D::EOType EOType; + + edoTransform( edoEstimator & estimator, edoSampler & sampler ) : + _estimator(estimator), _sampler(sampler) + {} + + virtual void operator()( eoPop & pop ) = 0; + +protected: + edoEstimator & _estimator; + edoSampler & _sampler; +}; + + +/** Wrapping an estimator and a sampler as an eoTransform. + * + * @ingroup Wrappers + */ +template +class edoTransformAdaptive : public edoTransform +{ +public: + typedef typename D::EOType EOType; + + edoTransformAdaptive( D & distrib, edoEstimator & estimator, edoSampler & sampler ) + : _distrib(distrib), _estimator(estimator), _sampler(sampler) + {} + + virtual void operator()( eoPop & pop ) + { + _distrib = _estimator( pop ); + pop.clear(); + for( unsigned int i = 0; i < pop.size(); ++i ) { + pop.push_back( _sampler(_distrib) ); + } + } + +protected: + D & _distrib; + edoEstimator & _estimator; + edoSampler & _sampler; +}; + + +/** Wrapping an estimator and a sampler as an eoTransform, + * the distribution is created at instanciation and replaced at each call. + * + * @ingroup Wrappers + */ +template +class edoTransformStateless : public edoTransformAdaptive +{ +public: + typedef typename D::EOType EOType; + + edoTransformStateless( edoEstimator & estimator, edoSampler & sampler ) + : edoTransformAdaptive( *(new D), estimator, sampler ) + {} + + ~edoTransformStateless() + { + // delete the temporary distrib allocated in constructor + delete &(this->_distrib); + } +}; + +#endif // !_edoTransform_h