Exploiting coarse-grained task, data, and pipeline parallelism in stream programs
Introduction to the theory of computation