Skip to content
This repository was archived by the owner on Nov 13, 2018. It is now read-only.

Commit 9b5b714

Browse files
committedJul 9, 2015
fixed bug in calculation truss
1 parent b378c83 commit 9b5b714

File tree

3 files changed

+28
-76
lines changed

3 files changed

+28
-76
lines changed
 

‎graph-mining-flink/src/main/scala/de/hpi/dbda/graph_mining/MaximalTruss.scala

+6-63
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,17 @@ object MaximalTruss {
1919
while (k != maxK && k != minK){
2020

2121
print ("############################ k is " + k +" #################################")
22-
val filteredGraph = graphs.filter(e => e.vertex1.degree >= k-2 && e.vertex2.degree >= k-2)
23-
// filteredGraph.print()
22+
// val filteredGraph = graphs.filter(e => e.vertex1.degree >= k-2 && e.vertex2.degree >= k-2)
23+
//// filteredGraph.print()
2424

25-
val trusses = Truss.calculateTruss(k, filteredGraph)
25+
val trusses = Truss.calculateTruss(k, graphs)
2626

2727
val foundTrusses:DataSet[Edge] = trusses.map{truss =>
28-
truss._2.truss = truss._1
28+
// truss._2.truss = truss._1
2929
truss._2
3030
}
3131

32-
val trussCount = foundTrusses.count
32+
val trussCount = trusses.count()
3333

3434
if ( trussCount == 0){
3535
val newK = minK + (k-minK)/2
@@ -51,65 +51,8 @@ object MaximalTruss {
5151

5252
}
5353

54+
print ("############################ final k is " + k +" #################################")
5455
graphs
5556

5657
}
57-
58-
59-
def maxTruss1(graph: DataSet[Edge], stringk:String, executionEnvironment: ExecutionEnvironment): DataSet[Edge] ={
60-
61-
var k = stringk.toInt
62-
var maxK = 0
63-
var minK = 2
64-
65-
val graphs = graph
66-
67-
val possibleKs = executionEnvironment.fromCollection(2 until 10000)
68-
69-
graphs.iterateWithTermination(1000)({ currentGraph =>
70-
71-
print ("############################ k is " + k +" #################################")
72-
val filteredGraph = currentGraph.filter(e => e.vertex1.degree >= k-2 && e.vertex2.degree >= k-2)
73-
// filteredGraph.print()
74-
75-
val trusses = Truss.calculateTruss(k, filteredGraph)
76-
77-
val foundTrusses:DataSet[Edge] = trusses.map{truss =>
78-
truss._2.truss = truss._1
79-
truss._2
80-
}
81-
82-
83-
val trussCount = foundTrusses.count()
84-
85-
if ( trussCount == 0){
86-
val newPossibleKs = possibleKs.filter(possibleK => possibleK < k)
87-
88-
val newK = minK + (k-minK)/2
89-
maxK = k
90-
k = newK
91-
(currentGraph, newPossibleKs)
92-
93-
} else {
94-
val newPossibleKs = possibleKs.filter(possibleK => possibleK > k)
95-
if (maxK == 0){
96-
val newK = 2*k
97-
minK = k
98-
k = newK
99-
} else {
100-
val newK = k + (maxK -k)/2
101-
minK = k
102-
k = newK
103-
}
104-
(foundTrusses, newPossibleKs)
105-
}
106-
})
107-
108-
109-
}
110-
111-
112-
113-
114-
11558
}

‎graph-mining-flink/src/main/scala/de/hpi/dbda/graph_mining/Truss.scala

+13-13
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import scala.concurrent.duration.durationToPair
1515
*/
1616

1717
case class Vertex(id: Int, degree:Int)
18-
case class Edge(vertex1:Vertex,vertex2:Vertex, var truss:Int = 1, var triangleCount:Int = -1)
18+
case class Edge(vertex1:Vertex,vertex2:Vertex, var triangleCount:Int = -1)
1919
case class Triangle(edge1:Edge, edge2:Edge, edge3:Edge)
2020

2121

@@ -26,23 +26,21 @@ object Truss {
2626
val splitted = line.split(seperator)
2727
val f = new Vertex(splitted(0).toInt, 1)
2828
val s = new Vertex(splitted(1).toInt, 1)
29-
createEdge(f, s, 1)
29+
createEdge(f, s)
3030
}
3131
).name("convert Graph")
3232
convertedGraph
3333
}
3434

35-
def createEdge(vert1:Vertex, vert2:Vertex, truss:Int): Edge = {
36-
if (vert1.degree < vert2.degree) new Edge(vert1, vert2, truss)
35+
def createEdge(vert1:Vertex, vert2:Vertex): Edge = {
36+
if (vert1.degree < vert2.degree) new Edge(vert1, vert2)
3737
else
3838
if (vert1.degree == vert2.degree && vert1.id < vert2.id)
39-
new Edge(vert1, vert2, truss)
40-
else new Edge(vert2, vert1, truss)
39+
new Edge(vert1, vert2)
40+
else new Edge(vert2, vert1)
4141
}
4242

4343
def addDegrees(graph:DataSet[Edge]): DataSet[Edge] ={
44-
val truss = 1
45-
4644
val degrees = graph
4745
.flatMap{e => List(e.vertex1, e.vertex2)}
4846
.groupBy(0)
@@ -52,10 +50,10 @@ object Truss {
5250
val degreedGraph = graph
5351
.map(e => (e.vertex1.id, e.vertex2.id, e))
5452
.join(degrees, JoinHint.BROADCAST_HASH_SECOND).where(0).equalTo(0) { //Repartition
55-
(e, v) => (e._2, new Edge(v._2, e._3.vertex2, truss))
53+
(e, v) => (e._2, new Edge(v._2, e._3.vertex2))
5654
}
5755
.join(degrees, JoinHint.BROADCAST_HASH_SECOND).where(0).equalTo(0) {
58-
(e, v) => createEdge(e._2.vertex1, v._2, truss)
56+
(e, v) => createEdge(e._2.vertex1, v._2)
5957
}.name("join Degrees")
6058

6159
degreedGraph
@@ -75,7 +73,7 @@ object Truss {
7573
val allEdges = graph.map(edge => (edge, edge)).name("triangleCalculation: map singlge edges")
7674

7775
//TODO Parameterization of #nodes?
78-
val joinStrategy = if (k >= 8) JoinHint.BROADCAST_HASH_SECOND else JoinHint.REPARTITION_HASH_SECOND
76+
val joinStrategy = if (k >= 8) JoinHint.BROADCAST_HASH_SECOND else JoinHint.BROADCAST_HASH_SECOND //REPARTITION_HASH_SECOND
7977

8078
val triangles = triads.join(allEdges, joinStrategy).where(0).equalTo(0) {
8179
(triadPart, edgePart) => Triangle(edgePart._2, triadPart._2, triadPart._3)
@@ -85,7 +83,7 @@ object Truss {
8583
}
8684

8785
def getOuterTriangleVertices(edge1:Edge, edge2:Edge): Edge ={
88-
createEdge(edge1.vertex2, edge2.vertex2, edge1.truss)
86+
createEdge(edge1.vertex2, edge2.vertex2)
8987
}
9088

9189

@@ -99,6 +97,7 @@ object Truss {
9997
val triangles = getTriangles(filteredGraph, k)
10098

10199
val filteredTriangles = triangles.iterateWithTermination(Int.MaxValue)({triangles =>
100+
102101
val singleEdges = triangles.flatMap(triangle => List(triangle.edge1, triangle.edge2, triangle.edge3)).map((_, 1)).name("prepare triangle count per edge")
103102

104103
val triangleCountPerEdge = singleEdges.groupBy(0).reduce{
@@ -108,10 +107,11 @@ object Truss {
108107
edgeInt._1.triangleCount = edgeInt._2
109108
edgeInt._1
110109
}.name("give edge triangle count")
111-
.filter(edge => edge.triangleCount >= k-2).name("filter edge with too small triangleCount")
112110

113111
val removableEdges = graph.filter(edge => edge.triangleCount < k-2)
114112

113+
graph = graph.filter(edge => edge.triangleCount >= k-2).name("filter edge with too small triangleCount")
114+
115115
var joinedtriangles = triangles.join(graph).where({triangle => (triangle.edge1.vertex1, triangle.edge1.vertex2)}).equalTo("vertex1", "vertex2"){
116116
(triangle, edge) =>
117117
triangle.edge1.triangleCount = edge.triangleCount

‎trussMini.txt

+9
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,12 @@
1616
8 9
1717
8 10
1818
10 9
19+
1 7
20+
1 8
21+
2 9
22+
3 6
23+
3 10
24+
4 7
25+
4 9
26+
5 8
27+
5 10

0 commit comments

Comments
 (0)
This repository has been archived.