Programming of Simulation, Analysis, and Learning Systems
(Semester 2 2021)

This course is designed to build understanding of programming, software architecture, and general software development in the context of mathematical, statistical, and machine learning applications. Students learn the basic elements of software development in the context of mathematics and data-science. The course teaches students to implement algorithms from numerical mathematics, simulation, and machine learning, all using solid software development practices that allow for organized maintainable and extendable software.

The course is aimed at students in their fourth semester (or above) of a mathematics degree. It assumes knowledge of calculus, linear algebra, elementary statistics, basic probability, and elementary concepts of discrete mathematics. It also assumes some prior experience in scientific/computational/statistical scripting, using languages such as R, MATLAB, Python, or similar. No specific detailed knowledge of such programming is assumed, however it is assumed that students have seen code, variables, loops, conditionals, and similar constructs previously.

The bulk of the course is taught by industry professionals Dr. Paul Bellette and Dr. Andy Ferris. There are also guest perspective seminars by industry professionals, Dr. Anna Foeglein, Dr. Maithili Mehta, and Dr. Amy Chan. The tutors are Thomas Graham (coordinating tutor), Tom Cranitch, Tina Moghaddam, Elaine Schenk, and Jesse Woods. Parts of the course are also taught by Dr. Paul Vrbik, and the course coordinator is A/Prof. Yoni Nazarathy (y.nazarathy@uq.edu.au).

The focus of the course is programming of systems that involve mathematics and mathematical modelling. This includes the interface of mathematical principles and a programming language as well as tooling and the experience of using solid basic practices that lead to organized and efficient code. It is not a course about a specific programming language. Nevertheless one language needs to be used and studied. The language for this course is the Julia language. Julia is a modern compiled programming language that in many ways is easy to work with like other scripting languages, however it also allows to create very efficient code. In general, the Julia language and the surrounding eco-system focuses on scientific computing and mathematics, and hence it is a good fit for this course. For reference, here are some courses at other universities that use Julia: Computational Thinking at MIT, Top Ten Algorithms from the 20th Century at Cornell, Parallel Computing and Scientific Machine Learning at MIT, and Introduction to Matrix Methods at Stanford, among others. Note that these various generally have goals that differ from the current course, yet their innovative use of Julia is of interest to us.

The course content is broken into 7 study units and 6 items of assessment, details of which are described below.

The course is delivered via weekly lectures which include two theoretical hours per week and one demonstration hour per week. The theoretical lectures also involve some live demonstrations, but focus more on theory, whereas the demonstration hour is mostly made up of live examples. The theoretical lectures ideally take place during Monday 16:00-18:00, and the demonstration hour ideally takes place during Tuesday 17:00-18:00. There are also 3 (guest) one hour perspective lectures (scheduled either on the theoretical hours or demonstration hour). These perspective lectures are aimed at presenting students with further insights about mathematicians and statisticians working with software in industry.

In addition to the lectures there are also practicals aimed at smaller groups and operating both in flexible delivery and external delivery modes. The practicals are aimed to help the students prepare the assessment items and present the students with a chance to work live with help next to them. Practicals are only scheduled on part of the weeks, where tutor staff help students via Piazza throughout.

Key Links

Pillars of Study and Goals

There are 4 main pillars of study in this course:

  1. The use of a variety of features of a programing language (Julia in this case).
  2. Technical tools such as: Unix, git, IDEs, Jupyter.
  3. Mathematical and statistical algorithmic concepts, their theoretical analysis, and implementation.
  4. Solid software development practices - with a view towards employability.
The theoretical lectures, demonstration lectures, perspective lectures, practicals, and online tutor support all aim to help the students build up these pillars of study, with the 6 assessment items serving as goals.

Ideally, after completion of this course a student will have the ability to continue self study of software and programming concepts after getting a 'jump-start' via this course. The student would ideally be able to work independently on projects for more advanced third and fourth year courses, and/or produce efficient code as part of Honours or higher degree research. Importantly, the student would have tools for contributing to open sourced projects, startup-teams, and be hirable in analytic software focused jobs in industry.

Clearly a one semester course cannot transform a mathematician into a software engineer, however it is hoped that through the course content, students will be able to further themselves on such a path if needed.

Study Units

The course is composed of the following 7 study units. Observe that each of the units feeds most of the pillars of study. The early units build up basic Julia, computer science, and tooling knowledge (mostly pillars 1 and 2), whereas the later units focus on deeper mathematical stories, mostly feeding pillars 3 and 4. Specifically with respect to pillar 3 (mathematical and statistical algorithmic concepts), there are four main concepts: numerical mathematics and ODEs (Unit 3), computer algebra systems (Unit 5), Monte Carlo and discrete event simulation (Unit 6), and machine learning (Unit 7). Clearly some of these concepts are often taught (often at greater depth) in other specialized courses. However in this course, the focus is software implementation.

Here is detail of the content of each of the Units:


These are the 6 assessment items. The first 5 are due during semester and worked on progressively during the course. The last item is due during the final exam period. The course does not have a final exam. HW1 and Project 2 are to be worked on in pairs (or groups of 3 in special cases). The other items are individual.

The mark for the weakest of the projects will be replaced by the average of the other two projects. See submission instructions below.


Here is the schedule listing the lecturers, units of study, and practical activity per week. A list of the practicals is below.

Week Monday
Lecturer Units Practical Assessment
1 July-26 July-27 YN+PB* 1 A
2 Aug-2 Aug-3 PB 1+2 B
3 Aug-9 Aug-10 PB 2 HW 1
4 Aug-16 Aug-17 PB 2+3 C
5 Aug-23 Aug-24 PB 3 D HW 2
6 Aug-30 Aug-31 YN+PV 3+4 Quiz (Tuesday) Chan (Monday)
7 Sep-6 Sep-7 YN+PV 4+5
8 Sep-13 Sep-14 PV 5 E
9 Sep-20 Sep-21 PV+AF 5+6 Project 1
Break - -
10 - Oct-5 AF 6
11 Oct-11 Oct-12 AF 6+7 F Foeglein (Tuesday)
12 Oct-18 Oct-19 AF 7 Project 2
13 Oct-25 Oct-26 AF 7 G Mehta (Tuesday)
Exam period Project 3 (Due Nov 20)

* All four lecturers, PB, PV, AF, and YN will be introduced in the first lecture.

Here is a scan of the 2021 UQ Calendar.


There are 7 practicals (A-G) in total and this is a description of each practical.

Submission instructions

Here are some notes regarding hand-in:

Software Installation

It is recommended that you have the following on your machine:

From week 1: From week 3 (or prior): This video describes installation of Julia and IJulia:

With the software installed, please bring your laptop to practicals (and ideally to the lectures). In exceptional circumstances, where you plan to attend a face to face practical and cannot bring your laptop, you may install Julia and the associated software on the Windows desktop machines available in the practical classroom. This is a workable solution but is not ideal. The installation may take several minutes and it is not guaranteed that it will remain on the machine over time. Hence whenever possible, bring your laptop.

Additional Resources

Here are additional resources that may be of use for the course (or for introductory Julia programming in general). None of these are mandatory as there are plenty of examples in the lecture units and practicals. That is, it is recommended that you try running every bit of code from the lectures and practicals, investigate it, look at the Julia help to explore. Nevertheless, you may find some of these additional resources helpful as well:

Back to top