playground.johannes.gsv.analysis.CountsCompareAnalyzer.java Source code

Java tutorial

Introduction

Here is the source code for playground.johannes.gsv.analysis.CountsCompareAnalyzer.java

Source

/* *********************************************************************** *
 * project: org.matsim.*
 *                                                                         *
 * *********************************************************************** *
 *                                                                         *
 * copyright       : (C) 2014 by the members listed in the COPYING,        *
 *                   LICENSE and WARRANTY file.                            *
 * email           : info at matsim dot org                                *
 *                                                                         *
 * *********************************************************************** *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *   See also COPYING, LICENSE and WARRANTY file                           *
 *                                                                         *
 * *********************************************************************** */

package playground.johannes.gsv.analysis;

import gnu.trove.TDoubleArrayList;
import gnu.trove.TDoubleDoubleHashMap;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

import org.apache.commons.math.stat.descriptive.DescriptiveStatistics;
import org.apache.log4j.Logger;
import org.matsim.api.core.v01.network.Link;
import org.matsim.api.core.v01.network.Network;
import org.matsim.core.controler.events.AfterMobsimEvent;
import org.matsim.core.controler.listener.AfterMobsimListener;
import org.matsim.counts.Count;
import org.matsim.counts.Counts;
import org.matsim.counts.CountsReaderMatsimV1;

import playground.johannes.gsv.gis.CountsCompare2GeoJSON;
import playground.johannes.gsv.gis.NetworkLoad2GeoJSON;
import playground.johannes.gsv.sim.LinkOccupancyCalculator;
import playground.johannes.gsv.sim.cadyts.ODCalibrator;
import playground.johannes.sna.math.DescriptivePiStatistics;
import playground.johannes.sna.math.Histogram;
import playground.johannes.sna.math.LinearDiscretizer;
import playground.johannes.sna.util.TXTWriter;
import playground.johannes.socialnetworks.snowball2.analysis.WSMStatsFactory;
import playground.johannes.socialnetworks.statistics.Correlations;

/**
 * @author johannes
 * 
 */
public class CountsCompareAnalyzer implements AfterMobsimListener {

    private static final Logger logger = Logger.getLogger(CountsCompareAnalyzer.class);

    private final LinkOccupancyCalculator calculator;

    private final double factor;

    private final Counts counts;

    public CountsCompareAnalyzer(LinkOccupancyCalculator calculator, String countsFile, double factor) {
        this.calculator = calculator;
        this.factor = factor;

        counts = new Counts();
        CountsReaderMatsimV1 reader = new CountsReaderMatsimV1(counts);
        reader.parse(countsFile);
    }

    @Override
    public void notifyAfterMobsim(AfterMobsimEvent event) {
        Network network = event.getControler().getScenario().getNetwork();
        DescriptiveStatistics error = new DescriptiveStatistics();
        DescriptiveStatistics errorAbs = new DescriptiveStatistics();
        DescriptivePiStatistics errorWeighted = new WSMStatsFactory().newInstance();

        TDoubleArrayList errorVals = new TDoubleArrayList();
        TDoubleArrayList caps = new TDoubleArrayList();
        TDoubleArrayList speeds = new TDoubleArrayList();

        for (Count count : counts.getCounts().values()) {
            if (!count.getLocId().toString().startsWith(ODCalibrator.VIRTUAL_ID_PREFIX)) {
                double obsVal = 0;
                for (int i = 1; i < 25; i++) {
                    obsVal += count.getVolume(i).getValue();
                }

                if (obsVal > 0) {
                    double simVal = calculator.getOccupancy(count.getLocId());
                    simVal *= factor;

                    double err = (simVal - obsVal) / obsVal;

                    error.addValue(err);
                    errorAbs.addValue(Math.abs(err));
                    errorWeighted.addValue(Math.abs(err), 1 / obsVal);

                    Link link = network.getLinks().get(count.getLocId());
                    errorVals.add(Math.abs(err));
                    caps.add(link.getCapacity());
                    speeds.add(link.getFreespeed());
                }
            }
        }

        logger.info(String.format("Relative counts error: mean = %s, var = %s, stderr = %s, min = %s, max = %s",
                error.getMean(), error.getVariance(), error.getStandardDeviation(), error.getMin(),
                error.getMax()));
        logger.info(String.format(
                "Absolute relative counts error: mean = %s, var = %s, stderr = %s, min = %s, max = %s",
                errorAbs.getMean(), errorAbs.getVariance(), errorAbs.getStandardDeviation(), errorAbs.getMin(),
                errorAbs.getMax()));
        logger.info(String.format(
                "Absolute weigthed relative counts error: mean = %s, var = %s, stderr = %s, min = %s, max = %s",
                errorWeighted.getMean(), errorWeighted.getVariance(), errorWeighted.getStandardDeviation(),
                errorWeighted.getMin(), errorWeighted.getMax()));

        String outdir = event.getControler().getControlerIO().getIterationPath(event.getIteration());

        try {
            TDoubleDoubleHashMap map = Correlations.mean(caps.toNativeArray(), errorVals.toNativeArray());
            TXTWriter.writeMap(map, "capacity", "counts", String.format("%s/countsError.capacity.txt", outdir));

            map = Correlations.mean(speeds.toNativeArray(), errorVals.toNativeArray());
            TXTWriter.writeMap(map, "speed", "counts", String.format("%s/countsError.speed.txt", outdir));

            TXTWriter.writeMap(Histogram.createHistogram(error, new LinearDiscretizer(0.1), false), "Error",
                    "Frequency", String.format("%s/countsError.hist.txt", outdir));
            TXTWriter.writeMap(Histogram.createHistogram(errorAbs, new LinearDiscretizer(0.1), false),
                    "Error (absolute)", "Frequency", String.format("%s/countsErrorAbs.hist.txt", outdir));
            TXTWriter.writeMap(Histogram.createHistogram(errorWeighted, new LinearDiscretizer(0.1), true),
                    "Error (weighted)", "Frequency", String.format("%s/countsErrorWeighted.hist.txt", outdir));

            CountsCompare2GeoJSON.write(calculator, counts, factor, network, outdir);
            NetworkLoad2GeoJSON.write(event.getControler().getScenario().getNetwork(), calculator, factor,
                    outdir + "/network.json");
        } catch (IOException e) {
            e.printStackTrace();
        }

        String rootOutDir = event.getControler().getControlerIO().getOutputPath();
        boolean append = false;
        if (event.getIteration() > 0) {
            append = true;
        }
        writeErrorFile(error, String.format("%s/countsError.txt", rootOutDir), append);
        writeErrorFile(errorAbs, String.format("%s/countsAbsError.txt", rootOutDir), append);
    }

    private void writeErrorFile(DescriptiveStatistics error, String file, boolean append) {
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter(file, append));
            if (!append) {
                // write header
                writer.write("mean\tvar\tstderr\tmin\tmax");
                writer.newLine();
            }

            writer.write(String.valueOf(error.getMean()));
            writer.write("\t");
            writer.write(String.valueOf(error.getVariance()));
            writer.write("\t");
            writer.write(String.valueOf(error.getStandardDeviation()));
            writer.write("\t");
            writer.write(String.valueOf(error.getMin()));
            writer.write("\t");
            writer.write(String.valueOf(error.getMax()));
            writer.newLine();

            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}