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