SNAP Library, Developer Reference
2012-10-02 12:56:23
SNAP, a general purpose network analysis and graph mining library
|
#include <ghash.h>
Public Member Functions | |
TGraphKey () | |
TGraphKey (const TSFltV &GraphSigV) | |
TGraphKey (const TIntV &GraphSigV) | |
TGraphKey (const TFltV &GraphSigV) | |
TGraphKey (const TGraphKey &GraphKey) | |
TGraphKey (TSIn &SIn) | |
void | Save (TSOut &SOut) const |
TGraphKey & | operator= (const TGraphKey &GraphKey) |
bool | operator== (const TGraphKey &GraphKey) const |
int | GetPrimHashCd () const |
int | GetSecHashCd () const |
int | GetNodes () const |
int | GetEdges () const |
int | GetSigLen () const |
int | GetVariant () const |
void | SetVariant (const int &Variant) |
void | SetEdgeV (const TIntPrV &EdgeIdV) |
PNGraph | GetNGraph () const |
void | TakeGraph (const PNGraph &Graph) |
void | TakeGraph (const PNGraph &Graph, TIntPrV &NodeMap) |
void | TakeSig (const PNGraph &Graph, const int &MnSvdGraph, const int &MxSvdGraph) |
void | SaveTxt (FILE *F) const |
void | SaveGViz (const TStr &OutFNm, const TStr &Desc=TStr(), const TStr &NodeAttrs="", const int &Size=-1) const |
void | DrawGViz (const TStr &OutFNm, const TStr &Desc=TStr(), const TStr &NodeAttrs="", const int &Size=-1) const |
Static Public Member Functions | |
static bool | IsIsomorph (const TGraphKey &Key1, const TGraphKey &Key2, const TIntV &NodeIdMap) |
static bool | IsIsomorph (const TGraphKey &Key1, const TGraphKey &Key2, const TVec< TIntV > &NodeIdMapV) |
static bool | IsIsomorph (const TGraphKey &Key1, const TGraphKey &Key2, const TVec< TIntV > &NodeIdMapV, int &IsoPermId) |
Public Attributes | |
TInt | Nodes |
TIntPrV | EdgeV |
TFltV | SigV |
TInt | VariantId |
Static Public Attributes | |
static const int | RoundTo = 4 |
TGraphKey::TGraphKey | ( | ) | [inline] |
TGraphKey::TGraphKey | ( | const TSFltV & | GraphSigV | ) |
Definition at line 5 of file ghash.cpp.
References TVec< TVal >::Gen(), TVec< TVal >::Len(), TMath::Round(), RoundTo, and SigV.
: Nodes(-1), EdgeV(), SigV(), VariantId(0) { SigV.Gen(GraphSigV.Len()); for (int i = 0; i < GraphSigV.Len(); i++) { SigV[i] = TFlt(TMath::Round(GraphSigV[i], RoundTo)); } }
TGraphKey::TGraphKey | ( | const TIntV & | GraphSigV | ) |
TGraphKey::TGraphKey | ( | const TFltV & | GraphSigV | ) |
Definition at line 19 of file ghash.cpp.
References TVec< TVal >::Gen(), TVec< TVal >::Len(), TMath::Round(), RoundTo, and SigV.
: Nodes(-1), EdgeV(), SigV(), VariantId(0) { SigV.Gen(GraphSigV.Len()); for (int i = 0; i < GraphSigV.Len(); i++) { SigV[i] = TFlt(TMath::Round(GraphSigV[i], RoundTo)); } }
TGraphKey::TGraphKey | ( | const TGraphKey & | GraphKey | ) |
TGraphKey::TGraphKey | ( | TSIn & | SIn | ) |
void TGraphKey::DrawGViz | ( | const TStr & | OutFNm, |
const TStr & | Desc = TStr() , |
||
const TStr & | NodeAttrs = "" , |
||
const int & | Size = -1 |
||
) | const |
Definition at line 179 of file ghash.cpp.
References TStr::GetFMid(), TSnap::TSnapDetail::GVizDoLayout(), gvlDot, and SaveGViz().
{ const TStr DotFNm = OutFNm.GetFMid()+".dot"; SaveGViz(DotFNm, Desc, NodeAttrs, Size); TSnap::TSnapDetail::GVizDoLayout(DotFNm, OutFNm, gvlDot); }
int TGraphKey::GetEdges | ( | ) | const [inline] |
Definition at line 27 of file ghash.h.
References EdgeV, and TVec< TVal >::Len().
Referenced by TGHash< TDat >::DrawGViz(), GetNGraph(), SaveGViz(), SaveTxt(), and TGHash< TDat >::SaveTxt().
PNGraph TGraphKey::GetNGraph | ( | ) | const |
Definition at line 47 of file ghash.cpp.
References TNGraph::AddEdge(), TNGraph::AddNode(), TNGraph::Defrag(), EdgeV, G(), GetEdges(), GetNodes(), and New().
{ PNGraph G = TNGraph::New(); for (int i = 0; i < GetNodes(); i++) G->AddNode(i); for (int e = 0; e < GetEdges(); e++) { G->AddEdge(EdgeV[e].Val1, EdgeV[e].Val2); } G->Defrag(); return G; }
int TGraphKey::GetNodes | ( | ) | const [inline] |
Definition at line 26 of file ghash.h.
References Nodes.
Referenced by TGHash< TDat >::AddKey(), TGHash< TDat >::DrawGViz(), GetNGraph(), TGHash< TDat >::IsGetKeyId(), SaveGViz(), SaveTxt(), and TGHash< TDat >::SaveTxt().
{ return Nodes; }
int TGraphKey::GetPrimHashCd | ( | ) | const [inline] |
Definition at line 23 of file ghash.h.
References TVec< TVal >::GetPrimHashCd(), SigV, and VariantId.
{ return abs(SigV.GetPrimHashCd() ^ VariantId); }
int TGraphKey::GetSecHashCd | ( | ) | const [inline] |
Definition at line 24 of file ghash.h.
References TVec< TVal >::GetSecHashCd(), SigV, and VariantId.
{ return abs(SigV.GetSecHashCd() ^ VariantId<<8); }
int TGraphKey::GetSigLen | ( | ) | const [inline] |
int TGraphKey::GetVariant | ( | ) | const [inline] |
bool TGraphKey::IsIsomorph | ( | const TGraphKey & | Key1, |
const TGraphKey & | Key2, | ||
const TIntV & | NodeIdMap | ||
) | [static] |
Definition at line 185 of file ghash.cpp.
References EdgeV, TVec< TVal >::Len(), Nodes, and TVec< TVal >::SearchBin().
Referenced by TGHash< TDat >::AddKey(), TGHash< TDat >::GetNodeMap(), TGHash< TDat >::IsGetKeyId(), and IsIsomorph().
{ const TIntPrV& EdgeV1 = Key1.EdgeV; const TIntPrV& EdgeV2 = Key2.EdgeV; if (Key1.Nodes != Key2.Nodes || EdgeV1.Len() != EdgeV2.Len()) return false; for (int e1 = 0; e1 < EdgeV1.Len(); e1++) { const TIntPr Edge2(NodeIdMap[EdgeV1[e1].Val1], NodeIdMap[EdgeV1[e1].Val2]); if (EdgeV2.SearchBin(Edge2) == -1) return false; } return true; }
bool TGraphKey::IsIsomorph | ( | const TGraphKey & | Key1, |
const TGraphKey & | Key2, | ||
const TVec< TIntV > & | NodeIdMapV | ||
) | [static] |
Definition at line 196 of file ghash.cpp.
References IsIsomorph().
{ int IsoPermId; return IsIsomorph(Key1, Key2, NodeIdMapV, IsoPermId); }
bool TGraphKey::IsIsomorph | ( | const TGraphKey & | Key1, |
const TGraphKey & | Key2, | ||
const TVec< TIntV > & | NodeIdMapV, | ||
int & | IsoPermId | ||
) | [static] |
Definition at line 201 of file ghash.cpp.
References EdgeV, TVec< TVal >::Len(), and Nodes.
{ const TIntPrV& EdgeV1 = Key1.EdgeV; const TIntPrV& EdgeV2 = Key2.EdgeV; //for (int i = 0; i < EdgeV1.Len(); i++) printf("\t%d - %d\n", EdgeV1[i].Val1, EdgeV1[i].Val2); printf("\n"); //for (int i = 0; i < EdgeV2.Len(); i++) printf("\t%d - %d\n", EdgeV2[i].Val1, EdgeV2[i].Val2); if (Key1.Nodes != Key2.Nodes || EdgeV1.Len() != EdgeV2.Len()) return false; const int Nodes = NodeIdMapV[0].Len(); // fast adjecency matrix TIntV AdjMtx2(Nodes*Nodes); for (int i = 0; i < EdgeV2.Len(); i++) { AdjMtx2[EdgeV2[i].Val1*Nodes + EdgeV2[i].Val2] = 1; } for (int perm = 0; perm < NodeIdMapV.Len(); perm++) { const TIntV& NodeIdMap = NodeIdMapV[perm]; bool IsIso = true; for (int e1 = 0; e1 < EdgeV1.Len(); e1++) { const int NId1 = NodeIdMap[EdgeV1[e1].Val1]; const int NId2 = NodeIdMap[EdgeV1[e1].Val2]; if (AdjMtx2[NId1*Nodes + NId2] != 1) { IsIso = false; break; } } if (IsIso) { IsoPermId = perm; return true; } } IsoPermId = -1; return false; }
bool TGraphKey::operator== | ( | const TGraphKey & | GraphKey | ) | const [inline] |
void TGraphKey::Save | ( | TSOut & | SOut | ) | const |
void TGraphKey::SaveGViz | ( | const TStr & | OutFNm, |
const TStr & | Desc = TStr() , |
||
const TStr & | NodeAttrs = "" , |
||
const int & | Size = -1 |
||
) | const |
Definition at line 153 of file ghash.cpp.
References TStr::CStr(), EdgeV, TVec< TVal >::Empty(), TStr::Empty(), F(), GetEdges(), GetNodes(), TVec< TVal >::Len(), and Nodes.
Referenced by DrawGViz(), and TGHash< TDat >::DrawGViz().
{ FILE *F = fopen(OutFNm.CStr(), "wt"); fprintf(F, "/*****\n"); fprintf(F, " Graph (%d, %d)\n", GetNodes(), GetEdges()); //if (! Desc.Empty()) fprintf(F, " %s\n", Desc.CStr()); fprintf(F, "*****/\n\n"); fprintf(F, "digraph G {\n"); if (Size != -1) fprintf(F, " size=\"%d,%d\";\n", Size, Size); fprintf(F, " graph [splines=true overlap=false]\n"); //size=\"12,10\" ratio=fill if (NodeAttrs.Empty()) fprintf(F, " node [shape=ellipse, width=0.3, height=0.3]\n"); else fprintf(F, " node [shape=ellipse, %s]\n", NodeAttrs.CStr()); if (! EdgeV.Empty()) { for (int e = 0; e < EdgeV.Len(); e++) { fprintf(F, " %d -> %d;\n", EdgeV[e].Val1(), EdgeV[e].Val2()); } } else { for (int n = 0; n < Nodes; n++) { fprintf(F, " %d;\n", n); } } if (! Desc.Empty()) { fprintf(F, " label = \"\\n%s\\n\";", Desc.CStr()); fprintf(F, " fontsize=24;\n"); } fprintf(F, "}\n"); fclose(F); }
void TGraphKey::SaveTxt | ( | FILE * | F | ) | const |
Definition at line 146 of file ghash.cpp.
References EdgeV, GetEdges(), GetNodes(), and TVec< TVal >::Len().
{ fprintf(F, "nodes: %d. edges: %d\n", GetNodes(), GetEdges()); for (int i = 0; i < EdgeV.Len(); i++) { fprintf(F," %d\t%d\n", EdgeV[i].Val1(), EdgeV[i].Val2()); } }
void TGraphKey::SetEdgeV | ( | const TIntPrV & | EdgeIdV | ) | [inline] |
void TGraphKey::SetVariant | ( | const int & | Variant | ) | [inline] |
Definition at line 30 of file ghash.h.
References VariantId.
Referenced by TGHash< TDat >::AddKey(), TGHash< TDat >::GetNodeMap(), and TGHash< TDat >::IsGetKeyId().
{ VariantId = Variant; }
void TGraphKey::TakeGraph | ( | const PNGraph & | Graph | ) |
Definition at line 58 of file ghash.cpp.
References TVec< TVal >::Add(), THash< TKey, TDat, THashFunc >::AddKey(), TNGraph::BegNI(), EdgeV, TNGraph::EndNI(), TVec< TVal >::Gen(), THash< TKey, TDat, THashFunc >::GetKeyId(), TNGraph::GetNodes(), Nodes, TVec< TVal >::Pack(), and TVec< TVal >::Sort().
Referenced by TGHash< TDat >::AddKey(), TGHash< TDat >::GetNodeMap(), and TGHash< TDat >::IsGetKeyId().
{ TIntH NodeIdH; for (TNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) { NodeIdH.AddKey(NI.GetId()); } Nodes = Graph->GetNodes(); EdgeV.Gen(Nodes, 0); for (TNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) { const int NewNId = NodeIdH.GetKeyId(NI.GetId()); for (int i = 0; i < NI.GetOutDeg(); i++) { EdgeV.Add(TIntPr(NewNId, NodeIdH.GetKeyId(NI.GetOutNId(i)))); } } EdgeV.Sort(true); EdgeV.Pack(); }
void TGraphKey::TakeGraph | ( | const PNGraph & | Graph, |
TIntPrV & | NodeMap | ||
) |
Definition at line 74 of file ghash.cpp.
References TVec< TVal >::Add(), THashSet< TKey, THashFunc >::AddKey(), TNGraph::BegNI(), EdgeV, TNGraph::EndNI(), TVec< TVal >::Gen(), THashSet< TKey, THashFunc >::GetKeyId(), TNGraph::GetNodes(), Nodes, TVec< TVal >::Pack(), and TVec< TVal >::Sort().
{ TIntSet NodeIdH; int n = 0; NodeMap.Gen(Graph->GetNodes(), 0); for (TNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++, n++) { NodeIdH.AddKey(NI.GetId()); NodeMap.Add(TIntPr(NI.GetId(), n)); } Nodes = Graph->GetNodes(); EdgeV.Gen(Nodes, 0); for (TNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) { const int NewNId = NodeIdH.GetKeyId(NI.GetId()); for (int i = 0; i < NI.GetOutDeg(); i++) { EdgeV.Add(TIntPr(NewNId, NodeIdH.GetKeyId(NI.GetOutNId(i)))); } } EdgeV.Sort(true); EdgeV.Pack(); }
void TGraphKey::TakeSig | ( | const PNGraph & | Graph, |
const int & | MnSvdGraph, | ||
const int & | MxSvdGraph | ||
) |
Definition at line 94 of file ghash.cpp.
References TVec< TVal >::Add(), THash< TKey, TDat, THashFunc >::AddKey(), TVVec< TVal >::At(), TNGraph::BegNI(), TNGraph::EndNI(), TVec< TVal >::Gen(), TNGraph::GetEdges(), THash< TKey, TDat, THashFunc >::GetKeyId(), TNGraph::GetNodes(), TVec< TVal >::Len(), Nodes, TVec< TVal >::Pack(), TMath::Round(), RoundTo, SigV, TVec< TVal >::Sort(), Svd(), and VariantId.
Referenced by TGHash< TDat >::AddKey(), TGHash< TDat >::GetNodeMap(), and TGHash< TDat >::IsGetKeyId().
{ const int Edges = Graph->GetEdges(); Nodes = Graph->GetNodes(); VariantId = 0; SigV.Gen(2+Nodes, 0); // degree sequence TIntPrV DegV(Nodes, 0); for (TNGraph::TNodeI NodeI = Graph->BegNI(); NodeI < Graph->EndNI(); NodeI++) { DegV.Add(TIntPr(NodeI.GetInDeg(), NodeI.GetOutDeg())); } DegV.Sort(false); SigV.Add(TFlt(Nodes)); SigV.Add(TFlt(Edges)); for (int i = 0; i < DegV.Len(); i++) { SigV.Add(DegV[i].Val1()); SigV.Add(DegV[i].Val2()); } // singular values signature // it turns out that it is cheaper to do brute force isomorphism // checking than to calculate SVD and then check isomorphism if (Nodes >= MnSvdGraph && Nodes < MxSvdGraph) { // perform full SVD TFltVV AdjMtx(Nodes+1, Nodes+1); TFltV SngValV; TFltVV LSingV, RSingV; TIntH NodeIdH; // create adjecency matrix for (TNGraph::TNodeI NodeI = Graph->BegNI(); NodeI < Graph->EndNI(); NodeI++) { NodeIdH.AddKey(NodeI.GetId()); } for (TNGraph::TNodeI NodeI = Graph->BegNI(); NodeI < Graph->EndNI(); NodeI++) { const int NodeId = NodeIdH.GetKeyId(NodeI.GetId()) + 1; for (int e = 0; e < NodeI.GetOutDeg(); e++) { const int DstNId = NodeIdH.GetKeyId(NodeI.GetOutNId(e)) + 1; // no self edges if (NodeId != DstNId) AdjMtx.At(NodeId, DstNId) = 1; } } try { // can fail to converge but results seem to be good TSvd::Svd(AdjMtx, LSingV, SngValV, RSingV); } catch(...) { printf("\n***No SVD convergence: G(%d, %d): SngValV.Len():%d\n", Nodes(), Graph->GetEdges(), SngValV.Len()); } // round singular values SngValV.Sort(false); for (int i = 0; i < SngValV.Len(); i++) { SigV.Add(TMath::Round(SngValV[i], RoundTo)); } } //printf("SIG:\n"); for (int i = 0; i < SigV.Len(); i++) { printf("\t%f\n", SigV[i]); } SigV.Pack(); }
Definition at line 9 of file ghash.h.
Referenced by GetEdges(), GetNGraph(), IsIsomorph(), operator=(), Save(), SaveGViz(), SaveTxt(), SetEdgeV(), and TakeGraph().
Definition at line 8 of file ghash.h.
Referenced by GetNodes(), IsIsomorph(), operator=(), Save(), SaveGViz(), TakeGraph(), and TakeSig().
const int TGraphKey::RoundTo = 4 [static] |
Definition at line 5 of file ghash.h.
Referenced by TakeSig(), and TGraphKey().
Definition at line 10 of file ghash.h.
Referenced by GetPrimHashCd(), GetSecHashCd(), GetSigLen(), operator=(), operator==(), Save(), TakeSig(), and TGraphKey().
Definition at line 11 of file ghash.h.
Referenced by GetPrimHashCd(), GetSecHashCd(), GetVariant(), operator=(), operator==(), Save(), SetVariant(), and TakeSig().