package org.lucci.madhoc.network.monitor.measure;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;
import org.lucci.madhoc.network.Connection;
import org.lucci.madhoc.network.Station;
import org.lucci.madhoc.simulation.measure.NaturalNumberSensor;
import org.lucci.madhoc.simulation.measure.Unit;
import org.lucci.madhoc.simulation.projection.Projection;
import org.lucci.math.Utilities;
import org.lucci.util.Couple;
public class AvgTimeForRemeeting extends NaturalNumberSensor
{
private Map<Couple<Station, Station>, Double> couples = new HashMap<Couple<Station, Station>, Double>();
@Override
public Double takeNewDoubleValue(Projection projection)
{
Collection<Double> remeetingTimes = new Vector<Double>();
double time = projection.getNetwork().getSimulation().getSimulatedTime();
double timeStep = 1 / projection.getNetwork().getSimulation().getResolution();
for (Connection c : projection.getNetwork().getConnections())
{
Couple<Station, Station> couple = new Couple<Station, Station>(c.getNetworkInterface1().getNetworkingUnit().getStation(), c.getNetworkInterface2().getNetworkingUnit().getStation());
Double lastTimeSeen = couples.get(couple);
if (lastTimeSeen != null && lastTimeSeen < time - timeStep)
{
remeetingTimes.add(time - lastTimeSeen);
}
couples.put(couple, time);
}
if (remeetingTimes.isEmpty())
{
return null;
}
else
{
return Utilities.getAverage(remeetingTimes);
}
}
@Override
public Unit getUnit()
{
return Unit.SECOND;
}
@Override
public String getName()
{
return "avg time for re-meeting";
}
}