示例#1
0
 public SimEventHandle(ISimEntity sender, ISimEntity target, ISimEvent simEvent, UniqueDouble udt)
 {
     _sender   = sender;
     _target   = target;
     _simEvent = simEvent;
     _udt      = udt;
 }
示例#2
0
        /// <summary>
        /// Enqueues given event into queue.
        /// </summary>
        /// <param name="simEvent">Event to be enqueued into queue.</param>
        public void Enqueue(ISimEvent simEvent)
        {
            // Event is positioned using bisection.

            var min      = 0;
            var max      = _queue.Count;
            var newEntry = new QueueEntry(simEvent);

            while (min < max)
            {
                var mid      = (max + min) / 2;
                var midEntry = _queue[mid];

                if (midEntry.Event == simEvent)
                {
                    return;
                }
                if (midEntry.SimTime < newEntry.SimTime)
                {
                    max = mid;
                    continue;
                }
                if (midEntry.SimTime == newEntry.SimTime && midEntry.Priority <= newEntry.Priority)
                {
                    max = mid;
                    continue;
                }
                min = mid + 1;
            }

            _queue.Insert(max, newEntry);
        }
示例#3
0
        public ISimEventHandle Register(ISimEntity sender, ISimEntity target, ISimEvent simEvent, double t)
        {
            if (t < 0)
            {
                Console.WriteLine("Cannot register an event in the past!");
                System.Diagnostics.StackTrace st = new StackTrace(true);
                Console.WriteLine(st.ToString());
                Environment.Exit(-1);
            }

            SingletonLogger.Instance().DebugLog(typeof(Scheduler), "@ " + Scheduler.GetTime() + " Register src:" + sender + " dst:" + target + " ev:" + simEvent + " t:" + t);

            double          deliveryTime = Scheduler.GetTime() + t;
            ISimEventHandle eventHandle  = new SimEventHandle(sender, target, simEvent, new UniqueDouble(deliveryTime));

            HashSet <ISimEventHandle> eventsFrom = Instance().GetEventsFrom(eventHandle.Sender);

            eventsFrom.Add(eventHandle);

            HashSet <ISimEventHandle> eventsTo = Instance().GetEventsTo(eventHandle.Target);

            eventsTo.Add(eventHandle);

            Instance()._ud2ehandle.Add(eventHandle.UDT, eventHandle);

            return(eventHandle);
        }
示例#4
0
            private int GetPriority(ISimEvent simEvent)
            {
                if (simEvent is OrderBookEvent)
                {
                    return(1);
                }

                if (simEvent is NewPriceRequestEvent)
                {
                    return(2);
                }

                if (simEvent is MarketTradeEvent)
                {
                    return(3);
                }

                return(10);
            }
 /// <summary>
 /// Removes given event from simulation.
 /// </summary>
 /// <param name="simEvent">Eventt to be removed from simulation.</param>
 public void CancelEvent(ISimEvent simEvent)
 {
     _queue.Remove(simEvent);
 }
 /// <summary>
 /// Adds a new event into simulation queue.
 /// </summary>
 /// <param name="simEvent">An event to be simulated.</param>
 public void AddEvent(ISimEvent simEvent)
 {
     _queue.Enqueue(simEvent);
 }
 /// <summary>
 /// Fires an AfterEventSimulation event.
 /// </summary>
 /// <param name="simEvent">Simulation event that was just simulated.</param>
 private void FireAfterEventSimulation(ISimEvent simEvent)
 {
     AfterEventSimulation?.Invoke(this, new EventArgs <ISimEvent>(simEvent));
 }
示例#8
0
 public QueueEntry(ISimEvent simEvent)
 {
     Event    = simEvent;
     SimTime  = simEvent.SimTime;
     Priority = GetPriority(simEvent);
 }
示例#9
0
 /// <summary>
 /// Removes event from queue.
 /// </summary>
 /// <param name="simEvent">Event to be removed from queue.</param>
 public void Remove(ISimEvent simEvent)
 {
     _queue.RemoveAll(entry => entry.Event == simEvent);
 }
示例#10
0
 public abstract void Recv(ISimEntity src, ISimEvent simEvent);
示例#11
0
 protected ISimEventHandle Send(ISimEntity dst, ISimEvent simEvent, double t)
 {
     return(Scheduler.Instance().Register(this, dst, simEvent, t));
 }
示例#12
0
        // receive a signal from the Simulation (via the Population)
        public override void Recv(ISimEntity src, ISimEvent simEvent)
        {
            if (Orderbook == null)
            {
                return;
            }

            if (LoggerDiags.Enabled)
            {
                SingletonLogger.Instance().DebugLog(typeof(AbstractAgent), "AbstractAgent " + GetName() + "recv ISimEvent " + simEvent + " @ " + Scheduler.GetTime());
            }

            // events received from the DES
            if (simEvent is ActionPrompt)
            {
                if (DecideToAct())
                {
                    if (LoggerDiags.Enabled)
                    {
                        SingletonLogger.Instance().DebugLog(typeof(AbstractAgent), "AbstractAgent " + GetName() + "acts @ " + Scheduler.GetTime() + " I have " + _orders.Count + " orders open");
                    }

                    EvaluateAllOpenOrders();
                    if (DecideToMakeOrder())
                    {
                        if (LoggerDiags.Enabled)
                        {
                            SingletonLogger.Instance().DebugLog(typeof(AbstractAgent), "AbstractAgent " + GetName() + "makes order @ " + Scheduler.GetTime());
                        }

                        if (!Orderbook.isNonDegenerate())
                        {
                            SingletonLogger.Instance().WarningLog(typeof(AbstractAgent), "AbstractAgent " + GetName() + " witnesses Orderbook blowup @ " + Scheduler.GetTime() + "\n" + Orderbook.ToStringLong());
                        }

                        IOrder newOrder = null;
                        if (DecideToSubmitBid())
                        {
                            if (LoggerDiags.Enabled)
                            {
                                SingletonLogger.Instance().DebugLog(typeof(AbstractAgent), "AbstractAgent " + GetName() + " submits bid @ " + Scheduler.GetTime());
                            }


                            // bid
                            double price  = GetBidPrice();
                            int    volume = GetBidVolume();

                            if (volume > 0)
                            {
                                newOrder = Orderbook.addBid(price, volume, this);
                            }
                            else
                            {
                                if (LoggerDiags.Enabled)
                                {
                                    SingletonLogger.Instance().WarningLog(typeof(AbstractAgent), "AbstractAgent " + GetName() + " attempts unsuccessful zero sized bid @ " + Scheduler.GetTime());
                                }
                            }
                        }
                        else
                        {
                            if (LoggerDiags.Enabled)
                            {
                                SingletonLogger.Instance().DebugLog(typeof(AbstractAgent), "AbstractAgent " + GetName() + " submits ask @ " + Scheduler.GetTime());
                            }

                            // ask
                            double price  = GetAskPrice();
                            int    volume = GetAskVolume();

                            if (volume > 0)
                            {
                                newOrder = Orderbook.addAsk(price, volume, this);
                            }
                            else
                            {
                                if (LoggerDiags.Enabled)
                                {
                                    SingletonLogger.Instance().WarningLog(typeof(AbstractAgent), "AbstractAgent " + GetName() + " attempts unsuccessful zero sized ask @ " + Scheduler.GetTime());
                                }
                            }
                        }

                        if (newOrder != null)
                        {
                            // may be null if dual volume is 0 preventing creation of new orders
                            AddToOpenOrderList(newOrder);

                            if (LoggerDiags.Enabled)
                            {
                                SingletonLogger.Instance().DebugLog(typeof(AbstractAgent), "AbstractAgent " + GetName() + " submitted " + newOrder + " @ " + Scheduler.GetTime());
                            }
                        }
                        else
                        {
                            throw new Exception("We got a problem");
                        }
                    }
                }

                double timeToNextPrompt = GetTimeToNextActionPrompt();
                if (timeToNextPrompt < 0.0)
                {
                    // agent checks out of ecosystem by indicating a negative time
                    if (LoggerDiags.Enabled)
                    {
                        SingletonLogger.Instance().WarningLog(typeof(AbstractAgent), "AbstractAgent " + GetName() + " leaves simulation by indicating negative prompt time @ " + Scheduler.GetTime());
                    }
                }
                else
                {
                    this.Send(this, simEvent, timeToNextPrompt);
                }
            }
        }
示例#13
0
 public override void Recv(ISimEntity src, ISimEvent simEvent)
 {
     // no op
     // throw new Exception("Unexpected call to Simulation.Recv");
 }
示例#14
0
 public override void Recv(ISimEntity src, ISimEvent simEvent)
 {
     // no op
 }