Mercurial > repos > public > sbplib_julia
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,)) |