// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- //----------------------------------------------------------------------------- // eoRealVectorBounds.h // (c) Marc Schoenauer 2001, Maarten Keijzer 2000, 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 Marc.Schoenauer@polytechnique.fr mak@dhi.dk */ //----------------------------------------------------------------------------- #ifndef _eoRealVectorBounds_h #define _eoRealVectorBounds_h #include // std::exceptions! #include #include /** \defgroup EvolutionStrategies */ /** Vector type for bounds (see eoRealBounds.h for scalar types) ------------ Class eoRealVectorBounds implements the std::vectorized version: it is basically a std::vector of eoRealBounds * and forwards all request to the elements of the std::vector. This file also contains the global variables and eoDummyVectorNoBounds that are used as defaults in ctors (i.e. when no bounds are given, it is assumed unbounded values) THe 2 main classes defined here are eoRealBaseVectorBounds, base class that handles all useful functions eoRealVectorBounds which derives from the preceding *and* eoPersistent and also has a mechanism for memory handling of the pointers it has to allocate */ class eoRealBaseVectorBounds : public std::vector { public: // virtual desctructor (to avoid warning?) virtual ~eoRealBaseVectorBounds(){} /** Default Ctor. */ eoRealBaseVectorBounds() : std::vector(0) {} /** Ctor: same bounds for everybody, given as an eoRealBounds */ eoRealBaseVectorBounds(unsigned _dim, eoRealBounds & _bounds) : std::vector(_dim, &_bounds) {} /** Ctor, particular case of dim-2 */ eoRealBaseVectorBounds(eoRealBounds & _xbounds, eoRealBounds & _ybounds) : std::vector(0) { push_back( &_xbounds); push_back( &_ybounds); } /** test: is i_th component bounded */ virtual bool isBounded(unsigned _i) { return (*this)[_i]->isBounded(); } /** test: bounded iff all are bounded */ virtual bool isBounded(void) { for (unsigned i=0; iisBounded()) return false; return true; } /** Self-test: true iff i_th component has no bounds at all */ virtual bool hasNoBoundAtAll(unsigned _i) { return (*this)[_i]->hasNoBoundAtAll(); } /** Self-test: true iff all components have no bound at all */ virtual bool hasNoBoundAtAll(void) { for (unsigned i=0; ihasNoBoundAtAll()) return false; return true; } virtual bool isMinBounded(unsigned _i) { return (*this)[_i]->isMinBounded();} ; virtual bool isMaxBounded(unsigned _i) { return (*this)[_i]->isMaxBounded();} ; /** Folds a real value back into the bounds - i_th component */ virtual void foldsInBounds(unsigned _i, double & _r) { (*this)[_i]->foldsInBounds(_r); } /** Folds all variables of a std::vector of real values into the bounds */ virtual void foldsInBounds(std::vector & _v) { for (unsigned i=0; ifoldsInBounds(_v[i]); } } /** Truncates a real value to the bounds - i_th component */ virtual void truncate(unsigned _i, double & _r) { (*this)[_i]->truncate(_r); } /** truncates all variables of a std::vector of real values to the bounds */ virtual void truncate(std::vector & _v) { for (unsigned i=0; itruncate(_v[i]); } } /** test: is i_th component within the bounds? */ virtual bool isInBounds(unsigned _i, double _r) { return (*this)[_i]->isInBounds(_r); } /** test: are ALL components within the bounds? */ virtual bool isInBounds(std::vector _v) { for (unsigned i=0; iminimum();} virtual double maximum(unsigned _i) {return (*this)[_i]->maximum();} virtual double range(unsigned _i) {return (*this)[_i]->range();} /** Computes the average range * An std::exception will be raised if one of the component is unbounded */ virtual double averageRange() { double r=0.0; for (unsigned i=0; iuniform(); return r; } /** fills a std::vector with uniformly chosen variables in bounds * An std::exception will be raised if one of the component is unbounded */ void uniform(std::vector & _v, eoRng & _rng = eo::rng) { _v.resize(size()); for (unsigned i=0; iprintOn(_os); _os << ";"; } } }; //////////////////////////////////////////////////////////////////// /** Now a derived class, for parser reading * It holds some of the bounds (and destroy them when dying) */ class eoRealVectorBounds : public eoRealBaseVectorBounds, public eoPersistent { public: /** Default Ctor will call base class default ctor */ eoRealVectorBounds():eoRealBaseVectorBounds() {} /** Ctor: same bounds for everybody, given as an eoRealBounds */ eoRealVectorBounds(unsigned _dim, eoRealBounds & _bounds) : eoRealBaseVectorBounds(_dim, _bounds), factor(1,_dim), ownedBounds(0) {} /** Ctor, particular case of dim-2 */ eoRealVectorBounds(eoRealBounds & _xbounds, eoRealBounds & _ybounds) : eoRealBaseVectorBounds(_xbounds, _ybounds), factor(2,1), ownedBounds(0) {} /** Simple bounds = minimum and maximum (allowed) */ eoRealVectorBounds(unsigned _dim, double _min, double _max) : eoRealBaseVectorBounds(), factor(1, _dim), ownedBounds(0) { if (_max-_min<=0) throw std::logic_error("Void range in eoRealVectorBounds"); eoRealBounds *ptBounds = new eoRealInterval(_min, _max); // handle memory once ownedBounds.push_back(ptBounds); // same bound for everyone for (unsigned int i=0; i<_dim; i++) push_back(ptBounds); } /** Ctor: different bounds for different variables, std::vectors of double */ eoRealVectorBounds(std::vector _min, std::vector _max) : factor(_min.size(), 1), ownedBounds(0) { if (_max.size() != _min.size()) throw std::logic_error("Dimensions don't match in eoRealVectorBounds"); // the bounds eoRealBounds *ptBounds; for (unsigned i=0; i<_min.size(); i++) { ptBounds = new eoRealInterval(_min[i], _max[i]); ownedBounds.push_back(ptBounds); push_back(ptBounds); } } /** Ctor from a std::string * and don't worry, the readFrom(std::string) starts by setting everything to 0! */ eoRealVectorBounds(std::string _s) : eoRealBaseVectorBounds() { readFrom(_s); } /** Dtor: destroy all ownedBounds - BUG ???*/ virtual ~eoRealVectorBounds() { // std::cout << "Dtor, avec size = " << ownedBounds.size() << std::endl; // for (unsigned i = 0; i < ownedBounds.size(); ++i) // { // delete ownedBounds[i]; // } } // methods from eoPersistent /** * Read object from a stream * only calls the readFrom(std::string) - for param reading * @param _is A std::istream. */ virtual void readFrom(std::istream& _is) ; /** * Read object from a std::string * @param _is A std::istream. */ virtual void readFrom(std::string _s) ; /** overload printOn method to save space */ virtual void printOn(std::ostream& _os) const { if (factor[0]>1) _os << factor[0] ; operator[](0)->printOn(_os); // other bounds unsigned int index=factor[0]; if (factor.size()>1) for (unsigned i=1; i 1) _os << factor[i]; operator[](index)->printOn(_os); index += factor[i]; } } /** Eventually increases the size by duplicating last bound */ void adjust_size(unsigned _dim); /** need to rewrite copy ctor and assignement operator * because of ownedBounds */ eoRealVectorBounds(const eoRealVectorBounds &); private:// WARNING: there is no reason for both std::vector below //to be synchronized in any manner std::vector factor; // std::list of nb of "grouped" bounds std::vector ownedBounds; // keep this one private eoRealVectorBounds& operator=(const eoRealVectorBounds&); }; ////////////////////////////////////////////////////////////// /** the dummy unbounded eoRealVectorBounds: usefull if you don't need bounds! * everything is inlined. * Warning: we do need this class, and not only a std::vector */ class eoRealVectorNoBounds: public eoRealVectorBounds { public: // virtual desctructor (to avoid warning?) virtual ~eoRealVectorNoBounds(){} /** * Ctor: nothing to do, but beware of dimension: call base class ctor */ eoRealVectorNoBounds(unsigned _dim) : eoRealVectorBounds( (_dim?_dim:1), eoDummyRealNoBounds) {} virtual bool isBounded(unsigned) {return false;} virtual bool isBounded(void) {return false;} virtual bool hasNoBoundAtAll(unsigned) {return true;} virtual bool hasNoBoundAtAll(void) {return true;} virtual bool isMinBounded(unsigned) {return false;} virtual bool isMaxBounded(unsigned) {return false;} virtual void foldsInBounds(unsigned, double &) {return;} virtual void foldsInBounds(std::vector &) {return;} virtual void truncate(unsigned, double &) {return;} virtual void truncate(std::vector &) {return;} virtual bool isInBounds(unsigned, double) {return true;} virtual bool isInBounds(std::vector) {return true;} // accessors virtual double minimum(unsigned) { throw std::logic_error("Trying to get minimum of eoRealVectorNoBounds"); } virtual double maximum(unsigned) { throw std::logic_error("Trying to get maximum of eoRealVectorNoBounds"); } virtual double range(unsigned) { throw std::logic_error("Trying to get range of eoRealVectorNoBounds"); } virtual double averageRange() { throw std::logic_error("Trying to get average range of eoRealVectorNoBounds"); } // random generators virtual double uniform(unsigned, eoRng & _rng = eo::rng) { throw std::logic_error("No uniform distribution on eoRealVectorNoBounds"); } // fills a std::vector with uniformly chosen variables in bounds void uniform(std::vector &, eoRng & _rng = eo::rng) { throw std::logic_error("No uniform distribution on eoRealVectorNoBounds"); } }; // one object for all - see eoRealBounds.cpp extern eoRealVectorNoBounds eoDummyVectorNoBounds; #endif