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; }
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); } } }
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; }
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; } }
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; } }
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; } }