Skip to main content

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 path
  • tsv (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 found
  • num_nodes: Number of nodes in the clustering
  • data: List of tuples (node_id, cluster_id, k_value, modularity) for all clustered nodes
  • clusters: List of C++ Cluster objects with nodes, k_value, and modularity attributes

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

ikc-0.1.0.tar.gz (18.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ikc-0.1.0-cp39-cp39-macosx_10_9_x86_64.whl (131.9 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

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

Hashes for ikc-0.1.0.tar.gz
Algorithm Hash digest
SHA256 62c99edcc98037cd532b56dc7216c22d44f2419e57b1fa1f039209baea254647
MD5 80990929c4c95bc5ea78a4fc9b6b8eed
BLAKE2b-256 39866785bbb57dfc4356237fee49ad76a2451261ab96713fc0cb74dfab6a772d

See more details on using hashes here.

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

Hashes for ikc-0.1.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 99a2e1843d7935eead8813a855edb7259e4f485e47d01d8ee2beb25205044877
MD5 3204d0ea36306d801b15208f3dff29c7
BLAKE2b-256 1dcf82ae523206cbb106b00010367e6f20f2adb7d1bb9c342e5295c9d635ef73

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page