| package name.milesparker.markets; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.Collections; |
| |
| import org.eclipse.core.runtime.IAdapterFactory; |
| import org.eclipse.amp.agf.IGraphicsAdapted; |
| import org.eclipse.amp.agf.IGraphicsAdapter; |
| |
| import org.eclipse.swt.graphics.Color; |
| import org.eclipse.jface.viewers.IColorProvider; |
| |
| import org.ascape.model.Agent; |
| import org.ascape.model.Cell; |
| import org.ascape.model.CellOccupant; |
| import org.ascape.model.HostCell; |
| import org.ascape.model.LocatedAgent; |
| import org.ascape.model.Scape; |
| import org.ascape.model.event.ScapeEvent; |
| import org.ascape.model.rule.Rule; |
| import org.ascape.model.rule.ExecuteThenUpdate; |
| import org.ascape.model.space.CollectionSpace; |
| import org.ascape.model.space.Coordinate; |
| import org.ascape.model.space.Coordinate2DDiscrete; |
| import org.ascape.model.space.Graph; |
| import org.ascape.model.space.Location; |
| import org.ascape.model.space.Singleton; |
| import org.ascape.runtime.NonGraphicRunner; |
| import org.ascape.util.Conditional; |
| import org.ascape.util.data.DataPoint; |
| import org.ascape.util.data.DataPointConcrete; |
| import org.ascape.util.vis.ColorFeature; |
| import org.ascape.util.vis.ColorFeatureConcrete; |
| import org.ascape.view.vis.ChartView; |
| import org.ascape.view.vis.GEFView; |
| import org.ascape.view.vis.GraphView; |
| |
| import org.eclipse.amp.escape.runtime.extension.IAgentChild; |
| |
| /** |
| * <!-- begin-user-doc --> |
| * Trader Java Implementation. |
| * |
| * Generated by AMF for model: Markets.metaabm in project: org.eclipse.amp.amf.examples.escape |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public class Trader extends CellOccupant { |
| |
| /** |
| * <!-- begin-user-doc --> |
| * |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| private StrategyEnum strategy = StrategyEnum.random; |
| /** |
| * <!-- begin-user-doc --> |
| * |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| private double funds = 100000; |
| /** |
| * <!-- begin-user-doc --> |
| * |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| private int instrumentCount = 0; |
| |
| /** |
| * <!-- begin-user-doc --> |
| * |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| private List<IAgentChild> children; |
| |
| /** |
| * <!-- begin-user-doc --> |
| * |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public List<IAgentChild> getChildren() { |
| return children; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * Constructs a new Trader. |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public Trader() { |
| |
| children = new ArrayList<IAgentChild>(); |
| |
| } |
| //todo, make this a useful value for evaluating compatibility of different versions of generated classes |
| |
| /** |
| * <!-- begin-user-doc --> |
| * |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| private static final long serialVersionUID = 89989998L; |
| |
| /** |
| * <!-- begin-user-doc --> |
| * |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| private static long nextUniqueID; |
| |
| /** |
| * <!-- begin-user-doc --> |
| * |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| private long uniqueID; |
| |
| /** |
| * <!-- begin-user-doc --> |
| * |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public long getUID() { |
| if (uniqueID == 0) { |
| uniqueID = nextUniqueID++; |
| } |
| return uniqueID; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * Clones the agent, ensuring that a unique id is assigned. |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public Object clone() { |
| try { |
| Trader clone = (Trader) super.clone(); |
| clone.uniqueID = 0; |
| return clone; |
| } catch (Exception e) { |
| throw new RuntimeException("Unexpected cloning exception: " + e); |
| } |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public Markets getMarkets() { |
| return (Markets) getScape().getScape(); |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public List getNetwork() { |
| List network = new ArrayList(); |
| network.addAll(((Graph) getMarkets().getTargetBuyFirms().getSpace()) |
| .getNeighborsFor(this)); |
| network.addAll(((Graph) getMarkets().getInstrumentHolders().getSpace()) |
| .getNeighborsFor(this)); |
| return network; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| |
| public void startSimulationAgentChild(int timeStep) { |
| if (timeStep == getRoot().getRunner().getEarliestPeriod()) { |
| for (IAgentChild tmp : children) { |
| tmp.startSimulation(timeStep); |
| } |
| } |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| |
| public void calculateTimeStep(int timeStep) { |
| for (IAgentChild tmp : children) { |
| tmp.calculate(timeStep); |
| } |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * Initialize Initialization. Executed once at the beginning of each model run. |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public void intializeNonFramework() { |
| StrategyEnum randomState_Strategy_ = StrategyEnum.values()[randomToLimit(StrategyEnum |
| .values().length)]; |
| double initialTraderFunds = initialTraderFunds(); |
| setStrategy(randomState_Strategy_); |
| setFunds(initialTraderFunds); |
| } |
| /** |
| * <!-- begin-user-doc --> |
| * Ask Rule. Executed every period. |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public void ask() { |
| Instrument selling = (Instrument) ((org.ascape.model.space.Discrete) getMarkets() |
| .getInstrumentHolders().getSpace()).findRandomNeighbor(this); |
| if (selling != null) { |
| Firm instrumentFirm = (Firm) ((org.ascape.model.space.Discrete) selling |
| .getMarkets().getFirmInstruments().getSpace()) |
| .findRandomNeighbor(selling); |
| if (instrumentFirm != null) { |
| double sharePriceAdjustment = sharePriceAdjustment(); |
| double newSharePrice = sharePriceAdjustment |
| * instrumentFirm.getLastPrice(); |
| selling.setOfferPrice(newSharePrice); |
| selling.setStatus(StatusEnum.ask); |
| } |
| } |
| } |
| /** |
| * <!-- begin-user-doc --> |
| * Buy Rule. Executed every period. |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public void buy() { |
| |
| ((org.ascape.model.space.Graph) getMarkets().getTargetBuyFirms() |
| .getSpace()).clearNeighbors(this); |
| Firm offeredFirm = (Firm) getMarkets().getFirmScape().findRandom(); |
| if (offeredFirm != null) { |
| ((org.ascape.model.space.Graph) getMarkets().getTargetBuyFirms() |
| .getSpace()).addNeighborSafe(this, offeredFirm, false); |
| } |
| } |
| /** |
| * <!-- begin-user-doc --> |
| * Calculate Share Price Adjustment. |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public double sharePriceAdjustment() { |
| double sharePriceAdjustmentMinimum = getMarkets() |
| .getSharePriceAdjustmentMinimum(); |
| double sharePriceAdjustmentMaximum = getMarkets() |
| .getSharePriceAdjustmentMaximum(); |
| return randomInRange(sharePriceAdjustmentMinimum, |
| sharePriceAdjustmentMaximum); |
| } |
| /** |
| * <!-- begin-user-doc --> |
| * Calculate Initial Trader Funds. |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public double initialTraderFunds() { |
| double initialTraderFundsMinimum = getMarkets() |
| .getInitialTraderFundsMinimum(); |
| double initialTraderFundsMaximum = getMarkets() |
| .getInitialTraderFundsMaximum(); |
| return randomInRange(initialTraderFundsMinimum, |
| initialTraderFundsMaximum); |
| } |
| /** |
| * <!-- begin-user-doc --> |
| * Execute Rule. Executed every period. |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public void execute() { |
| Firm firm = (Firm) ((org.ascape.model.space.Discrete) getMarkets() |
| .getTargetBuyFirms().getSpace()).findRandomNeighbor(this); |
| if (firm != null) { |
| Instrument boughtInstrument = (Instrument) ((org.ascape.model.space.Discrete) firm |
| .getMarkets().getFirmInstruments().getSpace()) |
| .findRandomNeighbor(firm); |
| if (boughtInstrument != null) { |
| boughtInstrument.setStatus(StatusEnum.held); |
| double fundsSubtractTotalPrice = getFunds() |
| - boughtInstrument.getTotalPrice(); |
| setFunds(fundsSubtractTotalPrice); |
| double offerPriceAddZero = boughtInstrument.getOfferPrice() + 0; |
| firm.setLastPrice(offerPriceAddZero); |
| Trader seller = (Trader) ((org.ascape.model.space.Discrete) getMarkets() |
| .getInstrumentHolders().getSpace()) |
| .findRandomNeighbor(boughtInstrument); |
| if (seller != null) { |
| double fundsAddTotalPrice = seller.getFunds() |
| + boughtInstrument.getTotalPrice(); |
| seller.setFunds(fundsAddTotalPrice); |
| ((org.ascape.model.space.Graph) getMarkets() |
| .getInstrumentHolders().getSpace()) |
| .clearNeighbors(seller); |
| ((org.ascape.model.space.Graph) getMarkets() |
| .getInstrumentHolders().getSpace()) |
| .addNeighborSafe(this, boughtInstrument, false); |
| int incrementCount = getInstrumentCount() + 1; |
| setInstrumentCount(incrementCount); |
| int decrementSellerCount = seller.getInstrumentCount() - 1; |
| seller.setInstrumentCount(decrementSellerCount); |
| } |
| } |
| } |
| } |
| /** |
| * <!-- begin-user-doc --> |
| * Gets the Strategy property for Trader. |
| * @return |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public StrategyEnum getStrategy() { |
| return strategy; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * Sets the Strategy property for Trader. |
| * |
| * @param _strategy the new Strategy value |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public void setStrategy(StrategyEnum _strategy) { |
| strategy = _strategy; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * Gets the Funds property for Trader. |
| * @return |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public double getFunds() { |
| return funds; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * Sets the Funds property for Trader. |
| * |
| * @param _funds the new Funds value |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public void setFunds(double _funds) { |
| funds = _funds; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * Gets the Instrument Count property for Trader. |
| * @return |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public int getInstrumentCount() { |
| return instrumentCount; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * Sets the Instrument Count property for Trader. |
| * |
| * @param _instrumentCount the new Instrument Count value |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public void setInstrumentCount(int _instrumentCount) { |
| instrumentCount = _instrumentCount; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public String getName() { |
| if (name == null) { |
| return "Trader " + getUID(); |
| } else { |
| return name; |
| } |
| } |
| } |