void ReadGraph(TStr& InFile, bool& Directed, bool& Weighted, bool& Verbose, PWNet& InNet) { TFIn FIn(InFile); int64 LineCnt = 0; try { while (!FIn.Eof()) { TStr Ln; FIn.GetNextLn(Ln); TStr Line, Comment; Ln.SplitOnCh(Line,'#',Comment); TStrV Tokens; Line.SplitOnWs(Tokens); if(Tokens.Len()<2){ continue; } int64 SrcNId = Tokens[0].GetInt(); int64 DstNId = Tokens[1].GetInt(); double Weight = 1.0; if (Weighted) { Weight = Tokens[2].GetFlt(); } if (!InNet->IsNode(SrcNId)){ InNet->AddNode(SrcNId); } if (!InNet->IsNode(DstNId)){ InNet->AddNode(DstNId); } InNet->AddEdge(SrcNId,DstNId,Weight); if (!Directed){ InNet->AddEdge(DstNId,SrcNId,Weight); } LineCnt++; } if (Verbose) { printf("Read %lld lines from %s\n", (long long)LineCnt, InFile.CStr()); } } catch (PExcept Except) { if (Verbose) { printf("Read %lld lines from %s, then %s\n", (long long)LineCnt, InFile.CStr(), Except->GetStr().CStr()); } } }
void node2vec(PNGraph& InNet, double& ParamP, double& ParamQ, int& Dimensions, int& WalkLen, int& NumWalks, int& WinSize, int& Iter, bool& Verbose, bool& OutputWalks, TVVec<TInt, int64>& WalksVV, TIntFltVH& EmbeddingsHV) { PWNet NewNet = PWNet::New(); for (TNGraph::TEdgeI EI = InNet->BegEI(); EI < InNet->EndEI(); EI++) { if (!NewNet->IsNode(EI.GetSrcNId())) { NewNet->AddNode(EI.GetSrcNId()); } if (!NewNet->IsNode(EI.GetDstNId())) { NewNet->AddNode(EI.GetDstNId()); } NewNet->AddEdge(EI.GetSrcNId(), EI.GetDstNId(), 1.0); } node2vec(NewNet, ParamP, ParamQ, Dimensions, WalkLen, NumWalks, WinSize, Iter, Verbose, OutputWalks, WalksVV, EmbeddingsHV); }
void node2vec(PNEANet& InNet, double& ParamP, double& ParamQ, int& Dimensions, int& WalkLen, int& NumWalks, int& WinSize, int& Iter, bool& Verbose, TIntFltVH& EmbeddingsHV) { PWNet NewNet = PWNet::New(); for (TNEANet::TEdgeI EI = InNet->BegEI(); EI < InNet->EndEI(); EI++) { if (!NewNet->IsNode(EI.GetSrcNId())) { NewNet->AddNode(EI.GetSrcNId()); } if (!NewNet->IsNode(EI.GetDstNId())) { NewNet->AddNode(EI.GetDstNId()); } NewNet->AddEdge(EI.GetSrcNId(), EI.GetDstNId(), InNet->GetFltAttrDatE(EI,"weight")); } node2vec(NewNet, ParamP, ParamQ, Dimensions, WalkLen, NumWalks, WinSize, Iter, Verbose, EmbeddingsHV); }
void node2vec(PWNet& InNet, double& ParamP, double& ParamQ, int& Dimensions, int& WalkLen, int& NumWalks, int& WinSize, int& Iter, bool& Verbose, bool& OutputWalks, TVVec<TInt, int64>& WalksVV, TIntFltVH& EmbeddingsHV) { //Preprocess transition probabilities PreprocessTransitionProbs(InNet, ParamP, ParamQ, Verbose); TIntV NIdsV; for (TWNet::TNodeI NI = InNet->BegNI(); NI < InNet->EndNI(); NI++) { NIdsV.Add(NI.GetId()); } //Generate random walks int64 AllWalks = (int64)NumWalks * NIdsV.Len(); WalksVV = TVVec<TInt, int64>(AllWalks,WalkLen); TRnd Rnd(time(NULL)); int64 WalksDone = 0; for (int64 i = 0; i < NumWalks; i++) { NIdsV.Shuffle(Rnd); #pragma omp parallel for schedule(dynamic) for (int64 j = 0; j < NIdsV.Len(); j++) { if ( Verbose && WalksDone%10000 == 0 ) { printf("\rWalking Progress: %.2lf%%",(double)WalksDone*100/(double)AllWalks);fflush(stdout); } TIntV WalkV; SimulateWalk(InNet, NIdsV[j], WalkLen, Rnd, WalkV); for (int64 k = 0; k < WalkV.Len(); k++) { WalksVV.PutXY(i*NIdsV.Len()+j, k, WalkV[k]); } WalksDone++; } } if (Verbose) { printf("\n"); fflush(stdout); } //Learning embeddings if (!OutputWalks) { LearnEmbeddings(WalksVV, Dimensions, WinSize, Iter, Verbose, EmbeddingsHV); } }