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 103(F)Electronic Textiles

Digital data is being infused throughout the entire physical world, escaping the computer monitor and spreading to other devices and appliances, including the human body. Electronic textiles, or eTextiles, is one of the next steps toward making everything interactive and this course aims to introduce learners to the first steps of developing their own wearable interactive technology devices. After completing a series of introductory eTextiles projects to gain practice in necessary sewing, circuitry, and programming skills, students will propose and design their own eTextiles projects, eventually implementing them with sewable Arduino components, and other found electronic components as needed. The scope of the project will depend on the individual's prior background, but can include everything from a sweatshirt with light-up turn signals for bicycling, to a wall banner that displays the current air quality of the room, to a stuffed animal that plays a tune when the lights go on, to whatever project you can conceivably accomplish with sewable Arduino inputs, outputs, and development board in a semester context. This class will introduce students to introductory computer programming, circuitry, and sewing with the goal of creating novel wearable artifacts that interact with the world. [ 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 134(F, S)Introduction to Computer Science

This course introduces students to the science of computation by exploring the representation and manipulation of data and algorithms. We organize and transform information in order to solve problems using algorithms written in a modern object-oriented language. Topics include organization of data using objects and classes, and the description of processes using conditional control, iteration, methods and classes. We also begin the study of abstraction, self-reference, reuse, and performance analysis. While the choice of programming language and application area will vary in different offerings, the skills students develop will transfer equally well to more advanced study in many areas. In particular, this course is designed to provide the programming skills needed for further study in computer science and is expected to satisfy introductory programming requirements in other departments. [ 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 T(S)Computational Biology

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(S)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 331(F)Introduction to Computer Security

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 TComputer Networks

Last offered Fall 2018

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 338(F)Parallel Processing

This course explores different parallel programming paradigms used for writing applications on today's parallel computer systems. The course will introduce concurrency (i.e. multiple simultaneous computations) and the synchronization primitives that allow for the creation of correct concurrent applications. It will examine how a variety of systems organize parallel processing resources and enable users to write parallel programs for these systems. Covered programming paradigms will include multiprogramming with processes, message passing, threading in shared memory multiprocessors, vector processing, graphics processor programming, transactions, MapReduce, and other forms of programming for the cloud. Class discussion is based on assigned readings. Assignments provide students the opportunity to develop proficiency in writing software using different parallel programming paradigms. [ more ]

CSCI 339(S)Distributed Systems

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 343(F)Application Development with Functional Programming

This course will enrich the participants on how functional programming can reduce unintended complexity and create code bases that are simpler to maintain and reason about. Functional programming is a paradigm, which focuses on values and pure functions rather than mutable objects and imperative statements. Since good code design is intersubjective, we need to be open-minded and continuously reflect upon the decisions we make. Together we will reflect on the design choices made and the dilemmas that will arise. We will learn that there are often multiple solutions, each often having their benefits and drawbacks. By gaining experience, we will acquire empirical knowledge, intuition and sensors for avoiding unintended complexity, creating appropriate abstractions and a sustainable code base. Class will consist of a lot of live coding, code-reviews and a dialog on how we can improve our architectural design and knowledge. Topics include code quality, readability, maintainability, collaboration, version control system (git), global state, dependencies, pure functions, persistent data structures, data consistency, single source of truth (SSOT), reactive programming, web development, functional programming and comparison with object oriented programming, designing for testability, documentation, state management, atomic updates, concurrency, dynamic types, DSLs, lisp and REPL. The concepts are not limited to a specific programming language. We will use Clojure and ClojureScript to realize the ideas in the specific project. Hence, also rigorous abilities in lisp, repl workflow and Clojure/ClojureScript will be an outcome of the course. For each week there will be a video talk from programming conferences that will serve as inspiration and give us the opportunity to reflect. The videos will be posted when the course starts. [ more ]

CSCI 356 T(F)Advanced Algorithms

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 ]

CSCI 358(S)Applied Algorithms

This course is about bridging the gap between theoretical running time and writing fast code in practice. The course is divided into two basic topics. The first is algorithmic: we will discuss some of the most useful tools in a coder's toolkit. This includes topics like randomization (hashing, filters, approximate counters), linear and convex programming, similarity search, and cache-efficient algorithms. Our goal is to talk about why these efficient algorithms make seemingly difficult problems solvable in practice. The second topic is applications: we will discuss how to implement algorithms in an efficient way that takes advantage of modern hardware. Specific topics covered will include blocking, loop unrolling, pipelining, as well as strategies for performance analysis. Projects and assessments will include both basic theoretical aspects (understanding why the algorithms we discuss actually work), and practical aspects (implementing the algorithms we discuss to solve important problems, and optimizing the code so it runs as quickly as possible). [ more ]

CSCI 361(F, S)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 T(S)Machine Learning

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 432Operating Systems

Last offered Spring 2019

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 TCompiler Design

Last offered Spring 2019

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 494(S)Senior Thesis: Computer Science

Computer Science thesis; this is part of a full-year thesis (493-494). [ 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 ]