/** * @param time The time to check. * @return <code>true</code> when <code>time < {@link #begin}</code>, * <code>false</code> otherwise. */ public boolean isBeforeStart(long time) { return time < begin(); }
/** * @param time The time to check. * @return <code>true</code> when <code>time >= {@link #begin}</code>, * <code>false</code> otherwise. */ public boolean isAfterStart(long time) { return time >= begin(); }
long begin() { return tw.begin(); }
public long computeServiceStartTime(long timeOfArrival) { return Math.max(timeWindow.begin(), timeOfArrival); }
/** * @return The length of the time window: <code>{@link #end} - * {@link #begin}</code>. */ public long length() { return end() - begin(); }
@Override public String toString() { return MoreObjects.toStringHelper("LoadPart").add("begin", tw.begin()) .add("end", tw.end()).add("load", load).toString(); } }
/** * @return A new parcel data transfer object ({@link ParcelDTO}). */ public ParcelDTO buildDTO() { checkArgument(orderAnnounceTime <= pickupTimeWindow.begin(), "Order arrival time may not be after the pickup TW has already " + "opened."); return new AutoValue_ParcelDTO(pickupLocation, deliveryLocation, pickupTimeWindow, deliveryTimeWindow, neededCapacity, orderAnnounceTime, pickupDuration, deliveryDuration); }
@Override public boolean equals(Object o) { if (o == this) { return true; } if (o instanceof TimeWindow) { TimeWindow that = (TimeWindow) o; return (this.begin == that.begin()) && (this.end == that.end()); } return false; }
@Override public void write(@Nullable JsonWriter writer, @Nullable TimeWindow value) throws IOException { if (writer == null) { return; } if (value == null) { writer.nullValue(); return; } final String xy = value.begin() + VALUE_SEPARATOR + value.end(); writer.value(xy); } }
@Override public void write(@Nullable JsonWriter writer, @Nullable TimeWindow value) throws IOException { if (writer == null) { return; } if (value == null) { writer.nullValue(); return; } final String xy = value.begin() + VALUE_SEPARATOR + value.end(); writer.value(xy); } }
static int[] convertTW(TimeWindow tw, long time, UnitConverter timeConverter) { final int releaseDate = fixTWstart(tw.begin(), time, timeConverter); final int dueDate = fixTWend(tw.end(), time, timeConverter); if (releaseDate > dueDate) { // if this happens, we know this is the result of rounding behavior: // release is rounded up, due is rounded down. We also know that the // difference is only 1. Therefore we flip the values. checkArgument(Math.abs(dueDate - releaseDate) == 1); return new int[] {dueDate, releaseDate}; } return new int[] {releaseDate, dueDate}; }
static TimeWindow msToNs(TimeWindow tw) { if (tw.equals(TimeWindow.always())) { return TimeWindow.always(); } return TimeWindow.create(msToNs(tw.begin()), msToNs(tw.end())); }
@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)); } } }
static Builder create(Scenario scen) { final int ticks = scen.getTimeWindow().end() == Long.MAX_VALUE ? -1 : (int) (scen.getTimeWindow().end() - scen.getTimeWindow().begin()); return create( scen, ImmutableMap.<Class<? extends TimedEvent>, TimedEventHandler<?>>of(), ticks, StopModelBuilder.create(scen.getStopCondition()), false); }
static Builder create(Scenario scen) { final int ticks = scen.getTimeWindow().end() == Long.MAX_VALUE ? -1 : (int) (scen.getTimeWindow().end() - scen.getTimeWindow().begin()); return create( scen, ImmutableMap.<Class<? extends TimedEvent>, TimedEventHandler<?>>of(), ticks, StopModelBuilder.create(scen.getStopCondition()), false); }
void drawParcel(ParcelInfo p, int y) { final TimeWindow pi = p.parcel.getPickupTimeWindow(); final TimeWindow de = p.parcel.getDeliveryTimeWindow(); final int startX = (int) (p.eventTime / TIME_PER_PIXEL); final int startPickX = (int) (pi.begin() / TIME_PER_PIXEL); final int endPickX = (int) (pi.end() / TIME_PER_PIXEL); final int startDelX = (int) (de.begin() / TIME_PER_PIXEL); final int endDelX = (int) (de.end() / TIME_PER_PIXEL); final GC gc = new GC(contents.get()); gc.setForeground(lineColor); gc.drawLine(startX, y + BAR_START_OFFSET_Y, startX, y + BAR_END_OFFSET_Y); gc.drawLine(startX, y + BAR_MIDDLE_OFFSET_Y, startPickX, y + BAR_MIDDLE_OFFSET_Y); gc.setBackground(pickupColor); gc.fillRectangle(startPickX, y + 2, Math.max(endPickX - startPickX, 1), HALF_BAR_H); gc.drawRectangle(startPickX, y + 2, Math.max(endPickX - startPickX, 1), HALF_BAR_H); gc.drawLine(endPickX, y + BAR_MIDDLE_OFFSET_Y, startDelX, y + BAR_MIDDLE_OFFSET_Y); gc.setBackground(deliveryColor); gc.fillRectangle(startDelX, y + BAR_MIDDLE_OFFSET_Y, Math.max(endDelX - startDelX, 1), HALF_BAR_H); gc.drawRectangle(startDelX, y + BAR_MIDDLE_OFFSET_Y, Math.max(endDelX - startDelX, 1), HALF_BAR_H); gc.dispose(); }
void drawParcel(ParcelInfo p, int y) { final TimeWindow pi = p.parcel.getPickupTimeWindow(); final TimeWindow de = p.parcel.getDeliveryTimeWindow(); final int startX = (int) (p.eventTime / TIME_PER_PIXEL); final int startPickX = (int) (pi.begin() / TIME_PER_PIXEL); final int endPickX = (int) (pi.end() / TIME_PER_PIXEL); final int startDelX = (int) (de.begin() / TIME_PER_PIXEL); final int endDelX = (int) (de.end() / TIME_PER_PIXEL); final GC gc = new GC(contents.get()); gc.setForeground(lineColor); gc.drawLine(startX, y + BAR_START_OFFSET_Y, startX, y + BAR_END_OFFSET_Y); gc.drawLine(startX, y + BAR_MIDDLE_OFFSET_Y, startPickX, y + BAR_MIDDLE_OFFSET_Y); gc.setBackground(pickupColor); gc.fillRectangle(startPickX, y + 2, Math.max(endPickX - startPickX, 1), HALF_BAR_H); gc.drawRectangle(startPickX, y + 2, Math.max(endPickX - startPickX, 1), HALF_BAR_H); gc.drawLine(endPickX, y + BAR_MIDDLE_OFFSET_Y, startDelX, y + BAR_MIDDLE_OFFSET_Y); gc.setBackground(deliveryColor); gc.fillRectangle(startDelX, y + BAR_MIDDLE_OFFSET_Y, Math.max(endDelX - startDelX, 1), HALF_BAR_H); gc.drawRectangle(startDelX, y + BAR_MIDDLE_OFFSET_Y, Math.max(endDelX - startDelX, 1), HALF_BAR_H); gc.dispose(); }
.getDeliveryLocation(); final long travelTime = computeTravelTimeTo(loc, time.getTimeUnit()); final long openingTime = isPickup ? p.getPickupTimeWindow().begin() : p .getDeliveryTimeWindow().begin(); final long latestTimeToLeave = openingTime - travelTime; return latestTimeToLeave >= time.getEndTime();
static void checkParcelTWStrictness(AddParcelEvent event, TravelTimes travelTimes) { final long firstDepartureTime = event.getParcelDTO() .getPickupTimeWindow().begin() + event.getParcelDTO().getPickupDuration(); final long latestDepartureTime = event.getParcelDTO() .getPickupTimeWindow().end() + event.getParcelDTO().getPickupDuration(); final double travelTime = travelTimes.getShortestTravelTime( event.getParcelDTO().getPickupLocation(), event.getParcelDTO().getDeliveryLocation()); checkArgument( event.getParcelDTO().getDeliveryTimeWindow().begin() >= firstDepartureTime + travelTime, "The begin of the delivery time window (%s) is too early, " + "should be >= %s.", event.getParcelDTO().getDeliveryTimeWindow(), firstDepartureTime + travelTime); checkArgument( latestDepartureTime + travelTime <= event.getParcelDTO() .getDeliveryTimeWindow().end(), "The end of the pickup time window %s is too late, or end of delivery " + "is too early.", event.getParcelDTO().getPickupTimeWindow().end()); }