DECAF: Probability Types

Approximate computing needs programming systems that can bound the chance that a result will be wrong. DECAF (DECAF, an Energy-aware Compiler to make Approximation Flexible) is a language that uses probability types to control incorrectness.


Probability Type Inference for Flexible Approximate Programming. Brett Boston, Adrian Sampson, Dan Grossman, and Luis Ceze. To appear in OOPSLA 2015.

(We’ll post a link to the final version of the paper when it’s ready.)

Source Code

The source code for the compiler, simulator, and benchmarks is available for download. The compiler and simulator are modified versions of the EnerJ infrastructure. You will need three bundles of source code in total:


To build the system, follow the instructions for building EnerJ with the following differences:

Result Data

You can download a tarball of JSON files if you’re interested in using the statistics described in the paper’s evaluation.

Main Results

The main results in the DECAF paper consist of the frequency of different “probability levels” among the operations in the benchmarks. In the paper, the data is shown in Figure 3. The full details for these counts are compiled in the file level_breakdown.json.

The data file is a JSON document containing an object whose keys are the benchmarks in the evaluation. Each benchmark is associated with an object with these keys:

Raw Benchmark Data

The tarball also contains the raw data for each benchmark. There are two files per benchmark: *.continuous.json and *.discrete.json. The former reflects unconstrained runs (i.e., no level-solving) and the latter shows runs with solved probability levels (when this was tractable). The former also contains data for when the continuous levels are rounded post facto.

Each element in the data files corresponds to a configuration of the benchmark. Each configuration contains the number of approximate operations per probability level (“approx”), the number of precise operations (“precise”), the number of dynamically-tracked operations (“dyn”), and the total time in seconds it took to compile the benchmark (“build_time”).