001 package net.sf.cpsolver.ifs.constant; 002 003 import java.util.Vector; 004 005 import net.sf.cpsolver.ifs.model.Model; 006 import net.sf.cpsolver.ifs.model.Value; 007 import net.sf.cpsolver.ifs.model.Variable; 008 import net.sf.cpsolver.ifs.util.FastVector; 009 010 /** 011 * Extension of the model with constant variables. 012 * 013 * Such variables are excluded from the solver process, however, 014 * they can be included in constraints. Such model can allow us to build a solution 015 * on top of another solution (e.g., committed classes in the course timetabling). 016 * 017 * Constant variable has to implement interface {@link ConstantVariable}, 018 * returning {@link ConstantVariable#isConstant()} true. 019 * 020 * @version 021 * IFS 1.1 (Iterative Forward Search)<br> 022 * Copyright (C) 2006 Tomáš Müller<br> 023 * <a href="mailto:muller@unitime.org">muller@unitime.org</a><br> 024 * Lazenska 391, 76314 Zlin, Czech Republic<br> 025 * <br> 026 * This library is free software; you can redistribute it and/or 027 * modify it under the terms of the GNU Lesser General Public 028 * License as published by the Free Software Foundation; either 029 * version 2.1 of the License, or (at your option) any later version. 030 * <br><br> 031 * This library is distributed in the hope that it will be useful, 032 * but WITHOUT ANY WARRANTY; without even the implied warranty of 033 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 034 * Lesser General Public License for more details. 035 * <br><br> 036 * You should have received a copy of the GNU Lesser General Public 037 * License along with this library; if not, write to the Free Software 038 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 039 * 040 */ 041 042 public class ConstantModel extends Model { 043 private Vector iConstantVariables = null; 044 045 /** List of constant variables */ 046 public Vector constantVariables() { return iConstantVariables; } 047 048 /** True, if the model contains at least one constant variable. */ 049 public boolean hasConstantVariables() { return iConstantVariables!=null && !iConstantVariables.isEmpty(); } 050 051 /** True, if the given variable is constant. */ 052 public boolean isConstant(Variable variable) { 053 return (iConstantVariables!=null && variable instanceof ConstantVariable && ((ConstantVariable)variable).isConstant()); 054 } 055 056 /** Adds a variable to the model */ 057 public void addVariable(Variable variable) { 058 if (variable instanceof ConstantVariable && ((ConstantVariable)variable).isConstant()) { 059 if (iConstantVariables==null) iConstantVariables = new FastVector(); 060 variable.setModel(this); 061 iConstantVariables.addElement(variable); 062 if (variable.getAssignment()!=null) variable.assign(0L,variable.getAssignment()); 063 } else super.addVariable(variable); 064 } 065 066 /** Removes a variable from the model */ 067 public void removeVariable(Variable variable) { 068 if (isConstant(variable)) { 069 variable.setModel(null); 070 iConstantVariables.removeElement(variable); 071 } else super.removeVariable(variable); 072 } 073 074 /** Called before a value is assigned to its variable. Constant variables are excluded from (re)assignment. */ 075 public void beforeAssigned(long iteration, Value value) { 076 if (!isConstant(value.variable())) super.beforeAssigned(iteration, value); 077 } 078 079 /** Called before a value is unassigned from its variable. Constant variables are excluded from (re)assignment. */ 080 public void beforeUnassigned(long iteration, Value value) { 081 if (!isConstant(value.variable())) super.beforeUnassigned(iteration, value); 082 } 083 084 /** Called after a value is assigned to its variable. Constant variables are excluded from (re)assignment. */ 085 public void afterAssigned(long iteration, Value value) { 086 if (!isConstant(value.variable())) super.afterAssigned(iteration, value); 087 } 088 089 /** Called after a value is unassigned from its variable. Constant variables are excluded from (re)assignment. */ 090 public void afterUnassigned(long iteration, Value value) { 091 if (!isConstant(value.variable())) super.afterUnassigned(iteration, value); 092 } 093 }