public void MoveContainer(ContainersCore container)
        {
            Trace.TraceInformation("Going to move container {0} ({1})", container.Id, container.ContainerType);

            var agents = GlobalAgentDescriptorTable.PersonsInContainer(container.Id);

            Trace.TraceInformation("Going to move container agents: {0}", String.Join(", ", agents.Select(a => a.GetId())));

            AddContainerMessage msg = new AddContainerMessage(
                this.transportSystem.Id,
                container.ContainerType,
                container.Id,
                container.Area,
                container.Dencity
                );

            msg.agentData.AddRange(agents.Select(a => new AddAgentMessage(
                                                     this.transportSystem.Id,
                                                     a.GetType().Name,
                                                     a.GetId(),
                                                     a.GetHealthState(),
                                                     1
                                                     )));

            this.moveContainerMessage = msg;
        }
Example #2
0
        private void onAddContainerMessage(Message message)
        {
            AddContainerMessage acm = (AddContainerMessage)message;

            Trace.TraceInformation("Added containter. Type: {0}; Id: {1}.", acm.containerType, acm.containerId);

            ContainersCore container = null;

            switch (acm.containerType)
            {
            case Enums.ContainerType.Home:
                container = new Home(acm.containerId, acm.area, acm.dencity);
                break;

            case Enums.ContainerType.Hospital:
                container = new Hospital(acm.containerId, acm.area, acm.dencity);
                break;

            case Enums.ContainerType.Mall:
                container = new Mall(acm.containerId, acm.area, acm.dencity);
                break;

            case Enums.ContainerType.Nursery:
                container = new Nursery(acm.containerId, acm.area, acm.dencity);
                break;

            case Enums.ContainerType.Office:
                container = new Office(acm.containerId, acm.area, acm.dencity);
                break;

            case Enums.ContainerType.School:
                container = new School(acm.containerId, acm.area, acm.dencity);
                break;

            case Enums.ContainerType.University:
                container = new University(acm.containerId, acm.area, acm.dencity);
                break;
            }

            if (container != null)
            {
                if (!Containers.Instance.ContainsKey(container.Id))
                {
                    Containers.Instance.Add(container.Id, container);
                }

                foreach (AddAgentMessage aam in acm.agentData)
                {
                    this.onAddAgentMessage(aam, container);
                }
            }
        }
Example #3
0
        private void moveContainer(AddContainerMessage message)
        {
            // Trace.TraceInformation("Container requested to move: {0}", message.containerId);

            // int idx = random.Next(0, this.results.Count - 1);
            // Guid workerId = this.results.ElementAt(idx).Key;

            Guid workerId =
                this.agentCounters
                .OrderBy(kvp => kvp.Value)
                .First().Key;

            // Trace.TraceInformation("Selected worker for container: {0}. Agent count: {1}", workerId, this.agentCounters[workerId]);

            MessageTransportSystem.Instance.SendMessage(message, workerId);

            this.containers2workers[message.containerId] = workerId;
        }
Example #4
0
        private void fillContainers()
        {
            int homeCount       = 10000;
            int hospitalCount   = 4;
            int mallCount       = 5;
            int officeCount     = 500;
            int univercityCount = 1;
            int schoolCount     = 23;
            int nurseryCount    = 2;
            //int homeCount = 1;
            //int hospitalCount = 1;
            //int mallCount = 1;
            //int officeCount = 1;
            //int univercityCount = 1;
            //int schoolCount = 1;
            //int nurseryCount = 1;

            List <Message> messagesToSend = new List <Message>();
            int            currentId      = 0;

            // Messages for home containers creation
            List <AddContainerMessage> homes = new List <AddContainerMessage>();

            for (int i = 0; i < homeCount; i++)
            {
                homes.Add(new AddContainerMessage(MessageTransportSystem.Instance.Id, Enums.ContainerType.Home, currentId, 50, 12));
                Containers.Instance.Add(currentId, new Home(currentId, 50, 12));
                currentId++;
            }
            // Everyone at home at the beginning
            List <Person> p = new List <Person>();

            p.AddRange(Adolescent.AdolescentList(Enums.HealthState.Infectious, 4, "LocationProbabilities"));
            p.AddRange(Adolescent.AdolescentList(Enums.HealthState.Susceptible, 4534, "LocationProbabilities"));
            p.AddRange(Adult.AdultList(Enums.HealthState.Infectious, 4, "LocationProbabilities"));
            p.AddRange(Adult.AdultList(Enums.HealthState.Susceptible, 14812, "LocationProbabilities"));
            p.AddRange(Child.ChildList(Enums.HealthState.Infectious, 4, "LocationProbabilities"));
            p.AddRange(Child.ChildList(Enums.HealthState.Susceptible, 1511, "LocationProbabilities"));
            p.AddRange(Elder.ElderList(Enums.HealthState.Infectious, 4, "LocationProbabilities"));
            p.AddRange(Elder.ElderList(Enums.HealthState.Susceptible, 5441, "LocationProbabilities"));
            p.AddRange(Youngster.YoungsterList(Enums.HealthState.Infectious, 4, "LocationProbabilities"));
            p.AddRange(Youngster.YoungsterList(Enums.HealthState.Susceptible, 3930, "LocationProbabilities"));
            for (int i = 0; i < p.Count; i++)
            {
                int    homeNum = i % homeCount;
                Person a       = p[i];
                homes[homeNum].agentData.Add(new AddAgentMessage(MessageTransportSystem.Instance.Id, a.GetType().Name, a.GetId(), a.GetHealthState(), 1));
                this.agentLocations[a.GetId()] = Containers.Instance[homes[homeNum].containerId];
            }
            messagesToSend.AddRange(homes);

            this.totalAgents = p.Count;

            // Messages for hospital containers creation
            List <AddContainerMessage> hospitals = new List <AddContainerMessage>();

            for (int i = 0; i < hospitalCount; i++)
            {
                hospitals.Add(new AddContainerMessage(MessageTransportSystem.Instance.Id, Enums.ContainerType.Hospital, currentId, 237, 19));
                Containers.Instance.Add(currentId, new Hospital(currentId, 237, 19));
                currentId++;
            }
            messagesToSend.AddRange(hospitals);

            // Messages for mall containers creation
            List <AddContainerMessage> malls = new List <AddContainerMessage>();

            for (int i = 0; i < mallCount; i++)
            {
                malls.Add(new AddContainerMessage(MessageTransportSystem.Instance.Id, Enums.ContainerType.Mall, currentId, 578, 90));
                Containers.Instance.Add(currentId, new Mall(currentId, 578, 90));
                currentId++;
            }
            messagesToSend.AddRange(malls);

            // Messages for office containers creation
            List <AddContainerMessage> offices = new List <AddContainerMessage>();

            for (int i = 0; i < officeCount; i++)
            {
                offices.Add(new AddContainerMessage(MessageTransportSystem.Instance.Id, Enums.ContainerType.Office, currentId, 236, 20));
                Containers.Instance.Add(currentId, new Office(currentId, 236, 20));
                currentId++;
            }
            messagesToSend.AddRange(offices);

            // Messages for univercity containers creation
            List <AddContainerMessage> univercities = new List <AddContainerMessage>();

            for (int i = 0; i < univercityCount; i++)
            {
                univercities.Add(new AddContainerMessage(MessageTransportSystem.Instance.Id, Enums.ContainerType.University, currentId, 300, 25));
                Containers.Instance.Add(currentId, new University(currentId, 300, 25));
                currentId++;
            }
            messagesToSend.AddRange(univercities);

            // Messages for school containers creation
            List <AddContainerMessage> schools = new List <AddContainerMessage>();

            for (int i = 0; i < schoolCount; i++)
            {
                schools.Add(new AddContainerMessage(MessageTransportSystem.Instance.Id, Enums.ContainerType.School, currentId, 237, 19));
                Containers.Instance.Add(currentId, new School(currentId, 237, 19));
                currentId++;
            }
            messagesToSend.AddRange(schools);

            // Messages for nursery containers creation
            List <AddContainerMessage> nurseries = new List <AddContainerMessage>();

            for (int i = 0; i < nurseryCount; i++)
            {
                nurseries.Add(new AddContainerMessage(MessageTransportSystem.Instance.Id, Enums.ContainerType.Nursery, currentId, 60, 23));
                Containers.Instance.Add(currentId, new Nursery(currentId, 60, 23));
                currentId++;
            }
            messagesToSend.AddRange(nurseries);

            // Now sending all messages equally spread to all CS workers and saving what container on what worker
            this.containers2workers.Clear();
            Dictionary <Message, Guid> res = MessageTransportSystem.Instance.SendSpread(messagesToSend);

            foreach (var r in res)
            {
                AddContainerMessage message = (AddContainerMessage)r.Key;
                Guid workerId = r.Value;
                this.containers2workers[message.containerId] = workerId;
            }
        }
Example #5
0
        public void SendGoto()
        {
            lock (gotoAgents)
            {
                if (gotoAgents.Count != gotoContainers.Count)
                    Trace.TraceWarning("!!! Agent and container count doesn't match");
                //return;

                //if (gotoAgents.Count == 0)
                //    return;

                List<AddAgentMessage> ams = new List<AddAgentMessage>();
                foreach(AbstractPerson a in this.gotoAgents)
                {
                    ams.Add(new AddAgentMessage(
                        this.transportSystem.Id,
                        a.GetType().Name,
                        a.GetId(),
                        a.GetHealthState(),
                        1
                        ));
                }

                GoToContainerMessage msg = new GoToContainerMessage(
                    this.transportSystem.Id,
                    ams.ToArray(),
                    this.gotoContainers.ToArray(),
                    this.infectedAgents.ToArray(),
                    GlobalAgentDescriptorTable.Count
                    );

                if (this.moveContainerMessage != null)
                {
                    msg.containerToMove = this.moveContainerMessage;
                }

                msg.currentResult = this.intermediateResult;

                this.transportSystem.SendMessage(msg);
                foreach (AbstractPerson a in this.gotoAgents)
                {
                    GlobalAgentDescriptorTable.DeleteOneAgent(a);
                }

                if (this.moveContainerMessage != null)
                {
                    foreach (var am in this.moveContainerMessage.agentData)
                    {
                        IAgent a = GlobalAgentDescriptorTable.GetAgentById(am.agentId);
                        if (a != null)
                        {
                            GlobalAgentDescriptorTable.DeleteOneAgent(a);
                        }
                    }
                    Containers.Instance.Remove(this.moveContainerMessage.containerId);
                }

                gotoAgents.Clear();
                gotoContainers.Clear();
                infectedAgents.Clear();
                this.moveContainerMessage = null;
                this.intermediateResult = null;
            }
        }
Example #6
0
        public void MoveContainer(ContainersCore container)
        {
            Trace.TraceInformation("Going to move container {0} ({1})", container.Id, container.ContainerType);

            var agents = GlobalAgentDescriptorTable.PersonsInContainer(container.Id);
            Trace.TraceInformation("Going to move container agents: {0}", String.Join(", ", agents.Select(a => a.GetId())));

            AddContainerMessage msg = new AddContainerMessage(
                this.transportSystem.Id,
                container.ContainerType,
                container.Id,
                container.Area,
                container.Dencity
            );
            msg.agentData.AddRange(agents.Select(a => new AddAgentMessage(
                this.transportSystem.Id,
                a.GetType().Name,
                a.GetId(),
                a.GetHealthState(),
                1
                )));

            this.moveContainerMessage = msg;
        }
Example #7
0
        private void moveContainer(AddContainerMessage message)
        {
            // Trace.TraceInformation("Container requested to move: {0}", message.containerId);

            // int idx = random.Next(0, this.results.Count - 1);
            // Guid workerId = this.results.ElementAt(idx).Key;

            Guid workerId =
                this.agentCounters
                .OrderBy(kvp => kvp.Value)
                .First().Key;

            // Trace.TraceInformation("Selected worker for container: {0}. Agent count: {1}", workerId, this.agentCounters[workerId]);

            MessageTransportSystem.Instance.SendMessage(message, workerId);

            this.containers2workers[message.containerId] = workerId;
        }
        public void SendGoto()
        {
            lock (gotoAgents)
            {
                if (gotoAgents.Count != gotoContainers.Count)
                {
                    Trace.TraceWarning("!!! Agent and container count doesn't match");
                }
                //return;

                //if (gotoAgents.Count == 0)
                //    return;

                List <AddAgentMessage> ams = new List <AddAgentMessage>();
                foreach (AbstractPerson a in this.gotoAgents)
                {
                    ams.Add(new AddAgentMessage(
                                this.transportSystem.Id,
                                a.GetType().Name,
                                a.GetId(),
                                a.GetHealthState(),
                                1
                                ));
                }

                GoToContainerMessage msg = new GoToContainerMessage(
                    this.transportSystem.Id,
                    ams.ToArray(),
                    this.gotoContainers.ToArray(),
                    this.infectedAgents.ToArray(),
                    GlobalAgentDescriptorTable.Count
                    );

                if (this.moveContainerMessage != null)
                {
                    msg.containerToMove = this.moveContainerMessage;
                }

                msg.currentResult = this.intermediateResult;

                this.transportSystem.SendMessage(msg);
                foreach (AbstractPerson a in this.gotoAgents)
                {
                    GlobalAgentDescriptorTable.DeleteOneAgent(a);
                }

                if (this.moveContainerMessage != null)
                {
                    foreach (var am in this.moveContainerMessage.agentData)
                    {
                        IAgent a = GlobalAgentDescriptorTable.GetAgentById(am.agentId);
                        if (a != null)
                        {
                            GlobalAgentDescriptorTable.DeleteOneAgent(a);
                        }
                    }
                    Containers.Instance.Remove(this.moveContainerMessage.containerId);
                }

                gotoAgents.Clear();
                gotoContainers.Clear();
                infectedAgents.Clear();
                this.moveContainerMessage = null;
                this.intermediateResult   = null;
            }
        }