\documentclass[11pt,addpoints,answers]{exam}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Commands for customizing the assignment %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\newcommand{\courseNum}{24-880}
\newcommand{\courseName}{AI Agents for Engineers}
\newcommand{\courseSem}{Spring 2026}
\newcommand{\courseUrl}{\url{https://cmuagents.github.io}}
\newcommand{\hwNum}{Homework 9}
\newcommand{\hwTopic}{VLM and Safety}
\newcommand{\hwName}{\hwNum: \hwTopic}
\newcommand{\outDate}{Sunday March 29nd, 2026}
\newcommand{\dueDate}{Sunday April 5th, 2026}
\newcommand{\taNames}{Peter Pak}
\newcommand{\caNames}{Hardik Choudhary}
\newcommand{\homeworktype}{\string written+prog}
\newcommand{\overleafUrl}{}

%-----------------------------------------------------------------------------
% PACKAGES AND OTHER DOCUMENT CONFIGURATIONS
%-----------------------------------------------------------------------------

\usepackage[margin=1in]{geometry}
\usepackage{amsmath, amsfonts}
\usepackage{enumerate}
\usepackage{graphicx}
\usepackage{titling}
\usepackage{url}
\usepackage{xfrac}
\usepackage{natbib}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{paralist}
\usepackage{epstopdf}
\usepackage{tabularx}
\usepackage{longtable}
\usepackage{multirow}
\usepackage{multicol}
\usepackage[colorlinks=true,urlcolor=blue]{hyperref}
\usepackage{algorithm}
\usepackage{algorithmicx}
\usepackage[noend]{algpseudocode}
\usepackage{float}
\usepackage{enumerate}
\usepackage{array}
\usepackage{environ}
\usepackage{times}
\usepackage{textcomp}
\usepackage{caption}
\usepackage{parskip} % For NIPS style paragraphs.
\usepackage[compact]{titlesec} % Less whitespace around titles
\usepackage[inline]{enumitem} % For inline enumerate* and itemize*
\usepackage{datetime}
\usepackage{comment}
% \usepackage{minted}
\usepackage{lastpage}
\usepackage{color}
% \usepackage{xcolor}
\usepackage[dvipsnames]{xcolor}
\usepackage[final]{listings}
\usepackage{tikz}
\usetikzlibrary{shapes,decorations}
\usepackage{framed}
\usepackage{booktabs}
\usepackage{cprotect}
\usepackage{verbatimbox}
\usepackage{multicol}
\usepackage{hyperref}
\usepackage{subcaption}
\usepackage{mathtools} % For drcases
\usepackage{cancel}
\usepackage[many]{tcolorbox}
\usepackage{soul}
\usepackage[bottom]{footmisc}
\usepackage{bm}
\usepackage{wasysym}
\usepackage{lipsum}

\usepackage{tikz}
\usetikzlibrary{arrows}
\usetikzlibrary{arrows.meta}
\usetikzlibrary{shapes.geometric}
\usetikzlibrary{positioning, arrows, automata, calc}
\usepackage{transparent}
\usepackage{tikz-cd}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Formatting for \CorrectChoice of "exam" %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\CorrectChoiceEmphasis{}
\checkedchar{\blackcircle}

\newenvironment{checkboxessquare}{
    \begingroup
    \checkboxchar{$\Box$} \checkedchar{$\blacksquare$} % change checkbox style locally
    \begin{checkboxes}
    }{
    \end{checkboxes}
    \endgroup
    }

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Better numbering                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% \numberwithin{equation}{section} % Number equations within sections (i.e. 1.1, 1.2, 2.1, 2.2 instead of 1, 2, 3, 4)
% \numberwithin{figure}{section} % Number figures within sections (i.e. 1.1, 1.2, 2.1, 2.2 instead of 1, 2, 3, 4)
% \numberwithin{table}{section} % Number tables within sections (i.e. 1.1, 1.2, 2.1, 2.2 instead of 1, 2, 3, 4)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Custom commands                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand{\blackcircle}{\tikz\draw[black,fill=black] (0,0) circle (1ex);}
\renewcommand{\circle}{\tikz\draw[black] (0,0) circle (1ex);}

\newcommand{\solo}{ \textcolor{orange}{[SOLO]} }
\newcommand{\open}{ \textcolor{blue}{[OPEN]} }


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Code highlighting with listings         %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\definecolor{bluekeywords}{rgb}{0.13,0.13,1}
\definecolor{greencomments}{rgb}{0,0.5,0}
\definecolor{redstrings}{rgb}{0.9,0,0}
\definecolor{light-gray}{gray}{0.95}

\newcommand{\MYhref}[3][blue]{\href{#2}{\color{#1}{#3}}}%

\definecolor{dkgreen}{rgb}{0,0.6,0}
\definecolor{gray}{rgb}{0.5,0.5,0.5}
\definecolor{mauve}{rgb}{0.58,0,0.82}

\lstdefinelanguage{Shell}{
  keywords={tar, cd, make},
  %keywordstyle=\color{bluekeywords}\bfseries,
  alsoletter={+},
  ndkeywords={python3, python, py, javac, java, gcc, c, g++, cpp, .txt, octave, m, .tar},
  %ndkeywordstyle=\color{bluekeywords}\bfseries,
  identifierstyle=\color{black},
  sensitive=false,
  comment=[l]{//},
  morecomment=[s]{/*}{*/},
  commentstyle=\color{purple}\ttfamily,
  %stringstyle=\color{red}\ttfamily,
  morestring=[b]',
  morestring=[b]",
  backgroundcolor = \color{light-gray}
}

\lstset{columns=fixed, basicstyle=\ttfamily,
    backgroundcolor=\color{light-gray},xleftmargin=0.5cm,frame=tlbr,framesep=4pt,framerule=0pt}

\newcommand{\emptysquare}{{\LARGE $\square$}\ \ }
\newcommand{\filledsquare}{{\LARGE $\boxtimes$}\ \ }
\def \ifempty#1{\def\temp{#1} \ifx\temp\empty }


% \newcommand{\squaresolutionspace}[2][\emptysquare]{\newline #1}{#2}
\def \squaresolutionspace#1{ \ifempty{#1} \emptysquare \else #1\hspace{0.75pt}\fi}


\newcommand{\emptycircle}{{\LARGE $\fullmoon$}\ \ }
\newcommand{\filledcircle}{{\LARGE $\newmoon$}\ \ }
\def \circlesolutionspace#1{ \ifempty{#1} \emptycircle \else #1\hspace{0.75pt}\fi}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Custom box for highlights               %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Define box and box title style
\tikzstyle{mybox} = [fill=blue!10, very thick,
    rectangle, rounded corners, inner sep=1em, inner ysep=1em]

\NewEnviron{notebox}{
\begin{tikzpicture}
\node [mybox] (box){
    \begin{minipage}{0.95\textwidth}
        \BODY
    \end{minipage}
};
\end{tikzpicture}
}

%% To HIDE TAGS set this value to 0:
\def\showtags{0}
%%%%%%%%%%%%%%%%
\ifcsname showtags\endcsname \else \def\showtags{1} \fi
% Default to an empty tags environ.
\NewEnviron{tags}{}{}
\if\showtags 1
% Otherwise, include solutions as below.
\RenewEnviron{tags}{
    \fbox{
    \leavevmode\color{blue}\ignorespaces
    \textbf{TAGS:} \texttt{\url{\BODY}}
    }
    \vspace{-.5em}
}{}
\fi

\newtcolorbox[]{answer_box}[1][]{
    % breakable,
    fit,
    enhanced,
    % nobeforeafter,
    colback=white,
    title=Your Answer,
    sidebyside align=top,
    box align=top,
    #1
}

%\pagestyle{fancyplain}
\lhead{\hwName{}
}
\rhead{\courseNum}
\cfoot{\thepage{} of \numpages{}}

\title{\textsc{\hwNum \footnote{Adapted from CMU 10-623 Generative AI Homework Template}}
\\
\textsc{\hwTopic}
\thanks{Compiled on \today{} at \currenttime{}}\\
\vspace{1em}
} % Title

\author{\textsc{\large \courseNum{} \courseName{}}\\
\courseUrl
\vspace{1em}\\
\ifdefempty{\outDate}{}{  OUT: \outDate \\ }
\ifdefempty{\dueDate}{}{  DUE: \dueDate \\ }
  TAs: \taNames{}\\
  CAs: \caNames{}
}

\date{}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Useful commands for typesetting the questions %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% This command will allow long \lstinline{} text to wrap automatically.
\sloppy

%%%%%%%%%%%%%%%%%%%%%%%%%%
% Document configuration %
%%%%%%%%%%%%%%%%%%%%%%%%%%

% Don't display a date in the title and remove the white space
\predate{}
\postdate{}
\date{}

% Don't display an author and remove the white space
% \preauthor{}
% \postauthor{}

% Question type commands
\newcommand{\sall}{\textbf{Select all that apply: }}
\newcommand{\sone}{\textbf{Select one: }}
\newcommand{\tf}{\textbf{True or False: }}




% Changes to examdoc
\qformat{\textbf{{\Large \thequestion \; \; \thequestiontitle \ (\totalpoints \ points)}} \hfill}
\renewcommand{\thequestion}{\arabic{question}}
\renewcommand{\questionlabel}{\thequestion.}

\renewcommand{\thepartno}{\thequestion.\arabic{partno}}
%\renewcommand{\partlabel}{\thequestion.\thepartno.}
\renewcommand{\partlabel}{\thepartno.}

% not working: \renewcommand{\subpartlabel}{(\thequestion.\thepartno.\thesubpart)}
% Commented after adding \question.\thepartno.
%\renewcommand{\partshook}{\setlength{\leftmargin}{0pt}}

\renewcommand{\thesubpart}{\thepartno.\alph{subpart}}
\renewcommand{\subpartlabel}{\thesubpart.}

\renewcommand{\thesubsubpart}{\thesubpart.\roman{subsubpart}}
\renewcommand{\subsubpartlabel}{\thesubsubpart.}

% copied from stack overflow, as all good things are
\newcommand\invisiblesection[1]{%
  \refstepcounter{section}%
  \addcontentsline{toc}{section}{\protect\numberline{\thesection}#1}%
  \sectionmark{#1}}

% quite possibly the worst workaround i have made for this class
\newcommand{\sectionquestion}[1]{
\titledquestion{#1}
\invisiblesection{#1}
~\vspace{-1em}
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% New Environment for Pseudocode          %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Python style for highlighting
\DeclareFixedFont{\ttb}{T1}{txtt}{bx}{n}{12} % for bold
\DeclareFixedFont{\ttm}{T1}{txtt}{m}{n}{12}  % for normal

\definecolor{deepblue}{rgb}{0,0,0.5}
\definecolor{deepred}{rgb}{0.6,0,0}
\definecolor{deepgreen}{rgb}{0,0.5,0}

\newcommand\pythonstyle{\lstset{
language=Python,
basicstyle=\ttm,
morekeywords={self},              % Add keywords here
keywordstyle=\ttb\color{deepblue},
emph={MyClass,__init__},          % Custom highlighting
emphstyle=\ttb\color{deepred},    % Custom highlighting style
stringstyle=\color{deepgreen},
frame=tb,                         % Any extra options here
showstringspaces=false
}}


% Python environment
\lstnewenvironment{your_code_solution}[1][]
{
\pythonstyle
\lstset{#1}
}
{}
\newcommand{\revert}[1]{\textcolor{orange}{#1}}

\begin{document}
 
\maketitle 

\newcommand \maxsubs {10 }
\section*{Instructions}
\begin{itemize}

\item \textbf{Collaboration Policy}: Please read the collaboration policy in the syllabus.
\item\textbf{Late Submission Policy:} See the late submission policy in the syllabus.
\item\textbf{Submitting your work:} You will use Gradescope to submit
  answers to all questions\ifthenelse{\equal{\homeworktype}{\string written}}{}{ and code}. 

\begin{itemize}
    
    \item \textbf{Written:} You will submit your completed homework as a PDF to
    Gradescope. Please use the provided template for the submissions which can
    be written in \LaTeX{} (via \href{www.overleaf.com}{Overleaf}) or directly
    on the PDF document. Each answer should be within the box provided. If you
    do not follow the template, your assignment may not be graded correctly and
    there will be a \textbf{\textcolor{red}{2\% penalty}} (e.g., if the homework
    is out of 100 points, 2 points will be deducted from your final score).
    
    \ifdefempty{\overleafUrl}{}{
    \item \textbf{\LaTeX{} Source:} \overleafUrl
    }

    \ifthenelse{\equal{\homeworktype}{\string written}}{}{
    \item \textbf{Code:} Gradescope's Autograder will be used to evaluate the
    coding portions of this assignment. In order to best obtain the points for
    this assignment, please follow the code upload instructions. If you do not
    follow the instructions correctly the autograder may not work properly.
    }{}
   
  \end{itemize}

\end{itemize}

\begin{center}
    \pointtable[v][questions]
\end{center}\clearpage

\section*{Introduction}
\label{sec:intro}
In this homework assignment we'll cover some concepts from Visual Language
Models (VLMs) and LLM safety.

At a high-level, this homework will cover the following aspects.

\begin{enumerate}
\item Visual Language Models and how they work
\item Model Safety
\end{enumerate}
\clearpage

\section*{Local Environment}
\label{sec:local}
For this homework we'll be using \texttt{uv} as the project and package manager.
If you haven't install \texttt{uv}, you can follow the installation instructions
here \url{https://docs.astral.sh/uv/}. You can explore all of the available
commands using \texttt{uv --help} but in short, here are a couple of useful
commands that you'll often use:

\begin{table}[H]
    \centering
    \begin{tabular}{|l|l|}
        \hline
        \texttt{source .venv/bin/activate} & (Linux and Mac) Activates python environment. \\
        \hline
        \texttt{source .venv/Scripts/Activate} & (Windows) Activates python environment. \\
        \hline
        \texttt{uv sync} & Installs  / synchronizes projects dependencies. \\
        \hline
        \texttt{uv add <package>} & Installs \texttt{pip} package and adds it to project dependencies. \\
        \hline
        \texttt{uv remove <package>} & Removes \texttt{pip} package dependency from project. \\
        \hline
        \texttt{uv run <script.py>} & Runs python script inside of \texttt{uv} environment. \\
        \hline
    \end{tabular}
\end{table}
\begin{enumerate}
\item Navigate to folder project directory and synchronize dependencies with:
\begin{verbatim}
uv sync
\end{verbatim}

\item Activate the environment

Mac and Linux:
\begin{verbatim}
source .venv/bin/activate
\end{verbatim}

Windows:
\begin{verbatim}
source .venv/Scripts/activate
\end{verbatim}

\item Test \text{uv} works and run \texttt{main.py} file.
\begin{verbatim}
uv run main.py
\end{verbatim}
\end{enumerate}
\clearpage

\begin{questions}
\sectionquestion{Visual Language Models (Written)}

The transformer architecture can be applied to multi-modal tasks through
modifications within the tokenization process allowing for an effective
representation of visual images \cite{dosovitskiy_image_2020, arnab_vivit_2021}
and 3D models \cite{yu_point-bert_2022}. Text is provided to the transformer as
1 dimensional input vectors and naively flattening 2 or 3 dimensional data often
produces inadequate representations, often resulting in lost temporal and
spatial data \cite{dosovitskiy_image_2020, arnab_vivit_2021}. An approach to
preserving spatial data is outlined in work by Dosovitskiy et al.
\cite{dosovitskiy_image_2020} where the authors split an input image into fixed
patches while applying positional embedding in their Vision Transformer (ViT).
This is further expanded upon by Arnab et al. \cite{arnab_vivit_2021} where
these patches are expanded in an additional dimension for video frames to embed
spatial and temporal information into the input \cite{arnab_vivit_2021}.

For 3D models, point cloud representation is an efficient means of representing
spatial information without the rigid constraints of voxelization. However, the
unstructured format of point clouds presents a challenge when adapting this data
to be suitable for transformer input as the tokenization process for such a
representation is not immediately obvious\cite{yu_point-bert_2022}. Point-BERT
\cite{yu_point-bert_2022} resolves this issue by partitioning the entire 3D
model into point based patches similar to the previously methologies of ViT
\cite{dosovitskiy_image_2020}. These patches of points referred to as
``sub-clouds" preserves the spatial information necessary for adequately mapping
3D model data in an format comprehensible by the transformer architecture
\cite{yu_point-bert_2022}.

\begin{figure}[h]
    \centering
    \includegraphics[width=1\linewidth]{images/model_scheme.pdf}
    \caption{
        From \cite{dosovitskiy_image_2020}: ``Model overview. We split an image
        into fixed-size patches, linearly embed each of them, add position
        embeddings, and feed the resulting sequence of vectors to a standard
        Transformer encoder. In order to perform classification, we use the
        standard approach of adding an extra learnable “classification token” to
        the sequence. The illustration of the Transformer encoder was inspired
        by \cite{vaswani_attention_2023}"
    }
    \label{fig:placeholder}
\end{figure}
\clearpage

With this background, let's explore some of the key conceptual questions about
how images are tokenized and how vision and language are combined in VLMs.

\begin{parts}

\part According to the ViT architecture shown in Fig.~\ref{fig:placeholder},
given an input image of height $H = 224$, width $W = 224$, with $C = 3$ color
channels and patch size $P = 16$:

\begin{subparts}
    \subpart[2] How many patch tokens $N$ are produced? Show your calculation.
        \begin{answer_box}[title=,height=6cm, width=15cm]
        
        \end{answer_box}

    \subpart[3] What is the dimensionality of each \textbf{flattened} patch
    vector (i.e., the input to the linear projection layer)?
        \begin{answer_box}[title=,height=6cm, width=15cm]
        
        \end{answer_box}
\end{subparts}

\part[2] \sone Why must positional embeddings be added to patch tokens before
passing them to the Transformer encoder?

    \begin{checkboxes}
        \choice To increase the total number of tokens fed to the Transformer.
        \choice To encode the spatial location of each patch.
        \choice To normalize pixel values within each patch before processing.
        \choice To merge color channel information across neighboring patches.
    \end{checkboxes}

\clearpage

\part[4] According to \cite{dosovitskiy_image_2020}, describe the role of the
prepended learnable \texttt{[class]} token (CLS token) in ViT. How is the
output at this position used to produce the final image representation for
classification?

    \begin{answer_box}[title=,height=20cm, width=15cm]
    
    \end{answer_box}

\clearpage

\part[4] According to \cite{liu_visual_2023}, LLaVA (Large Language and Vision
Assistant) connects a vision encoder to a large language model. Describe (1)
the component used to bridge the visual and language feature spaces and (2) the
type of training LLaVA employs to enable multimodal instruction following.

    \begin{answer_box}[title=,height=20cm, width=15cm]
    
    \end{answer_box}

\clearpage

\part[5] According to \cite{arnab_vivit_2021}, how does ViViT extend the
spatial patch approach of ViT to handle video inputs? Describe how tokens are
constructed to encode both spatial and temporal information.

    \begin{answer_box}[title=,height=20cm, width=15cm]
    
    \end{answer_box}

\clearpage
\end{parts}


\sectionquestion{Visual Language Models (Programming)}
\begin{parts}
\part[60]
For this part of the assignment you will implement the core image preprocessing
pipeline from the Vision Transformer (ViT) \cite{dosovitskiy_image_2020} in the
starter code: \textbf{\lstinline{./programming/vlm.py}}

This file consists of six functions that together convert a raw image into a
sequence of tokens ready for a Transformer encoder:

\begin{enumerate}
    \item \lstinline{patch_count(height, width, patch_size)} ---
          compute the number of patch tokens $N$
    \item \lstinline{extract_patches(image, patch_size)} ---
          split a \texttt{(C, H, W)} image into $N$ flattened patch vectors of
          shape \texttt{(N, C*P*P)} in raster-scan order
    \item \lstinline{linear_projection(patches, weight)} ---
          project each patch from dimension $C{\cdot}P^2$ to the model embedding
          dimension $D$, producing shape \texttt{(N, D)}
    \item \lstinline{add_cls_token(patches, cls_token)} ---
          prepend the learnable CLS token to produce shape \texttt{(N+1, D)}
    \item \lstinline{add_positional_embedding(tokens, pos_embedding)} ---
          add positional embeddings element-wise to the token sequence
    \item \lstinline{vit_preprocess(image, patch_size, ...)} ---
          compose all five steps above into the complete ViT preprocessing
          pipeline, returning shape \texttt{(N+1, D)}
\end{enumerate}

Please fill out the code indicated by the \texttt{\# Fill in} comments. You may
only use \texttt{numpy} --- no deep learning frameworks.

You can run and test the code with the following commands:

\begin{table}[H]
    \centering
    \begin{tabular}{|l|l|}
        \hline
        \texttt{uv run programming/vlm.py} & Runs the script with a demo example (useful for development)\\
        \hline
        \texttt{uv run test.py vlm} & Runs the test script used by the autograder\\
        \hline
    \end{tabular}
\end{table}
\end{parts}

\textbf{The provided tests are the exact ones that will run on the autograder
(i.e. if your local tests pass, they should also pass on the autograder).}
\clearpage

\sectionquestion{LLM Safety}

Let's revisit \cite{baker_monitoring_2025}. This work investigates a practical
approach to AI safety in agentic settings: monitoring a model's chain-of-thought
(CoT) reasoning with a separate LLM to detect reward hacking --- behavior where
the model exploits flaws in its learning objective rather than solving the
intended task. Their key finding is that CoT monitoring is far more effective
than monitoring actions and outputs alone, and that a weaker monitor (GPT-4o)
can reliably catch misbehavior in a stronger model (o3-mini). However, when the
monitor is incorporated directly into the reinforcement learning reward, the
model learns to \emph{obfuscate} its reasoning, hiding reward hacking inside
apparently benign CoTs.

\begin{parts}

\part[5] According to \cite{baker_monitoring_2025}, what is the key advantage
of monitoring a model's chain-of-thought (CoT) reasoning compared to monitoring
only its final actions and outputs? What experimental finding in the paper
directly supports this claim?

    \begin{answer_box}[title=,height=16cm, width=15cm]
    
    \end{answer_box}

\part[5] \sone According to \cite{baker_monitoring_2025}, what happens when a
CoT monitor is incorporated directly into the reinforcement learning reward
under \textbf{high} optimization pressure?

    \begin{checkboxes}
        \choice The agent becomes easier to monitor because reward signals
        reinforce transparent reasoning.
        \choice The agent learns obfuscated reward hacking, hiding its intent
        within the CoT while still misbehaving at a significant rate.
        \choice The agent's task performance degrades significantly because
        optimizing for monitorability conflicts with capability.
        \choice The CoT monitor loses all signal immediately, making
        training unstable.
    \end{checkboxes}

\part[5] According to \cite{baker_monitoring_2025}, what is the
\emph{monitorability tax} and why do the authors argue it may be a necessary
trade-off when designing safe AI systems?

    \begin{answer_box}[title=,height=15cm, width=15cm]
    
    \end{answer_box}

\clearpage
\end{parts}


\sectionquestion{Programming Scripts Upload}

To upload your code to Gradescope, run the following command to generate a zip
file:

\begin{verbatim}
uv run programming/zip_programming.py
\end{verbatim}

Upload the generated zip file to the appropriate programming slot on Gradescope.

\begin{parts}

\part Make sure the following files are included when uploading to Gradescope
    \begin{checkboxessquare}
        \choice \texttt{vlm.py}
    \end{checkboxessquare}
\end{parts}

\newpage

\sectionquestion{Collaboration and Generative AI Questions}

\begin{parts}

\uplevel{
After you have completed all other components of this assignment, report your
answers to these questions regarding the collaboration policy. Details of the
policy can be found in the syllabus.
}

    \part[2] Did you collaborate with anyone on this assignment? If so, list
    their name or Andrew ID and which problems you worked together on.

        \begin{answer_box}[title=,height=3cm, width=15cm]
        \end{answer_box}

    \part[3] Did you use generative AI for parts of this assignment? If so,
    include the input prompts along with links to the conversation.
    
        \begin{answer_box}[title=,height=15cm, width=15cm]
        \end{answer_box}
        
\end{parts}
\end{questions}
\clearpage

\bibliographystyle{plainnat}
\bibliography{references}

\end{document}