CS221: Artificial Intelligence: Principles and Techniques

For last year's page, click here.
Course staff:

Guest lecturer:

Course assistants:

Daniel Selsam

Gregory Soh

Ajay Sohmshetty

Anand Dhoot

Anvita Gupta

Benoit Zhou

Chinmayee Shah

Chuma Kabaghe

David Golub

Andrew Han

Jacob Hoffman

Jaebum Lee

Megha Srivastava

Richard Diehl Martinez

Sudarshan Seshadri

Stephanie Dong

Vivekkumar Patel

Hao Wang

William Bakst

Yilong Li

Zhangyuan Wang

Steven Diamond

Kaiyi (Alexander) Fu

Yongshang Wu

Yianni Laloudakis

Benjamin Petit

Vivian Hsu

Aaron Effron

Amita Kamath
How to contact us: Please use Piazza for all questions related to lectures, homeworks, and projects. For SCPD students, email scpdsupport@stanford.edu or call 650-741-1542.
Announcements: see Piazza. NOTE: If you enrolled in this class on Axess, you should be added to the Piazza group automatically, within a few hours. You can also register independently; there is no access code required to join the group.
Calendar: look here for dates/times of all lectures, sections, office hours, due dates.
Grades: click here to check your grades and autograder feedback.
What is this course about? What do web search, speech recognition, face recognition, machine translation, autonomous driving, and automatic scheduling have in common? These are all complex real-world problems, and the goal of artificial intelligence (AI) is to tackle these with rigorous mathematical tools. In this course, you will learn the foundational principles that drive these applications and practice implementing some of these systems. Specific topics include machine learning, search, game playing, Markov decision processes, constraint satisfaction, graphical models, and logic. The main goal of the course is to equip you with the tools to tackle new AI problems you might encounter in life.
Prerequisites: This course is fast-paced and covers a lot of ground, so it is important that you have a solid foundation on both the theoretical and empirical fronts. You should have taken the following classes (or their equivalents):
Reading: There is no required textbook for this class, and you should be able to learn everything from the lecture notes and homeworks. However, if you would like to pursue more advanced topics or get another perspective on the same material, here are some books: Bear in mind that some of these books can be quite dense and use different notation terminology, so it might take some effort to connect up with the material from class.
Office Hour Logistics

Installing Zoom




Written assignments: Homeworks should be written up clearly and succinctly; you may lose points if your answers are unclear or unnecessarily complicated. Here is an example of what we are looking for. You are encouraged to use LaTeX to writeup your homeworks (here's a template), but this is not a requirement. You will receive one (1) bonus point for submitting a typed written assignment (e.g. LaTeX, Microsoft Word). We will accept scanned handwritten assignments but they will not receive the bonus point.
Programming assignments: The grader runs on Python 2.7, which is not guaranteed to work with newer versions (Python 3) or older versions (below 2.7). Please use Python 2.7 to develop your code.

The programming assignments are designed to be run in GNU/Linux environments, such as cardinal.stanford.edu. Most or all of the grading code may incidentally work on other systems such as MacOS or Windows, and students may optionally choose to do most of their development in one of these alternative environments. However, no technical support will be provided for issues that only arise on an alternative environment. Moreover, no matter what environment is used during development, students must confirm that their code (specifically, the original grader.py script operating on the student's submission.py) runs on cardinal.stanford.edu, and must submit their assignments from cardinal.stanford.edu as well. The final grading will be run on GNU/Linux servers.

The submitted code will not be graded if it has one of the following issues:

Collaboration policy and honor code: You are free to form study groups and discuss homeworks and projects. However, you must write up homeworks and code from scratch independently, and you must acknowledge in your submission all the students you discussed with. The following are considered to be honor code violations: When debugging code together, you are only allowed to look at the input-output behavior of each other's programs (so you should write good test cases!). It is important to remember that even if you didn't copy but just gave another student your solution, you are still violating the honor code, so please be careful. We periodically run similarity-detection software over all submitted student programs, including programs from past quarters and any solutions found online on public websites. Anyone violating the honor code will be referred to the Office of Judicial Affairs. If you feel like you made a mistake (it can happen, especially under time pressure!), please reach out to Percy or the head CA; the consequences will be much less severe than if we approach you.


Electronic Submission: All assignments (homework problems and project milestones) must be submitted using the submit script by 11pm (23:00, not 23:59). Please note that the submission script only works on cardinal.

To submit:

  1. Copy your submission files (usually <assignment ID>.pdf and submission.py) to cardinal.stanford.edu. You can use a graphical interface (SecureFX, FileZilla, Fugu) or the following command:

    scp <your submission file(s)> <your SUNetID>@cardinal.stanford.edu:
  2. Login to cardinal.stanford.edu:

    ssh <your SUNetID>@cardinal.stanford.edu
    For Windows, you can use SecureCRT, PuTTY, or Cygwin. Make sure you use the binary transfer mode, as the ASCII transfer mode will silently damage PDF files!
  3. Make sure the original grader.py script (operating on your submission.py) runs correctly on cardinal. (Otherwise, the code will not be graded.)

  4. Type:

    /usr/bin/python /usr/class/cs221/WWW/submit.py <assignment ID> <directory with your submission files>
    For example, if the assignment ID is foundations and you are in the same directory as your submission files, type:
    /usr/bin/python /usr/class/cs221/WWW/submit.py foundations ./

You are allowed to submit an assignment a maximum of ten (10) times. Each submission will replace the previous.

Since we do not accept the assignments from other submission methods (e.g., email), please make sure you can use the submit script. Do not wait until the deadline. If anything goes wrong, please ask a question on Piazza or contact a course assistant. Do not email us your submission. Partial work is better than not submitting any work.

You can check here for confirmation of your submission. For assignments with a programming component, we will automatically sanity check your code in some basic test cases, but we will grade your code on additional test cases. Important: just because you pass the basic test cases, you are by no means guaranteed to get full credit on the other test cases, so you should test the program more thoroughly yourself!

Unless the assignment instructs otherwise, all of your code modifications should be in submission.py and all of your written answers in <assignment ID>.pdf.

For the project milestones, make sure the same one member of your group submits on behalf of the entire group. The submission should include a group.txt file which should contain the SUNetIDs of the entire group, one per line. Do not include your names!

Late days: An assignment is $\lceil d \rceil$ days late if it is turned in $d$ fractional days late (note that this means if you are $1$ second late, $d = 1/(24 \times 60 \times 60)$ and it is 1 day late). You have eight (8) late days in total that can be distributed among the assignments (except for p-poster, p-peer, and p-final) without penalty. There is a maximum of two (2) late days that can be used per assignment. If you exceed this limit by $k$ hours, then you will incur a multiplicative penalty factor of $\max(1 - k/5, 0)$. For example, if you get $40$ points and turn in your homework 2 days + 1.5 hours after the deadline, then your effective score is $40(1 - 1.5/5) = 28$. If you exceed $5$ hours, you will receive $0$ points. You get a zero after all your late days run out, but we reserve the right to give partial credit in extenuating circumstances.
Regrades: If you believe that the course staff made an objective error in grading, then you may submit a regrade request. Remember that even if the grading seems harsh to you, the same rubric was used for everyone for fairness, so this is not sufficient justification for a regrade. If you do choose to submit a regrade request, please submit it as a private Piazza post with the 'regrade' tag. Any requests submitted over email or in person will be ignored. Regrade requests for a particular assignment are due by Sunday 11:59pm, one week after the grades are returned. Note that we may regrade your entire submission, so that depending on your submission you may actually lose more points than you gain.