/** @syncpriority 170 */
  @Override
  public double getOpeningBid(String nodeId) {
    AuctionState as = getAuctionState(nodeId);
    Agorics ag = getAgorics(nodeId);
    List<ReceivedBid> bids = as.getBids();

    // We should never get here if our max is above their min, but check
    // just in case
    if (ag.getMinBid() > maxBid()) return 0;

    // If there are no bidders, just bid the minimum
    if (bids.size() == 0) return ag.getMinBid();

    return getPreferredBid(bids, ag.getIncrement());
  }
  /** @syncpriority 170 */
  @Override
  public double getAnsweringBid(String nodeId, BidUpdate bu) {
    AuctionState as = getAuctionState(nodeId);
    Agorics ag = getAgorics(nodeId);
    // The bid update is provided separately to the existing
    // auctionstate to allow a more advanced strategy to adjust its
    // decisions. We are dumb, so we just look at the bid update

    // If there are no bidders, just bid the minimum
    if (bu.getListenerIdCount() == 0) return ag.getMinBid();

    double myNewBid = getPreferredBid(cleanBids(bu), ag.getIncrement());
    if (myNewBid == as.getLastSentBid()) {
      // No bid
      return 0;
    }
    if (myNewBid < as.getLastSentBid()) {
      if (canReduceBid.get(nodeId)) {
        canReduceBid.put(nodeId, false);
        return myNewBid;
      }
      return 0;
    }
    return myNewBid;
  }