The past few decades have witnessed technological development at a pace unmatched in the history of mankind primarily enabled by rapid advances in computational technologies. There is no aspect of modern life which is untouched by computers. From medical procedures to stocking the fridge, computers are ubiquitous in their presence. As artificial intelligence makes rapid inroads and is threatening to govern every aspect of our lives, it becomes imperative that the study of computer science requires not just understanding of the mathematical and physical aspect of computation but also builds a strong foundation in other disciplines to understand the limitations and ramifications of the adoption of newer methods of computation. This requires that the new generation of computer scientists are trained not only in the core area of computer sciences but also are aware of the disciplines that informs it and the areas that it influences while having the design sensibilities and entrepreneurial energy to build truly great products and make an indelible impact on society.
The specialisation in Computer Science is situated within the broad context of liberal education. While it provides a strong foundation in the theoretical and practical aspects of the discipline, the approach is inter-disciplinary with a heavy focus on the understanding and solution of computational problems that arise in the social sciences, humanities, business, Design, or the physical and natural sciences.
The computer science curriculum is composed of four broad requirements that includes the core, breadth, depth and a project. While the core lays a strong foundation, the breadth shall survey the areas in which computing plays a role. The depth shall include specialised courses in data mining, artificial intelligence, computer security in addition to other applications. The specialisation culminates in the graduation project which provides a platform for applying the learnings to solve a problem of practical interest.
SPECIALISATION AIMS
The Computer Science Major and Minor intends to:
- Equip students with a strong technical foundation to creatively apply computational technologies to solve problems of practical interest.
- Expose students to a wide range of problems from diverse areas and the computational methods employed to solve them.
- Provide skills to succeed and advance in professional careers related to computing or software.
- Provide the basis for advanced studies in the field.
- Develop an entrepreneurial orientation.
- Develop communication and soft skills to function effectively in their profession.
- Inculcate the habit of life-long learning and development to keep pace with the advances made in the field.
MAJOR OUTCOMES: After successful completion of the Major, the student will be able to:
- Apply mathematical and computer science concepts for design and analysis of algorithms, interpreting data and computing solutions
- Apply diverse programming paradigms such as procedural, object oriented, procedural, in a variety of contexts
- Use and apply system design principles to design, plan and implement software projects
- Demonstrate practical knowledge of the latest computing technologies and frameworks
- Understand the importance of computational methods and Information Technology in various fields and create effective solutions to address issues and solve problems
- Evaluate research papers critically and explain the arguments presented in the paper
- Develop research ideas and take initial steps towards addressing them
- Develop original ideas for new ventures in the computing domain and take first steps to implement them
- Demonstrate ability to communicate information and knowledge in a clear, logical and critical manner
MINOR OUTCOMES: After successful completion of the Minor, the student will be able to:
- Apply mathematical and computer science concepts for design and analysis of algorithms, interpreting data and computing solutions
- Apply diverse programming paradigms such as procedural, object oriented, procedural, in a variety of contexts.
- Demonstrate practical knowledge of some of the latest computing technologies and frameworks
- Understand the importance of computational methods and Information Technology in various fields.
- Demonstrate ability to communicate information and knowledge in a clear, logical and critical manner
COURSES (CORE AND ELECTIVE)
35 MAJOR COURSES
Introduction to Programming | Data Structures and Algorithms | Fundamentals of Database Systems |
Introduction to Programming for Beginners | Systems Programming | Web Systems Principles |
Introduction to Programming by Specification | Theory of Computation | Applied Probability and Simulation |
Introduction to Discrete Mathematics | Introduction to Probability and Statistics | Software Architecture and Engineering |
Elements of Probability | Statistics and Optimization for Computing | Advanced Machine Learning |
Introductory Calculus | Principles of Machine Learning | Fundamentals of Distributed Systems |
Introduction to Internet of Things | Principles of Operating Systems | Fundamentals of Computer Security |
Introduction to Computational Modelling | Design and Analysis of Algorithms | Cloud Infrastructure and DevOps |
Computer Organization | Applied Formal Methods | Graduation Project |
Programming in C++ with Lab | Numerical Methods | Compilers and Languages |
Mathematics for Computer Science | Mathematical Optimization | Complexity Theory |
Linear Algebra for Computer Science | Fundamentals of Computer Graphics |
Introduction to Programming
This is a first course in problem solving through computer programming; no previous programming experience is assumed. Programming is introduced as an executable form of mathematics. The course brings a clean separation between the problem, the model and the machine and the 2 basic binding times: program development and program execution
Introduction to Programming for Beginners
This course introduces computer programming, primarily by enabling students to solve simple programming assignments in a chosen high-level programming language (typically Python). It is designed for student without prior programming experience and aims to enable students to perform basic computing and data analysis tasks confidently by the end of the term.
Introduction to Programming by Specification
This course introduces computer programming, primarily by enabling students to solve simple programming assignments in a chosen high-level programming language (typically Python). It is designed for student without prior programming experience and aims to enable students to perform basic computing and data analysis tasks confidently by the end of the term. Case studies, hands-on learning, and real-world problem-solving exercises will be included in the pedagogy to assist students obtain the skills needed for employment.
Introduction to Discrete Mathematics
This course aims to cover the basics of discrete mathematics. Discrete mathematics is the study of discrete mathematical structures which do not rely on the notion of continuity. It introduces fundamental mathematical strucutures and various proof techniques and methods for solving different kind of problems. This course prepares the student to do advanced courses in applied mathematics and computer science.
Elements of Probability
This course is about chance and uncertainty. Probability provides us a measure of uncertainty. It is aimed at the first or second year college student as an introduction to the rudiments of probabilistic thinking and demands no more mathematical maturity than the ability to count and familiarity with elementary high school algebra. The emphasis will be on problem solving and applications of simple probability concepts to the real world.
Introductory Calculus
This course introduces students to the rudiments of calculus and prepares them for study in courses which require calculus based techniques. It focusses primarily on applications and covers the basics of limits, continuity, differentiation and integration of one variable. This course is challenging for those who have done calculus in high-school and yet introduces the basics to those whose mathematical preparation is less advanced
Introduction to Internet of Things
This course teaches the basic ideas of electronic communication and control using microcontroller kits to build “things that do what you want.” Students should be able to write basic programs to make the microcontroller coordinate with various types of hardware. This course builds on students' familiarity with programming and computational modelling. The student will learn to apply the skills and knowledge from these courses to robustly program hardware systems that operate in the uncertainties of a non-virtual world.
Introduction to Computational Modelling
This course illustrates how programs can be used to model real life systems and understand natural phenomenon. In this course we will take phenomenon from physical, chemical and biological sciences and show how they can be studied on a computer. One will understand how computers can be used as a medium for thinking, and not just as an entertainment and utilitarian device. This will be highlighted employing simple agent based models, evolutionary algorithms and simple computational models.
Computer Organization
This course studies the basic instruction set architecture and organization of a modern computer. It adopts a programmer’s perspective of computer systems to execute programs, store information, and communicate. During the course the student is exposed to the fundamentals of translating higher level languages into assembly language, and the interpretation of machine languages by hardware. Basic ideas such as caches, pipelines and their effects on a program are discussed. The approach will involve case studies, hands-on learning, and real-world problem-solving exercises to assist students acquire the skills necessary for the profession.
Programming in C++ with Lab
C++ is a versatile programming language that spans the gamut from low level programming to high level programming. This course introduces elements of low level programming in C++ that requires understanding of low level computer organization. It also teaches show high level aspects such as object oriented and generic programming are used in C++. The course connects the two levels so that students have a good understanding of basics of C++. Case studies, hands-on learning, and real-world problem-solving exercises will be included in the pedagogy to assist students obtain the skills needed for employment.
Mathematics for Computer Science
This course provides computer science students with a strong mathematical foundation necessary for understanding and solving complex computational problems. The course covers essential topics in logic, proofs, abstract algebra, induction, graph theory, and more. Students will develop problem-solving skills and gain insight into mathematical reasoning applicable to various computer science domains.
Linear Algebra for Computer Science
The proposed course teaches students how to manipulate matrices and vectors efficiently. It is an essential tool in solving complex problems in computer science. The course covers topics such as solving equations, algebraic operations with matrices, and the analysis of the properties of matrices and their components. Additionally, students will gain experience using linear algebra to solve problems in fields like machine learning, data analysis, scientific computing, and computer graphics. By the end of the course, students will have a solid understanding of how linear algebra can be used to make informed decisions and solve problems in computer science. The pedagogy will include case-studies, hands-on learning, and real-world problem-solving activities that helps in equipping the student with the skills required in the workforce.
Data Structures and Algorithms
This course builds on the programming skills acquired in Introduction to Programming. It introduces program design, analysis, and verification in relation to the study of data structures. Data structures are common constructs 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 and their algorithms: lists, stacks, queues, trees, hash tables and files. This course is programming intensive where students are expected to write a variety of programs ranging from simple to build more elaborate structures. The emphasis of programming component will be to write clear, modular programs that are easy to read, debug, verify, analyze, and modify.
Systems Programming
This course looks at details of how operating systems and applications interact. We study compilers, linkers, loaders, how system calls are organized, low level memory management. This course also looks at low level data structure implementations in machine level languages like C. Storage of data on file systems including storage structures used in database systems are also discussed. Case studies, hands-on learning, and real-world problem-solving exercises will be included in the pedagogy to assist students obtain the skills needed for employment.
Theory of Computation
This course puts in perspective the theoretical limits of questions like: Is a given problem programmable/decidable ? It demonstrates this by sliding the rheostat from algorithmic complexity to computability. Towards this, the equivalences between Languages and computational machine models are discussed as a relation between their expressive powers. Further, notions of universality are explored putting in context the relevance of modern programming languages
Introduction to Probability and Statistics
This course provides an elementary introduction to probability theory and its application to statistics with emphasis on the theorems and proofs of univariate statistics. Addressed to a beginning Mathematics Major, it provides a foundation for advanced courses in probability and statistics.
Statistics and Optimization for Computing
This course explores the design, implementation, and analysis of machine learning algorithms. This course will introduce supervised learning algorithms such as decision tree learning, support vector machines, and neural networks, unsupervised learning algorithms including k-means and expectation maximization, and reinforcement learning algorithms. It will also introduce methods for the evaluation of learning algorithms, as well as topics in computational learning theory.
Principles of Machine Learning
This course explores the design, implementation, and analysis of machine learning algorithms. This course will introduce supervised learning algorithms such as decision tree learning, support vector machines, and neural networks, unsupervised learning algorithms including k-means and expectation maximization, and reinforcement learning algorithms. It will also introduce methods for the evaluation of learning algorithms, as well as topics in computational learning theory.
Principles of 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, Operating system and architecture interaction.
Design and Analysis of Algorithms
This course explores the methods for the design of efficient and reliable algorithms. It introduces common techniques to decrease computational resources to find solutions to problems. It will also introduce the mathematical framework for evaluating the correctness, running time and space requirements of algorithms. It will review common data structures and their applications and introduce a wide range of approaches and established algorithms for solving common classes of problems. It will cover common programming paradigms like Divide and Conquer, Greedy algorithms, Dynamic Programming to solve a wide variety of problems. Some common Graph algorithms will also be covered.
Applied Formal Methods
This course explores principles and practices of modern formal methods tools such as SAT Solvers, Model Checkers, Provers, and Type checkers. Examples include TLA, Alloy, Lean, and the Rust borrow checker. We study the basic ideas and applications of these tools. The approach will involve case studies, hands-on learning, and real-world problem-solving exercises to assist students acquire the skills necessary for the profession.
Numerical Methods
This course gives an introduction to the basic techniques for solving problems in science and engineering using numerical methods. It provides students with an understanding of the concepts and knowledge of the theory and practical application of numerical methods.
Mathematical Optimization
Optimization is the process of maximizing or minimizing an objective function that models a quantity of interest (e.g cost, price, effort, distance capacity…) arising in various disciplines in the presence of complicated constraints. In this course students will learn various techniques of optimization for both constrained and unconstrained problems with applications to problems arising in various disciplines
Fundamentals of Computer Graphics
Special effects are ubiquitous in today’s world where images are manipulated and also programmatically created. This course introduces the fundamental methods behind the tools used to manipulate and create images. Beginning with the models of interaction of light/electromagnetic radiation with sensors, and it moves on to study the data structures and processor architectures that allow us to efficiently evaluate that physical model. Topics covered includes: projective geometry, ray tracing, bidirectional surface scattering functions, binary space partition trees, matting and compositing, shadow maps, cache management, and parallel processing on GPUs. It is a hands-on course which requires programming using open graphics libraries for the image creation and rendering.
Fundamentals of Database Systems
This course presents the fundamental concepts of database design and use. It provides a study of data models, data description languages, and query facilities including relational algebra and SQL, data normalization, transactions and their properties, physical data organization and indexing, security issues and object databases, basics of concurrency and crash resistance. Elements of CAP theorem and Big Data databases.
Web Systems Principles
This course introduces the core elements of web and mobile application infrastructure, such as the HTTP protocol, HTML and CSS, and Javascript. We also learn about the issues in creating an always on program, with some elements of Continuous Integration, Deployment and Web Service management. Case studies, hands-on learning, and real-world problem-solving exercises will be included in the pedagogy to assist students obtain the skills needed for employment.
Applied Probability and Simulation
This course introduces probabilistic distributions and stochastic processes. It builds on knowledge acquired from elementary courses in probability and equips them to understand and apply advanced concepts to relatively more complex problems arising in diverse fields where uncertainty is a decisive factor.
Software Architecture and Engineering
Modern software systems are complex and building a reliable, efficient system is not an easy task. Given the scale of coding involved, it is extremely important to follow a principles-based approach to software design, implementation, and testing. This course explores those methods. Specific topics include: software processes; specifying requirements and verifying correctness; software architectures; concurrent, parallel, and scalable systems design; testing and debugging; and performance evaluation. The pedagogy will include case-studies, hands-on learning, and real-world problem-solving activities that helps in equipping the student with the skills required in the workforce.
Advanced Machine Learning
This course covers classical machine learning, gaps of classical approach and deep learning models with application in image and video processing. The approach will involve case studies, hands-on learning, and real-world problem-solving exercises to assist students acquire the skills necessary for the profession.
Fundamentals of 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, naming, synchronization, consistency and replication, fault tolerance, and security. Students also examine some specific real-world distributed systems case studies, including Google and Amazon. 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.
Fundamentals of Computer Security
Security is now a core requirement when creating systems and software. This course will introduce students to the fundamentals of computer security and elements of applied cryptography. Topics include software vulnerability analysis, defense, and exploitation, reverse engineering, networking and website security and security standards and policies. Students will also learn the fundamental methodology for how to design and analyze system security.
Cloud Infrastructure and DevOps
This course studies systems issues in deploying and managing cloud infrastructure and system maintenance, including issues in upgrading systems without degrading user service, managing the evolution of versions, managing software development on local machines and cloud etc. Case studies, hands-on learning, and real-world problem-solving exercises will be included in the pedagogy to assist students obtain the skills needed for employment.
Compilers and Languages
This course delves into various advanced programming paradigms and techniques, providing students with a deep understanding of diverse programming approaches and tools. Topics covered include logic programming, constraint programming, rewriting systems, compiler construction, functional language implementations, type checking, modern language implementation challenges, and processing tools. Hands-on learning, and real-world problem-solving exercises will be included in the pedagogy to assist students obtain the skills needed for employment.
Complexity Theory
This course discusses the fundamental principles of complexity theory. The course studies Turing Machines and Simulations and Time Complexity. The core ideas of classes such as P and NP are introduced. Students will be shown how to prove membership in classes using simulations. Space complexity is also discussed. The importance of the P = NP problem and its ramifications are considered. The pedagogy will include case-studies, hands-on learning, and real-world problem-solving activities that helps in equipping the student with the skills required in the workforce.
35 MINOR COURSES
Introduction to Programming | Data Structures and Algorithms | Fundamentals of Database Systems |
Introduction to Programming for Beginners | Systems Programming | Web Systems Principles |
Introduction to Programming by Specification | Theory of Computation | Applied Probability and Simulation |
Introduction to Discrete Mathematics | Introduction to Probability and Statistics | Software Architecture and Engineering |
Elements of Probability | Statistics and Optimization for Computing | Advanced Machine Learning |
Introductory Calculus | Principles of Machine Learning | Fundamentals of Distributed Systems |
Introduction to Internet of Things | Principles of Operating Systems | Fundamentals of Computer Security |
Introduction to Computational Modelling | Design and Analysis of Algorithms | Cloud Infrastructure and DevOps |
Computer Organization | Applied Formal Methods | Graduation Project |
Programming in C++ with Lab | Numerical Methods | Compilers and Languages |
Mathematics for Computer Science | Mathematical Optimization | Complexity Theory |
Linear Algebra for Computer Science | Fundamentals of Computer Graphics |
Introduction to Programming
This is a first course in problem solving through computer programming; no previous programming experience is assumed. Programming is introduced as an executable form of mathematics. The course brings a clean separation between the problem, the model and the machine and the 2 basic binding times: program development and program execution
Introduction to Programming for Beginners
This course introduces computer programming, primarily by enabling students to solve simple programming assignments in a chosen high-level programming language (typically Python). It is designed for student without prior programming experience and aims to enable students to perform basic computing and data analysis tasks confidently by the end of the term.
Introduction to Programming by Specification
This course introduces computer programming, primarily by enabling students to solve simple programming assignments in a chosen high-level programming language (typically Python). It is designed for student without prior programming experience and aims to enable students to perform basic computing and data analysis tasks confidently by the end of the term. Case studies, hands-on learning, and real-world problem-solving exercises will be included in the pedagogy to assist students obtain the skills needed for employment.
Introduction to Discrete Mathematics
This course aims to cover the basics of discrete mathematics. Discrete mathematics is the study of discrete mathematical structures which do not rely on the notion of continuity. It introduces fundamental mathematical strucutures and various proof techniques and methods for solving different kind of problems. This course prepares the student to do advanced courses in applied mathematics and computer science.
Elements of Probability
This course is about chance and uncertainty. Probability provides us a measure of uncertainty. It is aimed at the first or second year college student as an introduction to the rudiments of probabilistic thinking and demands no more mathematical maturity than the ability to count and familiarity with elementary high school algebra. The emphasis will be on problem solving and applications of simple probability concepts to the real world.
Introductory Calculus
This course introduces students to the rudiments of calculus and prepares them for study in courses which require calculus based techniques. It focusses primarily on applications and covers the basics of limits, continuity, differentiation and integration of one variable This course is challenging for those who have done calculus in high-school and yet introduces the basics to those whose mathematical preparation is less advanced
Introduction to Internet of Things
This course teaches the basic ideas of electronic communication and control using microcontroller kits to build “things that do what you want.” Students should be able to write basic programs to make the microcontroller coordinate with various types of hardware. This course builds on students' familiarity with programming and computational modelling. The student will learn to apply the skills and knowledge from these courses to robustly program hardware systems that operate in the uncertainties of a non-virtual world.
Introduction to Computational Modelling
This course illustrates how programs can be used to model real life systems and understand natural phenomenon. In this course we will take phenomenon from physical, chemical and biological sciences and show how they can be studied on a computer. One will understand how computers canbe used as a medium for thinking, and not just as an entertainment and utilitarian device. This will be highlighted employing simple agent based models , evolutionary algorithms and simple computational models.
Computer Organization
This course studies the basic instruction set architecture and organization of a modern computer. It adopts a programmer’s perspective of computer systems to execute programs, store information, and communicate. During the course the student is exposed to the fundamentals of translating higher level languages into assembly language, and the interpretation of machine languages by hardware. Basic ideas such as caches, pipelines and their effects on a program are discussed. The approach will involve case studies, hands-on learning, and real-world problem-solving exercises to assist students acquire the skills necessary for the profession.
Programming in C++ with Lab
C++ is a versatile programming language that spans the gamut from low level programming to high level programming. This course introduces elements of low level programming in C++ that requires understanding of low level computer organization. It also teaches show high level aspects such as object oriented and generic programming are used in C++. The course connects the two levels so that students have a good understanding of basics of C++. Case studies, hands-on learning, and real-world problem-solving exercises will be included in the pedagogy to assist students obtain the skills needed for employment.
Mathematics for Computer Science
This course provides computer science students with a strong mathematical foundation necessary for understanding and solving complex computational problems. The course covers essential topics in logic, proofs, abstract algebra, induction, graph theory, and more. Students will develop problem-solving skills and gain insight into mathematical reasoning applicable to various computer science domains.
Linear Algebra for Computer Science
The proposed course teaches students how to manipulate matrices and vectors efficiently. It is an essential tool in solving complex problems in computer science. The course covers topics such as solving equations, algebraic operations with matrices, and the analysis of the properties of matrices and their components. Additionally, students will gain experience using linear algebra to solve problems in fields like machine learning, data analysis, scientific computing, and computer graphics. By the end of the course, students will have a solid understanding of how linear algebra can be used to make informed decisions and solve problems in computer science. The pedagogy will include case-studies, hands-on learning, and real-world problem-solving activities that helps in equipping the student with the skills required in the workforce.
Data Structures and Algorithms
This course builds on the programming skills acquired in Introduction to Programming. It introduces program design, analysis, and verification in relation to the study of data structures. Data structures are common constructs 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 and their algorithms: lists, stacks, queues, trees, hash tables and files. This course is programming intensive where students are expected to write a variety of programs ranging from simple to build more elaborate structures. The emphasis of programming component will be to write clear, modular programs that are easy to read, debug, verify, analyze, and modify.
Systems Programming
This course looks at details of how operating systems and applications interact. We study compilers, linkers, loaders, how system calls are organized, low level memory management. This course also looks at low level data structure implementations in machine level languages like C. Storage of data on file systems including storage structures used in database systems are also discussed. Case studies, hands-on learning, and real-world problem-solving exercises will be included in the pedagogy to assist students obtain the skills needed for employment.
Theory of Computation
This course puts in perspective the theoretical limits of questions like: Is a given problem programmable/decidable? It demonstrates this by sliding the rheostat from algorithmic complexity to computability. Towards this, the equivalences between Languages and computational machine models are discussed as a relation between their expressive powers. Further, notions of universality are explored putting in context the relevance of modern programming languages
Introduction to Probability and Statistics
This course provides an elementary introduction to probability theory and its application to statistics with emphasis on the theorems and proofs of univariate statistics. Addressed to a beginning Mathematics Major, it provides a foundation for advanced courses in probability and statistics.
Statistics and Optimization for Computing
This course explores the design, implementation, and analysis of machine learning algorithms. This course will introduce supervised learning algorithms such as decision tree learning, support vector machines, and neural networks, unsupervised learning algorithms including k-means and expectation maximization, and reinforcement learning algorithms. It will also introduce methods for the evaluation of learning algorithms, as well as topics in computational learning theory.
Principles of Machine Learning
This course explores the design, implementation, and analysis of machine learning algorithms. This course will introduce supervised learning algorithms such as decision tree learning, support vector machines, and neural networks, unsupervised learning algorithms including k-means and expectation maximization, and reinforcement learning algorithms. It will also introduce methods for the evaluation of learning algorithms, as well as topics in computational learning theory.
Principles of 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, Operating system and architecture interaction.
Design and Analysis of Algorithms
This course explores the methods for the design of efficient and reliable algorithms. It introduces common techniques to decrease computational resources to find solutions to problems. It will also introduce the mathematical framework for evaluating the correctness, running time and space requirements of algorithms. It will review common data structures and their applications and introduce a wide range of approaches and established algorithms for solving common classes of problems. It will cover common programming paradigms like Divide and Conquer, Greedy algorithms, Dynamic Programming to solve a wide variety of problems. Some common Graph algorithms will also be covered.
Applied Formal Methods
This course explores principles and practices of modern formal methods tools such as SAT Solvers, Model Checkers, Provers, and Type checkers. Examples include TLA, Alloy, Lean, and the Rust borrow checker. We study the basic ideas and applications of these tools. The approach will involve case studies, hands-on learning, and real-world problem-solving exercises to assist students acquire the skills necessary for the profession.
Numerical Methods
This course gives an introduction to the basic techniques for solving problems in science and engineering using numerical methods. It provides students with an understanding of the concepts and knowledge of the theory and practical application of numerical methods.
Mathematical Optimization
Optimization is the process of maximizing or minimizing an objective function that models a quantity of interest (e.g cost, price, effort, distance capacity…) arising in various disciplines in the presence of complicated constraints. In this course students will learn various techniques of optimization for both constrained and unconstrained problems with applications to problems arising in various disciplines
Fundamentals of Computer Graphics
Special effects are ubiquitous in today’s world where images are manipulated and also programmatically created. This course introduces the fundamental methods behind the tools used to manipulate and create images. Beginning with the models of interaction of light/electromagnetic radiation with sensors, and it moves on to study the data structures and processor architectures that allow us to efficiently evaluate that physical model. Topics covered includes: projective geometry, ray tracing, bidirectional surface scattering functions, binary space partition trees, matting and compositing, shadow maps, cache management, and parallel processing on GPUs. It is a hands-on course which requires programming using open graphics libraries for the image creation and rendering.
Fundamentals of Database Systems
This course presents the fundamental concepts of database design and use. It provides a study of data models, data description languages, and query facilities including relational algebra and SQL, data normalization, transactions and their properties, physical data organization and indexing, security issues and object databases, basics of concurrency and crash resistance. Elements of CAP theorem and Big Data databases.
Web Systems Principles
This course introduces the core elements of web and mobile application infrastructure, such as the HTTP protocol, HTML and CSS, and Javascript. We also learn about the issues in creating an always on program, with some elements of Continuous Integration, Deployment and Web Service management. Case studies, hands-on learning, and real-world problem-solving exercises will be included in the pedagogy to assist students obtain the skills needed for employment.
Applied Probability and Simulation
This course introduces probabilistic distributions and stochastic processes. It builds on knowledge acquired from elementary courses in probability and equips them to understand and apply advanced concepts to relatively more complex problems arising in diverse fields where uncertainty is a decisive factor.
Software Architecture and Engineering
Modern software systems are complex and building a reliable, efficient system is not an easy task. Given the scale of coding involved, it is extremely important to follow a principles-based approach to software design, implementation, and testing. This course explores those methods. Specific topics include: software processes; specifying requirements and verifying correctness; software architectures; concurrent, parallel, and scalable systems design; testing and debugging; and performance evaluation. The pedagogy will include case-studies, hands-on learning, and real-world problem-solving activities that helps in equipping the student with the skills required in the workforce.
Advanced Machine Learning
This course covers classical machine learning, gaps of classical approach and deep learning models with application in image and video processing. The approach will involve case studies, hands-on learning, and real-world problem-solving exercises to assist students acquire the skills necessary for the profession.
Fundamentals of 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, naming, synchronization, consistency and replication, fault tolerance, and security. Students also examine some specific real-world distributed systems case studies, including Google and Amazon. 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.
Fundamentals of Computer Security
Security is now a core requirement when creating systems and software. This course will introduce students to the fundamentals of computer security and elements of applied cryptography. Topics include software vulnerability analysis, defense, and exploitation, reverse engineering, networking and website security and security standards and policies. Students will also learn the fundamental methodology for how to design and analyze system security.
Cloud Infrastructure and DevOps
This course studies systems issues in deploying and managing cloud infrastructure and system maintenance, including issues in upgrading systems without degrading user service, managing the evolution of versions, managing software development on local machines and cloud etc. Case studies, hands-on learning, and real-world problem-solving exercises will be included in the pedagogy to assist students obtain the skills needed for employment.
Compilers and Languages
This course delves into various advanced programming paradigms and techniques, providing students with a deep understanding of diverse programming approaches and tools. Topics covered include logic programming, constraint programming, rewriting systems, compiler construction, functional language implementations, type checking, modern language implementation challenges, and processing tools. Hands-on learning, and real-world problem-solving exercises will be included in the pedagogy to assist students obtain the skills needed for employment.
Complexity Theory
This course discusses the fundamental principles of complexity theory. The course studies Turing Machines and Simulations and Time Complexity. The core ideas of classes such as P and NP are introduced. Students will be shown how to prove membership in classes using simulations. Space complexity is also discussed. The importance of the P = NP problem and its ramifications are considered. The pedagogy will include case-studies, hands-on learning, and real-world problem-solving activities that helps in equipping the student with the skills required in the workforce.