Open
Description
If we want something like JuliaArrays/FillArrays.jl#153 to project the gradient of a Fill onto a one-dimensional subspace, then I think we probably want something similar for the gradient of a range, but projecting onto a two-dimensional space, parameterised by the endpoints. Before I lose the bit of scrap paper I wrote this on, I think this would look as follows:
ProjectTo(x::AbstractRange) = ProjectTo{AbstractRange}()
function (project::ProjectTo{AbstractRange})(dx::AbstractVector)
L = length(dx)
μ = mean(dx)
# δ = -sum(diff(dx))/2
δ = sum(Base.splat(-), zip(dx, @view dx[2:end]))/2
return LinRange(μ + δ, μ - δ, L)
end
(project::ProjectTo{AbstractRange})(dx::AbstractRange) = dx
Using LinRange
allows for zero slope (e.g. for constant dx
) and skips the high-precision machinery which StepRangeLen
uses to hit endpoints exactly, as I don't think we're concerned about the last digit here. This isn't yet careful about element types etc.