@Override public Optional<MultiAttributeData> read(String data) { final Map<String, String> map = parseDataAsMap(data); final Builder b = MultiAttributeData.builder(); if (map.containsKey(DISTANCE)) { b.setLength(Double.parseDouble(map.get(DISTANCE))); map.remove(DISTANCE); } if (map.containsKey(MAX_SPEED)) { b.setMaxSpeed(Double.parseDouble(map.get(MAX_SPEED))); map.remove(MAX_SPEED); } b.addAllAttributes(map); if (b.getAttributes().isEmpty() && !b.getLength().isPresent() && !b.getMaxSpeed().isPresent()) { return Optional.absent(); } return Optional.of(b.build()); } }
@Override public Optional<MultiAttributeData> read(String data) { final Map<String, String> map = parseDataAsMap(data); final Builder b = MultiAttributeData.builder(); if (map.containsKey(DISTANCE)) { b.setLength(Double.parseDouble(map.get(DISTANCE))); map.remove(DISTANCE); } if (map.containsKey(MAX_SPEED)) { b.setMaxSpeed(Double.parseDouble(map.get(MAX_SPEED))); map.remove(MAX_SPEED); } b.addAllAttributes(map); if (b.getAttributes().isEmpty() && !b.getLength().isPresent() && !b.getMaxSpeed().isPresent()) { return Optional.absent(); } return Optional.of(b.build()); } }
@Override public void handleTimedEvent(ChangeConnectionSpeedEvent event, SimulatorAPI simulator) { final Graph<MultiAttributeData> graph = (Graph<MultiAttributeData>) ((Simulator) simulator) .getModelProvider().getModel(PDPDynamicGraphRoadModel.class) .getGraph(); final MultiAttributeData data = graph.connectionData(event.getFrom(), event.getTo()).get(); graph.setConnectionData( event.getFrom(), event.getTo(), MultiAttributeData.builder() .addAllAttributes(data.getAttributes()) .setLength(data.getLength().get()) .setMaxSpeed(data.getMaxSpeed().get() * event.getFactor()) .build()); }
@Override public void handleTimedEvent(ChangeConnectionSpeedEvent event, SimulatorAPI simulator) { final Graph<MultiAttributeData> graph = (Graph<MultiAttributeData>) ((Simulator) simulator) .getModelProvider().getModel(PDPDynamicGraphRoadModel.class) .getGraph(); final MultiAttributeData data = graph.connectionData(event.getFrom(), event.getTo()).get(); graph.setConnectionData( event.getFrom(), event.getTo(), MultiAttributeData.builder() .addAllAttributes(data.getAttributes()) .setLength(data.getLength().get()) .setMaxSpeed(data.getMaxSpeed().get() * event.getFactor()) .build()); }
/** * The fastest path changes based on the maximal allowed speed */ @Test public void fastestPathConnData() { final Graph<MultiAttributeData> attributeGraph = new TableGraph<>(); Point A, B, C, D; A = new Point(0, 0); B = new Point(0, 10); C = new Point(10, 10); D = new Point(10, 0); attributeGraph.addConnection(A, B, MultiAttributeData.builder().setMaxSpeed(2).build()); attributeGraph.addConnection(B, C, MultiAttributeData.builder().setMaxSpeed(2).build()); attributeGraph.addConnection(A, D, MultiAttributeData.builder().setMaxSpeed(1).build()); attributeGraph.addConnection(D, C, MultiAttributeData.builder().setMaxSpeed(1).build()); assertEquals(asList(A, B, C), Graphs.shortestPath(attributeGraph, A, C, GeomHeuristics.time(50d))); attributeGraph.setConnectionData(A, D, MultiAttributeData.builder().setMaxSpeed(10).build()); attributeGraph.setConnectionData(D, C, MultiAttributeData.builder().setMaxSpeed(10).build()); assertEquals(asList(A, D, C), Graphs.shortestPath(attributeGraph, A, C, GeomHeuristics.time(50d))); }
MultiAttributeData.builder().setMaxSpeed(100).build()); connB = Connection.create(B, C, MultiAttributeData.builder().setMaxSpeed(100).build()); connC = Connection.create(C, D, MultiAttributeData.builder().setMaxSpeed(100).build()); connD = Connection.create(D, E, MultiAttributeData.builder().setMaxSpeed(100).build()); connE = Connection.create(E, F, MultiAttributeData.builder().setMaxSpeed(100).build());
MultiAttributeData.builder().setMaxSpeed(100).build()); connB = Connection.create(B, C, MultiAttributeData.builder().setMaxSpeed(100).build()); connC = Connection.create(C, D, MultiAttributeData.builder().setMaxSpeed(100).build()); connD = Connection.create(D, E, MultiAttributeData.builder().setMaxSpeed(100).build());
MultiAttributeData.builder().setMaxSpeed(100).build()); connB = Connection.create(B, C, MultiAttributeData.builder().setMaxSpeed(100).build()); connC = Connection.create(C, D, MultiAttributeData.builder().setMaxSpeed(100).build()); connD = Connection.create(D, E, MultiAttributeData.builder().setMaxSpeed(100).build());
graph.addConnection(B, C, MultiAttributeData.builder() .setLength(10) .setMaxSpeed(2.5) graph.addConnection(B, D, MultiAttributeData.builder() .setLength(10d) .setMaxSpeed(10) graph.addConnection(D, C, MultiAttributeData.builder() .setLength(12) .setMaxSpeed(1) .build()); graph.addConnection(D, E, MultiAttributeData.builder() .setLength(5) .setMaxSpeed(7)
connF; conna = Connection.create(A, a, MultiAttributeData.builder().setMaxSpeed(50).build()); connA = Connection.create(B, A, MultiAttributeData.builder().setMaxSpeed(50).build()); connB = Connection.create(C, B, MultiAttributeData.builder().setMaxSpeed(50).build()); connC = Connection.create(D, C, MultiAttributeData.builder().setMaxSpeed(50).build()); connD = Connection.create(E, D, MultiAttributeData.builder().setMaxSpeed(50).build()); connE = Connection.create(F, E, MultiAttributeData.builder().setMaxSpeed(50).build()); connF = Connection.create(f, F, MultiAttributeData.builder().setMaxSpeed(50).build());
/** * Cannot use reserved attribute name. * @throws IOException Should not happen. */ @Test public void testInvalidAttributeName() throws IOException { final DotGraphIO<MultiAttributeData> io = DotGraphIO.getMultiAttributeGraphIO(); final Graph<MultiAttributeData> g = new TableGraph<>(); g.addConnection(Connection.create(new Point(0, 0), new Point(1, 1), MultiAttributeData.builder() .addAttribute("d", "invalid") .build())); exception.expect(IllegalArgumentException.class); exception.expectMessage(CoreMatchers.startsWith("Attribute key")); io.write(g, new StringWriter()); }
Connection<MultiAttributeData> connCprime, connDprime, connDD; connA = Connection.create(A, B, MultiAttributeData.builder().setMaxSpeed(100).build()); connB = Connection.create(B, C, MultiAttributeData.builder().setMaxSpeed(100).build()); connC = Connection.create(C, D, MultiAttributeData.builder().setMaxSpeed(100).build()); connD = Connection.create(D, E, MultiAttributeData.builder().setMaxSpeed(100).build()); connCprime = Connection.create(Cprime, D, MultiAttributeData.builder().setLength(250).setMaxSpeed(100).build()); connDprime = Connection.create(Dprime, Cprime, MultiAttributeData.builder().setLength(250).setMaxSpeed(100).build()); connDD = Connection.create(D, Dprime, MultiAttributeData.builder().setLength(250).setMaxSpeed(100).build());
/** * Tests correct implementation of get length. */ @Test public void testGetLength() { final Point a = new Point(0, 0); final Point b = new Point(10, 0); assertEquals(10, Connection.create(a, b).getLength(), GraphRoadModelImpl.DELTA); final Connection<MultiAttributeData> conn = Connection.create(a, b, MultiAttributeData.builder() .setLength(12) .setMaxSpeed(1d) .build()); assertEquals(12, conn.getLength(), GraphRoadModelImpl.DELTA); final Connection<MultiAttributeData> conn2 = Connection.create(a, b, MultiAttributeData.builder() .setMaxSpeed(1d) .build()); assertEquals(10, conn2.getLength(), GraphRoadModelImpl.DELTA); } }
MultiAttributeData.builder() .setLength(0) .build()); simpleMAGraph.addConnection(b, c, MultiAttributeData.builder() .setMaxSpeed(10d) .build()); simpleMAGraph.addConnection(c, d, MultiAttributeData.builder() .addAttribute("key", "specialValue") .build()); MultiAttributeData.builder() .setLength(10d) .setMaxSpeed(100d)
@Test public void fastestPathSpeedLimitationTest() { final Graph<MultiAttributeData> attributeGraph = new TableGraph<>(); Point A, B, C; A = new Point(0, 0); B = new Point(0, 1); C = new Point(1, 0); attributeGraph.addConnection(A, B, MultiAttributeData.builder().setMaxSpeed(1).build()); attributeGraph.addConnection(A, C, MultiAttributeData.builder().setMaxSpeed(3).build()); final GeomHeuristic heuristic = GeomHeuristics.time(0d); assertEquals(1d, heuristic.calculateTravelTime(attributeGraph, A, B, SI.KILOMETER, Measure.valueOf(2d, NonSI.KILOMETERS_PER_HOUR), NonSI.HOUR), DELTA); assertEquals(0.5d, heuristic.calculateTravelTime(attributeGraph, A, C, SI.KILOMETER, Measure.valueOf(2d, NonSI.KILOMETERS_PER_HOUR), NonSI.HOUR), DELTA); }
@Test public void moveToHeuristicTest() { final MovingRoadUser fastestPathAgent = new SpeedyRoadUser(10); final MovingRoadUser shortestPathAgent = new SpeedyRoadUser(10); final Point origin = new Point(0, 0); final Point destination = new Point(0, 10); final Point midway = new Point(5, 5); // Graph with slow direct (shortest) route, but fast longer route. final Graph<MultiAttributeData> graph = new TableGraph<>(); graph.addConnection(origin, destination, MultiAttributeData.builder().setLength(10).setMaxSpeed(1).build()); graph.addConnection(origin, midway, MultiAttributeData.builder().setLength(10).setMaxSpeed(10).build()); graph.addConnection(midway, destination, MultiAttributeData.builder().setLength(10).setMaxSpeed(10).build()); final RoadModel moveModel = RoadModelBuilders.staticGraph(graph) .withDistanceUnit(SI.KILOMETER).withSpeedUnit(NonSI.KILOMETERS_PER_HOUR) .build(mock(DependencyProvider.class)); moveModel.addObjectAt(fastestPathAgent, origin); moveModel.addObjectAt(shortestPathAgent, origin); moveModel.moveTo(fastestPathAgent, destination, hour(1), GeomHeuristics.time(10)); moveModel.moveTo(shortestPathAgent, destination, hour(1), GeomHeuristics.euclidean()); // Agent chose speedy route assertEquals(midway, moveModel.getPosition(fastestPathAgent)); // Agent chose shortest route assertEquals(new Point(0, 1), moveModel.getPosition(shortestPathAgent)); }
@SuppressWarnings("unchecked") @Test public void getMaxSpeed() { final Point A = new Point(0, 0); final Point B = new Point(10, 0); final Graph<LengthData> g = new MultimapGraph<>(); final GraphRoadModelImpl rm = RoadModelBuilders.staticGraph(g).build( mock(DependencyProvider.class)); g.addConnection(A, B, LengthData.create(3)); final UnitConverter conv = NonSI.KILOMETERS_PER_HOUR .getConverterTo(RoadUnits.INTERNAL_SPEED_UNIT); assertEquals(conv.convert(10), rm.getMaxSpeed(new SpeedyRoadUser(10), A, B), EPSILON); ((Graph<MultiAttributeData>) graph).addConnection(SE, SW, MultiAttributeData.builder().setLength(3).setMaxSpeed(5d).build()); assertEquals(conv.convert(5), model.getMaxSpeed(new SpeedyRoadUser(10), SE, SW), EPSILON); ((Graph<MultiAttributeData>) graph).addConnection(NE, SE, MultiAttributeData.builder().setLength(3).build()); assertEquals(conv.convert(10), model.getMaxSpeed(new SpeedyRoadUser(10), NE, SE), EPSILON); }
for (int i = 1; i < allPoints.size(); i++) { for (int j = 0; j < i; j++) { final MultiAttributeData ma = MultiAttributeData.builder() .setMaxSpeed(0.1).build(); g.addConnection(allPoints.get(i), allPoints.get(j), ma);
EPSILON); ((Graph<MultiAttributeData>) graph).addConnection(SE, SW, MultiAttributeData.builder().setLength(5).setMaxSpeed(5d).build());