diff --git a/moeo/src/core/moeoScalarObjectiveVector.h b/moeo/src/core/moeoScalarObjectiveVector.h new file mode 100644 index 000000000..0f33812c3 --- /dev/null +++ b/moeo/src/core/moeoScalarObjectiveVector.h @@ -0,0 +1,179 @@ +/* + +(c) 2010 Thales group + + 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; version 2 + of the License. + + 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: http://eodev.sourceforge.net + +Authors: + Johann Dréo + +*/ + + +#ifndef MOEOSCALAROBJECTIVEVECTOR_H_ +#define MOEOSCALAROBJECTIVEVECTOR_H_ + +#include +#include +#include +#include +#include + +/** + * This class allows to represent a solution in the objective space (phenotypic representation) by a std::vector of typed values, + * i.e. that an objective value is represented using a T, and this for any objective. + */ +template < class ObjectiveVectorTraits, class T > +class moeoScalarObjectiveVector : public moeoObjectiveVector < ObjectiveVectorTraits, T > +{ + public: + + using moeoObjectiveVector < ObjectiveVectorTraits, T >::size; + using moeoObjectiveVector < ObjectiveVectorTraits, T >::operator[]; + + /** + * Ctor + */ + moeoScalarObjectiveVector(T _value = 0.0) : moeoObjectiveVector < ObjectiveVectorTraits, T > (_value) + {} + + + /** + * Ctor from a vector of Ts + * @param _v the std::vector < T > + */ + moeoScalarObjectiveVector(std::vector < T > & _v) : moeoObjectiveVector < ObjectiveVectorTraits, T > (_v) + {} + + + /** + * Returns true if the current objective vector dominates _other according to the Pareto dominance relation + * (but it's better to use a moeoObjectiveVectorComparator object to compare solutions) + * @param _other the other moeoScalarObjectiveVector object to compare with + */ + bool dominates(const moeoScalarObjectiveVector < ObjectiveVectorTraits, T > & _other) const + { + moeoParetoObjectiveVectorComparator < moeoScalarObjectiveVector > comparator; + return comparator(_other, *this); + } + + + /** + * Returns true if the current objective vector is equal to _other (according to a tolerance value) + * @param _other the other moeoScalarObjectiveVector object to compare with + */ + bool operator==(const moeoScalarObjectiveVector < ObjectiveVectorTraits, T > & _other) const + { + for (unsigned int i=0; i < size(); i++) + { + if ( fabs(operator[](i) - _other[i]) > ObjectiveVectorTraits::tolerance() ) + { + return false; + } + } + return true; + } + + + /** + * Returns true if the current objective vector is different than _other (according to a tolerance value) + * @param _other the other moeoScalarObjectiveVector object to compare with + */ + bool operator!=(const moeoScalarObjectiveVector < ObjectiveVectorTraits, T > & _other) const + { + return ! operator==(_other); + } + + + /** + * Returns true if the current objective vector is smaller than _other on the first objective, then on the second, and so on + * (can be usefull for sorting/printing) + * @param _other the other moeoScalarObjectiveVector object to compare with + */ + bool operator<(const moeoScalarObjectiveVector < ObjectiveVectorTraits, T > & _other) const + { + moeoObjectiveObjectiveVectorComparator < moeoScalarObjectiveVector < ObjectiveVectorTraits, T > > cmp; + return cmp(*this, _other); + } + + + /** + * Returns true if the current objective vector is greater than _other on the first objective, then on the second, and so on + * (can be usefull for sorting/printing) + * @param _other the other moeoScalarObjectiveVector object to compare with + */ + bool operator>(const moeoScalarObjectiveVector < ObjectiveVectorTraits, T > & _other) const + { + return _other < *this; + } + + + /** + * Returns true if the current objective vector is smaller than or equal to _other on the first objective, then on the second, and so on + * (can be usefull for sorting/printing) + * @param _other the other moeoScalarObjectiveVector object to compare with + */ + bool operator<=(const moeoScalarObjectiveVector < ObjectiveVectorTraits, T > & _other) const + { + return operator==(_other) || operator<(_other); + } + + + /** + * Returns true if the current objective vector is greater than or equal to _other on the first objective, then on the second, and so on + * (can be usefull for sorting/printing) + * @param _other the other moeoScalarObjectiveVector object to compare with + */ + bool operator>=(const moeoScalarObjectiveVector < ObjectiveVectorTraits, T > & _other) const + { + return operator==(_other) || operator>(_other); + } + +}; + + +/** + * Output for a moeoScalarObjectiveVector object + * @param _os output stream + * @param _objectiveVector the objective vector to write + */ +template < class ObjectiveVectorTraits > +std::ostream & operator<<(std::ostream & _os, const moeoScalarObjectiveVector < ObjectiveVectorTraits > & _objectiveVector) +{ + for (unsigned int i=0; i<_objectiveVector.size()-1; i++) + _os << _objectiveVector[i] << " "; + _os << _objectiveVector[_objectiveVector.size()-1]; + return _os; +} + +/** + * Input for a moeoScalarObjectiveVector object + * @param _is input stream + * @param _objectiveVector the objective vector to read + */ +template < class ObjectiveVectorTraits > +std::istream & operator>>(std::istream & _is, moeoScalarObjectiveVector < ObjectiveVectorTraits > & _objectiveVector) +{ + _objectiveVector = moeoScalarObjectiveVector < ObjectiveVectorTraits > (); + for (unsigned int i=0; i<_objectiveVector.size(); i++) + { + _is >> _objectiveVector[i]; + } + return _is; +} + +#endif /*MOEOSCALAROBJECTIVEVECTOR_H_*/