001    package ifs.extension;
002    
003    import ifs.model.*;
004    import ifs.solver.*;
005    import ifs.util.*;
006    
007    /**
008     * Generic extension of IFS solver.
009     * <br><br>
010     * All extensions should extend this class.
011     * <br><br>
012     * An extension may use extra information associated with a variable or a value
013     * (see {@link Variable#setExtra(Object)}, {@link Variable#getExtra()}, {@link Value#setExtra(Object)}, {@link Value#getExtra()})
014     * but there can be only one extension using these extra objects used during the search.
015     * For instance, {@link MacPropagation} is using these extra objects to memorize explanations.
016     *
017     * @author <a href="mailto:muller@ktiml.mff.cuni.cz">Tomáš Müller</a>
018     * @version 1.0
019     */
020    public class Extension implements ModelListener {
021        private Model iModel = null;
022        private Solver iSolver = null;
023        private DataProperties iProperties = null;
024        
025        /** Constructor
026         * @param solver IFS solver
027         * @param properties input configuration
028         */
029        public Extension(Solver solver, DataProperties properties) {
030            iSolver = solver;
031            iProperties = properties;
032        }
033        
034        /** Registration of a model. This is called by the solver before start. */
035        public void register(Model model) {
036            iModel = model;
037            iModel.addModelListener(this);
038        }
039        
040        /** Unregistration of a model. This is called by the solver when extension is removed. */
041        public void unregister(Model model) {
042            iModel.removeModelListener(this);
043            iModel = null;
044        }
045        
046        /** Returns true if there is a model registered to this extension, i.e., when extension is registered. */
047        public boolean isRegistered() {
048            return iModel != null;
049        }
050        
051        /** Returns the model */
052        public Model getModel() {
053            return iModel;
054        }
055        
056        /** Returns the solver */
057        public Solver getSolver() {
058            return iSolver;
059        }
060        
061        /** Returns input configuration */
062        public DataProperties getProperties() {
063            return iProperties;
064        }
065        
066        /** Called after a value is assigned to a variable */
067        public void afterAssigned(long iteration, Value value) {
068        }
069        /** Called after a value is unassigned from a variable */
070        public void afterUnassigned(long iteration, Value value) {
071        }
072        /** Called before a value is assigned to a variable */
073        public void beforeAssigned(long iteration, Value value) {
074        }
075        /** Called after a value is unassigned from a variable */
076        public void beforeUnassigned(long iteration, Value value) {
077        }
078        /** Called when a constraint is added to the model */
079        public void constraintAdded(Constraint constraint) {
080        }
081        /** Called when a constraint is removed from the model */
082        public void constraintRemoved(Constraint constraint) {
083        }
084        /** Called when a variable is added to the model */
085        public void variableAdded(Variable variable) {
086        }
087        /** Called when a variable is removed from the model */
088        public void variableRemoved(Variable variable) {
089        }
090        
091        /** Put some information from the extension to the solution info table*/
092        public void getInfo(java.util.Hashtable anInfo) {
093        }
094        
095        /** Initialization -- called before the solver is started */
096        public boolean init(Solver solver) {
097            return true;
098        }
099        
100        /** Should return true when {@link Value#setExtra(Object)}, {@link Value#getExtra()} are used by the extension */
101        public boolean useValueExtra() {
102            return false;
103        }
104        
105        /** Should return true when {@link Variable#setExtra(Object)}, {@link Variable#getExtra()} are used by the extension */
106        public boolean useVariableExtra() {
107            return false;
108        }
109    }