@Override public void renderDynamic(GC gc, ViewPort vp, long time) { uiSchema.initialize(gc.getDevice()); final Collection<Parcel> parcels = pdpModel.getParcels( ParcelState.values()); final Image image = uiSchema.getImage(Box.class); checkState(image != null); synchronized (pdpModel) { final Set<Vehicle> vehicles = pdpModel.getVehicles(); final Map<Parcel, Vehicle> mapping = new LinkedHashMap<>(); for (final Vehicle v : vehicles) { for (final Parcel p : pdpModel.getContents(v)) { mapping.put(p, v); } if (pdpModel.getVehicleState(v) != VehicleState.IDLE) { final PDPModel.VehicleParcelActionInfo vpai = pdpModel .getVehicleActionInfo(v); mapping.put(vpai.getParcel(), vpai.getVehicle()); } } for (final Parcel p : parcels) { drawBox(p, gc, vp, time, image, mapping); } } }
@Override public void unclaim(Parcel p) { LOGGER.info("{} unclaim {}", this, p); checkArgument(claimedParcels.contains(p), "Can not unclaim %s because it is not claimed.", p); // check that parcel is still assignable to another bidder checkArgument( // it may be available or announced pdpModel.get().getParcelState(p) == ParcelState.AVAILABLE || pdpModel.get().getParcelState(p) == ParcelState.ANNOUNCED // otherwise, we must make sure that 'our' vehicle is not servicing it // i.e. if our vehicle is idle: || pdpModel.get().getVehicleState(vehicle.get()) == VehicleState.IDLE // or, if our vehicle is not idle, that it is not servicing the parcel // we are trying to get rid of: || pdpModel.get().getVehicleActionInfo(vehicle.get()).getParcel() != p, "%s: Parcel (%s) can not be unclaimed because it is being serviced.", this, p, pdpModel.get().getParcelState(p)); claimedParcels.remove(p); }
@Override public EventAPI getEventAPI() { return delegate.getEventAPI(); }
boolean isPickingUp(Parcel p) { return getPDPModel().getVehicleState(this) == VehicleState.PICKING_UP && getPDPModel().getVehicleActionInfo(this).getParcel().equals(p); }
.speed(1.0) .build()); model.register(pack1); model.register(truck); rm.register(pack1); rm.register(truck); assertEquals(0, model.getContentsSize(truck), EPSILON); assertTrue(model.getContents(truck).isEmpty()); assertEquals(ParcelState.AVAILABLE, model.getParcelState(pack1)); assertEquals(VehicleState.IDLE, model.getVehicleState(truck)); model.pickup(truck, pack1, TimeLapseFactory.create(0, 10000)); assertEquals(ParcelState.IN_CARGO, model.getParcelState(pack1)); assertEquals(VehicleState.IDLE, model.getVehicleState(truck)); assertTrue(model.containerContains(truck, pack1)); assertEquals(2, model.getContentsSize(truck), EPSILON); assertTrue(model.getContents(truck).contains(pack1)); assertEquals(1, model.getContents(truck).size()); .neededCapacity(2d) .build(); model.register(pack2); rm.register(pack2); assertEquals(ParcelState.AVAILABLE, model.getParcelState(pack2)); assertEquals(VehicleState.IDLE, model.getVehicleState(truck)); model.pickup(truck, pack2, TimeLapseFactory.create(0, 40)); assertFalse(rm.containsObject(pack2));
@Override protected void doUpdate(Set<Parcel> onMap, long time) { if (onMap.isEmpty() && pdpModel.get().getContents(vehicle.get()).isEmpty()) { route.clear(); } else { LOGGER.info("vehicle {}", pdpModel.get().getVehicleState(vehicle.get())); if (pdpModel.get().getVehicleState(vehicle.get()) != VehicleState.IDLE) { LOGGER.info("parcel {} {}", pdpModel.get().getVehicleActionInfo(vehicle.get()) .getParcel(), pdpModel.get().getParcelState( pdpModel.get().getVehicleActionInfo(vehicle.get()) .getParcel())); LOGGER.info("{}", pdpModel.get().getVehicleState(vehicle.get())); dispatchChangeEvent();
.build()); rm.register(truck); model.register(truck); final Parcel pack1 = Parcel.builder(new Point(1, 1), new Point(2, 2)) .pickupDuration(10) .build(); rm.register(pack1); model.register(pack1); assertTrue(rm.equalPosition(truck, pack1)); assertEquals(ParcelState.AVAILABLE, model.getParcelState(pack1)); assertEquals(VehicleState.IDLE, model.getVehicleState(truck)); assertEquals(newHashSet(pack1), model.getParcels(ParcelState.AVAILABLE)); model.pickup(truck, pack1, TimeLapseFactory.create(0, 100)); assertEquals(ParcelState.IN_CARGO, model.getParcelState(pack1)); assertEquals(VehicleState.IDLE, model.getVehicleState(truck)); assertTrue(model.getParcels(ParcelState.AVAILABLE).isEmpty()); model.deliver(truck, pack1, TimeLapseFactory.create(0, 8)); assertEquals(ParcelState.DELIVERING, model.getParcelState(pack1)); assertEquals(VehicleState.DELIVERING, model.getVehicleState(truck)); model.continuePreviousActions(truck, tl); assertEquals(ParcelState.DELIVERED, model.getParcelState(pack1)); assertEquals(VehicleState.IDLE, model.getVehicleState(truck)); assertEquals(8, tl.getTimeLeft()); .build();
&& pm.getVehicleState(this) == VehicleState.IDLE) { pm.deliver(this, delivery, time); } else { rm.moveTo(this, delivery.getDeliveryLocation(), time); getPosition()) < DISTANCE_THRESHOLD_KM) { if (rm.equalPosition(closest, this) && pm.getTimeWindowPolicy().canPickup(closest.getPickupTimeWindow(), time.getTime(), closest.getPickupDuration())) { final double newSize = getPDPModel().getContentsSize(this) + closest.getNeededCapacity(); pm.pickup(this, closest, time);
@Override public boolean apply(@Nullable RoadUser input) { return input instanceof Parcel && pm.getParcelState((Parcel) input) == ParcelState.AVAILABLE; } });
while (time.hasTimeLeft()) { final Set<Parcel> parcels = newHashSet(pdpModel .getParcels(ParcelState.AVAILABLE)); if (!pdpModel.getContents(vehicle).isEmpty()) { parcels.addAll(pdpModel.getContents(vehicle)); Parcel closest = null; for (final Parcel p : parcels) { final Point pos = pdpModel.containerContains(vehicle, p) ? p .getDeliveryLocation() : roadModel.getPosition(p); final double d = Point.distance(roadModel.getPosition(vehicle), pos); roadModel.moveTo(vehicle, closest, time); if (roadModel.equalPosition(vehicle, closest)) { pdpModel.service(vehicle, closest, time);
getPDPModel().pickup(this, destination.get(), time); } else if (getPDPModel().getContents(this).contains(destination.get())) { if (getRoadModel().getPosition(this) .equals(destination.get().getDeliveryLocation())) { getPDPModel().deliver(this, destination.get(), time); destination = Optional.absent(); } else {
if (pm.get().containerContains(this, target.get())) { if (rm.get().getPosition(this) .equals(target.get().getDeliveryLocation())) { pm.get().deliver(this, target.get(), time); } else { rm.get().moveTo(this, target.get().getDeliveryLocation(), time); if (pm.get().getParcelState(target.get()) != ParcelState.AVAILABLE) { pm.get().pickup(this, target.get(), time); } else { rm.get().moveTo(this, target.get(), time);
final ParcelState parcelState = getPDPModel().getParcelState(p); checkArgument( !parcelState.isTransitionState() && !parcelState.isDelivered(), + "it is %s.", parcelState, parcelState.isTransitionState() ? getPDPModel() .getVehicleActionInfo(this).timeNeeded() : null); final boolean isPickup = !parcelState.isPickedUp();
final boolean inCargo = pm.containerContains(this, curr.get()); if (rm.getPosition(this).equals(curr.get().getDeliveryLocation())) { pm.deliver(this, curr.get(), time); if (rm.equalPosition(this, curr.get())) { pm.pickup(this, curr.get(), time);
@Test(expected = IllegalArgumentException.class) public void testDeliverFail4() { final Vehicle truck = new TestVehicle( VehicleDTO.builder().startPosition(new Point(1, 1)).build()); rm.register(truck); model.register(truck); final Parcel pack1 = Parcel.builder(new Point(1, 1), new Point(2, 2)) .pickupDuration(10) .deliveryDuration(10) .neededCapacity(2d) .build(); rm.register(pack1); model.register(pack1); rm.addObjectAtSamePosition(pack1, truck); model.pickup(truck, pack1, TimeLapseFactory.create(0, 10)); assertTrue(model.getContents(truck).contains(pack1)); model.deliver(truck, pack1, TimeLapseFactory.create(0, 1)); }
@Test(expected = IllegalArgumentException.class) public void testDeliverFail2() { final Vehicle truck = new TestVehicle( VehicleDTO.builder().startPosition(new Point(1, 1)).build()); rm.register(truck); model.register(truck); final Parcel pack1 = Parcel.builder(new Point(1, 1), new Point(2, 2)) .pickupDuration(10) .deliveryDuration(10) .neededCapacity(2d) .build(); rm.register(pack1); model.register(pack1); rm.addObjectAtSamePosition(pack1, truck); model.pickup(truck, pack1, TimeLapseFactory.create(0, 1)); assertEquals(VehicleState.PICKING_UP, model.getVehicleState(truck)); model.deliver(truck, pack1, TimeLapseFactory.create(0, 1)); }
pm.register(dp1); assertEquals(dp1, rm.getDestinationToParcel(dv1)); pm.pickup(dv1, dp1, time(1)); assertEquals(ParcelState.PICKING_UP, pm.getParcelState(dp1)); dv1.tick(time(1)); assertEquals(ParcelState.IN_CARGO, pm.getParcelState(dp1)); pm.deliver(dv1, dp1, time(1)); assertNull(rm.getDestinationToParcel(dv1)); assertEquals(ParcelState.AVAILABLE, pm.getParcelState(dp2)); rm.moveTo(dv1, dp2, time(50)); assertEquals(dp2, rm.getDestinationToParcel(dv1));
@Test public void testDelayedPickup() { final Parcel pack1 = Parcel.builder(new Point(1, 1), new Point(2, 2)) .serviceDuration(10L) .neededCapacity(2d) .build(); final Vehicle truck = new TestVehicle( VehicleDTO.builder() .startPosition(new Point(1, 1)) .capacity(10) .speed(1.0) .build()); model.register(pack1); model.register(truck); rm.register(pack1); rm.register(truck); model.pickup(truck, pack1, TimeLapseFactory.create(0, 1)); assertTrue(model.getContents(truck).isEmpty()); assertEquals(model.getContentsSize(truck), 0, EPSILON); truck.tick(TimeLapseFactory.create(1, 10)); assertFalse(model.getContents(truck).isEmpty()); assertTrue(model.getContents(truck).contains(pack1)); assertEquals(model.getContentsSize(truck), 2, EPSILON); }
@Test public void addPackageIn() { assertTrue(model.getParcels(ParcelState.AVAILABLE).isEmpty()); final Depot d = new TestDepot(10); final Parcel p1 = Parcel.builder(new Point(0, 0), new Point(0, 0)) .neededCapacity(1d) .build(); model.register(d); model.register(p1); rm.addObjectAt(d, new Point(0, 0)); model.addParcelIn(d, p1); assertEquals(1, model.getContents(d).size()); assertTrue(model.getContents(d).contains(p1)); }
if (type == DestType.DELIVERY) { checkArgument( pdpModel.get().containerContains((Vehicle) object, (Parcel) destinationRoadUser), "A vehicle can only move to the delivery location of a parcel if it" pdpModel.get().getParcelState( (Parcel) prev.roadUser()) != ParcelState.AVAILABLE, "Can not move away before the parcel has been picked up: %s.", prev.roadUser()); checkArgument( pdpModel.get().getParcelState( (Parcel) prev.roadUser()) == ParcelState.DELIVERED, "The parcel needs to be delivered before moving away: %s.",