/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.commons.math.genetics;

/**
 * Individual in a population. Chromosomes are compared based on their fitness.
 *
 * The chromosomes are IMMUTABLE, and so their fitness is also immutable and
 * therefore it can be cached.
 *
 * @since 2.0
 * @version $Revision: 811685 $ $Date: 2009-09-05 19:36:48 +0200 (sam. 05 sept. 2009) $
 */
public abstract class Chromosome implements Comparable<Chromosome>,Fitness {

    /**
     * Cached value of the fitness of this chromosome.
     */
    private double fitness = Double.MIN_VALUE;

    /**
     * Access the fitness of this chromosome. The bigger the fitness, the better
     * the chromosome.
     *
     * Computation of fitness is usually very time-consuming task, therefore the
     * fitness is cached.
     *
     * @return the fitness.
     */
    public double getFitness() {
        if (this.fitness == Double.MIN_VALUE) {
            // no cache - compute the fitness
            this.fitness = fitness();
        }
        return this.fitness;
    }

    /**
     * Compares two chromosomes based on their fitness. The bigger the fitness,
     * the better the chromosome.
     *
     * @param another another chromosome to compare
     * @return
     * <ul>
     *     <li>-1 if <code>another</code> is better than <code>this</code></li>
     *     <li>1 if <code>another</code> is worse than <code>this</code></li>
     *     <li>0 if the two chromosomes have the same fitness</li>
     * </ul>
     */
    public int compareTo(Chromosome another) {
        return ((Double)this.getFitness()).compareTo(another.getFitness());
    }

    /**
     * Returns <code>true<code> iff <code>another</code> has the same
     * representation and therefore the same fitness. By default, it returns
     * false -- override it in your implementation if you need it.
     * @param another chromosome to compare
     * @return true if <code>another</code> is equivalent to this chromosome
     */
    protected boolean isSame(Chromosome another) {
        return false;
    }

    /**
     * Searches the <code>population</code> for another chromosome with the same
     * representation. If such chromosome is found, it is returned, if no such
     * chromosome exists, returns <code>null</code>.
     *
     * @param population
     *            Population to search
     * @return Chromosome with the same representation, or <code>null</code> if
     *         no such chromosome exists.
     */
    protected Chromosome findSameChromosome(Population population) {
        for (Chromosome anotherChr : population) {
            if (this.isSame(anotherChr))
                return anotherChr;
        }
        return null;
    }

    /**
     * Searches the population for a chromosome representing the same solution,
     * and if it finds one, updates the fitness to its value.
     *
     * @param population
     *            Population to search
     */
    public void searchForFitnessUpdate(Population population) {
        Chromosome sameChromosome = findSameChromosome(population);
        if (sameChromosome != null) {
            fitness = sameChromosome.getFitness();
        }
    }

}
