Stephen A. Edwards Columbia University Crown
COMS W4995 003
Parallel Functional Programming
Fall 2020

General Information

Class meets Mondays, Wednesdays 5:40 - 6:55 PM in Online; see Courseworks.


Name Email Office hours Location
Prof. Stephen A. Edwards F 2-4 Online
Shravan Karthik Th 2-4 Online
Benjamin Flin W 7-9 Online
Garrison Grogan F 5-7 Online


Prerequisites: COMS 3157 Advanced Programming or the equivalent. Knowledge of at least one programming language and related development tools/environments required. Functional programming experience not required.

Functional programming in Haskell, with an emphasis on parallel programs.

The goal of this class is to introduce you to the functional programming paradigm. You will learn to code in Haskell; this experience will also prepare you to code in other functional languages. The first half the the class will cover basic (single-threaded) functional programming; the second half will cover how to code parallel programs in a functional setting.


Date Lecture Notes Due
Wed Sep 9 Introduction
Basic Haskell
Mon Sep 14 Types and Typeclasses
Wed Sep 16 Basic Function Definitions
Fri Sep 18 (no lecture; turn in homework)
Homework 1 .hs filehw1.hs
Mon Sep 21 Recursion and Higher Order Functions
Wed Sep 23 (Recursion contd.)
Mon Sep 28 Using and Defining Modules
Wed Sep 30 User-Defined Types
Fri Oct 2 (no lecture; turn in homework)
Homework 2 .hs filehw2.hs
Mon Oct 5 (User-Defined Types contd.)
Wed Oct 7 (User-Defined Types contd.)
Mon Oct 12 I/O
Wed Oct 14 Functors
Sun Oct 18 (no lecture; turn in homework)
Homework 3 .hs filehw3.hs
Mon Oct 19 (Functors contd.)
Wed Oct 21 Monads
Mon Oct 26 (Monads contd.)
Wed Oct 28 (Monads contd.)
Fri Oct 30 (no lecture; turn in homework)
Homework 4 .zip
Mon Nov 2 Election Day Holiday
Wed Nov 4 (Monads contd.)
Mon Nov 9 Lazy and Parallel Evaluation
Wed Nov 11 Strategies
Mon Nov 16
Wed Nov 18
Sun Nov 22 (no lecture; turn in homework)
Homework 5 .zip
Mon Nov 23 The Par Monad
Tue Nov 24 (no lecture; turn in proposal)
Project Proposal
Wed Nov 25 Thanksgiving Holiday
Mon Nov 30 The Haskell Tool Stack
Wed Dec 2 The Lambda Calculus
Mon Dec 7
Wed Dec 9 Repa: Regular Parallel Arrays
Mon Dec 14 Accelerate: GPU Arrays
Wed Dec 23 Final Project Report and Presentations


Backgammon: Minimax Parallel AI (BF)
pdfProposal pdfReport ArchiveFiles
Archit Choudhury and Tejit Pabari
Hex: Minimax AI for Game of Hex (BF)
pdfProposal pdfReport ArchiveFiles
Eric Feng and Cesar Ramos Jr.
Minimax: 2048 Game Solver (BF)
pdfProposal pdfReport ArchiveFiles
Gabriel Clinger and Matthew Ottomano Jr.
Nonogram2: Nonogram Solver (BF)
pdfProposal pdfReport ArchiveFiles
Selena Huang and Tian Low
Nonogram1: Nonogram Solver (BF)
pdfProposal pdfReport ArchiveFiles
Manav Goel and Tanvi Hisaria
Othello: Othello Playing AI (BF)
pdfProposal pdfReport ArchiveFiles
Bryanna Geiger
Enigma: Decryption (GG)
pdfProposal pdfReport ArchiveFiles
Samuel Meshoyrer and Evan Mesterhazy
Life1: Crossword Generator (GG)
pdfProposal pdfReport ArchiveFiles
Gustaf Ahdritz and Lucie Le Blanc
Life2: Cellular Automata (GG)
pdfProposal pdfReport ArchiveFiles
Eric Jing
Life3: Tree Modeling using Space Colonization (GG)
pdfProposal pdfReport ArchiveFiles
Justin Kim
NBody: Celestial Body Simulator using Barnes-Hut (GG)
pdfProposal pdfReport ArchiveFiles
Hans Montero and Rhys Murray
Gradient: Gradient Descent Optimizer (SE)
pdfProposal pdfReport ArchiveFiles
Riya Chakraborty and Max Helman
Heat: Relaxation-based Heat Diffusion Solver (SE)
pdfProposal ArchiveReport
YungChing Lin and Cody Morrin
Mandelbrot: Fractal Generator (SE)
pdfProposal pdfReport ArchiveFiles
Declan O'Reilly
SAT: Parallel SAT Solver with DPLL (SE)
pdfProposal pdfReport ArchiveFiles
Wonhyuk Choi and Andrew de Soler
Sorting: Parallel Functional Sorting (SE)
pdfProposal pdfReport ArchiveFiles
Benjamin Flin and Jay Karp
DPLL: SAT Solver (SE)
pdfProposal pdfReport ArchiveFiles
Maxwell Levatich
AutoComplete: Word Prediction (SK)
pdfProposal pdfReport ArchiveFiles
Shengkai Li and Wenqian Yan
Bellman-Ford: Graph Shortest Path (SK)
pdfProposal pdfReport ArchiveFiles
Zhe Hua
SixDegrees: Longest minimum path in a big graph (SK)
pdfProposal pdfReport ArchiveFiles
Darrion Vinson
Tetris: Parallel AI Player (SK)
pdfProposal pdfReport ArchiveFiles
Trey Gilliland and Derek Zhang
TFIDF: Document Keyword Identification (SK)
pdfProposal pdfReport ArchiveFiles
Daniel Scanteianu and Yuanhe Ye

star My favorites

The Project

The project should be a parallel implementation of some algorithm/technique in Haskell. Marlow parallelizes a Sudoku solver and a K-means clustering algorithm in his book; these are baseline projects. I am looking for something more sophisticated than these, but not dramatically more complicated.

Do the project alone or in pairs. List all your names and UNIs in the proposal and final report

There are three deliverables:

  1. A one- or two-page proposal that gives the TAs and me an inda of what you plan to do so we can give you feedback about restricting or increasing the scope. Upload a PDF file to Courseworks describing your project and team members, if any.
  2. A report describing your project: what you implemented and how, some performance figures indicating how much better your solution runs in parallel (e.g., time its execution on one core and compare that to running it on multiple cores), and a full listing of the code you wrote. Upload a multi-page PDF file to Courseworks; due during Finals Week.
  3. Along with your report, submit a .tar.gz file including the code and test cases for your project. Make it so I can compile and run it, perhaps by including a README file with instructions for running it with the Haskell Stack. Due with the repot.

Strive for a little well-written, well-tested program that handles everything gracefully rather than a large, feature-filled system. If you're short on time, drop a feature in preference to improving the code you have.

Other project ideas include any sort of map/reduce application, graphics rendering, physical simulation (e.g., particles), parallel grep or word count, a Boolean satisfiability solver, or your favorite NP-complete problem. If your program is algorithmically simple (e.g., word count or word frequency count), it need to scale to huge inputs. AI (as opposed to machine learning) applications, such as game playing algorithms, are generally a good idea. Algorithms that have a lot of matrix multiplication at their core (e.g., deep learning) are less suitable.

Feel free to ask the instructor or TAs for project advice or criticism



Class Policies

Valid HTML 4.01Valid CSS