@Override public void parse(InputStream in, DistanceCacheWriter cache) { reader.reset(in); int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE; IndefiniteProgress prog = LOG.isVerbose() ? new IndefiniteProgress("Parsing distance matrix", LOG) : null; try { while (reader.nextLineExceptComments()) { LOG.incrementProcessed(prog); if (!tokenizer.valid()) { throw new IllegalArgumentException( "Less than three values in line " + reader.getLineNumber()); } int id1, id2; try { id1 = (int) tokenizer.getLongBase10(); tokenizer.advance(); } catch (NumberFormatException e) { throw new IllegalArgumentException( "Error in line " + reader.getLineNumber() + ": id1 is not an integer!"); } if (!tokenizer.valid()) { throw new IllegalArgumentException( "Less than three values in line " + reader.getLineNumber()); } try { id2 = (int) tokenizer.getLongBase10(); tokenizer.advance(); } catch (NumberFormatException e) { throw new IllegalArgumentException( "Error in line " + reader.getLineNumber() + ": id2 is not an integer!"); } if (!tokenizer.valid()) { throw new IllegalArgumentException( "Less than three values in line " + reader.getLineNumber()); } // Track minimum and maximum if (id1 < id2) { min = (id1 < min) ? id1 : min; max = (id2 > min) ? id2 : max; } else { min = (id2 < min) ? id2 : min; max = (id1 > min) ? id1 : max; } try { double distance = tokenizer.getDouble(); cache.put(id1, id2, distance); } catch (IllegalArgumentException e) { throw new IllegalArgumentException( "Error in line " + reader.getLineNumber() + ":" + e.getMessage(), e); } tokenizer.advance(); if (tokenizer.valid()) { throw new IllegalArgumentException( "More than three values in line " + reader.getLineNumber()); } } } catch (IOException e) { throw new IllegalArgumentException( "Error while parsing line " + reader.getLineNumber() + "."); } LOG.setCompleted(prog); // check if all distance values are specified for (int i1 = min; i1 <= max; i1++) { for (int i2 = i1 + 1; i2 <= max; i2++) { if (!cache.containsKey(i1, i2)) { throw new IllegalArgumentException( "Distance value for " + i1 + " to " + i2 + " is missing!"); } } } }