Mercurial > repos > public > sbplib_julia
comparison test/testLazyTensors.jl @ 348:7fe43d902a27 refactor/remove_dynamic_size_tensormapping
Start trying to change LazyTensors
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Sat, 26 Sep 2020 15:20:18 +0200 |
parents | 2b0c9b30ea3b |
children | 241bd2512c20 |
comparison
equal
deleted
inserted
replaced
344:f781d6da7d3d | 348:7fe43d902a27 |
---|---|
10 @test range_dim(DummyMapping{Int,2,3}()) == 2 | 10 @test range_dim(DummyMapping{Int,2,3}()) == 2 |
11 @test domain_dim(DummyMapping{Int,2,3}()) == 3 | 11 @test domain_dim(DummyMapping{Int,2,3}()) == 3 |
12 @test apply(DummyMapping{Int,2,3}(), zeros(Int, (0,0,0)),(Index{Unknown}(0),Index{Unknown}(0))) == :apply | 12 @test apply(DummyMapping{Int,2,3}(), zeros(Int, (0,0,0)),(Index{Unknown}(0),Index{Unknown}(0))) == :apply |
13 end | 13 end |
14 | 14 |
15 @testset "Generic Operator methods" begin | |
16 struct DummyOperator{T,D} <: TensorOperator{T,D} end | |
17 @test range_size(DummyOperator{Int,2}(), (3,5)) == (3,5) | |
18 @test domain_size(DummyOperator{Float64, 3}(), (3,3,1)) == (3,3,1) | |
19 end | |
20 | |
21 @testset "Mapping transpose" begin | 15 @testset "Mapping transpose" begin |
22 struct DummyMapping{T,R,D} <: TensorMapping{T,R,D} end | 16 struct DummyMapping{T,R,D} <: TensorMapping{T,R,D} end |
23 | 17 |
24 LazyTensors.apply(m::DummyMapping{T,R,D}, v, I::Vararg{Index{<:Region},R}) where {T,R,D} = :apply | 18 LazyTensors.apply(m::DummyMapping{T,R,D}, v, I::Vararg{Index{<:Region},R}) where {T,R,D} = :apply |
25 LazyTensors.apply_transpose(m::DummyMapping{T,R,D}, v, I::Vararg{Index{<:Region},D}) where {T,R,D} = :apply_transpose | 19 LazyTensors.apply_transpose(m::DummyMapping{T,R,D}, v, I::Vararg{Index{<:Region},D}) where {T,R,D} = :apply_transpose |
26 | 20 |
27 LazyTensors.range_size(m::DummyMapping{T,R,D}, domain_size::NTuple{D,Integer}) where {T,R,D} = :range_size | 21 LazyTensors.range_size(m::DummyMapping{T,R,D}) where {T,R,D} = :range_size |
28 LazyTensors.domain_size(m::DummyMapping{T,R,D}, range_size::NTuple{R,Integer}) where {T,R,D} = :domain_size | 22 LazyTensors.domain_size(m::DummyMapping{T,R,D}) where {T,R,D} = :domain_size |
29 | 23 |
30 m = DummyMapping{Float64,2,3}() | 24 m = DummyMapping{Float64,2,3}() |
31 I = Index{Unknown}(0) | 25 I = Index{Unknown}(0) |
32 @test m' isa TensorMapping{Float64, 3,2} | 26 @test m' isa TensorMapping{Float64, 3,2} |
33 @test m'' == m | 27 @test m'' == m |
34 @test apply(m',zeros(Float64,(0,0)), I, I, I) == :apply_transpose | 28 @test apply(m',zeros(Float64,(0,0)), I, I, I) == :apply_transpose |
35 @test apply(m'',zeros(Float64,(0,0,0)), I, I) == :apply | 29 @test apply(m'',zeros(Float64,(0,0,0)), I, I) == :apply |
36 @test apply_transpose(m', zeros(Float64,(0,0,0)), I, I) == :apply | 30 @test apply_transpose(m', zeros(Float64,(0,0,0)), I, I) == :apply |
37 | 31 |
38 @test range_size(m', (0,0)) == :domain_size | 32 @test range_size(m') == :domain_size |
39 @test domain_size(m', (0,0,0)) == :range_size | 33 @test domain_size(m') == :range_size |
40 end | 34 end |
41 | 35 |
42 @testset "TensorApplication" begin | 36 @testset "TensorApplication" begin |
43 struct DummyMapping{T,R,D} <: TensorMapping{T,R,D} end | 37 struct SizeDoublingMapping{T,R,D} <: TensorMapping{T,R,D} |
38 domain_size::NTuple{D,Int} | |
39 end | |
44 | 40 |
45 LazyTensors.apply(m::DummyMapping{T,R,D}, v, i::Vararg{Index{<:Region},R}) where {T,R,D} = (:apply,v,i) | 41 LazyTensors.apply(m::SizeDoublingMapping{T,R,D}, v, i::Vararg{Index{<:Region},R}) where {T,R,D} = (:apply,v,i) |
46 LazyTensors.range_size(m::DummyMapping{T,R,D}, domain_size::NTuple{D,Integer}) where {T,R,D} = 2 .* domain_size | 42 LazyTensors.range_size(m::SizeDoublingMapping) = 2 .* m.domain_size |
47 LazyTensors.domain_size(m::DummyMapping{T,R,D}, range_size::NTuple{R,Integer}) where {T,R,D} = range_size.÷2 | 43 LazyTensors.domain_size(m::SizeDoublingMapping) = m.domain_size |
48 | 44 |
49 | 45 |
50 m = DummyMapping{Int, 1, 1}() | 46 m = SizeDoublingMapping{Int, 1, 1}((3,)) |
51 v = [0,1,2] | 47 v = [0,1,2] |
52 @test m*v isa AbstractVector{Int} | 48 @test m*v isa AbstractVector{Int} |
53 @test size(m*v) == 2 .*size(v) | 49 @test size(m*v) == 2 .*size(v) |
54 @test (m*v)[Index{Upper}(0)] == (:apply,v,(Index{Upper}(0),)) | 50 @test (m*v)[Index{Upper}(0)] == (:apply,v,(Index{Upper}(0),)) |
55 @test (m*v)[0] == (:apply,v,(Index{Unknown}(0),)) | 51 @test (m*v)[0] == (:apply,v,(Index{Unknown}(0),)) |
61 @test (m*m*v)[Index{Lower}(6)] == (:apply,m*v,(Index{Lower}(6),)) | 57 @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),)) | 58 @test (m*m*v)[6] == (:apply,m*v,(Index{Unknown}(6),)) |
63 @test_broken BoundsError == (m*m*v)[0] | 59 @test_broken BoundsError == (m*m*v)[0] |
64 @test_broken BoundsError == (m*m*v)[7] | 60 @test_broken BoundsError == (m*m*v)[7] |
65 | 61 |
66 m = DummyMapping{Int, 2, 1}() | 62 m = SizeDoublingMapping{Int, 2, 1}((3,)) |
67 @test_throws MethodError m*ones(Int,2,2) | 63 @test_throws MethodError m*ones(Int,2,2) |
68 @test_throws MethodError m*m*v | 64 @test_throws MethodError m*m*v |
69 | 65 |
70 m = DummyMapping{Float64, 2, 2}() | 66 m = SizeDoublingMapping{Float64, 2, 2}((3,3)) |
71 v = ones(3,3) | 67 v = ones(3,3) |
72 I = (Index{Lower}(1),Index{Interior}(2)); | 68 I = (Index{Lower}(1),Index{Interior}(2)); |
73 @test size(m*v) == 2 .*size(v) | 69 @test size(m*v) == 2 .*size(v) |
74 @test (m*v)[I] == (:apply,v,I) | 70 @test (m*v)[I] == (:apply,v,I) |
75 | 71 |
76 struct ScalingOperator{T,D} <: TensorOperator{T,D} | 72 struct ScalingOperator{T,D} <: TensorMapping{T,D,D} |
77 λ::T | 73 λ::T |
74 size::NTuple{D,Int} | |
78 end | 75 end |
79 | 76 |
80 LazyTensors.apply(m::ScalingOperator{T,D}, v, I::Vararg{Index,D}) where {T,D} = m.λ*v[I] | 77 LazyTensors.apply(m::ScalingOperator{T,D}, v, I::Vararg{Index,D}) where {T,D} = m.λ*v[I] |
78 LazyTensors.range_size(m::ScalingOperator) = m.size | |
79 LazyTensors.domain_size(m::ScalingOperator) = m.size | |
81 | 80 |
82 m = ScalingOperator{Int,1}(2) | 81 m = ScalingOperator{Int,1}(2,(3,)) |
83 v = [1,2,3] | 82 v = [1,2,3] |
84 @test m*v isa AbstractVector | 83 @test m*v isa AbstractVector |
85 @test m*v == [2,4,6] | 84 @test m*v == [2,4,6] |
86 | 85 |
87 m = ScalingOperator{Int,2}(2) | 86 m = ScalingOperator{Int,2}(2,(2,2)) |
88 v = [[1 2];[3 4]] | 87 v = [[1 2];[3 4]] |
89 @test m*v == [[2 4];[6 8]] | 88 @test m*v == [[2 4];[6 8]] |
90 I = (Index{Upper}(2),Index{Lower}(1)) | 89 I = (Index{Upper}(2),Index{Lower}(1)) |
91 @test (m*v)[I] == 6 | 90 @test (m*v)[I] == 6 |
92 end | 91 end |
93 | 92 |
94 @testset "TensorMapping binary operations" begin | 93 @testset "TensorMapping binary operations" begin |
95 struct ScalarMapping{T,R,D} <: TensorMapping{T,R,D} | 94 struct ScalarMapping{T,R,D} <: TensorMapping{T,R,D} |
96 λ::T | 95 λ::T |
96 range_size::NTuple{R,Int} | |
97 domain_size::NTuple{D,Int} | |
97 end | 98 end |
98 | 99 |
99 LazyTensors.apply(m::ScalarMapping{T,R,D}, v, I::Vararg{Index{<:Region}}) where {T,R,D} = m.λ*v[I...] | 100 LazyTensors.apply(m::ScalarMapping{T,R,D}, v, I::Vararg{Index{<:Region}}) where {T,R,D} = m.λ*v[I...] |
100 LazyTensors.range_size(m::ScalarMapping, domain_size) = domain_size | 101 LazyTensors.range_size(m::ScalarMapping) = m.domain_size |
101 LazyTensors.domain_size(m::ScalarMapping, range_sizes) = range_sizes | 102 LazyTensors.domain_size(m::ScalarMapping) = m.range_size |
102 | 103 |
103 A = ScalarMapping{Float64,1,1}(2.0) | 104 A = ScalarMapping{Float64,1,1}(2.0, (3,), (3,)) |
104 B = ScalarMapping{Float64,1,1}(3.0) | 105 B = ScalarMapping{Float64,1,1}(3.0, (3,), (3,)) |
105 | 106 |
106 v = [1.1,1.2,1.3] | 107 v = [1.1,1.2,1.3] |
107 for i ∈ eachindex(v) | 108 for i ∈ eachindex(v) |
108 @test ((A+B)*v)[i] == 2*v[i] + 3*v[i] | 109 @test ((A+B)*v)[i] == 2*v[i] + 3*v[i] |
109 end | 110 end |
110 | 111 |
111 for i ∈ eachindex(v) | 112 for i ∈ eachindex(v) |
112 @test ((A-B)*v)[i] == 2*v[i] - 3*v[i] | 113 @test ((A-B)*v)[i] == 2*v[i] - 3*v[i] |
113 end | 114 end |
114 | 115 |
115 @test range_size(A+B, (3,)) == range_size(A, (3,)) == range_size(B,(3,)) | 116 @test range_size(A+B) == range_size(A) == range_size(B) |
116 @test domain_size(A+B, (3,)) == domain_size(A, (3,)) == domain_size(B,(3,)) | 117 @test domain_size(A+B) == domain_size(A) == domain_size(B) |
117 end | 118 end |
118 | 119 |
119 @testset "LazyArray" begin | 120 @testset "LazyArray" begin |
120 @testset "LazyConstantArray" begin | 121 @testset "LazyConstantArray" begin |
121 @test LazyTensors.LazyConstantArray(3,(3,2)) isa LazyArray{Int,2} | 122 @test LazyTensors.LazyConstantArray(3,(3,2)) isa LazyArray{Int,2} |