Commit 8cc66195 authored by Julian Zobel's avatar Julian Zobel
Browse files

Merge remote-tracking branch 'origin/jz/dev-monitor' into jz/master

parents d8bfa8aa bab9cc2c
......@@ -24,9 +24,7 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import de.tud.kom.p2psim.api.scenario.ConfigurationException;
import de.tud.kom.p2psim.api.topology.Topology;
import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.Randoms;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
......@@ -44,12 +42,10 @@ import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
* @author Christoph Muenker, Julian Zobel
* @version 1.21, 12 2018
*/
public class RandomAttractionGenerator implements IAttractionGenerator {
public class RandomAttractionGenerator extends AbstractAttractionProvider {
private Random rand;
private PositionVector worldDimension;
private int numberOfAttractionPoints;
private boolean numberOfAPsSet = false;
......@@ -62,9 +58,9 @@ public class RandomAttractionGenerator implements IAttractionGenerator {
@XMLConfigurableConstructor({"numberOfAttractionPoints", "maximumRadius", "minimumRadius", "minimumDistance"})
public RandomAttractionGenerator(int numberOfAttractionPoints, double maximumRadius, double minimumRadius, double minimumDistance) {
this.rand = Randoms.getRandom(RandomAttractionGenerator.class);
this.worldDimension = Binder.getComponentOrNull(Topology.class)
.getWorldDimensions();
super();
this.rand = Randoms.getRandom(RandomAttractionGenerator.class);
if (numberOfAttractionPoints <= 0) {
throw new ConfigurationException(
"NumberOfAttractionPoints should be at least 1!");
......@@ -74,25 +70,25 @@ public class RandomAttractionGenerator implements IAttractionGenerator {
this.maximumRadius = maximumRadius;
this.minimumRadius = minimumRadius;
this.minimumDistance = minimumDistance;
attractionPoints.clear();
createAttractionPoints();
}
@Override
public List<IAttractionPoint> getAttractionPoints() {
public LinkedList<AttractionPoint> getAttractionPoints() {
if (!numberOfAPsSet) {
throw new ConfigurationException(
"Number of Attraction Points is not set in RandomAttractionGenerator!");
}
if(attractionPoints.isEmpty())
if(super.getAttractionPoints().isEmpty())
createAttractionPoints();
return attractionPoints;
return super.getAttractionPoints();
}
private void createAttractionPoints() {
List<IAttractionPoint> result = new LinkedList<IAttractionPoint>();
LinkedList<AttractionPoint> result = new LinkedList<AttractionPoint>();
// make a break counter to prevent more than 10 iterations and an infinity loop in general.
int c = 0;
......@@ -130,15 +126,13 @@ public class RandomAttractionGenerator implements IAttractionGenerator {
radius = minimumRadius;
}
IAttractionPoint aPoint = new AttractionPointImpl("AP-"+i, posVec);
AttractionPoint aPoint = new AttractionPoint("AP-"+i, posVec);
aPoint.setRadius(radius);
c = 0;
result.add(aPoint);
}
attractionPoints.clear();
for (IAttractionPoint ap : result) {
for (AttractionPoint ap : result) {
addAttractionPoint(ap);
}
}
......
......@@ -20,18 +20,15 @@
package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction;
import java.util.List;
import java.util.Random;
import de.tud.kom.p2psim.api.scenario.ConfigurationException;
import de.tud.kom.p2psim.api.topology.Topology;
import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.Event;
import de.tudarmstadt.maki.simonstrator.api.EventHandler;
import de.tudarmstadt.maki.simonstrator.api.Monitor;
import de.tudarmstadt.maki.simonstrator.api.Monitor.Level;
import de.tudarmstadt.maki.simonstrator.api.Randoms;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/**
......@@ -46,12 +43,10 @@ import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
* @author Julian Zobel
* @version 1.0, March 2019
*/
public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
public class RandomDynamicAttractionGenerator extends AbstractAttractionProvider {
private Random rand;
private PositionVector worldDimension;
private int minNumberOfAttractionPoints;
private int maxNumberOfAttractionPoints;
......@@ -70,9 +65,7 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
double minimumDistance) {
this.rand = Randoms.getRandom(RandomDynamicAttractionGenerator.class);
this.worldDimension = Binder.getComponentOrNull(Topology.class)
.getWorldDimensions();
if (minNumberOfAttractionPoints <= 0) {
throw new ConfigurationException(
"NumberOfAttractionPoints should be at least 1!");
......@@ -91,26 +84,15 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
this.minDynamicIntervall = minDynamicIntervall;
this.maxDynamicIntervall = maxDynamicIntervall;
attractionPoints.clear();
updateAttractionPoints();
}
@Override
public List<IAttractionPoint> getAttractionPoints() {
return attractionPoints;
}
/**
*
* @return an integer representing a randomly chosen number of attraction points within the allowed range of numbers
*/
private int randomNumberOfAttractionPoints() {
return minNumberOfAttractionPoints + rand.nextInt((maxNumberOfAttractionPoints - minNumberOfAttractionPoints) + 1);
}
private void scheduleDynamicEvent(IAttractionPoint attractionPoint) {
private void scheduleDynamicEvent(AttractionPoint attractionPoint) {
long r = (long) (rand.nextDouble() * (maxDynamicIntervall - minDynamicIntervall)) + minDynamicIntervall;
......@@ -118,7 +100,7 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
@Override
public void eventOccurred(Object content, int type) {
// maybe was already removed...
if(attractionPoints.contains(attractionPoint)) {
if(hasAttractionPoint(attractionPoint)) {
removeAttractionPoint(attractionPoint);
updateAttractionPoints();
}
......@@ -128,29 +110,30 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
protected void updateAttractionPoints() {
int numberOfAttractionPoints = randomNumberOfAttractionPoints();
int currentSize = getAttractionPoints().size();
// do nothing if this is the required amount of attraction points
if(numberOfAttractionPoints == attractionPoints.size()) {
if(numberOfAttractionPoints == currentSize) {
return;
}
// remove until this number fits
else if(numberOfAttractionPoints < attractionPoints.size()) {
int deltaAP = attractionPoints.size() - numberOfAttractionPoints;
else if(numberOfAttractionPoints < currentSize) {
int deltaAP = currentSize - numberOfAttractionPoints;
for(int i = 0; i < deltaAP; i++) {
int random = rand.nextInt(attractionPoints.size());
removeAttractionPoint(attractionPoints.get(random));
int random = rand.nextInt(currentSize);
removeAttractionPoint(getAttractionPoints().get(random));
}
return;
}
// add more attraction points until it fits
else {
int deltaAP = numberOfAttractionPoints - attractionPoints.size();
int deltaAP = numberOfAttractionPoints - currentSize;
for(int i = 0; i < deltaAP; i++) {
IAttractionPoint newAP = createAttractionPoint();
AttractionPoint newAP = createAttractionPoint();
scheduleDynamicEvent(newAP);
addAttractionPoint(newAP);
}
......@@ -162,7 +145,7 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
*
* @return
*/
private IAttractionPoint createAttractionPoint() {
private AttractionPoint createAttractionPoint() {
// make a break counter to prevent more than 100 iterations and an infinity loop in general.
int c = 100;
......@@ -181,7 +164,7 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
}
// if within world dimensions, continue checking against other attraction points
for (IAttractionPoint ap : attractionPoints) {
for (AttractionPoint ap : getAttractionPoints()) {
// if this point is closer than the given minimum distance to another point, or the radii of the points would overlap,
// or if the radius would exceed the simulation area
// then discard this attraction point and create a new one
......@@ -195,12 +178,12 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
radius = 0;
}
IAttractionPoint aPoint = new AttractionPointImpl("AP-" + rand.nextInt(), posVec);
AttractionPoint aPoint = new AttractionPoint("AP-" + rand.nextInt(), posVec);
aPoint.setRadius(radius);
return aPoint;
}
IAttractionPoint ap = new AttractionPointImpl("AP-ERROR", new PositionVector(worldDimension.getX() / 2, worldDimension.getY() / 2));
AttractionPoint ap = new AttractionPoint("AP-ERROR", new PositionVector(worldDimension.getX() / 2, worldDimension.getY() / 2));
ap.setRadius(0);
ap.setWeight(0);
......@@ -208,13 +191,10 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
return ap;
}
private PositionVector createPosVec() {
double x = rand.nextDouble() * worldDimension.getX();
double y = rand.nextDouble() * worldDimension.getY();
return new PositionVector(x, y);
}
}
}
......@@ -23,7 +23,7 @@ package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction;
import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
public class TemporalAttractionPoint extends BasicAttractionPoint {
public class TemporalAttractionPoint extends AttractionPoint {
private long placementTime;
private long removalTime;
......
......@@ -20,33 +20,21 @@
package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction;
import java.util.List;
import de.tud.kom.p2psim.api.topology.Topology;
import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/**
* Implementation of the interface {@link AttractionGenerator}.
*
* Generates the given number of {@link IAttractionPoint}s and sets the
* position randomly within the world dimensions.
*
* @author Julian Zobel
* @version 1.0, Nov 2018
*/
public class TwoPointFixedAttractionGenerator implements IAttractionGenerator {
private PositionVector worldDimension;
public class TwoPointFixedAttractionGenerator extends AbstractAttractionProvider {
private double x1, x2, y1, y2;
@XMLConfigurableConstructor({ "x1", "y1", "x2", "y2"})
public TwoPointFixedAttractionGenerator(double x1, double y1, double x2, double y2) {
this.worldDimension = Binder.getComponentOrNull(Topology.class)
.getWorldDimensions();
super();
this.x1 = x1;
this.y1 = y1;
......@@ -55,27 +43,19 @@ public class TwoPointFixedAttractionGenerator implements IAttractionGenerator {
createAttractionPoints();
}
@Override
public List<IAttractionPoint> getAttractionPoints() {
if(attractionPoints.isEmpty())
createAttractionPoints();
return attractionPoints;
}
private void createAttractionPoints() {
PositionVector p1 = new PositionVector(x1, y1);
IAttractionPoint ap1 = new AttractionPointImpl("AP1", p1);
AttractionPoint ap1 = new AttractionPoint("AP1", p1);
ap1.setRadius(100);
attractionPoints.add(ap1);
addAttractionPoint(ap1);
PositionVector p2 = new PositionVector(x2, y2);
IAttractionPoint ap2 = new AttractionPointImpl("AP2", p2);
AttractionPoint ap2 = new AttractionPoint("AP2", p2);
ap2.setRadius(100);
attractionPoints.add(ap2);
addAttractionPoint(ap2);
}
......
......@@ -65,7 +65,7 @@ public class HostAtAttractionPointCounter {
* @param IAttractionPoint The {@link IAttractionPoint} to be checked.
* @return Integer
*/
public static int getHostCountOfAttractionPoint(IAttractionPoint attractionPoint, Set<SimLocationActuator> hostsToConsider) {
public static int getHostCountOfAttractionPoint(IAttractionPoint attractionPoint, LinkedHashSet<SimLocationActuator> hostsToConsider) {
return getHostsOfAttractionPoint(attractionPoint, hostsToConsider).size();
}
......@@ -75,9 +75,9 @@ public class HostAtAttractionPointCounter {
* @param IAttractionPoint The {@link IAttractionPoint} to be checked.
* @return Set<SimLocationActuator>
*/
public static Set<SimLocationActuator> getHostsOfAttractionPoint(IAttractionPoint attractionPoint, Set<SimLocationActuator> hostsToConsider) {
public static LinkedHashSet<SimLocationActuator> getHostsOfAttractionPoint(IAttractionPoint attractionPoint, Set<SimLocationActuator> hostsToConsider) {
Set<SimLocationActuator> hosts = new LinkedHashSet<SimLocationActuator>();
LinkedHashSet<SimLocationActuator> hosts = new LinkedHashSet<SimLocationActuator>();
for(SimLocationActuator h : hostsToConsider) {
if(isHostInAttractionPointArea(h, attractionPoint)) {
......
......@@ -22,13 +22,8 @@ package de.tud.kom.p2psim.impl.topology.movement.modularosm.groups;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.ISocialGroupMovementAnalyzer;
import de.tud.kom.p2psim.impl.util.Tuple;
import de.tudarmstadt.maki.simonstrator.api.Monitor;
import de.tudarmstadt.maki.simonstrator.api.Time;
/**
......@@ -40,15 +35,15 @@ import de.tudarmstadt.maki.simonstrator.api.Time;
public class MovementGroupContainer {
private static MovementGroupContainer instance;
private Set<SocialMovementGroup> groups;
private LinkedHashSet<SocialMovementGroup> groups;
// Mappings
private Map<SimLocationActuator, Long> leftGroupAtTime;
private Map<SimLocationActuator, Boolean> hasMerged;
private Map<SimLocationActuator, Long> mergedAtTime;
private LinkedHashMap<SimLocationActuator, Long> leftGroupAtTime;
private LinkedHashMap<SimLocationActuator, Boolean> hasMerged;
private LinkedHashMap<SimLocationActuator, Long> mergedAtTime;
// Waiting Groups, used for encounter strategy Wait. Includes remaining waiting time and last update time
public Map<SocialMovementGroup, Tuple<Long, Long>> waitingGroups;
public LinkedHashMap<SocialMovementGroup, Tuple<Long, Long>> waitingGroups;
private MovementGroupContainer() {
groups = new LinkedHashSet<>();
......@@ -282,15 +277,15 @@ public class MovementGroupContainer {
*
* @author Marcel Verst
*/
public Set<SimLocationActuator> getGroupMembers(SimLocationActuator host){
public LinkedHashSet<SimLocationActuator> getGroupMembers(SimLocationActuator host){
return getGroupOfHost(host).getMembers();
}
public Set<SocialMovementGroup> getGroups() {
public LinkedHashSet<SocialMovementGroup> getGroups() {
return groups;
}
public void setGroups(Set<SocialMovementGroup> groups) {
public void setGroups(LinkedHashSet<SocialMovementGroup> groups) {
this.groups = groups;
}
......@@ -307,23 +302,23 @@ public class MovementGroupContainer {
}
}
public void setLeftGroupAtTime(Map<SimLocationActuator, Long> leftGroupAtTime) {
public void setLeftGroupAtTime(LinkedHashMap<SimLocationActuator, Long> leftGroupAtTime) {
this.leftGroupAtTime = leftGroupAtTime;
}
public Map<SimLocationActuator, Boolean> getHasMerged() {
public LinkedHashMap<SimLocationActuator, Boolean> getHasMerged() {
return hasMerged;
}
public void setHasMerged(Map<SimLocationActuator, Boolean> hasMerged) {
public void setHasMerged(LinkedHashMap<SimLocationActuator, Boolean> hasMerged) {
this.hasMerged = hasMerged;
}
public Map<SimLocationActuator, Long> getMergedAtTime() {
public LinkedHashMap<SimLocationActuator, Long> getMergedAtTime() {
return mergedAtTime;
}
public void setMergedAtTime(Map<SimLocationActuator, Long> mergedAtTime) {
public void setMergedAtTime(LinkedHashMap<SimLocationActuator, Long> mergedAtTime) {
this.mergedAtTime = mergedAtTime;
}
}
\ No newline at end of file
......@@ -22,7 +22,6 @@ package de.tud.kom.p2psim.impl.topology.movement.modularosm.groups;
import java.util.LinkedHashSet;
import java.util.Random;
import java.util.Set;
import java.util.UUID;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
......@@ -39,6 +38,7 @@ public class SocialMovementGroup {
public final UUID groupID;
private Random rand = Randoms.getRandom(SocialMovementGroup.class);
private SimLocationActuator leader;
private LinkedHashSet<SimLocationActuator> members;
......@@ -67,7 +67,7 @@ public class SocialMovementGroup {
* @param Set<SimLocationActuator> All participants of the group.
* @param int The ID of the group.
*/
public SocialMovementGroup(Set<SimLocationActuator> participants) {
public SocialMovementGroup(LinkedHashSet<SimLocationActuator> participants) {
this.groupID = UUID.randomUUID();
......@@ -115,8 +115,7 @@ public class SocialMovementGroup {
*/
public SimLocationActuator getRandomMember() {
if(members.size() > 1) {
Random rand = Randoms.getRandom(SocialMovementGroup.class);
if(members.size() > 1) {
int item = rand.nextInt(members.size() - 1);
int i = 0;
......@@ -170,11 +169,11 @@ public class SocialMovementGroup {
return members.size();
}
public Set<SimLocationActuator> getMembers() {
return members;
public LinkedHashSet<SimLocationActuator> getMembers() {
return new LinkedHashSet<SimLocationActuator>(members);
}
public void setMembers(Set<SimLocationActuator> participants) {
public void setMembers(LinkedHashSet<SimLocationActuator> participants) {
this.members = new LinkedHashSet<>(participants);
}
......
......@@ -22,8 +22,6 @@ package de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.groupencounte
import java.util.LinkedHashSet;
import java.util.Random;
import java.util.Set;
import de.tud.kom.p2psim.api.scenario.ConfigurationException;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.ISocialGroupMovementAnalyzer;
......@@ -100,14 +98,14 @@ public abstract class AbstractGroupEncounter implements IGroupEncounterBehavior
*
* @return
*/
private Set<Pair<SocialMovementGroup>> getEncounteringGroups() {
private LinkedHashSet<Pair<SocialMovementGroup>> getEncounteringGroups() {
if(!enableGroupEncounters)
return null;
Set<Pair<SocialMovementGroup>> encounteringGroups = new LinkedHashSet<>();
Set<SocialMovementGroup> alreadyProcessed = new LinkedHashSet<>();
LinkedHashSet<Pair<SocialMovementGroup>> encounteringGroups = new LinkedHashSet<>();
LinkedHashSet<SocialMovementGroup> alreadyProcessed = new LinkedHashSet<>();
Set<SocialMovementGroup> allGroups = groupCon.getGroups();
LinkedHashSet<SocialMovementGroup> allGroups = groupCon.getGroups();
for(SocialMovementGroup group1 : allGroups) {
for(SocialMovementGroup group2 : allGroups) {
......@@ -148,7 +146,7 @@ public abstract class AbstractGroupEncounter implements IGroupEncounterBehavior
if(!enableGroupEncounters)
return;
Set<Pair<SocialMovementGroup>> encounteringGroups = getEncounteringGroups();
LinkedHashSet<Pair<SocialMovementGroup>> encounteringGroups = getEncounteringGroups();
if(encounteringGroups == null || encounteringGroups.isEmpty()) {
return;
......@@ -269,7 +267,7 @@ public abstract class AbstractGroupEncounter implements IGroupEncounterBehavior
SocialMovementGroup large = getLargerGroup(group1, group2);
SocialMovementGroup small = getSmallerGroup(group1, group2);
Set<SimLocationActuator> toRemove = new LinkedHashSet<>(small.getMembers());
LinkedHashSet<SimLocationActuator> toRemove = new LinkedHashSet<>(small.getMembers());
for(SimLocationActuator participant : toRemove) {
small.removeHostFromGroup(participant);
......
......@@ -20,11 +20,9 @@
package de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.groupencounter;
import java.util.Set;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.SocialGroupMovementModel;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.SocialMovementGroup;
import de.tudarmstadt.maki.simonstrator.api.common.datastructures.Pair;
/**
* Handles group encounters. Check group encounters based on the leaders location of {@link SocialMovementGroup}s.
......
......@@ -21,6 +21,7 @@
package de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.groupforming;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Random;
import java.util.Set;
......@@ -30,7 +31,7 @@ import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.ISocialGroupMovementAnalyzer;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.SocialGroupMovementModel;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.BasicAttractionPoint;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionGenerator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionProvider;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.hostcount.HostAtAttractionPointCounter;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.SocialMovementGroup;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.MovementGroupContainer;
......@@ -138,9 +139,14 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior {
stayDuration.put(host.getHost().getId(), new Tuple<Long, Long>(0L, Time.getCurrentTime()));
}
if(!enableGroups) {
return;
}
for(int g = 0; g < maxNumberOfGroups; g++) {
long delay = Math.max(Time.MINUTE, (long) ((rand.nextDouble() * (Time.MINUTE * 45) + Time.MINUTE)));
System.out.println("("+g+") Init Group Formation Time " + Time.getFormattedTime(delay) );
//System.out.println("("+g+") Init Group Formation Time " + Time.getFormattedTime(delay) );
Event.scheduleWithDelay(delay, new EventHandler() {
@Override
......@@ -183,7 +189,7 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior {
else {
// int groupsize = (int) Math.max(1, rand.nextGaussian() * 0.93 + 2.76);
int groupsize = rand.nextInt(maxGroupSize - minGroupSize + 1) + minGroupSize;
System.out.println("[AbstractGroupForming] Group Size: " + groupsize + " ("+minGroupSize+"/"+maxGroupSize+")");
//System.out.println("[AbstractGroupForming] Group Size: " + groupsize + " ("+minGroupSize+"/"+maxGroupSize+")");
return groupsize;
}
//return rand.nextInt(maxGroupSize - minGroupSize) + minGroupSize;
......@@ -194,7 +200,7 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior {
*
* @param Set<SimLocationActuator> The members which want to form a group.
*/
protected void createGroup(Set<SimLocationActuator> members) {
protected void createGroup(LinkedHashSet<SimLocationActuator> members) {
SocialMovementGroup group = new SocialMovementGroup(members);
// force a new attraction point assignment on the leader
......@@ -293,7 +299,7 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior {
IAttractionPoint result = null;
long maxDuration = 0;
for(IAttractionPoint ap : IAttractionGenerator.attractionPoints) {
for(IAttractionPoint ap : movementModel.getAttractionPoints()) {
for(SimLocationActuator host : HostAtAttractionPointCounter.getHostsOfAttractionPoint(ap, movementModel.getAllLocationActuators())) {
INodeID id = host.getHost().getId();
long duration = stayDuration.get(id).getA();
......@@ -311,7 +317,7 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior {
protected IAttractionPoint getAttractionPointWithMostHosts() {
IAttractionPoint apCandidate = null;
int size = 0;
for(IAttractionPoint ap : IAttractionGenerator.attractionPoints) {
for(IAttractionPoint ap : movementModel.getAttractionPoints()) {
int numberOfHostsInAP = HostAtAttractionPointCounter.getHostCountOfAttractionPoint(ap, movementModel.getAllLocationActuators());
if(numberOfHostsInAP > size) {
apCandidate = ap;
......
......@@ -23,12 +23,9 @@ package de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.groupforming;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Set;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.api.topology.movement.local.LocalMovementStrategy;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.ISocialGroupMovementAnalyzer;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionGenerator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.hostcount.HostAtAttractionPointCounter;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.SocialMovementGroup;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.transition.IAttractionAssigmentStrategy;
......@@ -92,17 +89,17 @@ public class DefaultGroupForming extends AbstractGroupForming {
@Override
protected void assembleGroup() {
IAttractionPoint apCandidate = IAttractionGenerator.attractionPoints.get(rand.nextInt(IAttractionGenerator.attractionPoints.size()));
IAttractionPoint apCandidate = movementModel.getAttractionPoints().get(rand.nextInt(movementModel.getAttractionPoints().size()));
if(apCandidate == null) {
return;
}
Set<SimLocationActuator> hostsAtAttractionPoint = HostAtAttractionPointCounter.getHostsOfAttractionPoint(apCandidate, movementModel.getAllLocationActuators());
LinkedHashSet<SimLocationActuator> hostsAtAttractionPoint = HostAtAttractionPointCounter.getHostsOfAttractionPoint(apCandidate, movementModel.getAllLocationActuators());
int numberOfHostsInAttractionPoint = hostsAtAttractionPoint.size();
int groupSize = this.rndGroupSize(numberOfHostsInAttractionPoint);
Set<SimLocationActuator> groupCandidates = new LinkedHashSet<>();
LinkedHashSet<SimLocationActuator> groupCandidates = new LinkedHashSet<>();
// shuffle the hosts at the attraction point (more randomness ftw!)
LinkedList<SimLocationActuator> randomShuffledHostsAtAttractionPoint = new LinkedList<>(hostsAtAttractionPoint);
......@@ -169,9 +166,9 @@ public class DefaultGroupForming extends AbstractGroupForming {
LocalMovementStrategy movementStrategy = movementModel.getMovementStrategy();
IAttractionAssigmentStrategy transition = movementModel.getAttractionAssignmentStrategy();
Set<SocialMovementGroup> groupsToRemove = new LinkedHashSet<>();
LinkedHashSet<SocialMovementGroup> groupsToRemove = new LinkedHashSet<>();
Set<SocialMovementGroup> groups = groupCon.getGroups();
LinkedHashSet<SocialMovementGroup> groups = groupCon.getGroups();
for(SocialMovementGroup group : groups) {
SimLocationActuator leader = group.getLeader();
......
......@@ -22,16 +22,13 @@ package de.tud.kom.p2psim.impl.topology.movement.modularosm.transition;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.IAttractionBasedMovementAnalyzer;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionGenerator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionProvider;
import de.tudarmstadt.maki.simonstrator.api.Monitor;
import de.tudarmstadt.maki.simonstrator.api.Randoms;
import de.tudarmstadt.maki.simonstrator.api.Time;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
/**
......@@ -43,12 +40,13 @@ import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractio
public abstract class AbstractAttractionBasedAssignmentStrategy implements IAttractionAssigmentStrategy {
protected Random rnd = Randoms.getRandom(AbstractAttractionBasedAssignmentStrategy.class);
protected Map<SimLocationActuator, IAttractionPoint> assignments = new LinkedHashMap<>();
protected Map<SimLocationActuator, IAttractionPoint> lastAssignments = new LinkedHashMap<>();
protected IAttractionProvider attractionProvider;
protected LinkedHashMap<SimLocationActuator, IAttractionPoint> assignments = new LinkedHashMap<>();
protected LinkedHashMap<SimLocationActuator, IAttractionPoint> lastAssignments = new LinkedHashMap<>();
private List<AttractionAssignmentListener> listeners = new LinkedList<>();
private LinkedList<AttractionAssignmentListener> listeners = new LinkedList<>();
protected long defaultPauseTimeMin = 0;
protected long defaultPauseTimeMax = 0;
......@@ -63,6 +61,10 @@ public abstract class AbstractAttractionBasedAssignmentStrategy implements IAttr
this.defaultPauseTimeMin = defaultPauseTimeMin;
}
public void setAttractionProvider(IAttractionProvider attractionProvider) {
this.attractionProvider = attractionProvider;
}
@Override
public IAttractionPoint getAssignment(SimLocationActuator host) {
return assignments.get(host);
......@@ -137,8 +139,8 @@ public abstract class AbstractAttractionBasedAssignmentStrategy implements IAttr
protected IAttractionPoint getNewAttractionPointAssignment(SimLocationActuator host) {
double score = rnd.nextDouble();
List<IAttractionPoint> candidates = new LinkedList<>();
for (IAttractionPoint ap : IAttractionGenerator.attractionPoints) {
LinkedList<IAttractionPoint> candidates = new LinkedList<>();
for (IAttractionPoint ap : attractionProvider.getAttractionPoints()) {
// skip null values (should never occur!)
if(ap == null) {
continue;
......@@ -167,7 +169,7 @@ public abstract class AbstractAttractionBasedAssignmentStrategy implements IAttr
// fallback: if no attraction point is considered, randomly select one, except the current assignment
if (candidates.isEmpty()) {
candidates.addAll(IAttractionGenerator.attractionPoints);
candidates.addAll(attractionProvider.getAttractionPoints());
if(assignments.containsKey(host) && candidates.size() > 1) {
candidates.remove(assignments.get(host));
......@@ -181,7 +183,7 @@ public abstract class AbstractAttractionBasedAssignmentStrategy implements IAttr
@Override
public boolean hostInAttractionPointArea(SimLocationActuator host) {
for(IAttractionPoint ap : IAttractionGenerator.attractionPoints) {
for(IAttractionPoint ap : attractionProvider.getAttractionPoints()) {
if(ap.distanceTo(host.getRealPosition()) <= ap.getRadius()) {
return true;
}
......
......@@ -25,7 +25,7 @@ import java.util.Map;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.ISocialGroupMovementAnalyzer;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.ModularMovementModel;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionGenerator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionProvider;
import de.tudarmstadt.maki.simonstrator.api.Event;
import de.tudarmstadt.maki.simonstrator.api.EventHandler;
import de.tudarmstadt.maki.simonstrator.api.Monitor;
......@@ -101,7 +101,7 @@ public class AttractionPointRoamingStrategy extends AbstractAttractionBasedAssig
IAttractionPoint currentAttractionPoint = this.assignments.get(comp);
// if the attraction point was removed in the meantime, go directly to transit state
if(currentAttractionPoint == null || !IAttractionGenerator.attractionPoints.contains(currentAttractionPoint)) {
if(currentAttractionPoint == null || !attractionProvider.getAttractionPoints().contains(currentAttractionPoint)) {
this.addComponent(comp);
}
else {
......
......@@ -28,7 +28,7 @@ import de.tud.kom.p2psim.api.common.SimHost;
import de.tud.kom.p2psim.api.common.SimHostComponent;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.ModularMovementModel;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionGenerator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionProvider;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
/**
......@@ -62,14 +62,14 @@ public class FixedAssignmentStrategy extends AbstractAttractionBasedAssignmentSt
// No assignments been done before.
if (assignments.isEmpty()) {
IAttractionPoint aPoint = IAttractionGenerator.attractionPoints.iterator().next();
IAttractionPoint aPoint = attractionProvider.getAttractionPoints().iterator().next();
assignments.put(ms, aPoint);
mappingGroupId(ms, aPoint);
}
// GroupId is not mapped.
else if (!mappingGroupIdAP.containsKey(mappingMSHost.get(ms)
.getProperties().getGroupID())) {
for (IAttractionPoint actAP : IAttractionGenerator.attractionPoints) {
for (IAttractionPoint actAP : attractionProvider.getAttractionPoints()) {
if (!mappingAPGroupId.containsKey(actAP)) {
assignments.put(ms, actAP);
mappingGroupId(ms, actAP);
......
......@@ -21,6 +21,7 @@
package de.tud.kom.p2psim.impl.topology.movement.modularosm.transition;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionProvider;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
/**
......@@ -50,6 +51,8 @@ public interface IAttractionAssigmentStrategy {
public void removeAttractionAssignmentListener(AttractionAssignmentListener listener);
public void setAttractionProvider(IAttractionProvider attractionProvider);
/**
* Add the object and assign the MS to an {@link IAttractionPoint}.
*
......
......@@ -25,7 +25,7 @@ import java.util.Map;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.ISocialGroupMovementAnalyzer;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.ModularMovementModel;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionGenerator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionProvider;
import de.tudarmstadt.maki.simonstrator.api.Event;
import de.tudarmstadt.maki.simonstrator.api.EventHandler;
import de.tudarmstadt.maki.simonstrator.api.Monitor;
......@@ -86,7 +86,8 @@ public class InAreaRoamingTransitionStrategy extends AbstractAttractionBasedAssi
this.roamingStates.put(comp, roamingTransitionState.PAUSE);
// schedule roaming
Event.scheduleWithDelay(gaussianDistributionPauseTime(5 * Time.MINUTE, Time.MINUTE), this, comp, EVENT_ROAMING_PAUSE_ENDED);
//Event.scheduleWithDelay(gaussianDistributionPauseTime(5 * Time.MINUTE, Time.MINUTE), this, comp, EVENT_ROAMING_PAUSE_ENDED);
Event.scheduleWithDelay(15 * Time.SECOND, this, comp, EVENT_ROAMING_PAUSE_ENDED);
}
......@@ -146,7 +147,7 @@ public class InAreaRoamingTransitionStrategy extends AbstractAttractionBasedAssi
IAttractionPoint currentAttractionPoint = this.assignments.get(comp);
// if the attraction point was removed in the meantime, go directly to transit state
if(currentAttractionPoint == null || !IAttractionGenerator.attractionPoints.contains(currentAttractionPoint)) {
if(currentAttractionPoint == null || !attractionProvider.getAttractionPoints().contains(currentAttractionPoint)) {
this.addComponent(comp);
}
else {
......
......@@ -5,7 +5,7 @@ import java.util.Map;
import de.tud.kom.p2psim.api.topology.Topology;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.BasicAttractionPoint;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionGenerator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionProvider;
import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.Monitor;
......@@ -47,7 +47,7 @@ public class RandomInAreaTransitionStrategy extends AbstractAttractionBasedAssig
if(!assignments.containsKey(ms))
{
IAttractionPoint aPoint = IAttractionGenerator.attractionPoints.iterator().next();
IAttractionPoint aPoint = attractionProvider.getAttractionPoints().iterator().next();
assignments.put(ms, aPoint);
currentTarget.put(ms, nextRandomPosition(aPoint, defaultRadius));
currentSearchRadius.put(ms, defaultRadius);
......
......@@ -36,7 +36,7 @@ import de.tud.kom.p2psim.api.scenario.ConfigurationException;
import de.tud.kom.p2psim.api.topology.Topology;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.api.topology.social.SocialView;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionGenerator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionProvider;
import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.Event;
......@@ -146,8 +146,8 @@ public class SocialTransitionStrategy extends AbstractAttractionBasedAssignmentS
// position.
// TODO: needed? We do Transition as next, and this will delete the
// assignment..
IAttractionPoint nearest = IAttractionGenerator.attractionPoints.iterator().next();
for (IAttractionPoint aPoint : IAttractionGenerator.attractionPoints) {
IAttractionPoint nearest = attractionProvider.getAttractionPoints().iterator().next();
for (IAttractionPoint aPoint : attractionProvider.getAttractionPoints()) {
if (nearest.distanceTo(ms.getRealPosition()) > aPoint
.distanceTo(ms.getRealPosition())) {
nearest = aPoint;
......@@ -181,7 +181,7 @@ public class SocialTransitionStrategy extends AbstractAttractionBasedAssignmentS
List<IAttractionPoint> apFriends = getFriendsPlaces(ms);
List<IAttractionPoint> apClusters = getClusterPlaces(ms);
List<IAttractionPoint> apRandom = getRandomPlaces(ms,
(int) Math.max(IAttractionGenerator.attractionPoints.size() * 0.2, 5));
(int) Math.max(attractionProvider.getAttractionPoints().size() * 0.2, 5));
IAttractionPoint ap = null;
if (rnd.nextDouble() < socialFactor) {
......@@ -299,7 +299,7 @@ public class SocialTransitionStrategy extends AbstractAttractionBasedAssignmentS
private List<IAttractionPoint> getRandomPlaces(SimLocationActuator ms,
int number) {
List<IAttractionPoint> result = new Vector<IAttractionPoint>(IAttractionGenerator.attractionPoints);
List<IAttractionPoint> result = new Vector<IAttractionPoint>(attractionProvider.getAttractionPoints());
Collections.shuffle(result, rnd);
return result.subList(0, Math.min(result.size(), number));
}
......@@ -339,7 +339,7 @@ public class SocialTransitionStrategy extends AbstractAttractionBasedAssignmentS
private void assignFavoritePlaces(SimLocationActuator ms) {
Set<IAttractionPoint> msFavoritePlaces = new LinkedHashSet<IAttractionPoint>();
LinkedList<IAttractionPoint> temp = new LinkedList<IAttractionPoint>(
IAttractionGenerator.attractionPoints);
attractionProvider.getAttractionPoints());
Collections.shuffle(temp, rnd);
for (int i = 0; i < numberOfFavoritePlaces; i++) {
if (!temp.isEmpty()) {
......
......@@ -40,6 +40,7 @@ import de.tudarmstadt.maki.simonstrator.api.component.ComponentNotAvailableExcep
import de.tudarmstadt.maki.simonstrator.api.component.core.OracleComponent;
import de.tudarmstadt.maki.simonstrator.api.component.network.NetID;
import de.tudarmstadt.maki.simonstrator.api.component.network.NetInterface;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.component.topology.TopologyID;
import de.tudarmstadt.maki.simonstrator.api.component.topology.TopologyProvider;
......@@ -64,6 +65,8 @@ public class GlobalOracle implements OracleComponent {
private static List<NetID> bootstrapList = new LinkedList<NetID>();
private static GlobalOracle instance = new GlobalOracle();
private static Set<IAttractionPoint> attractionPoints = new LinkedHashSet<IAttractionPoint>();
private GlobalOracle() {
//
......@@ -72,6 +75,18 @@ public class GlobalOracle implements OracleComponent {
public static GlobalOracle getInstance() {
return instance;
}
public static void addAttractionPoint(IAttractionPoint attractionPoint) {
GlobalOracle.attractionPoints.add(attractionPoint);
}
public static void removeAttractionPoint(IAttractionPoint attractionPoint) {
GlobalOracle.attractionPoints.remove(attractionPoint);
}
public static Set<IAttractionPoint> getAttractionPoints() {
return attractionPoints;
}
/**
* Initial population with hosts.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment