Dr Ciaran McCreesh
- Research Fellow (School of Computing Science)
I'm interested in solving hard combinatorial problems in practice, particularly in the areas of graph theory and subgraph finding. Theoretically, these problems should take exponential time to solve, but in practice algorithms based upon symbolic artificial intelligence techniques like constraint programming and boolean satisfiability can often exactly solve large instances very quickly. My main research questions are:
- What can we do to close the gap between theoretical worst-case results, and what we see in practice? I am particularly interested in using empirical algorithmics and computational and scientific experiments to gain an understanding that can't be reached through theory alone.
- Can we use empirical algorithmics techniques to design better algorithms? For example, can we measure what solvers are doing during search, and use this to improve performance when a solver encounters an instance it finds hard? I have also worked on exploiting parallel hardware such as bit-parallelism, multi-core parallelism and high performance computing to accelerate algorithm performance.
- Why should we trust the outputs of these algorithm implementations? Solvers are increasingly being used autonomously in ways which directly affect people's safety, lives, and livelihoods, without human oversight. However, we know that most solvers are buggy, and will occasionally output an incorrect answer. Conventional software engineering testing techniques fail to detect these bugs, and formal methods are too expensive to use in practice. Some of my recent research looks at proof logging or certifying as an alternative. The idea is that alongside an output, a solver produces a mathematical proof that this answer is correct, which can be stored and audited by a third party.
- How can we make techniques developed in constraint programming and related areas more accessible to developers? We know, for example, that vanilla backtracking search is a bad idea, but techniques like restarts and nogood recording are not widely implemented due to the difficulty in programming them correctly. Similarly, we know how to do parallel search in theory, but few algorithm implementations actually do this. Could we develop libraries or algorithm skeletons to help?
- More broadly, can we develop a discipline of algorithm engineering that focuses on how to design and implement small, efficient, correct pieces of code, rather than the large systems with uncertain requirements usually covered by software engineering?
- McIlree, Matthew
Proof Logging for Constraint Propagation Algorithms