public Simulation()
 {
     this.store = new Store();
     cont = false;
     this.client_args = new List<ClientStoreArg>();
     this.SP_args = new List<SPStoreArg>();
     this.queue_args = new List<QueueStoreArg>();
 }
 public SpecializedServicePoint(int i, Store store, string type, int maxQueueSize, int maxItems, int itemProcessingTime)
     : base(i, store)
 {
     this.maxQueueSize = maxQueueSize;
     this.maxItems = maxItems;
     this.type = type;
     this.itemProcessingTime = itemProcessingTime;
     this.queue.setMaxClients(maxQueueSize);
 }
        public Supervisor(Store s)
        {
            store = s;
            timeLastClientEntered = new Dictionary<ServicePoint, long>();
            timeLastClientEntered.Remove(new ServicePoint(10, s));

            strategies = new List<SupervisorStrategy>();
            strategies.Add(new ArrivalRateStrategy(store));
            strategies.Add(new QueueSizeStrategy(store));
            //Store.ServicePointOpened += new Store.ServicePointOpenedEventHandler(OpenedCash);
            this.currentStrategy = 0;
            this.store = s;
        }
        public ServicePoint(int i, Store store)
        {
            //clients = new List<Client>();

            queue = new StoreQueueListImpl(this.ToString(), Configs.MAX_CLIENTS_PER_CASH);
            queue.AddServicePoint(this);

            id = i;
            this.store = store;
            arrivalRate = 0.0f;
            timeOpened = Timer.getTick();
            this.type = "default";
            this.maxItems = Configs.MAX_ITEMS_PER_CLIENT;
        }
        public Client(int numServiceItems, Store s)
        {
            this.id = CUSTOMERID;
            CUSTOMERID++;
            this.inQueue = false;
            this.timeEnteredStore = Timer.getTick();
            this.timeEnteredQueue = -1;
            this.state = STATES.WAIT_TO_QUEUE;
            this.serviceItems = new List<ServiceItem>();
            this.GenerateServiceItems(numServiceItems);

            this.strategies = new List<ClientStrategy>();
            this.strategies.Add(new SmallestQueueStrategy(s, this));
            this.strategies.Add(new FewestItemsStrategy(s, this));
            this.currentStrategy = 0;

            patience = Configs.CLIENT_CHANGE_QUEUE_INTERVAL + (new Random()).Next(180);
            this.store = s;
        }
 public FewestItemsStrategy(Store s, Client c)
 {
     store = s;
     client = c;
     type = 1;
 }
        private int determineBetterServicePoint(Store store)
        {
            List<ServicePoint> sps = store.getServicePoints();
            int index = -1;
            ServicePoint curSP = store.getWhichServicePointAt(this);
            int curConstraint = curSP.getClients().IndexOf(this);
            int size = 10000000;

            if (strategies.ElementAt(this.currentStrategy).getStrategyType() == 1)
            {
                int t = 0;
                List<Client> clients = curSP.getClients();
                for (int i = 0; i < curConstraint; i++)
                {
                    t += clients.ElementAt(i).getNumItems();
                }
                curConstraint = t;
            }

            foreach (ServicePoint s in sps)
            {
                switch (strategies.ElementAt(this.currentStrategy).getStrategyType())
                {
                    case 0:
                        if (s.getClients().Count < size && s.CanService(this))
                        {
                            index = s.getId();
                            size = s.getClients().Count;
                        }
                        break;
                    case 1:
                        if (s.getTotalItems() < size && s.CanService(this))
                        {
                            index = s.getId();
                            size = s.getTotalItems();
                        }
                        break;
                }
            }

            if (curSP.getId() == index)
            {
                return -1;
            }
            return index;
        }
        public void Update(Store store)
        {
            bool finished = false;

            do
            {
                switch (state)
                {
                    // If it's waited the amount of time needed to enter  the queue, then enter the queue.
                    case STATES.WAIT_TO_QUEUE:
                        if (this.isReadyForQueue())
                        {
                            this.timeEnteredQueue = Timer.getTick();
                            store.AddClientToWaitQueue(this, this.chooseStoreWaitingQueue());
                            this.state = STATES.IN_WQ;
                            this.startWQTime = Timer.getTick();
                        }
                        else
                        {
                            finished = true;
                        }
                        break;

                    case STATES.IN_WQ:
                        if (store.getQueuePosition(this) == 0)
                        {
                            this.state = STATES.FRONT_WQ;
                        }
                        else
                        {
                            finished = true;
                        }
                        break;

                    case STATES.FRONT_WQ:
                        if (this.goToOptimalServicePoint(store))
                        {
                            this.startSQTime = Timer.getTick();
                            this.state = STATES.IN_CASH;
                        }
                        else
                        {
                            finished = true;
                        }
                        break;

                    case STATES.IN_CASH:
                        if (this.startSQTime + this.patience < Timer.getTick())
                        {
                            int index = determineBetterServicePoint(store);
                            if (index != -1)
                            {

                            }
                        }
                        finished = true;
                        break;

                    case STATES.FRONT_CASH:
                        finished = true;
                        break;

                }
            }
            while (!finished);
        }
        // When the customer strategy is implemented, put it in this part
        public bool goToOptimalServicePoint(Store store)
        {
            List<ServicePoint> spList = store.CheckForAvailableCashes(this);

            if (spList.Count > 0)
            {
                ServicePoint s = strategies.ElementAt(this.currentStrategy).selectServicePoint(spList);
                store.MoveClientToCash(this, s);
                return true;
            }
            else
            {
                return false;
            }
        }
 public ArrivalRateStrategy(Store s)
     : base(s, "ArrivalRateStrategy")
 {
 }
 public void setStore(Store s)
 {
     this.store = s;
 }
 public ClientStrategy(Store s, Client c)
 {
     store = s;
     client = c;
     type = -1;
 }
 public QueueSizeStrategy(Store s)
     : base(s, "QueueSizeStrategy")
 {
 }
 public SupervisorStrategy(Store s, string name)
 {
     store = s;
     this.name = name;
 }
 public SmallestQueueStrategy(Store s, Client c)
 {
     store = s;
     client = c;
     type = 0;
 }