View undergraduate course grid View graduate course grid
An accelerated introduction to the fundamental concepts of computer science for students who lack a formal background in the field. Topics include algorithm design and program development; data types; control structures; subprograms and parameter passing; recursion; data structures; searching and sorting; dynamic storage allocation and pointers; abstract data types, such as stacks, queues, lists, and tree structures; generic packages; and an introduction to the principles of object-oriented programming. The primary programming language used in the course will be Java. Students should expect an average of 12-16 hours of programming and related course work per week.
An accelerated introduction to the fundamental concepts of computer science for students who lack a formal background in the field. Topics include algorithm design and program development; data types; control structures; subprograms and parameter passing; recursion; data structures; searching and sorting; dynamic storage allocation and pointers; abstract data types, such as stacks, queues, lists, and tree structures; generic packages; and an introduction to the principles of object-oriented programming. The primary programming language used in the course will be Java. Students should expect an average of 12-16 hours of programming and related course work per week.
This is a capstone course based on computer graphics tools. The course covers a selection of topics that may include computer animation, gaming, geometric modeling, motion capture, computational photography, physically based simulation, scientific visualization, and user interfaces. Not all areas are available every semester; the choice of areas is determined by the instructor. The capstone project involves some or all of the following elements: formation of a small team, project proposal, literature review, interim report, project presentation, and final report.
This course covers graphical models, causal inference, and advanced topics in statistical machine learning.
This course covers graphical models, causal inference, and advanced topics in statistical machine learning.
A mostly self-contained research-oriented and fast-paced course designed for PhD students with an interest in doing research in theoretical aspects of algorithms that aim to extract information from data. These often lie in overlaps of (Applied) Mathematics with: Computer Science, Electrical Engineering, Statistics, and/or Operations Research. Each lecture will feature either one or two Mathematical Open Problem(s) with relevance in Data Science. The main mathematical tools used will be Probability and Linear Algebra, and a basic familiarity with these subjects is required. There will also be some (although knowledge of these tools is not assumed) Graph Theory, Representation Theory, Applied Harmonic Analysis, among others. The topics treated will include Dimension reduction, Manifold learning, Sparse recovery, Random Matrices, Approximation Algorithms, Community detection in graphs, and several others.
This course will cover advanced numerical techniques for solving PDEs, with a particular focus on fluid dynamics. This includes advection-diffusion-reaction equations, compressible and incompressible Navier-Stokes equations, and fluid-structure coupling. Basic familiarity with temporal integrators for ODEs (multistep, Runge-Kutta), methods for solving PDEs (finite difference, finite volume, finite elements for parabolic and elliptic problems), iterative solvers for linear systems, and the Navier-Stokes equations will be assumed. Topics covered will include: higher-order spatio-temporal discretizations for advection-diffusion equations, artificial dissipation and dispersion, compressible flow (conservation laws, limiters, shock-capturing methods, boundary layers, turbulence), incompressible flow (projection methods, Stokes solvers, spectral methods), fluid-structure coupling (boundary-integral formulations, immersed boundary methods) geo-physical dynamics (shallow water, wave equations, turbulent flows).
The course is intended for Courant Institute graduate students who are either mathematics students on the applied half of the spectrum or computer science students with an interest in numerical computation. ODEs, the starting point of analysis and dynamics, are one of the two foundation stones of applied mathematics (the other is linear algebra). This course will deepen your appreciation of them fundamentally.
This course will be based on a new textbook that I am 2/3 of the way through writing, Exploring ODEs, with coauthors Toby Driscoll and Asgeir Birkisson. The book aims to be interesting and informative for every applied or numerical mathematician. Its unusual missions are to be numerically-enabled, but not a numerical book and mathematically mature, but not technically advanced. To get an idea, including the table of contents, take a look at the talk I gave about the book project posted here.
The course will be assessed by homework assignments. These will be computational (working in Chebfun), but will be about behavior of ODEs, not about algorithms or numerical analysis.
This course will provide an introduction to the finite element method and its theoretical foundation.
Self-adjoint elliptic problem and calculus of variation. Sobolev spaces, Poincare's and Friedrichs' inequalities. Triangulations of bounded domains in two and three dimensions. Lagrange and Hermite finite elements, which are conforming in H^1. The biharmonic problem and H^2 conforming elements.
Error bounds for basic finite element methods: Cea's lemma and the result of Aubin and Nitsche. Nonconforming finite elements: the lemmas due to Strang. Isoparametric elements and spectral elements. Compressible and almost incompressible elasticity. Mixed methods and the inf-sup condition due to Babuska and Brezzi. Incompressible Stokes. Raviart-Thomas elements and other elements conforming in H(div). Nedelec elements and other conforming elements in H(curl). Solving the large linear and non-linear systems of algebraic equations resulting from finite element approximations. An introduction to domain decomposition and multigrid algorithms.
In this course we study the craft of software engineering. The semester begins with a thorough review of the Java Language and Virtual Machine, emphasizing library components and language features most relevant to most development projects. Later lectures cover more sophisticated features in the language like concurrency and thread-safety, writing tests, properly designing classes and Object-Oriented programs, and design patterns. Certain non-technical topics are critical to successful software development and are reinforced throughout the semester. These include writing readable code, the long-term consequences of bugs, the psychology of human motivation, successfully developing and reinforcing habits, what science knows about human productivity and drive, and how to motivate ourselves and our team. Lessons are reinforced with weekly assignments that are meticulously graded. Some submissions are critiqued, line-by-line, in classroom code reviews. The end of the semester includes a lecture on how to best prepare for interviews and write an effective resume, incorporating techniques from world-class athletes and performers on how to optimally perform under extreme stress.
Distributed systems help programmers aggregate the resource of many networked computers to construct highly available and scalable services, such as peta-byte storage, massively parallel computation. This class teaches the abstractions, design and implementation techniques that allow you to build fast, scalable, fault-tolerant distributed systems. Topics include concurrency and consistency, fault tolerance, distributed transactions, and several case studies of distributed systems. This class is a graduate-level course, but advanced undergraduate students are welcome! The course consists of lectures and a series of programming labs.
Did you ever wonder why there are 12 notes in the western music scale? Or how the intervals between notes came to be? When were the first musical scales developed or "discovered" and how (and why) have they been modified since? Who were the key innovators of western music theory over the last few centuries?
It is not uncommon for software developers to have an affinity for music. After all, the creation of both software and music is part art and part science. Further, music and computing are built upon fundamental mathematical principles. While it is not required to understand music theory to be a good player, understanding why we are constrained to a certain set of notes is an enlightening topic - for musicians and non-musicians alike.
This course is for students interested in both music and software construction!
In this course, we will cover architectural aspects and capabilities of modern GPUs (graphics processing unit) and will learn the architecture and the programming of GPUs to solve different type of problems. Many computations can be performed much faster on the GPU than on a traditional processor. This is why GPUs are present now in almost all computers; and the majority of Top 500 supercomputers in the world are built around GPUs. GPUs are no longer restricted to graphics applications but are now used for a diverse set of applications and domains. This introduces the concept of general-purpose GPUs or GPGPUs, which is the main subject of this course.
Traditionally, computer security is enforced by the operating system, which uses special hardware support to ensure security properties at application boundaries. However, the proliferation of successful attacks, such as viruses, worms, SQL injection, and cross-site scripting, shows that traditional approaches to security are insufficient. Adversaries exploit weaknesses both in the operating system itself, bypassing any protection mechanisms, and more and more frequently at the application level, where the operating system provides very limited guarantees. In this class we consider how programming language techniques can be used to fill the security gap by defending against application-level attacks. The approach is based on the static analysis of the program source to certify security properties.
This course will introduce technologies at the foundation of the Big Data movement that have facilitated scalable management of vast quantities of data collected through realtime and near realtime sensing. We will also explore the tools enabling the acquisition of near realtime data in the social domain, the fusion of those data when in flight and at rest, and their meaningful representation in graphical visualizations. Students are required to complete weekly reading and/or programming assignments and demonstrate mastery of course topics by developing and demonstrating a software project of their choosing. Class time will be set aside for project proposal and final demo.
The course will teach how to develop online casual multiplayer games using open technologies such as HTML5, JavaScript, Typescript, AngularJS, Ionic, Bootstrap, PhoneGap, Grunt, and testing using Karma, Jasmine, Protractor. Students will build several turn based games and submit them to Google play store. There is no final exam, only assignments. The course will also teach about artificial-intelligence for games, ranking systems, physics-based engines, and integrating with social platforms. The course will not concern with 3D graphics.
In this course we will examine some of the core tasks in natural language processing, starting with simple word-based models for text classification and building up to rich, structured models for syntactic parsing and machine translation. In each case we will discuss recent research progress in the area and how to design efficient systems for practical user applications. There will be a focus on corpus-driven methods that make use of supervised and unsupervised machine learning methods and algorithms. We will explore statistical approaches based on graphical models and neural networks. In the course assignments, which will be updated this year to include more neural network modeling, you will construct basic systems and then improve them through a cycle of error analysis and model redesign. This course assumes a good background in basic probability and a strong ability and interest in building real systems. The class is open to graduate as well as undergraduate students.
Predictive analytics is the art and science of extracting useful information from historical data and present data for the purpose of predicting future trends. In this course, students will have an introduction to the phases of the analytics lifecycle and a basic understanding of a variety of tools and machine learning techniques to analyze data to discover forward insights. Several techniques will be introduced; including data pre-processing techniques, data clustering algorithms, data classification algorithms, association rules data mining algorithms, recommender systems, etc.
Applications from bio-informatics, social networks analytics, and text mining will be covered. Highlights from industrial use cases will be covered to demonstrate how Predictive Analytics relates to improving business performance and impacting better decisions. This is an introductory course that will provide students with basic skills of the new generation of data scientists that will allow them to structure, analyze and derive useful insights from data that could help make better decisions.
This is a hands-on course that goes over some basic aspects of computer vision and selected topics which students develop their own algorithms for. The topics that will be covered are feature representation and detection (wavelets), stereo vision (matching), symmetry, and recognition (learning). There is a final project where students present a computer vision system. Basic knowledge of linear algebra and algorithms is required.
DevOps is more than just a fusion of development and operations. It is the cultural change that embraces Agile methodology, Social Coding, Test Drive Development, new tools to provide Continuous Integration, Testing, and Delivery, and a fundamental shift in what it means to “move into production”. Developers are empowered to “fail fast” and deploy early and often. Cloud Computing is at the heart of this movement. Cloud Native applications built from microservices require DevOps to manage the often complex production pipeline. DevOps allows businesses to move with increased agility and stability.
Upon completing this course students will be able to work as an Agile team and setup a DevOps pipeline to continuously integrate their code changes and deploy Cloud Native applications that they write. They will also gain an understanding of what it means for Enterprise IT to use DevOps to become Cloud Native and operate at scale. Topics covered will include: Social Coding, Creating RESTful Microservices, IBM Bluemix. Watson Services, Docker, Cloud Foundry, GitHub, ZenHub, Travis CI, Jenkins, Vagrant, Test Drive Development, Python Flask, Node.js, Redis, Cloudant, Ansible, Chef, Puppet. Students will be given access to IBM Bluemix and Watson Services for the duration of the course and will be deploying their homework there. This course is 50% lecture and 50% hand-on so come prepared to learn by doing.
Agile software development is a group of software development methods in which requirements and solutions evolve through collaboration between self-organizing, cross-functional teams. In this class, students learn agile practices in software product development, and build up a new leadership toolbox for driving innovation and change, and improve their ability to lead high-performing teams and organizations. Based on iterative and incremental development, students learn adaptive planning, evolutionary development and delivery, a time-boxed iterative approach, encouraging rapid and flexible response to change. Student teams will work on software projects proposed by members of the class.
This is an introductory course that would expose students to the fundamentals of computer networks and mobile systems. This class has no specific prerequisites. The class will begin with introductory concepts of network protocols across different layers of the network stack including routing, transport, naming, addressing and connect them to the core building blocks of the Internet. The second part of the class will focus on networking concepts in the evolution of Web-based systems, providing an introduction to data-center networks, clouds, middle boxes (proxies, firewalls) and next-generation networks. The third part of the class will focus on the fundamental concepts in wireless networks, cellular networks and mobile devices with a specific focus on mobile programming and applications, 802.11 evolution, mobile services and the evolution of cellular networks. The final part of the class will focus on current and trending developments in networks and mobile systems.
Students who have taken CSCI-GA 2620 Networks and Mobile Systems or Networks and Distributed Systems are not eligible to take this course for credit.
Through the 1990s, processors got faster and faster, but around the turn of the millennium, CPUs started to reach physical limits. To drive innovation and produce more powerful computers, manufacturers began to pack multiple cores into each processor. However, most software is conceived by the programmer as a linear progression of instructions. Compilers can find some parallelization opportunities, but that’s not enough to take full advantage of multiple cores. Programmers must take much of the responsibility for making their programs exploit multiple cores, and this course discusses many modern techniques:
- aspects of the architecture of modern machines
- Classic and modern algorithms for coordination and synchronization
- Data structures that exploit and extract performance from multiple cores
- Current and future programming techniques and best practices for multiple cores
Students will be expected to have experience with a programming-intensive course, as well as some experience with C/C++. The course will include lectures, homework, labs, a final project, and a final exam.
This is a capstone course that connects students directly with real-world information technology problems. The goal of this course is to teach the skills needed for success in real-world information technology via a combination of classroom lectures and practical experience with large projects that have been specified by local “clients.” The typical clients are primarily companies, but can also be government agencies or nonprofit organizations. Each project lasts for the entire semester and is designed to involve the full software project life cycle. Examples of such projects are development of software to solve a business problem, including specifying requirements, writing and testing prototype code, and writing a final report; and evaluation of commercial software to be purchased to address a business problem, including gathering requirements, designing an architecture to connect the new software with existing systems, and assessing the suitability of available software products.
Large-scale programming project or research in cooperation with a faculty member.
Large-scale programming project or research in cooperation with a faculty member.
Large-scale programming project or research in cooperation with a faculty member.
Large-scale programming project or research in cooperation with a faculty member.
Large-scale programming project or research in cooperation with a faculty member.
Large-scale programming project or research in cooperation with a faculty member.
Large-scale programming project or research in cooperation with a faculty member.
Participation in a programming project or research project conducted outside the university in a governmental, commercial, or academic setting. Open only to graduate students with permission of the Director of Graduate Studies (DGS). Students must submit a brief written description of their work to the DGS before starting the internship and submit a written summary of their work when it is completed. MS students may repeat this course a maximum of two times. PhD students who wish to take this course more than four times need to request a special permission and provide adequate academic justification.
Section 1 is for Master's students. Section 2 is for Ph.D. students.
Participation in a programming project or research project conducted outside the university in a governmental, commercial, or academic setting. Open only to graduate students with permission of the Director of Graduate Studies (DGS). Students must submit a brief written description of their work to the DGS before starting the internship and submit a written summary of their work when it is completed. MS students may repeat this course a maximum of two times. PhD students who wish to take this course more than four times need to request a special permission and provide adequate academic justification.
Section 1 is for Master's students. Section 2 is for Ph.D. students.
This course teaches key mathematical concepts using the new Python programming language. The first part of the course teaches students how to use the basic features of Python: operations with numbers and strings, variables, Boolean logic, control structures, loops and functions. The second part of the course focuses on the phenomena of growth and decay: geometric progressions, compound interest, exponentials and logarithms. The third part of the course introduces three key mathematical concepts: trigonometry, counting problems and probability. Students use Python to explore the mathematical concepts in labs and homework assignments. No prior knowledge of programming is required.
This course teaches key mathematical concepts using the new Python programming language. The first part of the course teaches students how to use the basic features of Python: operations with numbers and strings, variables, Boolean logic, control structures, loops and functions. The second part of the course focuses on the phenomena of growth and decay: geometric progressions, compound interest, exponentials and logarithms. The third part of the course introduces three key mathematical concepts: trigonometry, counting problems and probability. Students use Python to explore the mathematical concepts in labs and homework assignments. No prior knowledge of programming is required.
Many problems in science, business, and politics require heuristics—problem-solving techniques that often work well but give imperfect guarantees. This course teaches heuristics as they apply to the design of scientific experiments, the resolution of economic or political negotiations, and the construction of engineering devices in hostile environments. Students will work in small teams that will solve puzzles, conduct experiments, and build strategies for a competitive auction game. Students will use and learn computational tools, such as Python. The intent is to make you better able to face complex problems in any field of study you choose.