All Downloads are FREE. Search and download functionalities are using the official Maven repository.

gov.sandia.cognition.algorithm.AbstractIterativeAlgorithm Maven / Gradle / Ivy

There is a newer version: 4.0.1
Show newest version
/*
 * File:                AbstractIterativeAlgorithm.java
 * Authors:             Justin Basilico
 * Company:             Sandia National Laboratories
 * Project:             Cognitive Foundry
 *
 * Copyright August 30, 2006, Sandia Corporation.  Under the terms of Contract
 * DE-AC04-94AL85000, there is a non-exclusive license for use of this work by
 * or on behalf of the U.S. Government. Export of this program may require a
 * license from the United States Government. See CopyrightHistory.txt for
 * complete details.
 *
 */

package gov.sandia.cognition.algorithm;

import gov.sandia.cognition.annotation.CodeReview;
import gov.sandia.cognition.annotation.CodeReviews;
import gov.sandia.cognition.util.AbstractCloneableSerializable;
import java.util.LinkedList;

/**
 * The {@code AbstractIterativeAlgorithm} class implements a simple part of
 * the {@code IterativeAlgorithm} interface that manages the listeners for the 
 * algorithm. It contains methods for firing off the various learning events.
 *
 * @author  Justin Basilico
 * @since   2.0
 * @see     IterativeAlgorithm
 */
@CodeReviews(reviews =
{
    @CodeReview(reviewer = "Kevin R. Dixon",
        date = "2008-02-08",
        changesNeeded = false,
        comments = "Class looks fine."),
    @CodeReview(reviewer = "Justin Basilico",
        date = "2006-10-02",
        changesNeeded = false,
        comments = "Interface is fine.")
})
public abstract class AbstractIterativeAlgorithm
    extends AbstractCloneableSerializable
    implements IterativeAlgorithm
{
    // NOTE: The listeners are accessed directly in the callback firing methods
    // in order to reduce the overhead of firing the callback.
    /** The default iteration number is zero. */
    public static final int DEFAULT_ITERATION = 0;

    /** The objects listening to this algorithm. */
    private transient LinkedList listeners;

    /** Number of iterations the algorithm has executed. */
    protected int iteration;

    /**
     * Creates a new instance of {@code AbstractIterativeAlgorithm}.
     */
    public AbstractIterativeAlgorithm()
    {
        this(DEFAULT_ITERATION);
    }

    /**
     * Creates a new instance of {@code AbstractIterativeAlgorithm}.
     *
     * @param   iteration The initial iteration number.
     */
    public AbstractIterativeAlgorithm(
        final int iteration)
    {
        super();

        this.setIteration(iteration);
        this.setListeners(null);
    }

    @Override
    public AbstractIterativeAlgorithm clone()
    {
        final AbstractIterativeAlgorithm result = (AbstractIterativeAlgorithm)
            super.clone();
        result.iteration = 0;
        result.listeners = null;
        return result;
    }

    /**
     * Fires off a algorithm started event for this algorithm, which notifies
     * all of the listeners that the algorithm has started.
     */
    protected void fireAlgorithmStarted()
    {
        if (this.listeners != null)
        {
            for (IterativeAlgorithmListener listener : this.listeners)
            {
                listener.algorithmStarted(this);
            }
        }
        // else - No listeners.
    }

    /**
     * Fires off a algorithm ended event for the algorithm, which notifies all
     * the listeners that the algorithm has ended.
     */
    protected void fireAlgorithmEnded()
    {
        if (this.listeners != null)
        {
            for (IterativeAlgorithmListener listener : this.listeners)
            {
                listener.algorithmEnded(this);
            }
        }
        // else - No listeners.
    }

    /**
     * Fires off a algorithm started event for the algorithm, which notifies
     * all the listeners that a step has started.
     */
    protected void fireStepStarted()
    {
        if (this.listeners != null)
        {
            for (IterativeAlgorithmListener listener : this.listeners)
            {
                listener.stepStarted(this);
            }
        }
        // else - No listeners.
    }

    /**
     * Fires off a algorithm ended event for the algorithm, which notifies all
     * the listeners that a step has ended.
     */
    protected void fireStepEnded()
    {
        if (this.listeners != null)
        {
            for (IterativeAlgorithmListener listener : this.listeners)
            {
                listener.stepEnded(this);
            }
        }
        // else - No listeners.
    }

    public void addIterativeAlgorithmListener(
        final IterativeAlgorithmListener listener)
    {
        if (this.getListeners() == null)
        {
            // No list exists yet so create one.
            this.setListeners(new LinkedList());
        }

        // Add the listener.
        this.getListeners().add(listener);
    }

    public void removeIterativeAlgorithmListener(
        final IterativeAlgorithmListener listener)
    {
        if (this.getListeners() == null)
        {
            // No list to remove from.
            return;
        }

        // Remove the listener from the list.
        this.getListeners().remove(listener);

        if (this.getListeners().isEmpty())
        {
            // No more listeners so null out the pointer to make the event
            // firing run faster.
            this.setListeners(null);
        }
    }

    /**
     * Retrieves the list of listeners for this algorithm.
     *
     * @return  The list of current listeners.
     */
    protected LinkedList getListeners()
    {
        return this.listeners;
    }

    /**
     * Sets the list of listeners for this algorithm.
     *
     * @param   listeners The new list of listeners.
     */
    protected void setListeners(
        final LinkedList listeners)
    {
        this.listeners = listeners;
    }

    public int getIteration()
    {
        return this.iteration;
    }

    /**
     * Sets the current iteration number.
     *
     * @param   iteration Number of iterations executed in the algorithm.
     */
    protected void setIteration(
        final int iteration)
    {
        this.iteration = iteration;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy