@@ -323,37 +323,35 @@ Base.transpose(d::TensorSpace) = TensorSpace(d.spaces[2],d.spaces[1])
323
323
324
324
325
325
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 ))),
329
333
Val{true })
330
334
335
+ function * (T:: $Typ{<:Any,<:TensorSpace,true} , M:: AbstractMatrix )
336
+ n= size (M,1 )
331
337
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
334
346
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
340
351
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)
348
352
end
349
353
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}
357
355
NM= n
358
356
if isfinite (dimension (sp. spaces[1 ])) && isfinite (dimension (sp. spaces[2 ]))
359
357
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}
368
366
end
369
367
370
368
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)),
372
370
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
400
372
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))
403
374
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
462
381
463
382
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)
465
387
end
466
388
389
+ * (T:: ITransformPlan{<:Any,<:TensorSpace,true} ,v:: AbstractVector ) =
390
+ vec (T* totensor (T. space,v))
467
391
468
392
469
393
# # points
0 commit comments