The past couple of decades has 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.
Computer Science at FLAME 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 interdisciplinary 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.
PROGRAM AIMS
The Computer Science Major 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 lifelong learning and development to keep pace with the advances made in the field.
The Computer Science 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 lifelong 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.
COURSES (CORE AND ELECTIVE)
34 MAJOR COURSES
Introduction to Programming 
Systems Programming 
Mathematical Optimization 
Introduction to Discrete Mathematics 
Introduction to Theory of Computation 
Software Architecture and Engineering * 
Elements of Probability 
Introduction to Probability and Statistics 
Advanced Machine Learning * 
Introductory Calculus 
Business Ideation and Lean Startup 
Fundamentals of Distributed Systems * 
Introduction to Internet of Things 
Principles of Machine Learning 
Applied Probability and Simulation * 
Introduction to Computational Modelling 
Principles of Operating Systems 
Fundamentals of Computer Security * 
Computer Organization 
Computer Networks 
Cloud Infrastructure and Devops * 
Fundamentals of Data Structures and Algorithms 
Applied Formal Methods 
Compilers and Languages * 
Mathematics for Computer Science 
Numerical Methods 
Computer Simulations * 
Linear Algebra 
Fundamentals of Computer Graphics 
Software Project * 
Design and Analysis of Algorithms 
Fundamentals of Database Systems 

Fundamentals of Computer Architecture 
Web Systems Principles 
* 4th year undergraduate courses
Introduction to Programming
This course introduces students to programming and computational thinking. It shows that the thinking behind programming is an extension of school algebra. Just as the purpose of algebra is to simplify reasoning about relationships in real world situations in terms of numerical relationships, programmers learn to express the essence of real world information and actions in the precise language of computers. Once described properly, a computer can execute them with fidelity. This course shows how ideas such as algebraic variables and operations can be extended with conditionals, recursions, and equational reasoning to express computations.
Introduction to Computational Modeling
This course shows how computers can be used to model phenomena in the world using elementary computational approaches such difference equations. Induction serves as the reasoning principle to plan and understand such programs. This course also introduces gradient descent and elementary neural networks as a model of natural phenomena.
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 structures and various proof techniques and methods for solving different kinds of problems. This course prepares the student to do advanced courses in applied mathematics and computer science.
Introductory Calculus
This course introduces students to the rudiments of calculus and prepares them for study in courses which require calculusbased techniques. It focuses 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 highschool and yet introduces the basics whose mathematical preparation is less advanced.
Introduction to the Internet of Things
This course teaches the basic ideas of protocols and computer communication using Arduino and other kits to build “things that do what you want”. Students should be able to write basic programs that control artifacts such as temperature sensors and take action such as moving a car under the shade in response. This course builds on Students familiarity with programming and computational modelling.
Elements of Probability
This course is about chance and uncertainty. Probability provides us a measure of uncertainty. It is aimed at the first or secondyear college students as an introduction to the rudiments of probabilistic thinking and demands no more mathematical maturity than the ability to count and familiarity with elementaryhigh school algebra. The emphasis will be on problem solving and applications of simple probability concepts to the real world.
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. While concurrently, the role of the fundamental constituents of a computer, the gate, to build the final computing device is emphasized.
Fundamentals of Algorithms and Data Structures
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.
Mathematics for Computer Science
This course builds on elementary discrete mathematics and goes into the details of logic, proofs, graph theory, difference equations (recurrences), elementary abstract algebra and other topics necessary for the analysis of algorithms and the appreciation of formal systems.
Linear Algebra
This course emphasizes matrix and vector calculations and applications. It delves deeply into the theory of Matrices and other algebraic constructs such as Vector spaces, Determinants and Linear Transformations with particular emphasis on understanding the underlying theory and develops the analytical skills to prove theorems. Computational applications will be emphasised.
Fundamentals of Computer Architecture
This course studies the details of instruction set architecture and organization of a modern computer. Principles such as the structure of pipelines, cache design, out of order instructions, are studied. Basics of multi core systems and cache sharing protocols are also studied. The need for lower power in cpus due to the rise of mobile computing is considered.
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. We study the storage of data on file systems including storage structures used in database systems.
Theory of Computation
This course introduces TCS as the study of mathematical models of computation, languages and logic. It introduces the student to the idea of models of computation including finite automata, regular languages, contextfree grammars, and Turing machines. These models provide a mathematical basis for the study of computability theory—the examination of what problems can be solved and what problems cannot be solved—and the study of complexity theory—the examination of how efficiently problems can be solved, including the P versus NP problem.
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 range of approaches and established algorithms for solving common classes of problems. It will cover common programming paradigms like Divide and Conquer, Greedy algorithms, and Dynamic Programming.
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. With emphasis on computational probability and statistics, this course provides a strong foundation for advanced courses in probability and statistics and also provides the basis for data analysis.
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 kmeans 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.
Computer Networks
This course explores the design and implementation of Network systems and protocols. The course covers the structure of the internet and the history of its evolution. Principal programming techniques of networked software will be studied, and issues in Concurrent and Distributed programming will be introduced in this course
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.
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 Optimisation
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 in the course include: projective geometry, ray tracing, bidirectional surface scattering functions, binary space partition trees, matting and compositing, shadow maps, cache management, and parallel processing on GPUs. It is a handson 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 System 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.
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 principlesbased 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.
Fundamentals of Distributed Systems
This course studies the key design principles of distributed systems. Topics include communication protocols, naming, synchronization, consistency and replication, fault tolerance, and security. Students also examine some specific realworld distributed systems case studies, including Google and Amazon. Students will understand how largescale systems are built, and to provide students with the tools necessary to evaluate new technologies after the course ends.
Advanced Machine Learning
This course covers introductory aspects of text mining techniques and methods used for image and video processing. Some of the tools we learn are deep learning techniques, including Convolutional networks, RNNs, LSTM and other topics. We also discuss elements of time series, recommendation systems and similar topics. You will also learn how to use modern tools like TensorFlow.
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.
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.
Compilers and Languages
This course explores principles of various programming languages and their implementation techniques. This includes classical compilers as well as implementations of functional languages, typecheckers, logic programming and other paradigms.
Computer Simulations
This course studies the use of computers for simulations using Agent Based Models and the Science of Networks to understand a variety of phenomena in Economics, Biology, Physics and various situations where scale and complexity play a role.
19 MINOR COURSES
Introduction to Programming 
Fundamentals of Data Structures and Algorithms 
Web Systems Principles * 
Introduction to Discrete Mathematics 
Design and Analysis of Algorithms 
Software Architecture and Engineering * 
Elements of Probability 
Systems Programming 
Advanced Machine Learning * 
Introductory Calculus 
Principles of Machine Learning 
Fundamentals of Distributed Systems * 
Introduction to Internet of Things 
Principles of Operating Systems 
Cloud Infrastructure and Devops * 
Introduction to Computational Modelling 
Fundamentals of Computer Graphics 

Computer Organization 
Fundamentals of Database Systems 

* 4th year undergraduate courses
Introduction to Programming
This course introduces students to programming and computational thinking. It shows that the thinking behind programming is an extension of school algebra. Just as the purpose of algebra is to simplify reasoning about relationships in real world situations in terms of numerical relationships, programmers learn to express the essence of real world information and actions in the precise language of computers. Once described properly, a computer can execute them with fidelity. This course shows how ideas such as algebraic variables and operations can be extended with conditionals, recursions, and equational reasoning to express computations.
Introduction to Computational Modeling
This course shows how computers can be used to model phenomena in the world using elementary computational approaches such difference equations. Induction serves as the reasoning principle to plan and understand such programs. This course also introduces gradient descent and elementary neural networks as a model of natural phenomena.
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 structures and various proof techniques and methods for solving different kinds of problems. This course prepares the student to do advanced courses in applied mathematics and computer science.
Introductory Calculus
This course introduces students to the rudiments of calculus and prepares them for study in courses which require calculusbased techniques. It focuses 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 highschool and yet introduces the basics whose mathematical preparation is less advanced.
Introduction to the Internet of Things
This course teaches the basic ideas of protocols and computer communication using Arduino and other kits to build “things that do what you want”. Students should be able to write basic programs that control artifacts such as temperature sensors and take action such as moving a car under the shade in response. This course builds on Students familiarity with programming and computational modelling.
Elements of Probability
This course is about chance and uncertainty. Probability provides us a measure of uncertainty. It is aimed at the first or secondyear college students as an introduction to the rudiments of probabilistic thinking and demands no more mathematical maturity than the ability to count and familiarity with elementaryhigh school algebra. The emphasis will be on problem solving and applications of simple probability concepts to the real world.
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. While concurrently, the role of the fundamental constituents of a computer, the gate, to build the final computing device is emphasized.
Fundamentals of Algorithms and Data Structures
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.
Mathematics for Computer Science
This course builds on elementary discrete mathematics and goes into the details of logic, proofs, graph theory, difference equations (recurrences), elementary abstract algebra and other topics necessary for the analysis of algorithms and the appreciation of formal systems.
Linear Algebra
This course emphasizes matrix and vector calculations and applications. It delves deeply into the theory of Matrices and other algebraic constructs such as Vector spaces, Determinants and Linear Transformations with particular emphasis on understanding the underlying theory and develops the analytical skills to prove theorems. Computational applications will be emphasised.
Fundamentals of Computer Architecture
This course studies the details of instruction set architecture and organization of a modern computer. Principles such as the structure of pipelines, cache design, out of order instructions, are studied. Basics of multi core systems and cache sharing protocols are also studied. The need for lower power in cpus due to the rise of mobile computing is considered.
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. We study the storage of data on file systems including storage structures used in database systems.
Theory of Computation
This course introduces TCS as the study of mathematical models of computation, languages and logic. It introduces the student to the idea of models of computation including finite automata, regular languages, contextfree grammars, and Turing machines. These models provide a mathematical basis for the study of computability theory—the examination of what problems can be solved and what problems cannot be solved—and the study of complexity theory—the examination of how efficiently problems can be solved, including the P versus NP problem.
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 range of approaches and established algorithms for solving common classes of problems. It will cover common programming paradigms like Divide and Conquer, Greedy algorithms, and Dynamic Programming.
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. With emphasis on computational probability and statistics, this course provides a strong foundation for advanced courses in probability and statistics and also provides the basis for data analysis.
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 kmeans 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.
Computer Networks
This course explores the design and implementation of Network systems and protocols. The course covers the structure of the internet and the history of its evolution. Principal programming techniques of networked software will be studied, and issues in Concurrent and Distributed programming will be introduced in this course
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.
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 Optimisation
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 in the course include: projective geometry, ray tracing, bidirectional surface scattering functions, binary space partition trees, matting and compositing, shadow maps, cache management, and parallel processing on GPUs. It is a handson 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 System 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.
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 principlesbased 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.
Fundamentals of Distributed Systems
This course studies the key design principles of distributed systems. Topics include communication protocols, naming, synchronization, consistency and replication, fault tolerance, and security. Students also examine some specific realworld distributed systems case studies, including Google and Amazon. Students will understand how largescale systems are built, and to provide students with the tools necessary to evaluate new technologies after the course ends.
Advanced Machine Learning
This course covers introductory aspects of text mining techniques and methods used for image and video processing. Some of the tools we learn are deep learning techniques, including Convolutional networks, RNNs, LSTM and other topics. We also discuss elements of time series, recommendation systems and similar topics. You will also learn how to use modern tools like TensorFlow.
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.
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.
Compilers and Languages
This course explores principles of various programming languages and their implementation techniques. This includes classical compilers as well as implementations of functional languages, typecheckers, logic programming and other paradigms.
Computer Simulations
This course studies the use of computers for simulations using Agent Based Models and the Science of Networks to understand a variety of phenomena in Economics, Biology, Physics and various situations where scale and complexity play a role.
26 COMPUTER SCIENCE (HONS) COURSES
Introduction to Programming 
Linear Algebra 
Computer Networks 
Introduction to Discrete Mathematics 
Design and Analysis of Algorithms 
Applied Formal Methods 
Elements of Probability 
Fundamentals of Computer Architecture 
Numerical Methods 
Introductory Calculus 
Systems Programming 
Fundamentals of Computer Graphics 
Introduction to Internet of Things 
Introduction to Theory of Computation 
Fundamentals of Database Systems 
Introduction to Computational Modelling 
Introduction to Probability and Statistics 
Web Systems Principles 
Computer Organization 
Business Ideation and Lean Startup 
Mathematical Optimization 
Fundamentals of Data Structures and Algorithms 
Principles of Machine Learning 
Honours Thesis 
Mathematics for Computer Science 
Principles of Operating Systems 

* 4th year undergraduate courses
Introduction to Programming
This course introduces students to programming and computational thinking. It shows that the thinking behind programming is an extension of school algebra. Just as the purpose of algebra is to simplify reasoning about relationships in real world situations in terms of numerical relationships, programmers learn to express the essence of real world information and actions in the precise language of computers. Once described properly, a computer can execute them with fidelity. This course shows how ideas such as algebraic variables and operations can be extended with conditionals, recursions, and equational reasoning to express computations.
Introduction to Computational Modeling
This course shows how computers can be used to model phenomena in the world using elementary computational approaches such difference equations. Induction serves as the reasoning principle to plan and understand such programs. This course also introduces gradient descent and elementary neural networks as a model of natural phenomena.
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 structures and various proof techniques and methods for solving different kinds of problems. This course prepares the student to do advanced courses in applied mathematics and computer science.
Introductory Calculus
This course introduces students to the rudiments of calculus and prepares them for study in courses which require calculusbased techniques. It focuses 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 highschool and yet introduces the basics whose mathematical preparation is less advanced.
Introduction to the Internet of Things
This course teaches the basic ideas of protocols and computer communication using Arduino and other kits to build “things that do what you want”. Students should be able to write basic programs that control artifacts such as temperature sensors and take action such as moving a car under the shade in response. This course builds on Students familiarity with programming and computational modelling.
Elements of Probability
This course is about chance and uncertainty. Probability provides us a measure of uncertainty. It is aimed at the first or secondyear college students as an introduction to the rudiments of probabilistic thinking and demands no more mathematical maturity than the ability to count and familiarity with elementaryhigh school algebra. The emphasis will be on problem solving and applications of simple probability concepts to the real world.
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. While concurrently, the role of the fundamental constituents of a computer, the gate, to build the final computing device is emphasized.
Fundamentals of Algorithms and Data Structures
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.
Mathematics for Computer Science
This course builds on elementary discrete mathematics and goes into the details of logic, proofs, graph theory, difference equations (recurrences), elementary abstract algebra and other topics necessary for the analysis of algorithms and the appreciation of formal systems.
Linear Algebra
This course emphasizes matrix and vector calculations and applications. It delves deeply into the theory of Matrices and other algebraic constructs such as Vector spaces, Determinants and Linear Transformations with particular emphasis on understanding the underlying theory and develops the analytical skills to prove theorems. Computational applications will be emphasised.
Fundamentals of Computer Architecture
This course studies the details of instruction set architecture and organization of a modern computer. Principles such as the structure of pipelines, cache design, out of order instructions, are studied. Basics of multi core systems and cache sharing protocols are also studied. The need for lower power in cpus due to the rise of mobile computing is considered.
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. We study the storage of data on file systems including storage structures used in database systems.
Theory of Computation
This course introduces TCS as the study of mathematical models of computation, languages and logic. It introduces the student to the idea of models of computation including finite automata, regular languages, contextfree grammars, and Turing machines. These models provide a mathematical basis for the study of computability theory—the examination of what problems can be solved and what problems cannot be solved—and the study of complexity theory—the examination of how efficiently problems can be solved, including the P versus NP problem.
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 range of approaches and established algorithms for solving common classes of problems. It will cover common programming paradigms like Divide and Conquer, Greedy algorithms, and Dynamic Programming.
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. With emphasis on computational probability and statistics, this course provides a strong foundation for advanced courses in probability and statistics and also provides the basis for data analysis.
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 kmeans 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.
Computer Networks
This course explores the design and implementation of Network systems and protocols. The course covers the structure of the internet and the history of its evolution. Principal programming techniques of networked software will be studied, and issues in Concurrent and Distributed programming will be introduced in this course
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.
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 Optimisation
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 in the course include: projective geometry, ray tracing, bidirectional surface scattering functions, binary space partition trees, matting and compositing, shadow maps, cache management, and parallel processing on GPUs. It is a handson 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 System 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.
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 principlesbased 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.
Fundamentals of Distributed Systems
This course studies the key design principles of distributed systems. Topics include communication protocols, naming, synchronization, consistency and replication, fault tolerance, and security. Students also examine some specific realworld distributed systems case studies, including Google and Amazon. Students will understand how largescale systems are built, and to provide students with the tools necessary to evaluate new technologies after the course ends.
Advanced Machine Learning
This course covers introductory aspects of text mining techniques and methods used for image and video processing. Some of the tools we learn are deep learning techniques, including Convolutional networks, RNNs, LSTM and other topics. We also discuss elements of time series, recommendation systems and similar topics. You will also learn how to use modern tools like TensorFlow.
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.
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.
Compilers and Languages
This course explores principles of various programming languages and their implementation techniques. This includes classical compilers as well as implementations of functional languages, typecheckers, logic programming and other paradigms.
Computer Simulations
This course studies the use of computers for simulations using Agent Based Models and the Science of Networks to understand a variety of phenomena in Economics, Biology, Physics and various situations where scale and complexity play a role.