private void loadLogsum(String logsumFile, boolean taz) { logger.info("Processing bike logsum from " + logsumFile); int counter = 0; long startTime = System.currentTimeMillis(); int segmentWidth = BikeLogsumSegment.segmentWidth(); try (BufferedReader reader = new BufferedReader(new FileReader(logsumFile))) { int logsumIndex = -1; int timeIndex = -1; boolean first = true; String line; while ((line = reader.readLine()) != null) { String[] lineData = line.trim().split(","); for (int i = 0; i < lineData.length; i++) lineData[i] = lineData[i].trim(); if (first) { for (int i = 2; i < lineData.length; i++) { // first two are for row and column String columnName = lineData[i].toLowerCase(); if (columnName.contains("logsum")) logsumIndex = i; if (columnName.contains("time")) timeIndex = i; } first = false; continue; } if (++counter % 100_000 == 0) logger.debug( "Finished processing " + counter + " node pairs (logsum lookup size: " + logsum.size() + ")"); // if we ever bring back segmented logsums, then this will be a bit more complicated // the basic idea is all logsums first, then times (in same order) so lookups are // straightforward // without having to replicate the hashmap, which is a big data structure double[] data = new double[] { Double.parseDouble(lineData[logsumIndex]), Double.parseDouble(lineData[timeIndex]) }; int fromZone = Integer.parseInt(lineData[0]); int toZone = Integer.parseInt(lineData[1]); int indexFactor = taz ? -1 : 1; MatrixLookup ml = new MatrixLookup(indexFactor * fromZone, indexFactor * toZone); logsum.put(ml, data); } } catch (IOException e) { throw new RuntimeException(e); } logger.info( "Finished processing " + counter + " node pairs (logsum lookup size: " + logsum.size() + ") in " + ((System.currentTimeMillis() - startTime) / 60000.0) + " minutes"); }
public double getTime(BikeLogsumSegment segment, int rowId, int columnId) { double[] logsums = getLogsums(rowId, columnId); return logsums == null ? Double.POSITIVE_INFINITY : logsums[segment.getSegmentId() + BikeLogsumSegment.segmentWidth()]; }
@Override public double getValue(BikeLogsumSegment segment, int rowId, int columnId) { double[] logsums = getLogsums(rowId, columnId); return logsums == null ? -999 : logsums[segment.getSegmentId()]; }