001package org.cpsolver.ifs.extension;
002
003import org.cpsolver.ifs.assignment.Assignment;
004import org.cpsolver.ifs.model.Constraint;
005import org.cpsolver.ifs.model.Model;
006import org.cpsolver.ifs.model.ModelListener;
007import org.cpsolver.ifs.model.Value;
008import org.cpsolver.ifs.model.Variable;
009import org.cpsolver.ifs.solver.Solver;
010import org.cpsolver.ifs.util.DataProperties;
011
012/**
013 * Generic extension of IFS solver. <br>
014 * <br>
015 * All extensions should extend this class. <br>
016 * 
017 * @version IFS 1.3 (Iterative Forward Search)<br>
018 *          Copyright (C) 2006 - 2014 Tomáš Müller<br>
019 *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
020 *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
021 * <br>
022 *          This library is free software; you can redistribute it and/or modify
023 *          it under the terms of the GNU Lesser General Public License as
024 *          published by the Free Software Foundation; either version 3 of the
025 *          License, or (at your option) any later version. <br>
026 * <br>
027 *          This library is distributed in the hope that it will be useful, but
028 *          WITHOUT ANY WARRANTY; without even the implied warranty of
029 *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
030 *          Lesser General Public License for more details. <br>
031 * <br>
032 *          You should have received a copy of the GNU Lesser General Public
033 *          License along with this library; if not see
034 *          <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
035 * @param <V> Variable
036 * @param <T> Value
037 */
038public class Extension<V extends Variable<V, T>, T extends Value<V, T>> implements ModelListener<V, T> {
039    private Model<V, T> iModel = null;
040    private Solver<V, T> iSolver = null;
041    private DataProperties iProperties = null;
042
043    /**
044     * Constructor
045     * 
046     * @param solver
047     *            IFS solver
048     * @param properties
049     *            input configuration
050     */
051    public Extension(Solver<V, T> solver, DataProperties properties) {
052        iSolver = solver;
053        iProperties = properties;
054    }
055
056    /** Registration of a model. This is called by the solver before start. 
057     * @param model problem model
058     **/
059    public void register(Model<V, T> model) {
060        iModel = model;
061        iModel.addModelListener(this);
062    }
063
064    /**
065     * Unregistration of a model. This is called by the solver when extension is
066     * removed.
067     * @param model problem model
068     */
069    public void unregister(Model<V, T> model) {
070        iModel.removeModelListener(this);
071        iModel = null;
072    }
073
074    /**
075     * Returns true if there is a model registered to this extension, i.e., when
076     * extension is registered.
077     * @return true if registered with a solver
078     */
079    public boolean isRegistered() {
080        return iModel != null;
081    }
082
083    /** Returns the model
084     * @return problem model 
085     **/
086    public Model<V, T> getModel() {
087        return iModel;
088    }
089
090    /** Returns the solver 
091     * @return current solver
092     **/
093    public Solver<V, T> getSolver() {
094        return iSolver;
095    }
096
097    /** Returns input configuration
098     * @return solver configuration
099     **/
100    public DataProperties getProperties() {
101        return iProperties;
102    }
103
104    /** Called after a value is assigned to a variable */
105    @Override
106    public void afterAssigned(Assignment<V, T> assignment, long iteration, T value) {
107    }
108
109    /** Called after a value is unassigned from a variable */
110    @Override
111    public void afterUnassigned(Assignment<V, T> assignment, long iteration, T value) {
112    }
113
114    /** Called before a value is assigned to a variable */
115    @Override
116    public void beforeAssigned(Assignment<V, T> assignment, long iteration, T value) {
117    }
118
119    /** Called after a value is unassigned from a variable */
120    @Override
121    public void beforeUnassigned(Assignment<V, T> assignment, long iteration, T value) {
122    }
123
124    /** Called when a constraint is added to the model */
125    @Override
126    public void constraintAdded(Constraint<V, T> constraint) {
127    }
128
129    /** Called when a constraint is removed from the model */
130    @Override
131    public void constraintRemoved(Constraint<V, T> constraint) {
132    }
133
134    /** Called when a variable is added to the model */
135    @Override
136    public void variableAdded(V variable) {
137    }
138
139    /** Called when a variable is removed from the model */
140    @Override
141    public void variableRemoved(V variable) {
142    }
143
144    /** Initialization -- called before the solver is started */
145    @Override
146    public boolean init(Solver<V, T> solver) {
147        return true;
148    }
149}