// actors collaboration graph PUNGraph TImdbNet::GetActorGraph() const { TIntPrSet EdgeSet; for (TNodeI NI = BegNI(); NI < EndNI(); NI++) { if (NI().GetTy() == mtyActor) { const int NId1 = NI.GetId(); for (int e = 0; e < NI.GetOutDeg(); e++) { if (NI.GetOutNDat(e).GetTy() != mtyActor) { TNodeI NI2 = GetNI(NI.GetOutNId(e)); for (int e2 = 0; e2 < NI2.GetInDeg(); e2++) { if (NI2.GetInNDat(e2).GetTy() == mtyActor) { const int NId2 = NI2.GetInNId(e2); EdgeSet.AddKey(TIntPr(TMath::Mn(NId1, NId2), TMath::Mx(NId1, NId2))); } } } } } } PUNGraph G = TUNGraph::New(); for (int i = 0; i < EdgeSet.Len(); i++) { const int NId1 = EdgeSet[i].Val1; const int NId2 = EdgeSet[i].Val2; if (! G->IsNode(NId1)) { G->AddNode(NId1); } if (! G->IsNode(NId2)) { G->AddNode(NId2); } G->AddEdge(NId1, NId2); } return G; }
// Return an iterator referring to edge (SrcNId, DstNId) in the graph. TUNGraph::TEdgeI TUNGraph::GetEI(const int& SrcNId, const int& DstNId) const { const int MnNId = TMath::Mn(SrcNId, DstNId); const int MxNId = TMath::Mx(SrcNId, DstNId); const TNodeI SrcNI = GetNI(MnNId); const int NodeN = SrcNI.NodeHI.GetDat().NIdV.SearchBin(MxNId); IAssert(NodeN != -1); return TEdgeI(SrcNI, EndNI(), NodeN); }
TBPGraph::TEdgeI TBPGraph::GetEI(const int& LeftNId, const int& RightNId) const { const bool IsLL = IsLNode(LeftNId), IsLR = IsRNode(LeftNId); const bool IsRL = IsLNode(RightNId), IsRR = IsRNode(RightNId); IAssertR((IsLL||IsLR)&&(IsRL||IsRR), TStr::Fmt("%d or %d is not a node.", LeftNId, RightNId).CStr()); IAssertR(LeftNId!=RightNId, "No self-edges are allowed."); IAssertR((IsLL&&!IsLR&&!IsRL&&IsRR)||(!IsLL&&IsLR&&IsRL&&!IsRR), "One node should be on the 'left' and the other on the 'right'."); const int LNId = IsLL ? LeftNId : RightNId; // the real left node const int RNId = IsLL ? RightNId : LeftNId; // the real right node const TNodeI SrcNI = GetNI(LNId); const int NodeN = SrcNI.LeftHI.GetDat().NIdV.SearchBin(RNId); IAssertR(NodeN != -1, "Right edge endpoint does not exists!"); return TEdgeI(SrcNI, EndNI(), NodeN); }
int TMultimodalGraphImplB::BFSTraversalOneHop(const TVec< TPair<TInt,TInt> >& StartingVertices) const { int NumVerticesAndEdges = 0; for (int i = 0; i < StartingVertices.Len(); i++) { TNodeI NI = GetNI(StartingVertices.GetVal(i)); TIntV AdjacentModes = TIntV(); NI.GetAdjacentModes(AdjacentModes); for (int ModeIdx = 0; ModeIdx < AdjacentModes.Len(); ModeIdx++) { int ModeId = AdjacentModes.GetVal(ModeIdx); for (int e = 0; e < NI.GetOutDeg(ModeId); e++) { NumVerticesAndEdges += NI.GetOutNId(e, ModeId); } } } return NumVerticesAndEdges; }
void TMultimodalGraphImplB::RandomWalk(TVec< TPair<TInt,TInt> > NodeIds, int WalkLength) { int CurrentLocalNodeId = NodeToModeMapping.GetKey(NodeToModeMapping.GetRndKeyId(TInt::Rnd)); TPair<TInt,TInt> CurrentNodeId = TPair<TInt,TInt>(NodeToModeMapping.GetDat(CurrentLocalNodeId), CurrentLocalNodeId); int NodeIdIdx = 0; NodeIds.SetVal(NodeIdIdx++, CurrentNodeId); while (NodeIds.Len() < WalkLength) { TNodeI NI = GetNI(CurrentNodeId); TIntV AdjacentModes = TIntV(); NI.GetAdjacentModes(AdjacentModes); // Throw an appropriately biased coin here int EdgeId = TInt::Rnd.GetUniDevInt(NI.GetOutDeg()); int i; for (i = 0; i < AdjacentModes.Len(); i++) { int ModeOutDeg = NI.GetOutDeg(AdjacentModes.GetDat(i)); if (EdgeId < ModeOutDeg) { break; } EdgeId -= ModeOutDeg; } NodeIds.SetVal(NodeIdIdx++, TPair<TInt,TInt>(AdjacentModes.GetDat(i), NI.GetOutNId(EdgeId, AdjacentModes.GetDat(i)))); } }
TNGraph::TEdgeI TNGraph::GetEI(const int& SrcNId, const int& DstNId) const { const TNodeI SrcNI = GetNI(SrcNId); const int NodeN = SrcNI.NodeHI.GetDat().OutNIdV.SearchBin(DstNId); IAssert(NodeN != -1); return TEdgeI(SrcNI, EndNI(), NodeN); }
size_t EclipseGeometry::GetIndex(size_t i, size_t j, size_t k) const { assert(i < GetNI() && j < GetNI() && k < GetNK()); return i + j*GetNI() + k*GetNI()*GetNJ(); }
double GetDX() const { return GetLX() / GetNI(); }
double GetZMax()const { return Volume::GetZMax(GetNI(), GetNJ()); }