Object Spreadsheets (joint work with SDG) —
Attempts to make data-driven programming more accessible to end-users by imitating the look-and-feel of spreadsheets. The design comprises of a hybrid tabular-hierarchical data model, a query language for writing formulas, and an IDE.People: Shachar Itzhaky, Matt McCutchen

Cyber-Physical Security —
Safety-critical embedded systems are vulnerable to combinations of cyber and physical attacks. Examples include Stuxnet attacks on power grids and GPS spoofing. We use program analysis and synthesis techniques to analyze security vulnerability and develop defense mechanisms.
People: Sicun Gao

Control Design Automation —
To design controllers for dynamical systems is to solve a special class of program synthesis problems. We exploit the connection between control theory and formal methods to develop automated methods for hybrid and nonlinear control.People: Sicun Gao

DemoMatch —
Have you ever seen an app do something and thought “I want my app to do that too?” DemoMatch gives you a tutorial for doing something with a framework simply by observing another program doing so.Jimmy Koppel

Synquid —
Synquid stands for SYNthesis from liQUID types. It extends the Liquid Types framework, used successfully in program verification, to the domain of program synthesis, exploiting the combination of types and SMT-decidable predicates to generate provably correct programs in a modular fashion.People: Nadia Polikarpova

3cobblers —
3cobblers is an approximate program synthesis framework. Rather than synthesizing a correct program all at once, which can be difficult, it synthesizes a sequence of simpler approximate programs that approaches the correct program.People: Evan Pu

AutoSMT —
AutoSMT is a framework for automatically generating domain-specific rewriters for SMT problems. The generated problem rewriters are auto-tuned to performance of a specific solver for problems from a particular domain.People: Rohit Singh

PUBLICATIONS

ALUMNI

UROP

If you are an MIT student and you are interested in working with us, check out our list of open UROP/MEng project below.

Parametric Inversion of Non-Invertible Functions —
We are developing exciting algorithms to run complicated programs backwards, literally.
The goal is straightforward: to take a program (e.g. a rendering function which maps geometry to images), and construct an inverse program (e.g. which maps images to geometry).
Executing a program backwards is non-trivial, so we apply a combination of semantic program analysis and machine learning to help.
We have a number of possible projects for a UROP:

To invert bigger and more complex programs

As we've indicated, one application we're particularly interested in is vision as the inverse of 3D rendering.

To extend the kinds of programs we can invert (e.g. to imperative or recursive programs; dynamical systems)

To invert random variables for Bayesian inference

To analyze the static and dynamic behavior of the forward function with machine learning to assist with its inversion

The greater your skill set and interests overlap with the following set, the stronger we urge you to get in touch:
{program analysis, (deep) machine learning, probabilistic inference, computer graphics, planning, reinforcement learning, constraint solving}

Prerequisites:

Solid programming ability required, in any of Python, Lua, Julia and C++

Synthesis of Functional Programs with Refinement Types —
We are developing Synquid: a tool that automatically synthesizes recursive functional programs given a specification in the form of a refinement type.
For example, you can ask Synquid to generate a function that deletes a value x from a list xs by specifying its refinement type as x: a -> xs: [a] -> {v: [a] | elems v = elems xs - {x}}.
There are plenty of opportunities for extending Synquid as part of a UROP, UAP, or an MEng project:
we are looking into making the specification language more expressive (for instance, by allowing the user to supply input-output examples),
synthesizing programs with optimal computational complexity,
using the tool to repair buggy programs,
and much more!

Different representation, same program: Synthesizing the difference away —
We’ve built tools that write your programs, rewrite your programs to make them faster, and fix your bugs. Now we are working on making these tools easy enough to build that you can have them for every problem.
One barrier is reuse: If someone’s spent millions building a name-resolver for C++, I likely can’t use it in my bug-fixing tool, because they’ll use different representations for the same program. We are hiring a UROP to work on using program synthesis to bridge the gap between different representations of programs, such as synthesizing programs that translate from one tool to another, or even automatically transforming tools that work on one representation to work on another.
This project should be an excellent way to learn program synthesis. The more knowledge of the following you have, the more prepared you’ll be: compilers, functional programming (especially Haskell), dynamic programming.