// PointComparator.java
//
// Authors:
// Antonio J. Nebro <antonio@lcc.uma.es>
// Juan J. Durillo <durillo@lcc.uma.es>
//
// Copyright (c) 2013 Antonio J. Nebro, Juan J. Durillo
//
// This program 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 3 of the License, or
// (at your option) any later version.
//
// This program 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 program. If not, see <http://www.gnu.org/licenses/>.
//
// CREDIT
// This class is based on the code of the WFG group (http://www.wfg.csse.uwa.edu.au/hypervolume/)
// Copyright (C) 2010 Lyndon While, Lucas Bradstreet.
package jmetal.qualityIndicator.fastHypervolume.wfg;
import java.util.Comparator;
/**
* Created with IntelliJ IDEA.
* User: Antonio J. Nebro
* Date: 26/07/13
* Time: 11:09
* To change this template use File | Settings | File Templates.
*/
public class PointComparator implements Comparator {
boolean maximizing_ ;
public PointComparator(boolean maximizing) {
maximizing_ = maximizing ;
}
/**
* Compares two POINT objects according to the last objectives
* @param o1 An object that reference a Point
* @param o2 An object that reference a Point
* @return -1 if o1 < o1, 1 if o1 > o2 or 0 in other case.
*/
public int compare(Object o1, Object o2) {
//Cast to double [] o1 and o2.
Point pointOne = (Point)o1;
Point pointTwo = (Point)o2;
for (int i = pointOne.getNumberOfObjectives() - 1 ; i >= 0 ; i--) {
if (isBetter(pointOne.objectives_[i], pointTwo.objectives_[i]))
return -1 ;
else if (isBetter(pointTwo.objectives_[i], pointOne.objectives_[i]))
return 1 ;
}
return 0 ;
} // compare
private boolean isBetter(double v1, double v2) {
if (maximizing_)
return (v1 > v2) ;
else
return (v2 > v1) ;
}
}