    001package org.cpsolver.ifs.solver;
    002
    003import org.cpsolver.ifs.assignment.Assignment;
    004import org.cpsolver.ifs.model.Neighbour;
    005import org.cpsolver.ifs.model.Value;
    006import org.cpsolver.ifs.model.Variable;
    007
    008/**
    009 * IFS Solver Listener.
    010 *
    011 * @see Solver
    012 *
    013 * @version IFS 1.3 (Iterative Forward Search)<br>
    014 *          Copyright (C) 2006 - 2014 Tomáš Müller<br>
    015 *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
    016 *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
    017 * <br>
    018 *          This library is free software; you can redistribute it and/or modify
    019 *          it under the terms of the GNU Lesser General Public License as
    020 *          published by the Free Software Foundation; either version 3 of the
    021 *          License, or (at your option) any later version. <br>
    022 * <br>
    023 *          This library is distributed in the hope that it will be useful, but
    024 *          WITHOUT ANY WARRANTY; without even the implied warranty of
    025 *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    026 *          Lesser General Public License for more details. <br>
    027 * <br>
    028 *          You should have received a copy of the GNU Lesser General Public
    029 *          License along with this library; if not see <a href='http://www.gnu.org/licenses'>http://www.gnu.org/licenses</a>.
    030 *
    031 * @param <V> Variable
    032 * @param <T> Value
    033 **/
    034public interface SolverListener<V extends Variable<V, T>, T extends Value<V, T>> {
    035
    036    /**
    037     * A variable was selected
    038     *
    039     * @param assignment current assignment
    040     * @param iteration
    041     *            current iteration
    042     * @param variable
    043     *            selected variable
    044     * @return if false is returned the variable will be discarded (search continues with the next variable selection)
    045     */
    046    public boolean variableSelected(Assignment<V, T> assignment, long iteration, V variable);
    047
    048    /**
    049     * A value was selected
    050     *
    051     * @param assignment current assignment
    052     * @param iteration
    053     *            current iteration
    054     * @param variable
    055     *            selected variable
    056     * @param value
    057     *            selected variable
    058     * @return if false is returned the selected value is not assigned
    059     */
    060    public boolean valueSelected(Assignment<V, T> assignment, long iteration, V variable, T value);
    061
    062    /**
    063     * A neighbour was selected
    064     *
    065     * @param assignment current assignment
    066     * @param iteration
    067     *            current iteration
    068     * @param neighbour
    069     *            neighbour
    070     * @return if false is returned the selected neighbour is not assigned
    071     */
    072    public boolean neighbourSelected(Assignment<V, T> assignment, long iteration, Neighbour<V, T> neighbour);
    073
    074    /**
    075     * Called when {@link ParallelSolver} failed to assign the given neighbour
    076     *
    077     * @param assignment current assignment
    078     * @param iteration
    079     *            current iteration
    080     * @param neighbour
    081     *            neighbour
    082     */
    083    public void neighbourFailed(Assignment<V, T> assignment, long iteration, Neighbour<V, T> neighbour);
    084
    085}