Many operators can be coded in either ``push'' or ``pull'' forms, namely, you can loop over the space of outputs and find the inputs (pull), or loop over the space of inputs and find the outputs (push). The adjoint of a push operator is a pull operator and vice versa. Migration can be done with either hyperbolas or diffractors. Inversions impose extra accuracy requirements that may lead to forward modeling being a pull operator. A DMO operator is a product of two operators, either of which is a push or pull, leading to four possible representations.