Hello @sunav1411, it’s great to see your interest in this project. @Abhishek has indicated interest as well.
I suggest the following first steps towards developing your proposal:
First, familiarize yourself with the main topics of this project idea, namely graphicality testing, graph construction and degree-preserving randomization (as a means of unbiased sampling). I recommend reading the following paper, up to (but not including) section 4: Radware Bot Manager Captcha
You will need to familiarize yourself with the igraph C library and make sure you are comfortable working with it. Getting a PR merged before the application is highly recommended. I looked through the current issues and labelled easier ones with the good first issue
label. Those related to the topic at hand as labelled as degseq
. Please see the issue list at GitHub · Where software is built
First steps for getting started with contributions are here: Quickstart for new contributors · igraph/igraph Wiki · GitHub
Let me now answer your questions:
People who take on this challenge should have a strong interest in discrete mathematics. While the algorithms are all concise, and deceptively simple, understanding them requires some attention, and will necessitate reading some mathematics papers.
To give you a taste, have a look at the Erdős-Gallai graphicality theorem, and think for a moment about how you would check this set of inequalities in linear time: Erdős–Gallai theorem - Wikipedia Then check this (easy to read) paper for the solution: Is This for Real? Fast Graphicality Testing | IEEE Journals & Magazine | IEEE Xplore
Generally, the aim of the project is to implement existing algorithms, not to invent new ones. However, ideas for new ones are welcome as well.
An example of a graph construction performance issue is here: `realize_degree_sequence()` (Havel-Hakimi algorithm) has poor performance · Issue #2725 · igraph/igraph · GitHub
A similar issue almost certinaly affects igraph_realize_bipartite_degree_sequence()
.
Notice that most igraph functions have the time complexity indicated in their documentation. When this is not the case (such as with graph realization functions), part of the task is to verify complexity and check if there is a need for improvement.
Note that there are some checks which are not yet implemented, and should be implemented with an algorithm that has good complexity. We will assist with the algorithm, but the main task is writing a production quality implementation. Example: Wishlist: Is a degree sequence potentially connected? · Issue #2727 · igraph/igraph · GitHub
This is a non-exhaustive list of features that are not yet implemented:
- Directed graph construction in
igraph_realize_degree_sequence()
: “largest first” and “smallest first” methods should be updated to choose the largest/smallest degree out of either in- or out-degrees (currently only one is considered)
- Construction of undirected graphs with self-loops but no multi-edges
- Construction of any type of directed non-simple graph
- Test for potentially strongly and weakly connected degree sequence
- Test for threshold sequence
- Degree-preserving rewiring for bipartite, undirected/directed, multigraph, loopy graph cases. Only the undirected simple graph case is implemented (directed simple case is not fully correct, see igraph_rewire cannot reach all directed graphs with the same degree sequence · Issue #1456 · igraph/igraph · GitHub)
- Degree-preserving rewiring while controlling assortativity
- Rewiring that preserves only in-degrees or only out-degrees but not both, and keeps the graph simple.
- Graphicality, construction and rewiring of directed acyclic graphs is a work-in-progress on our side and the literature review / algorithms are not complete yet.
- etc.
Please see the quick start guide I linked, as well as existing benchmarks / tests. There are some “good first issues” which are purely on benchmarking. Developing benchmarks for the existing degree-based construction functions can also be a good first step.
There are already partial benchmarks for igraph_is_graphical()
and igraph_degree_sequence_game()
.