From 16e4f89c44c3be927f669c8800ba4aaa5cd3012e Mon Sep 17 00:00:00 2001
From: Apurba Das <adas@iastate.edu>
Date: Sat, 9 Jun 2018 13:45:31 -0500
Subject: [PATCH] source code update

---
 .../Algorithm/parMCE/ParMCEDegeneracy.java    |  92 +++--------
 .../java/Algorithm/parMCE/ParMCEDegree.java   | 153 ++++++------------
 .../Algorithm/parMCE/ParMCETriangles.java     |  90 +++--------
 3 files changed, 90 insertions(+), 245 deletions(-)

diff --git a/src/main/java/Algorithm/parMCE/ParMCEDegeneracy.java b/src/main/java/Algorithm/parMCE/ParMCEDegeneracy.java
index b38bc09..ce44dce 100644
--- a/src/main/java/Algorithm/parMCE/ParMCEDegeneracy.java
+++ b/src/main/java/Algorithm/parMCE/ParMCEDegeneracy.java
@@ -88,39 +88,42 @@ public class ParMCEDegeneracy {
 
 		Collection<Integer> NghOfu = Ngh(G, u);
 
-		Map<Integer, Integer> Ext = new HashMap<>();
+		//List<Integer> Ext = new ArrayList<>();
 		
-		
-		int[] ExtForFini = new int[CAND.size()];
+		int[] Ext = new int[CAND.size()];
+
 
-		int index = 0;
-		for (int w : CAND) {
+		int index=0;
+		for(int w : CAND){
 			if (!NghOfu.contains(w)) {
-				Ext.put(w, index);
-				ExtForFini[index] = w;
-				index++;
+				Ext[index++] = w;
 			}
 		}
 
-		int size = Ext.size();
+		int size = index;
 
+		
 		if (size > 0) {
-			Ext.keySet().parallelStream().forEach(q -> {
+			IntStream.range(0, size).parallel().forEach(i -> {
 
-				// long start = System.currentTimeMillis();
-				int idx = Ext.get(q);
+				int q = Ext[i];
 				TreeSet<Integer> Kq = new TreeSet<>();
 				Kq.addAll(K);
 				Kq.add(q);
 
 				Collection<Integer> NghOfq = Ngh(G, q);
 
-				Collection<Integer> CANDq = computeNewCand(CAND, NghOfq, Ext, idx);
-				Collection<Integer> FINIq = computeNewFini(FINI, NghOfq, Ext, ExtForFini, idx);
+				HashSet<Integer> CANDq = SetOperations.intersect(CAND, NghOfq);
+				
 
-				// loopoverhead += (System.currentTimeMillis() - start);
+				HashSet<Integer> FINIq = SetOperations.intersect(FINI, NghOfq);
 
-				// loopoverhead.addAndGet(delta);
+				for (int j = 0; j < i; j++) {
+					int p = Ext[j];
+					CANDq.remove(p);
+					if (NghOfq.contains(p))
+						FINIq.add(p);
+				}
 
 				try {
 					expand(Kq, CANDq, FINIq);
@@ -133,60 +136,6 @@ public class ParMCEDegeneracy {
 		}
 	}
 
-
-	private Collection<Integer> computeNewFini(Collection<Integer> fini, Collection<Integer> nghOfq,
-			Map<Integer, Integer> ext, int[] extforfini, int idx) {
-
-		Collection<Integer> R = new HashSet<>();
-		if (nghOfq.size() < fini.size()) {
-			for (int w : nghOfq) {
-				if (fini.contains(w)) {
-					R.add(w);
-				}
-				if (ext.containsKey(w) && (ext.get(w) < idx))
-					R.add(w);
-			}
-		} 
-		else {
-			for (int w : fini) {
-				if (nghOfq.contains(w))
-					R.add(w);
-			}
-			for(int i=0; i< idx; i++){
-				int x = extforfini[i];
-				if(nghOfq.contains(x))
-					R.add(x);
-			}
-		}
-		return R;
-	}
-
-	private Collection<Integer> computeNewCand(Collection<Integer> cand, Collection<Integer> nghOfq,
-			Map<Integer, Integer> ext, int idx) {
-
-		Collection<Integer> R = new HashSet<>();
-		if (cand.size() > nghOfq.size()) {
-			for (int w : nghOfq) {
-				if (cand.contains(w)) {
-					if (ext.containsKey(w) && (ext.get(w) > idx))
-						R.add(w);
-					if (!ext.containsKey(w))
-						R.add(w);
-				}
-			}
-		} else {
-			for (int w : cand) {
-				if (nghOfq.contains(w)) {
-					if (ext.containsKey(w) && (ext.get(w) > idx))
-						R.add(w);
-					if (!ext.containsKey(w))
-						R.add(w);
-				}
-			}
-		}
-		return R;
-	}
-
 	public Collection<Integer> Ngh(Graph G, int u) {
 		return G.AdjList.get(u);
 	}
@@ -233,6 +182,7 @@ public class ParMCEDegeneracy {
 
 		System.out.println("ParMCEDegeneracy - Degeneracy based vertex ordering");
 		System.out.println("Input Graph: " + args[0]);
+		System.out.println("Number of threads used: " + args[1]);
 
 		Graph G = new Graph(args[0]);
 
@@ -253,7 +203,7 @@ public class ParMCEDegeneracy {
 			// System.out.println("number of maximal cliques: " + CLQ.size());
 			System.out.println("number of maximal cliques: " + count.get());
 			System.out.println(
-					"Parallel time taken to compute maximal cliques in " + args[0] + " : " + elapsed / 1000. + " sec.");
+					"Parallel time taken to compute maximal cliques in " + args[0] + " : " + elapsed / 1000 + " sec.");
 			// System.out.println("Total loop overhead : " + loopoverhead/1000 +
 			// " sec.");
 		} catch (IOException e) {
diff --git a/src/main/java/Algorithm/parMCE/ParMCEDegree.java b/src/main/java/Algorithm/parMCE/ParMCEDegree.java
index a4b351e..d166fe3 100644
--- a/src/main/java/Algorithm/parMCE/ParMCEDegree.java
+++ b/src/main/java/Algorithm/parMCE/ParMCEDegree.java
@@ -1,6 +1,6 @@
 package Algorithm.parMCE;
-/**
- * ParMCEDegree : uses modified ParTTT along with executing on subproblems in parallel.
+/**This Algorithm generates all maximal cliques of an undirected graph G
+ * based on Tomita et al. with title "The worst-case time complexity for generating all maximal cliques and computational experiments"
  * */
 
 import java.util.*;
@@ -18,12 +18,10 @@ import java.util.concurrent.ForkJoinPool;
 
 public class ParMCEDegree {
 
-
 	private static Collection<BitSet> CLQ;
 
 	private static ConcurrentMap<Long, Integer> timeToFrequency;
 	public int clqcnt;
-	private FileWriter cw;
 
 	private static Graph G;
 
@@ -31,18 +29,12 @@ public class ParMCEDegree {
 
 	private static HashMap<Integer, HashSet<Integer>> MapVE;
 
-	static long loopoverhead;
-
-	public ParMCEDegree(Graph g, String ofname) throws IOException {
+	public ParMCEDegree(Graph g) throws IOException {
 
 		this.G = g;
 
 		count = new AtomicLong(0);
 
-		loopoverhead = 0;
-
-		CLQ = ConcurrentHashMap.newKeySet();
-
 		G.vertices.parallelStream().forEach(v -> {
 			Set<Integer> CAND = new HashSet<Integer>();
 			Set<Integer> FINI = new HashSet<Integer>();
@@ -72,12 +64,12 @@ public class ParMCEDegree {
 				e.printStackTrace();
 			}
 		});
-
+		
 	}
 
 	public void expand(TreeSet<Integer> K, Collection<Integer> CAND, Collection<Integer> FINI) throws IOException {
 		if (CAND.isEmpty() && FINI.isEmpty()) {
-
+			
 			count.incrementAndGet();
 
 			return;
@@ -87,40 +79,44 @@ public class ParMCEDegree {
 		int u = find_u(CAND, FINI);
 
 		Collection<Integer> NghOfu = Ngh(G, u);
-
-		Map<Integer, Integer> Ext = new HashMap<>();
+		//List<Integer> Ext = new ArrayList<>();
+		
 		
 		
-		int[] ExtForFini = new int[CAND.size()];
+		int[] Ext = new int[CAND.size()];
+
 
 		int index = 0;
-		for (int w : CAND) {
+		for(int w : CAND){
 			if (!NghOfu.contains(w)) {
-				Ext.put(w, index);
-				ExtForFini[index] = w;
-				index++;
+				Ext[index++] = w;
 			}
 		}
 
-		int size = Ext.size();
+		int size = index;
 
+		
 		if (size > 0) {
-			Ext.keySet().parallelStream().forEach(q -> {
+			IntStream.range(0, size).parallel().forEach(i -> {
 
-				// long start = System.currentTimeMillis();
-				int idx = Ext.get(q);
+				int q = Ext[i];
 				TreeSet<Integer> Kq = new TreeSet<>();
 				Kq.addAll(K);
 				Kq.add(q);
 
 				Collection<Integer> NghOfq = Ngh(G, q);
 
-				Collection<Integer> CANDq = computeNewCand(CAND, NghOfq, Ext, idx);
-				Collection<Integer> FINIq = computeNewFini(FINI, NghOfq, Ext, ExtForFini, idx);
+				HashSet<Integer> CANDq = SetOperations.intersect(CAND, NghOfq);
+				
 
-				// loopoverhead += (System.currentTimeMillis() - start);
+				HashSet<Integer> FINIq = SetOperations.intersect(FINI, NghOfq);
 
-				// loopoverhead.addAndGet(delta);
+				for (int j = 0; j < i; j++) {
+					int p = Ext[j];
+					CANDq.remove(p);
+					if (NghOfq.contains(p))
+						FINIq.add(p);
+				}
 
 				try {
 					expand(Kq, CANDq, FINIq);
@@ -134,89 +130,38 @@ public class ParMCEDegree {
 	}
 
 
-	private Collection<Integer> computeNewFini(Collection<Integer> fini, Collection<Integer> nghOfq,
-			Map<Integer, Integer> ext, int[] extforfini, int idx) {
-
-		Collection<Integer> R = new HashSet<>();
-		if (nghOfq.size() < fini.size()) {
-			for (int w : nghOfq) {
-				if (fini.contains(w)) {
-					R.add(w);
-				}
-				if (ext.containsKey(w) && (ext.get(w) < idx))
-					R.add(w);
-			}
-		} 
-		else {
-			for (int w : fini) {
-				if (nghOfq.contains(w))
-					R.add(w);
-			}
-			for(int i=0; i< idx; i++){
-				int x = extforfini[i];
-				if(nghOfq.contains(x))
-					R.add(x);
-			}
-		}
-		return R;
-	}
-
-	private Collection<Integer> computeNewCand(Collection<Integer> cand, Collection<Integer> nghOfq,
-			Map<Integer, Integer> ext, int idx) {
-
-		Collection<Integer> R = new HashSet<>();
-		if (cand.size() > nghOfq.size()) {
-			for (int w : nghOfq) {
-				if (cand.contains(w)) {
-					if (ext.containsKey(w) && (ext.get(w) > idx))
-						R.add(w);
-					if (!ext.containsKey(w))
-						R.add(w);
-				}
-			}
-		} else {
-			for (int w : cand) {
-				if (nghOfq.contains(w)) {
-					if (ext.containsKey(w) && (ext.get(w) > idx))
-						R.add(w);
-					if (!ext.containsKey(w))
-						R.add(w);
-				}
-			}
-		}
-		return R;
-	}
-
 	public Collection<Integer> Ngh(Graph G, int u) {
+
 		return G.AdjList.get(u);
 	}
 
-	public int find_u(Collection<Integer> CAND,
-			Collection<Integer> FINI /*
-										 * Set<String> SUBG
-										 */) {
-
-		Map<Integer, Integer> vToIntersectSize = new ConcurrentHashMap<>();
+	public int find_u(Collection<Integer> CAND, Collection<Integer> FINI /*
+															 * Set<String> SUBG
+															 */) {
 
+		Map<Integer, Integer> vToIntersectSize = new ConcurrentHashMap<>(); 
+		
 		CAND.parallelStream().forEach(u -> {
-
-			Collection<Integer> Q = SetOperations.intersect(Ngh(G, u), CAND);
+			
+			HashSet<Integer> Q = SetOperations.intersect(Ngh(G,u), CAND);
+			
 			vToIntersectSize.put(u, Q.size());
-
+			
 		});
-
+		
 		FINI.parallelStream().forEach(u -> {
-
-			Collection<Integer> Q = SetOperations.intersect(Ngh(G, u), CAND);
+			
+			HashSet<Integer> Q = SetOperations.intersect(Ngh(G,u), CAND);
+			
 			vToIntersectSize.put(u, Q.size());
-
+			
 		});
-
+		
 		int size = -1;
 		int v = 0;
-		for (int u : vToIntersectSize.keySet()) {
+		for(int u : vToIntersectSize.keySet()) {
 			int tmp = vToIntersectSize.get(u);
-			if (size < tmp) {
+			if(size < tmp) {
 				size = tmp;
 				v = u;
 			}
@@ -230,24 +175,24 @@ public class ParMCEDegree {
 		// TODO Auto-generated method stub
 
 		System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", args[1]);
-
-		System.out.println("ParMCEDegree - Degree based vertex ordering");
+		
+		System.out.println("ParMCEDegree : degree based vertex ordering");
 		System.out.println("Input Graph: " + args[0]);
+		System.out.println("Number of threads used: " + args[1]);
 
 		Graph G = new Graph(args[0]);
 
 		System.out.println("Graph Reading Complete");
+		
 
 		try {
 			long t1 = System.currentTimeMillis();
-			new ParMCEDegree(G, "output_TTT");
+			new ParMCEDegree(G);
 			long elapsed = System.currentTimeMillis() - t1;
-			// System.out.println("number of maximal cliques: " + CLQ.size());
+			
 			System.out.println("number of maximal cliques: " + count.get());
 			System.out.println(
-					"Parallel time taken to compute maximal cliques in " + args[0] + " : " + elapsed / 1000. + " sec.");
-			// System.out.println("Total loop overhead : " + loopoverhead/1000 +
-			// " sec.");
+					"Parallel time taken to compute maximal cliques in " + args[0] + " : " + elapsed / 1000 + " sec.");
 		} catch (IOException e) {
 			// TODO Auto-generated catch block
 			e.printStackTrace();
diff --git a/src/main/java/Algorithm/parMCE/ParMCETriangles.java b/src/main/java/Algorithm/parMCE/ParMCETriangles.java
index 11bf8b3..af9fb1c 100644
--- a/src/main/java/Algorithm/parMCE/ParMCETriangles.java
+++ b/src/main/java/Algorithm/parMCE/ParMCETriangles.java
@@ -88,39 +88,42 @@ public class ParMCETriangles {
 
 		Collection<Integer> NghOfu = Ngh(G, u);
 
-		Map<Integer, Integer> Ext = new HashMap<>();
+		//List<Integer> Ext = new ArrayList<>();
 		
-		
-		int[] ExtForFini = new int[CAND.size()];
+		int[] Ext = new int[CAND.size()];
+
 
 		int index = 0;
-		for (int w : CAND) {
+		for(int w : CAND){
 			if (!NghOfu.contains(w)) {
-				Ext.put(w, index);
-				ExtForFini[index] = w;
-				index++;
+				Ext[index++] = w;
 			}
 		}
 
-		int size = Ext.size();
+		int size = index;
 
+		
 		if (size > 0) {
-			Ext.keySet().parallelStream().forEach(q -> {
+			IntStream.range(0, size).parallel().forEach(i -> {
 
-				// long start = System.currentTimeMillis();
-				int idx = Ext.get(q);
+				int q = Ext[i];
 				TreeSet<Integer> Kq = new TreeSet<>();
 				Kq.addAll(K);
 				Kq.add(q);
 
 				Collection<Integer> NghOfq = Ngh(G, q);
 
-				Collection<Integer> CANDq = computeNewCand(CAND, NghOfq, Ext, idx);
-				Collection<Integer> FINIq = computeNewFini(FINI, NghOfq, Ext, ExtForFini, idx);
+				HashSet<Integer> CANDq = SetOperations.intersect(CAND, NghOfq);
+				
 
-				// loopoverhead += (System.currentTimeMillis() - start);
+				HashSet<Integer> FINIq = SetOperations.intersect(FINI, NghOfq);
 
-				// loopoverhead.addAndGet(delta);
+				for (int j = 0; j < i; j++) {
+					int p = Ext[j];
+					CANDq.remove(p);
+					if (NghOfq.contains(p))
+						FINIq.add(p);
+				}
 
 				try {
 					expand(Kq, CANDq, FINIq);
@@ -133,60 +136,6 @@ public class ParMCETriangles {
 		}
 	}
 
-
-	private Collection<Integer> computeNewFini(Collection<Integer> fini, Collection<Integer> nghOfq,
-			Map<Integer, Integer> ext, int[] extforfini, int idx) {
-
-		Collection<Integer> R = new HashSet<>();
-		if (nghOfq.size() < fini.size()) {
-			for (int w : nghOfq) {
-				if (fini.contains(w)) {
-					R.add(w);
-				}
-				if (ext.containsKey(w) && (ext.get(w) < idx))
-					R.add(w);
-			}
-		} 
-		else {
-			for (int w : fini) {
-				if (nghOfq.contains(w))
-					R.add(w);
-			}
-			for(int i=0; i< idx; i++){
-				int x = extforfini[i];
-				if(nghOfq.contains(x))
-					R.add(x);
-			}
-		}
-		return R;
-	}
-
-	private Collection<Integer> computeNewCand(Collection<Integer> cand, Collection<Integer> nghOfq,
-			Map<Integer, Integer> ext, int idx) {
-
-		Collection<Integer> R = new HashSet<>();
-		if (cand.size() > nghOfq.size()) {
-			for (int w : nghOfq) {
-				if (cand.contains(w)) {
-					if (ext.containsKey(w) && (ext.get(w) > idx))
-						R.add(w);
-					if (!ext.containsKey(w))
-						R.add(w);
-				}
-			}
-		} else {
-			for (int w : cand) {
-				if (nghOfq.contains(w)) {
-					if (ext.containsKey(w) && (ext.get(w) > idx))
-						R.add(w);
-					if (!ext.containsKey(w))
-						R.add(w);
-				}
-			}
-		}
-		return R;
-	}
-
 	public Collection<Integer> Ngh(Graph G, int u) {
 		return G.AdjList.get(u);
 	}
@@ -233,6 +182,7 @@ public class ParMCETriangles {
 
 		System.out.println("ParMCETriangles - Triangle count based vertex ordering");
 		System.out.println("Input Graph: " + args[0]);
+		System.out.println("Number of threads used: " + args[1]);
 
 		Graph G = new Graph(args[0]);
 
@@ -245,7 +195,7 @@ public class ParMCETriangles {
 			// System.out.println("number of maximal cliques: " + CLQ.size());
 			System.out.println("number of maximal cliques: " + count.get());
 			System.out.println(
-					"Parallel time taken to compute maximal cliques in " + args[0] + " : " + elapsed / 1000. + " sec.");
+					"Parallel time taken to compute maximal cliques in " + args[0] + " : " + elapsed / 1000 + " sec.");
 			// System.out.println("Total loop overhead : " + loopoverhead/1000 +
 			// " sec.");
 		} catch (IOException e) {
-- 
GitLab