public static <C, V> CategoryMap<C, V> create() { return new CategoryMap<C, V>(); }
public CategoryMap() { valueCategoryMap = createMap(); categoryValueMultiMap = createMultimap(); }
@Override public Collection<Parcel> getParcels(ParcelState state) { synchronized (this) { return parcelState.get(state); } }
@Override public void addParcelIn(Container container, Parcel parcel) { synchronized (this) { /* 1 */checkArgument(!roadModel.containsObject(parcel), "this parcel is already added to the roadmodel"); /* 2 */checkArgument( parcelState.getKeys(parcel) == ParcelState.AVAILABLE, "parcel must be registered and in AVAILABLE state, current state: %s", parcelState.getKeys(parcel)); /* 3 */checkArgument(containerCapacities.containsKey(container), "the parcel container is not registered"); /* 4 */checkArgument(roadModel.containsObject(container), "the parcel container is not on the roadmodel"); final double newSize = containerContentsSize.get(container) + parcel.getNeededCapacity(); /* 5 */checkArgument( newSize <= containerCapacities.get(container), "parcel does not fit in container. Capacity is %s, current content " + "size is %s, new parcel size is %s", containerCapacities.get(container), containerContentsSize.get(container), parcel.getNeededCapacity()); containerContents.put(container, parcel); containerContentsSize.put(container, newSize); parcelState.put(ParcelState.IN_CARGO, parcel); } }
/** * The actual delivery of the specified {@link Parcel} by the specified * {@link Vehicle}. * * @param vehicle The {@link Vehicle} that performs the delivery. * @param parcel The {@link Parcel} that is delivered. * @param time The current time. */ protected void doDeliver(Vehicle vehicle, Parcel parcel, long time) { synchronized (this) { containerContents.remove(vehicle, parcel); containerContentsSize.put(vehicle, containerContentsSize.get(vehicle) - parcel.getNeededCapacity()); parcelState.put(ParcelState.DELIVERED, parcel); LOGGER.info("{} end delivery of {} by {}", time, parcel, vehicle); eventDispatcher.dispatchEvent(new PDPModelEvent( PDPModelEventType.END_DELIVERY, self, time, parcel, vehicle)); } }
@Override public void tick(TimeLapse timeLapse) { synchronized (this) { // TODO this can be optimized by scheduling events upon registering currentTime = timeLapse.getStartTime(); final Collection<Parcel> parcels = parcelState.get(ParcelState.ANNOUNCED); final List<Parcel> newAvailables = newArrayList(); for (final Parcel p : parcels) { if (timeLapse.getStartTime() >= p.getPickupTimeWindow().begin()) { newAvailables.add(p); } } for (final Parcel p : newAvailables) { parcelState.put(ParcelState.AVAILABLE, p); eventDispatcher.dispatchEvent(new PDPModelEvent( PDPModelEventType.PARCEL_AVAILABLE, self, currentTime, p, null)); } } }
LOGGER.info("{} register {}", currentTime, element); if (element.getType() == PDPType.PARCEL) { checkArgument(!parcelState.containsValue(element)); final Parcel p = (Parcel) element; final ParcelState state = currentTime < p.getPickupTimeWindow().begin() : ParcelState.AVAILABLE; synchronized (this) { parcelState.put(state, (Parcel) element);
/** * Initializes the PDPModel. * @param twp The {@link TimeWindowPolicy} which is used in the model. */ DefaultPDPModel(RoadModel rm, TimeWindowPolicy twp) { timeWindowPolicy = twp; containerContents = LinkedHashMultimap.create(); containerContentsSize = newLinkedHashMap(); containerCapacities = newLinkedHashMap(); pendingVehicleActions = newLinkedHashMap(); vehicleState = newLinkedHashMap(); parcelState = CategoryMap.create(); eventDispatcher = new EventDispatcher(PDPModelEventType.values()); roadModel = rm; }
@Override public ParcelState getParcelState(Parcel parcel) { synchronized (this) { return parcelState.getKeys(parcel); } }
@Override public Collection<Parcel> getParcels(ParcelState... states) { synchronized (this) { return parcelState.getMultiple(states); } }
@Override public boolean unregister(PDPObject element) { synchronized (this) { LOGGER.info("unregister {}", element); if (element instanceof Container) { containerCapacities.remove(element); containerContentsSize.remove(element); containerContents.removeAll(element); } if (element instanceof Parcel) { parcelState.removeValue((Parcel) element); } if (element instanceof Vehicle) { vehicleState.remove(element); pendingVehicleActions.remove(element); } } return true; }
/** * Actual pickup, updates the {@link Vehicle} contents. * * @param vehicle The {@link Vehicle} that performs the pickup. * @param parcel The {@link Parcel} that is picked up. * @param time The current time. * @see #pickup(Vehicle, Parcel, TimeLapse) */ protected void doPickup(Vehicle vehicle, Parcel parcel, long time) { synchronized (this) { containerContents.put(vehicle, parcel); containerContentsSize.put(vehicle, containerContentsSize.get(vehicle) + parcel.getNeededCapacity()); parcelState.put(ParcelState.IN_CARGO, parcel); LOGGER.info("{} end pickup of {} by {}", time, parcel, vehicle); eventDispatcher.dispatchEvent(new PDPModelEvent( PDPModelEventType.END_PICKUP, self, time, parcel, vehicle)); } }
CollisionGraphRoadModelImpl(ListenableGraph<?> g, double pMinConnLength, RoadModelBuilders.CollisionGraphRMB builder) { super(g, builder); vehicleLength = unitConversion.toInDist(builder.getVehicleLength()); minDistance = unitConversion.toInDist(builder.getMinDistance()); minConnLength = unitConversion.toInDist(pMinConnLength); occupiedNodes = Multimaps.synchronizedSetMultimap(CategoryMap .<MovingRoadUser, Point>create()); getGraph().getEventAPI().addListener( new ModificationChecker(minConnLength), ListenableGraph.EventTypes.ADD_CONNECTION, ListenableGraph.EventTypes.CHANGE_CONNECTION_DATA); }
/** * The actual dropping of the specified {@link Parcel} by the specified * {@link Vehicle}. * * @param vehicle The {@link Vehicle} that performs the dropping. * @param parcel The {@link Parcel} that is dropped. * @param time The current time. */ protected void doDrop(Vehicle vehicle, Parcel parcel, long time) { synchronized (this) { containerContents.remove(vehicle, parcel); containerContentsSize.put(vehicle, containerContentsSize.get(vehicle) - parcel.getNeededCapacity()); roadModel.addObjectAtSamePosition(parcel, vehicle); parcelState.put(ParcelState.AVAILABLE, parcel); LOGGER.info("{} dropped {} by {}", time, parcel, vehicle); eventDispatcher.dispatchEvent(new PDPModelEvent( PDPModelEventType.PARCEL_AVAILABLE, self, time, parcel, null)); } }
@Override public void drop(Vehicle vehicle, Parcel parcel, TimeLapse time) { synchronized (this) { /* 1 */checkVehicleInRoadModel(vehicle); /* 2 */checkVehicleIdle(vehicle); /* 3 */checkVehicleDoesNotContainParcel(vehicle, parcel); eventDispatcher.dispatchEvent(new PDPModelEvent( PDPModelEventType.START_DELIVERY, self, time.getTime(), parcel, vehicle)); if (time.getTimeLeft() < parcel.getDeliveryDuration()) { vehicleState.put(vehicle, VehicleState.DELIVERING); parcelState.put(ParcelState.DELIVERING, parcel); pendingVehicleActions.put(vehicle, new DropAction(this, vehicle, parcel, parcel.getDeliveryDuration() - time.getTimeLeft())); time.consumeAll(); } else { time.consume(parcel.getDeliveryDuration()); doDrop(vehicle, parcel, time.getTime()); } } }
if (time.getTimeLeft() < parcel.getDeliveryDuration()) { vehicleState.put(vehicle, VehicleState.DELIVERING); parcelState.put(ParcelState.DELIVERING, parcel); pendingVehicleActions.put(vehicle, new DeliverAction(this, vehicle, parcel, parcel.getDeliveryDuration() - time.getTimeLeft()));