generate-shapes/src/shapevl/Collector.h

129 lines
3 KiB
C
Raw Normal View History

2018-06-09 17:14:08 +02:00
// Copyright 2018, University of Freiburg,
// Chair of Algorithms and Data Structures.
// Authors: Patrick Brosi <brosi@informatik.uni-freiburg.de>
#ifndef PFAEDLE_EVAL_COLLECTOR_H_
#define PFAEDLE_EVAL_COLLECTOR_H_
#include <fstream>
2018-06-09 17:14:08 +02:00
#include <map>
#include <ostream>
#include <set>
#include <string>
#include <utility>
#include <vector>
#include "ad/cppgtfs/gtfs/Feed.h"
#include "pfaedle/Def.h"
#include "shapevl/Result.h"
2018-06-09 17:14:08 +02:00
#include "util/geo/Geo.h"
2022-01-09 23:58:18 +01:00
#include "util/json/Writer.h"
2018-06-09 17:14:08 +02:00
using ad::cppgtfs::gtfs::Shape;
using ad::cppgtfs::gtfs::Trip;
2018-06-09 17:14:08 +02:00
namespace pfaedle {
namespace eval {
2022-01-12 17:20:10 +01:00
struct lineCmp {
bool operator()(const LINE& a, const LINE& b) const {
if (a.size() != b.size()) {
return a.size() < b.size();
}
for (size_t i = 0; i < a.size(); i++) {
2022-01-17 15:11:24 +01:00
if (util::geo::dist(a[i], b[i]) > .00001) {
2022-01-12 20:21:27 +01:00
return (a[i].getX() < b[i].getX()) ||
(a[i].getX() == b[i].getX() && a[i].getY() < b[i].getY());
;
2022-01-12 17:20:10 +01:00
}
}
return false;
}
};
2018-06-09 17:14:08 +02:00
/*
* Collects routing results for evaluation
*/
class Collector {
public:
Collector(std::ostream* reportOut)
: _trips(0),
_noOrigShp(0),
2018-06-09 17:14:08 +02:00
_fdSum(0),
_unmatchedSegSum(0),
_unmatchedSegLengthSum(0),
2022-01-07 17:41:03 +01:00
_an0(0),
_an5(0),
_an10(0),
_an30(0),
_an50(0),
_an70(0),
_an90(0),
_reportOut(reportOut) {}
2018-06-09 17:14:08 +02:00
// Add a shape found by our tool newS for a trip t with newly calculated
// station dist values with the old shape oldS
double add(const Trip* oldT, const Shape* oldS, const Trip* newT,
const Shape* newS);
2018-06-09 17:14:08 +02:00
// Return the set of all Result objects
const std::set<Result>& getResults() const;
// Print general stats to os
void printStats(std::ostream* os) const;
// Print general stats to os
void printShortStats(std::ostream* os) const;
2018-06-09 17:14:08 +02:00
2022-01-09 23:58:18 +01:00
// Get JSON stats
2022-01-11 17:32:50 +01:00
std::map<string, double> getStats();
2022-01-09 23:58:18 +01:00
2018-06-09 17:14:08 +02:00
// Print a CSV for the results to os
void printCsv(std::ostream* os, const std::set<Result>& result) const;
2018-06-09 17:14:08 +02:00
// Return the averaged average frechet distance
double getAvgDist() const;
2022-01-12 20:21:27 +01:00
static LINE getLine(const Shape* s, std::vector<double>* dists);
double getAcc() const;
2018-06-09 17:14:08 +02:00
private:
std::set<Result> _results;
2022-01-12 17:20:10 +01:00
std::map<LINE, std::map<LINE, double, lineCmp>, lineCmp> _dCache;
std::map<LINE, std::map<LINE, double, lineCmp>, lineCmp> _dACache;
size_t _trips;
2018-06-09 17:14:08 +02:00
size_t _noOrigShp;
2022-01-11 17:32:50 +01:00
std::vector<double> _distDiffs;
2022-01-17 13:29:35 +01:00
std::vector<double> _hopDists;
2022-01-11 17:32:50 +01:00
2018-06-09 17:14:08 +02:00
double _fdSum;
size_t _unmatchedSegSum;
double _unmatchedSegLengthSum;
2022-01-07 17:35:30 +01:00
size_t _an0;
size_t _an5;
size_t _an10;
size_t _an30;
size_t _an50;
size_t _an70;
size_t _an90;
2018-06-09 17:14:08 +02:00
std::ostream* _reportOut;
2018-06-09 17:14:08 +02:00
2022-01-12 17:20:10 +01:00
std::pair<size_t, double> getDa(const std::vector<LINE>& a,
2022-01-12 20:21:27 +01:00
const std::vector<LINE>& b);
2018-06-09 17:14:08 +02:00
2022-01-12 17:20:10 +01:00
static std::vector<LINE> segmentize(
const Trip* t, const LINE& shape, const std::vector<double>& dists,
std::vector<std::pair<double, double>>& lenDist);
2018-06-09 17:14:08 +02:00
};
} // namespace eval
} // namespace pfaedle
#endif // PFAEDLE_EVAL_COLLECTOR_H_