| 
    SNAP Library 2.0, Developer 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.
References TNGraph::AddEdge(), TNGraph::AddNode(), BckBurnProb, TForestFire::BurnExpFire(), BurnExpFire, TForestFire::BurnGeoFire(), TPt< TRec >::Empty(), FwdBurnProb, TForestFire::GetBurned(), TForestFire::GetBurnedNId(), TNGraph::GetEdges(), TNGraph::GetNodes(), TExeTm::GetSecs(), TExeTm::GetStr(), TRnd::GetUniDev(), TRnd::GetUniDevInt(), TVec< TInt >::GetV(), Graph, IAssert, TForestFire::Infect(), Kilo, TPt< TNGraph >::New(), OrphanProb, ProbDecay, srFlood, srOk, srTimeLimit, StartNodes, Take2AmbProb, and TimeLimitSec.
Referenced by GenGraph().
                                                                                 {
  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.
References TVec< TVal, TSizeTy >::Add(), TGStat::AllStat(), TStr::Fmt(), GenGraph(), gsvNodes, IAssert, TVec< TVal, TSizeTy >::Len(), TGStat::NDiamRuns, TGStatVec::New(), and tmuNodes.
                                                                                   {
  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.
References AddNodes(), Graph, and TPt< TNGraph >::New().
Referenced by GenFFGraphs(), TForestFire::GenGraph(), and main().
                                                                                 {
  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.
References AddNodes(), TNGraph::GetNodes(), Graph, TPt< TNGraph >::New(), srOk, srUndef, and StartNodes.
                                                                                                      {
  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.
References BckBurnProb, BurnExpFire, TStr::Fmt(), FwdBurnProb, OrphanProb, ProbDecay, StartNodes, and Take2AmbProb.
                                {
  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.
References TVec< TVal, TSizeTy >::Add(), TGnuPlot::AddPlot(), TNGraph::BegNI(), TStr::CStr(), TNGraph::EndNI(), TStr::Fmt(), TNGraph::GetEdges(), TNGraph::GetNodes(), gpwImpulses, Graph, TGnuPlot::SavePng(), TGnuPlot::SetXYLabel(), and TVec< TVal, TSizeTy >::Sort().
                                                                   {
  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] | 
        
Definition at line 58 of file ff.h.
Referenced by AddNodes(), and GetParamStr().
TBool TFfGGen::BurnExpFire [private] | 
        
Definition at line 56 of file ff.h.
Referenced by AddNodes(), and GetParamStr().
TFlt TFfGGen::FwdBurnProb [private] | 
        
Definition at line 58 of file ff.h.
Referenced by AddNodes(), and GetParamStr().
PNGraph TFfGGen::Graph [private] | 
        
Definition at line 54 of file ff.h.
Referenced by AddNodes(), Clr(), GenGraph(), GetGraph(), PlotFireSize(), and SetGraph().
TFlt TFfGGen::OrphanProb [private] | 
        
Definition at line 59 of file ff.h.
Referenced by AddNodes(), and GetParamStr().
TFlt TFfGGen::ProbDecay [private] | 
        
Definition at line 58 of file ff.h.
Referenced by AddNodes(), and GetParamStr().
TInt TFfGGen::StartNodes [private] | 
        
Definition at line 57 of file ff.h.
Referenced by AddNodes(), GenGraph(), and GetParamStr().
TFlt TFfGGen::Take2AmbProb [private] | 
        
Definition at line 59 of file ff.h.
Referenced by AddNodes(), and GetParamStr().
int TFfGGen::TimeLimitSec = 30*60 [static] | 
        
Definition at line 52 of file ff.h.
Referenced by AddNodes().