private void eatEverythingAndRemoveQuotes() {
   int money =
       hasHowMany(market.getMoney()); // save the amount of money you have so you don't lose it
   consumeAll();
   if (money > 0) receiveMany(market.getMoney(), money); // retrieve the money you had before
   market.removeAllSellQuoteBySeller(this);
 }
  @Test
  public void testEmptyPricing() {
    // when there is nobody to search just go at random.
    PurchasesDepartment dept = mock(PurchasesDepartment.class);
    // search will always return null
    when(dept.getAvailableBudget()).thenReturn(100);
    when(dept.getGoodType()).thenReturn(UndifferentiatedGoodType.GENERIC);

    MersenneTwisterFast random = new MersenneTwisterFast(0);
    when(dept.getRandom()).thenReturn(random);
    // we need a stub market
    Market market = mock(Market.class);
    when(market.getLastPrice()).thenReturn(-1);
    when(dept.getMarket()).thenReturn(market);

    BidPricingStrategy pricing = new UrgentPriceFollowerStrategy(dept);
    for (int i = 0;
        i < 10000;
        i++) // because there is no last price in the market we get to randomize
    {
      int maxPrice = pricing.maxPrice(UndifferentiatedGoodType.GENERIC);
      assertTrue(maxPrice >= 0);
      assertTrue(maxPrice <= 100);
    }

    // there should be about 10% of the data in any decile
    int decile = 0;
    for (int i = 0; i < 10000; i++) {
      int maxPrice = pricing.maxPrice(UndifferentiatedGoodType.GENERIC);
      if (maxPrice >= 40 && maxPrice < 50) decile++;
    }
    assertTrue(decile >= 900 && decile <= 1100);
  }
  @Test
  public void testUrgencyStub() {
    // we are going to check that prices change when urgency chnge

    PurchasesDepartment dept = mock(PurchasesDepartment.class);
    when(dept.getGoodType()).thenReturn(UndifferentiatedGoodType.GENERIC);
    when(dept.getAvailableBudget()).thenReturn(100);
    MersenneTwisterFast random = new MersenneTwisterFast(0);
    when(dept.getRandom()).thenReturn(random);
    // we need a stub market
    Market market = mock(Market.class);
    when(market.getLastPrice()).thenReturn(50); // so last price is 50
    when(dept.getMarket()).thenReturn(market);
    BidPricingStrategy pricing = new UrgentPriceFollowerStrategy(dept);

    // give fake danger signal!
    when(dept.rateCurrentLevel()).thenReturn(Level.DANGER);
    for (int i = 0; i < 10; i++)
      assertEquals(pricing.maxPrice(UndifferentiatedGoodType.GENERIC), 60);

    // give fake barely signal!
    when(dept.rateCurrentLevel()).thenReturn(Level.BARELY);
    for (int i = 0; i < 10; i++)
      assertEquals(pricing.maxPrice(UndifferentiatedGoodType.GENERIC), 50);

    // give fake acceptable signal!
    when(dept.rateCurrentLevel()).thenReturn(Level.ACCEPTABLE);
    for (int i = 0; i < 10; i++)
      assertEquals(pricing.maxPrice(UndifferentiatedGoodType.GENERIC), 40);

    // give fake too much signal!
    when(dept.rateCurrentLevel()).thenReturn(Level.TOOMUCH);
    for (int i = 0; i < 10; i++)
      assertEquals(pricing.maxPrice(UndifferentiatedGoodType.GENERIC), 25);
  }
  /**
   * if it has anything to sell, the seller tries to sell one of its goods
   *
   * @param market
   */
  private void sellIfPossible(Market market) {
    GoodType typeSold = market.getGoodType();
    if (hasAny(typeSold)) {
      Good toSell = peekGood(typeSold);
      assert toSell != null;

      market.submitSellQuote(this, minPrice, toSell);
    }
  }
 private void createNewGoods(DailyGoodTree goodTree) {
   if (market.getGoodType().isDifferentiated()) {
     for (int i = 0; i < dailySupply; i++) {
       receive(
           Good.getInstanceOfDifferentiatedGood(market.getGoodType(), goodTree, minPrice), null);
     }
   } else {
     receiveMany((UndifferentiatedGoodType) market.getGoodType(), dailySupply);
   }
 }
  @Test
  public void testUrgencyFull() throws NoSuchFieldException, IllegalAccessException {
    // we are going to check that prices change when urgency change
    // the only stub is the market
    Market market = mock(Market.class);
    when(market.getLastPrice()).thenReturn(50); // so last price is 50
    model.schedule =
        mock(
            Schedule
                .class); // we also mock the schedule to avoid the inventory control from spamming
                         // buy orders in the schedule

    when(market.getGoodType()).thenReturn(UndifferentiatedGoodType.GENERIC);
    Firm f = new Firm(model);

    PurchasesDepartment dept =
        PurchasesDepartment.getPurchasesDepartment(
                100,
                f,
                market,
                FixedInventoryControl.class,
                UrgentPriceFollowerStrategy.class,
                null,
                null)
            .getDepartment();

    // when there is nobody to search just go at random.
    Field field = PurchasesDepartment.class.getDeclaredField("pricingStrategy");
    field.setAccessible(true);
    BidPricingStrategy pricing = (BidPricingStrategy) field.get(dept);

    // assuming the fixed inventory control wants 6

    // right now it's danger
    for (int i = 0; i < 10; i++)
      assertEquals(pricing.maxPrice(UndifferentiatedGoodType.GENERIC), 60);

    // barely
    for (int i = 0; i < 3; i++)
      f.receive(Good.getInstanceOfUndifferentiatedGood(UndifferentiatedGoodType.GENERIC), null);
    for (int i = 0; i < 10; i++)
      assertEquals(pricing.maxPrice(UndifferentiatedGoodType.GENERIC), 50);

    // acceptable
    for (int i = 0; i < 3; i++)
      f.receive(Good.getInstanceOfUndifferentiatedGood(UndifferentiatedGoodType.GENERIC), null);
    for (int i = 0; i < 10; i++)
      assertEquals(pricing.maxPrice(UndifferentiatedGoodType.GENERIC), 40);

    // too much
    for (int i = 0; i < 30; i++)
      f.receive(Good.getInstanceOfUndifferentiatedGood(UndifferentiatedGoodType.GENERIC), null);
    for (int i = 0; i < 10; i++)
      assertEquals(pricing.maxPrice(UndifferentiatedGoodType.GENERIC), 25);
  }
  public DailyGoodTree(MacroII model, int dailySupply, int minPrice, Market market) {
    super(model);
    Preconditions.checkArgument(minPrice >= 0);
    Preconditions.checkArgument(dailySupply > 0, "daily supply must be positive");
    this.minPrice = minPrice;
    this.market = market;
    this.dailySupply = dailySupply;
    market.registerSeller(this);

    startSteppables(model);
    name = market.getGoodType() + "Tree, price: " + minPrice;
  }
 @Override
 public void turnOff() {
   super.turnOff();
   assert !isActive();
   // remove all quotes
   eatEverythingAndRemoveQuotes();
   // deregister yourself
   market.deregisterSeller(this);
 }
  /**
   * Called by a buyer that wants to buy directly from this agent, not going through the market.
   *
   * @param buyerQuote the quote (including the offer price) of the buyer
   * @param sellerQuote the quote (including the offer price) of the seller; I expect the buyer to
   *     have achieved this through asked for an offer function
   * @return a purchaseResult including whether the trade was succesful and if so the final price
   */
  @Override
  public PurchaseResult shopHere(Quote buyerQuote, Quote sellerQuote) {
    int finalPrice = market.price(sellerQuote.getPriceQuoted(), buyerQuote.getPriceQuoted());
    assert sellerQuote.getGood() != null;
    assert this.has(sellerQuote.getGood());

    // exchange hostages
    market.trade(
        buyerQuote.getAgent(), this, sellerQuote.getGood(), finalPrice, buyerQuote, sellerQuote);
    this.logEvent(
        this,
        MarketEvents.SOLD,
        this.getModel().getCurrentSimulationTimeInMillis(),
        "price: " + finalPrice + ", through buyFromHere()"); // sold a good
    assert !this.has(sellerQuote.getGood());

    PurchaseResult toReturn = PurchaseResult.SUCCESS;
    toReturn.setPriceTrade(finalPrice);
    return toReturn;
  }
Esempio n. 10
0
 /** how "far" sales inventory are from target. */
 @Override
 public float estimateSupplyGap(GoodType type) {
   if (market == null) return 0;
   if (!soldToday && market.getLastPrice() >= saleQuote) return 1;
   else return 0;
 }
 public void setMinPrice(int minPrice) {
   this.minPrice = minPrice;
   name = market.getGoodType() + "Tree, price: " + minPrice;
 }