|
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
|
Connected Sub-graph Enumeration. More...
#include <ghash.h>

Public Member Functions | |
| TSubGraphsEnum (PNGraph Graph) | |
| void | Gen2Graphs () |
| void | EnumSubGraphs (const int &MaxEdges) |
| void | RecurBfs (const int &MxDepth) |
| void | RecurBfs (const int &NId, const int &Depth, TSimpleGraph &PrevG) |
| void | RecurBfs1 (const int &MxDepth) |
| void | RecurBfs1 (const int &NId, const int &Depth) |
Private Attributes | |
| TSimpleGraphV | SgV |
| TSimpleGraphV | NextSgV |
| THash< TIntPr, TIntH > | EdgeH |
| PNGraph | NGraph |
| TSubGraphsEnum::TSubGraphsEnum | ( | PNGraph | Graph | ) | [inline] |
| void TSubGraphsEnum::EnumSubGraphs | ( | const int & | MaxEdges | ) |
Definition at line 312 of file ghash.cpp.
References TVec< TVal, TSizeTy >::Add(), TVec< TVal, TSizeTy >::Clr(), TVec< TVal, TSizeTy >::Gen(), Gen2Graphs(), TSimpleGraph::GetEdgeV(), TExeTm::GetTmStr(), TSimpleGraph::Join(), TVec< TVal, TSizeTy >::Last(), TVec< TVal, TSizeTy >::Len(), NextSgV, SgV, TVec< TVal, TSizeTy >::Sort(), and TExeTm::Tick().
{
TExeTm ExeTm;
Gen2Graphs();
printf(" %2d edge graphs: %d\t[%s]\n", 2, SgV.Len(), ExeTm.GetTmStr()); ExeTm.Tick();
//for (int i = 0; i < SgV.Len(); i++) { SgV[i].Dump(TStr::Fmt(" %d", i+1)); }
//printf("**************************************************************\n");
TSimpleGraph SimpleG;
TIntPrV& EdgeV = SimpleG.GetEdgeV();
// multiple edge sub-graphs
for (int edges = 3; edges <= MaxEdges; edges++) {
EdgeV.Clr();
printf(" %2d edge graphs:", edges);
for (int g1 = 0; g1 < SgV.Len()-1; g1++) {
for (int g2 = g1+1; g2 < SgV.Len(); g2++) {
if (SimpleG.Join(SgV[g1], SgV[g2])) { NextSgV.Add(SimpleG); }
}
}
printf(" candidates: %8d [%s]", NextSgV.Len(), ExeTm.GetTmStr()); ExeTm.Tick();
NextSgV.Sort();
SgV.Gen(NextSgV.Len(), 0);
SgV.Add(NextSgV[0]);
for (int i = 1; i < NextSgV.Len(); i++) {
if (SgV.Last() != NextSgV[i]) {
SgV.Add(NextSgV[i]);
}
}
NextSgV.Clr(false);
printf(" total: %8d [%s]\n", SgV.Len(), ExeTm.GetTmStr()); ExeTm.Tick();
//for (int i = 0; i < SgV.Len(); i++) { SgV[i].Dump(TStr::Fmt(" %d", i+1)); }
//printf("**************************************************************\n");
}
}

| void TSubGraphsEnum::Gen2Graphs | ( | ) |
Definition at line 282 of file ghash.cpp.
References TVec< TVal, TSizeTy >::Add(), TNGraph::BegNI(), TSimpleGraph::Dump(), TNGraph::EndNI(), TVec< TVal, TSizeTy >::Gen(), TNGraph::GetEdges(), TSimpleGraph::GetEdgeV(), TVec< TVal, TSizeTy >::Len(), TMath::Mn(), TVec< TVal, TSizeTy >::MoveFrom(), TMath::Mx(), NextSgV, NGraph, SgV, TVec< TVal, TSizeTy >::Sort(), TPair< TVal1, TVal2 >::Val1, and TPair< TVal1, TVal2 >::Val2.
Referenced by EnumSubGraphs().
{
// singe edge sub-graphs
SgV.Gen(NGraph->GetEdges(), 0);
TSimpleGraph SimpleG;
TIntPrV& EdgeV = SimpleG.GetEdgeV();
EdgeV.Gen(1);
for (TNGraph::TNodeI NI = NGraph->BegNI(); NI < NGraph->EndNI(); NI++) {
for (int e = 0; e < NI.GetOutDeg(); e++) {
EdgeV[0] = TIntPr(NI.GetId(), NI.GetOutNId(e));
SgV.Add(SimpleG);
}
}
SgV.Sort();
// two edge sub-graphs
EdgeV.Gen(2);
for (int g1 = 0; g1 < SgV.Len()-1; g1++) {
const TIntPr& E1 = SgV[g1].GetEdgeV()[0];
for (int g2 = g1+1; g2 < SgV.Len(); g2++) {
const TIntPr& E2 = SgV[g2].GetEdgeV()[0];
if (E1.Val2 == E2.Val1 || E1.Val1 == E2.Val2 || E1.Val1 == E2.Val1 || E1.Val2 == E2.Val2) {
EdgeV[0] = TMath::Mn(E1, E2);
EdgeV[1] = TMath::Mx(E1, E2);
SimpleG.Dump();
NextSgV.Add(SimpleG);
}
}
}
SgV.MoveFrom(NextSgV);
}


| void TSubGraphsEnum::RecurBfs | ( | const int & | MxDepth | ) |
Definition at line 345 of file ghash.cpp.
References TNGraph::BegNI(), TVec< TVal, TSizeTy >::Clr(), TNGraph::EndNI(), TExeTm::GetTmStr(), TVec< TVal, TSizeTy >::Len(), NGraph, SgV, and TVec< TVal, TSizeTy >::Sort().
Referenced by RecurBfs().
{
TExeTm ExeTm;
SgV.Clr(true);
for (TNGraph::TNodeI NI = NGraph->BegNI(); NI < NGraph->EndNI(); NI++) {
TSimpleGraph SimpleG;
RecurBfs(NI.GetId(), MxDepth, SimpleG);
//NGraph->DelNode(NI.GetId());
printf(".");
}
printf("\ncandidates: %d\n", SgV.Len());
SgV.Sort();
int Cnt = 1;
for (int i = 1; i < SgV.Len(); i++) {
if (SgV[i-1] != SgV[i]) Cnt++;
}
printf("distinct: %d\t[%s]\n", Cnt, ExeTm.GetTmStr());
}


| void TSubGraphsEnum::RecurBfs | ( | const int & | NId, |
| const int & | Depth, | ||
| TSimpleGraph & | PrevG | ||
| ) |
Definition at line 363 of file ghash.cpp.
References TVec< TVal, TSizeTy >::Add(), TSimpleGraph::AddEdge(), TNGraph::TNodeI::GetId(), TNGraph::TNodeI::GetInDeg(), TNGraph::TNodeI::GetInNId(), TNGraph::GetNI(), TNGraph::TNodeI::GetOutDeg(), TNGraph::TNodeI::GetOutNId(), TVec< TVal, TSizeTy >::Len(), NGraph, RecurBfs(), SgV, and TVec< TVal, TSizeTy >::Sort().
{
if (Depth == 0) {
TIntPrV& EdgeV = PrevG();
EdgeV.Sort();
for (int i = 1; i < EdgeV.Len(); i++) {
if (EdgeV[i-1] == EdgeV[i]) { return; }
}
SgV.Add(PrevG);
return;
}
const TNGraph::TNodeI NI = NGraph ->GetNI(NId);
for (int e = 0; e < NI.GetOutDeg(); e++) {
TSimpleGraph CurG = PrevG;
CurG.AddEdge(NI.GetId(), NI.GetOutNId(e));
RecurBfs(NI.GetOutNId(e), Depth-1, CurG);
}
for (int e = 0; e < NI.GetInDeg(); e++) {
TSimpleGraph CurG = PrevG;
CurG.AddEdge(NI.GetInNId(e), NI.GetId());
RecurBfs(NI.GetInNId(e), Depth-1, CurG);
}
}

| void TSubGraphsEnum::RecurBfs1 | ( | const int & | MxDepth | ) |
Definition at line 386 of file ghash.cpp.
References TNGraph::BegNI(), TVec< TVal, TSizeTy >::Clr(), TNGraph::EndNI(), TExeTm::GetTmStr(), TVec< TVal, TSizeTy >::Len(), NGraph, SgV, and TVec< TVal, TSizeTy >::Sort().
Referenced by RecurBfs1().
{
TExeTm ExeTm;
SgV.Clr(true);
for (TNGraph::TNodeI NI = NGraph->BegNI(); NI < NGraph->EndNI(); NI++) {
TSimpleGraph SimpleG;
RecurBfs1(NI.GetId(), MxDepth);
//NGraph->DelNode(NI.GetId());
printf(".");
}
printf("candidates: %d\n", SgV.Len());
SgV.Sort();
int Cnt = 1;
for (int i = 1; i < SgV.Len(); i++) {
if (SgV[i-1]!=SgV[i]) {
//SgV[i].Dump();
Cnt++;
}
}
printf("distinct: %d\t[%s]\n", Cnt, ExeTm.GetTmStr());
}


| void TSubGraphsEnum::RecurBfs1 | ( | const int & | NId, |
| const int & | Depth | ||
| ) |
Definition at line 407 of file ghash.cpp.
References TVec< TVal, TSizeTy >::Add(), THash< TKey, TDat, THashFunc >::AddKey(), THash< TKey, TDat, THashFunc >::DelKey(), EdgeH, TNGraph::TNodeI::GetInDeg(), TNGraph::TNodeI::GetInNId(), THash< TKey, TDat, THashFunc >::GetKeyV(), TNGraph::GetNI(), TNGraph::TNodeI::GetOutDeg(), TNGraph::TNodeI::GetOutNId(), THash< TKey, TDat, THashFunc >::IsKey(), NGraph, RecurBfs1(), SgV, and TVec< TVal, TSizeTy >::Sort().
{
if (Depth == 0) {
TIntPrV EdgeV;
EdgeH.GetKeyV(EdgeV);
EdgeV.Sort();
SgV.Add(EdgeV);
return;
}
const TNGraph::TNodeI NI = NGraph ->GetNI(NId);
for (int e = 0; e < NI.GetOutDeg(); e++) {
const TIntPr Edge(NId, NI.GetOutNId(e));
if (! EdgeH.IsKey(Edge)) {
EdgeH.AddKey(Edge);
RecurBfs1(NI.GetOutNId(e), Depth-1);
EdgeH.DelKey(Edge);
}
}
for (int e = 0; e < NI.GetInDeg(); e++) {
const TIntPr Edge(NI.GetInNId(e), NId);
if (! EdgeH.IsKey(Edge)) {
EdgeH.AddKey(Edge);
RecurBfs1(NI.GetInNId(e), Depth-1);
EdgeH.DelKey(Edge);
}
}
}

THash<TIntPr, TIntH> TSubGraphsEnum::EdgeH [private] |
Definition at line 563 of file ghash.h.
Referenced by RecurBfs1().
TSimpleGraphV TSubGraphsEnum::NextSgV [private] |
Definition at line 562 of file ghash.h.
Referenced by EnumSubGraphs(), and Gen2Graphs().
PNGraph TSubGraphsEnum::NGraph [private] |
Definition at line 564 of file ghash.h.
Referenced by Gen2Graphs(), RecurBfs(), and RecurBfs1().
TSimpleGraphV TSubGraphsEnum::SgV [private] |
Definition at line 562 of file ghash.h.
Referenced by EnumSubGraphs(), Gen2Graphs(), RecurBfs(), and RecurBfs1().