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.
Limited to 20 students. Spring semester. Professor Malita.2021-22: Offered in Fall 2021
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.
Restricted to Amherst College students. Limited to 40 students per class (20 per lab). In the Fall, 20 seats per class are reserved for first-year students. Fall semester: Professors Malita, Pentecost, and Riondato. Spring semester: Professors Gardner and Riondato.2021-22: Offered in Spring 2022
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.
Requisite: COSC 111 or consent of the instructor. Limited to 40 students with 10 spaces reserved for first-year students in the fall. Fall Semester: Professor Rager and Visiting Professor Malita. Spring Semester Assistant Professor Alfeld.2021-22: Offered in Spring 2022
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.
Requisite: COSC 111 or prior programming experience. Open only to Amherst College students. Limited to 40 students per section (20 per lab). Omitted 2022-23.2021-22: Offered in Fall 2021
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. Students who have taken COSC 261 may not take this course.
Requisite: COSC 112. Fall and spring semesters: Assistant Professor Pentecost.2021-22: Offered in Fall 2021, Spring 2022
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.
Requisite: COSC 112. Fall semester: Professor Gardner. Spring semester: Professor Rager.2021-22: Offered in Fall 2021, Spring 2022
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).
Requisite: COSC 211. Omit 2022-23.2021-22: Not offered
Requisite: COSC 211. Spring semester. Visiting Professor Malita and Assistant Professor Rosenbaum.
Enrollment limit: 502021-22: Not offered
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.
Requisite: COSC 112. Omitted 2022-23.2021-22: Offered in Spring 2022
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.
Requisite: COSC 211. Fall semester: Assistant Professor Alfeld.2021-22: Offered in Fall 2021
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.
Requisite: COSC-211. Fall Semester: Professor Spector.2021-22: Not offered
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.
Requisite: COSC 211. Limited to 50 students. Omitted 2022-23.2021-22: Not offered
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.
Requisite: COSC 211. Omitted 2022-23.2021-22: Not offered
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.
Requisite: COSC 211. Limited to 40 students. Spring semester. Professor Rosenbaum.2021-22: Not offered
Computing networks are ubiquitous and used for a broad range of purposes. Networks are often complex and dynamic, connecting systems with a range of capabilities. Some computers are permanently connected while others (e.g., mobile devices) routinely leave and rejoin the network. In any case, the network must ensure that data are delivered quickly and reliably from one computer to another. 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. Topics will include layered network structure, signaling methods, error detection and correction, flow control, routing, and protocol design and verification. Not open to students who have previously taken Computer Science 281. Offered in alternate years.
Requisite: COSC 211 or consent of the instructor. Limited to 50 students. Omitted 2022-23.2021-22: Offered in Spring 2022
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.
Requisite: COSC 112 and COSC 211. Fall semester: Assistant Professor Rosenbaum.2021-22: Offered in Fall 2021
This course will explore the algorithms used to create “realistic” three-dimensional computer images. Major topics will include object representations (polygons, curved surfaces, functional models), rendering algorithms (perspective transformations, hidden-surface removal, reflectance and illumination, shadows, texturing), and implementation techniques (scan conversion, ray tracing, radiosity). Students will create images using Pixar's Renderman.
Requisite: COSC 112 or consent of the instructor. Limited to 50 students. Spring semester. Professor Rager.2021-22: Not offered
Randomization is a powerful tool that can be used to design algorithms and data structures that, in many cases, are simpler or more efficient than their deterministic counterparts. Through a combination of implementation and theoretical analysis, students in this course will explore the use of randomization in algorithm design. We will discuss Las Vegas and Monte Carlo algorithms, pseudorandom number generation, and the foundations of probability needed for the analysis of randomized algorithms. Possible topics include randomized algorithms for graphs, computational geometry, load balancing, and approximation.
Prerequisite: COSC-311. Spring semester. Assistant Professor Gardner.2021-22: Not offered
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.
Prerequisites: COSC-211, and one of: COSC-223 or MATH-360 or STAT-360, or consent of the Instructor. Spring semester. Assistant Professor Riondato.2021-22: Not offered
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.
Requisite: COSC 211, and one of COSC 223, MATH 360 or STATS 360, or consent of the instructor. Limited to 50 students. Fall semester. Assistant Professor Riondato.2021-22: Not offered
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.
Requisite COSC 171 and 211. Limited to 50 students. Omitted 2022-23.2021-22: Not offered
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).
Requisite: COSC 311. Limited to 30 students. Omitted 2022-23.2021-22: Offered in Spring 2022
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.
Requisite: COSC 171 or consent of the instructor. Limited to 50 students. Fall semester: Assistant Professor Alfeld.2021-22: Not offered
Independent reading course.
Fall and spring semesters. The Department.2021-22: Offered in Fall 2021, Spring 2022
This course covers basic mathematical concepts that are essential in computer science and then uses them to teach the theory of formal languages and machine models of languages. The notion of computability will be introduced in order to discuss undecidable problems. The topics covered include: regular, context-free and context-sensitive languages, finite state automata, Turing machines, decidability, and computational complexity. Offered in alternate years.
Requisite: None, although analytical aptitude is essential. Limited to 50 students. Fall semester: Professor Rager.2021-22: Not offered
Evolutionary computation techniques harness the mechanisms of biological evolution, including mutation, recombination, and selection, to build software systems that solve difficult problems or shed light on the nature of evolutionary processes. In this course students will explore several evolutionary computation techniques and apply them to problems of their choosing. The technique of genetic programming, in which populations of executable programs evolve through natural selection, will be emphasized.
Requisite: COSC 112. Limited to 20 students. Preference given to Computer Science majors. Spring semester: Professor Spector.2021-22: Offered in Spring 2022
Artificial Intelligence (AI) and Machine Learning (ML) have enabled the broad success of automated decision making systems, but they have also created security vulnerabilities. Real and synthetic adversaries improve these AI and ML systems, advancing the state of the art in automated speech processing, image generation, computer security, and many other fields. In this course we will discuss research on the use of adversarial methods in AI, ML, and Security.
Requisite: At least one of COSC 241, 247, or 383. Limited to 20 students. Preference given to Computer Science majors. Omitted 2022-23.2021-22: Offered in Spring 2022
Open to seniors with consent of the Department.
Fall semester. The Department.2021-22: Offered in Fall 2021