/////////////////////////////////////////////////////////////////////////////// // Triad counting methods void TempMotifCounter::Count3TEdgeTriadsNaive(double delta, Counter3D& counts) { TIntV Us, Vs, Ws; GetAllStaticTriangles(Us, Vs, Ws); counts = Counter3D(2, 2, 2); #pragma omp parallel for schedule(dynamic) for (int i = 0; i < Us.Len(); i++) { int u = Us[i]; int v = Vs[i]; int w = Ws[i]; // Gather all edges in triangle (u, v, w) int uv = 0, vu = 1, uw = 2, wu = 3, vw = 4, wv = 5; TVec<TIntPair> combined; AddStarEdges(combined, u, v, uv); AddStarEdges(combined, v, u, vu); AddStarEdges(combined, u, w, uw); AddStarEdges(combined, w, u, wu); AddStarEdges(combined, v, w, vw); AddStarEdges(combined, w, v, wv); // Get the counts for this triangle combined.Sort(); ThreeTEdgeMotifCounter counter(6); TIntV edge_id(combined.Len()); TIntV timestamps(combined.Len()); for (int k = 0; k < combined.Len(); k++) { edge_id[k] = combined[k].Dat; timestamps[k] = combined[k].Key; } Counter3D local; counter.Count(edge_id, timestamps, delta, local); // Update the global counter with the various symmetries #pragma omp critical { // i --> j, k --> j, i --> k counts(0, 0, 0) += local(uv, wv, uw) + local(vu, wu, vw) + local(uw, vw, uv) + local(wu, vu, wv) + local(vw, uw, vu) + local(wv, uv, wu); // i --> j, k --> j, k --> i counts(0, 0, 1) += local(uv, wv, wu) + local(vu, wu, wv) + local(uw, vw, vu) + local(wu, vu, vw) + local(vw, uw, uv) + local(wv, uv, uw); // i --> j, j --> k, i --> k counts(0, 1, 0) += local(uv, vw, uw) + local(vu, uw, vw) + local(uw, wv, uv) + local(wu, uv, wv) + local(vw, wu, vu) + local(wv, vu, wu); // i --> j, j --> k, k --> i counts(0, 1, 1) += local(uv, vw, wu) + local(vu, uw, wv) + local(uw, wv, vu) + local(wu, uv, vw) + local(vw, wu, uv) + local(wv, vu, uw); // i --> j, k --> i, j --> k counts(1, 0, 0) += local(uv, wu, vw) + local(vu, wv, uw) + local(uw, vu, wv) + local(wu, vw, uv) + local(vw, uv, wu) + local(wv, uw, vu); // i --> j, k --> i, k --> j counts(1, 0, 1) += local(uv, wu, wv) + local(vu, wv, wu) + local(uw, vu, vw) + local(wu, vw, vu) + local(vw, uv, uw) + local(wv, uw, uv); // i --> j, i --> k, j --> k counts(1, 1, 0) += local(uv, uw, vw) + local(vu, vw, uw) + local(uw, uv, wv) + local(wu, wv, uv) + local(vw, vu, wu) + local(wv, wu, vu); // i --> j, i --> k, k --> j counts(1, 1, 1) += local(uv, uw, wv) + local(vu, vw, wu) + local(uw, uv, vw) + local(wu, wv, vu) + local(vw, vu, uw) + local(wv, wu, uv); } } }
void TempMotifCounter::Count3TEdge3NodeStarsNaive( double delta, Counter3D& pre_counts, Counter3D& pos_counts, Counter3D& mid_counts) { TIntV centers; GetAllNodes(centers); pre_counts = Counter3D(2, 2, 2); pos_counts = Counter3D(2, 2, 2); mid_counts = Counter3D(2, 2, 2); // Get counts for each node as the center #pragma omp parallel for schedule(dynamic) for (int c = 0; c < centers.Len(); c++) { // Gather all adjacent events int center = centers[c]; TIntV nbrs; GetAllNeighbors(center, nbrs); for (int i = 0; i < nbrs.Len(); i++) { for (int j = i + 1; j < nbrs.Len(); j++) { int nbr1 = nbrs[i]; int nbr2 = nbrs[j]; TVec<TIntPair> combined; AddStarEdges(combined, center, nbr1, 0); AddStarEdges(combined, nbr1, center, 1); AddStarEdges(combined, center, nbr2, 2); AddStarEdges(combined, nbr2, center, 3); combined.Sort(); ThreeTEdgeMotifCounter counter(4); TIntV edge_id(combined.Len()); TIntV timestamps(combined.Len()); for (int k = 0; k < combined.Len(); k++) { edge_id[k] = combined[k].Dat; timestamps[k] = combined[k].Key; } Counter3D local; counter.Count(edge_id, timestamps, delta, local); #pragma omp critical { // Update with local counts for (int dir1 = 0; dir1 < 2; ++dir1) { for (int dir2 = 0; dir2 < 2; ++dir2) { for (int dir3 = 0; dir3 < 2; ++dir3) { pre_counts(dir1, dir2, dir3) += local(dir1, dir2, dir3 + 2) + local(dir1 + 2, dir2 + 2, dir3); pos_counts(dir1, dir2, dir3) += local(dir1, dir2 + 2, dir3 + 2) + local(dir1 + 2, dir2, dir3); mid_counts(dir1, dir2, dir3) += local(dir1, dir2 + 2, dir3) + local(dir1 + 2, dir2, dir3 + 2); } } } } } } } }
edge_id Network::addEdge(vertex_id vid1, vertex_id vid2) { if (!containsVertex(vid1)) throw ElementNotFoundException("Vertex " + std::to_string(vid1)); if (!containsVertex(vid2)) throw ElementNotFoundException("Vertex " + std::to_string(vid2)); if (out_edges[vid1].count(vid2)>0) throw DuplicateElementException("Edge (" + std::to_string(vid1) + "," + std::to_string(vid2) + ") already exists"); //max_edge_id++; out_edges[vid1].insert(vid2); in_edges[vid2].insert(vid1); if (!isDirected() && vid1!=vid2) { out_edges[vid2].insert(vid1); in_edges[vid1].insert(vid2); } if (isWeighted()) setNumericEdgeAttribute(vid1,vid2,"weight",MULTIPLENETWORK_DEFAULT_WEIGHT); // this value will be replaced if this method has been called inside addEdge(vertex_id, vertex_id, double) num_edges++; return edge_id(vid1, vid2, isDirected()); }
void device::body() { if (_M_poller.poll(-1)) { edges::iterator edges_it; std::string pollitem_name = _M_poller.get_triggered(); // Loop over all edges for (edges_it = _M_edges.begin(); edges_it != _M_edges.end(); ++edges_it) { // Get the first part of a pollitem_name; edge ID std::string edge_id(pollitem_name.c_str(), edges_it->first.size()); // Move early to the next edge if this one doesn't match if (edge_id != edges_it->first) continue; edgepoint::iterator point_it; // Loop over all edge points for (point_it = edges_it->second.begin(); point_it != edges_it->second.end(); ++point_it) { // Move to the next edge point if this one doesn't match if (pollitem_name != (edges_it->first + point_it->first)) continue; // Pass edge's ID and point's ID to on_recv() on_recv(edges_it->first, point_it->first); return; } } } }
edge_id Network::addEdge(vertex_id vid1, vertex_id vid2, double weight) { if (!isWeighted()) throw OperationNotSupportedException("Cannot add a weight: network is unweighed"); addEdge(vid1,vid2); setNumericEdgeAttribute(vid1, vid2, "weight", weight); return edge_id(vid1, vid2, isDirected()); }