Latest commit

History

20 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

# Grappolo: Parallel clustering using the Louvain method as the serial template
## Description
Grappolo implements a parallel version of the Louvain community detection algorithm, using several heuristics to gain computational speed. There can be a larger memory footprint and some loss of accuracy arising from non-deterministic order of vertex processing and use of different heuristics. In general, we have observed significant gains in speed with minimal impact on clustering accuracy (measure in terms of the final modularity score). Further, Grappolo enables processing of large inputs that would otherwise remain unsolved using the serial Louvain implementation. We also note that the distributed-memory version (Vite) is available for extremely large data sets.
The single slice Grappolo has been divided to 7 folders
/DefineStructure: Contain all .h files from different dirctories
/Utility: check basic_ultil.h and utilityClusteringFunc.h
/BasicCommunitiesDection: check basic_comm.h
/Coloring: check coloring.h and comm_coloring.h
/FullSyncOptimization: check sync_comm.h
/InputsOutput: check input_output.h
/****************************************************/
Makefile will create 3 executable in the /bin folder
1)	./convertFileToBinary
2)	./driverForGraphClustering
3)	./driverForColoring
/****************************************************/
To update code, record each update in the folder.
To updates for each particular type of communities detection
1) Change code in particualr folder
/ Add different communities detection method
2) Change the runMultiPhaseXXX.cpp to capture the changes
3) Update the .h files in /DefineStructure
4) Drivers and other folder can remain unchanged
5) To update the Utility code must be done with care, API should
stay the same
/****************************************************/
To run the code, it will be in the menu of ./driverForGraphClustering
## Input parameters that can be customized:
`links` A numeric matrix of network edges.
`coloring` (1) An integer between 0 and 3 that controls the distance-1 graph coloring heuristic used to partition independent sets of vertices in a graph for parallel processing. * 0 - No coloring.
* 1 - (Default) Distance-1 graph coloring. Every vertex receives a color and no two neighbors have the same color.
* 2 – Distance-1 graph coloring, rebalanced for evenly distributed color classes (#nodes per color).
* 3 - Incomplete coloring, limited to `numColors`, by default 16.
`numColors` (16): An integer between 1 and 1024. Limits graph coloring. Only used if `coloring=3`, incomplete coloring, is set.
`C_thresh` (1e-6): The threshold value determines how long the algorithm iterates. This value (a real number between 0 and 1; >0) is checked when coloring is enabled. The algorithm will stop iterating when the gain in modularity becomes less than `C_thresh`. A final iteration is performed using the value specified by the `threshold` parameter. Desired value for `C_thresh` should be larger than `threshold` for gains in performance.
`minGraphSize` (1,000): Determines when multi-phase operations should stop. Execution stops when the coarsened graph has collapsed the current graph to a fewer than `minGraphSize` nodes. `threshold` (1e-9): The threshold value determines how long the algorithm iterates. It is a real number between 0 and 1 (>0). The algorithm will stop the iterations in the current phase when the gain in modularity is less than `threshold`. The algorithm can enter the next phase based on the size of the coarsened graph. `syncType` (0) An integer between 0 and 4 that controls synchronization between threads. Only applies if `coloring=0` (no coloring). Synchronization forces the parallel algorithm to behave similar to the execution of a serial Louvain implementation.
* 0 - (Default) No sync (gives the best performance in terms of runtime).
* 1 - Full sync (behaves like a serial algorithm).
* 2 - Neighborhood sync (a hybrid between 0 and 1).
* 3 - Early termination (stops processing a vertex if it has not changed its community for the past few iterations – leads to gain in performance).
* 4 - Full sync with early termination (hybrid of 1 and 3).
`basicOpt` (1) Either 0 or 1, controls the representation of intermediate data structures.
* 0 – Uses stl::map data structure. While it has a smaller memory footprint and computational efficiency, excessive memory allocations and deallocations can lead to loss of performance.
* 1 - (Default) Use stl::vector to replace the functionality of stl::map. This option comes at the expense of a larger memory footprint and loss in performance when the algorithm has a large number of communities and does not converge quickly (does not have a good community structure). In general, this option can be faster than the stl::map option for inputs with good community structure.
## Further Details:
The only required parameter is `links`. All other parameters are tuning parameters that control how speed vs accuracy vs memory tradeoffs are made. We specifically note that the original Louvain algorithm is non-deterministic and varies considerably for different input structures. Grappolo inherits these limitations with added complications from parallelization.
## Return Value:
A list with two elements:
* `modularity` - The modularity of the computed partitioning of the network into a set of non-overlapping clusters (communities or partitions). Modularity is a measure of the connectedness in a given network when partitioned based on a given approach.
* `communities` - A vector where the i'th value is the cluster number that the i'th node in the links matrix has been assigned to.

About

OpenMP implementation of Graph Community Detection, with a number of parallel heuristics/approximate computing techniques

Resources

Stars

23 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

20 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

# Grappolo: Parallel clustering using the Louvain method as the serial template
## Description
Grappolo implements a parallel version of the Louvain community detection algorithm, using several heuristics to gain computational speed. There can be a larger memory footprint and some loss of accuracy arising from non-deterministic order of vertex processing and use of different heuristics. In general, we have observed significant gains in speed with minimal impact on clustering accuracy (measure in terms of the final modularity score). Further, Grappolo enables processing of large inputs that would otherwise remain unsolved using the serial Louvain implementation. We also note that the distributed-memory version (Vite) is available for extremely large data sets.
The single slice Grappolo has been divided to 7 folders
/DefineStructure: Contain all .h files from different dirctories
/Utility: check basic_ultil.h and utilityClusteringFunc.h
/BasicCommunitiesDection: check basic_comm.h
/Coloring: check coloring.h and comm_coloring.h
/FullSyncOptimization: check sync_comm.h
/InputsOutput: check input_output.h
/****************************************************/
Makefile will create 3 executable in the /bin folder
1)	./convertFileToBinary
2)	./driverForGraphClustering
3)	./driverForColoring
/****************************************************/
To update code, record each update in the folder.
To updates for each particular type of communities detection
1) Change code in particualr folder
/ Add different communities detection method
2) Change the runMultiPhaseXXX.cpp to capture the changes
3) Update the .h files in /DefineStructure
4) Drivers and other folder can remain unchanged
5) To update the Utility code must be done with care, API should
stay the same
/****************************************************/
To run the code, it will be in the menu of ./driverForGraphClustering
## Input parameters that can be customized:
`links` A numeric matrix of network edges.
`coloring` (1) An integer between 0 and 3 that controls the distance-1 graph coloring heuristic used to partition independent sets of vertices in a graph for parallel processing. * 0 - No coloring.
* 1 - (Default) Distance-1 graph coloring. Every vertex receives a color and no two neighbors have the same color.
* 2 – Distance-1 graph coloring, rebalanced for evenly distributed color classes (#nodes per color).
* 3 - Incomplete coloring, limited to `numColors`, by default 16.
`numColors` (16): An integer between 1 and 1024. Limits graph coloring. Only used if `coloring=3`, incomplete coloring, is set.
`C_thresh` (1e-6): The threshold value determines how long the algorithm iterates. This value (a real number between 0 and 1; >0) is checked when coloring is enabled. The algorithm will stop iterating when the gain in modularity becomes less than `C_thresh`. A final iteration is performed using the value specified by the `threshold` parameter. Desired value for `C_thresh` should be larger than `threshold` for gains in performance.
`minGraphSize` (1,000): Determines when multi-phase operations should stop. Execution stops when the coarsened graph has collapsed the current graph to a fewer than `minGraphSize` nodes. `threshold` (1e-9): The threshold value determines how long the algorithm iterates. It is a real number between 0 and 1 (>0). The algorithm will stop the iterations in the current phase when the gain in modularity is less than `threshold`. The algorithm can enter the next phase based on the size of the coarsened graph. `syncType` (0) An integer between 0 and 4 that controls synchronization between threads. Only applies if `coloring=0` (no coloring). Synchronization forces the parallel algorithm to behave similar to the execution of a serial Louvain implementation.
* 0 - (Default) No sync (gives the best performance in terms of runtime).
* 1 - Full sync (behaves like a serial algorithm).
* 2 - Neighborhood sync (a hybrid between 0 and 1).
* 3 - Early termination (stops processing a vertex if it has not changed its community for the past few iterations – leads to gain in performance).
* 4 - Full sync with early termination (hybrid of 1 and 3).
`basicOpt` (1) Either 0 or 1, controls the representation of intermediate data structures.
* 0 – Uses stl::map data structure. While it has a smaller memory footprint and computational efficiency, excessive memory allocations and deallocations can lead to loss of performance.
* 1 - (Default) Use stl::vector to replace the functionality of stl::map. This option comes at the expense of a larger memory footprint and loss in performance when the algorithm has a large number of communities and does not converge quickly (does not have a good community structure). In general, this option can be faster than the stl::map option for inputs with good community structure.
## Further Details:
The only required parameter is `links`. All other parameters are tuning parameters that control how speed vs accuracy vs memory tradeoffs are made. We specifically note that the original Louvain algorithm is non-deterministic and varies considerably for different input structures. Grappolo inherits these limitations with added complications from parallelization.
## Return Value:
A list with two elements:
* `modularity` - The modularity of the computed partitioning of the network into a set of non-overlapping clusters (communities or partitions). Modularity is a measure of the connectedness in a given network when partitioned based on a given approach.
* `communities` - A vector where the i'th value is the cluster number that the i'th node in the links matrix has been assigned to.

About

OpenMP implementation of Graph Community Detection, with a number of parallel heuristics/approximate computing techniques

Resources

Stars

23 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

20 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

# Grappolo: Parallel clustering using the Louvain method as the serial template
## Description
Grappolo implements a parallel version of the Louvain community detection algorithm, using several heuristics to gain computational speed. There can be a larger memory footprint and some loss of accuracy arising from non-deterministic order of vertex processing and use of different heuristics. In general, we have observed significant gains in speed with minimal impact on clustering accuracy (measure in terms of the final modularity score). Further, Grappolo enables processing of large inputs that would otherwise remain unsolved using the serial Louvain implementation. We also note that the distributed-memory version (Vite) is available for extremely large data sets.
The single slice Grappolo has been divided to 7 folders
/DefineStructure: Contain all .h files from different dirctories
/Utility: check basic_ultil.h and utilityClusteringFunc.h
/BasicCommunitiesDection: check basic_comm.h
/Coloring: check coloring.h and comm_coloring.h
/FullSyncOptimization: check sync_comm.h
/InputsOutput: check input_output.h
/****************************************************/
Makefile will create 3 executable in the /bin folder
1)	./convertFileToBinary
2)	./driverForGraphClustering
3)	./driverForColoring
/****************************************************/
To update code, record each update in the folder.
To updates for each particular type of communities detection
1) Change code in particualr folder
/ Add different communities detection method
2) Change the runMultiPhaseXXX.cpp to capture the changes
3) Update the .h files in /DefineStructure
4) Drivers and other folder can remain unchanged
5) To update the Utility code must be done with care, API should
stay the same
/****************************************************/
To run the code, it will be in the menu of ./driverForGraphClustering
## Input parameters that can be customized:
`links` A numeric matrix of network edges.
`coloring` (1) An integer between 0 and 3 that controls the distance-1 graph coloring heuristic used to partition independent sets of vertices in a graph for parallel processing. * 0 - No coloring.
* 1 - (Default) Distance-1 graph coloring. Every vertex receives a color and no two neighbors have the same color.
* 2 – Distance-1 graph coloring, rebalanced for evenly distributed color classes (#nodes per color).
* 3 - Incomplete coloring, limited to `numColors`, by default 16.
`numColors` (16): An integer between 1 and 1024. Limits graph coloring. Only used if `coloring=3`, incomplete coloring, is set.
`C_thresh` (1e-6): The threshold value determines how long the algorithm iterates. This value (a real number between 0 and 1; >0) is checked when coloring is enabled. The algorithm will stop iterating when the gain in modularity becomes less than `C_thresh`. A final iteration is performed using the value specified by the `threshold` parameter. Desired value for `C_thresh` should be larger than `threshold` for gains in performance.
`minGraphSize` (1,000): Determines when multi-phase operations should stop. Execution stops when the coarsened graph has collapsed the current graph to a fewer than `minGraphSize` nodes. `threshold` (1e-9): The threshold value determines how long the algorithm iterates. It is a real number between 0 and 1 (>0). The algorithm will stop the iterations in the current phase when the gain in modularity is less than `threshold`. The algorithm can enter the next phase based on the size of the coarsened graph. `syncType` (0) An integer between 0 and 4 that controls synchronization between threads. Only applies if `coloring=0` (no coloring). Synchronization forces the parallel algorithm to behave similar to the execution of a serial Louvain implementation.
* 0 - (Default) No sync (gives the best performance in terms of runtime).
* 1 - Full sync (behaves like a serial algorithm).
* 2 - Neighborhood sync (a hybrid between 0 and 1).
* 3 - Early termination (stops processing a vertex if it has not changed its community for the past few iterations – leads to gain in performance).
* 4 - Full sync with early termination (hybrid of 1 and 3).
`basicOpt` (1) Either 0 or 1, controls the representation of intermediate data structures.
* 0 – Uses stl::map data structure. While it has a smaller memory footprint and computational efficiency, excessive memory allocations and deallocations can lead to loss of performance.
* 1 - (Default) Use stl::vector to replace the functionality of stl::map. This option comes at the expense of a larger memory footprint and loss in performance when the algorithm has a large number of communities and does not converge quickly (does not have a good community structure). In general, this option can be faster than the stl::map option for inputs with good community structure.
## Further Details:
The only required parameter is `links`. All other parameters are tuning parameters that control how speed vs accuracy vs memory tradeoffs are made. We specifically note that the original Louvain algorithm is non-deterministic and varies considerably for different input structures. Grappolo inherits these limitations with added complications from parallelization.
## Return Value:
A list with two elements:
* `modularity` - The modularity of the computed partitioning of the network into a set of non-overlapping clusters (communities or partitions). Modularity is a measure of the connectedness in a given network when partitioned based on a given approach.
* `communities` - A vector where the i'th value is the cluster number that the i'th node in the links matrix has been assigned to.

About

OpenMP implementation of Graph Community Detection, with a number of parallel heuristics/approximate computing techniques

Resources

Stars

23 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

20 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

# Grappolo: Parallel clustering using the Louvain method as the serial template
## Description
Grappolo implements a parallel version of the Louvain community detection algorithm, using several heuristics to gain computational speed. There can be a larger memory footprint and some loss of accuracy arising from non-deterministic order of vertex processing and use of different heuristics. In general, we have observed significant gains in speed with minimal impact on clustering accuracy (measure in terms of the final modularity score). Further, Grappolo enables processing of large inputs that would otherwise remain unsolved using the serial Louvain implementation. We also note that the distributed-memory version (Vite) is available for extremely large data sets.
The single slice Grappolo has been divided to 7 folders
/DefineStructure: Contain all .h files from different dirctories
/Utility: check basic_ultil.h and utilityClusteringFunc.h
/BasicCommunitiesDection: check basic_comm.h
/Coloring: check coloring.h and comm_coloring.h
/FullSyncOptimization: check sync_comm.h
/InputsOutput: check input_output.h
/****************************************************/
Makefile will create 3 executable in the /bin folder
1)	./convertFileToBinary
2)	./driverForGraphClustering
3)	./driverForColoring
/****************************************************/
To update code, record each update in the folder.
To updates for each particular type of communities detection
1) Change code in particualr folder
/ Add different communities detection method
2) Change the runMultiPhaseXXX.cpp to capture the changes
3) Update the .h files in /DefineStructure
4) Drivers and other folder can remain unchanged
5) To update the Utility code must be done with care, API should
stay the same
/****************************************************/
To run the code, it will be in the menu of ./driverForGraphClustering
## Input parameters that can be customized:
`links` A numeric matrix of network edges.
`coloring` (1) An integer between 0 and 3 that controls the distance-1 graph coloring heuristic used to partition independent sets of vertices in a graph for parallel processing. * 0 - No coloring.
* 1 - (Default) Distance-1 graph coloring. Every vertex receives a color and no two neighbors have the same color.
* 2 – Distance-1 graph coloring, rebalanced for evenly distributed color classes (#nodes per color).
* 3 - Incomplete coloring, limited to `numColors`, by default 16.
`numColors` (16): An integer between 1 and 1024. Limits graph coloring. Only used if `coloring=3`, incomplete coloring, is set.
`C_thresh` (1e-6): The threshold value determines how long the algorithm iterates. This value (a real number between 0 and 1; >0) is checked when coloring is enabled. The algorithm will stop iterating when the gain in modularity becomes less than `C_thresh`. A final iteration is performed using the value specified by the `threshold` parameter. Desired value for `C_thresh` should be larger than `threshold` for gains in performance.
`minGraphSize` (1,000): Determines when multi-phase operations should stop. Execution stops when the coarsened graph has collapsed the current graph to a fewer than `minGraphSize` nodes. `threshold` (1e-9): The threshold value determines how long the algorithm iterates. It is a real number between 0 and 1 (>0). The algorithm will stop the iterations in the current phase when the gain in modularity is less than `threshold`. The algorithm can enter the next phase based on the size of the coarsened graph. `syncType` (0) An integer between 0 and 4 that controls synchronization between threads. Only applies if `coloring=0` (no coloring). Synchronization forces the parallel algorithm to behave similar to the execution of a serial Louvain implementation.
* 0 - (Default) No sync (gives the best performance in terms of runtime).
* 1 - Full sync (behaves like a serial algorithm).
* 2 - Neighborhood sync (a hybrid between 0 and 1).
* 3 - Early termination (stops processing a vertex if it has not changed its community for the past few iterations – leads to gain in performance).
* 4 - Full sync with early termination (hybrid of 1 and 3).
`basicOpt` (1) Either 0 or 1, controls the representation of intermediate data structures.
* 0 – Uses stl::map data structure. While it has a smaller memory footprint and computational efficiency, excessive memory allocations and deallocations can lead to loss of performance.
* 1 - (Default) Use stl::vector to replace the functionality of stl::map. This option comes at the expense of a larger memory footprint and loss in performance when the algorithm has a large number of communities and does not converge quickly (does not have a good community structure). In general, this option can be faster than the stl::map option for inputs with good community structure.
## Further Details:
The only required parameter is `links`. All other parameters are tuning parameters that control how speed vs accuracy vs memory tradeoffs are made. We specifically note that the original Louvain algorithm is non-deterministic and varies considerably for different input structures. Grappolo inherits these limitations with added complications from parallelization.
## Return Value:
A list with two elements:
* `modularity` - The modularity of the computed partitioning of the network into a set of non-overlapping clusters (communities or partitions). Modularity is a measure of the connectedness in a given network when partitioned based on a given approach.
* `communities` - A vector where the i'th value is the cluster number that the i'th node in the links matrix has been assigned to.

About

OpenMP implementation of Graph Community Detection, with a number of parallel heuristics/approximate computing techniques

Resources

Stars

23 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

20 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

# Grappolo: Parallel clustering using the Louvain method as the serial template
## Description
Grappolo implements a parallel version of the Louvain community detection algorithm, using several heuristics to gain computational speed. There can be a larger memory footprint and some loss of accuracy arising from non-deterministic order of vertex processing and use of different heuristics. In general, we have observed significant gains in speed with minimal impact on clustering accuracy (measure in terms of the final modularity score). Further, Grappolo enables processing of large inputs that would otherwise remain unsolved using the serial Louvain implementation. We also note that the distributed-memory version (Vite) is available for extremely large data sets.
The single slice Grappolo has been divided to 7 folders
/DefineStructure: Contain all .h files from different dirctories
/Utility: check basic_ultil.h and utilityClusteringFunc.h
/BasicCommunitiesDection: check basic_comm.h
/Coloring: check coloring.h and comm_coloring.h
/FullSyncOptimization: check sync_comm.h
/InputsOutput: check input_output.h
/****************************************************/
Makefile will create 3 executable in the /bin folder
1)	./convertFileToBinary
2)	./driverForGraphClustering
3)	./driverForColoring
/****************************************************/
To update code, record each update in the folder.
To updates for each particular type of communities detection
1) Change code in particualr folder
/ Add different communities detection method
2) Change the runMultiPhaseXXX.cpp to capture the changes
3) Update the .h files in /DefineStructure
4) Drivers and other folder can remain unchanged
5) To update the Utility code must be done with care, API should
stay the same
/****************************************************/
To run the code, it will be in the menu of ./driverForGraphClustering
## Input parameters that can be customized:
`links` A numeric matrix of network edges.
`coloring` (1) An integer between 0 and 3 that controls the distance-1 graph coloring heuristic used to partition independent sets of vertices in a graph for parallel processing. * 0 - No coloring.
* 1 - (Default) Distance-1 graph coloring. Every vertex receives a color and no two neighbors have the same color.
* 2 – Distance-1 graph coloring, rebalanced for evenly distributed color classes (#nodes per color).
* 3 - Incomplete coloring, limited to `numColors`, by default 16.
`numColors` (16): An integer between 1 and 1024. Limits graph coloring. Only used if `coloring=3`, incomplete coloring, is set.
`C_thresh` (1e-6): The threshold value determines how long the algorithm iterates. This value (a real number between 0 and 1; >0) is checked when coloring is enabled. The algorithm will stop iterating when the gain in modularity becomes less than `C_thresh`. A final iteration is performed using the value specified by the `threshold` parameter. Desired value for `C_thresh` should be larger than `threshold` for gains in performance.
`minGraphSize` (1,000): Determines when multi-phase operations should stop. Execution stops when the coarsened graph has collapsed the current graph to a fewer than `minGraphSize` nodes. `threshold` (1e-9): The threshold value determines how long the algorithm iterates. It is a real number between 0 and 1 (>0). The algorithm will stop the iterations in the current phase when the gain in modularity is less than `threshold`. The algorithm can enter the next phase based on the size of the coarsened graph. `syncType` (0) An integer between 0 and 4 that controls synchronization between threads. Only applies if `coloring=0` (no coloring). Synchronization forces the parallel algorithm to behave similar to the execution of a serial Louvain implementation.
* 0 - (Default) No sync (gives the best performance in terms of runtime).
* 1 - Full sync (behaves like a serial algorithm).
* 2 - Neighborhood sync (a hybrid between 0 and 1).
* 3 - Early termination (stops processing a vertex if it has not changed its community for the past few iterations – leads to gain in performance).
* 4 - Full sync with early termination (hybrid of 1 and 3).
`basicOpt` (1) Either 0 or 1, controls the representation of intermediate data structures.
* 0 – Uses stl::map data structure. While it has a smaller memory footprint and computational efficiency, excessive memory allocations and deallocations can lead to loss of performance.
* 1 - (Default) Use stl::vector to replace the functionality of stl::map. This option comes at the expense of a larger memory footprint and loss in performance when the algorithm has a large number of communities and does not converge quickly (does not have a good community structure). In general, this option can be faster than the stl::map option for inputs with good community structure.
## Further Details:
The only required parameter is `links`. All other parameters are tuning parameters that control how speed vs accuracy vs memory tradeoffs are made. We specifically note that the original Louvain algorithm is non-deterministic and varies considerably for different input structures. Grappolo inherits these limitations with added complications from parallelization.
## Return Value:
A list with two elements:
* `modularity` - The modularity of the computed partitioning of the network into a set of non-overlapping clusters (communities or partitions). Modularity is a measure of the connectedness in a given network when partitioned based on a given approach.
* `communities` - A vector where the i'th value is the cluster number that the i'th node in the links matrix has been assigned to.

About

OpenMP implementation of Graph Community Detection, with a number of parallel heuristics/approximate computing techniques

Resources

Stars

23 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

20 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

# Grappolo: Parallel clustering using the Louvain method as the serial template
## Description
Grappolo implements a parallel version of the Louvain community detection algorithm, using several heuristics to gain computational speed. There can be a larger memory footprint and some loss of accuracy arising from non-deterministic order of vertex processing and use of different heuristics. In general, we have observed significant gains in speed with minimal impact on clustering accuracy (measure in terms of the final modularity score). Further, Grappolo enables processing of large inputs that would otherwise remain unsolved using the serial Louvain implementation. We also note that the distributed-memory version (Vite) is available for extremely large data sets.
The single slice Grappolo has been divided to 7 folders
/DefineStructure: Contain all .h files from different dirctories
/Utility: check basic_ultil.h and utilityClusteringFunc.h
/BasicCommunitiesDection: check basic_comm.h
/Coloring: check coloring.h and comm_coloring.h
/FullSyncOptimization: check sync_comm.h
/InputsOutput: check input_output.h
/****************************************************/
Makefile will create 3 executable in the /bin folder
1)	./convertFileToBinary
2)	./driverForGraphClustering
3)	./driverForColoring
/****************************************************/
To update code, record each update in the folder.
To updates for each particular type of communities detection
1) Change code in particualr folder
/ Add different communities detection method
2) Change the runMultiPhaseXXX.cpp to capture the changes
3) Update the .h files in /DefineStructure
4) Drivers and other folder can remain unchanged
5) To update the Utility code must be done with care, API should
stay the same
/****************************************************/
To run the code, it will be in the menu of ./driverForGraphClustering
## Input parameters that can be customized:
`links` A numeric matrix of network edges.
`coloring` (1) An integer between 0 and 3 that controls the distance-1 graph coloring heuristic used to partition independent sets of vertices in a graph for parallel processing. * 0 - No coloring.
* 1 - (Default) Distance-1 graph coloring. Every vertex receives a color and no two neighbors have the same color.
* 2 – Distance-1 graph coloring, rebalanced for evenly distributed color classes (#nodes per color).
* 3 - Incomplete coloring, limited to `numColors`, by default 16.
`numColors` (16): An integer between 1 and 1024. Limits graph coloring. Only used if `coloring=3`, incomplete coloring, is set.
`C_thresh` (1e-6): The threshold value determines how long the algorithm iterates. This value (a real number between 0 and 1; >0) is checked when coloring is enabled. The algorithm will stop iterating when the gain in modularity becomes less than `C_thresh`. A final iteration is performed using the value specified by the `threshold` parameter. Desired value for `C_thresh` should be larger than `threshold` for gains in performance.
`minGraphSize` (1,000): Determines when multi-phase operations should stop. Execution stops when the coarsened graph has collapsed the current graph to a fewer than `minGraphSize` nodes. `threshold` (1e-9): The threshold value determines how long the algorithm iterates. It is a real number between 0 and 1 (>0). The algorithm will stop the iterations in the current phase when the gain in modularity is less than `threshold`. The algorithm can enter the next phase based on the size of the coarsened graph. `syncType` (0) An integer between 0 and 4 that controls synchronization between threads. Only applies if `coloring=0` (no coloring). Synchronization forces the parallel algorithm to behave similar to the execution of a serial Louvain implementation.
* 0 - (Default) No sync (gives the best performance in terms of runtime).
* 1 - Full sync (behaves like a serial algorithm).
* 2 - Neighborhood sync (a hybrid between 0 and 1).
* 3 - Early termination (stops processing a vertex if it has not changed its community for the past few iterations – leads to gain in performance).
* 4 - Full sync with early termination (hybrid of 1 and 3).
`basicOpt` (1) Either 0 or 1, controls the representation of intermediate data structures.
* 0 – Uses stl::map data structure. While it has a smaller memory footprint and computational efficiency, excessive memory allocations and deallocations can lead to loss of performance.
* 1 - (Default) Use stl::vector to replace the functionality of stl::map. This option comes at the expense of a larger memory footprint and loss in performance when the algorithm has a large number of communities and does not converge quickly (does not have a good community structure). In general, this option can be faster than the stl::map option for inputs with good community structure.
## Further Details:
The only required parameter is `links`. All other parameters are tuning parameters that control how speed vs accuracy vs memory tradeoffs are made. We specifically note that the original Louvain algorithm is non-deterministic and varies considerably for different input structures. Grappolo inherits these limitations with added complications from parallelization.
## Return Value:
A list with two elements:
* `modularity` - The modularity of the computed partitioning of the network into a set of non-overlapping clusters (communities or partitions). Modularity is a measure of the connectedness in a given network when partitioned based on a given approach.
* `communities` - A vector where the i'th value is the cluster number that the i'th node in the links matrix has been assigned to.

About

OpenMP implementation of Graph Community Detection, with a number of parallel heuristics/approximate computing techniques

Resources

Stars

23 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

20 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

# Grappolo: Parallel clustering using the Louvain method as the serial template
## Description
Grappolo implements a parallel version of the Louvain community detection algorithm, using several heuristics to gain computational speed. There can be a larger memory footprint and some loss of accuracy arising from non-deterministic order of vertex processing and use of different heuristics. In general, we have observed significant gains in speed with minimal impact on clustering accuracy (measure in terms of the final modularity score). Further, Grappolo enables processing of large inputs that would otherwise remain unsolved using the serial Louvain implementation. We also note that the distributed-memory version (Vite) is available for extremely large data sets.
The single slice Grappolo has been divided to 7 folders
/DefineStructure: Contain all .h files from different dirctories
/Utility: check basic_ultil.h and utilityClusteringFunc.h
/BasicCommunitiesDection: check basic_comm.h
/Coloring: check coloring.h and comm_coloring.h
/FullSyncOptimization: check sync_comm.h
/InputsOutput: check input_output.h
/****************************************************/
Makefile will create 3 executable in the /bin folder
1)	./convertFileToBinary
2)	./driverForGraphClustering
3)	./driverForColoring
/****************************************************/
To update code, record each update in the folder.
To updates for each particular type of communities detection
1) Change code in particualr folder
/ Add different communities detection method
2) Change the runMultiPhaseXXX.cpp to capture the changes
3) Update the .h files in /DefineStructure
4) Drivers and other folder can remain unchanged
5) To update the Utility code must be done with care, API should
stay the same
/****************************************************/
To run the code, it will be in the menu of ./driverForGraphClustering
## Input parameters that can be customized:
`links` A numeric matrix of network edges.
`coloring` (1) An integer between 0 and 3 that controls the distance-1 graph coloring heuristic used to partition independent sets of vertices in a graph for parallel processing. * 0 - No coloring.
* 1 - (Default) Distance-1 graph coloring. Every vertex receives a color and no two neighbors have the same color.
* 2 – Distance-1 graph coloring, rebalanced for evenly distributed color classes (#nodes per color).
* 3 - Incomplete coloring, limited to `numColors`, by default 16.
`numColors` (16): An integer between 1 and 1024. Limits graph coloring. Only used if `coloring=3`, incomplete coloring, is set.
`C_thresh` (1e-6): The threshold value determines how long the algorithm iterates. This value (a real number between 0 and 1; >0) is checked when coloring is enabled. The algorithm will stop iterating when the gain in modularity becomes less than `C_thresh`. A final iteration is performed using the value specified by the `threshold` parameter. Desired value for `C_thresh` should be larger than `threshold` for gains in performance.
`minGraphSize` (1,000): Determines when multi-phase operations should stop. Execution stops when the coarsened graph has collapsed the current graph to a fewer than `minGraphSize` nodes. `threshold` (1e-9): The threshold value determines how long the algorithm iterates. It is a real number between 0 and 1 (>0). The algorithm will stop the iterations in the current phase when the gain in modularity is less than `threshold`. The algorithm can enter the next phase based on the size of the coarsened graph. `syncType` (0) An integer between 0 and 4 that controls synchronization between threads. Only applies if `coloring=0` (no coloring). Synchronization forces the parallel algorithm to behave similar to the execution of a serial Louvain implementation.
* 0 - (Default) No sync (gives the best performance in terms of runtime).
* 1 - Full sync (behaves like a serial algorithm).
* 2 - Neighborhood sync (a hybrid between 0 and 1).
* 3 - Early termination (stops processing a vertex if it has not changed its community for the past few iterations – leads to gain in performance).
* 4 - Full sync with early termination (hybrid of 1 and 3).
`basicOpt` (1) Either 0 or 1, controls the representation of intermediate data structures.
* 0 – Uses stl::map data structure. While it has a smaller memory footprint and computational efficiency, excessive memory allocations and deallocations can lead to loss of performance.
* 1 - (Default) Use stl::vector to replace the functionality of stl::map. This option comes at the expense of a larger memory footprint and loss in performance when the algorithm has a large number of communities and does not converge quickly (does not have a good community structure). In general, this option can be faster than the stl::map option for inputs with good community structure.
## Further Details:
The only required parameter is `links`. All other parameters are tuning parameters that control how speed vs accuracy vs memory tradeoffs are made. We specifically note that the original Louvain algorithm is non-deterministic and varies considerably for different input structures. Grappolo inherits these limitations with added complications from parallelization.
## Return Value:
A list with two elements:
* `modularity` - The modularity of the computed partitioning of the network into a set of non-overlapping clusters (communities or partitions). Modularity is a measure of the connectedness in a given network when partitioned based on a given approach.
* `communities` - A vector where the i'th value is the cluster number that the i'th node in the links matrix has been assigned to.

About

OpenMP implementation of Graph Community Detection, with a number of parallel heuristics/approximate computing techniques

Resources

Stars

23 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

20 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

# Grappolo: Parallel clustering using the Louvain method as the serial template
## Description
Grappolo implements a parallel version of the Louvain community detection algorithm, using several heuristics to gain computational speed. There can be a larger memory footprint and some loss of accuracy arising from non-deterministic order of vertex processing and use of different heuristics. In general, we have observed significant gains in speed with minimal impact on clustering accuracy (measure in terms of the final modularity score). Further, Grappolo enables processing of large inputs that would otherwise remain unsolved using the serial Louvain implementation. We also note that the distributed-memory version (Vite) is available for extremely large data sets.
The single slice Grappolo has been divided to 7 folders
/DefineStructure: Contain all .h files from different dirctories
/Utility: check basic_ultil.h and utilityClusteringFunc.h
/BasicCommunitiesDection: check basic_comm.h
/Coloring: check coloring.h and comm_coloring.h
/FullSyncOptimization: check sync_comm.h
/InputsOutput: check input_output.h
/****************************************************/
Makefile will create 3 executable in the /bin folder
1)	./convertFileToBinary
2)	./driverForGraphClustering
3)	./driverForColoring
/****************************************************/
To update code, record each update in the folder.
To updates for each particular type of communities detection
1) Change code in particualr folder
/ Add different communities detection method
2) Change the runMultiPhaseXXX.cpp to capture the changes
3) Update the .h files in /DefineStructure
4) Drivers and other folder can remain unchanged
5) To update the Utility code must be done with care, API should
stay the same
/****************************************************/
To run the code, it will be in the menu of ./driverForGraphClustering
## Input parameters that can be customized:
`links` A numeric matrix of network edges.
`coloring` (1) An integer between 0 and 3 that controls the distance-1 graph coloring heuristic used to partition independent sets of vertices in a graph for parallel processing. * 0 - No coloring.
* 1 - (Default) Distance-1 graph coloring. Every vertex receives a color and no two neighbors have the same color.
* 2 – Distance-1 graph coloring, rebalanced for evenly distributed color classes (#nodes per color).
* 3 - Incomplete coloring, limited to `numColors`, by default 16.
`numColors` (16): An integer between 1 and 1024. Limits graph coloring. Only used if `coloring=3`, incomplete coloring, is set.
`C_thresh` (1e-6): The threshold value determines how long the algorithm iterates. This value (a real number between 0 and 1; >0) is checked when coloring is enabled. The algorithm will stop iterating when the gain in modularity becomes less than `C_thresh`. A final iteration is performed using the value specified by the `threshold` parameter. Desired value for `C_thresh` should be larger than `threshold` for gains in performance.
`minGraphSize` (1,000): Determines when multi-phase operations should stop. Execution stops when the coarsened graph has collapsed the current graph to a fewer than `minGraphSize` nodes. `threshold` (1e-9): The threshold value determines how long the algorithm iterates. It is a real number between 0 and 1 (>0). The algorithm will stop the iterations in the current phase when the gain in modularity is less than `threshold`. The algorithm can enter the next phase based on the size of the coarsened graph. `syncType` (0) An integer between 0 and 4 that controls synchronization between threads. Only applies if `coloring=0` (no coloring). Synchronization forces the parallel algorithm to behave similar to the execution of a serial Louvain implementation.
* 0 - (Default) No sync (gives the best performance in terms of runtime).
* 1 - Full sync (behaves like a serial algorithm).
* 2 - Neighborhood sync (a hybrid between 0 and 1).
* 3 - Early termination (stops processing a vertex if it has not changed its community for the past few iterations – leads to gain in performance).
* 4 - Full sync with early termination (hybrid of 1 and 3).
`basicOpt` (1) Either 0 or 1, controls the representation of intermediate data structures.
* 0 – Uses stl::map data structure. While it has a smaller memory footprint and computational efficiency, excessive memory allocations and deallocations can lead to loss of performance.
* 1 - (Default) Use stl::vector to replace the functionality of stl::map. This option comes at the expense of a larger memory footprint and loss in performance when the algorithm has a large number of communities and does not converge quickly (does not have a good community structure). In general, this option can be faster than the stl::map option for inputs with good community structure.
## Further Details:
The only required parameter is `links`. All other parameters are tuning parameters that control how speed vs accuracy vs memory tradeoffs are made. We specifically note that the original Louvain algorithm is non-deterministic and varies considerably for different input structures. Grappolo inherits these limitations with added complications from parallelization.
## Return Value:
A list with two elements:
* `modularity` - The modularity of the computed partitioning of the network into a set of non-overlapping clusters (communities or partitions). Modularity is a measure of the connectedness in a given network when partitioned based on a given approach.
* `communities` - A vector where the i'th value is the cluster number that the i'th node in the links matrix has been assigned to.

About

OpenMP implementation of Graph Community Detection, with a number of parallel heuristics/approximate computing techniques

Resources

Stars

23 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages