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