|
SNAP Library 2.0, User Reference
2013-05-13 16:33:57
SNAP, a general purpose, high performance system for analysis and manipulation of large networks
|
#include <ff.h>
Public Types | |
| enum | TStopReason { srUndef, srOk, srFlood, srTimeLimit } |
Public Member Functions | |
| TFfGGen (const bool &BurnExpFireP, const int &StartNNodes, const double &ForwBurnProb, const double &BackBurnProb, const double &DecayProb, const double &Take2AmbasPrb, const double &OrphanPrb) | |
| PNGraph | GetGraph () const |
| void | SetGraph (const PNGraph &NGraph) |
| void | Clr () |
| TStr | GetParamStr () const |
| TStopReason | AddNodes (const int &GraphNodes, const bool &FloodStop=true) |
| TStopReason | GenGraph (const int &GraphNodes, const bool &FloodStop=true) |
| TStopReason | GenGraph (const int &GraphNodes, PGStatVec &EvolStat, const bool &FloodStop=true) |
| void | PlotFireSize (const TStr &FNmPref, const TStr &DescStr) |
Static Public Member Functions | |
| static void | GenFFGraphs (const double &FProb, const double &BProb, const TStr &FNm) |
Static Public Attributes | |
| static int | TimeLimitSec = 30*60 |
Private Attributes | |
| PNGraph | Graph |
| TBool | BurnExpFire |
| TInt | StartNodes |
| TFlt | FwdBurnProb |
| TFlt | BckBurnProb |
| TFlt | ProbDecay |
| TFlt | Take2AmbProb |
| TFlt | OrphanProb |
Forest Fire Graph Generator. For more details is "Graph Evolution: Densification and Shrinking Diameters" by J. Leskovec, J. Kleinberg, C. Faloutsos. ACM Transactions on Knowledge Discovery from Data (TKDD), 1(1), 2007.
| enum TFfGGen::TStopReason |
Definition at line 51 of file ff.h.
{ srUndef, srOk, srFlood, srTimeLimit } TStopReason;
| TFfGGen::TFfGGen | ( | const bool & | BurnExpFireP, |
| const int & | StartNNodes, | ||
| const double & | ForwBurnProb, | ||
| const double & | BackBurnProb, | ||
| const double & | DecayProb, | ||
| const double & | Take2AmbasPrb, | ||
| const double & | OrphanPrb | ||
| ) |
Definition at line 260 of file ff.cpp.
: Graph(), BurnExpFire(BurnExpFireP), StartNodes(StartNNodes), FwdBurnProb(ForwBurnProb), BckBurnProb(BackBurnProb), ProbDecay(DecayProb), Take2AmbProb(Take2AmbasPrb), OrphanProb(OrphanPrb) { //IAssert(ProbDecay == 1.0); // do not need Decay any more }
| TFfGGen::TStopReason TFfGGen::AddNodes | ( | const int & | GraphNodes, |
| const bool & | FloodStop = true |
||
| ) |
Definition at line 272 of file ff.cpp.
{
printf("\n***ForestFire: %s Nodes:%d StartNodes:%d Take2AmbProb:%g\n", BurnExpFire?"ExpFire":"GeoFire", GraphNodes, StartNodes(), Take2AmbProb());
printf(" FwdBurnP:%g BckBurnP:%g ProbDecay:%g Orphan:%g\n", FwdBurnProb(), BckBurnProb(), ProbDecay(), OrphanProb());
TExeTm ExeTm;
int Burned1=0, Burned2=0, Burned3=0; // last 3 fire sizes
// create initial set of nodes
if (Graph.Empty()) { Graph = PNGraph::New(); }
if (Graph->GetNodes() == 0) {
for (int n = 0; n < StartNodes; n++) { Graph->AddNode(); }
}
int NEdges = Graph->GetEdges();
// forest fire
TRnd Rnd(0);
TForestFire ForestFire(Graph, FwdBurnProb, BckBurnProb, ProbDecay, 0);
// add nodes
for (int NNodes = Graph->GetNodes()+1; NNodes <= GraphNodes; NNodes++) {
const int NewNId = Graph->AddNode(-1);
IAssert(NewNId == Graph->GetNodes()-1); // node ids have to be 0...N
// not an Orphan (burn fire)
if (OrphanProb == 0.0 || Rnd.GetUniDev() > OrphanProb) {
// infect ambassadors
if (Take2AmbProb == 0.0 || Rnd.GetUniDev() > Take2AmbProb || NewNId < 2) {
ForestFire.Infect(Rnd.GetUniDevInt(NewNId)); // take 1 ambassador
} else {
const int AmbassadorNId1 = Rnd.GetUniDevInt(NewNId);
int AmbassadorNId2 = Rnd.GetUniDevInt(NewNId);
while (AmbassadorNId1 == AmbassadorNId2) {
AmbassadorNId2 = Rnd.GetUniDevInt(NewNId); }
ForestFire.Infect(TIntV::GetV(AmbassadorNId1, AmbassadorNId2)); // take 2 ambassadors
}
// burn fire
if (BurnExpFire) { ForestFire.BurnExpFire(); }
else { ForestFire.BurnGeoFire(); }
// add edges to burned nodes
for (int e = 0; e < ForestFire.GetBurned(); e++) {
Graph->AddEdge(NewNId, ForestFire.GetBurnedNId(e));
NEdges++;
}
Burned1=Burned2; Burned2=Burned3; Burned3=ForestFire.GetBurned();
} else {
// Orphan (zero out-links)
Burned1=Burned2; Burned2=Burned3; Burned3=0;
}
if (NNodes % Kilo(1) == 0) {
printf("(%d, %d) burned: [%d,%d,%d] [%s]\n", NNodes, NEdges, Burned1, Burned2, Burned3, ExeTm.GetStr()); }
if (FloodStop && NEdges>GraphNodes && (NEdges/double(NNodes)>1000.0)) { // average node degree is more than 500
printf(". FLOOD. G(%6d, %6d)\n", NNodes, NEdges); return srFlood; }
if (NNodes % 1000 == 0 && TimeLimitSec > 0 && ExeTm.GetSecs() > TimeLimitSec) {
printf(". TIME LIMIT. G(%d, %d)\n", Graph->GetNodes(), Graph->GetEdges());
return srTimeLimit; }
}
IAssert(Graph->GetEdges() == NEdges);
return srOk;
}
| void TFfGGen::Clr | ( | ) | [inline] |
| void TFfGGen::GenFFGraphs | ( | const double & | FProb, |
| const double & | BProb, | ||
| const TStr & | FNm | ||
| ) | [static] |
Definition at line 358 of file ff.cpp.
{
const int NRuns = 10;
const int NNodes = 10000;
TGStat::NDiamRuns = 10;
//const double FProb = 0.35, BProb = 0.20; // ff1
//const double FProb = 0.37, BProb = 0.32; // ff2
//const double FProb = 0.37, BProb = 0.325; // ff22
//const double FProb = 0.37, BProb = 0.33; // ff3
//const double FProb = 0.37, BProb = 0.35; // ff4
//const double FProb = 0.38, BProb = 0.35; // ff5
TVec<PGStatVec> GAtTmV;
TFfGGen FF(false, 1, FProb, BProb, 1.0, 0, 0);
for (int r = 0; r < NRuns; r++) {
PGStatVec GV = TGStatVec::New(tmuNodes, TGStat::AllStat());
FF.GenGraph(NNodes, GV, true);
for (int i = 0; i < GV->Len(); i++) {
if (i == GAtTmV.Len()) {
GAtTmV.Add(TGStatVec::New(tmuNodes, TGStat::AllStat()));
}
GAtTmV[i]->Add(GV->At(i));
}
IAssert(GAtTmV.Len() == GV->Len());
}
PGStatVec AvgStat = TGStatVec::New(tmuNodes, TGStat::AllStat());
for (int i = 0; i < GAtTmV.Len(); i++) {
AvgStat->Add(GAtTmV[i]->GetAvgGStat(false));
}
AvgStat->PlotAllVsX(gsvNodes, FNm, TStr::Fmt("Forest Fire: F:%g B:%g (%d runs)", FProb, BProb, NRuns));
AvgStat->Last()->PlotAll(FNm, TStr::Fmt("Forest Fire: F:%g B:%g (%d runs)", FProb, BProb, NRuns));
}
| TFfGGen::TStopReason TFfGGen::GenGraph | ( | const int & | GraphNodes, |
| const bool & | FloodStop = true |
||
| ) |
Definition at line 327 of file ff.cpp.
{
Graph = PNGraph::New();
return AddNodes(GraphNodes, FloodStop);
}
| TFfGGen::TStopReason TFfGGen::GenGraph | ( | const int & | GraphNodes, |
| PGStatVec & | EvolStat, | ||
| const bool & | FloodStop = true |
||
| ) |
Definition at line 332 of file ff.cpp.
{
int GrowthStatNodes = 100;
Graph = PNGraph::New();
AddNodes(StartNodes);
TStopReason SR = srUndef;
while (Graph->GetNodes() < GraphNodes) {
SR = AddNodes(GrowthStatNodes, FloodStop);
if (SR != srOk) { return SR; }
EvolStat->Add(Graph, TSecTm(Graph->GetNodes()));
GrowthStatNodes = int(1.5*GrowthStatNodes);
}
return SR;
}
| PNGraph TFfGGen::GetGraph | ( | ) | const [inline] |
| TStr TFfGGen::GetParamStr | ( | ) | const |
Definition at line 267 of file ff.cpp.
{
return TStr::Fmt("%s FWD:%g BCK:%g, StartNds:%d, Take2:%g, Orphan:%g, ProbDecay:%g",
BurnExpFire?"EXP":"GEO", FwdBurnProb(), BckBurnProb(), StartNodes(), Take2AmbProb(), OrphanProb(), ProbDecay());
}
| void TFfGGen::PlotFireSize | ( | const TStr & | FNmPref, |
| const TStr & | DescStr | ||
| ) |
Definition at line 346 of file ff.cpp.
{
TGnuPlot GnuPlot("fs."+FNmPref, TStr::Fmt("%s. Fire size. G(%d, %d)",
DescStr.CStr(), Graph->GetNodes(), Graph->GetEdges()));
GnuPlot.SetXYLabel("Vertex id (iterations)", "Fire size (node out-degree)");
TFltPrV IdToOutDegV;
for (TNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) {
IdToOutDegV.Add(TFltPr(NI.GetId(), NI.GetOutDeg())); }
IdToOutDegV.Sort();
GnuPlot.AddPlot(IdToOutDegV, gpwImpulses, "Node out-degree");
GnuPlot.SavePng();
}
| void TFfGGen::SetGraph | ( | const PNGraph & | NGraph | ) | [inline] |
TFlt TFfGGen::BckBurnProb [private] |
TBool TFfGGen::BurnExpFire [private] |
TFlt TFfGGen::FwdBurnProb [private] |
PNGraph TFfGGen::Graph [private] |
TFlt TFfGGen::OrphanProb [private] |
TFlt TFfGGen::ProbDecay [private] |
TInt TFfGGen::StartNodes [private] |
TFlt TFfGGen::Take2AmbProb [private] |
int TFfGGen::TimeLimitSec = 30*60 [static] |