CHEM 280: Foundations of Programming and Software Engineering  This course provides an overview of topics relevant to programming and creating software projects. The course will be taught in collaboration with members of the Molecular Sciences Software Institute (MolSSI). Students will learn basic syntax, use cases, and ecosystems for Python and C++. Students will become familiar with tools and practices commonly used in software development such as version control, documentation, and testing. Central to this course is a hands on molecular simulation project where students work in groups to create a software package using concepts taught in the course.  2 units
CHEM 275A: Introduction to Programming Languages – C++ and Python This course provides in-depth coverage of programming concepts and techniques required for

scientific computing, data science, and high-performance computing using C++ and Python. The

course will compare and contrast the functionalities of the two languages. Topics include classes,

overloading, data abstraction, information hiding, encapsulation, inheritance, polymorphism, file

processing, templates, exceptions, container classes, and low-level language features. Numerous

exercises based on molecular science problems will provide the hands-on experience needed to

learn these languages. This course serves as a prerequisite to later MSSE courses in Data Science

and Machine Learning and Deep Learning, and to Software Engineering for Scientific Computing,

Computational Chemistry and Materials Science, and Parallel Computing.

3 units
CHEM 275B : Introduction to Software Engineering Best Practices This course will advance students’ understanding of the different steps involved in software

design. Students will acquire hands-on experience in practical problems such as specifying,

designing, building, testing, and delivering reliable software systems for scientific computing.

Students will collaboratively develop a software engineering package, thus gaining experience in

all aspects of the software development process from the feasibility study to the final delivery of

the product. This course is a prerequisite to MSSE courses in Software Engineering for Scientific

Computing, Computational Chemistry and Materials Science, and Parallel Computing.

3 units
CS 200: Principles and Techniques of Data Science  Explores the data science lifecycle: question formulation, data collection and cleaning, exploratory, analysis, visualization, statistical inference, prediction, and decision-making. Focuses on quantitative critical thinking and key principles and techniques: languages for transforming, querying and analyzing data; algorithms for machine learning methods: regression, classification and clustering; principles of informative visualization; measurement error and prediction; and techniques for scalable data processing. Research term project.  4 units
CHEM W207: Ethics in Molecular Science and Software Engineering  This course will expose students to applied ethics in professional ethics,

information technology, intellectual property, and corporate ethics.

1 unit
CS W208: Machine Learning Algorithms An introduction to mathematical optimization and statistics and “nonalgorithmic”

computation using machine learning. Machine learning prerequisites are introduced

including local and global optimization, various statistical and clustering models, and early metaheuristic

methods such as genetic algorithms and artificial neural networks. Building on this

foundation, current machine learning techniques are covered including Deep Learning networks,

Convolutional neural networks, Recurrent and long short term memory (LSTM) networks, and

support vector machines and Gaussian ridge regression. Various case studies in applying

optimization, statistical modeling, and machine learning methods as classification and regression

tasks in different scientific software areas.

3 units
CHEM 281:  Software Engineering for Scientific Computing   The course covers computer architecture and software features that have the greatest impact on performance. It addresses debugging and performance tunning, detecting memory and stack overwrites, malloc corruption, hotspot, paging, cache misses. A toolbox with common algorithms: sorting, searching, hashing, trees, graph traversing, is followed by common patterns used in object-oriented design. It describes programming paradigms, dynamic libraries, distributed architectures, and services. Lectures on linear algebra and performance libraries are provided as background for future courses. HPC paradigms and GPU programming are introduced. Software packaging, extensibility, and interactivity is followed by team development, testing and hardening.  3 units
CHEM 279: Numerical Algorithms applied to Computational Quantum Chemistry   An introduction to numerical algorithms, their application to computational quantum chemistry, and best practices for software implementation, and reuse. This course covers a toolbox of useful algorithms from applied mathematics that are used in physical simulations. They are illustrated via computer implementation of density functional theory for modeling chemical reaction mechanisms from quantum mechanics. Topics covered include local optimization, numerical derivatives and numerical integration, dense linear algebra the symmetric eigenvalue problem, the singular value decomposition, and the fast Fourier transform. More specialized topics as time permits. Students are guided through principles of procedural and object-oriented programming in C++, as well as usage of efficient numerical libraries.  3 units
CS W267: Applications of Parallel Computers Parallel programming, from laptops to supercomputers to the cloud. Goals include writing programs that run fast while minimizing programming effort. Parallel architectures and programming languages and models, including shared memory (eg OpenMP on your multicore laptop), distributed memory (MPI and UPC on a supercomputer), GPUs (CUDA and OpenCL), and cloud (MapReduce, Hadoop and Spark). Parallel algorithms and software tools for common computations (eg dense and sparse linear algebra, graphs, structured grids). Tools for load balancing, performance analysis, debugging. How high level applications are built (eg climate modeling). On-line lectures and office hours. 3 units