001package org.cpsolver.ifs.solution;
002
003import java.util.Collection;
004import java.util.Map;
005
006import org.cpsolver.ifs.model.Value;
007import org.cpsolver.ifs.model.Variable;
008
009
010/**
011 * IFS solution listener.
012 * 
013 * @see Solution
014 * 
015 * @version IFS 1.3 (Iterative Forward Search)<br>
016 *          Copyright (C) 2006 - 2014 Tomáš Müller<br>
017 *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
018 *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
019 * <br>
020 *          This library is free software; you can redistribute it and/or modify
021 *          it under the terms of the GNU Lesser General Public License as
022 *          published by the Free Software Foundation; either version 3 of the
023 *          License, or (at your option) any later version. <br>
024 * <br>
025 *          This library is distributed in the hope that it will be useful, but
026 *          WITHOUT ANY WARRANTY; without even the implied warranty of
027 *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
028 *          Lesser General Public License for more details. <br>
029 * <br>
030 *          You should have received a copy of the GNU Lesser General Public
031 *          License along with this library; if not see
032 *          <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
033 * 
034 * @param <V> Variable 
035 * @param <T> Value
036 */
037public interface SolutionListener<V extends Variable<V, T>, T extends Value<V, T>> {
038    /**
039     * Called by the solution when it is updated, see
040     * {@link Solution#update(double)}.
041     * 
042     * @param solution
043     *            source solution
044     */
045    public void solutionUpdated(Solution<V, T> solution);
046
047    /**
048     * Called by the solution when it is asked to produce info table, see
049     * {@link Solution#getInfo()}. A listener can also add some its info into
050     * this table.
051     * 
052     * @param solution
053     *            source solution
054     * @param info
055     *            produced info table
056     */
057    public void getInfo(Solution<V, T> solution, Map<String, String> info);
058
059    /**
060     * Called by the solution when it is asked to produce info table, see
061     * {@link Solution#getInfo()}. A listener can also add some its info into
062     * this table.
063     * 
064     * @param solution
065     *            source solution
066     * @param info
067     *            produced info table
068     * @param variables
069     *            only variables from this set are included
070     */
071    public void getInfo(Solution<V, T> solution, Map<String, String> info, Collection<V> variables);
072
073    /**
074     * Called by the solution when method {@link Solution#clearBest()} is
075     * called.
076     * 
077     * @param solution
078     *            source solution
079     */
080    public void bestCleared(Solution<V, T> solution);
081
082    /**
083     * Called by the solution when method {@link Solution#saveBest()} is called.
084     * 
085     * @param solution
086     *            source solution
087     */
088    public void bestSaved(Solution<V, T> solution);
089
090    /**
091     * Called by the solution when method {@link Solution#restoreBest()} is
092     * called.
093     * 
094     * @param solution
095     *            source solution
096     */
097    public void bestRestored(Solution<V, T> solution);
098}