From b56de8ccb2e0987fd7e98a250f1f262050655824 Mon Sep 17 00:00:00 2001 From: "manuel.hertle" Date: Wed, 11 May 2022 05:04:27 +0200 Subject: [PATCH 1/2] remove group attributes and functionalities from pedestrian (// TODO should actually be an attribute or a member of a subclass) --- .../simulator/models/groups/GroupModel.java | 71 ++++++------ .../models/groups/cgm/CentroidGroup.java | 8 +- .../models/groups/cgm/CentroidGroupModel.java | 103 +++++++++++++++++- .../models/osm/OptimalStepsModel.java | 24 ++-- .../simulator/models/osm/PedestrianOSM.java | 32 ++++-- .../vadere/state/scenario/GroupAccess.java | 15 +++ .../vadere/state/scenario/GroupMember.java | 36 ++++++ .../org/vadere/state/scenario/Pedestrian.java | 62 +++++++---- 8 files changed, 268 insertions(+), 83 deletions(-) create mode 100644 VadereState/src/org/vadere/state/scenario/GroupAccess.java create mode 100644 VadereState/src/org/vadere/state/scenario/GroupMember.java diff --git a/VadereSimulator/src/org/vadere/simulator/models/groups/GroupModel.java b/VadereSimulator/src/org/vadere/simulator/models/groups/GroupModel.java index 9863cf0f5..658cfb2b6 100644 --- a/VadereSimulator/src/org/vadere/simulator/models/groups/GroupModel.java +++ b/VadereSimulator/src/org/vadere/simulator/models/groups/GroupModel.java @@ -2,12 +2,8 @@ package org.vadere.simulator.models.groups; import org.vadere.simulator.models.Model; import org.vadere.simulator.models.potential.fields.IPotentialFieldTarget; -import org.vadere.state.scenario.DynamicElementAddListener; -import org.vadere.state.scenario.DynamicElementRemoveListener; -import org.vadere.state.scenario.Pedestrian; -import org.vadere.state.scenario.ScenarioElement; +import org.vadere.state.scenario.*; -import java.beans.PropertyEditor; import java.util.Iterator; import java.util.Map; @@ -16,53 +12,54 @@ import java.util.Map; * The {@link GroupModel} manges the behaviour from Groups. The generation of groups is manged * internally for each source generating groups. Each source must register a groupSizeDistribution * which will be used to generate the groups. - * + *

* At the time a pedestrian is placed in the topography the {@link GroupModel} is triggered over the * {@link DynamicElementAddListener} and will assign the pedestrian to a group based on the source. * * @param Group Type */ public interface GroupModel - extends Model, DynamicElementAddListener, DynamicElementRemoveListener, GroupIterator { - - /** - * @param pedestrian Pedestrian object - * @return The group the pedestrian object is a part of. - */ - T getGroup(Pedestrian pedestrian); - - /** - * @return Map of Pedestrians and their group. - */ + extends Model, DynamicElementAddListener, DynamicElementRemoveListener, GroupIterator, + GroupAccess { + + /** + * @param pedestrian Pedestrian object + * @return The group the pedestrian object is a part of. + */ + T getGroup(Pedestrian pedestrian); + + /** + * @return Map of Pedestrians and their group. + */ // Map getPedestrianGroupMap(); - Map getGroupsById(); + Map getGroupsById(); - void setPotentialFieldTarget(IPotentialFieldTarget potentialFieldTarget); + void setPotentialFieldTarget(IPotentialFieldTarget potentialFieldTarget); - IPotentialFieldTarget getPotentialFieldTarget(); + IPotentialFieldTarget getPotentialFieldTarget(); - /** - * Register groupSizeDistribution for a source. - * - * @param sourceId Source Id - * @param gsD Distribution for group size - */ - void registerGroupSizeDeterminator(int sourceId, GroupSizeDeterminator gsD); + /** + * Register groupSizeDistribution for a source. + * + * @param sourceId Source Id + * @param gsD Distribution for group size + */ + void registerGroupSizeDeterminator(int sourceId, GroupSizeDeterminator gsD); - /** - * Generate groups for source based on initializedSizeDistribution. - * - * @param sourceId Source Id - * @return Size of next group for given source - */ - int nextGroupForSource(int sourceId); + /** + * Generate groups for source based on initializedSizeDistribution. + * + * @param sourceId Source Id + * @return Size of next group for given source + */ + int nextGroupForSource(int sourceId); - default Iterator getGroupIterator(){ - return (Iterator) getGroupsById().values().iterator(); - } + default Iterator getGroupIterator() { + return (Iterator) getGroupsById().values().iterator(); + } } diff --git a/VadereSimulator/src/org/vadere/simulator/models/groups/cgm/CentroidGroup.java b/VadereSimulator/src/org/vadere/simulator/models/groups/cgm/CentroidGroup.java index 965bc438d..caca017d0 100644 --- a/VadereSimulator/src/org/vadere/simulator/models/groups/cgm/CentroidGroup.java +++ b/VadereSimulator/src/org/vadere/simulator/models/groups/cgm/CentroidGroup.java @@ -26,7 +26,7 @@ public class CentroidGroup implements Group { public final static int MAX_NO_VISION_OF_LEADER = 25; final private int id; - final private int size; + private int size; final protected ArrayList members; @@ -188,7 +188,13 @@ public class CentroidGroup implements Group { members.add(ped); initGroupVelocity(); // ensure same speed for all members. + } + public void addMemberInAnyCase(Pedestrian ped) { + if (isFull()) { + this.size++; + } + addMember(ped); } @Override diff --git a/VadereSimulator/src/org/vadere/simulator/models/groups/cgm/CentroidGroupModel.java b/VadereSimulator/src/org/vadere/simulator/models/groups/cgm/CentroidGroupModel.java index c78c40f22..5b4342856 100644 --- a/VadereSimulator/src/org/vadere/simulator/models/groups/cgm/CentroidGroupModel.java +++ b/VadereSimulator/src/org/vadere/simulator/models/groups/cgm/CentroidGroupModel.java @@ -25,6 +25,7 @@ import java.util.Map; import java.util.Optional; import java.util.Random; import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; /** * Implementation of group behavior model described in 'Pedestrian Group Behavior in a Cellular @@ -46,6 +47,9 @@ public class CentroidGroupModel extends AbstractGroupModel { private Map> sourceNextGroups; private Map sourceGroupSizeDeterminator; + //TODO currently as member because outside functions want to manipulate it without manipulating the group + private Map> pedestrianGroupSizes; + private Topography topography; private IPotentialFieldTarget potentialFieldTarget; private AttributesCGM attributesCGM; @@ -110,6 +114,13 @@ public class CentroidGroupModel extends AbstractGroupModel { @Override public CentroidGroup getGroup(final Pedestrian pedestrian) { + + /*Optional group = groupsById.values().stream() + .filter(g -> g.members.contains(pedestrian)) + .findFirst(); + assert group.isPresent() : "No group found for pedestrian"; + return group.get();*/ + CentroidGroup group = groupsById.get(pedestrian.getGroupIds().getFirst()); assert group != null : "No group found for pedestrian"; return group; @@ -117,9 +128,14 @@ public class CentroidGroupModel extends AbstractGroupModel { @Override protected void registerMember(final Pedestrian ped, final CentroidGroup group) { + //TODO does not register the pedestrian but the group. and only the first group of the pedestrian groupsById.putIfAbsent(ped.getGroupIds().getFirst(), group); } + protected void registerGroup(final CentroidGroup group) { + groupsById.putIfAbsent(group.getID(), group); + } + @Override public Map getGroupsById() { return groupsById; @@ -183,17 +199,15 @@ public class CentroidGroupModel extends AbstractGroupModel { if (currentGroup == null) { throw new IllegalStateException("No empty group exists to add Pedestrian: " + ped.getId()); } - - // add ped to group. If group is full remove it from the sourceNextGroups list. currentGroup.addMember(ped); - ped.addGroupId(currentGroup.getID(), currentGroup.getSize()); - registerMember(ped, currentGroup); + addGroupSize(ped.getId(), currentGroup.getSize()); + //If group is full remove it from the sourceNextGroups list. if (currentGroup.getOpenPersons() == 0) { groups.pollFirst(); // remove full group from list. } + registerMember(ped, currentGroup); } - public AttributesCGM getAttributesCGM() { return attributesCGM; } @@ -234,4 +248,83 @@ public class CentroidGroupModel extends AbstractGroupModel { protected Topography getTopography() { return topography; } + + @Override + public void setGroupIds(List groupIds, Pedestrian ped) { + //remove existing group memberships + for (int groupId: getGroupIds(ped)) { + groupsById.get(groupId).removeMember(ped); + } + + //set new group memberships + LinkedList groupSizes = new LinkedList<>(); + for (int groupId: groupIds) { + CentroidGroup groupToInsert = groupsById.get(groupId); + if (groupToInsert == null) { + groupToInsert = getNewGroup(groupId, (int) getAverageGroupSize()); + } + groupToInsert.addMemberInAnyCase(ped); + groupSizes.add(groupToInsert.getSize()); + //If group is full remove it from the sourceNextGroups list in case it is in there + if (groupToInsert.getOpenPersons() == 0) { + CentroidGroup finalGroupToInsert = groupToInsert; + sourceNextGroups.values() + .forEach((groupList) -> { + groupList.remove(finalGroupToInsert);}); + } + + setGroupSizes(groupSizes, ped); + registerGroup(groupToInsert); + } + } + + private double getAverageGroupSize() { + return groupsById.values().stream() + .map(group -> group.getSize()) + .mapToInt(Integer::intValue) + .average() + .orElse(0.0); + } + + @Override + public LinkedList getGroupIds(Pedestrian ped) { + return groupsById.values() + .stream() + .filter(group -> group.isMember(ped)) + .map(CentroidGroup::getID) + .collect(Collectors.toCollection(LinkedList::new)); + } + + @Override + public List getGroupSizes(Pedestrian ped) { + return pedestrianGroupSizes.get(ped.getId()); + } + + @Override + public void setGroupSizes(LinkedList groupSizes, Pedestrian ped) { + pedestrianGroupSizes.put(ped.getId(), groupSizes); + } + + public void addGroupSize(int pedestrianId, int groupSize) { + LinkedList pedGroupSizes = pedestrianGroupSizes.getOrDefault(pedestrianId, new LinkedList<>()); + pedGroupSizes.add(groupSize); + pedestrianGroupSizes.put(pedestrianId, pedGroupSizes); + } + + @Override + public List getPedGroupMembers(Pedestrian ped) { + CentroidGroup group = groupsById.get(getGroupIds(ped).getFirst()); + return group.members.stream() + .filter(p -> p.getId() != ped.getId()) + .collect(Collectors.toList()); + } + + @Override + public void setAgentsInGroup(List agentsInGroup, Pedestrian ped) { + CentroidGroup group = groupsById.get(getGroupIds(ped).getFirst()); + group.members.clear(); + for (Pedestrian pedestrian: agentsInGroup) { + group.addMemberInAnyCase(pedestrian); + } + } } diff --git a/VadereSimulator/src/org/vadere/simulator/models/osm/OptimalStepsModel.java b/VadereSimulator/src/org/vadere/simulator/models/osm/OptimalStepsModel.java index 36b057355..6017a0185 100644 --- a/VadereSimulator/src/org/vadere/simulator/models/osm/OptimalStepsModel.java +++ b/VadereSimulator/src/org/vadere/simulator/models/osm/OptimalStepsModel.java @@ -92,8 +92,7 @@ public class OptimalStepsModel implements MainModel, PotentialFieldModel { this.potentialFieldPedestrian = PotentialFieldAgent.createPotentialField( modelAttributesList, domain, attributesPedestrian, random, attributesOSM.getPedestrianPotentialModel()); - Optional opCentroidGroupModel = models.stream(). - filter(ac -> ac instanceof CentroidGroupModel).map(ac -> (CentroidGroupModel) ac).findAny(); + Optional opCentroidGroupModel = getCentroidGroupSubmodel(); if (opCentroidGroupModel.isPresent()) { @@ -262,9 +261,14 @@ public class OptimalStepsModel implements MainModel, PotentialFieldModel { private PedestrianOSM createElement(VPoint position, @NotNull final AttributesAgent attributesAgent) { PedestrianOSM pedestrian = new PedestrianOSM(attributesOSM, - attributesAgent, domain.getTopography(), random, potentialFieldTarget, - potentialFieldObstacle.copy(), potentialFieldPedestrian, - speedAdjusters, stepCircleOptimizer.clone()); + attributesAgent, domain.getTopography(), random, potentialFieldTarget, + potentialFieldObstacle.copy(), potentialFieldPedestrian, + speedAdjusters, stepCircleOptimizer.clone()); + + if (getCentroidGroupSubmodel().isPresent()) { + pedestrian.registerGroupAccess(getCentroidGroupSubmodel().get()); + } + pedestrian.setPosition(position); return pedestrian; } @@ -291,9 +295,7 @@ public class OptimalStepsModel implements MainModel, PotentialFieldModel { @Override public SourceControllerFactory getSourceControllerFactory() { - Optional opCentroidGroupModel = models.stream() - .filter(ac -> ac instanceof CentroidGroupModel) - .map(ac -> (CentroidGroupModel) ac).findAny(); + Optional opCentroidGroupModel = getCentroidGroupSubmodel(); if (opCentroidGroupModel.isPresent()) { return new GroupSourceControllerFactory(opCentroidGroupModel.get()); } @@ -301,6 +303,12 @@ public class OptimalStepsModel implements MainModel, PotentialFieldModel { return new SingleSourceControllerFactory(); } + private Optional getCentroidGroupSubmodel() { + return models.stream() + .filter(ac -> ac instanceof CentroidGroupModel) + .map(ac -> (CentroidGroupModel) ac).findAny(); + } + /** * Compares the time of the next possible move. */ diff --git a/VadereSimulator/src/org/vadere/simulator/models/osm/PedestrianOSM.java b/VadereSimulator/src/org/vadere/simulator/models/osm/PedestrianOSM.java index f491bebde..330f0fad3 100644 --- a/VadereSimulator/src/org/vadere/simulator/models/osm/PedestrianOSM.java +++ b/VadereSimulator/src/org/vadere/simulator/models/osm/PedestrianOSM.java @@ -6,6 +6,7 @@ import org.vadere.simulator.models.StepSizeAdjuster; import org.vadere.simulator.models.osm.optimization.OptimizationMetric; import org.vadere.simulator.models.potential.PotentialFieldPedestrianCompactSoftshell; import org.vadere.simulator.models.potential.combinedPotentials.*; +import org.vadere.state.scenario.*; import org.vadere.util.geometry.shapes.*; import org.vadere.simulator.models.SpeedAdjuster; import org.vadere.simulator.models.osm.optimization.StepCircleOptimizer; @@ -16,10 +17,6 @@ import org.vadere.simulator.models.potential.fields.PotentialFieldObstacle; import org.vadere.simulator.models.potential.fields.PotentialFieldTargetRingExperiment; import org.vadere.state.attributes.models.AttributesOSM; import org.vadere.state.attributes.scenario.AttributesAgent; -import org.vadere.state.scenario.Agent; -import org.vadere.state.scenario.Pedestrian; -import org.vadere.state.scenario.Stairs; -import org.vadere.state.scenario.Topography; ; import java.util.*; @@ -64,14 +61,15 @@ public class PedestrianOSM extends Pedestrian { @SuppressWarnings("unchecked") public PedestrianOSM(AttributesOSM attributesOSM, - AttributesAgent attributesPedestrian, Topography topography, - Random random, IPotentialFieldTarget potentialFieldTarget, - PotentialFieldObstacle potentialFieldObstacle, - PotentialFieldAgent potentialFieldPedestrian, - List speedAdjusters, - StepCircleOptimizer stepCircleOptimizer) { + AttributesAgent attributesPedestrian, Topography topography, + Random random, IPotentialFieldTarget potentialFieldTarget, + PotentialFieldObstacle potentialFieldObstacle, + PotentialFieldAgent potentialFieldPedestrian, + List speedAdjusters, + StepCircleOptimizer stepCircleOptimizer, + GroupMember groupMember) { - super(attributesPedestrian, random); + super(attributesPedestrian, random, groupMember); this.random = random; @@ -105,6 +103,17 @@ public class PedestrianOSM extends Pedestrian { this.strides = new LinkedList<>(); } + public PedestrianOSM(AttributesOSM attributesOSM, + AttributesAgent attributesPedestrian, Topography topography, + Random random, IPotentialFieldTarget potentialFieldTarget, + PotentialFieldObstacle potentialFieldObstacle, + PotentialFieldAgent potentialFieldPedestrian, + List speedAdjusters, + StepCircleOptimizer stepCircleOptimizer) { + this(attributesOSM, attributesPedestrian, topography, random, potentialFieldTarget, + potentialFieldObstacle, potentialFieldPedestrian, speedAdjusters, stepCircleOptimizer, null); + } + private PedestrianOSM(@NotNull final PedestrianOSM other) { super(other); @@ -432,6 +441,7 @@ public class PedestrianOSM extends Pedestrian { return "id = " + getId() + " memory " + super.toString(); } + //TODO public LinkedList getPedGroupMembers(){ LinkedList peds = new LinkedList<>(); diff --git a/VadereState/src/org/vadere/state/scenario/GroupAccess.java b/VadereState/src/org/vadere/state/scenario/GroupAccess.java new file mode 100644 index 000000000..206559341 --- /dev/null +++ b/VadereState/src/org/vadere/state/scenario/GroupAccess.java @@ -0,0 +1,15 @@ +package org.vadere.state.scenario; + +import org.vadere.state.scenario.Pedestrian; + +import java.util.LinkedList; +import java.util.List; + +public interface GroupAccess { + void setGroupIds(List groupIds, Pedestrian ped); + List getGroupIds(Pedestrian ped); + List getGroupSizes(Pedestrian ped); + void setGroupSizes(LinkedList groupSizes, Pedestrian ped); + List getPedGroupMembers(Pedestrian ped); + void setAgentsInGroup(final List agentsInGroup, Pedestrian ped); +} diff --git a/VadereState/src/org/vadere/state/scenario/GroupMember.java b/VadereState/src/org/vadere/state/scenario/GroupMember.java new file mode 100644 index 000000000..882d565d9 --- /dev/null +++ b/VadereState/src/org/vadere/state/scenario/GroupMember.java @@ -0,0 +1,36 @@ +package org.vadere.state.scenario; + +import java.util.LinkedList; +import java.util.List; + +public class GroupMember { + + private final Pedestrian member; + private final GroupAccess groupAccess; + + public GroupMember(Pedestrian member, GroupAccess groupAccess) { + this.member = member; + this.groupAccess = groupAccess; + } + + void setGroupIds(LinkedList groupIds) { + groupAccess.setGroupIds(groupIds, member); + }; + List getGroupIds() { + return groupAccess.getGroupIds(member); + }; + List getGroupSizes() { + return groupAccess.getGroupSizes(member); + }; + void setGroupSizes(LinkedList sizes) { + groupAccess.setGroupSizes(sizes, member); + } + List getPedGroupMembers() { + return groupAccess.getPedGroupMembers(member); + }; + void setAgentsInGroup(final LinkedList agentsInGroup) { + groupAccess.setAgentsInGroup(agentsInGroup, member); + }; + + +} diff --git a/VadereState/src/org/vadere/state/scenario/Pedestrian.java b/VadereState/src/org/vadere/state/scenario/Pedestrian.java index e0415ae10..3312ad826 100644 --- a/VadereState/src/org/vadere/state/scenario/Pedestrian.java +++ b/VadereState/src/org/vadere/state/scenario/Pedestrian.java @@ -31,14 +31,19 @@ public class Pedestrian extends Agent { private boolean isChild; // TODO should actually be an attribute or a member of a subclass private boolean isLikelyInjured; // TODO should actually be an attribute or a member of a subclass - private PsychologyStatus psychologyStatus; + private final PsychologyStatus psychologyStatus; private ExposureModelHealthStatus healthStatus; private DoseResponseModelInfectionStatus infectionStatus; + private GroupMember groupMember; + + //TODO private LinkedList groupIds; // TODO should actually be an attribute or a member of a subclass - private LinkedList groupSizes; + //TODO + private LinkedList groupSizes; + //TODO private LinkedList agentsInGroup = new LinkedList<>(); @@ -64,24 +69,29 @@ public class Pedestrian extends Agent { this(new AttributesAgent()); } + + private Pedestrian(AttributesAgent attributesPedestrian) { this(attributesPedestrian, new Random()); } - public Pedestrian(AttributesAgent attributesAgent, Random random) { + public Pedestrian(AttributesAgent attributesAgent, Random random, GroupMember groupMember) { super(attributesAgent, random); - idAsTarget = -1; - isChild = false; - isLikelyInjured = false; - psychologyStatus = new PsychologyStatus(null, new ThreatMemory(), SelfCategory.TARGET_ORIENTED, GroupMembership.OUT_GROUP, new KnowledgeBase()); + this.groupMember = groupMember; + idAsTarget = -1; + isChild = false; + isLikelyInjured = false; + psychologyStatus = new PsychologyStatus(null, new ThreatMemory(), SelfCategory.TARGET_ORIENTED, GroupMembership.OUT_GROUP, new KnowledgeBase()); healthStatus = null; infectionStatus = null; - groupIds = new LinkedList<>(); - groupSizes = new LinkedList<>(); - modelPedestrianMap = new HashMap<>(); - trajectory = new VTrajectory(); - footstepHistory = new FootstepHistory(attributesAgent.getFootstepHistorySize()); + modelPedestrianMap = new HashMap<>(); + trajectory = new VTrajectory(); + footstepHistory = new FootstepHistory(attributesAgent.getFootstepHistorySize()); + } + + public Pedestrian(AttributesAgent attributesAgent, Random random) { + this(attributesAgent, random, null); } protected Pedestrian(Pedestrian other) { @@ -105,12 +115,10 @@ public class Pedestrian extends Agent { infectionStatus = null; } - if (other.groupIds != null) { - groupIds = new LinkedList<>(other.groupIds); - groupSizes = new LinkedList<>(other.groupSizes); + if (other.groupMember != null) { + groupMember = other.groupMember; } else { - groupIds = new LinkedList<>(); - groupSizes = new LinkedList<>(); + groupMember = null; } trajectory = new VTrajectory(); @@ -119,6 +127,10 @@ public class Pedestrian extends Agent { } // Getter + public GroupMember isGroupMember() { + return groupMember; + } + public int getIdAsTarget() { return this.idAsTarget; } @@ -158,10 +170,12 @@ public class Pedestrian extends Agent { return psychologyStatus.getKnowledgeBase(); } + //TODO public LinkedList getGroupIds() { return groupIds; } + //TODO public LinkedList getGroupSizes() { return groupSizes; } @@ -226,6 +240,10 @@ public class Pedestrian extends Agent { } // Setter + public void registerGroupAccess(GroupAccess groupAccess) { + this.groupMember = new GroupMember(this, groupAccess); + } + public void setIdAsTarget(int id) { this.idAsTarget = id; } @@ -259,10 +277,12 @@ public class Pedestrian extends Agent { psychologyStatus.setGroupMembership(groupMembership); } + //TODO public void setGroupIds(LinkedList groupIds) { this.groupIds = groupIds; } + //TODO public void setGroupSizes(LinkedList groupSizes) { this.groupSizes = groupSizes; } @@ -304,10 +324,6 @@ public class Pedestrian extends Agent { return this.idAsTarget != -1; } - public void addGroupId(int groupId, int size) { - groupIds.add(groupId); - groupSizes.add(size); - } public void addFootStepToTrajectory(FootStep footStep) { this.trajectory = this.trajectory.add(footStep); @@ -327,14 +343,18 @@ public class Pedestrian extends Agent { } + //TODO public LinkedList getPedGroupMembers() { + this.agentsInGroup = agentsInGroup; return agentsInGroup; } + //TODO public boolean isAgentsInGroup() { return getPedGroupMembers().size() > 0; } + //TODO public void setAgentsInGroup(final LinkedList agentsInGroup) { this.agentsInGroup = agentsInGroup; } -- GitLab From 16314b9a7b4b91ed570eecb518ff6f93c215ece3 Mon Sep 17 00:00:00 2001 From: "manuel.hertle" Date: Wed, 11 May 2022 06:46:11 +0200 Subject: [PATCH 2/2] replace old pedestrian-group access with new one everywhere --- .../roVer/scenarios/roVerTest001.scenario | 1200 ++++++++--------- .../gui/components/model/SimulationModel.java | 25 +- .../model/PostvisualizationModel.java | 8 +- .../model/TableTrajectoryFootStep.java | 8 +- .../gui/renderer/agent/AgentRender.java | 16 +- .../control/external/models/ControlModel.java | 10 +- .../cognition/models/AProbabilisticModel.java | 4 +- .../models/ProbabilisticCognitionModel.java | 4 +- .../TargetChangerController.java | 53 +- .../scenarioelements/TargetController.java | 2 +- .../TopographyController.java | 5 +- .../models/groups/cgm/CentroidGroupModel.java | 51 +- .../simulator/models/osm/PedestrianOSM.java | 19 - .../processor/AreaGroupMetaDataProcessor.java | 6 +- ...trianCommandIdsReceivedTimesProcessor.java | 14 +- .../control/TargetChangerControllerTest.java | 13 +- .../vadere/state/scenario/GroupAccess.java | 5 +- .../vadere/state/scenario/GroupMember.java | 25 +- .../org/vadere/state/scenario/Pedestrian.java | 51 +- 19 files changed, 764 insertions(+), 755 deletions(-) diff --git a/Scenarios/Demos/roVer/scenarios/roVerTest001.scenario b/Scenarios/Demos/roVer/scenarios/roVerTest001.scenario index cd0c9d8b9..4b15f58ff 100644 --- a/Scenarios/Demos/roVer/scenarios/roVerTest001.scenario +++ b/Scenarios/Demos/roVer/scenarios/roVerTest001.scenario @@ -300,9 +300,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -357,9 +357,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -414,9 +414,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -471,9 +471,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -528,9 +528,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -585,9 +585,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -642,9 +642,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -699,9 +699,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -756,9 +756,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -813,9 +813,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -870,9 +870,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -927,9 +927,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -984,9 +984,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -1041,9 +1041,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -1098,9 +1098,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -1155,9 +1155,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -1212,9 +1212,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -1269,9 +1269,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -1326,9 +1326,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -1383,9 +1383,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -1440,9 +1440,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -1497,9 +1497,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -1554,9 +1554,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -1611,9 +1611,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -1668,9 +1668,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -1725,9 +1725,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -1782,9 +1782,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -1839,9 +1839,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -1896,9 +1896,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -1953,9 +1953,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -2010,9 +2010,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -2067,9 +2067,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -2124,9 +2124,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -2181,9 +2181,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -2238,9 +2238,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -2295,9 +2295,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -2352,9 +2352,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -2409,9 +2409,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -2466,9 +2466,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -2523,9 +2523,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -2580,9 +2580,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -2637,9 +2637,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -2694,9 +2694,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -2751,9 +2751,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -2808,9 +2808,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -2865,9 +2865,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -2922,9 +2922,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -2979,9 +2979,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -3036,9 +3036,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -3093,9 +3093,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -3150,9 +3150,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -3207,9 +3207,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -3264,9 +3264,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -3321,9 +3321,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -3378,9 +3378,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -3435,9 +3435,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -3492,9 +3492,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -3549,9 +3549,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -3606,9 +3606,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -3663,9 +3663,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -3720,9 +3720,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -3777,9 +3777,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -3834,9 +3834,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -3891,9 +3891,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -3948,9 +3948,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -4005,9 +4005,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -4062,9 +4062,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -4119,9 +4119,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -4176,9 +4176,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -4233,9 +4233,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -4290,9 +4290,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -4347,9 +4347,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -4404,9 +4404,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -4461,9 +4461,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -4518,9 +4518,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -4575,9 +4575,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -4632,9 +4632,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -4689,9 +4689,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -4746,9 +4746,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -4803,9 +4803,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -4860,9 +4860,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -4917,9 +4917,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -4974,9 +4974,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -5031,9 +5031,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -5088,9 +5088,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -5145,9 +5145,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -5202,9 +5202,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -5259,9 +5259,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -5316,9 +5316,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -5373,9 +5373,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -5430,9 +5430,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -5487,9 +5487,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -5544,9 +5544,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -5601,9 +5601,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -5658,9 +5658,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -5715,9 +5715,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -5772,9 +5772,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -5829,9 +5829,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -5886,9 +5886,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -5943,9 +5943,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -6000,9 +6000,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -6057,9 +6057,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -6114,9 +6114,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -6171,9 +6171,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -6228,9 +6228,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -6285,9 +6285,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -6342,9 +6342,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -6399,9 +6399,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -6456,9 +6456,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -6513,9 +6513,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -6570,9 +6570,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -6627,9 +6627,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -6684,9 +6684,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -6741,9 +6741,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -6798,9 +6798,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -6855,9 +6855,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -6912,9 +6912,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -6969,9 +6969,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -7026,9 +7026,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -7083,9 +7083,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -7140,9 +7140,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -7197,9 +7197,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -7254,9 +7254,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -7311,9 +7311,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -7368,9 +7368,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -7425,9 +7425,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -7482,9 +7482,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -7539,9 +7539,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -7596,9 +7596,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -7653,9 +7653,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -7710,9 +7710,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -7767,9 +7767,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -7824,9 +7824,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -7881,9 +7881,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -7938,9 +7938,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -7995,9 +7995,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -8052,9 +8052,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -8109,9 +8109,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -8166,9 +8166,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -8223,9 +8223,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -8280,9 +8280,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -8337,9 +8337,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -8394,9 +8394,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -8451,9 +8451,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -8508,9 +8508,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -8565,9 +8565,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -8622,9 +8622,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -8679,9 +8679,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -8736,9 +8736,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -8793,9 +8793,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -8850,9 +8850,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -8907,9 +8907,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -8964,9 +8964,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -9021,9 +9021,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -9078,9 +9078,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -9135,9 +9135,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -9192,9 +9192,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -9249,9 +9249,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -9306,9 +9306,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -9363,9 +9363,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -9420,9 +9420,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -9477,9 +9477,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -9534,9 +9534,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -9591,9 +9591,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -9648,9 +9648,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -9705,9 +9705,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -9762,9 +9762,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -9819,9 +9819,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -9876,9 +9876,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -9933,9 +9933,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -9990,9 +9990,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -10047,9 +10047,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -10104,9 +10104,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -10161,9 +10161,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -10218,9 +10218,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -10275,9 +10275,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -10332,9 +10332,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -10389,9 +10389,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -10446,9 +10446,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -10503,9 +10503,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -10560,9 +10560,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -10617,9 +10617,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -10674,9 +10674,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -10731,9 +10731,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -10788,9 +10788,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -10845,9 +10845,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -10902,9 +10902,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -10959,9 +10959,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -11016,9 +11016,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -11073,9 +11073,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -11130,9 +11130,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -11187,9 +11187,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -11244,9 +11244,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -11301,9 +11301,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -11358,9 +11358,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -11415,9 +11415,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -11472,9 +11472,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -11529,9 +11529,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -11586,9 +11586,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, @@ -11643,9 +11643,9 @@ }, "healthStatus" : null, "infectionStatus" : null, - "groupIds" : [ ], - "groupSizes" : [ ], - "agentsInGroup" : [ ], + + + "trajectory" : { "footSteps" : [ ] }, diff --git a/VadereGui/src/org/vadere/gui/components/model/SimulationModel.java b/VadereGui/src/org/vadere/gui/components/model/SimulationModel.java index a82fbd762..b400dea29 100644 --- a/VadereGui/src/org/vadere/gui/components/model/SimulationModel.java +++ b/VadereGui/src/org/vadere/gui/components/model/SimulationModel.java @@ -11,6 +11,7 @@ import org.jetbrains.annotations.NotNull; import org.vadere.meshing.mesh.gen.PMesh; import org.vadere.meshing.mesh.inter.IMesh; import org.vadere.state.scenario.Agent; +import org.vadere.state.scenario.GroupMember; import org.vadere.state.scenario.Pedestrian; import org.vadere.util.geometry.shapes.IPoint; import org.vadere.util.geometry.shapes.VRectangle; @@ -100,17 +101,23 @@ public abstract class SimulationModel extends public abstract boolean isAlive(int pedId); public Color getGroupColor(@NotNull final Pedestrian ped) { - if (ped.getGroupIds().isEmpty() || (!ped.getGroupSizes().isEmpty() && ped.getGroupSizes().getFirst() == 1)) { - return config.getPedestrianDefaultColor(); - } + if (ped.isGroupMember() != null) { + GroupMember groupMember = ped.isGroupMember(); + if (groupMember.getGroupIds().isEmpty() || (!groupMember.getGroupSizes().isEmpty() && + groupMember.getGroupSizes().getFirst() == 1)) { + return config.getPedestrianDefaultColor(); + } - int groupId = ped.getGroupIds().getFirst(); - Color c = colorMap.get(groupId); - if (c == null) { - c = new Color(Color.HSBtoRGB(random.nextFloat(), 1f, 0.75f)); - colorMap.put(groupId, c); + int groupId = groupMember.getGroupIds().getFirst(); + Color c = colorMap.get(groupId); + if (c == null) { + c = new Color(Color.HSBtoRGB(random.nextFloat(), 1f, 0.75f)); + colorMap.put(groupId, c); + } + return c; + } else { + return config.getPedestrianDefaultColor(); } - return c; } @Override diff --git a/VadereGui/src/org/vadere/gui/postvisualization/model/PostvisualizationModel.java b/VadereGui/src/org/vadere/gui/postvisualization/model/PostvisualizationModel.java index df72dda91..5d1b5bc99 100644 --- a/VadereGui/src/org/vadere/gui/postvisualization/model/PostvisualizationModel.java +++ b/VadereGui/src/org/vadere/gui/postvisualization/model/PostvisualizationModel.java @@ -259,11 +259,15 @@ public class PostvisualizationModel extends SimulationModel getProcessedAgents() { return processedAgents; } @@ -91,18 +91,15 @@ public class TargetChangerController extends ScenarioElementController implement logEnteringTimeOfAgent(agent, simTimeInSec); notifyListenersTargetChangerAreaReached(agent); + changerAlgorithm.setAgentTargetList(agent); + if (agent instanceof Pedestrian) { Pedestrian p = (Pedestrian) agent; - if (p.isAgentsInGroup()) { - changerAlgorithm.setAgentTargetList(p); - for (Pedestrian ped : p.getPedGroupMembers()) { + if (p.isGroupMember() != null) { + for (Pedestrian ped : p.isGroupMember().getPedGroupMembers()) { processedAgents.put(ped.getId(), ped); } - } else { - changerAlgorithm.setAgentTargetList(p); } - } else { - changerAlgorithm.setAgentTargetList(agent); } processedAgents.put(agent.getId(), agent); } @@ -128,24 +125,30 @@ public class TargetChangerController extends ScenarioElementController implement if (agent instanceof Pedestrian) { Pedestrian p = (Pedestrian) agent; //TODO tmp better GroupTargetChangerController like GroupSourceController or CentroidGroup to DynamicElement - if (p.isAgentsInGroup()) { - getModel(state, CentroidGroupModel.class).ifPresentOrElse( - (model) - -> { - CentroidGroupModel cgm = (CentroidGroupModel) model; - CentroidGroup group = cgm.getGroup(p); - group.setGroupTargetList(this.targetChanger.getAttributes().getNextTarget()); - }, - () - -> { - log.error("no group Model found but Agent in Group"); - }); - for (Pedestrian ped : p.getPedGroupMembers()) { - processedAgents.put(ped.getId(), ped); + + if (p.isGroupMember() != null) { + + if (p.isGroupMember().getPedGroupMembers().size() > 0) { + getModel(state, CentroidGroupModel.class).ifPresentOrElse( + (model) + -> { + CentroidGroupModel cgm = (CentroidGroupModel) model; + CentroidGroup group = cgm.getGroup(p); + group.setGroupTargetList(this.targetChanger.getAttributes().getNextTarget()); + }, + () + -> { + log.error("no group Model found but Agent in Group"); + }); + for (Pedestrian ped : p.isGroupMember().getPedGroupMembers()) { + processedAgents.put(ped.getId(), ped); + } + } else { + changerAlgorithm.setAgentTargetList(p); } - } else { - changerAlgorithm.setAgentTargetList(p); + } + } else { changerAlgorithm.setAgentTargetList(agent); } diff --git a/VadereSimulator/src/org/vadere/simulator/control/scenarioelements/TargetController.java b/VadereSimulator/src/org/vadere/simulator/control/scenarioelements/TargetController.java index 699df1aac..abf4db6ab 100644 --- a/VadereSimulator/src/org/vadere/simulator/control/scenarioelements/TargetController.java +++ b/VadereSimulator/src/org/vadere/simulator/control/scenarioelements/TargetController.java @@ -170,7 +170,7 @@ public class TargetController extends ScenarioElementController implements Model if (agent instanceof Pedestrian) { Pedestrian p = (Pedestrian) agent; //TODO better GroupTargetController like GroupSourceController or make CentroidGroup a DynamicElement - if (p.isAgentsInGroup()) { + if (p.isGroupMember() != null && p.isGroupMember().getPedGroupMembers().size() > 0) { getModel(state, CentroidGroupModel.class).ifPresentOrElse( (model) -> { diff --git a/VadereSimulator/src/org/vadere/simulator/control/scenarioelements/TopographyController.java b/VadereSimulator/src/org/vadere/simulator/control/scenarioelements/TopographyController.java index 333999ee3..b43e9522e 100644 --- a/VadereSimulator/src/org/vadere/simulator/control/scenarioelements/TopographyController.java +++ b/VadereSimulator/src/org/vadere/simulator/control/scenarioelements/TopographyController.java @@ -90,8 +90,9 @@ public class TopographyController extends OfflineTopographyController implements newPedestrian.setSelfCategory(agentWrapper.getSelfCategory()); newPedestrian.setGroupMembership(agentWrapper.getGroupMembership()); - newPedestrian.setGroupIds(agentWrapper.getGroupIds()); - newPedestrian.setGroupSizes(agentWrapper.getGroupSizes()); + //newPedestrian.setGroupIds(agentWrapper.getGroupIds()); + //newPedestrian.setGroupSizes(agentWrapper.getGroupSizes()); + newPedestrian.setGroupMember(agentWrapper.isGroupMember()); agentWrapper.getTrajectory().getFootSteps().forEach(footStep -> newPedestrian.addFootStepToTrajectory(footStep)); diff --git a/VadereSimulator/src/org/vadere/simulator/models/groups/cgm/CentroidGroupModel.java b/VadereSimulator/src/org/vadere/simulator/models/groups/cgm/CentroidGroupModel.java index 5b4342856..c6c6d8996 100644 --- a/VadereSimulator/src/org/vadere/simulator/models/groups/cgm/CentroidGroupModel.java +++ b/VadereSimulator/src/org/vadere/simulator/models/groups/cgm/CentroidGroupModel.java @@ -63,6 +63,7 @@ public class CentroidGroupModel extends AbstractGroupModel { this.sourceGroupSizeDeterminator = new HashMap<>(); this.nextFreeGroupId = new AtomicInteger(0); + this.pedestrianGroupSizes = new HashMap<>(); } @Override @@ -115,21 +116,18 @@ public class CentroidGroupModel extends AbstractGroupModel { @Override public CentroidGroup getGroup(final Pedestrian pedestrian) { - /*Optional group = groupsById.values().stream() + Optional group = groupsById.values().stream() .filter(g -> g.members.contains(pedestrian)) .findFirst(); assert group.isPresent() : "No group found for pedestrian"; - return group.get();*/ - - CentroidGroup group = groupsById.get(pedestrian.getGroupIds().getFirst()); - assert group != null : "No group found for pedestrian"; - return group; + return group.get(); } @Override protected void registerMember(final Pedestrian ped, final CentroidGroup group) { - //TODO does not register the pedestrian but the group. and only the first group of the pedestrian - groupsById.putIfAbsent(ped.getGroupIds().getFirst(), group); + //TODO does not register the pedestrian but the group. and only the first group of the pedestrian?? + //groupsById.putIfAbsent(ped.getGroupIds().getFirst(), group); + groupsById.putIfAbsent(group.getID(), group); } protected void registerGroup(final CentroidGroup group) { @@ -153,13 +151,14 @@ public class CentroidGroupModel extends AbstractGroupModel { private void initializeGroupsOfInitialPedestrians() { // get all pedestrians already in topography - DynamicElementContainer c = topography.getPedestrianDynamicElements(); + /*DynamicElementContainer c = topography.getPedestrianDynamicElements(); if (c.getElements().size() > 0) { Map> groups = new HashMap<>(); // aggregate group data c.getElements().forEach(p -> { + //TODO requires different attributes or method to signal (in json) that pedestrian is in a group for (Integer id : p.getGroupIds()) { List peds = groups.computeIfAbsent(id, k -> new ArrayList<>()); // empty group id and size values, will be set later on @@ -188,7 +187,7 @@ public class CentroidGroupModel extends AbstractGroupModel { if (max.isPresent()) { nextFreeGroupId = new AtomicInteger(max.get() + 1); } - } + }*/ } @@ -221,9 +220,13 @@ public class CentroidGroupModel extends AbstractGroupModel { @Override public void elementRemoved(Pedestrian pedestrian) { - Group group = groupsById.get(pedestrian.getGroupIds().getFirst()); - if (group.removeMember(pedestrian)) { // if true pedestrian was last member. - groupsById.remove(group.getID()); + if (pedestrian.isGroupMember() != null) { + for (Integer groupId: pedestrian.isGroupMember().getGroupIds()) { + Group group = groupsById.get(groupId); + if (group.removeMember(pedestrian)) { // if true pedestrian was last member. + groupsById.remove(group.getID()); + } + } } } @@ -278,6 +281,26 @@ public class CentroidGroupModel extends AbstractGroupModel { } } + @Override + public void addGroupId(int groupId, Pedestrian ped) { + CentroidGroup groupToInsert = groupsById.get(groupId); + if (groupToInsert == null) { + groupToInsert = getNewGroup(groupId, (int) getAverageGroupSize()); + registerGroup(groupToInsert); + } + if (!groupToInsert.isMember(ped)) { + groupToInsert.addMemberInAnyCase(ped); + } + //If group is full remove it from the sourceNextGroups list in case it is in there + if (groupToInsert.getOpenPersons() == 0) { + CentroidGroup finalGroupToInsert = groupToInsert; + sourceNextGroups.values() + .forEach((groupList) -> { + groupList.remove(finalGroupToInsert);}); + } + addGroupSize(ped.getId(), groupToInsert.getSize()); + } + private double getAverageGroupSize() { return groupsById.values().stream() .map(group -> group.getSize()) @@ -296,7 +319,7 @@ public class CentroidGroupModel extends AbstractGroupModel { } @Override - public List getGroupSizes(Pedestrian ped) { + public LinkedList getGroupSizes(Pedestrian ped) { return pedestrianGroupSizes.get(ped.getId()); } diff --git a/VadereSimulator/src/org/vadere/simulator/models/osm/PedestrianOSM.java b/VadereSimulator/src/org/vadere/simulator/models/osm/PedestrianOSM.java index 330f0fad3..bb3fb5bbf 100644 --- a/VadereSimulator/src/org/vadere/simulator/models/osm/PedestrianOSM.java +++ b/VadereSimulator/src/org/vadere/simulator/models/osm/PedestrianOSM.java @@ -440,23 +440,4 @@ public class PedestrianOSM extends Pedestrian { public String toString() { return "id = " + getId() + " memory " + super.toString(); } - - //TODO - public LinkedList getPedGroupMembers(){ - - LinkedList peds = new LinkedList<>(); - - if (this.getGroupIds() != null) { - if (this.getGroupIds().size() == 1) { - for (int i : getGroupIds()) { - Collection pp = getTopography().getPedestrianDynamicElements().getElements().stream().filter(p -> p.getGroupIds().getFirst() == i && p.getId() != getId()).collect(Collectors.toList()); - - for (Pedestrian ped : pp) { - peds.add(ped); - } - } - } - } - return peds; - } } diff --git a/VadereSimulator/src/org/vadere/simulator/projects/dataprocessing/processor/AreaGroupMetaDataProcessor.java b/VadereSimulator/src/org/vadere/simulator/projects/dataprocessing/processor/AreaGroupMetaDataProcessor.java index e10f3aa57..9c65548d5 100644 --- a/VadereSimulator/src/org/vadere/simulator/projects/dataprocessing/processor/AreaGroupMetaDataProcessor.java +++ b/VadereSimulator/src/org/vadere/simulator/projects/dataprocessing/processor/AreaGroupMetaDataProcessor.java @@ -57,8 +57,10 @@ public class AreaGroupMetaDataProcessor extends DataProcessor groupIdsInArea = new HashSet<>(); for (Pedestrian p : pedInArea) { - LinkedList groupIds = p.getGroupIds(); - groupIdsInArea.addAll(groupIds); + if (p.isGroupMember() != null) { + LinkedList groupIds = p.isGroupMember().getGroupIds(); + groupIdsInArea.addAll(groupIds); + } } try { diff --git a/VadereSimulator/src/org/vadere/simulator/projects/dataprocessing/processor/PedestrianCommandIdsReceivedTimesProcessor.java b/VadereSimulator/src/org/vadere/simulator/projects/dataprocessing/processor/PedestrianCommandIdsReceivedTimesProcessor.java index 8c73cfa4f..5c22a2084 100644 --- a/VadereSimulator/src/org/vadere/simulator/projects/dataprocessing/processor/PedestrianCommandIdsReceivedTimesProcessor.java +++ b/VadereSimulator/src/org/vadere/simulator/projects/dataprocessing/processor/PedestrianCommandIdsReceivedTimesProcessor.java @@ -34,16 +34,18 @@ public class PedestrianCommandIdsReceivedTimesProcessor extends DataProcessor groupMembers = ped.getPedGroupMembers(); int commandId = ped.getMostImportantStimulus().getId(); //if (commandId > 0) { this.putValue(new TimestepPedestrianIdKey(timeStep, ped.getId()), commandId); - - for (Pedestrian groupMember : groupMembers) { - // assign command id = 0 to pedestrian that follow other pedestrians (group member decisions) - this.putValue(new TimestepPedestrianIdKey(timeStep, groupMember.getId()), 0); - this.getProcessedAgentIds().add(groupMember.getId()); + this.getProcessedAgentIds().add(ped.getId()); + + if (ped.isGroupMember() != null) { + for (Pedestrian groupMember : ped.isGroupMember().getPedGroupMembers()) { + // assign command id = 0 to pedestrian that follow other pedestrians (group member decisions) + this.putValue(new TimestepPedestrianIdKey(timeStep, groupMember.getId()), 0); + this.getProcessedAgentIds().add(groupMember.getId()); + } } //} } diff --git a/VadereSimulator/tests/org/vadere/simulator/control/TargetChangerControllerTest.java b/VadereSimulator/tests/org/vadere/simulator/control/TargetChangerControllerTest.java index 816bd34c3..b2ffa2250 100644 --- a/VadereSimulator/tests/org/vadere/simulator/control/TargetChangerControllerTest.java +++ b/VadereSimulator/tests/org/vadere/simulator/control/TargetChangerControllerTest.java @@ -5,6 +5,7 @@ import org.junit.Before; import org.junit.Test; import org.vadere.simulator.control.scenarioelements.TargetChangerController; import org.vadere.simulator.control.scenarioelements.targetchanger.TargetChangerAlgorithm; +import org.vadere.simulator.models.groups.cgm.CentroidGroupModel; import org.vadere.state.attributes.scenario.AttributesAgent; import org.vadere.state.attributes.scenario.AttributesTarget; import org.vadere.state.attributes.scenario.AttributesTargetChanger; @@ -47,6 +48,7 @@ public class TargetChangerControllerTest { private Topography topography; private List pedestrians; private List targets; + private CentroidGroupModel cgm; double simTimeInSec = 0; // The "TargetChanger" is added by each test individually // to meet the requirements of the test. @@ -57,6 +59,7 @@ public class TargetChangerControllerTest { pedestrians = createTwoPedestrianWithTargetT1(1); targets = createTwoTargets(); simTimeInSec = 0; + cgm = new CentroidGroupModel(); for (Pedestrian pedestrian : pedestrians) { topography.addElement(pedestrian); @@ -111,14 +114,16 @@ public class TargetChangerControllerTest { groupId.add(42); Pedestrian pedestrian1 = new Pedestrian(new AttributesAgent(startId), random); + pedestrian1.registerGroupAccess(cgm); pedestrian1.setPosition(new VPoint(5, 1)); pedestrian1.setTargets(target); - pedestrian1.setGroupIds(groupId); + pedestrian1.isGroupMember().setGroupIds(groupId); Pedestrian pedestrian2 = new Pedestrian(new AttributesAgent(startId + 1), random); + pedestrian2.registerGroupAccess(cgm); pedestrian2.setPosition(new VPoint(1, 1)); pedestrian2.setTargets(target); - pedestrian2.setGroupIds(groupId); + pedestrian2.isGroupMember().setGroupIds(groupId); LinkedList list1 = new LinkedList<>(); list1.add(pedestrian1); @@ -126,8 +131,8 @@ public class TargetChangerControllerTest { LinkedList list2 = new LinkedList<>(); list2.add(pedestrian2); - pedestrian1.setAgentsInGroup(list2); - pedestrian2.setAgentsInGroup(list1); + pedestrian1.isGroupMember().setAgentsInGroup(list2); + pedestrian2.isGroupMember().setAgentsInGroup(list1); // Watch out: Use an "ArrayList" to keep order and // index 0 refers to pedestrian p1! diff --git a/VadereState/src/org/vadere/state/scenario/GroupAccess.java b/VadereState/src/org/vadere/state/scenario/GroupAccess.java index 206559341..3c65d5d4f 100644 --- a/VadereState/src/org/vadere/state/scenario/GroupAccess.java +++ b/VadereState/src/org/vadere/state/scenario/GroupAccess.java @@ -7,9 +7,10 @@ import java.util.List; public interface GroupAccess { void setGroupIds(List groupIds, Pedestrian ped); - List getGroupIds(Pedestrian ped); - List getGroupSizes(Pedestrian ped); + LinkedList getGroupIds(Pedestrian ped); + LinkedList getGroupSizes(Pedestrian ped); void setGroupSizes(LinkedList groupSizes, Pedestrian ped); List getPedGroupMembers(Pedestrian ped); void setAgentsInGroup(final List agentsInGroup, Pedestrian ped); + void addGroupId(int groupId, Pedestrian ped); } diff --git a/VadereState/src/org/vadere/state/scenario/GroupMember.java b/VadereState/src/org/vadere/state/scenario/GroupMember.java index 882d565d9..468d9cac0 100644 --- a/VadereState/src/org/vadere/state/scenario/GroupMember.java +++ b/VadereState/src/org/vadere/state/scenario/GroupMember.java @@ -13,24 +13,27 @@ public class GroupMember { this.groupAccess = groupAccess; } - void setGroupIds(LinkedList groupIds) { + public void setGroupIds(LinkedList groupIds) { groupAccess.setGroupIds(groupIds, member); - }; - List getGroupIds() { + } + public LinkedList getGroupIds() { return groupAccess.getGroupIds(member); - }; - List getGroupSizes() { + } + public LinkedList getGroupSizes() { return groupAccess.getGroupSizes(member); - }; - void setGroupSizes(LinkedList sizes) { + } + public void setGroupSizes(LinkedList sizes) { groupAccess.setGroupSizes(sizes, member); } - List getPedGroupMembers() { + public List getPedGroupMembers() { return groupAccess.getPedGroupMembers(member); - }; - void setAgentsInGroup(final LinkedList agentsInGroup) { + } + public void setAgentsInGroup(final LinkedList agentsInGroup) { groupAccess.setAgentsInGroup(agentsInGroup, member); - }; + } + public void addGroupId(int groupId) { + groupAccess.addGroupId(groupId, member); + } } diff --git a/VadereState/src/org/vadere/state/scenario/Pedestrian.java b/VadereState/src/org/vadere/state/scenario/Pedestrian.java index 3312ad826..cceb9b910 100644 --- a/VadereState/src/org/vadere/state/scenario/Pedestrian.java +++ b/VadereState/src/org/vadere/state/scenario/Pedestrian.java @@ -36,15 +36,7 @@ public class Pedestrian extends Agent { private ExposureModelHealthStatus healthStatus; private DoseResponseModelInfectionStatus infectionStatus; - private GroupMember groupMember; - - //TODO - private LinkedList groupIds; // TODO should actually be an attribute or a member of a subclass - //TODO - private LinkedList groupSizes; - - //TODO - private LinkedList agentsInGroup = new LinkedList<>(); + private transient GroupMember groupMember; /** @@ -170,16 +162,6 @@ public class Pedestrian extends Agent { return psychologyStatus.getKnowledgeBase(); } - //TODO - public LinkedList getGroupIds() { - return groupIds; - } - - //TODO - public LinkedList getGroupSizes() { - return groupSizes; - } - public T getModelPedestrian(Class modelType) { return (T) modelPedestrianMap.get(modelType); } @@ -240,6 +222,10 @@ public class Pedestrian extends Agent { } // Setter + public void setGroupMember(GroupMember groupMember) { + this.groupMember = groupMember; + } + public void registerGroupAccess(GroupAccess groupAccess) { this.groupMember = new GroupMember(this, groupAccess); } @@ -277,16 +263,6 @@ public class Pedestrian extends Agent { psychologyStatus.setGroupMembership(groupMembership); } - //TODO - public void setGroupIds(LinkedList groupIds) { - this.groupIds = groupIds; - } - - //TODO - public void setGroupSizes(LinkedList groupSizes) { - this.groupSizes = groupSizes; - } - public ModelPedestrian setModelPedestrian(T modelPedestrian) { return modelPedestrianMap.put(modelPedestrian.getClass(), modelPedestrian); } @@ -342,23 +318,6 @@ public class Pedestrian extends Agent { return new Pedestrian(this); } - - //TODO - public LinkedList getPedGroupMembers() { - this.agentsInGroup = agentsInGroup; - return agentsInGroup; - } - - //TODO - public boolean isAgentsInGroup() { - return getPedGroupMembers().size() > 0; - } - - //TODO - public void setAgentsInGroup(final LinkedList agentsInGroup) { - this.agentsInGroup = agentsInGroup; - } - @Override public void setTargets(LinkedList target) { super.setTargets(target); -- GitLab