### Teaching

During 2016-2017 I will teach the following courses:

• Computational Thinking (16 lectures; COMP1051)
This is a Level 1 module that explores the importance of computation and computational thinking in the modern world, and the impact it has on areas not immediately associated with Computer Science. In the first half (which is the half I teach) I give a glimpse into topics such as hardware, software, how hardware executes software, the nature of solving problems by computers, some problem-solving techniques, how we measure the efficiency of our problem-solving algorithms, and the limitations of computers and computation (in a sense, it's a "crash course" in Computer Science). Students also get to grips with the programming language Python and find out more about one of the greats of computing, namely Alan Turing. In the second half of the module (taught by others), students look at two or three specific problem domains and explore how computational thinking has helped in these areas. A typical example is molecular biology, which has been revolutionised by the use of computational techniques in genetic sequencing, DNA analysis and phylogenetic reconstruction. There's a video advertising this module available here.
• Logic and Discrete Structures (19 lectures; a sub-module of the module COMP1021 Mathematics for Computer Science)
This is a Level 1 sub-module that introduces students to to fundamental concepts from logic, discrete structures, and mathematics that are necessary for and relevant to modern Computer Science. The syllabus covers: propositional logic; the proof systems Natural Deduction and Resolution; sets, functions, and relations; first-order logic; and mathematical proof techniques. The other sub-module is called Discrete Mathematics and LInear Algebra.
• Artificial Intelligence Search (10 lectures; a sub-module of the module COMP2231 Software Methodologies)
After briefly explaining some of the barriers to the efficient solution of problems, this Level 2 sub-module introduces generic problem-solving techniques such as: breadth-first search and uniform-cost search; depth-first search and depth-limited search; greedy best-first search; A*-search; local search; hill climbing; simulated annealing; genetic algorithms; and constraint satisfaction. After explaining some of the design aspects of using intelligent agents to build problem solutions, we put everything together and show how propositional logic can be used to implement an agent's knowledge-base, with new formulae inferred from old using algorithms based on resolution and satisfiability (e.g., Davis-Putnam) that can be implemented with the help of our search methods.
• Interconnection Networks for Parallel Computing (10 lectures; a sub-module of the module COMP4031 Computing Methodologies IV)
This Level 4 sub-module explains the role of interconnection networks in distributed-memory multiprocessors. We consider four core aspects of interconnection networks: topologies (structure, properties, performance and cost); routing (algorithms, deadlock and livelock); flow control and switching (circuit switching, store-and-forward, cut-through, wormhole and virtual channel); and broadcasting (multi-node, single-node scatters and total exchanges). We concentrate on the hypercube, k-ary n-cube and cube-connected cycles topologies.

I also supervise Level 3 and Level 4 project students. This coming year, I have offered the following project themes:

• Data Mining the Research Excellence Framework
• Experimenting with Data Centre Networks using INRFlow
• System-Level Fault Diagnosis
• The Location of 'Big Data' in a Data Centre Network
• Using Heuristic Methods to Solve Hard Problems

(updated 2nd April 2017)