Lifetime churn based on shifted pareto distribution. More...
#include <ParetoChurn.h>
Classes | |
| struct | node_stat |
Public Member Functions | |
| void | handleMessage (cMessage *msg) |
| void | initializeChurn () |
| ParetoChurn () | |
| ~ParetoChurn () | |
Protected Member Functions | |
| void | updateDisplayString () |
| void | createNode (double lifetime, double meanLifetime, double meanDeadtime, bool initialize) |
| void | deleteNode (TransportAddress &addr, double meanLifetime, double meanDeadtime) |
| double | shiftedPareto (double a, double b, int rng=0) |
| implements a shifted pareto funcion | |
| double | betaByMean (double mean, double alpha=3) |
| returns a shifted pareto function's beta param by given mean and alpha | |
| double | individualMeanTime (double mean) |
| returns the individual mean life/dead time of a node | |
| double | individualLifetime (double mean) |
| returns a individual lifetime (or deadtime) based on a node's mean lifetime | |
| double | residualLifetime (double mean) |
| returns the resiidual lifetime (or deadtime) based on a node's mean lifetime | |
| void | scheduleCreateNodeAt (double creationTime, double lifetime, double meanLifetime, double meanDeadtime) |
Private Attributes | |
| GlobalStatistics * | globalStatistics |
| double | initialMean |
| mean of update interval during initalization phase | |
| double | initialDeviation |
| deviation of update interval during initalization phase | |
| double | lifetimeMean |
| mean node lifetime | |
| double | deadtimeMean |
| mean node deadtime | |
| simtime_t | lastCreatetime |
| simtime_t | lastDeletetime |
| cMessage * | initFinishedTimer |
| timer to signal end of init phase | |
Lifetime churn based on shifted pareto distribution.
This class implements the curn model proposed in
Yao, Z.; Leonard, D.; Wang, X. & Loguinov, D. "Modeling Heterogeneous User Churn and Local Resilience of Unstructured P2P Networks" Proceedings of the 2006 14th IEEE International Conference on Network Protocols, 2006. ICNP '06. 2006, pp. 32--41
Definition at line 46 of file ParetoChurn.h.
| ParetoChurn::ParetoChurn | ( | ) | [inline] |
Definition at line 51 of file ParetoChurn.h.
{ initFinishedTimer = NULL; };
| ParetoChurn::~ParetoChurn | ( | ) |
Definition at line 247 of file ParetoChurn.cc.
{
// destroy self timer messages
cancelAndDelete(initFinishedTimer);
}
| double ParetoChurn::betaByMean | ( | double | mean, | |
| double | alpha = 3 | |||
| ) | [protected] |
returns a shifted pareto function's beta param by given mean and alpha
| mean | the wanted mean | |
| alpha | the alph param of the shifted pareto (defaults to 3) |
Definition at line 209 of file ParetoChurn.cc.
Referenced by individualLifetime(), individualMeanTime(), and residualLifetime().
{
return 1/(mean*(alpha -1));
}
| void ParetoChurn::createNode | ( | double | lifetime, | |
| double | meanLifetime, | |||
| double | meanDeadtime, | |||
| bool | initialize | |||
| ) | [protected] |
Definition at line 162 of file ParetoChurn.cc.
Referenced by handleMessage().
{
ParetoChurnMessage* churnMsg = new ParetoChurnMessage("DeleteNode");
TransportAddress* ta = underlayConfigurator->createNode(type, initialize);
churnMsg->setAddr(*ta);
delete ta;
churnMsg->setCreateNode(false);
churnMsg->setMeanLifetime(meanLifetime);
churnMsg->setMeanDeadtime(meanDeadtime);
scheduleAt(std::max(simTime(), simTime() + lifetime
- underlayConfigurator->getGracefulLeaveDelay()), churnMsg);
RECORD_STATS(globalStatistics->recordOutVector("ParetoChurn: Session Time",
lifetime));
RECORD_STATS(globalStatistics->recordOutVector("ParetoChurn: "
"Time between creates", SIMTIME_DBL(simTime() - lastCreatetime)));
lastCreatetime = simTime();
}
| void ParetoChurn::deleteNode | ( | TransportAddress & | addr, | |
| double | meanLifetime, | |||
| double | meanDeadtime | |||
| ) | [protected] |
Definition at line 184 of file ParetoChurn.cc.
Referenced by handleMessage().
{
// Kill node
underlayConfigurator->preKillNode(NodeType(), &addr);
RECORD_STATS(globalStatistics->recordOutVector("ParetoChurn: "
"Time between deletes", SIMTIME_DBL(simTime() - lastDeletetime)));
lastDeletetime = simTime();
scheduleCreateNodeAt(SIMTIME_DBL(simTime()+individualLifetime(meanDeadtime)),
individualLifetime(meanLifetime), meanLifetime,
meanDeadtime);
}
| void ParetoChurn::handleMessage | ( | cMessage * | msg | ) | [virtual] |
Implements ChurnGenerator.
Definition at line 132 of file ParetoChurn.cc.
{
if (!msg->isSelfMessage()) {
delete msg;
return;
}
// init phase finished
if (msg == initFinishedTimer) {
underlayConfigurator->initFinished();
cancelEvent(initFinishedTimer);
delete initFinishedTimer;
initFinishedTimer = NULL;
return;
}
ParetoChurnMessage* churnMsg = check_and_cast<ParetoChurnMessage*>(msg);
if (churnMsg->getCreateNode() == true) {
createNode(churnMsg->getLifetime(), churnMsg->getMeanLifetime(),
churnMsg->getMeanDeadtime(), false);
} else {
deleteNode(churnMsg->getAddr(), churnMsg->getMeanLifetime(),
churnMsg->getMeanDeadtime());
}
delete msg;
}
| double ParetoChurn::individualLifetime | ( | double | mean | ) | [protected] |
returns a individual lifetime (or deadtime) based on a node's mean lifetime
| mean | the node's men lifetime |
Definition at line 227 of file ParetoChurn.cc.
Referenced by deleteNode(), and initializeChurn().
{
return shiftedPareto(3, betaByMean(mean));
}
| double ParetoChurn::individualMeanTime | ( | double | mean | ) | [protected] |
returns the individual mean life/dead time of a node
| mean | the global mean life/dead time |
Definition at line 221 of file ParetoChurn.cc.
Referenced by initializeChurn().
{
// return shiftedPareto(3, betaByMean(mean*exp(1)));
return shiftedPareto(3, betaByMean(mean));
}
| void ParetoChurn::initializeChurn | ( | ) | [virtual] |
Implements ChurnGenerator.
Definition at line 44 of file ParetoChurn.cc.
{
Enter_Method_Silent();
initialMean = par("initPhaseCreationInterval");
initialDeviation = initialMean / 3;
lifetimeMean = par("lifetimeMean");
deadtimeMean = par("deadtimeMean");
WATCH(lifetimeMean);
WATCH(deadtimeMean);
lastCreatetime = 0;
lastDeletetime = 0;
globalStatistics = GlobalStatisticsAccess().get();
double initFinishedTime = initialMean * targetOverlayTerminalNum;
// try to create a stable equilibrium of nodes in init phase
//
// check for each node if he is present in initial state
// and roll individual mean life+dead times
int liveNodes = 0;
double sum_l_i = 0;
std::deque<node_stat> node_stats;
for (int i = 0; liveNodes < (int)par("targetOverlayTerminalNum"); i++) {
double nodeLifetimeMean = individualMeanTime(lifetimeMean);
globalStatistics->recordOutVector("ParetoChurn: Node individual "
"mean lifetime", nodeLifetimeMean);
double nodeDeadtimeMean = individualMeanTime(deadtimeMean);
globalStatistics->recordOutVector("ParetoChurn: Node individual "
"mean deadtime", nodeDeadtimeMean);
sum_l_i += 1.0/(nodeLifetimeMean + nodeDeadtimeMean);
node_stat nodeStat;
nodeStat.l = nodeLifetimeMean;
nodeStat.d = nodeDeadtimeMean;
double nodeAvailability = nodeLifetimeMean/(nodeLifetimeMean
+ nodeDeadtimeMean);
globalStatistics->recordOutVector("Node availability", nodeAvailability);
nodeStat.alive = uniform(0, 1) < nodeAvailability;
if (nodeStat.alive) {
liveNodes++;
}
node_stats.push_back( nodeStat );
}
// compute "stretch" factor to reach the configured average lifetime
// this is neccessary as "individual" lifetime mean has to be bigger than
// "global" lifetime mean, as short-lived nodes will factor in more often
double mean_life = 0;
int numNodes = node_stats.size();
for( int i = 0; i < numNodes; ++i ){
node_stat& stat = node_stats[i];
mean_life += stat.l/( (stat.l + stat.d) * sum_l_i );
}
double stretch = lifetimeMean/mean_life;
liveNodes = 0;
// schedule creation for all (alive or dead) nodes
for( int i = 0; i < numNodes; ++i ){
node_stat& stat = node_stats.front();
stat.l *= stretch;
stat.d *= stretch;
if( stat.alive ){
double scheduleTime = truncnormal(initialMean*liveNodes, initialDeviation);
scheduleCreateNodeAt(scheduleTime, initFinishedTime - scheduleTime
+ residualLifetime(stat.l),
stat.l, stat.d);
liveNodes++;
} else {
scheduleCreateNodeAt(initFinishedTime
+ residualLifetime(stat.d),
individualLifetime(stat.l),
stat.l, stat.d);
}
node_stats.pop_front();
}
initFinishedTimer = new cMessage("initFinishTimer");
scheduleAt(initFinishedTime, initFinishedTimer);
}
| double ParetoChurn::residualLifetime | ( | double | mean | ) | [protected] |
returns the resiidual lifetime (or deadtime) based on a node's mean lifetime
| mean | the node's men lifetime |
Definition at line 235 of file ParetoChurn.cc.
Referenced by initializeChurn().
{
return shiftedPareto(2, betaByMean(mean));
}
| void ParetoChurn::scheduleCreateNodeAt | ( | double | creationTime, | |
| double | lifetime, | |||
| double | meanLifetime, | |||
| double | meanDeadtime | |||
| ) | [protected] |
Definition at line 198 of file ParetoChurn.cc.
Referenced by deleteNode(), and initializeChurn().
{
ParetoChurnMessage* churnMsg = new ParetoChurnMessage("CreateNode");
churnMsg->setCreateNode(true);
churnMsg->setLifetime(lifetime);
churnMsg->setMeanLifetime(meanLifetime);
churnMsg->setMeanDeadtime(meanDeadtime);
scheduleAt(creationTime, churnMsg);
}
| double ParetoChurn::shiftedPareto | ( | double | a, | |
| double | b, | |||
| int | rng = 0 | |||
| ) | [protected] |
implements a shifted pareto funcion
Definition at line 214 of file ParetoChurn.cc.
Referenced by individualLifetime(), individualMeanTime(), and residualLifetime().
{
// What OMNET calles "pareto_shifted" in reality is a gerneralized pareto,
// not a shifted pareto...
return (pareto_shifted(a, b, 0, rng)/b - 1) / b;
}
| void ParetoChurn::updateDisplayString | ( | ) | [protected, virtual] |
Implements ChurnGenerator.
Definition at line 240 of file ParetoChurn.cc.
{
char buf[80];
sprintf(buf, "pareto churn");
getDisplayString().setTagArg("t", 0, buf);
}
double ParetoChurn::deadtimeMean [private] |
GlobalStatistics* ParetoChurn::globalStatistics [private] |
Definition at line 102 of file ParetoChurn.h.
Referenced by createNode(), deleteNode(), and initializeChurn().
cMessage* ParetoChurn::initFinishedTimer [private] |
timer to signal end of init phase
Definition at line 112 of file ParetoChurn.h.
Referenced by handleMessage(), initializeChurn(), ParetoChurn(), and ~ParetoChurn().
double ParetoChurn::initialDeviation [private] |
deviation of update interval during initalization phase
Definition at line 105 of file ParetoChurn.h.
Referenced by initializeChurn().
double ParetoChurn::initialMean [private] |
mean of update interval during initalization phase
Definition at line 104 of file ParetoChurn.h.
Referenced by initializeChurn().
simtime_t ParetoChurn::lastCreatetime [private] |
Definition at line 109 of file ParetoChurn.h.
Referenced by createNode(), and initializeChurn().
simtime_t ParetoChurn::lastDeletetime [private] |
Definition at line 110 of file ParetoChurn.h.
Referenced by deleteNode(), and initializeChurn().
double ParetoChurn::lifetimeMean [private] |
1.7.1