001    package net.sf.cpsolver.coursett.model;
002    
003    import net.sf.cpsolver.ifs.model.Constraint;
004    import net.sf.cpsolver.ifs.model.ModelListener;
005    import net.sf.cpsolver.ifs.solver.Solver;
006    
007    /**
008     * On fly student sectioning. <br>
009     * <br>
010     * In this mode, students are resectioned after each iteration, but only between
011     * classes that are affected by the iteration. This slows down the solver, but
012     * it can dramatically improve results in the case when there is more stress put
013     * on student conflicts (e.g., Woebegon College example).
014     * 
015     * <br>
016     * <br>
017     * Parameters:
018     * <table border='1'>
019     * <tr>
020     * <th>Parameter</th>
021     * <th>Type</th>
022     * <th>Comment</th>
023     * </tr>
024     * <tr>
025     * <td>OnFlySectioning.Enabled</td>
026     * <td>{@link Boolean}</td>
027     * <td>Enable on fly sectioning (if enabled, students will be resectioned after
028     * each iteration)</td>
029     * </tr>
030     * <tr>
031     * <td>OnFlySectioning.Recursive</td>
032     * <td>{@link Boolean}</td>
033     * <td>Recursively resection lectures affected by a student swap</td>
034     * </tr>
035     * <tr>
036     * <td>OnFlySectioning.ConfigAsWell</td>
037     * <td>{@link Boolean}</td>
038     * <td>Resection students between configurations as well</td>
039     * </tr>
040     * </table>
041     * 
042     * @version CourseTT 1.2 (University Course Timetabling)<br>
043     *          Copyright (C) 2006 - 2010 Tomas Muller<br>
044     *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
045     *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
046     * <br>
047     *          This library is free software; you can redistribute it and/or modify
048     *          it under the terms of the GNU Lesser General Public License as
049     *          published by the Free Software Foundation; either version 3 of the
050     *          License, or (at your option) any later version. <br>
051     * <br>
052     *          This library is distributed in the hope that it will be useful, but
053     *          WITHOUT ANY WARRANTY; without even the implied warranty of
054     *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
055     *          Lesser General Public License for more details. <br>
056     * <br>
057     *          You should have received a copy of the GNU Lesser General Public
058     *          License along with this library; if not see
059     *          <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
060     */
061    
062    public class OnFlySectioning implements ModelListener<Lecture, Placement> {
063        private TimetableModel iModel;
064        private boolean iRecursive = true;
065        private boolean iConfigAsWell = false;
066    
067        /**
068         * Constructor
069         * 
070         * @param model
071         *            timetabling model
072         */
073        public OnFlySectioning(TimetableModel model) {
074            iModel = model;
075        }
076    
077        @Override
078        public void variableAdded(Lecture variable) {
079        }
080    
081        @Override
082        public void variableRemoved(Lecture variable) {
083        }
084    
085        @Override
086        public void constraintAdded(Constraint<Lecture, Placement> constraint) {
087        }
088    
089        @Override
090        public void constraintRemoved(Constraint<Lecture, Placement> constraint) {
091        }
092    
093        @Override
094        public void beforeAssigned(long iteration, Placement value) {
095        }
096    
097        @Override
098        public void beforeUnassigned(long iteration, Placement value) {
099        }
100    
101        /**
102         * {@link FinalSectioning#resection(Lecture, boolean, boolean)} is called
103         * when given iteration number is greater than zero.
104         */
105        @Override
106        public void afterAssigned(long iteration, Placement value) {
107            if (iteration > 0)
108                iModel.getStudentSectioning().resection(value.variable(), iRecursive, iConfigAsWell);
109        }
110    
111        @Override
112        public void afterUnassigned(long iteration, Placement value) {
113        }
114    
115        /**
116         * Initialization
117         */
118        @Override
119        public boolean init(Solver<Lecture, Placement> solver) {
120            iRecursive = solver.getProperties().getPropertyBoolean("OnFlySectioning.Recursive", true);
121            iConfigAsWell = solver.getProperties().getPropertyBoolean("OnFlySectioning.ConfigAsWell", false);
122            return true;
123        }
124    }