Skip to content

Projection for x:: AbstractRange #437

Open
@mcabbott

Description

@mcabbott

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    ProjectTorelated to the projection functionality

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions