Obsolete, now present in eoOp.h
This commit is contained in:
parent
0b0c3f2fc0
commit
7303d62c1a
1 changed files with 0 additions and 200 deletions
|
|
@ -1,200 +0,0 @@
|
||||||
/* -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
|
|
||||||
|
|
||||||
-----------------------------------------------------------------------------
|
|
||||||
eoGeneralOp.h
|
|
||||||
General genetic operator, which can be used to wrap any unary or binary
|
|
||||||
operator
|
|
||||||
(c) Maarten Keijzer (mak@dhi.dk) and GeNeura Team, 1999, 2000
|
|
||||||
|
|
||||||
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 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
Contact: todos@geneura.ugr.es, http://geneura.ugr.es
|
|
||||||
*/
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#ifndef eoGeneralOp_h
|
|
||||||
#define eoGeneralOp_h
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#include <vector> // vector
|
|
||||||
#include <iterator>
|
|
||||||
#include <eoUniform.h> // eoUniform
|
|
||||||
#include <eoOp.h> // eoOp, eoMonOp, eoBinOp
|
|
||||||
#include <eoPop.h> // eoPop
|
|
||||||
#include <eoPopOps.h> // eoTransform
|
|
||||||
#include <eoOpSelector.h> // eoOpSelector
|
|
||||||
#include <list>
|
|
||||||
#include "eoRNG.h"
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* eGeneralOp: General genetic operator; for objects used to transform sets
|
|
||||||
of EOs
|
|
||||||
*/
|
|
||||||
template<class EOT>
|
|
||||||
class eoGeneralOp: public eoOp<EOT>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
/// Ctor that honors its superclass
|
|
||||||
eoGeneralOp(): eoOp<EOT>( Nary ) {};
|
|
||||||
|
|
||||||
/// Virtual dtor
|
|
||||||
virtual ~eoGeneralOp () {};
|
|
||||||
|
|
||||||
/** Method that really does the stuff. Applies the genetic operator
|
|
||||||
to a vector of inputs, and puts results in the output vector */
|
|
||||||
virtual void operator()( eoPop<EOT>::iterator _in,
|
|
||||||
insert_iterator< eoPop<EOT> > _out) const = 0;
|
|
||||||
|
|
||||||
/// Number of inputs
|
|
||||||
virtual unsigned nInputs(void) const { return repNInputs;};
|
|
||||||
|
|
||||||
/// Number of output arguments, or arguments that are pushed onto the output vector
|
|
||||||
virtual unsigned nOutputs(void) const { return repNOutputs; };
|
|
||||||
|
|
||||||
virtual string className() const {return "eoGeneralOp";};
|
|
||||||
|
|
||||||
protected:
|
|
||||||
/// Default ctor; protected so that only derived classes can use it
|
|
||||||
eoGeneralOp( unsigned _nInputs = 0, unsigned _nOutputs = 0 )
|
|
||||||
: repNInputs( _nInputs), repNOutputs( _nOutputs) {};
|
|
||||||
|
|
||||||
/// change number of inputs
|
|
||||||
void setNInputs( unsigned _nInputs) { repNInputs = _nInputs;};
|
|
||||||
|
|
||||||
/// change number of outputs
|
|
||||||
void setNOutputs( unsigned _nOutputs) { repNOutputs = _nOutputs;};
|
|
||||||
|
|
||||||
private:
|
|
||||||
unsigned repNInputs;
|
|
||||||
unsigned repNOutputs;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/// Wraps monary operators
|
|
||||||
template <class EOT>
|
|
||||||
class eoWrappedMonOp : public eoGeneralOp<EOT>
|
|
||||||
{
|
|
||||||
public :
|
|
||||||
///
|
|
||||||
eoWrappedMonOp(const eoMonOp<EOT>& _op) : eoGeneralOp<EOT>( 1, 1), op(_op) {};
|
|
||||||
|
|
||||||
///
|
|
||||||
virtual ~eoWrappedMonOp() {}
|
|
||||||
|
|
||||||
/// Instantiates the abstract method
|
|
||||||
void operator()( eoPop<EOT>::iterator _in,
|
|
||||||
insert_iterator< eoPop< EOT> > _out ) const {
|
|
||||||
EOT result = *_in;
|
|
||||||
op( result );
|
|
||||||
*_out = result;
|
|
||||||
}
|
|
||||||
|
|
||||||
///
|
|
||||||
virtual string className() const {return "eoWrappedMonOp";};
|
|
||||||
|
|
||||||
|
|
||||||
private :
|
|
||||||
const eoMonOp<EOT>& op;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/// Wraps binary operators
|
|
||||||
template <class EOT>
|
|
||||||
class eoWrappedBinOp : public eoGeneralOp<EOT>
|
|
||||||
{
|
|
||||||
public :
|
|
||||||
///
|
|
||||||
eoWrappedBinOp(const eoBinOp<EOT>& _op) : eoGeneralOp<EOT>(2, 2), op(_op) {}
|
|
||||||
|
|
||||||
///
|
|
||||||
virtual ~eoWrappedBinOp() {}
|
|
||||||
|
|
||||||
/// Instantiates the abstract method. EOT should have copy ctor.
|
|
||||||
void operator()(eoPop<EOT>::iterator _in,
|
|
||||||
insert_iterator< eoPop< EOT> > _out ) const {
|
|
||||||
EOT out1 = *_in;
|
|
||||||
_in++;
|
|
||||||
EOT out2 = *_in;
|
|
||||||
op(out1, out2);
|
|
||||||
*_out++ = out1;
|
|
||||||
*_out = out2;
|
|
||||||
}
|
|
||||||
|
|
||||||
///
|
|
||||||
virtual string className() const {return "eoWrappedBinOp";};
|
|
||||||
|
|
||||||
private :
|
|
||||||
const eoBinOp<EOT>& op;
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Combines several ops
|
|
||||||
template <class EOT>
|
|
||||||
class eoCombinedOp : public eoGeneralOp<EOT>
|
|
||||||
{
|
|
||||||
public :
|
|
||||||
|
|
||||||
///
|
|
||||||
eoCombinedOp() : eoGeneralOp<EOT>() {}
|
|
||||||
|
|
||||||
///
|
|
||||||
virtual ~eoCombinedOp() {}
|
|
||||||
|
|
||||||
/// Adds a new operator to the combined Op
|
|
||||||
void addOp(eoGeneralOp<EOT>* _op) {
|
|
||||||
ops.push_back(_op);
|
|
||||||
unsigned nInputs = nInputs() < _op->nInputs()? _op->nInputs() : nInputs;
|
|
||||||
setNInputs( nInputs );
|
|
||||||
unsigned nOutputs = nOutputs() < _op->nOutputs()? _op->nOutputs() : nOutputs;
|
|
||||||
setNOutputs( nInputs );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Erases all operators added so far
|
|
||||||
void clear(void) {
|
|
||||||
ops.resize(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Applies all ops in the combined op
|
|
||||||
void operator()( eoPop<EOT>::iterator _in,
|
|
||||||
insert_iterator< eoPop< EOT> > _out ) const {
|
|
||||||
// used for provisional input and output. Results are put in provOut,
|
|
||||||
// and copied back to provIn.
|
|
||||||
eoPop<EOT> provIn, provOut;
|
|
||||||
insert_iterator< eoPop< EOT> > out = provOut.begin();
|
|
||||||
ops[0]( _in, out );
|
|
||||||
for ( unsigned i = 1; i < ops.size; i ++ ) {
|
|
||||||
copy( provOut.begin(), provOut.end(), provIn.begin() );
|
|
||||||
insert_iterator< eoPop< EOT> > in = provIn.begin();
|
|
||||||
out = provOut.begin();
|
|
||||||
ops[i]( in, out );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy back to output
|
|
||||||
copy( provOut.begin(), provOut.end(), _out );
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private :
|
|
||||||
vector<eoGeneralOp<EOT>* > ops;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif eoGeneral_h
|
|
||||||
Reference in a new issue