Courses

CSCI 102 TThe Socio-Techno Web

Last offered Fall 2017

This course introduces many fundamental concepts in computer science by examining the social aspects of computing. As more and more people use the technologies and services available via the Internet, online environments like Facebook, Amazon, Google, Twitter, and blogs are flourishing. However, several of the problems related to security, privacy, and trust that exist in the real world transfer and become amplified in the virtual world created by the ubiquity and pervasiveness of the Internet. In this course, we will investigate how the social, technological, and natural worlds are connected, and how the study of networks sheds light on these connections. Topics include the structure of the Social Web and networks in general; issues such as virtual identity, personal and group privacy, trust evaluation and propagation, and online security; and the technology, economics, and politics of Web information and online communities. No background in computer science or programming is required or expected. [ more ]

CSCI 107Creating Games

Last offered Spring 2017

The game is unique as the only broadly-successful interactive art form. Games communicate the experience of embodying a role by manipulating the player's own decisions, abstraction, and discrete planning. Those three elements are the essence of computation, which makes computer science theory integral to game design. Video games also co-opt programming and computer graphics as new tools for the modern artist. As a result, games are collaborative interdisciplinary constructs that use computation as a medium for creative expression. Students analyze and extend contemporary video and board games using the methodology of science and the language of the arts. They explore how computational concepts like recursion, state, and complexity apply to interactive experiences. They then synthesize new game elements using mathematics, programming and both digital and traditional art tools. Emphasis is on the theory of design in modern European board games. Topics covered include experiment design, gameplay balance, minimax, color theory, pathfinding, game theory, composition, and computability. [ more ]

CSCI 109The Art and Science of Computer Graphics

Last offered Fall 2016

This course provides an opportunity to develop an understanding of the theoretical and practical concepts underlying 2- and 3-dimensional computer graphics. The course will emphasize hands-on studio/laboratory experience, with student work focused around completing a series of projects. Students will experiment with modeling, color, lighting, perspective, and simple animation. As the course progresses, computer programming will be used to control the complexity of the models and their interactions. Lectures, augmented by guided viewings of state-of-the-art computer generated and enhanced images and animations, will be used to deepen understanding of the studio experience. [ more ]

CSCI 134Introduction to Computer Science: Objects, Events, and Graphics

Last offered Fall 2017

Computing is central to many aspects of our lives and the world. This course introduces fundamental ideas in computer science and builds the skills necessary to create computer programs in the Java programming language, with an emphasis on graphics and user interfaces. Students learn to design programs in a wide range of application areas, from games to spam filters and image editing to scientific simulations. Programming topics include object-oriented programming, control structures, arrays, recursion, and event-driven programming, as well as how to construct correct, understandable, and efficient programs. This course is appropriate for all students who want to create software and have little or no prior computing experience. [ more ]

CSCI 134Introduction to Computer Science: Digital Communication and Computation

Last offered Spring 2018

A digital revolution has transformed the way we communicate and process information. Digital cameras have replaced film, MP3s have replaced LPs, communications through email, chat systems, and the Web have become part of daily life. This course explores the principles that underlie such digital information processing and communication systems. All digital information processing and communication systems are driven by precise rules or algorithms expressed as computer programs. We will develop an appreciation for the nature and limitations of such algorithms by exploring abstract algorithms for complex processes and by learning the basics of computer programming in Java. Programming topics covered will include object-oriented programming, control structures, arrays, recursion, and event-driven programming. Programming projects will include network applications like chat clients, tools to process and compress digital images, and simple network servers. [ more ]

CSCI 134(F, S)Introduction to Computer Science: Diving into the Deluge of Data

We are surrounded by information: weather forecasts, twitter feeds, restaurant reviews, stock market tickers, music recommendations, among others. This course introduces fundamental computational concepts for representing and manipulating data. Using the programming language Python, this course explores effective ways to organize and transform information in order to solve problems. Students will learn to design algorithms to search, sort, and manipulate data in application areas like text and image processing, social networks, scientific computing, databases, and the World Wide Web. Programming topics covered include object-oriented and functional programming, control structures, types, recursion, arrays, lists, streams, and dictionaries. This course is appropriate for all students who want to create software and learn computational techniques for manipulating and analyzing data. More details are available on the department website, http://www.cs.williams.edu [ more ]

CSCI 136(F, S)Data Structures and Advanced Programming

This course builds on the programming skills acquired in Computer Science 134. It couples work on program design, analysis, and verification with an introduction to the study of data structures. Data structures capture common ways in which to store and manipulate data, and they are important in the construction of sophisticated computer programs. Students are introduced to some of the most important and frequently used data structures: lists, stacks, queues, trees, hash tables, graphs, and files. Students will be expected to write several programs, ranging from very short programs to more elaborate systems. Emphasis will be placed on the development of clear, modular programs that are easy to read, debug, verify, analyze, and modify. [ more ]

CSCI 237(F, S)Computer Organization

This course studies the basic instruction set architecture and organization of a modern computer. It provides a programmer's view of how computer systems execute programs, store information, and communicate. Over the semester the student learns the fundamentals of translating higher level languages into assembly language, and the interpretation of machine languages by hardware. At the same time, a model of computer hardware organization is developed from the gate level upward. [ more ]

CSCI 256(F, S)Algorithm Design and Analysis

This course investigates methods for designing efficient and reliable algorithms. By carefully analyzing the structure of a problem within a mathematical framework, it is often possible to dramatically decrease the computational resources needed to find a solution. In addition, analysis provides a method for verifying the correctness of an algorithm and accurately estimating its running time and space requirements. We will study several algorithm design strategies that build on data structures and programming techniques introduced in Computer Science 136. These include induction, divide-and-conquer, dynamic programming, and greedy algorithms. Additional topics of study include algorithms on graphs and strategies for handling potentially intractable problems. [ more ]

CSCI 315 TComputational Biology

Last offered Spring 2018

This course will provide an overview of Computational Biology, the application of computational, mathematical, statistical, and physical problem-solving techniques to interpret the rapidly expanding amount of biological data. Topics covered will include database searching, DNA sequence alignment, clustering, RNA structure prediction, protein structural alignment, methods of analyzing gene expression, networks, and genome assembly using techniques such as string matching, dynamic programming, hidden Markov models, and expectation-maximization. [ more ]

CSCI 319Integrative Bioinformatics, Genomics, and Proteomics Lab

Last offered Fall 2016

What can computational biology teach us about cancer? In this capstone experience for the Genomics, Proteomics, and Bioinformatics program, computational analysis and wet-lab investigations will inform each other, as students majoring in biology, chemistry, computer science, mathematics/statistics, and physics contribute their own expertise to explore how ever-growing gene and protein data-sets can provide key insights into human disease. In this course, we will take advantage of one well-studied system, the highly conserved Ras-related family of proteins, which play a central role in numerous fundamental processes within the cell. The course will integrate bioinformatics and molecular biology, using database searching, alignments and pattern matching, phylogenetics, and recombinant DNA techniques to reconstruct the evolution of gene families by focusing on the gene duplication events and gene rearrangements that have occurred over the course of eukaryotic speciation. By utilizing high through-put approaches to investigate genes involved in the MAPK signal transduction pathway in human colon cancer cell lines, students will uncover regulatory mechanisms that are aberrantly altered by siRNA knockdown of putative regulatory components. This functional genomic strategy will be coupled with independent projects using phosphorylation-state specific antisera to test our hypotheses. Proteomic analysis will introduce the students to de novo structural prediction and threading algorithms, as well as data-mining approaches and Bayesian modeling of protein network dynamics in single cells. Flow cytometry and mass spectrometry will be used to study networks of interacting proteins in colon tumor cells. [ more ]

CSCI 326(F)Software Methods

Sophisticated software systems play a prominent role in many aspects of our lives, and while programming can be a very creative and exciting process, building a reliable software system of any size is no easy feat. Moreover, the ultimate outcome of any programming endeavor is likely to be incomplete, unreliable, and unmaintainable unless principled methods for software construction are followed. This course explores those methods. Specific topics include: software processes; specifying requirements and verifying correctness; abstractions; design principles; software architectures; concurrentand scalable systems design; testing and debugging; and performance evaluation. [ more ]

CSCI 331Introduction to Computer Security

Last offered Fall 2017

This class explores common vulnerabilities in computer systems, how attackers exploit them, and how systems engineers design defenses to mitigate them. The goal is to be able to recognize potential vulnerabilities in one's own software and to practice defensive design. Hands-on experience writing C/C++ code to inspect and modify the low-level operation of running programs is emphasized. Finally, regular reading and writing assignments round out the course to help students understand the cultural and historical background of the computer security "arms race." [ more ]

CSCI 333(S)Storage Systems

This course will examine topics in the design, implementation, and evaluation of storage systems. Topics include the memory hierarchy; ways that data is organized (both logically and physically); storage hardware and its influence on storage software designs; data structures; performance models; and system measurement/evaluation. Readings will be taken from recent technical literature, and an emphasis will be placed on identifying and evaluating design trade-offs. [ more ]

CSCI 334(F, S)Principles of Programming Languages

This course examines the concepts and structures governing the design and implementation of programming languages. It presents an introduction to the concepts behind compilers and run-time representations of programming languages; features of programming languages supporting abstraction and polymorphism; and the procedural, functional, object-oriented, and concurrent programming paradigms. Programs will be required in languages illustrating each of these paradigms. [ more ]

CSCI 336 T(F)Computer Networks

This course explores the design and implementation of computer networks. Topics include wired and wireless networks; techniques for efficient and reliable encoding and transmission of data; addressing schemes and routing mechanisms; resource allocation for bandwidth sharing; and security issues. An important unifying themes is the distributed nature of all network problems. We will examine the ways in which these issues are addressed by current protocols such as TCP/IP and 802.11 WIFI. [ more ]

Taught by: TBA

Catalog details

CSCI 337 TDigital Design and Modern Architecture

Last offered Spring 2018

This tutorial course considers topics in the low-level design of modern architectures. Course meetings will review problems of designing effective architectures including instruction-level parallelism, branch-prediction, caching strategies, and advanced ALU design. Readings will be taken from recent technical literature. Labs will focus on the development of custom CMOS circuits to implement projects from gates to bit-sliced ALUs. Final group projects will develop custom logic demonstrating concepts learned in course meetings. [ more ]

CSCI 339Distributed Systems

Last offered Fall 2017

This course studies the key design principles of distributed systems, which are collections of independent networked computers that function as single coherent systems. Covered topics include communication protocols, processes and threads, naming, synchronization, consistency and replication, fault tolerance, and security. Students also examine some specific real-world distributed systems case studies, including Google and Amazon. Class discussion is based on readings from the textbook and research papers. The goals of this course are to understand how large-scale computational systems are built, and to provide students with the tools necessary to evaluate new technologies after the course ends. [ more ]

CSCI 356 TAdvanced Algorithms

Last offered Fall 2016

This course explores advanced concepts in algorithm design, algorithm analysis and data structures. Areas of focus will include algorithmic complexity, randomized and approximation algorithms, geometric algorithms, and advanced data structures. Topics will include combinatorial algorithms for packing, and covering problems, algorithms for proximity and visibility problems , linear programming algorithms, approximation schemes, hardness of approximation, search, and hashing. [ more ]

Taught by: TBA

Catalog details

CSCI 361(F)Theory of Computation

This course introduces a formal framework for investigating both the computability and complexity of problems. We study several models of computation including finite automata, regular languages, context-free grammars, and Turing machines. These models provide a mathematical basis for the study of computability theory--the examination of what problems can be solved and what problems cannot be solved--and the study of complexity theory--the examination of how efficiently problems can be solved. Topics include the halting problem and the P versus NP problem. [ more ]

CSCI 371Computational Graphics

Last offered Fall 2016

PhotoShop, medical MRIs, video games, and movie special effects all programmatically create and manipulate digital images. This course teaches the fundamental techniques behind these applications. We begin by building a mathematical model of the interaction of light with surfaces, lenses, and an imager. We then study the data structures and processor architectures that allow us to efficiently evaluate that physical model.
Students will complete a series of programming assignments for both photorealistic image creation and real-time 3D rendering using C++, OpenGL, and GLSL. These assignments cumulate in a multi-week final project. Topics covered in the course include: projective geometry, ray tracing, bidirectional surface scattering functions, binary space partition trees, matting and compositing, shadow maps, cache management, and parallel processing on GPUs.
[ more ]

CSCI 372 TVisual Media Revolution

Last offered Fall 2015

We live at the beginning of the second revolution in visual media. Two centuries ago, the camera and the Jacquard loom introduced machines for creating art. By automating the artist's hand, they also forced questions of how objective technique gives rise to subjective meaning and where the border lies between mechanical and human contributions. Those progenitors eventually led to digital film, computer games, and digital content creation for architecture and industrial design. Today, accessible and pervasive computation provokes a second revolution. Augmented reality, 3D scanning, 3D printing, virtual reality, and computational photography are exploding into mainstream experience. Where previous digital media refined analog practice through evolution, these are forms that could not exist without computation. As the world seeks the promise of new visual forms, we find that fundamentals of earlier media remain valid and take them as our guide. This tutorial investigates the technology of emerging computational media and explores their impact on the relationship between process and aesthetics. [ more ]

CSCI 373Artificial Intelligence

Last offered Spring 2018

Artificial Intelligence (AI) has become part of everyday life, but what is it, and how does it work? This course introduces theories and computational techniques that serve as a foundation for the study of artificial intelligence. Potential topics include the following: Problem solving by search, Logic, Planning, Constraint satisfaction problems, Uncertainty and probabilistic reasoning, Bayesian networks, and Automated Learning. [ more ]

CSCI 374 TMachine Learning

Last offered Spring 2018

This tutorial examines the design, implementation, and analysis of machine learning algorithms. Machine Learning is a branch of Artificial Intelligence that aims to develop algorithms that will improve a system's performance. Improvement might involve acquiring new factual knowledge from data, learning to perform a new task, or learning to perform an old task more efficiently or effectively. This tutorial will cover examples of supervised learning algorithms (including decision tree learning, support vector machines, and neural networks), unsupervised learning algorithms (including k-means and expectation maximization), and possibly reinforcement learning algorithms (such as Q learning and temporal difference learning). It will also introduce methods for the evaluation of learning algorithms, as well as topics in computational learning theory. [ more ]

CSCI 375Natural Language Processing

Last offered Fall 2017

Natural language processing is a branch of computer science that studies methods for analyzing and generating written or spoken human language. It is a rapidly developing field that has given rise to many useful applications including search engines, speech recognizers, and automated personal assistants. Potential topics include information retrieval, information extraction, question answering, and language models. [ more ]

CSCI 376(F)Human-Computer Interaction

Human-Computer Interaction (HCI) principles are practiced in the design and evaluation of most software, greatly impacting the lives of anyone who uses interactive technology and other products. There are many ways to design and build applications for people, so what methods can increase the likelihood that our design is the most useful, intuitive, and enjoyable? This course provides an introduction to the field of human-computer interaction, through a user-centered approach to designing and evaluating interactive systems. HCI draws on methods from computer science, the social and cognitive sciences, and interaction design. In this course we will use these methods to: ideate and propose design problems, study existing systems and challenges, explore design opportunities and tradeoffs, evaluate and improve designs, and communicate design problems and solutions to varying audiences. [ more ]

CSCI 397(F)Independent Reading: Computer Science

Directed independent reading in Computer Science. [ more ]

CSCI 398(S)Independent Reading: Computer Science

Directed independent reading in Computer Science. [ more ]

CSCI 432(F, S)Operating Systems

This course explores the design and implementation of computer operating systems. Topics include historical aspects of operating systems development, systems programming, process scheduling, synchronization of concurrent processes, virtual machines, memory management and virtual memory, I/O and file systems, system security, os/architecture interaction, and distributed operating systems. [ more ]

CSCI 434 T(S)Compiler Design

This tutorial covers the principles and practices for the design and implementation of compilers and interpreters. Topics include all stages of the compilation and execution process: lexical analysis; parsing; symbol tables; type systems; scope; semantic analysis; intermediate representations; run-time environments and interpreters; code generation; program analysis and optimization; and garbage collection. The course covers both the theoretical and practical implications of these topics. Students will construct a full compiler for a simple object-oriented language. [ more ]

CSCI 493(F)Research in Computer Science

This course provides highly-motivated students an opportunity to work independently with faculty on research topics chosen by individual faculty. Students are generally expected to perform a literature review, identify areas of potential contribution, and explore extensions to existing results. The course culminates in a concise, well-written report describing a problem, its background history, any independent results achieved, and directions for future research. [ more ]

CSCI 497(F)Independent Reading: Computer Science

Directed independent reading in Computer Science. [ more ]

CSCI 498(S)Independent Reading: Computer Science

Directed independent reading in Computer Science. [ more ]