UNDERGRADUATE PROGRAM

Turning Passion to Purpose

**** 3-year undergraduate honours program available without minors.

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 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.

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 life-long 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 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.

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 calculus-based 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 high-school 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 second-year 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 elementary-high 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, context-free grammars, and Turing machines. These models provide a mathematical basis for the study of computability theory—the examination of what problems can be solved and what problems cannot be solved—and the study of complexity theory—the examination of how efficiently problems can be solved, 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 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.

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 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 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 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.

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 real-world distributed systems case studies, including Google and Amazon. Students will understand how large-scale 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 calculus-based 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 high-school 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 second-year 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 elementary-high 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, context-free grammars, and Turing machines. These models provide a mathematical basis for the study of computability theory—the examination of what problems can be solved and what problems cannot be solved—and the study of complexity theory—the examination of how efficiently problems can be solved, 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 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.

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 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 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 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.

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 real-world distributed systems case studies, including Google and Amazon. Students will understand how large-scale 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 calculus-based 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 high-school 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 second-year 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 elementary-high 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, context-free grammars, and Turing machines. These models provide a mathematical basis for the study of computability theory—the examination of what problems can be solved and what problems cannot be solved—and the study of complexity theory—the examination of how efficiently problems can be solved, 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 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.

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 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 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 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.

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 real-world distributed systems case studies, including Google and Amazon. Students will understand how large-scale 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.