Commit 1ca1a44e authored by Julian Zobel's avatar Julian Zobel
Browse files

Global Oracle provides knowledge on attraction points

Remodelled attraction points generators to a common abstract class and interface
parent d8bfa8aa
......@@ -28,7 +28,7 @@ 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.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.transition.IAttractionAssigmentStrategy;
......@@ -92,7 +92,7 @@ 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.getAllAttractionPoints().size()));
if(apCandidate == null) {
return;
}
......
......@@ -28,7 +28,7 @@ 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;
......@@ -43,9 +43,10 @@ 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 IAttractionProvider attractionProvider;
protected Map<SimLocationActuator, IAttractionPoint> assignments = new LinkedHashMap<>();
protected Map<SimLocationActuator, IAttractionPoint> lastAssignments = new LinkedHashMap<>();
private List<AttractionAssignmentListener> listeners = new LinkedList<>();
......@@ -63,6 +64,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);
......@@ -138,7 +143,7 @@ public abstract class AbstractAttractionBasedAssignmentStrategy implements IAttr
double score = rnd.nextDouble();
List<IAttractionPoint> candidates = new LinkedList<>();
for (IAttractionPoint ap : IAttractionGenerator.attractionPoints) {
for (IAttractionPoint ap : attractionProvider.getAttractionPoints()) {
// skip null values (should never occur!)
if(ap == null) {
continue;
......@@ -167,7 +172,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 +186,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;
......@@ -146,7 +146,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