public static PINQCollection <Pair <int> > JointDegrees(this PINQCollection <Pair <int> > graph) { var aDegrees = graph.DPCount(x => x.a, (k, i) => new Pair <int>(k, i - 1)); var bDegrees = graph.DPCount(x => x.b, (k, i) => new Pair <int>(k, i - 1)); var aDegEdge = graph.Join(aDegrees, edge => edge.a, pair => pair.a, (edge, pair) => new Pair <Pair <int>, int>(edge, pair.b)); var bDegEdge = graph.Join(bDegrees, edge => edge.b, pair => pair.a, (edge, pair) => new Pair <Pair <int>, int>(edge, pair.b)); return(aDegEdge.Join(bDegEdge, aTriple => aTriple.a, bTriple => bTriple.a, (aTriple, bTriple) => new Pair <int>(aTriple.b, bTriple.b))); }
public static PINQCollection <Triple> jddTriangles(this PINQCollection <Pair <int> > graph, Pair <int>[] buckets, double epsilon) { bool symmetry = false; if (symmetry) { var symmGraph = graph.Select(edge => new Pair <int>(edge.b, edge.a)); var undirectedGraph = graph.Concat(symmGraph); graph = undirectedGraph; //I need to double the buckets (maybe is not correct to double) for (int i = 0; i < buckets.Length; i++) { buckets[i].a = buckets[i].a * 2; buckets[i].b = buckets[i].b * 2; } } // does a DPCount, but then immediately replaces the degree with the bucket. //var aBuckets = graph.DPCount(x => x.a, (k, i) => new Pair<int>(k, buckets.Where(bucket => i < bucket.a).First().a)); //var bBuckets = graph.DPCount(x => x.b, (k, i) => new Pair<int>(k, buckets.Where(bucket => i < bucket.b).First().b)); //var aDegEdge = graph.Join(aBuckets, edge => edge.a, pair => pair.a, (edge, pair) => new Pair<Pair<int>, int>(edge, pair.b)); //var bDegEdge = graph.Join(bBuckets, edge => edge.b, pair => pair.a, (edge, pair) => new Pair<Pair<int>, int>(edge, pair.b)); var aDegrees = graph.DPCount(x => x.a, (k, i) => new Pair <int>(k, i)); var bDegrees = graph.DPCount(x => x.b, (k, i) => new Pair <int>(k, i)); var aDegEdge = graph.Join(aDegrees, edge => edge.a, pair => pair.a, (edge, pair) => new Pair <Pair <int>, int>(edge, pair.b)); var bDegEdge = graph.Join(bDegrees, edge => edge.b, pair => pair.a, (edge, pair) => new Pair <Pair <int>, int>(edge, pair.b)); var edgeDegree = aDegEdge.Join(bDegEdge, aTriple => aTriple.a, bTriple => bTriple.a, (aTriple, bTriple) => new Triple <Pair <int>, int, int>(aTriple.a, aTriple.b, bTriple.b)); //create a a path of length 3 with the degrees of each node involved var abc = edgeDegree.Join(edgeDegree, x => x.a.b, y => y.a.a, (x, y) => new Triple(x.b, x.c, y.c)); return(abc); }
public static Count <Triple> Triangles(this PINQCollection <Pair <int> > graph, double epsilon) { var degrees = graph.DPCount(edge => edge.a, (k, i) => new Pair <int>(k, i - 1)); var len2paths = graph.Join(graph, edge1 => edge1.b, edge2 => edge2.a, (edge1, edge2) => new Triple(edge1.a, edge1.b, edge2.b)); var abcDb = len2paths.Join(degrees, path => path.b, degr => degr.a, (path, degr) => new Pair <Triple, int>(path, degr.b)); var bcaDc = abcDb.Select(pair => new Pair <Triple, int>(new Triple(pair.a.b, pair.a.c, pair.a.a), pair.b)); var cabDa = abcDb.Select(pair => new Pair <Triple, int>(new Triple(pair.a.c, pair.a.a, pair.a.b), pair.b)); var results = abcDb.Join(bcaDc, abc => abc.a, bca => bca.a, (abc, bca) => new Pair <Triple, Pair <int> >(abc.a, new Pair <int>(abc.b, bca.b))) .Join(cabDa, abc => abc.a, cab => cab.a, (abc, cab) => new Triple(cab.b, abc.b.a, abc.b.b)); return(results.Count(x => x, epsilon)); }