private void updateActualProfit(
      final Map<String, Double> actualProfits, final Trader trader, final Transaction transaction) {
    double profit;
    if (actualProfits.containsKey(trader.getId())) {
      profit = (actualProfits.get(trader.getId())).doubleValue();
    } else {
      profit = 0;
    }

    profit +=
        Math.abs(trader.getPrivateValue() - transaction.getPrice()) * transaction.getQuantity();
    actualProfits.put(trader.getId(), new Double(profit));
  }
  protected void calculateProfitDispersion() {
    // calculate actual profits of traders
    final Map<String, Double> actualProfits = new HashMap<String, Double>();
    if (transactions != null) {
      final Iterator<Transaction> i = transactions.iterator();
      while (i.hasNext()) {
        final Transaction transaction = i.next();
        updateActualProfit(actualProfits, transaction.getAsk().getTrader(), transaction);
        updateActualProfit(actualProfits, transaction.getBid().getTrader(), transaction);
      }
    }

    // calculate profit dispersion
    final CumulativeDistribution dist = new CumulativeDistribution();
    final Iterator<Trader> itor = traders.iterator();
    double theoProfit, actualProfit;
    while (itor.hasNext()) {
      final Trader trader = itor.next();
      if ((trader.isSeller() && (trader.getPrivateValue() <= equilibriumPrice))
          || (!trader.isSeller() && (trader.getPrivateValue() >= equilibriumPrice))) {
        theoProfit =
            Math.abs(trader.getPrivateValue() - equilibriumPrice) * trader.getEntitlement();
      } else {
        theoProfit = 0;
      }

      if (actualProfits.containsKey(trader.getId())) {
        actualProfit = actualProfits.get(trader.getId()).doubleValue();
      } else {
        actualProfit = 0;
      }

      dist.newData(Math.abs(theoProfit - actualProfit));
    }

    profitDispersion = dist.getStdDev(0);
  }