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