001    package net.sf.cpsolver.coursett;
002    
003    import java.io.File;
004    import java.util.Comparator;
005    import java.util.Iterator;
006    import java.util.TreeSet;
007    
008    import net.sf.cpsolver.coursett.model.Lecture;
009    import net.sf.cpsolver.coursett.model.TimetableModel;
010    import net.sf.cpsolver.ifs.util.ToolBox;
011    
012    /**
013     * Create joint enrollment chart of the given input problem as CSV file (3
014     * dimensions: 1st variable, 2nd variable, number of students in common)
015     * 
016     * @version CourseTT 1.2 (University Course Timetabling)<br>
017     *          Copyright (C) 2007 - 2010 Tomas Muller<br>
018     *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
019     *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
020     * <br>
021     *          This library is free software; you can redistribute it and/or modify
022     *          it under the terms of the GNU Lesser General Public License as
023     *          published by the Free Software Foundation; either version 3 of the
024     *          License, or (at your option) any later version. <br>
025     * <br>
026     *          This library is distributed in the hope that it will be useful, but
027     *          WITHOUT ANY WARRANTY; without even the implied warranty of
028     *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
029     *          Lesser General Public License for more details. <br>
030     * <br>
031     *          You should have received a copy of the GNU Lesser General Public
032     *          License along with this library; if not see
033     *          <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
034     */
035    public class JenrlChart extends DomainChart {
036        protected int iMax = 100;
037    
038        public JenrlChart(String name, TimetableModel model, int max) {
039            super(name, model, Math.min(max, model.variables().size()), Math.min(max, model.variables().size()));
040            iMax = max;
041        }
042    
043        public JenrlChart(File xmlFile, int max) throws Exception {
044            super(xmlFile, 0, 0);
045            iMax = max;
046            iSizeX = Math.min(iMax, iModel.variables().size());
047            iSizeY = Math.min(iMax, iModel.variables().size());
048        }
049    
050        @Override
051        protected void computeTable() {
052            clearTable();
053            TreeSet<Lecture> vars = new TreeSet<Lecture>(new Comparator<Lecture>() {
054                @Override
055                public int compare(Lecture l1, Lecture l2) {
056                    int cmp = -Double.compare(l1.students().size(), l2.students().size());
057                    if (cmp != 0)
058                        return cmp;
059                    cmp = -Double.compare(l1.classLimit(), l2.classLimit());
060                    if (cmp != 0)
061                        return cmp;
062                    return Double.compare(l1.getId(), l2.getId());
063                }
064            });
065            vars.addAll(iModel.variables());
066            int x = 1;
067            for (Iterator<Lecture> i = vars.iterator(); i.hasNext(); x++) {
068                Lecture l1 = i.next();
069                if (x > iMax)
070                    continue;
071                iHeader[x] = String.valueOf(l1.students().size());
072                int y = 1;
073                for (Iterator<Lecture> j = vars.iterator(); j.hasNext(); y++) {
074                    Lecture l2 = j.next();
075                    if (y > iMax)
076                        continue;
077                    iTitle[y] = l2.getName();
078                    if (x >= y)
079                        continue;
080                    add(x, y, l1.sameStudents(l2).size());
081                }
082            }
083        }
084    
085        public static void main(String args[]) {
086            try {
087                ToolBox.configureLogging();
088                File input = new File(args[0]);
089                int max = Integer.parseInt(args[1]);
090                File output = null;
091                if (args.length > 2) {
092                    output = new File(args[2]);
093                    if (output.exists() && output.isDirectory())
094                        output = new File(output, input.getName().substring(0, input.getName().lastIndexOf('.'))
095                                + "_jenrl.csv");
096                } else {
097                    output = new File(input.getParentFile(), input.getName().substring(0, input.getName().lastIndexOf('.'))
098                            + "_jenrl.csv");
099                }
100                new JenrlChart(input, max).createTable().save(output);
101            } catch (Exception e) {
102                e.printStackTrace();
103            }
104        }
105    
106    }