/* (non-Javadoc) * @see jmab.strategies.DividendsStrategy#payDividends() */ @Override public void payDividends() { MacroAgent dividendPayer = (MacroAgent) this.agent; double profits = dividendPayer.getPassedValue(profitsLagId, 0); if (profits > 0) { Population receivers = ((MacroPopulation) ((SimulationController) this.scheduler).getPopulation()) .getPopulation(receiversId); double totalNW = 0; for (Agent receiver : receivers.getAgents()) { totalNW += ((MacroAgent) receiver).getNetWealth(); } if (dividendPayer instanceof Bank) { Deposit payerDep = (Deposit) dividendPayer.getItemStockMatrix(true, reservesId); // if(profits>payerDep.getValue()){ // profits=payerDep.getValue(); // } Bank bank = (Bank) dividendPayer; bank.setDividends(profits * profitShare); for (Agent rec : receivers.getAgents()) { Households receiver = (Households) rec; double nw = receiver.getNetWealth(); Deposit recDep = (Deposit) receiver.getItemStockMatrix(true, depositId); double toPay = profits * profitShare * nw / totalNW; recDep.setValue(recDep.getValue() + toPay); payerDep.setValue(payerDep.getValue() - toPay); Deposit otherBankReserves = (Deposit) ((Bank) recDep.getLiabilityHolder()).getItemStockMatrix(true, reservesId); otherBankReserves.setValue(otherBankReserves.getValue() + toPay); receiver.setDividendsReceived(receiver.getDividendsReceived() + toPay); } } else { if (dividendPayer.getItemStockMatrix(true, depositId).getValue() > profits * profitShare) { Deposit payerDep = (Deposit) dividendPayer.getItemStockMatrix(true, depositId); if (profits > payerDep.getValue()) { profits = payerDep.getValue(); } AbstractFirm firm = (AbstractFirm) dividendPayer; firm.setDividends(profits * profitShare); for (Agent rec : receivers.getAgents()) { Households receiver = (Households) rec; double nw = receiver.getNetWealth(); double toPay = profits * profitShare * nw / totalNW; Deposit recDep = (Deposit) receiver.getItemStockMatrix(true, depositId); ((Bank) payerDep.getLiabilityHolder()).transfer(payerDep, recDep, toPay); receiver.setDividendsReceived(receiver.getDividendsReceived() + toPay); } } } } }