10 template <
class TNodeData, 
bool IsDir>
 
   37     TNode() : InVId(-1), OutVId(-1), Dat() { }
 
   38     TNode(
const int& InVecId, 
const int& OutVecId) : InVId(InVecId), OutVId(OutVecId), Dat() { }
 
   39     TNode(
const int& InVecId, 
const int& OutVecId, 
const TNodeDat& NodeDat) :
 
   40       InVId(InVecId), OutVId(OutVecId), Dat(NodeDat) { }
 
   41     TNode(
const TNode& Node) : InVId(Node.InVId), OutVId(Node.OutVId), Dat(Node.Dat) { }
 
   42     TNode(
TSIn& SIn) : InVId(SIn), OutVId(SIn), Dat(SIn) { }
 
   45     bool IsUnused()
 const { 
return InVId==-1 && OutVId==-1; }
 
   58     int GetInVId()
 const { 
return NodeHI->Dat.InVId; }
 
   59     int GetOutVId()
 const { 
return NodeHI->Dat.OutVId; }
 
   61     TNodeI() : NodeHI(), Pool(NULL), InDeg(0), OutDeg(0), InNIdV(NULL), OutNIdV(NULL) { }
 
   62     TNodeI(
const THashIter& NodeHIter, TVPool *PoolPt) : NodeHI(NodeHIter), Pool(PoolPt) { 
GetInOutNIdV(); }
 
   69     int GetId()
 const { 
return NodeHI->Key(); }
 
   73     int GetInNId(
const int& NodeN)
 const { 
return InNIdV[NodeN]; }
 
   74     int GetOutNId(
const int& NodeN)
 const { 
return OutNIdV[NodeN]; }
 
   75     int GetOutNbrId(
const int& NodeN)
 const { 
return NodeN<OutDeg ? OutNIdV[NodeN]:InNIdV[NodeN-
OutDeg]; }
 
   76     bool IsInNId(
const int& NId)
 const { 
return BinSearch(InNIdV, InNIdV+InDeg, NId)!=NULL; }
 
   77     bool IsOutNId(
const int& NId)
 const { 
return BinSearch(OutNIdV, OutNIdV+OutDeg, NId)!=NULL; }
 
   81     const TNodeData& 
GetDat()
 const { 
return NodeHI->Dat.Dat; }
 
   82     TNodeData& 
GetDat() { 
return NodeHI->Dat.Dat; }
 
  102     TEdgeI() : CurNode(), EndNode(), CurEdge(0) { }
 
  103     TEdgeI(
const TNodeI& NodeI, 
const TNodeI& EndNodeI, 
const int& EdgeN=0) : CurNode(NodeI), EndNode(EndNodeI), CurEdge(0) { }
 
  104     TEdgeI(
const TEdgeI& EdgeI) : CurNode(EdgeI.CurNode), EndNode(EdgeI.EndNode), CurEdge(EdgeI.CurEdge) { }
 
  107       while (CurNode < EndNode && CurNode.
GetOutDeg()==0) { CurNode++; } }  
return *
this; }
 
  113     const TNodeData& 
GetSrcNDat()
 const { 
return CurNode.GetNDat(); }
 
  114     TNodeData& 
GetDstNDat() { 
return CurNode.GetOutNDat(CurEdge); }
 
  121   static void AddSorted(
int* Beg, 
int* End, 
const int& Val);
 
  122   static const int* 
BinSearch(
const int* Beg, 
const int* End, 
const int& Val);
 
  123   static const int* 
BinSearch2(
const int* Beg, 
const int* End, 
const int& Val);
 
  135   TBigNet(
const int& Nodes, 
const TSize& Edges, 
const bool& Sources=
false);
 
  139   static PBigNet 
New(
const int& Nodes, 
const TSize& Edges, 
const bool& Sources=
false) {
 
  154   int AddNode(
int NId, 
const int& InDeg, 
const int& OutDeg);
 
  155   int AddNode(
int NId, 
const int& InDeg, 
const int& OutDeg, 
const TNodeDat& NodeDat);
 
  157   int AddNode(
int NId, 
const TIntV& InNIdV, 
const TIntV& OutNIdV, 
const TNodeDat& NodeDat);
 
  159   int AddUndirNode(
int NId, 
const int& Deg, 
const TNodeDat& NodeDat);
 
  175   TEdgeI 
GetEI(
const int& EId) 
const; 
 
  186   int AddEdge(
const int& SrcNId, 
const int& DstNId);
 
  187   bool IsEdge(
const int& SrcNId, 
const int& DstNId, 
const bool& Dir=
true) 
const;
 
  196   PBigNet 
GetSubGraph(
const TIntV& NIdV, 
const bool& RenumberNodes=
false) 
const;
 
  204   void Clr(
const bool& DoDel = 
true) { MxNId = 0;  NodeH.
Clr(DoDel); Pool.
Clr(DoDel); }
 
  206   void Defrag(
const bool& OnlyNodeLinks = 
false) { }
 
  212   static void SaveToDisk(
const TStr& InFNm, 
const TStr& OutFNm, 
const bool& SaveSparseHash);
 
  220 template <
class TNodeData, 
bool IsDir> 
struct IsNodeDat<
TBigNet<TNodeData, IsDir> > { 
enum { 
Val = 1 }; };
 
  223 template <
class TNodeData, 
bool IsDir>
 
  225   if (
NodeHI.IsEnd()) 
return;
 
  237 template <
class TNodeData, 
bool IsDir>
 
  239   printf(
"NodeId: %d\n", GetId());
 
  240   printf(
"  I:%4d]", GetInDeg());
 
  241   for (
int i = 0; i < GetInDeg(); i++) { printf(
"  %d", GetInNId(i)); }
 
  242   printf(
"\n  O:%4d]", GetOutDeg());
 
  243   for (
int i = 0; i < GetOutDeg(); i++) { printf(
"  %d", GetOutNId(i)); }
 
  247 template <
class TNodeData, 
bool IsDir>
 
  252   int Half, Len = int(End-Beg);
 
  256     if (*Mid < Val) { Beg=Mid+1; Len=Len-Half-1; } 
else { Len=Half; } }
 
  257   IAssertR(*Beg != Val, 
"Value already existis");
 
  259   memmove(Beg+1, Beg, 
sizeof(
int)*(End-Beg-1));
 
  263 template <
class TNodeData, 
bool IsDir>
 
  265   End--;  
const int *Mid;
 
  266   while (Beg <= End) { Mid = Beg+(End-Beg)/2;
 
  267     if (*Mid == Val) { 
return Mid; }
 
  268     else if (Val < *Mid) { End=Mid-1; } 
else { Beg=Mid+1; }
 
  273 template <
class TNodeData, 
bool IsDir>
 
  275   const int* First = Beg;
 
  276   const int* Last = End;
 
  278   TSize len = End-Beg, half;
 
  280     half = len>>1;  Mid=First+half;
 
  281     if (*Mid < Val) { First = Mid; First++; len=len-half-1; }
 
  284   return First==Last ? Last-1 : First;
 
  287 template <
class TNodeData, 
bool IsDir>
 
  289 CRef(), MxNId(0), Flags(), Pool(IsDir ? 2*Edges:Edges, 10000000, true, 
TInt::Mx), NodeH(Nodes) {
 
  295     IAssertR(! IsDir, 
"Jure: not clear what happens is graph is Undirected and has only sources.");
 
  300 template <
class TNodeData, 
bool IsDir>
 
  309 template <
class TNodeData, 
bool IsDir>
 
  311   for (
int i = 1; i <int(
gfMx); i++) {
 
  313     else { printf(
"  -"); }
 
  319 template <
class TNodeData, 
bool IsDir>
 
  322   if (NId == -1) { NId = MxNId;  MxNId.
Val++; }
 
  323   else { MxNId = 
TMath::Mx(NId+1, MxNId()); }
 
  331 template <
class TNodeData, 
bool IsDir>
 
  334   if (NId == -1) { NId = MxNId;  MxNId.
Val++; }
 
  335   else { MxNId = 
TMath::Mx(NId+1, MxNId()); }
 
  344 template <
class TNodeData, 
bool IsDir>
 
  347   if (NId == -1) { NId = MxNId;  MxNId.
Val++; }
 
  348   else { MxNId = 
TMath::Mx(NId+1, MxNId()); }
 
  356 template <
class TNodeData, 
bool IsDir>
 
  359   if (NId == -1) { NId = MxNId;  MxNId.
Val++; }
 
  360   else { MxNId = 
TMath::Mx(NId+1, MxNId()); }
 
  369 template <
class TNodeData, 
bool IsDir>
 
  373   if (NId == -1) { NId = MxNId;  MxNId.
Val++; }
 
  374   else { MxNId = 
TMath::Mx(NId+1, MxNId()); }
 
  382 template <
class TNodeData, 
bool IsDir>
 
  386   if (NId == -1) { NId = MxNId;  MxNId.
Val++; }
 
  387   else { MxNId = 
TMath::Mx(NId+1, MxNId()); }
 
  396 template <
class TNodeData, 
bool IsDir>
 
  400   if (NId == -1) { NId = MxNId;  MxNId.
Val++; }
 
  401   else { MxNId = 
TMath::Mx(NId+1, MxNId()); }
 
  409 template <
class TNodeData, 
bool IsDir>
 
  413   if (NId == -1) { NId = MxNId;  MxNId.
Val++; }
 
  414   else { MxNId = 
TMath::Mx(NId+1, MxNId()); }
 
  423 template <
class TNodeData, 
bool IsDir>
 
  431 template <
class TNodeData, 
bool IsDir>
 
  439 template <
class TNodeData, 
bool IsDir>
 
  445 template <
class TNodeData, 
bool IsDir>
 
  453 template <
class TNodeData, 
bool IsDir>
 
  458   GetOutNIdV(NId, OutV);
 
  459   for (
int i = 0; i < OutV.
Len(); i++) {
 
  460     if (OutV[i] == DelNId) { 
break; } 
 
  465     int* Val = (
int *) BinSearch(InNIdV, InNIdV+Deg, NId);
 
  467       printf(
"BAD: Can't find: OUT: NId: %d -- OutNbrId: %d\n", NId, OutV[i]());
 
  471     memcpy(Val, Val+1, 
sizeof(
int)*
int(InNIdV+Deg-Val));
 
  472     *(InNIdV+Deg-1) = DelNId;  NDel++;
 
  479     for (
int i = 0; i < InV.
Len(); i++) {
 
  480       if (InV[i] == DelNId) { 
break; }
 
  485       int* Val = (
int *) BinSearch(OutNIdV, OutNIdV+Deg, NId);
 
  487         printf(
"IN: NId: %d -- InNbrId: %d\n", NId, OutV[i]());
 
  491       memcpy(Val, Val+1, 
sizeof(
int)*
int(OutNIdV+Deg-Val));
 
  492       *(OutNIdV+Deg-1) = DelNId;  NDel++;
 
  500 template <
class TNodeData, 
bool IsDir>
 
  502   const int DelEdges = IsolateNode(NId);
 
  507 template <
class TNodeData, 
bool IsDir>
 
  509   if (NId == DelNId) { 
return true; }
 
  511   GetOutNIdV(NId, OutV);
 
  512   if (OutV.
Empty() || OutV[0] == DelNId) { 
return true; }
 
  517 template <
class TNodeData, 
bool IsDir>
 
  521   for (
TNodeI NI = BegNI(); NI < EndNI(); NI++) {
 
  522     const int NId = NI.GetId();
 
  523     GetOutNIdV(NId, OutV);
 
  524     for (
int i = 0; i < OutV.
Len(); i++) {
 
  525       if (OutV[i] == DelNId) { DelEdges++; }
 
  531 template <
class TNodeData, 
bool IsDir>
 
  536 template <
class TNodeData, 
bool IsDir>
 
  541   Assert(BinSearch(OutV, OutV+OutVLen, DstNId)==NULL); 
 
  542   AddSorted(OutV, OutV+OutVLen, DstNId);
 
  543   if (! OnlySources()) {
 
  547     AddSorted(InV, InV+InVLen, SrcNId);
 
  552 template <
class TNodeData, 
bool IsDir>
 
  555   if (! IsNode(SrcNId, Src)) { 
return false; } 
 
  557   const bool IsEdge = BinSearch(OutV1, OutV1+Pool.
GetVLen(Src.
OutVId), DstNId) != NULL;
 
  558   if (IsEdge && OnlySources()) { 
return true; }
 
  559   const bool IsDstNode = IsNode(DstNId, Dst);
 
  560   if (! IsDstNode) { 
return false; } 
 
  561   else if (IsEdge) { 
return true; } 
 
  564     return BinSearch(OutV2, OutV2+Pool.
GetVLen(Dst.
OutVId), SrcNId) != NULL; }
 
  565   else { 
return false; }
 
  568 template <
class TNodeData, 
bool IsDir>
 
  575 template <
class TNodeData, 
bool IsDir>
 
  577   printf(
"Sorting Edges... ");
 
  581   for (
TNodeI NI = BegNI(); NI < EndNI(); NI++) {
 
  582     const int NId = NI.GetId();
 
  583     GetOutNIdV(NId, OutV);
 
  589     if (++cnt % 
Mega(1) == 0) { printf(
"\r  sort:%dm  %s", cnt/
Mega(1), ExeTm.
GetStr()); }
 
  591   for (
TNodeI NI = BegNI(); NI < EndNI(); NI++) {
 
  592     const int NId = NI.GetId();
 
  593     GetOutNIdV(NId, OutV);
 
  597     if (++cnt % 
Mega(1) == 0) { printf(
"\r  check sorted:%dm  %s", cnt/
Mega(1), ExeTm.
GetStr()); }
 
  599   printf(
"done. [%s]\n", ExeTm.
GetStr());
 
  603 template <
class TNodeData, 
bool IsDir>
 
  607   if (ExpectNodes == 0) ExpectNodes=4*GetNodes();
 
  608   printf(
"\nInverting BigNet: reserved for %s nodes\n", 
TInt::GetMegaStr(ExpectNodes).CStr());
 
  611   TDegHash InDegH(ExpectNodes);
 
  615   for (
TNodeI NI = BegNI(); NI < EndNI(); NI++, c++) {
 
  616     for (
int e = 0; e < NI.GetOutDeg(); e++) {
 
  617       InDegH.AddDat(NI.GetOutNId(e)) += 1; }
 
  621   if (2*GetEdges() > Pool.
Reserved()) {
 
  624   printf(
"NodeH: %s nodes, InDeg: %s nodes, Reserve: %s\n", 
TInt::GetMegaStr(NodeH.
Len()).CStr(),
 
  626   NodeH.Reserve(ExpectNodes);
 
  627   for (TDegHash::TIter I = InDegH.BegI(); I < InDegH.EndI(); I++) {
 
  628     const int NId = I->Key, InDeg = I->Dat;
 
  630       AddNode(NId, InDeg, 0); NDest++; } 
 
  632       TNode& Node = GetNode(NId);
 
  637   printf(
"Added: %lld destination nodes\n", 
uint64(NDest));
 
  638   printf(
"Graph nodes: %lld nodes\n", 
uint64(GetNodes()));
 
  641   for (
TNodeI NI = BegNI(); NI < EndNI(); NI++, c++)
 
  644   printf(
"Adding edges...\n");
 
  646   for (
TNodeI NI = BegNI(); NI < EndNI(); NI++, c++) {
 
  647     const int SrcNId = NI.GetId();
 
  648     for (
int e = 0; e < NI.GetOutDeg(); e++) {
 
  649       TIntPt& InV = NIdToPtH.
GetDat(NI.GetOutNId(e));
 
  651       *InV = SrcNId;  InV++;
 
  656   printf(
"\nSorting in-links...\n");
 
  658   for (
TNodeI NI = BegNI(); NI < EndNI(); NI++, c++) {
 
  659     Pool.
GetV(NI.GetInVId(), InNIdV);
 
  663   printf(
"\r...done [%g]\n", ExeTm.
GetSecs());
 
  667 template <
class TNodeData, 
bool IsDir>
 
  669   uint64 NDup=0, NResolve=0, NAddit=0, cnt = 0;
 
  671   IAssertR(! IsDir, 
"Only undirected networks are supported");
 
  672   printf(
"Rewiring the network... 1");
 
  675   printf(
"  sorting edges...\n");
 
  677   printf(
" done [%s]\n", ExeTm.
GetStr());
 
  679   printf(
"  removing duplicates...\n");
 
  680   for (
TNodeI NI = BegNI(); NI < EndNI(); NI++, cnt++) {
 
  681     const int VId = NI.GetOutVId();
 
  684     for (
int i = 0; i < Len-1 && V[i]!=DelNId; i++) {
 
  685       if (V[i] == V[i+1] || V[i]==NI.GetId()) {
 
  686         memcpy(V+i, V+i+1, 
sizeof(
int)*(Len-i-1)); i--;
 
  687         V[Len-1] = DelNId;  NDup++;
 
  690     if (Len > 0 && V[Len-1]==NI.GetId()) { V[Len-1] = DelNId;  NDup++; }
 
  691     if (cnt % 
Mega(10) == 0) { printf(
".");  fflush(stdout); }
 
  693   printf(
"\n    %llu duplicate edges removed [%s]\n", NDup, ExeTm.
GetStr());
 
  694   if (OnlySources()) { 
return; }
 
  696   printf(
"  resolving one way edges...\n"); cnt=0; fflush(stdout);
 
  697   for (
TNodeI NI = BegNI(); NI < EndNI(); NI++, cnt++) {
 
  698     for (
int e = 0; e < NI.GetOutDeg(); e++) {
 
  699       if (NI.GetOutNId(e) == DelNId) { 
continue; } 
 
  700       const int InVId = GetNode(NI.GetOutNId(e)).InVId;
 
  702       int* InV = (
int *) Pool.
GetValVPt(InVId);
 
  703       int* Val = (
int *) BinSearch2(InV, InV+InVLen, NI.GetId());
 
  704       if (*Val == NI.GetId()) { 
continue; } 
 
  705       if (InVLen>0 && InV[InVLen-1] == DelNId) { 
 
  706         IAssert((InVLen-(Val-InV)-1) >= 0);
 
  707         memmove(Val+1, Val, 
sizeof(
int)*(InVLen-(Val-InV)-1));
 
  710         memmove(NI.OutNIdV+e, NI.OutNIdV+e+1, 
sizeof(
int)*(NI.GetOutDeg()-e-1));
 
  711         NI.OutNIdV[NI.GetOutDeg()-1]=DelNId;  e--;
 
  715     if (cnt % 
Mega(10) == 0) { printf(
".");  fflush(stdout); }
 
  717   printf(
"\n    %llu resolved edges [%s]\n", NResolve, ExeTm.
GetStr());
 
  719   printf(
"  filling empty edge slots...\n");
 
  723   for (
TNodeI NI = BegNI(); NI < EndNI(); NI++) {
 
  724     if (NI.GetOutNId(NI.GetOutDeg()-1) == DelNId) {
 
  726       for (
int s = NI.GetOutDeg()-1; s >= 0; s--) {
 
  727         if (NI.GetOutNId(s) == DelNId) { NSlots++; }
 
  730       SlotNIdV.
Add(
TIntPr(NI.GetId(), NSlots));
 
  731       SlotNIdH.
AddDat(NI.GetId(), NSlots);
 
  735   printf(
"    %d nodes, with %d spokes available, %d edges\n", SlotNIdH.
Len(), CumSlots, CumSlots/2);
 
  737   for (
int ni1 = 0; ni1 < NIdV.Len(); ni1++) {
 
  738     const int nid = NIdV[ni1];
 
  739     if (! SlotNIdH.
IsKey(nid) || SlotNIdH.
GetDat(nid) == 0) { 
continue; }
 
  740     const int NI1Slots = SlotNIdH.
GetDat(nid);
 
  743     for (
int NTries = 0; NTries < 4*NI1Slots && NI.
GetOutNId(NI.
GetOutDeg()-1) == DelNId; NTries++) {
 
  745       if (nid == nid2) { 
continue; }
 
  751         if (*V1 != DelNId) { memmove(V1+1, V1, 
sizeof(
int)*(NI.
GetOutDeg()-(V1-NI.
OutNIdV)-1)); }
 
  752         if (*V2 != DelNId) { memmove(V2+1, V2, 
sizeof(
int)*(NI2.
GetInDeg()-(V2-NI2.
InNIdV)-1)); }
 
  757       if (SlotNIdH.
GetDat(nid2) == 0) { SlotNIdH.
DelKey(nid2); 
continue; }
 
  758       if (SlotNIdH.
GetDat(nid) == 0) { SlotNIdH.
DelKey(nid); 
break; }
 
  760     if (ni1 % 
Mega(1) == 0) { printf(
".");  fflush(stdout); }
 
  762   printf(
"    %llu edges added.\nDONE. TOTAL REWIRE TIME [%s]\n\n", NAddit, ExeTm.
GetStr());
 
  765 template <
class TNodeData, 
bool IsDir>
 
  767   IAssert(RenumberNodes == 
false);
 
  770   for (
TNodeI NI = BegNI(); NI < EndNI(); NI++) {
 
  771     Graph->
AddNode(NI.GetId(), Pool, NI.GetInVId(), NI.GetOutVId());
 
  776 template <
class TNodeData, 
bool IsDir>
 
  780   for (
int i = 0; i < NIdV.
Len(); i++) {
 
  783   for (
int i = 0; i < NIdV.
Len(); i++) {
 
  784     const int SrcNId = NIdV[i];
 
  785     const TNodeI NI = GetNI(SrcNId);
 
  786     int InDeg=0, OutDeg=0;
 
  793   for (
int i = 0; i < NIdV.
Len(); i++) {
 
  794     const int SrcNId = NIdV[i];
 
  795     const TNodeI NI = GetNI(SrcNId);
 
  796     for (
int e = 0; e < NI.
GetOutDeg(); e++) {
 
  798       if (Graph->
IsNode(DstNId)) {
 
  799         Graph->
AddEdge(SrcNId, DstNId); }
 
  805 template <
class TNodeData, 
bool IsDir>
 
  807   const bool isDir = IsDir, onlySources = HasFlag(
gfSources);
 
  811   for (
int i = 0; i < NIdV.
Len(); i++) { NIdDegH.
AddDat(NIdV[i]); }
 
  812   for (
int i = 0; i < NIdV.
Len(); i++) {
 
  813     const TNodeI NI = GetNI(NIdV[i]);
 
  814     int InDeg=0, OutDeg=0;
 
  815     for (
int n = 0; n < NI.
GetOutDeg(); n++) {
 
  816       if (NIdDegH.IsKey(NI.
GetOutNId(n))) OutDeg++; }
 
  817     if (! onlySources && isDir) {
 
  818       for (
int n = 0; n < NI.
GetInDeg(); n++) {
 
  819         if (NIdDegH.IsKey(NI.
GetInNId(n))) InDeg++; }
 
  822     NIdDegH.GetDat(NIdV[i]) = 
TIntPr(InDeg, OutDeg);
 
  827   TBNet& NewNet = *NewNetPt;
 
  828   NewNet.Flags = Flags;
 
  830   if (isDir || onlySources) {
 
  831     for (
int i = 0; i < NIdV.
Len(); i++) {
 
  832       const TIntPr& Deg = NIdDegH.GetDat(NIdV[i]);
 
  833       NewNet.AddNode(NIdV[i], Deg.
Val1, Deg.
Val2, GetNDat(NIdV[i])); } 
 
  835     for (
int i = 0; i < NIdV.
Len(); i++) {
 
  836       const TIntPr& Deg = NIdDegH.GetDat(NIdV[i]);
 
  837       NewNet.AddUndirNode(NIdV[i], Deg.
Val2, GetNDat(NIdV[i])); } 
 
  840   for (
int i = 0; i < NIdV.
Len(); i++) {
 
  842     const TNodeI NI = GetNI(NId);
 
  843     int *NIdVPt = (
int *) NewNet.GetOutNIdVPt(NId);
 
  845     for (
int e = 0; e < NI.
GetOutDeg(); e++) {
 
  847       if (NewNet.IsNode(Dst)) {
 
  848         *NIdVPt = Dst;  NIdVPt++;  deg++; }
 
  850     EAssert(deg == NIdDegH.GetDat(NId).Val2);
 
  851     if (isDir && ! onlySources) {
 
  854       int * NIdVPt = (
int *) NewNet.GetInNIdVPt(NId);
 
  856       for (
int e = 0; e < NI.
GetInDeg(); e++) {
 
  858         if (NewNet.IsNode(Dst)) {
 
  859           *NIdVPt = Dst;  NIdVPt++;  deg++; }
 
  861       EAssert(deg == NIdDegH.GetDat(NId).Val1);
 
  867 template <
class TNodeData, 
bool IsDir>
 
  869   printf(
"Set subgraph on %d nodes\n", NIdV.
Len()); 
TExeTm ExeTm;
 
  870   const bool isDir = IsDir, onlySources = HasFlag(
gfSources);
 
  874   for (
int i = 0; i < NIdV.
Len(); i++) { NIdDegH.
AddDat(NIdV[i]); }
 
  875   for (
int i = 0; i < NIdV.
Len(); i++) {
 
  876     const TNodeI NI = GetNI(NIdV[i]);
 
  877     int InDeg=0, OutDeg=0;
 
  878     for (
int n = 0; n < NI.
GetOutDeg(); n++) {
 
  879       if (NIdDegH.IsKey(NI.
GetOutNId(n))) OutDeg++; }
 
  880     if (! onlySources && isDir) {
 
  881       for (
int n = 0; n < NI.
GetInDeg(); n++) {
 
  882         if (NIdDegH.IsKey(NI.
GetInNId(n))) InDeg++; }
 
  885     NIdDegH.GetDat(NIdV[i]) = 
TIntPr(InDeg, OutDeg);
 
  892   NewNet.
Flags = Flags;
 
  895   if (! RenumberNodes) {
 
  896     if (isDir || onlySources) {
 
  897       for (
int i = 0; i < NIdV.
Len(); i++) {
 
  898         const TIntPr& Deg = NIdDegH.GetDat(NIdV[i]);
 
  901       for (
int i = 0; i < NIdV.
Len(); i++) {
 
  902         const TIntPr& Deg = NIdDegH.GetDat(NIdV[i]);
 
  907     for (
int i = 0; i < NIdV.
Len(); i++) { NIdMap.
AddKey(NIdV[i]);  }
 
  908     if (isDir || onlySources) {
 
  909       for (
int i = 0; i < NIdV.
Len(); i++) {
 
  910         const TIntPr& Deg = NIdDegH.GetDat(NIdV[i]);
 
  913       for (
int i = 0; i < NIdV.
Len(); i++) {
 
  914         const TIntPr& Deg = NIdDegH.GetDat(NIdV[i]);
 
  919   for (
int i = 0; i < NIdV.
Len(); i++) {
 
  921     const TNodeI NI = GetNI(NId);
 
  924     for (
int e = 0; e < NI.
GetOutDeg(); e++) {
 
  927         *NIdVPt = Dst;  NIdVPt++;  deg++; }
 
  929     EAssert(deg == NIdDegH.GetDat(NId).Val2);
 
  930     if (isDir && ! onlySources) {
 
  935       for (
int e = 0; e < NI.
GetInDeg(); e++) {
 
  938           *NIdVPt = Dst;  NIdVPt++;  deg++; }
 
  940       EAssert(deg == NIdDegH.GetDat(NId).Val1);
 
  943   printf(
"  %u edges [%s]\n", 
uint(Edges), ExeTm.GetStr());
 
  946 template <
class TNodeData, 
bool IsDir>
 
  953 template <
class TNodeData, 
bool IsDir>
 
  957   printf(
"Is ok network:\n  Check Vec...");
 
  960     if (! ValV.
Empty()) {
 
  961       EAssert((0<=ValV[0] && ValV[0]<MxNId) || ValV[0]==DelNId);
 
  963       for (
int i = 1; i < ValV.
Len(); i++) {
 
  966         EAssertR((ValV[i-1]<ValV[i]) || (ValV[i-1]==ValV[i] && ValV[i]==DelNId),
 
  967           TStr::Fmt(
"NId1: %d NId2:%d", ValV[i-1](),ValV[i]()));
 
  968         EAssertR((0<=ValV[i] && ValV[i]<MxNId) || ValV[i]==DelNId,
 
  969           TStr::Fmt(
"NId1: %dm MxNId: %d", ValV[i](), MxNId));
 
  970         if (! OnlySources()) {
 
  971           EAssertR(IsNode(ValV[i]) || ValV[i]==DelNId,
 
  972             TStr::Fmt(
"NId1: %dm MxNId: %d", ValV[i](), MxNId)); } 
 
  975         printf(
"  %s\n", Except->GetStr().CStr());
 
  976         printf(
"  vec id: %d, lenght: %d\n", 
id, ValV.
Len());
 
  977         for (
int i = 1; i < ValV.
Len(); i++) {
 
  978           printf(
"  %d", ValV[i]());
 
  979           if (!((ValV[i-1]<ValV[i]) || (ValV[i-1]==ValV[i] && ValV[i]==DelNId))) { printf(
"*"); }
 
  985     if (
id % 10000 == 0) {
 
  986       printf(
"\r  %dk / %dk [%s]", 
id/1000, Pool.
GetVecs()/1000, ExeTm.
GetStr()); }
 
  988   printf(
"[%s]\n  Check Edges...\n", ExeTm.
GetStr());
 
  991   if (! OnlySources()) {
 
  993     for (
TNodeI NI = BegNI(); NI < EndNI(); NI++, Cnt++) {
 
  995       for (
int e = 0; e < NI.GetInDeg(); e++) {
 
  996         if (NI.GetInNId(e) == DelNId) { 
continue; } 
 
  997     if (! IsEdge(NI.GetInNId(e), NI.GetId())) {
 
  998       printf(
"\nno edge: %d --> %d", NI.GetInNId(e), NI.GetId());
 
  999       printf(
"NId: %d   deg %d,%d\n", NI.GetId(), NI.GetOutDeg(), NI.GetInDeg());
 
 1000       for (
int i = 0; i < NI.GetInDeg(); i++) { printf(
"  %d", NI.GetInNId(i)); }
 
 1001       TNodeI NI2 = GetNI(NI.GetInNId(e));
 
 1011       for (
int e = 0; e < NI.GetOutDeg(); e++) {
 
 1012         if (NI.GetOutNId(e) == DelNId) { 
continue; }
 
 1013         const int InVId = GetNode(NI.GetOutNId(e)).InVId;
 
 1014         int* DstInV = (
int *)Pool.
GetValVPt(InVId);
 
 1015     if (BinSearch(DstInV, DstInV+Pool.
GetVLen(InVId), NI.GetId()) == NULL) {
 
 1016       printf(
"no edge: %d --> %d", NI.GetId(), NI.GetInNId(e));
 
 1017       printf(
"NId: %d   deg %d,%d\n", NI.GetId(), NI.GetOutDeg(), NI.GetInDeg());
 
 1018       for (
int i = 0; i < NI.GetOutDeg(); i++) { printf(
"  %d", NI.GetOutNId(i)); }
 
 1019       TNodeI NI2 = GetNI(NI.GetOutNId(e));
 
 1021       for (
int j = 0; j < NI2.
GetInDeg(); j++) { printf(
"  %d", NI2.
GetInNId(j)); }
 
 1022       printf(
"\n");  ErrCnt++;
 
 1027     if (ErrCnt > 5) { 
FailR(
"error count too large!"); }
 
 1028       if (Cnt % 100000 == 0) {
 
 1036 template <
class TNodeData, 
bool IsDir>
 
 1038   if (! Desc.
Empty()) { printf(
"\n%s (%d, %u):\n", Desc.
CStr(), GetNodes(), GetEdges()); }
 
 1039   else { printf(
"\nNodes: %d,  Edges: %u\n", GetNodes(), GetEdges()); }
 
 1040   for (
TNodeI NI = BegNI(); NI < EndNI(); NI++) {
 
 1041     printf(
"%d]\n  IN %d]", NI.GetId(), NI.GetInDeg());
 
 1042     for (
int i=0; i<NI.GetInDeg(); i++) { printf(
" %d", NI.GetInNId(i)); }
 
 1044       printf(
"\n  OUT %d]", NI.GetOutDeg());
 
 1045       for (
int i=0; i<NI.GetOutDeg(); i++) { printf(
" %d", NI.GetOutNId(i)); }
 
 1054 template <
class TNodeData, 
bool IsDir>
 
 1056   const bool IsDirected = IsDir;
 
 1058   FOut.
Save(GetNodes());
 
 1059   FOut.
Save(GetEdges());
 
 1060   FOut.
Save(IsDirected);
 
 1061   for (
TNodeI NI = BegNI(); NI < EndNI(); NI++) {
 
 1062     FOut.
Save(NI.GetId());
 
 1063     NI.GetDat().Save(FOut);
 
 1064     FOut.
Save(NI.GetOutDeg());
 
 1065     for (
int i = 0; i < NI.GetOutDeg(); i++) {
 
 1066       FOut.
Save(NI.GetOutNId(i)); }
 
 1068       FOut.
Save(NI.GetInDeg());
 
 1069       for (
int i = 0; i < NI.GetInDeg(); i++) {
 
 1070         FOut.
Save(NI.GetInNId(i)); }
 
 1076 template <
class TNodeData, 
bool IsDir>
 
 1081   printf(
"skipping Pool...\n");
 
 1082   TBool FastCopy(SIn);
 
 1083   uint64 _GrowBy, _MxVals, _Vals;
 
 1087   for (
TSize ValN = 0; ValN < _Vals; ValN++) { SIn.
Load(Tmp); }
 
 1088   TInt MxVals(SIn), Vals(SIn);
 
 1090   for (
int ValN = 0; ValN < Vals; ValN++) { SIn.
Load(Offset); }
 
 1091   printf(
"loading Hode hash table...\n");
 
 1096 template <
class TNodeData, 
bool IsDir>
 
 1100   { 
TInt MxNId(FIn);  MxNId.
Save(FOut);
 
 1102   TVPool Pool(FIn);  Pool.
Save(FOut); }
 
 1103   { TNodeH NodeH(FIn);
 
 1104   if (! SaveSparseHash) {
 
 1107       NewH.
AddDat(I->Key, I->Dat);
 
 1111     FailR(
"Not implemented");
 
void Defrag(const bool &OnlyNodeLinks=false)
 
const TNode & GetNode(const int &NId) const 
 
void GetV(const int &VId, TValV &ValV) const 
Returns ValV which is a reference (not a copy) to vector with id VId. 
 
TPt< TBigNet< TNodeData, IsDir > > PBigNet
 
TPair< TInt, TInt > TIntPr
 
Tests (at compile time) if the graph is a network with data on nodes. 
 
void GetInNIdV(int NId, TIntV &OutNIdV) const 
 
Main namespace for all the Snap global entities. 
 
int AddUndirNode(int NId, const int &Deg)
 
const TNodeData & GetSrcNDat() const 
 
#define IAssertR(Cond, Reason)
 
TNodeDat & GetNDat(const int &NId)
 
static TStr GetMegaStr(const int &Val)
 
bool IsIsoNode(const int &NId) const 
 
TNode(const int &InVecId, const int &OutVecId)
 
uint64 Reserved() const 
Returns the total capacity of the pool. 
 
int AddV(const TValV &ValV)
Adds vector ValV to the pool and returns its id. 
 
static const T & Mx(const T &LVal, const T &RVal)
 
static PNGraph New()
Static constructor that returns a pointer to the graph. Call: PNGraph Graph = TNGraph::New(). 
 
TNodeI & operator=(const TNodeI &NI)
 
void Save(TSOut &SOut) const 
 
void ReserveNIdInDeg(const int &NId, const int &InDeg)
Reserves memory for node ID NId having InDeg in-edges. 
 
void SaveForDisk(const TStr &OutFNm) const 
 
static PBigNet New(const int &Nodes, const TSize &Edges, const bool &Sources=false)
 
int GetKeyId(const TKey &Key) const 
 
static void LoadNodeDatH(const TStr &InFNm, TNodeH &NodeH)
 
Tests (at compile time) if the graph is directed. 
 
void SetOutNIdV(int NId, const TIntV &OutNIdV)
 
TSizeTy Len() const 
Returns the number of elements in the vector. 
 
void Save(TSOut &SOut) const 
 
void Gen(const int &ExpectVals)
 
int AddEdge(const int &SrcNId, const int &DstNId)
 
void Clr(const bool &DoDel=true)
 
TNode & GetNode(const int &NId)
 
void Save(TSOut &SOut) const 
 
void Save(TSOut &SOut) const 
 
int AddNode(int NId=-1)
Adds a node of ID NId to the graph. 
 
bool IsOutNId(const int &NId) const 
 
void Reserve(const int &Nodes, const TSize &Edges)
 
const TDat & GetDat(const TKey &Key) const 
 
void CompactPool(const TVal &DelVal)
Deletes all elements of value DelVal from all vectors. 
 
bool operator==(const TEdgeI &EdgeI) const 
 
bool IsUnused() const 
Tests whether the node is deleted then it is unused (and its InVId==OutVId==-1) 
 
void Save(TSOut &SOut) const 
 
TSize GetVals() const 
Returns the total number of values stored in the vector pool. 
 
TInt InVId
Id of the vector storing nodes that point to the current node. 
 
int GetMxNId() const 
Returns an id that is larger than any node id in the network. 
 
TEdgeI(const TEdgeI &EdgeI)
 
int AddEmptyV(const int &ValVLen)
Adds a vector of length ValVLen to the pool and returns its id. 
 
bool Empty() const 
Tests whether the vector is empty. 
 
TStr GetFlagStr(const TGraphFlag &GraphFlag)
Returns a string representation of a flag. 
 
TBigNet(const int &Nodes, const TSize &Edges, const bool &Sources=false)
 
void Save(TSOut &SOut) const 
 
void Dump(const TStr &Desc=TStr()) const 
 
TNodeI GetNI(const int &NId) const 
 
bool IsNode(const int &NId, TNode &Node) const 
 
static PBigNet Load(TSIn &SIn)
 
void DelKey(const TKey &Key)
 
int GetInNId(const int &NodeN) const 
 
bool operator==(const TNodeI &NI) const 
 
int GetOutNbrId(const int &NodeN) const 
 
TNodeI(const THashIter &NodeHIter, TVPool *PoolPt)
 
TVal * GetValVPt(const int &VId) const 
Returns pointer to the first element of the vector with id VId. 
 
void Sort(const bool &Asc=true)
Sorts the elements of the vector. 
 
void Gen(const int &ExpectVals)
 
#define HasGraphFlag(TGraph, Flag)
For quick testing of the properties of the graph/network object (see TGraphFlag). ...
 
bool IsInNId(const int &NId) const 
 
int AddEdge(const int &SrcNId, const int &DstNId)
Adds an edge from node SrcNId to node DstNId to the graph. 
 
int * GetOutNIdVPt(const int &NId) const 
 
void PutAll(const TVal &Val)
Sets all elements of the vector to value Val. 
 
TNodeDat Dat
Data associated with the node. 
 
unsigned long long uint64
 
TNode(const int &InVecId, const int &OutVecId, const TNodeDat &NodeDat)
 
THash< TInt, TNode > TNodeH
 
int GetVLen(const int &VId) const 
Returns the number of elements in the vector with id VId. 
 
TNodeI GetRndNI(TRnd &Rnd=TInt::Rnd) const 
 
void Clr(bool DoDel=true)
Clears the contents of the pool. 
 
bool IsNode(const int &NId) const 
Tests whether ID NId is a node. 
 
bool IsKeyGetDat(const TKey &Key, TDat &Dat) const 
 
bool operator<(const TNodeI &NI) const 
 
int AddKey(const TKey &Key)
 
bool In(const int &BitN) const 
 
TNodeI & operator++(int)
Increment iterator. 
 
void Incl(const int &BitN)
 
TBigNet & operator=(const TBigNet &Net)
 
const TNodeDat & GetNDat(const int &NId) const 
 
bool IsNbrNId(const int &NId) const 
 
TEdgeI & operator=(const TEdgeI &EdgeI)
 
THashKeyDatI< TInt, TNode > TIter
 
void Save(const bool &Bool)
 
TNodeI(const TNodeI &NodeI)
 
const TNodeData & operator()() const 
 
directed graph (TNGraph, TNEGraph), else graph is undirected TUNGraph 
 
static const int * BinSearch2(const int *Beg, const int *End, const int &Val)
 
void SetInNIdV(int NId, const TIntV &InNIdV)
 
void Reserve(const TSize &MxVals)
Reserves enough capacity for the pool to store MxVals elements. 
 
void GetNIdV(TIntV &NIdV) const 
 
PNGraph GetNGraph(const bool &RenumberNodes=false) const 
 
void GetKeyV(TVec< TKey > &KeyV) const 
 
PBigNet GetSubGraph(const TIntV &NIdV, const bool &RenumberNodes=false) const 
 
int AddNode(int NId, const int &InDeg, const int &OutDeg)
 
TDat & AddDat(const TKey &Key)
 
void InvertFromSources(uint ExpectNodes=0)
 
static void SaveToDisk(const TStr &InFNm, const TStr &OutFNm, const bool &SaveSparseHash)
 
int * GetInNIdVPt(const int &NId) const 
 
sentinel, last value for iteration 
 
TIter BegI() const 
Returns an iterator pointing to the first element in the vector. 
 
static TStr Fmt(const char *FmtStr,...)
 
bool IsSorted(const bool &Asc=true) const 
Checks whether the vector is sorted in ascending (if Asc=true) or descending (if Asc=false) order...
 
enum TGraphFlag_ TGraphFlag
Graph Flags, used for quick testing of graph types. 
 
static const int * BinSearch(const int *Beg, const int *End, const int &Val)
 
int GetVecs() const 
Returns the total number of vectors stored in the vector pool. 
 
int GetOutNId(const int &NodeN) const 
 
bool IsNode(const int &NId) const 
 
virtual void Save(TSOut &SOut) const 
 
TEdgeI GetEI(const int &EId) const 
 
bool operator<(const TEdgeI &EdgeI) const 
 
void ShuffleAll(TRnd &Rnd=TInt::Rnd)
Shuffles the order of all elements in the pool. 
 
#define EAssertR(Cond, MsgStr)
 
static void AddSorted(int *Beg, int *End, const int &Val)
 
void Rewire(TRnd &Rnd=TInt::Rnd)
 
nodes only store out-edges (but not in-edges). See TBigNet 
 
void Reserve(const int &Nodes, const int &Edges)
Reserves memory for a graph of Nodes nodes and Edges edges. 
 
void Clr(const bool &DoDel=true, const int &NoDelLim=-1, const bool &ResetDat=true)
 
TEdgeI(const TNodeI &NodeI, const TNodeI &EndNodeI, const int &EdgeN=0)
 
int GetRndKeyId(TRnd &Rnd) const 
Get an index of a random element. If the hash table has many deleted keys, this may take a long time...
 
int GetRndNId(TRnd &Rnd=TInt::Rnd) const 
 
void Reserve(const TSizeTy &_MxVals)
Reserves enough memory for the vector to store _MxVals elements. 
 
void Excl(const int &BitN)
 
bool IsEdge(const int &SrcNId, const int &DstNId, const bool &Dir=true) const 
 
PNGraph GetSubNGraph(const TIntV &NIdV) const 
 
const char * GetStr() const 
 
void GetOutNIdV(int NId, TIntV &OutNIdV) const 
 
bool IsKey(const TKey &Key) const 
 
bool IsVId(const int &VId) const 
Tests whether vector of id VId is in the pool. 
 
TSizeTy Add()
Adds a new element at the end of the vector, after its current last element. 
 
TDat & AddDat(const TKey &Key)
 
const TKey & GetKey(const int &KeyId) const 
 
Node Network (directed graph, TNGraph with data on nodes only). 
 
TBigNet< TNodeData, IsDir > TNet
 
const TNodeData & GetDat() const 
 
TInt OutVId
Id of the vector storing nodes that the current node points to. 
 
void ReserveNIdOutDeg(const int &NId, const int &OutDeg)
Reserves memory for node ID NId having OutDeg out-edges. 
 
bool HasFlag(const TGraphFlag &Flag) const 
 
TIter GetI(const TKey &Key) const