Skip to content

Commit 10cd94b

Browse files
authored
generalise affine (#164)
1 parent 54c1c12 commit 10cd94b

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

src/maps.jl

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ AffineQuasiVector(A, x::AffineQuasiVector, b) = AffineQuasiVector(A*x.A, x.x, A*
6262
axes(A::AbstractAffineQuasiVector) = axes(A.x)
6363

6464
affine_getindex(A, k) = A.A*A.x[k] .+ A.b
65-
Base.unsafe_getindex(A::AbstractAffineQuasiVector, k) = A.A*Base.unsafe_getindex(A.x,k) .+ A.b
66-
getindex(A::AbstractAffineQuasiVector, k::Number) = affine_getindex(A, k)
65+
Base.unsafe_getindex(A::AbstractAffineQuasiVector{T}, k) where T = convert(T,A.A*Base.unsafe_getindex(A.x,k) .+ A.b)::T
66+
getindex(A::AbstractAffineQuasiVector{T}, k::Number) where T = convert(T,affine_getindex(A, k))::T
6767
function getindex(A::AbstractAffineQuasiVector, k::Inclusion)
6868
@boundscheck A.x[k] # throws bounds error if k ≠ x
6969
A
@@ -120,12 +120,20 @@ AffineMap(domain::AbstractQuasiVector{T}, range::AbstractQuasiVector{V}) where {
120120
union(d::AffineMap) = d.range
121121
measure(x::Inclusion{<:Any,<:AbstractInterval}) = last(x)-first(x)
122122

123-
function getproperty(A::AffineMap, d::Symbol)
124-
domain, range = getfield(A, :domain), getfield(A, :range)
125-
d == :x && return domain
126-
d == :A && return measure(range)/measure(domain)
127-
d == :b && return (last(domain)*first(range) - first(domain)*last(range))/measure(domain)
128-
getfield(A, d)
123+
function affinemap_A(m::AffineMap{<:Number,<:Inclusion{<:Number},<:Inclusion{<:Number}})
124+
domain, range = getfield(m, :domain), getfield(m, :range)
125+
measure(range)/measure(domain)
126+
end
127+
function affinemap_b(m::AffineMap{<:Number,<:Inclusion{<:Number},<:Inclusion{<:Number}})
128+
domain, range = getfield(m, :domain), getfield(m, :range)
129+
(last(domain)*first(range) - first(domain)*last(range))/measure(domain)
130+
end
131+
132+
function getproperty(m::AffineMap, d::Symbol)
133+
d == :x && return getfield(m, :domain)
134+
d == :A && return affinemap_A(m)
135+
d == :b && return affinemap_b(m)
136+
getfield(m, d)
129137
end
130138

131139
function getindex(A::AffineMap{T}, k::Number) where T

0 commit comments

Comments
 (0)