Mercurial > repos > public > sbplib_julia
comparison test/testLazyTensors.jl @ 473:3041f8578bba
Merge in feature/inflated_tensormapping.
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Mon, 02 Nov 2020 21:33:35 +0100 |
parents | 3f3001d1020f |
children | 1b9af062ba2c 95f3b9036801 |
comparison
equal
deleted
inserted
replaced
445:a79d7b3209c9 | 473:3041f8578bba |
---|---|
1 using Test | 1 using Test |
2 using Sbplib.LazyTensors | 2 using Sbplib.LazyTensors |
3 using Sbplib.RegionIndices | 3 using Sbplib.RegionIndices |
4 | |
5 using Tullio | |
4 | 6 |
5 @testset "LazyTensors" begin | 7 @testset "LazyTensors" begin |
6 | 8 |
7 @testset "Generic Mapping methods" begin | 9 @testset "Generic Mapping methods" begin |
8 struct DummyMapping{T,R,D} <: TensorMapping{T,R,D} end | 10 struct DummyMapping{T,R,D} <: TensorMapping{T,R,D} end |
277 @test B̃*ones(3,2) ≈ B[1,:,1] + B[2,:,1] + B[3,:,1] + | 279 @test B̃*ones(3,2) ≈ B[1,:,1] + B[2,:,1] + B[3,:,1] + |
278 B[1,:,2] + B[2,:,2] + B[3,:,2] atol=5e-13 | 280 B[1,:,2] + B[2,:,2] + B[3,:,2] atol=5e-13 |
279 @test B̃*v ≈ B[1,:,1]*v[1,1] + B[2,:,1]*v[2,1] + B[3,:,1]*v[3,1] + | 281 @test B̃*v ≈ B[1,:,1]*v[1,1] + B[2,:,1]*v[2,1] + B[3,:,1]*v[3,1] + |
280 B[1,:,2]v[1,2] + B[2,:,2]*v[2,2] + B[3,:,2]*v[3,2] atol=5e-13 | 282 B[1,:,2]v[1,2] + B[2,:,2]*v[2,2] + B[3,:,2]*v[3,2] atol=5e-13 |
281 | 283 |
284 | |
285 # TODO: | |
286 # @inferred (B̃*v)[2] | |
282 end | 287 end |
283 | 288 |
284 | 289 |
285 @testset "IdentityMapping" begin | 290 @testset "IdentityMapping" begin |
286 @test IdentityMapping{Float64}((4,5)) isa IdentityMapping{T,2} where T | 291 @test IdentityMapping{Float64}((4,5)) isa IdentityMapping{T,2} where T |
302 I = IdentityMapping{Float64}((4,5)) | 307 I = IdentityMapping{Float64}((4,5)) |
303 v = rand(4,5) | 308 v = rand(4,5) |
304 @inferred (I*v)[3,2] | 309 @inferred (I*v)[3,2] |
305 @inferred (I'*v)[3,2] | 310 @inferred (I'*v)[3,2] |
306 @inferred range_size(I) | 311 @inferred range_size(I) |
307 end | 312 |
308 | 313 @inferred range_dim(I) |
309 end | 314 @inferred domain_dim(I) |
315 end | |
316 | |
317 @testset "InflatedTensorMapping" begin | |
318 I(sz...) = IdentityMapping(sz...) | |
319 | |
320 Ã = rand(4,2) | |
321 B̃ = rand(4,2,3) | |
322 C̃ = rand(4,2,3) | |
323 | |
324 A = LazyLinearMap(Ã,(1,),(2,)) | |
325 B = LazyLinearMap(B̃,(1,2),(3,)) | |
326 C = LazyLinearMap(C̃,(1,),(2,3)) | |
327 | |
328 @test InflatedTensorMapping(I(3,2), A, I(4)) isa TensorMapping{Float64, 4, 4} | |
329 @test InflatedTensorMapping(I(3,2), B, I(4)) isa TensorMapping{Float64, 5, 4} | |
330 @test InflatedTensorMapping(I(3), C, I(2,3)) isa TensorMapping{Float64, 4, 5} | |
331 @test InflatedTensorMapping(C, I(2,3)) isa TensorMapping{Float64, 3, 4} | |
332 @test InflatedTensorMapping(I(3), C) isa TensorMapping{Float64, 2, 3} | |
333 @test InflatedTensorMapping(I(3), I(2,3)) isa TensorMapping{Float64, 3, 3} | |
334 | |
335 @test range_size(InflatedTensorMapping(I(3,2), A, I(4))) == (3,2,4,4) | |
336 @test domain_size(InflatedTensorMapping(I(3,2), A, I(4))) == (3,2,2,4) | |
337 | |
338 @test range_size(InflatedTensorMapping(I(3,2), B, I(4))) == (3,2,4,2,4) | |
339 @test domain_size(InflatedTensorMapping(I(3,2), B, I(4))) == (3,2,3,4) | |
340 | |
341 @test range_size(InflatedTensorMapping(I(3), C, I(2,3))) == (3,4,2,3) | |
342 @test domain_size(InflatedTensorMapping(I(3), C, I(2,3))) == (3,2,3,2,3) | |
343 | |
344 @inferred range_size(InflatedTensorMapping(I(3,2), A, I(4))) == (3,2,4,4) | |
345 @inferred domain_size(InflatedTensorMapping(I(3,2), A, I(4))) == (3,2,2,4) | |
346 | |
347 # Test InflatedTensorMapping mapping w. before and after | |
348 tm = InflatedTensorMapping(I(3,2), A, I(4)) | |
349 v = rand(domain_size(tm)...) | |
350 @tullio IAIv[a,b,c,d] := Ã[c,i]*v[a,b,i,d] | |
351 @test tm*v ≈ IAIv rtol=1e-14 | |
352 @inferred LazyTensors.split_index(tm,1,1,1,1) | |
353 | |
354 # Test InflatedTensorMapping mapping w. before | |
355 tm = InflatedTensorMapping(I(3,2), A) | |
356 v = rand(domain_size(tm)...) | |
357 @tullio IAIv[a,b,c] := Ã[c,i]*v[a,b,i] | |
358 @test tm*v ≈ IAIv rtol=1e-14 | |
359 @inferred LazyTensors.split_index(tm,1,1,1) | |
360 | |
361 # Test InflatedTensorMapping mapping w. after | |
362 tm = InflatedTensorMapping(A,I(4)) | |
363 v = rand(domain_size(tm)...) | |
364 @tullio IAIv[c,d] := Ã[c,i]*v[i,d] | |
365 @test tm*v ≈ IAIv rtol=1e-14 | |
366 @inferred LazyTensors.split_index(tm,1,1) | |
367 | |
368 struct ScalingOperator{T,D} <: TensorMapping{T,D,D} | |
369 λ::T | |
370 size::NTuple{D,Int} | |
371 end | |
372 | |
373 LazyTensors.apply(m::ScalingOperator{T,D}, v, I::Vararg{Index,D}) where {T,D} = m.λ*v[I] | |
374 LazyTensors.range_size(m::ScalingOperator) = m.size | |
375 LazyTensors.domain_size(m::ScalingOperator) = m.size | |
376 | |
377 tm = InflatedTensorMapping(I(2,3),ScalingOperator(2.0, (3,2)),I(3,4)) | |
378 v = rand(domain_size(tm)...) | |
379 | |
380 @inferred LazyTensors.split_index(tm,1,2,3,2,2,4) | |
381 @inferred apply(tm,v,Index{Unknown}.((1,2,3,2,2,4))...) | |
382 @inferred (tm*v)[1,2,3,2,2,4] | |
383 | |
384 end | |
385 | |
386 @testset "slice_tuple" begin | |
387 @test LazyTensors.slice_tuple((1,2,3),Val(1), Val(3)) == (1,2,3) | |
388 @test LazyTensors.slice_tuple((1,2,3,4,5,6),Val(2), Val(5)) == (2,3,4,5) | |
389 @test LazyTensors.slice_tuple((1,2,3,4,5,6),Val(1), Val(3)) == (1,2,3) | |
390 @test LazyTensors.slice_tuple((1,2,3,4,5,6),Val(4), Val(6)) == (4,5,6) | |
391 end | |
392 | |
393 @testset "flatten_tuple" begin | |
394 @test LazyTensors.flatten_tuple((1,)) == (1,) | |
395 @test LazyTensors.flatten_tuple((1,2,3,4,5,6)) == (1,2,3,4,5,6) | |
396 @test LazyTensors.flatten_tuple((1,2,(3,4),5,6)) == (1,2,3,4,5,6) | |
397 @test LazyTensors.flatten_tuple((1,2,(3,(4,5)),6)) == (1,2,3,4,5,6) | |
398 @test LazyTensors.flatten_tuple(((1,2),(3,4),(5,),6)) == (1,2,3,4,5,6) | |
399 end | |
400 | |
401 end |