# teaching

information about current and past courses

#### Current Courses

- On sabbatical, Fall 2023 and Spring 2024

##### Previous Courses

**Courses @Amherst**

##### Spring 2023

**COSC 225: Algorithms and Visualization**## course description

In this course, we will explore how algorithmic and aesthetic principles can be employed in concert to create interactive graphical content on the web. Topics will include design layout and combinatorial optimization, the geometry of color spaces, graph drawing, computational geometry, generative design, and visualization of data and algorithms. In addition, we will consider issues of algorithmic efficiency in performing computationally intensive tasks. We will investigate topics from both theoretical and applied perspectives. Students will code projects using standard web development tools: HTML, CSS, and JavaScript.

**COSC 273: Parallel and Distributed Computing**## course description

Modern computers are becoming increasingly parallel, with many cores or processors working concurrently to perform a single task. In order to utilize the full power of modern computers, it is essential to write programs that exploit parallelism. This course introduces students to the art and science of writing parallel programs. We consider two computing paradigms: shared memory and message passing. We will introduce standard libraries for writing efficient code in each paradigm, and create software that is many times faster than any serial (non-parallel) program performing the same task.

##### Fall 2022

**COSC 311: Algorithms**## course description

This course addresses the design and analysis of computer algorithms. Topics include: set algorithms such as sorting and searching, graph algorithms, string algorithms, and matrix algorithms. Algorithm design paradigms, including the divide-and-conquer, dynamic programming, and greedy paradigms, will be emphasized. The course will end with a discussion of the theory of NP-completeness and its implications.

##### Spring 2022

**COSC 211: Data Structures**## course description

A fundamental problem in computer science is that of organizing data so that it can be used effectively. This course introduces basic data structures and their applications. Major themes are the importance of abstraction in program design and the separation of specification and implementation. Program correctness and algorithm complexity are also considered. Data structures for lists, stacks, queues, dictionaries, sets, and graphs are discussed. This course will provide advanced programming experience.

**COSC 373: Distributed Algorithms**## course description

A distributed system consists of a network of processors that communicate by exchanging messages. No processor has a global view of the network, so neighboring processors must communicate in order for the system to perform a given task. In this course, we will study the theory of distributed systems. We will consider fundamental algorithmic tasksâ€”for example, finding spanning trees, maximal independent sets, and graph coloringâ€”in several models of distributed computing. Our goal is to understand under what conditions these tasks can be performed efficiently, if at all. While this course is primarily theoretical, we will discuss applications of the theory to modern computing paradigms (e.g., MapReduce).

##### Fall 2021

##### Spring 2021

##### Fall 2020

- COSC 112: Introduction to Computer Science II

**Courses Elsewhere**

##### Fall/Winter 2018 (MPI/University of Saarland)

- Advanced Seminar: Algorithms on Digraphs

##### Spring 2016 (UCLA)

- PIC10B: Intermediate Programming

##### Fall 2015 (UCLA)

- Math 475: Teaching College Mathematics

##### Fall 2014 (UCLA)

- Math 32AH: Calculus of Several Variables (Honors)