Skip to content

meelgroup/louvain-community

Repository files navigation

License: LGPL v3 build

Multi-criteria community detection library

This library makes the Louvain community detection system significantly easier to use. Example code:

#include "louvain_communities/louvain_communities.h"
#include <iostream>

int main(int /*argc*/, char** /*argv*/)
{
    LouvainC::Communities graph;

    //First community
    graph.add_edge(1, 2, 2L);
    graph.add_edge(1, 3, 2L);
    graph.add_edge(1, 4, 2L);
    graph.add_edge(2, 3, 2L);
    graph.add_edge(2, 4, 2L);
    graph.add_edge(3, 4, 2L);

    //Second community
    graph.add_edge(4, 5, 2L);
    graph.add_edge(4, 6, 2L);
    graph.add_edge(4, 7, 2L);
    graph.add_edge(5, 6, 2L);
    graph.add_edge(5, 7, 2L);
    graph.add_edge(6, 7, 2L);

    //Weak connection between 1st and 2nd communities
    graph.add_edge(1, 4, 0.1L);

    //Calculate communities
    gplain.calculate(true);

    //Get community mapping
    auto r = gplain.get_mapping();
    for(auto& vert_to_comm: r) {
        std::cout << "Vertext " << vert_to_comm.first
        << " is in community " << vert_to_comm.second << std::endl;
    }
}

How to build

To build:

git clone https://github.com/meelgroup/louvain-community
cd louvain-community
mkdir build && cd build
cmake ..
make -j4
sudo make install

In case you are going to use the system in another cmake based project, you don't even need to install. In these cases, you can look for the library in your CMakeLists.txt file via:

find_package(louvain_communities CONFIG)
if (louvain_communities_FOUND)
    message(STATUS "Found Louvain Communities library")
    message(STATUS "Louvain Communities dynamic lib: ${LOUVAIN_COMMUNITIES_LIBRARIES}")
    message(STATUS "Louvain Communities include dirs: ${LOUVAIN_COMMUNITIES_INCLUDE_DIRS}")
else()
    message(FATAL_ERROR "Cannot find Louvain Communities libraries. Please install it! Exiting.")
endif()

To compile a static library simply do:

git clone https://github.com/meelgroup/louvain-community
cd louvain-community
mkdir build && cd build
cmake -DSTATICCOMPILE=ON ..
make -j4
sudo make install

Testing

To test:

pip install python-louvain

git clone https://github.com/jlguillaume/louvain
cd louvain
make -j4

git clone https://github.com/meelgroup/louvain-community
cd louvain-community
mkdir build && cd build
ln -s ../scritps/* .
ln -s ../../louvain/louvain .
./mytest.py 50-10-9-q.cnf.gz.no_w.cnf
awk '{print "gplain.add_edge(" $1 ", " $2 ", " $3 "L);"}' graph.txt > ../src/mygraph.cpp
cmake -DENABLE_TESTING=ON ..
make -j4
./test.sh 50-10-9-q.cnf.gz.no_w.cnf

To check how well the communities fit a graph generated via VIG ("Variable Incidence Graph") graph-generation from a DIMACS CNF and a layout engine using the spring method:

pip install python-louvain
git clone https://github.com/meelgroup/louvain-community
cd louvain-community
mkdir build && cd build
ln -s ../scritps/* .
./mytest.py 50-10-9-q.cnf.gz.no_w.cnf --draw

References

Based on Community Detection "Louvain", version 0.3, from SourceForge

Based on the article "Fast unfolding of community hierarchies in large networks" Copyright (C) 2008 V. Blondel, J.-L. Guillaume, R. Lambiotte, E. Lefebvre

And based on the article Copyright (C) 2013 R. Campigotto, P. Conde Céspedes, J.-L. Guillaume

Authors: E. Lefebvre, adapted by J.-L. Guillaume and R. Campigotto, Mate Soos