001package org.cpsolver.coursett;
002
003import java.io.File;
004import java.util.Comparator;
005import java.util.Iterator;
006import java.util.TreeSet;
007
008import org.cpsolver.coursett.model.Lecture;
009import org.cpsolver.coursett.model.TimetableModel;
010import org.cpsolver.ifs.util.ToolBox;
011
012
013/**
014 * Create joint enrollment chart of the given input problem as CSV file (3
015 * dimensions: 1st variable, 2nd variable, number of students in common)
016 * 
017 * @version CourseTT 1.3 (University Course Timetabling)<br>
018 *          Copyright (C) 2007 - 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 */
036public class JenrlChart extends DomainChart {
037    protected int iMax = 100;
038
039    public JenrlChart(String name, TimetableModel model, int max) {
040        super(name, model, Math.min(max, model.variables().size()), Math.min(max, model.variables().size()));
041        iMax = max;
042    }
043
044    public JenrlChart(File xmlFile, int max) throws Exception {
045        super(xmlFile, 0, 0);
046        iMax = max;
047        iSizeX = Math.min(iMax, iModel.variables().size());
048        iSizeY = Math.min(iMax, iModel.variables().size());
049    }
050
051    @Override
052    protected void computeTable() {
053        clearTable();
054        TreeSet<Lecture> vars = new TreeSet<Lecture>(new Comparator<Lecture>() {
055            @Override
056            public int compare(Lecture l1, Lecture l2) {
057                int cmp = -Double.compare(l1.students().size(), l2.students().size());
058                if (cmp != 0)
059                    return cmp;
060                cmp = -Double.compare(l1.maxClassLimit(), l2.maxClassLimit());
061                if (cmp != 0)
062                    return cmp;
063                return Double.compare(l1.getId(), l2.getId());
064            }
065        });
066        vars.addAll(iModel.variables());
067        int x = 1;
068        for (Iterator<Lecture> i = vars.iterator(); i.hasNext(); x++) {
069            Lecture l1 = i.next();
070            if (x > iMax)
071                continue;
072            iHeader[x] = String.valueOf(l1.students().size());
073            int y = 1;
074            for (Iterator<Lecture> j = vars.iterator(); j.hasNext(); y++) {
075                Lecture l2 = j.next();
076                if (y > iMax)
077                    continue;
078                iTitle[y] = l2.getName();
079                if (x >= y)
080                    continue;
081                add(x, y, l1.sameStudents(l2).size());
082            }
083        }
084    }
085
086    public static void main(String args[]) {
087        try {
088            ToolBox.configureLogging();
089            File input = new File(args[0]);
090            int max = Integer.parseInt(args[1]);
091            File output = null;
092            if (args.length > 2) {
093                output = new File(args[2]);
094                if (output.exists() && output.isDirectory())
095                    output = new File(output, input.getName().substring(0, input.getName().lastIndexOf('.'))
096                            + "_jenrl.csv");
097            } else {
098                output = new File(input.getParentFile(), input.getName().substring(0, input.getName().lastIndexOf('.'))
099                        + "_jenrl.csv");
100            }
101            new JenrlChart(input, max).createTable().save(output);
102        } catch (Exception e) {
103            e.printStackTrace();
104        }
105    }
106
107}