Amherst CollegeWebsiteAcademic Catalog
Computer Science DepartmentDepartment Website
Majors
Courses
source 1COSC-105: Introduction to Computing and The Arts (1) intro
This introductory course explores computation as an artistic medium, with creative approaches to computer programming as the central theme. Through readings, viewing, group discussion, labs, projects, critiques and guest artist/researcher presentations, we examine a range of computational art practices, while developing a solid foundation in basic computer programming approaches and techniques.
COSC-111: Introduction to Computer Science I (1) intro
This course introduces ideas and techniques that are fundamental to computer science. The course emphasizes procedural abstraction, algorithmic methods, and structured design techniques. Students will gain a working knowledge of a block-structured programming language and will use the language to solve a variety of problems illustrating ideas in computer science. A selection of other elementary topics will be presented. A laboratory section will meet once a week to give students practice with programming constructs. Two class hours and one one-hour laboratory per week.
COSC-111L: Introduction to Computer Science Lab (1) intro
Lab section for COSC 111
COSC-112: Introduction to Computer Science II (1) intro
A continuation of COSC 111. This course will emphasize more complicated problems and their algorithmic solutions. The object-oriented programming paradigm will be discussed in detail, including data abstraction, inheritance, and polymorphism. Other topics will include stacks, queues, linked lists, programming for graphical user interfaces, and basic topics in probability. A laboratory section will meet once a week to give students practice with programming constructs.
COSC-112L: Introduction to Computer Science II Lab (1) intro
COSC 112 Lab Section
COSC-121: Thinking Like a Computer Scientist (1) math
Analytical thinking is inherent in every aspect of computer science. We need to be able to answer questions such as: how do I know that my program works correctly? How efficient is my approach to solving a problem? How does human-readable code get translated into something that can run on physical hardware? What problems are even solvable by computers? In order to study such questions, computer scientists must be able to communicate with one another using a common language, express ideas formally and precisely, and reason logically about these ideas. This course will introduce mathematics as the primary analytical tool used by computer scientists. Topics may include but are not limited to set notation, symbolic logic, proof techniques such as induction and contradiction, and applications of these topics in computer science. Much more important than any individual topic, however, is the experience that students will gain with formal reasoning.
COSC-163: Introduction to Computer Architecture (1) sys
This course will provide an introduction to basic computer systems architecture, stressing how computers work. Beginning with Boolean logic and the design of combinational and sequential circuits, the course will develop the design of memory and processing hardware, including the structure and interpretation of machine instructions and assembly languages, with a focus on datapath and control for classic processor architectures and for modern pipelined architectures. Projects will include the design of digital circuits and basic processor structures.
COSC-171: Computer Systems (1) sys
This course will examine the principles and design choices involved in creating general purpose computer systems. Topics will include instruction set architectures, virtual memory, caching, allocators and garbage collectors, threads and synchronization, file systems, virtual machines, and distributed systems. Projects will involve the implementation and use of these capabilities and abstractions.
COSC-175: Systems I: Computer Organization and Design (1) sys
This course will cover building blocks and design principles of computer systems, including how user programs are translated and executed on hardware. Beginning with Boolean logic and the design of combinational and sequential circuits, the course discusses the design of computer hardware components, microprocessing, pipelining, basic machine architecture, and the interpretation of machine instructions and assembly languages. The course will also introduce operating systems topics, basic memory management, and parallel processing. Projects will include the design of digital circuits and the simulated hardware execution of code. Two lectures and one lab each week. Fall semester. Professor Pentecost.
COSC-211: Data Structures (1) intro
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-223: Probability and Computing (1) math
Probability is everywhere in computer science. In networks and systems, it is a key tool that allows us to predict performance, to understand how delay changes with the system parameters, and more. In algorithms, randomization is used to design faster and simpler algorithms than their deterministic counterparts. In machine learning, probability is central to the underlying theory. This course provides an introduction to probability with a focus on computer science applications. We will discuss elementary probability theory, including topics such as discrete random variables and distributions and Markov chains, and settings in which these are used in computer science (e.g., modeling real-world workload distributions, analyzing computer system performance, and designing and analyzing randomized algorithms).
COSC-225: Algorithms and Visualization (1) graphics
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-231: Programming Language Paradigms (1) pls
The main purpose of a programming language is to provide a natural way to express algorithms and computational structures. The meaning of “natural” here is controversial and has produced several distinct language paradigms. Furthermore, the languages themselves have shaped our understanding of the nature of computation and of human thought processes. We will explore some of these paradigms and discuss the major ideas underlying language design. Several languages will be introduced to illustrate ideas developed in the course. Topics will include functional programming, declarative programming, and programming for concurrency and distributed computing. Offered in alternate years.
COSC-241: Artificial Intelligence (1) ai
An introduction to the ideas and techniques that allow computers to perform intelligently. The course will discuss methods of adversarial game playing and of solving general problems using heuristic search. It will also discuss the design of agents that learn either from experience or from a provided dataset. The course will cover both theoretical aspects of AI and practical considerations such as noisy sensor readings. Three class meetings per week. Offered in alternate years.
COSC-247: Machine Learning (1) ai
Machine Learning algorithms allow computers to be taught to perform tasks without being explicitly programmed. This course is an introduction to machine learning and data mining. The course will explore supervised, unsupervised, ensemble and reinforcement learning. Topics may include: decision tree learning, rule learning, neural networks, support vector machines, Bayesian learning, clustering, hidden Markov model learning, and/or deep learning. The material of this course has some overlap with that of Computer Science 241, but it is permissible to take both.
COSC-254: Data Mining (1) ai
This course is an introduction to data mining, the area of computer science that deals with the development of efficient and accurate algorithms for extracting information from data. Topics may include: mining data streams and time series, the MapReduce/Spark model and large scale data analysis, significant patterns extraction, web and social networks analysis, recommendation systems, sampling and hypothesis testing, and dimensionality reduction. We will use interactive data analysis notebooks and large-scale data processing systems to implement and test data mining algorithms.
COSC-257: Databases (1) sys
This course is an introduction to the use of relational databases and the inner workings of systems to manage these databases. Relational databases allow one to store, retrieve, and operate on data in a well-defined way, independent of the nature of the data. Database Management Systems (DBMS) are computer systems designed with the goal of making operations on relational databases as efficient as possible. Students will learn about: the Entity-Relationship model and its algebra, the Structured Query Language (SQL), the actual implementation of the relational algebra operation in a DBMS, the creation and use of indices, the execution of transactions, and DBMS internals such as disk layouts, query planning, and concurrency control. These notions will be made concrete with implementation projects.
COSC-265: Modern Computing Hardware (1) sys
This course will provide students with a deeper understanding of modern computer systems and hardware platforms, including design principles for desktop CPUs, mobile devices, graphics processing units (GPUs), and flexible computing platforms (e.g., FPGAs). Key topics include multi-core processing, hardware acceleration, software-hardware co-design, and memory management. This course includes a laboratory component and projects developing and interacting with hardware platforms.
COSC-273: Parallel and Distributed Computing (1) sys
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.
COSC-275: Systems II: Operating Systems (1) sys
This course will cover the crucial responsibilities and mechanisms of operating system kernels, focusing on the themes of abstraction, virtualization, concurrency, caching, and persistence. Topics will include processes, memory management and virtual memory, multi-processing and threads, file systems, and virtual machines.
COSC-277: Operating Systems (1) sys
An operating system kernel abstracts the hardware to make programming easier, controls how the hardware is shared between programs, and provides essential capabilities like processes, threads, virtual memory, file systems, network sockets, and virtual machines.
COSC-283: Networks (1) sys
This course will begin with the problem of communicating between two computers, followed by the problems of building generalized networks for different types and varying numbers of computing devices.
COSC-311: Algorithms (1) algs
This course addresses the design and analysis of computer algorithms.
COSC-321: Computer Graphics (1) graphics
This course will explore the algorithms used to create 'realistic' three-dimensional computer images.
COSC-347: Theory of Machine Learning (1) ai
This course covers the mathematical underpinnings of machine learning.
COSC-351: Information Theory (1) math
Information Theory formally studies how to efficiently transmit and store digital information.
COSC-351: Information Theory (1)
Information Theory formally studies how to efficiently transmit and store digital information. 4K video streams, high-quality audio from Bluetooth speakers, digital radio, and secure Internet communication are all possible thanks to the solid mathematical foundations of Information Theory. This course first introduces the fundamental concepts in Information Theory including the entropy of a random variable and the modeling of communication channels, and then covers computer science topics where Information Theory plays a central role, such as error correcting codes, compression, differential privacy, communication complexity, data streams algorithms, and pattern recognition.
COSC-355: Network Science (1) algs
Many phenomena can be represented as networks of interactions between different components. Network science is the discipline at the intersection of computer science, statistics, and physics that studies the structure, formation, evolution, and behavior of such networks, with the goal of understanding the phenomena they represent. In this course we study algorithmic, computational, and statistical approaches to the analysis of networks of people (both online and offline), web pages, proteins, and physical goods. We cover, among other topics: models of network formation, ways of measuring the importance of entities in networks and algorithms to calculate those metrics, models and algorithms for diffusion of information and diseases, and human-friendly approaches for visualizing network dynamics.
COSC-365: Performance Evaluation and Optimization (1) sys
Computer systems are complex structures of multiple hardware and software components, with each component affecting the performance of every computation. To measure and improve performance requires a full understanding of how a system's components interact and the unexpected ways that changes in one component may affect others. In this course we will develop methods for measuring computational performance that account for these complex interactions. We will optimize computations first by empirically identifying the greatest opportunities for improvement and then by evaluating those optimizations through proper measurement and analysis. Topics will include compiler optimizations, memory hierarchy performance, probe effects, cache contention, parallel bottlenecks and scaling, and performance analysis techniques.
COSC-371: Compiler Design (1) pls
An introduction to the principles of the design of compilers, which are translators that convert programs from a source language to a target language. Compilers typically take programs written in a general-purpose programming language, such as Java or C, and produce equivalent assembly language programs. This course examines how source code is parsed, how an internal representation of that code is built, and then how the equivalent assembly code is generated. We examine basic type systems and static analysis, where the compiler can catch errors in the code during translation. We see how procedural, functional, and object-oriented languages are modeled and translated. Each student will design and implement a compiler for a small language. Offered in alternate years.
COSC-373: Distributed Algorithms (1) algs
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).
COSC-383: Computer Security (1) sys
There is an ongoing arms race between hackers and defenders in the cyber world. This course introduces concepts of computer security including exploitation, diagnosis, and protection. Topics will range from program exploits like buffer overflow attacks and privilege escalation to analysis of recent real-world attacks to discussions about the ethics of hacking. We will also cover security protocols such as those for authentication (proving that you are who you say you are), password checking, and cryptography.
COSC-390: Special Topics (1) special
Independent reading course.
Senior Comprehensive Exercise (0)
As the Comprehensive Exercise in Computer Science, seniors are asked to prepare a BRIEF presentation about a data structure that is new to them. The data structure is assigned by the department. The presentation will be in the form of a video, but other than that, the exact structure is up to the student. The completed video is reviewed by a faculty member.