void LearnEmbeddings(TVVec<TInt, int64>& WalksVV, int& Dimensions, int& WinSize, int& Iter, bool& Verbose, TIntFltVH& EmbeddingsHV) { TIntIntH RnmH; TIntIntH RnmBackH; int64 NNodes = 0; //renaming nodes into consecutive numbers for (int i = 0; i < WalksVV.GetXDim(); i++) { for (int64 j = 0; j < WalksVV.GetYDim(); j++) { if ( RnmH.IsKey(WalksVV(i, j)) ) { WalksVV(i, j) = RnmH.GetDat(WalksVV(i, j)); } else { RnmH.AddDat(WalksVV(i,j),NNodes); RnmBackH.AddDat(NNodes,WalksVV(i, j)); WalksVV(i, j) = NNodes++; } } } TIntV Vocab(NNodes); LearnVocab(WalksVV, Vocab); TIntV KTable(NNodes); TFltV UTable(NNodes); TVVec<TFlt, int64> SynNeg; TVVec<TFlt, int64> SynPos; TRnd Rnd(time(NULL)); InitPosEmb(Vocab, Dimensions, Rnd, SynPos); InitNegEmb(Vocab, Dimensions, SynNeg); InitUnigramTable(Vocab, KTable, UTable); TFltV ExpTable(TableSize); double Alpha = StartAlpha; //learning rate #pragma omp parallel for schedule(dynamic) for (int i = 0; i < TableSize; i++ ) { double Value = -MaxExp + static_cast<double>(i) / static_cast<double>(ExpTablePrecision); ExpTable[i] = TMath::Power(TMath::E, Value); } int64 WordCntAll = 0; // op RS 2016/09/26, collapse does not compile on Mac OS X //#pragma omp parallel for schedule(dynamic) collapse(2) for (int j = 0; j < Iter; j++) { #pragma omp parallel for schedule(dynamic) for (int64 i = 0; i < WalksVV.GetXDim(); i++) { TrainModel(WalksVV, Dimensions, WinSize, Iter, Verbose, KTable, UTable, WordCntAll, ExpTable, Alpha, i, Rnd, SynNeg, SynPos); } } if (Verbose) { printf("\n"); fflush(stdout); } for (int64 i = 0; i < SynPos.GetXDim(); i++) { TFltV CurrV(SynPos.GetYDim()); for (int j = 0; j < SynPos.GetYDim(); j++) { CurrV[j] = SynPos(i, j); } EmbeddingsHV.AddDat(RnmBackH.GetDat(i), CurrV); } }
double BorgattiEverettMeasure(PUNGraph& Graph, TIntIntH& out, double coresize, int type) { double sum = 0.0; for (TUNGraph::TEdgeI EI = Graph->BegEI(); EI < Graph->EndEI(); EI++) { // Calculate and store the degrees of each node. int i = EI.GetSrcNId(); int j = EI.GetDstNId(); if (type == 1) { if (out.GetDat(i) == 1 || out.GetDat(j) == 1) sum += 1; } else { if (out.GetDat(i) == 1 && out.GetDat(j) == 1) sum += 1; } } return sum/(((coresize*coresize)-coresize)/2); }
double PearsonCorrelation(PUNGraph& Graph, TIntIntH& out, int coresize) { int br_core1=0,br_periphery1=0,br_core_per1=0; for (TUNGraph::TEdgeI EI = Graph->BegEI(); EI < Graph->EndEI(); EI++) { // Calculate and store the degrees of each node. int i = EI.GetSrcNId(); int j = EI.GetDstNId(); if (out.GetDat(i)==1&&out.GetDat(j)==1 && i!=j) br_core1++; else if (out.GetDat(i)==0&&out.GetDat(j)==0 && i!=j) br_periphery1++; else br_core_per1++; } double core_quality = (double)br_core1/((((double)coresize*(double)coresize)-(double)coresize)/2); int per_size = Graph->GetNodes()-coresize; double periphery_quality = (((((double)per_size*(double)per_size)-(double)per_size)/2) - (double)br_periphery1)/((((double)per_size*(double)per_size)-(double)per_size)/2); return (double)(core_quality+periphery_quality); }
void TGreedyAlg::generateCascades(const int& noCasacdes, const double& pInit, const double& p, const double& q) { int noNodes = groundTruthGraph->GetNodes(); // printf("Generating cascade for graph with noNodes = %d:\n\n", noNodes); if (noNodes == 0) { return; } // set random seed TInt::Rnd.Randomize(); for (int casacdeI = 0; casacdeI < noCasacdes; casacdeI++) { TCascade cascade; double globalTime = 0; int noActiveNodes = 0; int noSusceptibleNodes = 0; int noInactiveNodes = 0; TIntIntH nodeStates; // flip biased coin for each node to collect seeds for (TKColourNet::TNodeI NI = groundTruthGraph->BegNI(); NI < groundTruthGraph->EndNI(); NI++) { const int nodeId = NI.GetId(); double flipResult = TInt::Rnd.GetUniDev(); // printf("nodeId = %d, flipResult = %f\n", nodeId, (float) flipResult); if (flipResult <= pInit) { nodeStates.AddDat(nodeId) = activeState; // printf("##### ADD TO CASCADE: nodeId = %d, globalTime = %f #####\n", nodeId, globalTime); cascade.Add(nodeId, globalTime); noActiveNodes++; } else { nodeStates.AddDat(nodeId) = susceptibleState; noSusceptibleNodes++; } } globalTime++; while (noActiveNodes > 0) { // printf("\n***** noActiveNodes = %d, noSusceptibleNodes = %d, noInactiveNodes = %d, globalTime = %f *****\n\n", noActiveNodes, noSusceptibleNodes, noInactiveNodes, (float) globalTime); const TIntIntH beginningNodeStates = nodeStates; // for each node in the graph for (TKColourNet::TNodeI NI = groundTruthGraph->BegNI(); NI < groundTruthGraph->EndNI(); NI++) { const int nodeId = NI.GetId(); const int nodeColourId = NI.GetDat().getColourId(); const int nodeState = beginningNodeStates.GetDat(nodeId); // printf("nodeId = %d, nodeColourId = %d, nodeState = %d\n", nodeId, nodeColourId, nodeState); // if node is active, infect susceptible child nodes with probability pij if (nodeState == activeState) { const TKColourNet::TNodeI LNI = groundTruthGraph->GetNI(nodeId); for (int e = 0; e < LNI.GetOutDeg(); e++) { const int childNodeId = LNI.GetOutNId(e); const int childNodeColourId = LNI.GetOutNDat(e).getColourId(); const int childNodeState = nodeStates.GetDat(childNodeId); // printf("childNodeId = %d, childNodeColourId = %d, childNodeState = %d\n", childNodeId, childNodeColourId, childNodeState); if (childNodeState == susceptibleState) { double probablityInfection = (nodeColourId == childNodeColourId) ? p : q; double flipResult = TInt::Rnd.GetUniDev(); // printf("childNodeId = %d, probabilityInfection = %f, flipResult = %f\n", childNodeId, (float) probablityInfection, (float) flipResult); // infection occurred: childNode goes from susceptible -> active if (flipResult <= probablityInfection) { nodeStates[childNodeId] = activeState; // printf("##### ADD TO CASCADE: nodeId = %d, globalTime = %f #####\n", childNodeId, globalTime); cascade.Add(childNodeId, globalTime); noActiveNodes++; noSusceptibleNodes--; } } } // main node goes from active -> inactive nodeStates[nodeId] = inactiveState; noActiveNodes--; noInactiveNodes++; } } globalTime++; } addCascade(cascade); } }
// Table manipulations TEST(TIntIntH, ManipulateTable) { const int64 NElems = 1000000; int DDist = 10; const char *FName = "test.hashint.dat"; TIntIntH TableInt; TIntIntH TableInt1; TIntIntH TableInt2; int i; int d; int n; int Id; int Key; int64 KeySumVal; int64 DatSumVal; int64 KeySum; int64 DatSum; int64 KeySumDel; int64 DatSumDel; int DelCount; int Count; // add table elements d = Prime(NElems); n = d; KeySumVal = 0; DatSumVal = 0; for (i = 0; i < NElems; i++) { TableInt.AddDat(n,n+1); KeySumVal += n; DatSumVal += (n+1); //printf("add %d %d\n", n, n+1); n = (n + d) % NElems; } EXPECT_EQ(0,TableInt.Empty()); EXPECT_EQ(NElems,TableInt.Len()); EXPECT_EQ(0,(NElems-1)*(NElems)/2 - KeySumVal); EXPECT_EQ(0,(NElems)*(NElems+1)/2 - DatSumVal); // verify elements by successive keys KeySum = 0; DatSum = 0; for (i = 0; i < NElems; i++) { Id = TableInt.GetKeyId(i); EXPECT_EQ(1,Id >= 0); Key = TableInt.GetKey(Id); EXPECT_EQ(0,TableInt.GetDat(Key)-Key-1); KeySum += Key; DatSum += TableInt.GetDat(Key); } EXPECT_EQ(0,KeySumVal - KeySum); EXPECT_EQ(0,DatSumVal - DatSum); // verify elements by distant keys KeySum = 0; DatSum = 0; n = Prime(d); for (i = 0; i < NElems; i++) { Id = TableInt.GetKeyId(n); EXPECT_EQ(1,Id >= 0); Key = TableInt.GetKey(Id); EXPECT_EQ(0,TableInt.GetDat(Key)-Key-1); KeySum += Key; DatSum += TableInt.GetDat(Key); n = (n + d) % NElems; } EXPECT_EQ(0,KeySumVal - KeySum); EXPECT_EQ(0,DatSumVal - DatSum); // verify elements by iterator KeySum = 0; DatSum = 0; for (TIntIntH::TIter It = TableInt.BegI(); It < TableInt.EndI(); It++) { EXPECT_EQ(0,It.GetDat()-It.GetKey()-1); KeySum += It.GetKey(); DatSum += It.GetDat(); } EXPECT_EQ(0,KeySumVal - KeySum); EXPECT_EQ(0,DatSumVal - DatSum); // verify elements by key index KeySum = 0; DatSum = 0; Id = TableInt.FFirstKeyId(); while (TableInt.FNextKeyId(Id)) { EXPECT_EQ(1,Id >= 0); Key = TableInt.GetKey(Id); EXPECT_EQ(0,TableInt.GetDat(Key)-Key-1); KeySum += Key; DatSum += TableInt.GetDat(Key); } EXPECT_EQ(0,KeySumVal - KeySum); EXPECT_EQ(0,DatSumVal - DatSum); // delete elements DelCount = 0; KeySumDel = 0; DatSumDel = 0; for (n = 0; n < NElems; n += DDist) { Id = TableInt.GetKeyId(n); //printf("del %d %d %d\n", n, Id, (int) TableInt[Id]); KeySumDel += n; DatSumDel += TableInt[Id]; TableInt.DelKeyId(Id); DelCount++; } EXPECT_EQ(0,TableInt.Empty()); EXPECT_EQ(NElems-DelCount,TableInt.Len()); // verify elements by iterator KeySum = 0; DatSum = 0; Count = 0; for (TIntIntH::TIter It = TableInt.BegI(); It < TableInt.EndI(); It++) { EXPECT_EQ(0,It.GetDat()-It.GetKey()-1); //printf("get %d %d\n", (int) It.GetKey(), (int) It.GetDat()); KeySum += It.GetKey(); DatSum += It.GetDat(); Count++; } EXPECT_EQ(NElems-DelCount,Count); EXPECT_EQ(0,KeySumVal - KeySumDel - KeySum); EXPECT_EQ(0,DatSumVal - DatSumDel - DatSum); // assignment TableInt1 = TableInt; EXPECT_EQ(0,TableInt1.Empty()); EXPECT_EQ(NElems-DelCount,TableInt1.Len()); // verify elements by iterator KeySum = 0; DatSum = 0; Count = 0; for (TIntIntH::TIter It = TableInt1.BegI(); It < TableInt1.EndI(); It++) { EXPECT_EQ(0,It.GetDat()-It.GetKey()-1); //printf("get %d %d\n", (int) It.GetKey(), (int) It.GetDat()); KeySum += It.GetKey(); DatSum += It.GetDat(); Count++; } EXPECT_EQ(NElems-DelCount,Count); EXPECT_EQ(0,KeySumVal - KeySumDel - KeySum); EXPECT_EQ(0,DatSumVal - DatSumDel - DatSum); // saving and loading { TFOut FOut(FName); TableInt.Save(FOut); FOut.Flush(); } { TFIn FIn(FName); TableInt2.Load(FIn); } EXPECT_EQ(NElems-DelCount,TableInt2.Len()); // verify elements by iterator KeySum = 0; DatSum = 0; Count = 0; for (TIntIntH::TIter It = TableInt2.BegI(); It < TableInt2.EndI(); It++) { EXPECT_EQ(0,It.GetDat()-It.GetKey()-1); //printf("get %d %d\n", (int) It.GetKey(), (int) It.GetDat()); KeySum += It.GetKey(); DatSum += It.GetDat(); Count++; } EXPECT_EQ(NElems-DelCount,Count); EXPECT_EQ(0,KeySumVal - KeySumDel - KeySum); EXPECT_EQ(0,DatSumVal - DatSumDel - DatSum); // remove all elements for (i = 0; i < Count; i++) { Id = TableInt.GetRndKeyId(TInt::Rnd, 0.5); TableInt.DelKeyId(Id); } EXPECT_EQ(0,TableInt.Len()); EXPECT_EQ(1,TableInt.Empty()); // verify elements by iterator KeySum = 0; DatSum = 0; Count = 0; for (TIntIntH::TIter It = TableInt.BegI(); It < TableInt.EndI(); It++) { EXPECT_EQ(0,It.GetDat()-It.GetKey()-1); //printf("get %d %d\n", (int) It.GetKey(), (int) It.GetDat()); KeySum += It.GetKey(); DatSum += It.GetDat(); Count++; } EXPECT_EQ(0,Count); EXPECT_EQ(0,KeySum); EXPECT_EQ(0,DatSum); // clear the table TableInt1.Clr(); EXPECT_EQ(0,TableInt1.Len()); EXPECT_EQ(1,TableInt1.Empty()); // verify elements by iterator KeySum = 0; DatSum = 0; Count = 0; for (TIntIntH::TIter It = TableInt1.BegI(); It < TableInt1.EndI(); It++) { EXPECT_EQ(0,It.GetDat()-It.GetKey()-1); //printf("get %d %d\n", (int) It.GetKey(), (int) It.GetDat()); KeySum += It.GetKey(); DatSum += It.GetDat(); Count++; } EXPECT_EQ(0,Count); EXPECT_EQ(0,KeySum); EXPECT_EQ(0,DatSum); }