001package org.cpsolver.exam.reports;
002
003import java.util.ArrayList;
004import java.util.List;
005import java.util.TreeSet;
006
007import org.cpsolver.exam.model.Exam;
008import org.cpsolver.exam.model.ExamModel;
009import org.cpsolver.exam.model.ExamPlacement;
010import org.cpsolver.exam.model.ExamRoomPlacement;
011import org.cpsolver.ifs.assignment.Assignment;
012import org.cpsolver.ifs.util.CSVFile;
013import org.cpsolver.ifs.util.CSVFile.CSVField;
014
015
016/**
017 * Export room splitting into a CSV file. <br>
018 * <br>
019 * Usage:
020 * <pre><code>
021 * &nbsp;&nbsp;&nbsp;&nbsp;new ExamRoomSplit(model).report().save(file);
022 * </code></pre>
023 * <br>
024 * 
025 * @version ExamTT 1.3 (Examination Timetabling)<br>
026 *          Copyright (C) 2007 - 2014 Tomáš Müller<br>
027 *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
028 *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
029 * <br>
030 *          This library is free software; you can redistribute it and/or modify
031 *          it under the terms of the GNU Lesser General Public License as
032 *          published by the Free Software Foundation; either version 3 of the
033 *          License, or (at your option) any later version. <br>
034 * <br>
035 *          This library is distributed in the hope that it will be useful, but
036 *          WITHOUT ANY WARRANTY; without even the implied warranty of
037 *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
038 *          Lesser General Public License for more details. <br>
039 * <br>
040 *          You should have received a copy of the GNU Lesser General Public
041 *          License along with this library; if not see
042 *          <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
043 */
044public class ExamRoomSplit {
045    private ExamModel iModel = null;
046
047    /**
048     * Constructor
049     * 
050     * @param model
051     *            examination timetabling model
052     */
053    public ExamRoomSplit(ExamModel model) {
054        iModel = model;
055    }
056
057    /**
058     * generate report
059     * @param assignment current assignment
060     * @return resultant report
061     */
062    public CSVFile report(Assignment<Exam, ExamPlacement> assignment) {
063        CSVFile csv = new CSVFile();
064        csv.setHeader(new CSVField[] { new CSVField("Exam"), new CSVField("Enrl"), new CSVField("Period"),
065                new CSVField("Date"), new CSVField("Time"), new CSVField("Room 1"), new CSVField("Cap 1"),
066                new CSVField("Room 2"), new CSVField("Cap 2"), new CSVField("Room 3"), new CSVField("Cap 3"),
067                new CSVField("Room 4"), new CSVField("Cap 4") });
068        for (Exam exam : iModel.variables()) {
069            ExamPlacement placement = assignment.getValue(exam);
070            if (placement == null || placement.getRoomPlacements().size() <= 1)
071                continue;
072            List<CSVField> fields = new ArrayList<CSVField>();
073            fields.add(new CSVField(exam.getName()));
074            fields.add(new CSVField(exam.getStudents().size()));
075            fields.add(new CSVField(placement.getPeriod().getIndex() + 1));
076            fields.add(new CSVField(placement.getPeriod().getDayStr()));
077            fields.add(new CSVField(placement.getPeriod().getTimeStr()));
078            TreeSet<ExamRoomPlacement> rooms = new TreeSet<ExamRoomPlacement>(new ExamRoomComparator(exam, false));
079            rooms.addAll(placement.getRoomPlacements());
080            for (ExamRoomPlacement room : rooms) {
081                fields.add(new CSVField(room.getName()));
082                fields.add(new CSVField(room.getSize(exam.hasAltSeating())));
083            }
084            csv.addLine(fields);
085        }
086        return csv;
087    }
088}