Skip to content

Commit 684c0a6

Browse files
committed
plan_itransform! for TensorSpace
1 parent d63fe22 commit 684c0a6

File tree

2 files changed

+41
-113
lines changed

2 files changed

+41
-113
lines changed

src/Multivariate/TensorSpace.jl

Lines changed: 37 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -323,37 +323,35 @@ Base.transpose(d::TensorSpace) = TensorSpace(d.spaces[2],d.spaces[1])
323323

324324

325325

326-
## Transforms
327-
plan_transform!(S::TensorSpace,M::AbstractMatrix) = TransformPlan(S,((plan_transform(S.spaces[1],size(M,1)),size(M,1)),
328-
(plan_transform(S.spaces[2],size(M,2)),size(M,2))),
326+
## Transforms
327+
328+
for (plan, plan!, Typ) in ((:plan_transform, :plan_transform!, :TransformPlan),
329+
(:plan_itransform, :plan_itransform!, :ITransformPlan))
330+
@eval begin
331+
$plan!(S::TensorSpace, M::AbstractMatrix) = $Typ(S,(($plan(S.spaces[1],size(M,1)),size(M,1)),
332+
($plan(S.spaces[2],size(M,2)),size(M,2))),
329333
Val{true})
330334

335+
function *(T::$Typ{<:Any,<:TensorSpace,true}, M::AbstractMatrix)
336+
n=size(M,1)
331337

332-
function *(T::TransformPlan{TT,SS,true},M::AbstractMatrix) where {SS<:TensorSpace,TT}
333-
n=size(M,1)
338+
for k=1:size(M,2)
339+
M[:,k]=T.plan[1][1]*M[:,k]
340+
end
341+
for k=1:n
342+
M[k,:]=T.plan[2][1]*M[k,:]
343+
end
344+
M
345+
end
334346

335-
for k=1:size(M,2)
336-
M[:,k]=T.plan[1][1]*M[:,k]
337-
end
338-
for k=1:n
339-
M[k,:]=T.plan[2][1]*M[k,:]
347+
function *(T::$Typ{TT,SS,false},v::AbstractVector) where {SS<:TensorSpace,TT}
348+
P = $Typ(T.space,T.plan,Val{true})
349+
P*AbstractVector{rangetype(SS)}(v)
350+
end
340351
end
341-
M
342-
end
343-
344-
function *(T::TransformPlan{TT,SS,true},v::AbstractVector) where {SS<:TensorSpace,TT}
345-
N,M = T.plan[1][2],T.plan[2][2]
346-
V=reshape(v,N,M)
347-
fromtensor(T.space,T*V)
348352
end
349353

350-
function *(T::TransformPlan{TT,SS,false},v::AbstractVector) where {SS<:TensorSpace,TT}
351-
P = TransformPlan(T.space,T.plan,Val{true})
352-
P*AbstractVector{rangetype(SS)}(v)
353-
end
354-
355-
356-
function plan_transform(sp::TensorSpace,::Type{T},n::Integer) where {T}
354+
function plan_transform(sp::TensorSpace, ::Type{T}, n::Integer) where {T}
357355
NM=n
358356
if isfinite(dimension(sp.spaces[1])) && isfinite(dimension(sp.spaces[2]))
359357
N,M=dimension(sp.spaces[1]),dimension(sp.spaces[2])
@@ -368,102 +366,28 @@ function plan_transform(sp::TensorSpace,::Type{T},n::Integer) where {T}
368366
end
369367

370368
TransformPlan(sp,((plan_transform(sp.spaces[1],T,N),N),
371-
(plan_transform(sp.spaces[2],T,M),M)),
369+
(plan_transform(sp.spaces[2],T,M),M)),
372370
Val{false})
373-
end
374-
375-
376-
plan_transform(sp::TensorSpace,v::AbstractVector) = plan_transform(sp,eltype(v),length(v))
377-
378-
379-
380-
381-
# Old
382-
383-
plan_column_transform(S,v) = plan_transform(columnspace(S,1),v)
384-
plan_column_itransform(S,v) = plan_itransform(columnspace(S,1),v)
385-
386-
function itransform!(S::TensorSpace,M::AbstractMatrix)
387-
n=size(M,1)
388-
389-
planc=plan_itransform(factor(S,1),M[:,1])
390-
for k=1:size(M,2)
391-
M[:,k] = planc*M[:,k]
392-
end
393-
394-
planr=plan_itransform(factor(S,2),M[1,:])
395-
for k=1:n
396-
M[k,:]=planr*M[k,:]
397-
end
398-
M
399-
end
371+
end
400372

401-
function itransform!(S::AbstractProductSpace,M::AbstractMatrix)
402-
n=size(M,1)
373+
plan_transform(sp::TensorSpace, v::AbstractVector) = plan_transform(sp,eltype(v),length(v))
403374

404-
## The order matters
405-
pln=plan_column_itransform(S,n)
406-
for k=1:size(M,2)
407-
M[:,k]=itransform(columnspace(S,k),M[:,k],pln)
408-
end
409-
410-
for k=1:n
411-
M[k,:]=itransform(factor(S,2),M[k,:])
412-
end
413-
M
414-
end
415-
416-
417-
function transform!(S::TensorSpace,M::AbstractMatrix{T}) where T
418-
n=size(M,1)
419-
420-
## The order matters!!
421-
# For Disk Space, this is due to requiring decay
422-
# in function
423-
for k=1:n
424-
M[k,:]=transform(factor(S,2),M[k,:])
425-
end
426-
427-
pln=plan_column_transform(S,n)
428-
for k=1:size(M,2)
429-
# col may not be full length
430-
col=pln*M[:,k]
431-
M[1:length(col),k]=col
432-
for j=length(col)+1:n
433-
M[j,k]=zero(T) # fill rest with zeros
434-
end
435-
end
436-
437-
438-
M
439-
end
440-
441-
442-
443-
function transform!(S::AbstractProductSpace,M::AbstractMatrix{T}) where T
444-
n=size(M,1)
445-
446-
## The order matters!!
447-
# For Disk Space, this is due to requiring decay
448-
# in function
449-
for k=1:n
450-
M[k,:]=transform(factor(S,2),M[k,:])
451-
end
452-
453-
pln=plan_column_transform(S,n)
454-
for k=1:size(M,2)
455-
# col may not be full length
456-
col=transform(columnspace(S,k),M[:,k],pln)
457-
M[1:length(col),k]=col
458-
for j=length(col)+1:n
459-
M[j,k]=zero(T) # fill rest with zeros
460-
end
461-
end
375+
function plan_itransform(sp::TensorSpace, v::AbstractVector{T}) where {T}
376+
N,M = size(totensor(sp, v)) # wasteful
377+
ITransformPlan(sp,((plan_itransform(sp.spaces[1],T,N),N),
378+
(plan_itransform(sp.spaces[2],T,M),M)),
379+
Val{false})
380+
end
462381

463382

464-
M
383+
function *(T::TransformPlan{<:Any,<:TensorSpace,true},v::AbstractVector)
384+
N,M = T.plan[1][2],T.plan[2][2]
385+
V=reshape(v,N,M)
386+
fromtensor(T.space,T*V)
465387
end
466388

389+
*(T::ITransformPlan{<:Any,<:TensorSpace,true},v::AbstractVector) =
390+
vec(T*totensor(T.space,v))
467391

468392

469393
## points

src/Space.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,10 @@ plan_itransform!(sp::Space,cfs) = error("Override for $sp")
426426
transform(S::Space,vals) = plan_transform(S,vals)*vals
427427
itransform(S::Space,cfs) = plan_itransform(S,cfs)*cfs
428428

429+
itransform!(S::Space,cfs) = plan_itransform!(S,cfs)*cfs
430+
transform!(S::Space,cfs) = plan_transform!(S,cfs)*cfs
431+
432+
429433
*(P::CanonicalTransformPlan,vals::AbstractVector) = coefficients(P.plan*vals,P.canonicalspace,P.space)
430434
*(P::ICanonicalTransformPlan,cfs::AbstractVector) = P.plan*coefficients(cfs,P.space,P.canonicalspace)
431435

0 commit comments

Comments
 (0)