@Override
  public String toString() {
    Map<String, Object> m = new ListOrderedMap<String, Object>();
    m.put("Scale Factor", this.scale_factor);
    m.put("Loader Start", this.loaderStartTime);
    m.put("Loader Stop", this.loaderStopTime);
    m.put(
        "Last CloseAuctions",
        (this.lastCloseAuctionsTime.getTime() > 0 ? this.lastCloseAuctionsTime : null));
    m.put("Client Start", this.clientStartTime);
    m.put("Current Virtual Time", this.currentTime);
    m.put("Pending ItemCommentResponses", this.pending_commentResponses.size());

    // Item Queues
    Histogram<ItemStatus> itemCounts = new Histogram<ItemStatus>(true);
    for (ItemStatus status : ItemStatus.values()) {
      int cnt = 0;
      switch (status) {
        case OPEN:
          cnt = this.items_available.size();
          break;
        case ENDING_SOON:
          cnt = this.items_endingSoon.size();
          break;
        case WAITING_FOR_PURCHASE:
          cnt = this.items_waitingForPurchase.size();
          break;
        case CLOSED:
          cnt = this.items_completed.size();
          break;
        default:
          assert (false) : "Unexpected " + status;
      } // SWITCH
      itemCounts.put(status, cnt);
    }
    m.put("Item Queues", itemCounts);

    return (StringUtil.formatMaps(m));
  }
  /**
   * Get a random buyer UserId, where the probability that a particular user is selected increases
   * based on the number of bids that they have made in the past. We won't allow the last bidder to
   * be selected again
   *
   * @param previousBidders
   * @return
   */
  public UserId getRandomBuyerId(Histogram<UserId> previousBidders, UserId... exclude) {
    // This is very inefficient, but it's probably good enough for now
    tmp_userIdHistogram.clear();
    tmp_userIdHistogram.putHistogram(previousBidders);
    for (UserId ex : exclude) tmp_userIdHistogram.removeAll(ex);
    tmp_userIdHistogram.put(this.getRandomBuyerId(exclude));
    try {
      LOG.trace("New Histogram:\n" + tmp_userIdHistogram);
    } catch (NullPointerException ex) {
      for (UserId user_id : tmp_userIdHistogram.values()) {
        System.err.println(
            String.format(
                "%s => NEW:%s / ORIG:%s",
                user_id, tmp_userIdHistogram.get(user_id), previousBidders.get(user_id)));
      }
      throw ex;
    }

    FlatHistogram<UserId> rand_h = new FlatHistogram<UserId>(rng, tmp_userIdHistogram);
    return (rand_h.nextValue());
  }