- CMSC 141, Introduction to Object-Oriented Programming
This course introduces students with prior programming experience to the methodologies of object-oriented design and programming, which are used throughout the Computer Science curriculum. Students will learn how to move from informal problem statement, through increasingly precise problem specifications, to design and implementation of a solution. Good programming habits will be emphasized.

Prerequisite: Any Introduction to Computing course, or permission of instructor.

- CMSC 143, Introduction to Object-Oriented Programming with Robots
This course introduces studentsto object-oriented design and programming through the design and implementation of mobile robot programs. The programs will enable the robot to move around the world, reacting to sensors such as obstacle detectors and a color camera. Students will learn how to move from an informal problem statement, through increasingly precise problem specifications, to design and implementation of a solution. Good programming habits will be emphasized. Prerequisite: any Introduction to Computing course, or permission of the instructor.

- CMSC 145, Discrete Mathematics
Discrete mathematics includes those areas of mathematics that are essential to computer science, information theory, combinatorics, and genetics. This course emphasizes creative problem solving, linking language to logic, and learning to read and write proofs. The topics covered include propositional logic, predicate logic, inductive proof, sets, relations, functions, introductory combinatorics and discrete probability. Applications drawn from computation will motivate most topics.

Prerequisites: Math 141 or programming experience.

- CMSC 157, Object-Oriented Programming Workshop
(2 Credits) Programming design principles like composition, modularity, encapsulation, and interfaces will be emphasized. The course will cover intermediate algorithmic problem solving in some computing context (e.g., data processing, simulation, visualization). This course serves as a bridge course to Data Structures (CMSC 201) for students with substantial prior programming experience: students with 5 AP CS credits and permission of the instructor, those that have excelled in a CMSC 11X: Intro to Computing course, or those coming from CMSC 143 that need more programming practice. Prerequisite: CMSC 11X or CMSC 143.

- CMSC 201, Data Structures
This course introduces students to essential principles of program design and analysis that underlie applications of computation to internet communication, digital media, and artificial intelligence. Building on basic programming skills, we will focus on the construction of more sophisticated and reliable computer programs that employ the most important data structures. Data structures, common ways in which data is organized and manipulated, are an important aspect of modern programs. Consequently, throughout the course students will learn to create and use the most useful data structures, including files, lists, stacks, trees, and graphs. Students will write several programs, ranging from short lab assignments to larger systems of their own design. Prerequisite: CMSC 141 or 143, or permission of the instructor.

- CMSC 225, Computer Architecture
An introduction to the structure and operation of a modern computer architecture. Topics include instruction sets, pipelining, instruction-level parallelism, caches, memory hierarchies, storage systems, and multiprocessors. Assembly language programming is used to demonstrate concepts. Corequisite: Computer Science 201, with Physics 212 recommended.

- CMSC 244, Discrete Math and Functional Programming
This course covers many mathematical concepts of importance to the foundation of the modern computer scientist, employing a functional programming language as a vehicle for computational expression. General discrete mathematics topics will include logic and formal proof, sets, relations, functions, induction and co-induction, number theory, and graph theory. Functional programming concepts will include lambda calculus, type theory, lists and algebraic data types, recursion and co-recursion, and polymorphism. This course satisfies the functional programming requirement for moderation into the computer science program.

Prerequisites: MATH 141 and an introductory computer science course, or their equivalents.

- CMSC 273, Scientific Programming
Introduces numerical methods used in the physical sciences, and the C programming language. Common techniques of data analysis, approximation, and numerical solutions of integral and differential equations are developed for their own sake and also as an introduction to available analysis packages.

Prerequisites: Mathematics 211.

- CMSC 275, Statistics for Computing
Cross-listed: *Mathematics *This course introduces students with prior object-oriented programming experience to the basics of probability and statistical analysis. Students will learn theory and implementation of statistical inferences used in computer science research starting from fundamentals in counting and probability distributions; and go on to cover monte carlo simulation, bayesian inference, confidence intervals, t-tests, analysis of variance, and clustering. By the end of this course students will learn how to set up computational experiments, classify their data, and determine the appropriate statistical test for their experiments. Prerequisites: CMSC 141 (or equivalent).* Class size: 18*

- CMSC 301, Algorithms
This course covers design and analysis of correct and efficient computer algorithms. Topics include sorting, greedy algorithms, divide-and-conquer algorithms, dynamic programming algorithms, and graph algorithms. Advanced topics in algorithms may be selected from specialized areas of the mathematical and empirical sciences.

Prerequisites: Computer Science 201 and Mathematics 231 or 235.

- CMSC 305, Design of Programming Languages
Covers a selection of important issues in the design of programming languages including, but not limited to, type systems, procedure activation, parameter passing, data encapsulation, dynamic memory allocation, and concurrency. In addition, the functional, logic, and object-oriented programming paradigms are presented, along with a brief history of high-level programming languages.

Prerequisite: Computer Science 201.

- CMSC 312, Theory of Computation
An introduction to several computational models developed to formalize the notion of an algorithm, the course also offers detailed discussion of primary topics in the theory of computation, including the theory of recursive functions, Turing machines, and several undecidable problems, such as the Halting problem.

Prerequisites: Mathematics 231 or both Computer Science 301 and Mathematics 235.

- CMSC 326, Operating Systems
Covers traditional topics of operating systems, including interprocess communication, semaphores, monitors, scheduling algorithms, deadlocks, virtual memory, and file system design. In addition, discussion may include issues in distributed systems such as the client-server model, remote procedure call, distributed synchronization, transactions, threads, and file servers.

Prerequisite: Computer Science 201.

- CMSC 328, Embedded Operating Systems
From dishwashers to drones, digital computers act as the brains of most modern devices. Embedded computing systems lack the memory, processing, energy, and user-interface resources available in traditional computers, like personal computers. Embedded operating systems serve as the core of these types of computational systems providing common services, isolation and protection in resource limited environments. Traditional topics of operating systems, including device drivers, concurrency, inter-process communication, scheduling, memory management, and virtualization will be covered. In addition, discussion may include issues in mobile, distributed, and real-time systems. Prerequisite: Computer Science 201 or permission of the instructor.

- CMSC 335, Computer Networks
Takes a bottom-up approach to computer networking, covering in detail the physical, data link, MAC, network, transport, and application layers. TCP/IP and OSI reference models are introduced, with examples taken from the Internet, ATM networks, and wireless networks.

Prerequisite: Computer Science 201.

- CMSC 351, Artificial Intelligence
Provides a broad introduction to topics in artificial intelligence, including knowledge representation and reasoning, planning and problem solving, and machine learning. Advanced topics may include natural language processing, multiagent systems, and image processing.

Prerequisite: Computer Science 201.

- CMSC 352, Biology-Inspired Machine Learning
In this course, we will examine computation as a metaphor for understanding adaptive systems. We will study several biological systems and relate them to abstract models that incorporate elements of their data structures, information processing, and learning. Neuron models, neural networks, and evolutionary learning will be studied using mathematics and computer simulation. This course emphasizes information processing, pattern recognition, and associated computational abilities of artificial models, but takes an ethological approach to understanding how natural and artificial intelligent systems adapt to their environment. No background in biology is assumed. Prerequisites: Calculus I and Computer Science II.

- CMSC 101, The Craft of Computing
This seminar introduces students to the burgeoning field of computing from Bard’s program to beyond. Through the work of pioneers like Simon, Papert, Kay, and Knuth we will explore the past, present and future of computing; exploring the question of digital literacy and the roles of production, analysis, and consumption. This foundational discussion will be accompanied by a practical introduction to the craft of computing, developing necessary skills like editing, scripting, and version control. The seminar provides students with the opportunity to work with other computer science students in the lower college, meet all the computer science faculty, and learn about potential career directions. This course is intended for students in their first three semesters.

- CMSC 111, Introduction to Computing: Automated Reasoning
This course explores the application of computing to logical deduction. Students will design programs that automate many aspects of human reasoning. Topics include natural language processing, natural language generation, automated theorem proving, and verification.

Prerequisite: Eligibility for Q courses.

- CMSC 112, Introduction to Computing: Graphics and Animation
This course provides an introduction to the use of computer programming for creating and displaying a wide variety of objects, patterns, and digital images. Students will learn to use a programming language and graphics interface to write algorithms that represent and render two-dimensional and three-dimensional geometrical objects, beginning with points and lines and extending three-dimensional solids. Topics will include applied geometry, coordinate transformations, projection, perspective, object modeling, and basic animation.

Prerequisite: eligibility for Q courses.

- CMSC 113, Introduction to Computing: Robotics
This course introduces students to ideas that are fundamental to robotics and to computing in general. Teams of students will design and build shoebox-sized robots, with guidance from the instructor. These rather minimalist robots will be mobile and will have multiple sensors. The student teams will use a simple programming language to program their robots to carry out simple tasks, and will move to a more robust programming language and more complex tasks by the end of the semester.

Prerequisite: eligibility for Q courses.

- CMSC 114, Introduction to Computing: Understanding the Computer
This course examines several fundamental ideas from computer science, from the point of view of understanding the computer as a machine. Over the course of a semester, we will move from the very concrete (digital circuits) through increasingly abstract descriptions of computing machinery. Along the way, we will learn how to decode the jargon of computer advertising GB's, RAM, GHz, and so on. Students will explore the basics of computer programming via several simple assignments.

Prerequisite: eligibility for Q courses.

- CMSC 115, Introduction to Computing: Simulating Reality
How do rumors and fashions spread in society? Does a small change in environmental temperature disrupt an ecosystem? Questions like these are explored using computers to create virtual worlds. This introduction to modeling and simulation is intended for students who are interested in creating computer models of objects, processes, and complex systems using computer software. Students will create and run several different simulation model types drawn from a variety of disciplines, including: artificial life, cognitive science, economics, environmental science, evolution, neuroscience, physics, and political science. Students will gain a practical understanding of how to combine mathematical modeling, computer simulation, and data analysis as they use and create software that enables them to build simulation models that answer a practical need and/or scientific question. No prior knowledge of computer programming is required.

Prerequisite: strong background in pre-calculus mathematics or its equivalent and eligibility for Q courses.

- CMSC 116, Introduction to Computing: Web Informatics
This course is an introduction to content deployment for the World Wide Web. Participants in this course will construct social networking software, similar in scope to blogs or FaceBook, using a dynamic web programming system. Strong emphasis will be placed on the development of flexible applications that efficiently store and process data and metadata. In addition to basic computer programming, various XML technologies will be introduced and employed. Prerequisite: Passing score on Part I of the Mathematics Diagnostic.

- CMSC 117, Introduction to Computing: Interactive Systems

This course introduces students to computing through the construction of interactive computing systems. Students will explore computing by programming graphics, perception, and robotics systems; learning how computers can manipulate the physical world as well as calculate in the virtual world. Programming projects include creating 2D and 3D pieces of art, automatically analyzing photos and video from digital cameras, and making machines walk and talk. No prior knowledge of computer programming is required.

- CMSC 118, Hapax Legomena and the Words We Use: Computing for the Digital Humanities
What, if anything, can we learn by applying basic computing to works of literature? In this course, we'll apply techniques from Natural Language Processing (the subdiscipline of computer science that deals with information in text form) to all kinds of texts. We’ll identify hapax legomena (words that appear only once in a given text) and think about whether and when they are significant. We'll see how scholars try to use statistical techniques to approach disputes over authorship. Each student will work alone or with a small group to pose an interesting question about a specific text or corpus and to construct computational tools for beginning to address the question. No prerequisite.

- CMSC 120, Technologies of Reading: Human and Machine Approaches to Literature
Recent debates in literary studies regarding "close" and "distant" reading methods have emerged alongside rapid innovation in the field of natural language processing (NLP). These concurrent developments have sparked exciting collaborations between literary scholars and computer scientists (as evidenced by this co-taught course). Yet this burgeoning affinity can easily obscure the longer history of scholarly activity combining humanist and computational approaches to literature. In this course, we will chart the contours of this history -- stretching back to the early twentieth century -- and learn the fundamentals of NLP in order to consider new questions regarding changing literary patterns over time. We will read the works of foundational linguists and close-reading theorists (e.g., Victoria, Lady Welby; C. K. Ogden; I. A. Richards; William Empson; and Cleanth Brooks) as well as scholars of emergent critical reading practices (eg., N. Katherine Hayles, Franco Moretti, Sharon Marcus, and Stephen Best). We will explore these ideas by learning fundamentals of programming and then using them to apply NLP techniques such as parsing, sentence generation, language modeling, and creation of high-dimensional semantic spaces to problems in reading. Pre-requisites: Students must have passed part 1 of the Mathematics diagnostic.

- CMSC 131, Introduction to Mind, Brain and Behavior
How do brains make minds? Can computers think? Is my dog conscious? Cognitive science assumes that the brain is some sort of computational engine, and, beginning with that premise, attempts to find answers to such questions. This course will be taught by faculty from biology, computer science, linguistics, philosophy, and psychology, who will combine their different approaches to explore how humans and other intelligent systems feel, perceive, reason, plan, and act. In particular, the course will focus on the fundamental importance of language, signaling, and representation at many levels, from the neural to the organismal. Laboratories will provide students with hands-on experience analyzing neural and behavioral data as well as with computational modeling. Prerequisites: pre-calculus or its equivalent and a willingness to engage a broad variety of ideas and approaches from the natural, mathematical, and social sciences.

- CMSC 210, Programming Nature: Modeling Biological and Physical Systems
This course introduces students with prior programming experience to the applications of object-oriented programming to physical and biological systems. The students will develop the necessary tools for modeling biological and physical objects that can move, interact, divide, and evolve, with a specific application of simulating biological cells. The students will learn how to pose a question about a natural system, develop a set of rules, and implement simulations to formulate predictions about the dynamics of that system. Prerequisite: CMSC 143 or permission by the instructor.

- CMSC 226, Principles of Computing Systems
This course takes a systems perspective to the study of computers. As our programs scale up from a single author, user, and computer to programs designed, written, maintained, and used by multiple people that run on many computers (sometimes at the same time), considerations beyond algorithms alone are magnified. Design principles and engineering practices help us cope with this complexity: version control for multiple authors, input validation for multiple (adversarial) users, build automation tools for multiple platforms, process and thread models for parallelism. From how numbers are represented in hardware to how instruction-level parallelism and speculation can lead to bugs: the design, implementation, evaluation, safety and security of computing systems will be stressed. Students will explore computers from the ground up, using a variety of programming languages (including assembly) and tools like the command line, debuggers, and version control. Pre-requisites: Object-Oriented Programming or permission of instructor.

- CMSC 233, Mobile Applications
This course provides a hands-on introduction to the design of applications on hand-held mobile devices characterized by limited computational and interface resources. Particular emphasis will be placed on developing software interface designs that incorporate the specialized input-output capabilities of these devices such as wireless communication, spoken interfaces, and image capture. Students will be assigned to small teams that work together to develop applications for this platform. Prerequisite: CMSC 201.

- CMSC 251, Introduction to Artificial Intelligence

An introdution to artificial intelligence principles and techniques with an emphasis on elements of artificial intelligence that are compatible with current understanding of biologically-based intelligence (e.g., neural computation). This course is intended to provide a first course in artificial intelligence, particularly for students interested in cognitive science and neuroscience. The course will explore the application of artificial intelligence techniques to particular application areas. Techniques include automated reasoning, machine learning, evolutionary learning, heuristic search, and behavior-based robot control. Application examples will be drawn from artificial life, robotics, game play, logic, visual perception, and natural language processing.

Prerequisites: One of CMSC 111-117, 141-143, or programming experience.

- CMSC 303, Computational Geometry
This class will cover a variety of topics from computational geometry. Focus will be given to computational complexity of the algorithms presented as well as appropriate data structures. Topics may include Voronoi Diagrams, convex hull calculations, line segment intersections and more.

Prerequisites: Math 212, Math 242 and some programming knowledge.

- CMSC 317, The Computational Image
This course covers computational techniques for the analysis and synthesis of digital images. Using algorithms and approaches from computational geometry, computer graphics, image processing, computer vision, and augmented reality, students will build computer systems that are visually interactive. This course covers topics such as image formation, feature extraction, object segmentation, recognition, and tracking, rendering, and multi-view geometry. Prerequisite: CMSC 201 or permission of the instructor.

- CMSC 321, Databases: Theory and Practice
An introduction to the design, implementation, and uses of databases. Topics include database design, database models, integrity, concurrency, security, and database query languages.

Prerequisite: Computer Science 201.

- CMSC 323, Computer Graphics
Computer graphics have become ubituitous in today's society, from magazine ads to movies to video games. In this course students explore the basic algorithms used to create and manipulate two- and three-dimensional graphic objects. Among the topics covered are coordinate transformations, projection, hidden surfaces, shading, ray tracing, and texture mapping. A strong mathematical and programming background is necessary.

Prerequisites: Mathematics 242 or 331, Computer Science 201 and permission of the instructor.

- CMSC 325, Multiprocessor Computer Architecture

Modern desktop computers typically contain multiple microprocessors. In order to take full advantage of these new machines, one must understand a number of interlocking hardware and software issues, including instruction-level and thread-level parallelism, architectures for shared memory, and dynamic scheduling. This course will combine principles of computer organization as applied to multiprocessor systems with case studies of several extant multicore architectures. Prerequisite: CMSC 201.

- CMSC 327, Distributed Systems
Computing systems are increasingly built in a networked, distributed manner. These systems, often spanning the globe, coordinate to solve problems involving massive amounts of data in a highly fault tolerant fashion. Students will study the challenges introduced when extending traditional computing systems concepts (e.g. shared state, hardware abstraction, scheduling, file systems, timing, authentication) to a networked setting. In this course, students will explore the different architectures, algorithms, and technologies used to design, build, and evaluate distributed computer systems.

- CMSC 352, Biologically Inspired Machine Learning
Examines computation as a metaphor for understanding adaptive systems. Several biological systems are studied and related to abstract models that incorporate elements of their data structures, information processing, and learning. Neuron models, neural networks, and evolutionary learning are studied using mathematics and computer simulation. This course emphasizes information processing, pattern recognition, and associated computational abilities of artificial models, but takes an ethological approach to understanding how natural and artificial intelligent systems adapt to their environment.

Prerequisites: Computer Science 201.

- CMSC 353, Modeling and Simulation
This course provides an introduction to mathematical modeling and the computer simulation of discrete and continuous systems. Examples will be drawn from the computational, physical, and social sciences. Students will learn to create mathematical models of systems, design simulation experiments, construct simulations, test their validity, and statistically analyze model output. Students will complete final projects in which they undertake the modeling and simulation of a system of their choice.

Prerequisite: Mathematics 142 and Computer Science 201 or the equivalent, and at least one 200-level course in the sciences or social sciences.

- CMSC 360, Intelligent Robotics and Perception
This course provides an overview of topics in computational perception, machine learning, and robotics. Students will learn the underlying principles and methods of intelligent robotic systems, including techniques from sensor processing, robot software architecture, and supervised, unsupervised, and reinforcement learning. Throughout the semester, students will collaborate as a team to build an intelligent robotic system of their choice.

Prerequisite:** **Computer Science 201 or permission of the instructor.

- CMSC 373, Software Interface Design
Focuses in detail on desiderata for good user interface design, including questions of layout, command entry, and display of information. The course centers on event-driven programming, using the Java programming language.

Prerequisite: Computer Science 201.

- CMSC 374, Mobile Application Development
This course provides a hands-on introduction to the design of applications on hand-held mobile devices such as mobile phones and tablets that are characterized by limited computational resources. Particular emphasis will be placed on developing application architectures and interface designs that incorporate the specialized input-output capabilities of these devices such as wireless communication, touch input, spoken interfaces, location sensors, and video capture. Students will be assigned to small teams that work together to develop a complete application for this platform. Prerequisite: CMSC 201, Data Structures.

- CMSC 401, Topics in Computational Complexity
Topics for this course may include logic and undecidability, NP-complete problems, co- NP and function problems, randomized algorithms, cryptography, approximation algorithms, and logarithmic space.

Prerequisites: Computer Science 301 and 312.

- CMSC 425, Compiler Design
An introduction to the process of writing a language translator. Topics include lexical analysis, parsing, syntax-directed translation, optimization, and code generation. Students complete a project involving design and implementation of a compiler for a simple high- level programming language.

Prerequisites: Computer Science 305.

- CMSC 451, Topics in Advanced Artificial Intelligence
This course covers a selection of topics from artificial intelligence, which may include robotics, natural language processing, machine learning, neural networks, genetic algorithms, genetic programming, planning, and computer vision. Selection of topics will be guided in part by student interest and background.

Prerequisite: Computer Science 351

- CMSC 119, (De-)Coding the Drone
This course introduces students to computing through the coding and decoding of drones – or, more generally, robotic computing systems – and engages with the public debate on unmanned aerial vehicles, both military and domestic. This class will serve as a hands-on introduction to the practice of programming drones, small embedded computers connected with sensors and actuators. Through guest lectures by distinguished practitioners in fields such as human rights, international law, media studies, literature, robotics, and history, as well as vigorous class discussion, we will consider drones from aesthetic, social, moral, and policy perspectives. Students will learn how computers can observe and manipulate the physical world as well as calculate in the virtual world, while reflecting on the social and political implications of drone technology. No prior knowledge of computer programming is required. Prerequisite: passing score on part 1 of the Mathematics Diagnostics.