comparison test/testLazyTensors.jl @ 541:62d96e2cd165 refactor/tensor_index_coupling

Make the coupling between all the LazyTensors code and the Index type much weaker to make the module more flexible
author Jonatan Werpers <jonatan@werpers.com>
date Thu, 26 Nov 2020 21:35:34 +0100
parents fc0f942b8792
children 53828d3ed132
comparison
equal deleted inserted replaced
540:013ca4892540 541:62d96e2cd165
6 6
7 @testset "LazyTensors" begin 7 @testset "LazyTensors" begin
8 8
9 @testset "Generic Mapping methods" begin 9 @testset "Generic Mapping methods" begin
10 struct DummyMapping{T,R,D} <: TensorMapping{T,R,D} end 10 struct DummyMapping{T,R,D} <: TensorMapping{T,R,D} end
11 LazyTensors.apply(m::DummyMapping{T,R,D}, v, i::NTuple{R,Index{<:Region}}) where {T,R,D} = :apply 11 LazyTensors.apply(m::DummyMapping{T,R,D}, v, I::Vararg{Any,R}) where {T,R,D} = :apply
12 @test range_dim(DummyMapping{Int,2,3}()) == 2 12 @test range_dim(DummyMapping{Int,2,3}()) == 2
13 @test domain_dim(DummyMapping{Int,2,3}()) == 3 13 @test domain_dim(DummyMapping{Int,2,3}()) == 3
14 @test apply(DummyMapping{Int,2,3}(), zeros(Int, (0,0,0)),(Index{Unknown}(0),Index{Unknown}(0))) == :apply 14 @test apply(DummyMapping{Int,2,3}(), zeros(Int, (0,0,0)),0,0) == :apply
15 @test eltype(DummyMapping{Int,2,3}()) == Int 15 @test eltype(DummyMapping{Int,2,3}()) == Int
16 @test eltype(DummyMapping{Float64,2,3}()) == Float64 16 @test eltype(DummyMapping{Float64,2,3}()) == Float64
17 end 17 end
18 18
19 @testset "Mapping transpose" begin 19 @testset "Mapping transpose" begin
20 struct DummyMapping{T,R,D} <: TensorMapping{T,R,D} end 20 struct DummyMapping{T,R,D} <: TensorMapping{T,R,D} end
21 21
22 LazyTensors.apply(m::DummyMapping{T,R,D}, v, I::Vararg{Index{<:Region},R}) where {T,R,D} = :apply 22 LazyTensors.apply(m::DummyMapping{T,R,D}, v, I::Vararg{Any,R}) where {T,R,D} = :apply
23 LazyTensors.apply_transpose(m::DummyMapping{T,R,D}, v, I::Vararg{Index{<:Region},D}) where {T,R,D} = :apply_transpose 23 LazyTensors.apply_transpose(m::DummyMapping{T,R,D}, v, I::Vararg{Any,D}) where {T,R,D} = :apply_transpose
24 24
25 LazyTensors.range_size(m::DummyMapping{T,R,D}) where {T,R,D} = :range_size 25 LazyTensors.range_size(m::DummyMapping{T,R,D}) where {T,R,D} = :range_size
26 LazyTensors.domain_size(m::DummyMapping{T,R,D}) where {T,R,D} = :domain_size 26 LazyTensors.domain_size(m::DummyMapping{T,R,D}) where {T,R,D} = :domain_size
27 27
28 m = DummyMapping{Float64,2,3}() 28 m = DummyMapping{Float64,2,3}()
29 I = Index{Unknown}(0)
30 @test m' isa TensorMapping{Float64, 3,2} 29 @test m' isa TensorMapping{Float64, 3,2}
31 @test m'' == m 30 @test m'' == m
32 @test apply(m',zeros(Float64,(0,0)), I, I, I) == :apply_transpose 31 @test apply(m',zeros(Float64,(0,0)), 0, 0, 0) == :apply_transpose
33 @test apply(m'',zeros(Float64,(0,0,0)), I, I) == :apply 32 @test apply(m'',zeros(Float64,(0,0,0)), 0, 0) == :apply
34 @test apply_transpose(m', zeros(Float64,(0,0,0)), I, I) == :apply 33 @test apply_transpose(m', zeros(Float64,(0,0,0)), 0, 0) == :apply
35 34
36 @test range_size(m') == :domain_size 35 @test range_size(m') == :domain_size
37 @test domain_size(m') == :range_size 36 @test domain_size(m') == :range_size
38 end 37 end
39 38
40 @testset "TensorApplication" begin 39 @testset "TensorApplication" begin
41 struct SizeDoublingMapping{T,R,D} <: TensorMapping{T,R,D} 40 struct SizeDoublingMapping{T,R,D} <: TensorMapping{T,R,D}
42 domain_size::NTuple{D,Int} 41 domain_size::NTuple{D,Int}
43 end 42 end
44 43
45 LazyTensors.apply(m::SizeDoublingMapping{T,R,D}, v, i::Vararg{Index{<:Region},R}) where {T,R,D} = (:apply,v,i) 44 LazyTensors.apply(m::SizeDoublingMapping{T,R,D}, v, i::Vararg{Any,R}) where {T,R,D} = (:apply,v,i)
46 LazyTensors.range_size(m::SizeDoublingMapping) = 2 .* m.domain_size 45 LazyTensors.range_size(m::SizeDoublingMapping) = 2 .* m.domain_size
47 LazyTensors.domain_size(m::SizeDoublingMapping) = m.domain_size 46 LazyTensors.domain_size(m::SizeDoublingMapping) = m.domain_size
48 47
49 48
50 m = SizeDoublingMapping{Int, 1, 1}((3,)) 49 m = SizeDoublingMapping{Int, 1, 1}((3,))
51 v = [0,1,2] 50 v = [0,1,2]
52 @test m*v isa AbstractVector{Int} 51 @test m*v isa AbstractVector{Int}
53 @test size(m*v) == 2 .*size(v) 52 @test size(m*v) == 2 .*size(v)
54 @test (m*v)[Index{Upper}(0)] == (:apply,v,(Index{Upper}(0),)) 53 @test (m*v)[0] == (:apply,v,(0,))
55 @test (m*v)[0] == (:apply,v,(Index{Unknown}(0),))
56 @test m*m*v isa AbstractVector{Int} 54 @test m*m*v isa AbstractVector{Int}
57 @test (m*m*v)[Index{Upper}(1)] == (:apply,m*v,(Index{Upper}(1),)) 55 @test (m*m*v)[1] == (:apply,m*v,(1,))
58 @test (m*m*v)[1] == (:apply,m*v,(Index{Unknown}(1),)) 56 @test (m*m*v)[3] == (:apply,m*v,(3,))
59 @test (m*m*v)[Index{Interior}(3)] == (:apply,m*v,(Index{Interior}(3),)) 57 @test (m*m*v)[6] == (:apply,m*v,(6,))
60 @test (m*m*v)[3] == (:apply,m*v,(Index{Unknown}(3),))
61 @test (m*m*v)[Index{Lower}(6)] == (:apply,m*v,(Index{Lower}(6),))
62 @test (m*m*v)[6] == (:apply,m*v,(Index{Unknown}(6),))
63 @test_broken BoundsError == (m*m*v)[0] 58 @test_broken BoundsError == (m*m*v)[0]
64 @test_broken BoundsError == (m*m*v)[7] 59 @test_broken BoundsError == (m*m*v)[7]
65 @test_throws MethodError m*m 60 @test_throws MethodError m*m
66 61
67 m = SizeDoublingMapping{Int, 2, 1}((3,)) 62 m = SizeDoublingMapping{Int, 2, 1}((3,))
68 @test_throws MethodError m*ones(Int,2,2) 63 @test_throws MethodError m*ones(Int,2,2)
69 @test_throws MethodError m*m*v 64 @test_throws MethodError m*m*v
70 65
71 m = SizeDoublingMapping{Float64, 2, 2}((3,3)) 66 m = SizeDoublingMapping{Float64, 2, 2}((3,3))
72 v = ones(3,3) 67 v = ones(3,3)
73 I = (Index{Lower}(1),Index{Interior}(2));
74 @test size(m*v) == 2 .*size(v) 68 @test size(m*v) == 2 .*size(v)
75 @test (m*v)[I] == (:apply,v,I) 69 @test (m*v)[1,2] == (:apply,v,(1,2))
76 70
77 struct ScalingOperator{T,D} <: TensorMapping{T,D,D} 71 struct ScalingOperator{T,D} <: TensorMapping{T,D,D}
78 λ::T 72 λ::T
79 size::NTuple{D,Int} 73 size::NTuple{D,Int}
80 end 74 end
81 75
82 LazyTensors.apply(m::ScalingOperator{T,D}, v, I::Vararg{Index,D}) where {T,D} = m.λ*v[I] 76 LazyTensors.apply(m::ScalingOperator{T,D}, v, I::Vararg{Any,D}) where {T,D} = m.λ*v[I...]
83 LazyTensors.range_size(m::ScalingOperator) = m.size 77 LazyTensors.range_size(m::ScalingOperator) = m.size
84 LazyTensors.domain_size(m::ScalingOperator) = m.size 78 LazyTensors.domain_size(m::ScalingOperator) = m.size
85 79
86 m = ScalingOperator{Int,1}(2,(3,)) 80 m = ScalingOperator{Int,1}(2,(3,))
87 v = [1,2,3] 81 v = [1,2,3]
89 @test m*v == [2,4,6] 83 @test m*v == [2,4,6]
90 84
91 m = ScalingOperator{Int,2}(2,(2,2)) 85 m = ScalingOperator{Int,2}(2,(2,2))
92 v = [[1 2];[3 4]] 86 v = [[1 2];[3 4]]
93 @test m*v == [[2 4];[6 8]] 87 @test m*v == [[2 4];[6 8]]
94 I = (Index{Upper}(2),Index{Lower}(1)) 88 @test (m*v)[2,1] == 6
95 @test (m*v)[I] == 6
96 end 89 end
97 90
98 @testset "TensorMapping binary operations" begin 91 @testset "TensorMapping binary operations" begin
99 struct ScalarMapping{T,R,D} <: TensorMapping{T,R,D} 92 struct ScalarMapping{T,R,D} <: TensorMapping{T,R,D}
100 λ::T 93 λ::T
101 range_size::NTuple{R,Int} 94 range_size::NTuple{R,Int}
102 domain_size::NTuple{D,Int} 95 domain_size::NTuple{D,Int}
103 end 96 end
104 97
105 LazyTensors.apply(m::ScalarMapping{T,R,D}, v, I::Vararg{Index{<:Region}}) where {T,R,D} = m.λ*v[I...] 98 LazyTensors.apply(m::ScalarMapping{T,R,D}, v, I::Vararg{Any,R}) where {T,R,D} = m.λ*v[I...]
106 LazyTensors.range_size(m::ScalarMapping) = m.domain_size 99 LazyTensors.range_size(m::ScalarMapping) = m.domain_size
107 LazyTensors.domain_size(m::ScalarMapping) = m.range_size 100 LazyTensors.domain_size(m::ScalarMapping) = m.range_size
108 101
109 A = ScalarMapping{Float64,1,1}(2.0, (3,), (3,)) 102 A = ScalarMapping{Float64,1,1}(2.0, (3,), (3,))
110 B = ScalarMapping{Float64,1,1}(3.0, (3,), (3,)) 103 B = ScalarMapping{Float64,1,1}(3.0, (3,), (3,))
436 struct ScalingOperator{T,D} <: TensorMapping{T,D,D} 429 struct ScalingOperator{T,D} <: TensorMapping{T,D,D}
437 λ::T 430 λ::T
438 size::NTuple{D,Int} 431 size::NTuple{D,Int}
439 end 432 end
440 433
441 LazyTensors.apply(m::ScalingOperator{T,D}, v, I::Vararg{Index,D}) where {T,D} = m.λ*v[I] 434 LazyTensors.apply(m::ScalingOperator{T,D}, v, I::Vararg{Any,D}) where {T,D} = m.λ*v[I...]
442 LazyTensors.range_size(m::ScalingOperator) = m.size 435 LazyTensors.range_size(m::ScalingOperator) = m.size
443 LazyTensors.domain_size(m::ScalingOperator) = m.size 436 LazyTensors.domain_size(m::ScalingOperator) = m.size
444 437
445 tm = InflatedTensorMapping(I(2,3),ScalingOperator(2.0, (3,2)),I(3,4)) 438 tm = InflatedTensorMapping(I(2,3),ScalingOperator(2.0, (3,2)),I(3,4))
446 v = rand(domain_size(tm)...) 439 v = rand(domain_size(tm)...)
447 440
448 @inferred apply(tm,v,Index{Unknown}.((1,2,3,2,2,4))...) 441 @inferred apply(tm,v,1,2,3,2,2,4)
449 @inferred (tm*v)[1,2,3,2,2,4] 442 @inferred (tm*v)[1,2,3,2,2,4]
450 end 443 end
451 end 444 end
452 445
453 @testset "InflatedTensorMapping of InflatedTensorMapping" begin 446 @testset "InflatedTensorMapping of InflatedTensorMapping" begin
521 struct ScalingOperator{T,D} <: TensorMapping{T,D,D} 514 struct ScalingOperator{T,D} <: TensorMapping{T,D,D}
522 λ::T 515 λ::T
523 size::NTuple{D,Int} 516 size::NTuple{D,Int}
524 end 517 end
525 518
526 LazyTensors.apply(m::ScalingOperator{T,D}, v, I::Vararg{Index,D}) where {T,D} = m.λ*v[I] 519 LazyTensors.apply(m::ScalingOperator{T,D}, v, I::Vararg{Any,D}) where {T,D} = m.λ*v[I...]
527 LazyTensors.range_size(m::ScalingOperator) = m.size 520 LazyTensors.range_size(m::ScalingOperator) = m.size
528 LazyTensors.domain_size(m::ScalingOperator) = m.size 521 LazyTensors.domain_size(m::ScalingOperator) = m.size
529 522
530 A = ScalingOperator(2.0, (5,)) 523 A = ScalingOperator(2.0, (5,))
531 B = ScalingOperator(3.0, (3,)) 524 B = ScalingOperator(3.0, (3,))