001package org.cpsolver.ifs.model;
002
003import org.cpsolver.ifs.assignment.Assignment;
004import org.cpsolver.ifs.solver.Solver;
005
006/**
007 * IFS model listener.
008 * 
009 * @see Model
010 * 
011 * @author  Tomáš Müller
012 * @version IFS 1.3 (Iterative Forward Search)<br>
013 *          Copyright (C) 2006 - 2014 Tomáš Müller<br>
014 *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
015 *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
016 * <br>
017 *          This library is free software; you can redistribute it and/or modify
018 *          it under the terms of the GNU Lesser General Public License as
019 *          published by the Free Software Foundation; either version 3 of the
020 *          License, or (at your option) any later version. <br>
021 * <br>
022 *          This library is distributed in the hope that it will be useful, but
023 *          WITHOUT ANY WARRANTY; without even the implied warranty of
024 *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
025 *          Lesser General Public License for more details. <br>
026 * <br>
027 *          You should have received a copy of the GNU Lesser General Public
028 *          License along with this library; if not see
029 *          <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 ModelListener<V extends Variable<V, T>, T extends Value<V, T>> {
035    /**
036     * Variable is added to the model
037     * 
038     * @param variable
039     *            added variable
040     */
041    public void variableAdded(V variable);
042
043    /**
044     * Variable is removed from the model
045     * 
046     * @param variable
047     *            removed variable
048     */
049    public void variableRemoved(V variable);
050
051    /**
052     * Constraint is added to the model
053     * 
054     * @param constraint
055     *            added constraint
056     */
057    public void constraintAdded(Constraint<V, T> constraint);
058
059    /**
060     * Constraint is removed from the model
061     * 
062     * @param constraint
063     *            removed constraint
064     */
065    public void constraintRemoved(Constraint<V, T> constraint);
066
067    /**
068     * Called before a value is assigned to its variable (
069     * {@link Value#variable()}).
070     * 
071     * @param assignment current assignment
072     * @param iteration
073     *            current iteration
074     * @param value
075     *            value to be assigned
076     */
077    public void beforeAssigned(Assignment<V, T> assignment, long iteration, T value);
078
079    /**
080     * Called before a value is unassigned from its variable (
081     * {@link Value#variable()}).
082     * 
083     * @param assignment current assignment
084     * @param iteration
085     *            current iteration
086     * @param value
087     *            value to be unassigned
088     */
089    public void beforeUnassigned(Assignment<V, T> assignment, long iteration, T value);
090
091    /**
092     * Called after a value is assigned to its variable (
093     * {@link Value#variable()}).
094     * 
095     * @param assignment current assignment
096     * @param iteration
097     *            current iteration
098     * @param value
099     *            value to be assigned
100     */
101    public void afterAssigned(Assignment<V, T> assignment,  long iteration, T value);
102
103    /**
104     * Called after a value is unassigned from its variable (
105     * {@link Value#variable()}).
106     * 
107     * @param assignment current assignment
108     * @param iteration
109     *            current iteration
110     * @param value
111     *            value to be unassigned
112     */
113    public void afterUnassigned(Assignment<V, T> assignment, long iteration, T value);
114
115    /**
116     * Notification that the model was initialized by the solver.
117     * 
118     * @param solver
119     *            IFS solver
120     * @return true if successfully initialized
121     */
122    public boolean init(Solver<V, T> solver);
123}