From 7c107635b07e8ed33b221f79fe951e8a8f73deae Mon Sep 17 00:00:00 2001 From: victor Date: Fri, 1 Oct 1999 16:33:59 +0000 Subject: [PATCH] All the methods have been implemented. Only three of them (asignement operator, read from and write to a stream) remain unfinished. --- eo/src/eo2dVector.h | 333 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 333 insertions(+) create mode 100644 eo/src/eo2dVector.h diff --git a/eo/src/eo2dVector.h b/eo/src/eo2dVector.h new file mode 100644 index 00000000..edc82f3a --- /dev/null +++ b/eo/src/eo2dVector.h @@ -0,0 +1,333 @@ +// -*- 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