From 96f618f88fd53aaee94b831ec9f8d657b3900ee2 Mon Sep 17 00:00:00 2001 From: gustavo Date: Mon, 24 Jan 2000 21:13:21 +0000 Subject: [PATCH] some reviews --- eo/src/EO.h | 272 +++++++++--------- eo/src/UException.h | 41 --- eo/src/eo1d.h | 15 +- eo/src/eo2dVector.h | 667 ++++++++++++++++++++++---------------------- eo/src/eoBin.h | 23 +- eo/src/eoParser.h | 44 +-- 6 files changed, 508 insertions(+), 554 deletions(-) delete mode 100644 eo/src/UException.h diff --git a/eo/src/EO.h b/eo/src/EO.h index 9e71a4dea..81668b897 100644 --- a/eo/src/EO.h +++ b/eo/src/EO.h @@ -1,137 +1,135 @@ -// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- - -//----------------------------------------------------------------------------- -// EO.h -// (c) GeNeura Team 1998 -/* - 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 EO_H -#define EO_H - -//----------------------------------------------------------------------------- - -#include // runtime_error -#include -#include - -//----------------------------------------------------------------------------- -/** EO is a base class for evolvable objects, that is, the subjects of evolution. - EOs have only got a fitness, which at the same time needs to be only an object with the - operation less than (<) defined. Fitness says how good is the object; evolution or change - of these objects is left to the genetic operators. A fitness less than another means a - worse fitness, in whatever the context; thus, fitness is always maximized; although - it can be minimized with a proper definition of the < operator.\\ - The fitness object must have, besides an void ctor, a copy ctor. -*/ -template class EO: public eoObject, public eoPersistent -{ -public: - typedef F Fitness; - - /** Default constructor. - Fitness must have a ctor which takes 0 as a value; we can not use void ctors here - since default types like float have no void initializer. VC++ allows it, but gcc does not - */ - EO(): repFitness(0), invalidFitness(true) {} - - /** Ctor from stream. - Fitness must have defined the lecture from an istream. - */ - EO( istream& _is ) { - _is >> repFitness; - invalidFitness = false; - }; - - /// Copy ctor - EO( const EO& _eo ): repFitness( _eo.repFitness ), invalidFitness( _eo.invalidFitness ) {}; - - /// Virtual dtor - virtual ~EO() {}; - - /// Return fitness value. - Fitness fitness() const - { - if (invalid()) - //throw runtime_error("invalid fitness"); - cout << "invalid fitness" << endl; - return repFitness; - } - - // Set fitness as invalid. - void invalidate() { invalidFitness = true; } - - /** Set fitness. At the same time, validates it. - * @param _fitness New fitness value. - */ - void fitness(const Fitness& _fitness) - { - repFitness = _fitness; - invalidFitness = false; - } - - /** Return true If fitness value is invalid, false otherwise. - * @return true If fitness is invalid. - */ - bool invalid() const { return invalidFitness; } - - /** Returns true if - @return true if the fitness is higher - */ - bool operator<(const EO& _eo2) const { return fitness() < _eo2.fitness();} - - /// Methods inherited from eoObject - //@{ - - /** Return the class id. - * @return the class name as a string - */ - virtual string className() const { return "EO"; }; - - /** - * Read object.\\ - * Calls base class, just in case that one had something to do. The read and print - * methods should be compatible and have the same format. In principle, format is - * "plain": they just print a number - * @param _is a istream. - * @throw runtime_exception If a valid object can't be read. - */ - virtual void readFrom(istream& _is) { - _is >> repFitness; - invalidFitness = false; - } - - /** - * Write object. It's called printOn since it prints the object _on_ a stream. - * @param _os A ostream. - */ - virtual void printOn(ostream& _os) const { - _os << repFitness << endl; - } - - //@} - -private: - Fitness repFitness; // value of fitness for this chromosome - bool invalidFitness; // true if the value of fitness is invalid -}; - -//----------------------------------------------------------------------------- - -#endif EO_H +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// EO.h +// (c) GeNeura Team 1998 +/* + 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 EO_H +#define EO_H + +//----------------------------------------------------------------------------- + +#include // runtime_error +#include // +#include // + +//----------------------------------------------------------------------------- +/** EO is a base class for evolvable objects, that is, the subjects of + evolution. EOs have only got a fitness, which at the same time needs to be + only an object with the operation less than (<) defined. Fitness says how + good is the object; evolution or change of these objects is left to the + genetic operators. A fitness less than another means a worse fitness, in + whatever the context; thus, fitness is always maximized; although it can + be minimized with a proper definition of the < operator. The fitness + object must have, besides an void ctor, a copy ctor. +*/ +template class EO: public eoObject, public eoPersistent +{ +public: + typedef F Fitness; + + /** Default constructor. + Fitness must have a ctor which takes 0 as a value; we can not use void + ctors here since default types like float have no void initializer. + VC++ allows it, but gcc does not + */ + EO(): repFitness(0), invalidFitness(true) {} + + /** Ctor from stream. + Fitness must have defined the lecture from an istream. + */ + EO( istream& _is ) { readFrom(_is); } + + /// Virtual dtor + virtual ~EO() {}; + + /// Return fitness value. + Fitness fitness() const { + if (invalid()) + throw runtime_error("invalid fitness"); + return repFitness; + } + + // Set fitness as invalid. + void invalidate() { invalidFitness = true; } + + /** Set fitness. At the same time, validates it. + * @param _fitness New fitness value. + */ + void fitness(const Fitness& _fitness) + { + repFitness = _fitness; + invalidFitness = false; + } + + /** Return true If fitness value is invalid, false otherwise. + * @return true If fitness is invalid. + */ + bool invalid() const { return invalidFitness; } + + /** Returns true if + @return true if the fitness is higher + */ + bool operator<(const EO& _eo2) const { return fitness() < _eo2.fitness(); } + + /// Methods inherited from eoObject + //@{ + + /** Return the class id. + * @return the class name as a string + */ + virtual string className() const { return "EO"; } + + /** + * Read object.\\ + * Calls base class, just in case that one had something to do. + * The read and print methods should be compatible and have the same format. + * In principle, format is "plain": they just print a number + * @param _is a istream. + * @throw runtime_exception If a valid object can't be read. + */ + virtual void readFrom(istream& _is) { + _is >> repFitness; + if (is) + invalidFitness = false; + else + throw runtime_error("EO(istream&): can't read valid eo from istream"); + } + + /** + * Write object. Called printOn since it prints the object _on_ a stream. + * @param _os A ostream. + */ + virtual void printOn(ostream& _os) const { + _os << repFitness << endl; + } + + //@} + +private: + Fitness repFitness; // value of fitness for this chromosome + bool invalidFitness; // true if the value of fitness is invalid +}; + +//----------------------------------------------------------------------------- + +#endif EO_H + diff --git a/eo/src/UException.h b/eo/src/UException.h deleted file mode 100644 index 41e8213f5..000000000 --- a/eo/src/UException.h +++ /dev/null @@ -1,41 +0,0 @@ -//----------------------------------------------------------------------------- -// UException.h -//----------------------------------------------------------------------------- - -#ifndef _UEXCEPTION_H -#define _UEXCEPTION_H - -#include -#if defined (__BCPLUSPLUS__) -#include -#else -#include -#endif - -using namespace std; - -//----------------------------------------------------------------------------- -// Class UException -//----------------------------------------------------------------------------- - -//@{ -/** - * This class manages exceptions. It´s barely an extension of the standard exception, - * but it can be initialized with an STL string. Called UException (utils-exception)+ - * to avoid conflicts with other classes. - */ -class UException: public exception { - public: - /// - UException( const string& _msg ): msg( _msg ) { }; - - /// - virtual const char* what() const { return msg.c_str(); }; - - private: - string msg; -}; - - -//@} -#endif diff --git a/eo/src/eo1d.h b/eo/src/eo1d.h index de33bf055..e9c4d66f0 100644 --- a/eo/src/eo1d.h +++ b/eo/src/eo1d.h @@ -34,14 +34,13 @@ using namespace std; /** @name eo1d class -* Randomly accesible evolvable object with one dimension, with -variable length. -* Use this if you want to evolve "linear" things, like bitstrings, or -floating-point arrays. If you don't, subclass directly from EO -* @see EO -* @author GeNeura -* @version 0.2 -*/ + * Randomly accesible evolvable object with one dimension, with variable + * length. Use this if you want to evolve "linear" things, like bitstrings, + * or floating-point arrays. If you don't, subclass directly from EO + * @see EO + * @author GeNeura + * @version 0.2 + */ //@{ diff --git a/eo/src/eo2dVector.h b/eo/src/eo2dVector.h index 13e007a9c..febbca362 100644 --- a/eo/src/eo2dVector.h +++ b/eo/src/eo2dVector.h @@ -1,333 +1,334 @@ -// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- -/* ------------------------------------------------------------------------------ -File............: eo2dVector.h -Author..........: Geneura Team (this file: Victor Rivas, vrivas@ujaen.es) -Date............: 29-Sep-1999, at Fac. of Sciences, Univ. of Granada (Spain) -Description.....: Implementation of a 2-dimensional chromosome usign STL - vectors. - - ================ Modif. 1 ================ - Author........: - Date..........: - Description...: - -QUEDA: Operador de asignación, lectura desde istream, escritura a ostream ------------------------------------------------------------------------------ -*/ -//----------------------------------------------------------------------------- -// eo2dVector.h -// (c) GeNeura Team, 1998 -/* - 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 _eo2dVector_H -#define _eo2dVector_H - -// STL libraries -#include // For vector -#include -#include -#include - -#include -#include - -/** Adaptor that turns an STL vector of vectror into an EO - with the same gene type as the type with which - the vector of vector has been instantiated. -*/ -template -class eo2dVector: public eo2d, public vector< vector > { -public: - typedef T Type ; - - /** @name Canonical part of the objects: several ctors, copy ctor, \ - * dtor and assignment operator. - */ - //@{ - - /** Ctor. - @param _rows Number of rows. - @param _cols Number of columns. - @param _val Common initial value - */ - eo2dVector( const unsigned _rows = 0, - const unsigned _cols = 0, - T _val = T() ) - : eo2d(), vector< vector >( _rows, vector( _cols, _val ) ){}; - - /** Ctor using a random number generator. - @param _rows Number of rows. - @param _cols Number of columns. - @param _rnd A random "T-type" generator, which returns a random value each time it´s called. - */ - eo2dVector( const unsigned _rows, - const unsigned _cols, - eoRnd& _rnd ); - - /** Ctor from a istream. The T class should accept reading from a istream. It doesn't read fitness, -which is supposed to be dynamic and dependent on environment. - @param _is the input stream; should have all values in a single line, separated by whitespace - */ - //eo2dVector( istream& _is); - - - /// copy ctor - eo2dVector( const eo2dVector & _eo ) - : eo2d( _eo ), vector< vector >( _eo ){ }; - - /// Assignment operator - /* - const eo2dVector& operator =( const eo2dVector & _eo ) { - if ( this != &_eo ){ - eo2d::operator=( _eo ); - vector< >::operator=( _eo ); - } - return *this; - } - */ - /// dtor - virtual ~eo2dVector() {}; - - //@} - /** Reads and returns a copy of the gene in position _r,_c.\ - This implies that T must have a copy ctor . - @param _r Index for rows. Must be an unsigned less than #numOfRows()# - @param _c Index for columns. Must be an unsigned less than #numOfCols()# - @return what's inside the gene, with the correct type - @exception out_of_range if _r >=numOfRows() - @exception out_of_range if _c >=numOfCols() - */ - virtual T getGene( const unsigned _r, - const unsigned _c ) const { - if ( _r >= numOfRows() ) { - ostrstream msg; - msg << "ERROR in eo2dVector::getGene: row out of range. " - << "It should be <" << numOfRows() << '\0' << endl; - throw out_of_range( msg.str() ); - } - if ( _c >= numOfCols() ) { - ostrstream msg; - msg << "ERROR in eo2dVector::getGene: column out of range. " - << "It should be <" << numOfCols() << '\0' << endl; - throw out_of_range( msg.str() ); - } - return (*this)[_r][_c]; - }; - /** Overwrites the gene placed in position _r,_c with a - * new value. This means that the assignment operator - * for T must be defined . - @param _r Index for rows. Must be an unsigned less than #numOfRows()# - @param _c Index for columns. Must be an unsigned less than #numOfCols()# - @return what's inside the gene, with the correct type - @exception out_of_range if _r >=numOfRows() - @exception out_of_range if _c >=numOfCols() - */ - virtual void setGene( const unsigned _r, - const unsigned _c, - const T& _value ) { - if ( _r >= numOfRows() ) { - ostrstream msg; - msg << "ERROR in eo2dVector::setGene: row out of range. " - << "It should be <" << numOfRows() << '\0' << endl; - throw out_of_range( msg.str() ); - } - if ( _c >= numOfCols() ) { - ostrstream msg; - msg << "ERROR in eo2dVector::setGene: column out of range. " - << "It should be <" << numOfCols() << '\0' << endl; - throw out_of_range( msg.str() ); - } - (*this)[_r][_c]=_value; - }; - - - - /** Inserts a row, moving the rest to the bottom. - * If _r = numOfRows(), it insert it at the end. - * Obviously, changes number of rows. - @param _r Position where the new row will be inserted. - @param _val Vector containing the new values to be inserted. - @exception invalid_argument If _val has not numOfCols() components. - @exception out_of_range If _r is greater than numOfRows() - */ - virtual void insertRow( const unsigned _r, - const vector& _val ) { - // Test errors. - if ( _r > numOfRows() ) { - ostrstream msg; - msg << "ERROR in eo2dVector::insertRow: row out of range. " - << "It should be <=" << numOfRows() << '\0' << endl; - throw out_of_range( msg.str() ); - } - if ( _val.size() != numOfCols() ) { - ostrstream msg; - msg << "ERROR in eo2dVector::insertRow: " - << "Incorrect number of values to be added. " - << "It should be ==" << numOfCols() << '\0' << endl; - throw invalid_argument( msg.str() ); - } - - // Insert the row. - vector< vector >::iterator ite = begin()+_r; - insert( ite, _val ); - }; - - /** Eliminates the row at position _r; all the other genes will - be shifted up. - @param _r Number of he row to be deleted. - @exception out_of_range if _r >=numOfRows() - */ - virtual void deleteRow( const unsigned _r ) { - // Test error. - if ( _r >= numOfRows() ) { - ostrstream msg; - msg << "ERROR in eo2dVector::deleteRow: " - << "Row out of range. " - << "It should be <" << numOfRows() << '\0' << endl; - throw out_of_range( msg.str() ); - } - // Delete row. - vector< vector >::iterator ite = this->begin()+_r; - this->erase( ite ); - }; - - /** Inserts a column, moving the rest to the right. - * If _c = numOfCols(), it insert it at the end. - * Obviously, changes number of cols. - @param _r Position where the new column will be inserted. - @param _val Vector containing the new values to be inserted. - @exception invalid_argument if _val has not numOfRows() components. - */ - virtual void insertCol( const unsigned _c, - const vector& _val ) { - // Test errors. - if ( _c > numOfCols() ) { - ostrstream msg; - msg << "ERROR in eo2dVector::insertCol: " - << "Column out of range. " - << "It should be >=" << numOfCols() << '\0' << endl; - throw out_of_range( msg.str() ); - } - if ( _val.size() != numOfRows() ) { - ostrstream msg; - msg << "ERROR in eo2dVector::insertCol: " - << "Incorrect number of values to be added. " - << "It should be ==" << numOfRows() << '\0' << endl; - throw invalid_argument( msg.str() ); - } - - // Insert column. - for( unsigned r=0; r >::iterator it1 = begin()+r; - vector::iterator it2 = (*it1).begin()+_c; - (*it1).insert( it2, _val[r] ); - }; - } - - /** Eliminates the column at position _c; all the other columns will - be shifted left. - @param _c Number of he column to be deleted. - @exception out_of_range if _c >=numOfCols() - */ - virtual void deleteCol( const unsigned _c ) { - // Test error. - if ( _c >= numOfCols() ) { - ostrstream msg; - msg << "ERROR in eo2dVector::deleteCol: " - << "Column out of range. " - << "It should be <" << numOfCols() << '\0' << endl; - throw out_of_range( msg.str() ); - } - // Delete columns. - for( unsigned r=0; r >::iterator it1 = begin()+r; - vector::iterator it2 = (*it1).begin()+_c; - (*it1).erase( it2 ); - } - }; - - /// Returns the number of rows in the eo2d - virtual unsigned numOfRows() const { - return size(); - }; - - /// Returns the number of columns in the eo2d - virtual unsigned numOfCols() const { - return begin()->size(); - }; - - - /** @name Methods from eoObject - readFrom and printOn are directly inherited from eo1d - */ - //@{ - /** Inherited from eoObject - @see eoObject - */ - string className() const {return "eo2dVector";}; - //@} - -}; - - -//____________________________ Some method implementation ____________________ - -// Ctors_______________________________________________________________________ -//_____________________________________________________________________________ -template -eo2dVector::eo2dVector( const unsigned _rows, - const unsigned _cols, - eoRnd& _rnd ) - : eo2d(), vector< vector >( _rows, vector( _cols, T() ) ){ - for ( vector< vector >::iterator i = begin(); i != end(); ++i ) { - for( vector::iterator j=(*i).begin(); j!= (*i).end(); ++j ) { - *j = _rnd(); - } - } -}; - -//_____________________________________________________________________________ -/*template -eoVector::eoVector( istream& _is) - : eo1d(), vector( ){ - while (_is ) { - T tmp; - _is >> tmp; - push_back( tmp ); - } - -}; -*/ - -//_____________________________________________________________________________ -template -ostream& operator<<( ostream& _os, const eo2dVector& _eo) { - for( unsigned i=0; i<_eo.numOfRows(); ++i ) { - for( unsigned j=0; j<_eo.numOfCols(); ++j ) { - _os << _eo.getGene( i,j ) << " "; - } - _os << endl; - } - return _os; -}; - -#endif +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- +/* +----------------------------------------------------------------------------- +File............: eo2dVector.h +Author..........: Geneura Team (this file: Victor Rivas, vrivas@ujaen.es) +Date............: 29-Sep-1999, at Fac. of Sciences, Univ. of Granada (Spain) +Description.....: Implementation of a 2-dimensional chromosome usign STL + vectors. + + ================ Modif. 1 ================ + Author........: + Date..........: + Description...: + +QUEDA: Operador de asignación, lectura desde istream, escritura a ostream +----------------------------------------------------------------------------- +*/ +//----------------------------------------------------------------------------- +// eo2dVector.h +// (c) GeNeura Team, 1998 +/* + 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 _eo2dVector_H +#define _eo2dVector_H + +// STL libraries +#include // For vector +#include +#include +#include + +#include +#include + +/** Adaptor that turns an STL vector of vectror into an EO + with the same gene type as the type with which + the vector of vector has been instantiated. +*/ +template +class eo2dVector: public eo2d, public vector< vector > { +public: + typedef T Type ; + + /** @name Canonical part of the objects: several ctors, copy ctor, \ + * dtor and assignment operator. + */ + //@{ + + /** Ctor. + @param _rows Number of rows. + @param _cols Number of columns. + @param _val Common initial value + */ + eo2dVector( const unsigned _rows = 0, + const unsigned _cols = 0, + T _val = T() ) + : eo2d(), vector< vector >( _rows, vector( _cols, _val ) ){}; + + /** Ctor using a random number generator. + @param _rows Number of rows. + @param _cols Number of columns. + @param _rnd A random "T-type" generator, which returns a random value each time it´s called. + */ + eo2dVector( const unsigned _rows, + const unsigned _cols, + eoRnd& _rnd ); + + /** Ctor from a istream. The T class should accept reading from a istream. It doesn't read fitness, + which is supposed to be dynamic and dependent on environment. + @param _is the input stream; should have all values in a single line, separated by whitespace + */ + //eo2dVector( istream& _is); + + + /// copy ctor + eo2dVector( const eo2dVector & _eo ) + : eo2d( _eo ), vector< vector >( _eo ){ }; + + /// Assignment operator + /* + const eo2dVector& operator =( const eo2dVector & _eo ) { + if ( this != &_eo ){ + eo2d::operator=( _eo ); + vector< >::operator=( _eo ); + } + return *this; + } + */ + /// dtor + virtual ~eo2dVector() {}; + + //@} + /** Reads and returns a copy of the gene in position _r,_c.\ + This implies that T must have a copy ctor . + @param _r Index for rows. Must be an unsigned less than #numOfRows()# + @param _c Index for columns. Must be an unsigned less than #numOfCols()# + @return what's inside the gene, with the correct type + @exception out_of_range if _r >=numOfRows() + @exception out_of_range if _c >=numOfCols() + */ + virtual T getGene( const unsigned _r, + const unsigned _c ) const { + if ( _r >= numOfRows() ) { + ostrstream msg; + msg << "ERROR in eo2dVector::getGene: row out of range. " + << "It should be <" << numOfRows() << '\0' << endl; + throw out_of_range( msg.str() ); + } + if ( _c >= numOfCols() ) { + ostrstream msg; + msg << "ERROR in eo2dVector::getGene: column out of range. " + << "It should be <" << numOfCols() << '\0' << endl; + throw out_of_range( msg.str() ); + } + return (*this)[_r][_c]; + }; + /** Overwrites the gene placed in position _r,_c with a + * new value. This means that the assignment operator + * for T must be defined . + @param _r Index for rows. Must be an unsigned less than #numOfRows()# + @param _c Index for columns. Must be an unsigned less than #numOfCols()# + @return what's inside the gene, with the correct type + @exception out_of_range if _r >=numOfRows() + @exception out_of_range if _c >=numOfCols() + */ + virtual void setGene( const unsigned _r, + const unsigned _c, + const T& _value ) { + if ( _r >= numOfRows() ) { + ostrstream msg; + msg << "ERROR in eo2dVector::setGene: row out of range. " + << "It should be <" << numOfRows() << '\0' << endl; + throw out_of_range( msg.str() ); + } + if ( _c >= numOfCols() ) { + ostrstream msg; + msg << "ERROR in eo2dVector::setGene: column out of range. " + << "It should be <" << numOfCols() << '\0' << endl; + throw out_of_range( msg.str() ); + } + (*this)[_r][_c]=_value; + }; + + + + /** Inserts a row, moving the rest to the bottom. + * If _r = numOfRows(), it insert it at the end. + * Obviously, changes number of rows. + @param _r Position where the new row will be inserted. + @param _val Vector containing the new values to be inserted. + @exception invalid_argument If _val has not numOfCols() components. + @exception out_of_range If _r is greater than numOfRows() + */ + virtual void insertRow( const unsigned _r, + const vector& _val ) { + // Test errors. + if ( _r > numOfRows() ) { + ostrstream msg; + msg << "ERROR in eo2dVector::insertRow: row out of range. " + << "It should be <=" << numOfRows() << '\0' << endl; + throw out_of_range( msg.str() ); + } + if ( _val.size() != numOfCols() ) { + ostrstream msg; + msg << "ERROR in eo2dVector::insertRow: " + << "Incorrect number of values to be added. " + << "It should be ==" << numOfCols() << '\0' << endl; + throw invalid_argument( msg.str() ); + } + + // Insert the row. + vector< vector >::iterator ite = begin()+_r; + insert( ite, _val ); + }; + + /** Eliminates the row at position _r; all the other genes will + be shifted up. + @param _r Number of he row to be deleted. + @exception out_of_range if _r >=numOfRows() + */ + virtual void deleteRow( const unsigned _r ) { + // Test error. + if ( _r >= numOfRows() ) { + ostrstream msg; + msg << "ERROR in eo2dVector::deleteRow: " + << "Row out of range. " + << "It should be <" << numOfRows() << '\0' << endl; + throw out_of_range( msg.str() ); + } + // Delete row. + vector< vector >::iterator ite = this->begin()+_r; + this->erase( ite ); + }; + + /** Inserts a column, moving the rest to the right. + * If _c = numOfCols(), it insert it at the end. + * Obviously, changes number of cols. + @param _r Position where the new column will be inserted. + @param _val Vector containing the new values to be inserted. + @exception invalid_argument if _val has not numOfRows() components. + */ + virtual void insertCol( const unsigned _c, + const vector& _val ) { + // Test errors. + if ( _c > numOfCols() ) { + ostrstream msg; + msg << "ERROR in eo2dVector::insertCol: " + << "Column out of range. " + << "It should be >=" << numOfCols() << '\0' << endl; + throw out_of_range( msg.str() ); + } + if ( _val.size() != numOfRows() ) { + ostrstream msg; + msg << "ERROR in eo2dVector::insertCol: " + << "Incorrect number of values to be added. " + << "It should be ==" << numOfRows() << '\0' << endl; + throw invalid_argument( msg.str() ); + } + + // Insert column. + for( unsigned r=0; r >::iterator it1 = begin()+r; + vector::iterator it2 = (*it1).begin()+_c; + (*it1).insert( it2, _val[r] ); + }; + } + + /** Eliminates the column at position _c; all the other columns will + be shifted left. + @param _c Number of he column to be deleted. + @exception out_of_range if _c >=numOfCols() + */ + virtual void deleteCol( const unsigned _c ) { + // Test error. + if ( _c >= numOfCols() ) { + ostrstream msg; + msg << "ERROR in eo2dVector::deleteCol: " + << "Column out of range. " + << "It should be <" << numOfCols() << '\0' << endl; + throw out_of_range( msg.str() ); + } + // Delete columns. + for( unsigned r=0; r >::iterator it1 = begin()+r; + vector::iterator it2 = (*it1).begin()+_c; + (*it1).erase( it2 ); + } + }; + + /// Returns the number of rows in the eo2d + virtual unsigned numOfRows() const { + return size(); + }; + + /// Returns the number of columns in the eo2d + virtual unsigned numOfCols() const { + return begin()->size(); + }; + + + /** @name Methods from eoObject + readFrom and printOn are directly inherited from eo1d + */ + //@{ + /** Inherited from eoObject + @see eoObject + */ + string className() const {return "eo2dVector";}; + //@} + +}; + + +//____________________________ Some method implementation ____________________ + +// Ctors_______________________________________________________________________ +//_____________________________________________________________________________ +template +eo2dVector::eo2dVector( const unsigned _rows, + const unsigned _cols, + eoRnd& _rnd ) + : eo2d(), vector< vector >( _rows, vector( _cols, T() ) ){ + for ( vector< vector >::iterator i = begin(); i != end(); ++i ) { + for( vector::iterator j=(*i).begin(); j!= (*i).end(); ++j ) { + *j = _rnd(); + } + } +}; + +//_____________________________________________________________________________ +/*template +eoVector::eoVector( istream& _is) + : eo1d(), vector( ){ + while (_is ) { + T tmp; + _is >> tmp; + push_back( tmp ); + } + +}; +*/ + +//_____________________________________________________________________________ +template +ostream& operator<<( ostream& _os, const eo2dVector& _eo) { + for( unsigned i=0; i<_eo.numOfRows(); ++i ) { + for( unsigned j=0; j<_eo.numOfCols(); ++j ) { + _os << _eo.getGene( i,j ) << " "; + } + _os << endl; + } + return _os; +}; + +#endif + diff --git a/eo/src/eoBin.h b/eo/src/eoBin.h index 0fb9a82ba..1d7ec4193 100644 --- a/eo/src/eoBin.h +++ b/eo/src/eoBin.h @@ -1,6 +1,23 @@ -//----------------------------------------------------------------------------- -// eoBin.h -//----------------------------------------------------------------------------- +/* + eoBin.h + (c) GeNeura Team 1998 + + 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 eoBin_h #define eoBin_h diff --git a/eo/src/eoParser.h b/eo/src/eoParser.h index d35016358..897fb4ca3 100644 --- a/eo/src/eoParser.h +++ b/eo/src/eoParser.h @@ -40,28 +40,8 @@ #include #include -//----------------------------------------------------------------------------- -// Class UExceptions - probably useless ??? -//----------------------------------------------------------------------------- -/** - * This class manages exceptions. It´s barely an extension of the standard except - ion, - * but it can be initialized with an STL string. Called UException (utils-except - ion)+ - * to avoid conflicts with other classes. - */ -class UException: public exception { -public: - /// - UException( const string& _msg ): msg( _msg ) { }; - - /// - virtual const char* what() const { return msg.c_str(); }; - -private: - string msg; -}; - +// include for exceptions +include // logic_error //----------------------------------------------------------------------------- // Class Param @@ -747,20 +727,20 @@ public: /** * This class managges unknown argument exceptions. */ - class UnknownArg : public UException { + class UnknownArg : public logic_error { public: /** * Constructor * @param _arg string to be shown when the exception occurs */ - UnknownArg( const string& _arg): UException( "Invalid argument: "+_arg ) { }; + UnknownArg( const string& _arg): logic_error( "Invalid argument: "+_arg ) { }; }; /** * This class managges bad param types. */ - class BadType : public UException { + class BadType : public logic_error { public: /** @@ -769,39 +749,39 @@ public: * @param _value The value of the param */ BadType(const string& _param, const string& _value, const string& _correctType) - : UException("The value '" + _value + "' assigned to the argument " + _param + " isn't a correct "+_correctType) { }; + : logic_error("The value '" + _value + "' assigned to the argument " + _param + " isn't a correct "+_correctType) { }; }; /** * This class managges exceptions produced when there isn't a value for a parameter. */ - class MissingVal : public UException { + class MissingVal : public logic_error { public: /** * Constructor * @param _param The param */ - MissingVal(const string& _param) : UException("Missing value for parameter " + _param) {}; + MissingVal(const string& _param) : logic_error("Missing value for parameter " + _param) {}; }; /** * This class managges exceptions produced when the user forgot a required parameter. */ - class MissingReqParam : public UException { + class MissingReqParam : public logic_error { public: /** * Constructor * @param _shortName The param's short name */ - MissingReqParam(const string& _shortName) : UException("Missing required parameter " + _shortName) {}; + MissingReqParam(const string& _shortName) : logic_error("Missing required parameter " + _shortName) {}; }; /** * This class managges exceptions du to < without a > in array value */ - class BadArrayParam : public UException { + class BadArrayParam : public logic_error { public: /** @@ -810,7 +790,7 @@ public: * @param _first_word The first word read after the "<" */ BadArrayParam(const string& _param, const string &_first_word) : - UException("Array parameter " + _param + ": No matching > (" + _first_word + logic_error("Array parameter " + _param + ": No matching > (" + _first_word + "... )") {}; };