Extrapolation behavior

1. Simple extrapolation

Extrapolation in Interpolations.jl takes several forms. The simplest, is when the extrapolation behavior can be described with the following pseudo-code:

if (the coordinate is outside the domain) then
    do something that is
        * well defined without looking at the data set
        * decides the outcome (error/return value) of the indexing operation
end

proceed to inbounds interpolation

An example of this interpolation behavior is ExtrapError, which simply throws a bounds error if the coordinate is outside the domain. Interpolations.jl could support, for example, the following variants:

  • ExtrapError: Throws a BoundsError, just like Grid.jl
  • ExtrapNaN: Returns convert(T, NaN), where T is eltype(data)
  • ExtrapNull: Returns a value-less Nullabel{T}

2. Index transformation extrapolation

The next form is index transformation, which can be described as

if (the coordinate is outside the domain) then
    calculate an index that is inside the domain, which gives
    the extrapolated value
end

proceed to inbounds interpolation (using the transformed index)

An example here is ExtrapPeriodic, which transforms the coordinate index to one which is inside the domain by means of modulo calculations. Another example is ExtrapConstant, which clamps out-of-bounds coordinates to their nearest inbounds data point.

For some of these, extra care needs to be taken in higher dimensions, when deciding what happens in the "outside corners":

          |               |     what happens here?
          |               |
----------+---------------+--------
          |               |
          |   the domain  |
          |               |
----------+---------------+--------
          |               |
          |               |    ...and here?