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