Gradient-based inversion methods often require the use of adjoint operators Claerbout (1994). In programming an operator and its adjoint, we generally loop over the same space independent of whether we desire the forward or adjoint operation. This means that in one of the two cases a subroutine/operator loops over its input space and in the other it loops over its output space. For many operators, this detail can have a significant negative effect on the output. For example, we can neither stack reflections nor collapse diffractions perfectly even with exact velocities. A physical explanation for this shortcoming is found in Ji 1992: the wave equation is a unitary operator that we measure in continuous space. However, our operators must work in discrete and finite space. An important factor in approximating a continuous space with a discrete one is evenness of sampling, and we will see that designing operators to loop over input or output space has a major impact on how the output of the operator samples the input.
For wave-equation based operators, it seems always preferable to loop over the output space. This means that each bin in the output space scans the inputs for the appropriate value or values to pull in. The number of inputs per output varies smoothly across the output space. Looping the other way, pushing values from input bins into whatever outputs are appropriate, carries with it the inevitability that the number of input values per output will not be a smooth function, and the possibility that it may actually be zero in some areas. However, looping over inputs is a natural consequence of using adjoints to find the gradient in an inverse problem, and so seems more or less unavoidable.
The question arises whether it is better to use an approximate adjoint, which will not generally provide the exact gradient direction for the inversion, but which will have smoothly sampled outputs in both the forward and adjoint operations. We can recode our operators so that they loop over the output space in both the forward and adjoint directions. Claerbout 1995 labels such an operator a pull adjoint. Such an operator does not precisely fit our conjugate gradient optimization theory, but is attractive because it more closely approximates an operator in a continuum, and is closer to being a unitary operator like the wave equation.
In this paper, I describe some of the details behind implementing pull adjoints, and present examples which highlight their 0.