## DiffTaichi: Differentiable Programming for Physical Simulation (ICLR 2020)

*Yuanming Hu, Luke Anderson, Tzu-Mao Li, Qi Sun, Nathan Carr, Jonathan Ragan-Kelley, Frédo Durand*

[Paper] [Video] (with instructions to reproduce every demo)

### Differentiable programming in Taichi allows you to optimize neural network controllers efficiently with brute-force gradient descent, instead of using reinforcement learning.

The *DiffTaichi* differentiable programming framework is now officially part of Taichi. This repo only contains examples.

DiffTaichi significantly boosts the performance and productivity of differentiable physical simulators. For example, the differentiable elastic object simulator (ChainQueen) in DiffTaichi is 188x faster than an implementation in TensorFlow. The DiffTaichi version also runs as fast as the CUDA implementation, with the code being 4.2x shorter.

Most of the 10 differentiable simulators can be implemented **within 2-3 hours**.

Questions regarding the simulators/autodiff compiler go to Yuanming Hu (yuanming **at** mit.edu) or Issues.

### Note: please make sure you are using Taichi >= v0.6.7

## How to run

Step 1: Install `Taichi`

with `pip`

:

(Most examples do **not** need a GPU to run.)

`python3 -m pip install taichi`

Step 2: Run example scripts in the `examples`

folder: (Please wait for all GIFs to load :-)

`python3 diffmpm.py`

]

Differentiable Elastic Object Simulator [Gradient descent iteration 0 and gradient descent iteration 80:

`python3 diffmpm3d.py`

]

Differentiable 3D Elastic Object Simulator [Gradient descent iteration 40:

`python3 liquid.py`

]

Differentiable 3D Fliud Simulator [Gradient descent iteration 450:

`python3 wave.py`

]

Differentiable Height Field Water Simulator [Gradient descent iteration 180:

`python3 water_renderer.py`

]

Differentiable (Adversarial) Water Renderer [Differentiable water simulation + differentiable water rendering + (differentiable) CNN

**Optimization goal:** find an initial water height field, so that after simulation and shading, VGG16 thinks the squirrel image is a goldfish. Input image: VGG16=fox squirrel (42.21%)

**Left:** center activation . **Right:** An activation that fools VGG (VGG16=goldfish (99.91%))

`python3 rigid_body.py [1/2] train`

]

Differentiable Rigid Body Simulator [2048 time steps. Gardient descent iteration 20:

`python3 mass_spring.py [1/2/3] train`

]

Differentiable Mass-Spring Simulator [682 time steps. Gardient descent iteration 20:

`python3 billiards.py`

]

Differentiable Billiard Simulator [Gardient descent iteration 0 and gradient descent iteration 100:

See the video for the remaining two simulators.

## Bibtex

```
@article{hu2019difftaichi,
title={DiffTaichi: Differentiable Programming for Physical Simulation},
author={Hu, Yuanming and Anderson, Luke and Li, Tzu-Mao and Sun, Qi and Carr, Nathan and Ragan-Kelley, Jonathan and Durand, Fr{\'e}do},
journal={arXiv preprint arXiv:1910.00935},
year={2019}
}
```