Fast C++ implementation of Iterative K-Core Clustering with Python bindings
Project description
IKC - Iterative K-Core Clustering
Fast C++ implementation of Iterative K-Core Clustering with Python wrapper.
Project Structure
ikc/
├── app/ # C++ application
├── lib/ # C++ libraries
├── python/ # Python wrapper
│ ├── ikc/ # Python package
│ └── example.py
├── data/ # Test datasets
└── build/ # Build directory
Building the C++ Executable
cd build
cmake ..
make
The compiled executable will be at build/ikc.
C++ Command-Line Usage
./ikc -e <graph_file.tsv> -o <output.csv> [-k <min_k>] [-t <num_threads>] [-q] [--tsv]
Options
-e <graph_file.tsv>- Path to input graph edge list (TSV format)-o <output.csv>- Path to output file-k <min_k>- Minimum k value for valid clusters (default: 0)-t <num_threads>- Number of threads (default: hardware concurrency)-q- Quiet mode (suppress verbose output)--tsv- Output as TSV (node_id cluster_id) without header
Examples
# Run with default settings (CSV output with all columns)
./ikc -e data/cit_hepph.tsv -o output.csv
# Run with min_k=10 and TSV output
./ikc -e data/cit_hepph.tsv -o output.tsv -k 10 --tsv
# Run with 8 threads in quiet mode
./ikc -e data/cit_hepph.tsv -o output.csv -k 10 -t 8 -q
Output Formats
CSV format (default):
node_id,cluster_id,k_value,modularity
3306,1,30,1.0
9803315,1,30,1.0
TSV format (with --tsv flag):
3306 1
9803315 1
Python Wrapper
The Python wrapper uses pybind11 to directly bind the C++ code, providing:
- Fast performance (no subprocess overhead)
- Clean Python API
- No heavy dependencies (no pandas required)
Installation
Option 1: Install from PyPI (once published):
pip install ikc
Option 2: Install from source:
Install dependencies:
pip install -r requirements.txt
Install the Python package:
pip install -e .
This will automatically compile the C++ extension and install the Python package.
Alternatively, install in one step (pip will handle dependencies):
pip install -e .
Verify installation:
python3 -c "import ikc; print('IKC wrapper installed successfully!')"
Python Usage
import ikc
# Load a graph from a TSV edge list file
g = ikc.load_graph('net.tsv')
# Run the IKC algorithm with min_k=10
c = g.ikc(10)
# Save results as TSV (node_id, cluster_id, no header)
c.save('out.tsv', tsv=True)
# Or save as CSV with all columns (node_id, cluster_id, k_value, modularity)
c.save('out.csv', tsv=False)
# Access clustering information
print(f"Number of clusters: {c.num_clusters}")
print(f"Number of nodes: {c.num_nodes}")
# Access the underlying data as list of tuples
print(c.data[:10]) # First 10 rows
Python API Reference
ikc.load_graph(graph_file, num_threads=None, verbose=False)
Load a graph from a TSV edge list file.
Parameters:
graph_file(str): Path to the graph edge list file (TSV format)num_threads(int, optional): Number of threads for loading (default: hardware concurrency)verbose(bool): Print loading progress (default: False)
Returns:
Graph: Graph object ready for clustering
Graph.ikc(min_k=0, verbose=False)
Run the Iterative K-Core Clustering algorithm.
Parameters:
min_k(int): Minimum k value for valid clusters (default: 0)verbose(bool): Print algorithm progress (default: False)
Returns:
ClusterResult: Object containing the clustering results
ClusterResult.save(filename, tsv=False)
Save clustering results to a file.
Parameters:
filename(str): Output file pathtsv(bool): If True, save as TSV with only node_id and cluster_id (no header). If False, save as CSV with all columns (default: False)
ClusterResult Properties
num_clusters: Number of clusters foundnum_nodes: Number of nodes in the clusteringdata: List of tuples(node_id, cluster_id, k_value, modularity)for all clustered nodesclusters: List of C++ Cluster objects withnodes,k_value, andmodularityattributes
Python Example
import ikc
# Load graph with 4 threads
g = ikc.load_graph('data/cit_hepph.tsv', num_threads=4)
print(g) # Graph(file='...', nodes=34546, edges=420877)
# Run IKC with min_k=10
clusters = g.ikc(min_k=10)
# Print summary
print(clusters) # ClusterResult(nodes=34546, clusters=27639)
# Save in TSV format
clusters.save('output.tsv', tsv=True)
# Save in CSV format with all columns
clusters.save('output.csv', tsv=False)
# Access the data (first 5 rows)
for row in clusters.data[:5]:
node_id, cluster_id, k_value, modularity = row
print(f"Node {node_id} in cluster {cluster_id}")
# Get cluster statistics
print(f"Total clusters: {clusters.num_clusters}")
print(f"Total nodes: {clusters.num_nodes}")
Run Example Script
python3 python/example.py
Requirements
C++
- CMake 3.10+
- C++17 compatible compiler
- OpenMP support (for parallel graph loading)
Python
- Python 3.7+
- pybind11 >= 2.6.0 (automatically installed with
pip install)
Input Format
The input graph file should be a TSV (tab-separated) edge list with two columns:
node1 node2
node3 node4
...
No header required. Nodes can be any integer IDs.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ikc-0.1.0.tar.gz.
File metadata
- Download URL: ikc-0.1.0.tar.gz
- Upload date:
- Size: 18.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
62c99edcc98037cd532b56dc7216c22d44f2419e57b1fa1f039209baea254647
|
|
| MD5 |
80990929c4c95bc5ea78a4fc9b6b8eed
|
|
| BLAKE2b-256 |
39866785bbb57dfc4356237fee49ad76a2451261ab96713fc0cb74dfab6a772d
|
File details
Details for the file ikc-0.1.0-cp39-cp39-macosx_10_9_x86_64.whl.
File metadata
- Download URL: ikc-0.1.0-cp39-cp39-macosx_10_9_x86_64.whl
- Upload date:
- Size: 131.9 kB
- Tags: CPython 3.9, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
99a2e1843d7935eead8813a855edb7259e4f485e47d01d8ee2beb25205044877
|
|
| MD5 |
3204d0ea36306d801b15208f3dff29c7
|
|
| BLAKE2b-256 |
1dcf82ae523206cbb106b00010367e6f20f2adb7d1bb9c342e5295c9d635ef73
|