12 const int NNodes = Graph->
GetNodes();
13 NIdEigenH.
Gen(NNodes);
16 NIdEigenH.
AddDat(NI.GetId(), 1.0/NNodes);
20 for (
int iter = 0; iter < MaxIter; iter++) {
25 for (
int e = 0; e < NI.GetOutDeg(); e++) {
26 TmpV[j] += NIdEigenH.
GetDat(NI.GetOutNId(e)); }
31 for (
int i = 0; i < TmpV.
Len(); i++) {
32 sum += (TmpV[i]*TmpV[i]);
35 for (
int i = 0; i < TmpV.
Len(); i++) {
43 diff += fabs(NIdEigenH.
GetDat(NI.GetId())-TmpV[j]);
49 NIdEigenH.
AddDat(NI.GetId(), TmpV[j]);
63 deg = Graph->
GetNI(NI.GetId()).GetDeg();
64 for (
int i=0; i<deg; i++) {
65 if (Group->
IsNode(Graph->
GetNI(NI.GetId()).GetNbrNId(i))==0)
69 return (
double)NN.
Len();
75 for (
int i = 0; i<GroupNodes.
Len(); i++) {
77 for (
int j = 0; j < deg; j++) {
82 return (
double)NN.
Len();
91 GroupNodes1.
AddDat(NI.GetDat(),NI.GetDat());
96 for (
int j = 0; j < deg; j++){
102 return (
double)NN.
Len();
108 for (
int i=0; i<GroupNodes.
Len(); i++){
110 TSnap::GetShortPath<PUNGraph>(Graph, GroupNodes.
GetDat(i), NDistH[i],
true,
TInt::Mx);
113 int min, dist, sum=0, len=0;
114 for (PUNGraph::TObj::TNodeI NI = Graph->
BegNI(); NI < Graph->
EndNI(); NI++){
115 if(NDistH[0].IsKey(NI.GetId()))
116 min = NDistH[0].
GetDat(NI.GetId());
119 for (
int j=1; j<GroupNodes.
Len(); j++){
120 if (NDistH[j].IsKey(NI.GetId()))
121 dist = NDistH[j].
GetDat(NI.GetId());
124 if ((dist < min && dist != -1) || (dist > min && min == -1))
134 if (len > 0) {
return sum/double(len); }
141 for(
int i=0; i<n; i++)
147 for(
int i=0; i<n; i++)
148 for(
int j=i; j<n; j++){
159 for(
int i=n; i>0; i--){
160 N *= (float)m/(
float)n;
171 if (Farness != 0.0) {
return 1.0/Farness; }
179 double gc = 0, gc0 = 0;
180 int addId = 0, addIdPrev = 0;
183 Nodes.
AddDat(NI.GetId(),NI.GetDeg());
191 if ((NI.GetDat() <= (int)gc0))
200 if (addId != addIdPrev){
202 GroupNodes.
AddDat(br,addId);
207 for (
int i=0; i<Graph->
GetNI(addId).
GetDeg(); i++) {
227 double gc = 0, gc0 = 0;
228 int addId = 0, addIdPrev = 0;
232 Nodes.
AddDat(NI.GetId(),NI.GetDeg());
239 if((NI.GetDat() < (int)gc0))
248 if (addId != addIdPrev){
250 GroupNodes.
AddDat(br,addId);
255 for (
int i=0; i<Graph->
GetNI(addId).
GetDeg(); i++) {
272 double gc = 0, gc0 = 0;
273 int addId = 0, addIdPrev=0;
276 Nodes.
AddDat(NI.GetId(),NI.GetDeg());
284 if((NI.GetDat() <= (int)gc0))
293 if (addId != addIdPrev) {
295 GroupNodes.
AddDat(br,addId);
304 for (
int i=0; i<Graph->
GetNI(addId).
GetDeg(); i++) {
325 int *NNodes =
new int[n];
328 double gc = 0, gc0 = 0;
329 int addId = 0, addIdPrev = 0;
332 Nodes.
AddDat(NI.GetId(),NI.GetDeg());
340 if((NI.GetDat() <= (int)gc0))
342 gc = NI.GetDat()-
Intersect(Graph->
GetNI(NI.GetKey()),NNodes,NNodes_br);
349 if (addId != addIdPrev) {
351 GroupNodes.
AddDat(br,addId);
357 for (
int j=0; j<NNodes_br; j++)
358 if (NNodes[j] == nn){
364 NNodes[NNodes_br] = nn;
368 for (
int i=0; i<Graph->
GetNI(addId).
GetDeg(); i++) {
371 for (
int j=0; j<NNodes_br; j++) {
372 if (NNodes[j] == nn){
378 NNodes[NNodes_br] = nn;
397 if (!Graph->IsFltAttrE(Attr))
return -1;
399 TFltV Weights = Graph->GetFltAttrVecE(Attr);
401 int mxid = Graph->GetMxNId();
402 TFltV OutWeights(mxid);
403 Graph->GetWeightOutEdgesV(OutWeights, Weights);
405 const int NNodes = Graph->GetNodes();
409 PRankH.
AddDat(NI.GetId(), 1.0/NNodes);
413 for (
int iter = 0; iter < MaxIter; iter++) {
415 for (
TNEANet::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++, j++) {
417 for (
int e = 0; e < NI.GetInDeg(); e++) {
418 const int InNId = NI.GetInNId(e);
419 const TFlt OutWeight = OutWeights[InNId];
420 int EId = Graph->GetEId(InNId, NI.GetId());
421 const TFlt Weight = Weights[Graph->GetFltKeyIdE(EId)];
423 TmpV[j] += PRankH.
GetDat(InNId) * Weight / OutWeight; }
428 double diff=0, sum=0, NewVal;
429 for (
int i = 0; i < TmpV.
Len(); i++) { sum += TmpV[i]; }
430 const double Leaked = (1.0-sum) /
double(NNodes);
431 for (
int i = 0; i < PRankH.
Len(); i++) {
432 NewVal = TmpV[i] + Leaked;
434 diff += fabs(NewVal-PRankH[i]);
437 if (diff < Eps) {
break; }
444 if (!Graph->IsFltAttrE(Attr))
return -1;
445 const int NNodes = Graph->GetNodes();
454 PRankH.
AddDat(NI.GetId(), 1.0/NNodes);
461 TFltV PRankV(MxId+1);
462 TFltV OutWeights(MxId+1);
464 TFltV Weights = Graph->GetFltAttrVecE(Attr);
466 #pragma omp parallel for schedule(dynamic,10000)
467 for (
int j = 0; j < NNodes; j++) {
470 OutWeights[Id] = Graph->GetWeightOutEdges(NI, Attr);
471 PRankV[Id] = 1/NNodes;
475 for (
int iter = 0; iter < MaxIter; iter++) {
477 #pragma omp parallel for schedule(dynamic,10000)
478 for (
int j = 0; j < NNodes; j++) {
481 for (
int e = 0; e < NI.
GetInDeg(); e++) {
484 const TFlt OutWeight = OutWeights[InNId];
486 int EId = Graph->GetEId(InNId, NI.
GetId());
487 const TFlt Weight = Weights[Graph->GetFltKeyIdE(EId)];
490 Tmp += PRankH.
GetDat(InNId) * Weight / OutWeight;
498 #pragma omp parallel for reduction(+:sum) schedule(dynamic,10000)
499 for (
int i = 0; i < TmpV.
Len(); i++) { sum += TmpV[i]; }
500 const double Leaked = (1.0-sum) /
double(NNodes);
503 #pragma omp parallel for reduction(+:diff) schedule(dynamic,10000)
504 for (
int i = 0; i < NNodes; i++) {
506 double NewVal = TmpV[i] + Leaked;
509 diff += fabs(NewVal-PRankV[Id]);
512 if (diff < Eps) {
break; }
515 #pragma omp parallel for schedule(dynamic,10000)
516 for (
int i = 0; i < NNodes; i++) {
518 PRankH[i] = PRankV[NI.
GetId()];
531 NodeList.
AddDat(NI.GetId(),NI.GetOutDeg());
536 int outdeg = Graph->GetNI(NI.GetKey()).GetOutDeg();
537 int indeg = Graph->GetNI(NI.GetKey()).GetInDeg();
539 if (outdeg>1 && indeg>0){
540 double val = (1-(1/(double)outdeg))/(
double)indeg;
541 for(
int i=0; i<(outdeg+indeg);i++){
542 int NId = Graph->GetNI(NI.GetKey()).GetNbrNId(i);
543 if (Graph->GetNI(NI.GetKey()).IsInNId(NId) ==
true){
560 NodeList.
AddDat(NI.GetId(),NI.GetOutDeg());
565 int outdeg = Graph->GetNI(NI.GetKey()).GetOutDeg();
566 int indeg = Graph->GetNI(NI.GetKey()).GetInDeg();
568 if (outdeg>1 && indeg>0){
569 double val = (1-(1/(double)outdeg))/(
double)indeg;
570 for(
int i=0; i<(outdeg+indeg);i++){
571 int NId = Graph->GetNI(NI.GetKey()).GetNbrNId(i);
572 if (Graph->GetNI(NI.GetKey()).IsInNId(NId) ==
true){
586 for (
int i=0; i<Node.
GetDeg(); i++)
603 for (
int i=0; i<Node.
GetDeg(); i++)
624 for (
int i=0; i<Node.
GetDeg(); i++)
627 for (
int j=0; j<NNodes_br; j++)
629 if (neig == NNodes[j])
638 for (
int j=0; j<NNodes_br; j++)
640 if (neig == NNodes[j])
652 for (
int i=0; i<Node.
GetDeg(); i++)
688 for (
int i = 0; i < Frontier.
Len(); i++) {
689 int NId = Frontier.
GetVal(i);
690 if (NIdDistH.
GetDat(NId) < minimum) {
691 minimum = NIdDistH.
GetDat(NId);
695 const int NId = Frontier.
GetVal(min_index);
696 Frontier.
Del(min_index);
704 NIdDistH.
Clr(
false); NIdDistH.
AddDat(SrcNId, 0);
705 frontier.
Add(SrcNId);
706 while (! frontier.
Empty()) {
708 const PNEANet::TObj::TNodeI NodeI = Graph->GetNI(NId);
709 for (
int v = 0; v < NodeI.GetOutDeg(); v++) {
710 int DstNId = NodeI.GetOutNId(v);
711 int EId = NodeI.GetOutEId(v);
713 if (! NIdDistH.
IsKey(DstNId)) {
714 NIdDistH.
AddDat(DstNId, NIdDistH.
GetDat(NId) + Attr[EId]);
715 frontier.
Add(DstNId);
717 if (NIdDistH.
GetDat(DstNId) > NIdDistH.
GetDat(NId) + Attr[EId]) {
718 NIdDistH.
GetDat(DstNId) = NIdDistH.
GetDat(NId) + Attr[EId];
735 if (NDistH.Len() > 1) {
736 double centr = sum/double(NDistH.Len()-1);
738 centr *= (Graph->GetNodes() - 1)/
double(NDistH.Len()-1);
747 if (Farness != 0.0) {
return 1.0/Farness; }
753 if (DoNodeCent) { NodeBtwH.
Clr(); }
754 if (DoEdgeCent) { EdgeBtwH.
Clr(); }
755 const int nodes = Graph->GetNodes();
762 for (PNEANet::TObj::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) {
764 NodeBtwH.
AddDat(NI.GetId(), 0); }
766 for (
int e = 0; e < NI.GetOutDeg(); e++) {
769 EdgeBtwH.
AddDat(
TIntPr(NI.GetId(), NI.GetOutNId(e)), 0);
772 if (NI.GetId() < NI.GetOutNId(e)) {
773 EdgeBtwH.
AddDat(
TIntPr(NI.GetId(), NI.GetOutNId(e)), 0);
779 for (
int e = 0; e < NI.GetInDeg(); e++) {
780 if (NI.GetId() < NI.GetInNId(e) &&
781 !Graph->IsEdge(NI.GetId(), NI.GetInNId(e))) {
787 sigma.AddDat(NI.GetId(), 0);
790 delta.
AddDat(NI.GetId(), 0);
793 for (
int k=0; k < BtwNIdV.
Len(); k++) {
794 const PNEANet::TObj::TNodeI NI = Graph->GetNI(BtwNIdV[k]);
796 for (
int i = 0; i < sigma.Len(); i++) {
797 sigma[i]=0; d[i]=-1; delta[i]=0; P[i].
Clr(
false);
801 sigma.AddDat(NI.GetId(), 1);
804 while (! Q.
Empty()) {
805 const int v = Q.
Top(); Q.
Pop();
806 const PNEANet::TObj::TNodeI NI2 = Graph->GetNI(v);
808 const double VDat = d.
GetDat(v);
810 for (
int e = 0; e < NI2.GetOutDeg(); e++) {
811 const int w = NI2.GetOutNId(e);
812 const int eid = NI2.GetOutEId(e);
816 d.
AddDat(w, VDat+Attr[eid]);
819 if (d.
GetDat(w) == VDat+Attr[eid]) {
820 sigma.AddDat(w) += sigma.GetDat(v);
826 for (
int e = 0; e < NI2.GetInDeg(); e++) {
827 const int w = NI2.GetInNId(e);
829 if (Graph->IsEdge(NI2.GetId(), w)) {
832 const int eid = NI2.GetInEId(e);
836 d.
AddDat(w, VDat+Attr[eid]);
839 if (d.
GetDat(w) == VDat+Attr[eid]) {
840 sigma.AddDat(w) += sigma.GetDat(v);
847 while (! S.
Empty()) {
848 const int w = S.
Top();
849 const double SigmaW = sigma.GetDat(w);
850 const double DeltaW = delta.
GetDat(w);
853 for (
int i = 0; i < NIdV.
Len(); i++) {
854 const int NId = NIdV[i];
855 const double c = (sigma.GetDat(NId)*1.0/SigmaW) * (1+DeltaW);
865 if (DoNodeCent && w != NI.GetId()) {
872 TIntV NIdV; Graph->GetNIdV(NIdV);
873 if (NodeFrac < 1.0) {
875 for (
int i =
int((1.0-NodeFrac)*NIdV.
Len()); i > 0; i--) {
884 TIntV NIdV; Graph->GetNIdV(NIdV);
885 if (NodeFrac < 1.0) {
887 for (
int i =
int((1.0-NodeFrac)*NIdV.
Len()); i > 0; i--) {
896 TIntV NIdV; Graph->GetNIdV(NIdV);
897 if (NodeFrac < 1.0) {
899 for (
int i =
int((1.0-NodeFrac)*NIdV.
Len()); i > 0; i--) {
910 const double& C = 0.85,
const double& Eps = 1e-4,
const int& MaxIter = 100) {
920 const int& MaxIter = 20) {
double GetGroupDegreeCentr(const PUNGraph &Graph, const PUNGraph &Group)
static const T & Mn(const T &LVal, const T &RVal)
TPair< TInt, TInt > TIntPr
Main namespace for all the Snap global entities.
double GetDegreeCentr(const PUNGraph &Graph, const int &NId)
TIntH * AllCombinationsMN(int m, int n)
int Intersect(TUNGraph::TNodeI Node, TIntH NNodes)
Intersect.
int GetWeightedPageRank(const PNEANet Graph, TIntFltH &PRankH, const TStr &Attr, const double &C, const double &Eps, const int &MaxIter)
Weighted PageRank (TODO: Use template)
void Del(const TSizeTy &ValN)
Removes the element at position ValN.
int GetWeightedShortestPath(const PNEANet Graph, const int &SrcNId, TIntFltH &NIdDistH, const TFltV &Attr)
static const T & Mx(const T &LVal, const T &RVal)
int GetWeightedPageRankMP(const PNEANet Graph, TIntFltH &PRankH, const TStr &Attr, const double &C, const double &Eps, const int &MaxIter)
int GetInNId(const int &EdgeN) const
Returns ID of EdgeN-th in-node (the node pointing to the current node).
int AddNode(int NId=-1)
Adds a node of ID NId to the graph.
TSizeTy Len() const
Returns the number of elements in the vector.
Node iterator. Only forward iteration (operator++) is supported.
int findMinimum(TIntV &Frontier, TIntFltH &NIdDistH)
Iterator over a vector of tables.
bool GetInt(const int &FldN, int &Val) const
If the field FldN is an integer its value is returned in Val and the function returns true...
void Clr(const bool &DoDel=false)
const TDat & GetDat(const TKey &Key) const
Node iterator. Only forward iteration (operator++) is supported.
TIntFltH EventImportance(const PNGraph &Graph, const int k)
Event importance.
int GetNodes() const
Returns the number of nodes in the graph.
bool Empty() const
Tests whether the vector is empty.
void MapHits(const TVec< PGraph > &GraphSeq, TVec< PTable > &TableSeq, TTableContext *Context, const int &MaxIter)
Gets sequence of Hits tables from given GraphSeq into TableSeq.
int GetDeg() const
Returns degree of the current node.
void DelKey(const TKey &Key)
int GetId() const
Returns ID of the current node.
TTableIterator GetMapPageRank(const TVec< PNEANet > &GraphSeq, TTableContext *Context, const double &C=0.85, const double &Eps=1e-4, const int &MaxIter=100)
Gets sequence of PageRank tables from given GraphSeq.
const TVal & GetVal(const TSizeTy &ValN) const
Returns a reference to the element at position ValN in the vector.
TTableIterator GetMapHitsIterator(const TVec< PNEANet > &GraphSeq, TTableContext *Context, const int &MaxIter=20)
Gets sequence of Hits tables from given GraphSeq.
void Gen(const int &ExpectVals)
void GetWeightedBetweennessCentr(const PNEANet Graph, const TIntV &BtwNIdV, TIntFltH &NodeBtwH, const bool &DoNodeCent, TIntPrFltH &EdgeBtwH, const bool &DoEdgeCent, const TFltV &Attr, const bool &IsDir)
Computes (approximate) weighted Beetweenness Centrality of all nodes and all edges of the network...
TIntH MaxCPGreedyBetter(const PUNGraph &Graph, const int k)
Returns centrality Maximum k group.
int SearchStr(const TStr &Str, const int &BChN=0) const
double GetGroupFarnessCentr(const PUNGraph &Graph, const TIntH &GroupNodes)
Whitespace (space or tab) separated.
TNodeI GetNI(const int &NId) const
Returns an iterator referring to the node of ID NId in the graph.
double GetGroupClosenessCentr(const PUNGraph &Graph, const TIntH &GroupNodes)
int GetInDeg() const
Returns in-degree of the current node.
double GetGroupDegreeCentr0(const PUNGraph &Graph, const TIntH &GroupNodes)
double GetWeightedFarnessCentr(const PNEANet Graph, const int &NId, const TFltV &Attr, const bool &Normalized, const bool &IsDir)
double GetWeightedClosenessCentr(const PNEANet Graph, const int &NId, const TFltV &Attr, const bool &Normalized, const bool &IsDir)
int AddEdge(const int &SrcNId, const int &DstNId)
Adds an edge between node IDs SrcNId and DstNId to the graph.
TIntH MaxCPGreedyBetter1(const PUNGraph &Graph, const int k)
Returns centrality Maximum k group.
directed graph (TNGraph, TNEGraph), else graph is undirected TUNGraph
int Intersect1(TUNGraph::TNodeI Node, TStr NNodes)
void MapPageRank(const TVec< PGraph > &GraphSeq, TVec< PTable > &TableSeq, TTableContext *Context, const double &C, const double &Eps, const int &MaxIter)
Gets sequence of PageRank tables from given GraphSeq into TableSeq.
TIntFltH EventImportance1(const PNGraph &Graph, const int k)
void Shuffle(TRnd &Rnd)
Randomly shuffles the elements of the vector.
Node iterator. Only forward iteration (operator++) is supported.
TIntH MaxCPGreedyBetter2(const PUNGraph &Graph, const int k)
Returns centrality Maximum k group.
TNodeI EndNI() const
Returns an iterator referring to the past-the-end node in the graph.
int GetNbrNId(const int &NodeN) const
Returns ID of NodeN-th neighboring node.
void Clr(const bool &DoDel=true, const int &NoDelLim=-1, const bool &ResetDat=true)
bool IsNode(const int &NId) const
Tests whether ID NId is a node.
bool Next()
Loads next line from the input file.
void Push(const TVal &Val)
TIntH LoadNodeList(TStr InFNmNodes)
void Clr(const bool &DoDel=true)
int GetId() const
Returns ID of the current node.
bool IsKey(const TKey &Key) const
TSizeTy Add()
Adds a new element at the end of the vector, after its current last element.
TNodeI BegNI() const
Returns an iterator referring to the first node in the graph.
bool IsStrIn(const TStr &Str) const
void DelLast()
Removes the last element of the vector.
void GetEigenVectorCentr(const PUNGraph &Graph, TIntFltH &NIdEigenH, const double &Eps, const int &MaxIter)
TDat & AddDat(const TKey &Key)
TIntH MaxCPGreedyBetter3(const PUNGraph &Graph, const int k)
Returns centrality Maximum k group.
const TKey & GetKey(const int &KeyId) const
Vector is a sequence TVal objects representing an array that can change in size.
PUNGraph * AllGraphsWithNNodes(int n)
void SortByDat(const bool &Asc=true)