comparison test/testLazyTensors.jl @ 540:013ca4892540

Merge feature/inflated_tensormapping_transpose
author Jonatan Werpers <jonatan@werpers.com>
date Thu, 26 Nov 2020 17:53:40 +0100
parents fc0f942b8792
children 62d96e2cd165
comparison
equal deleted inserted replaced
535:b6768d769f46 540:013ca4892540
367 # Testing regular application and transposed application with inflation "before", "after" and "before and after". 367 # Testing regular application and transposed application with inflation "before", "after" and "before and after".
368 # The inflated tensor mappings are chosen to preserve, reduce and increase the dimension of the result compared to the input. 368 # The inflated tensor mappings are chosen to preserve, reduce and increase the dimension of the result compared to the input.
369 tests = [ 369 tests = [
370 ( 370 (
371 InflatedTensorMapping(I(3,2), A, I(4)), 371 InflatedTensorMapping(I(3,2), A, I(4)),
372 (v-> @tullio res[a,b,c,d] := Ã[c,i]*v[a,b,i,d]), 372 (v-> @tullio res[a,b,c,d] := Ã[c,i]*v[a,b,i,d]), # Expected result of apply
373 (v-> @tullio res[a,b,c,d] := Ã[i,c]*v[a,b,i,d]), # Expected result of apply_transpose
373 ), 374 ),
374 ( 375 (
375 InflatedTensorMapping(I(3,2), B, I(4)), 376 InflatedTensorMapping(I(3,2), B, I(4)),
376 (v-> @tullio res[a,b,c,d,e] := B̃[c,d,i]*v[a,b,i,e]), 377 (v-> @tullio res[a,b,c,d,e] := B̃[c,d,i]*v[a,b,i,e]),
378 (v-> @tullio res[a,b,c,d] := B̃[i,j,c]*v[a,b,i,j,d]),
377 ), 379 ),
378 ( 380 (
379 InflatedTensorMapping(I(3,2), C, I(4)), 381 InflatedTensorMapping(I(3,2), C, I(4)),
380 (v-> @tullio res[a,b,c,d] := C̃[c,i,j]*v[a,b,i,j,d]), 382 (v-> @tullio res[a,b,c,d] := C̃[c,i,j]*v[a,b,i,j,d]),
383 (v-> @tullio res[a,b,c,d,e] := C̃[i,c,d]*v[a,b,i,e]),
381 ), 384 ),
382 ( 385 (
383 InflatedTensorMapping(I(3,2), A), 386 InflatedTensorMapping(I(3,2), A),
384 (v-> @tullio res[a,b,c] := Ã[c,i]*v[a,b,i]), 387 (v-> @tullio res[a,b,c] := Ã[c,i]*v[a,b,i]),
388 (v-> @tullio res[a,b,c] := Ã[i,c]*v[a,b,i]),
385 ), 389 ),
386 ( 390 (
387 InflatedTensorMapping(I(3,2), B), 391 InflatedTensorMapping(I(3,2), B),
388 (v-> @tullio res[a,b,c,d] := B̃[c,d,i]*v[a,b,i]), 392 (v-> @tullio res[a,b,c,d] := B̃[c,d,i]*v[a,b,i]),
393 (v-> @tullio res[a,b,c] := B̃[i,j,c]*v[a,b,i,j]),
389 ), 394 ),
390 ( 395 (
391 InflatedTensorMapping(I(3,2), C), 396 InflatedTensorMapping(I(3,2), C),
392 (v-> @tullio res[a,b,c] := C̃[c,i,j]*v[a,b,i,j]), 397 (v-> @tullio res[a,b,c] := C̃[c,i,j]*v[a,b,i,j]),
398 (v-> @tullio res[a,b,c,d] := C̃[i,c,d]*v[a,b,i]),
393 ), 399 ),
394 ( 400 (
395 InflatedTensorMapping(A,I(4)), 401 InflatedTensorMapping(A,I(4)),
396 (v-> @tullio res[a,b] := Ã[a,i]*v[i,b]), 402 (v-> @tullio res[a,b] := Ã[a,i]*v[i,b]),
403 (v-> @tullio res[a,b] := Ã[i,a]*v[i,b]),
397 ), 404 ),
398 ( 405 (
399 InflatedTensorMapping(B,I(4)), 406 InflatedTensorMapping(B,I(4)),
400 (v-> @tullio res[a,b,c] := B̃[a,b,i]*v[i,c]), 407 (v-> @tullio res[a,b,c] := B̃[a,b,i]*v[i,c]),
408 (v-> @tullio res[a,b] := B̃[i,j,a]*v[i,j,b]),
401 ), 409 ),
402 ( 410 (
403 InflatedTensorMapping(C,I(4)), 411 InflatedTensorMapping(C,I(4)),
404 (v-> @tullio res[a,b] := C̃[a,i,j]*v[i,j,b]), 412 (v-> @tullio res[a,b] := C̃[a,i,j]*v[i,j,b]),
413 (v-> @tullio res[a,b,c] := C̃[i,a,b]*v[i,c]),
405 ), 414 ),
406 ] 415 ]
407 416
408 for i ∈ 1:length(tests) 417 @testset "apply" begin
409 tm = tests[i][1] 418 for i ∈ 1:length(tests)
410 v = rand(domain_size(tm)...) 419 tm = tests[i][1]
411 true_value = tests[i][2](v) 420 v = rand(domain_size(tm)...)
412 @test tm*v ≈ true_value rtol=1e-14 421 true_value = tests[i][2](v)
422 @test tm*v ≈ true_value rtol=1e-14
423 end
424 end
425
426 @testset "apply_transpose" begin
427 for i ∈ 1:length(tests)
428 tm = tests[i][1]
429 v = rand(range_size(tm)...)
430 true_value = tests[i][3](v)
431 @test tm'*v ≈ true_value rtol=1e-14
432 end
413 end 433 end
414 434
415 @testset "Inference of application" begin 435 @testset "Inference of application" begin
416 struct ScalingOperator{T,D} <: TensorMapping{T,D,D} 436 struct ScalingOperator{T,D} <: TensorMapping{T,D,D}
417 λ::T 437 λ::T
423 LazyTensors.domain_size(m::ScalingOperator) = m.size 443 LazyTensors.domain_size(m::ScalingOperator) = m.size
424 444
425 tm = InflatedTensorMapping(I(2,3),ScalingOperator(2.0, (3,2)),I(3,4)) 445 tm = InflatedTensorMapping(I(2,3),ScalingOperator(2.0, (3,2)),I(3,4))
426 v = rand(domain_size(tm)...) 446 v = rand(domain_size(tm)...)
427 447
428 @inferred LazyTensors.split_index(tm,1,2,3,2,2,4)
429 @inferred apply(tm,v,Index{Unknown}.((1,2,3,2,2,4))...) 448 @inferred apply(tm,v,Index{Unknown}.((1,2,3,2,2,4))...)
430 @inferred (tm*v)[1,2,3,2,2,4] 449 @inferred (tm*v)[1,2,3,2,2,4]
431 end 450 end
432 end 451 end
433 452
440 459
441 @test InflatedTensorMapping(I(2), I(2), I(2)) isa InflatedTensorMapping # The constructor should always return its type. 460 @test InflatedTensorMapping(I(2), I(2), I(2)) isa InflatedTensorMapping # The constructor should always return its type.
442 end 461 end
443 end 462 end
444 463
464 @testset "split_index" begin
465 @test LazyTensors.split_index(Val(2),Val(1),Val(2),Val(2),1,2,3,4,5,6) == ((1,2,:,5,6),(3,4))
466 @test LazyTensors.split_index(Val(2),Val(3),Val(2),Val(2),1,2,3,4,5,6) == ((1,2,:,:,:,5,6),(3,4))
467 @test LazyTensors.split_index(Val(3),Val(1),Val(1),Val(2),1,2,3,4,5,6) == ((1,2,3,:,5,6),(4,))
468 @test LazyTensors.split_index(Val(3),Val(2),Val(1),Val(2),1,2,3,4,5,6) == ((1,2,3,:,:,5,6),(4,))
469 @test LazyTensors.split_index(Val(1),Val(1),Val(2),Val(3),1,2,3,4,5,6) == ((1,:,4,5,6),(2,3))
470 @test LazyTensors.split_index(Val(1),Val(2),Val(2),Val(3),1,2,3,4,5,6) == ((1,:,:,4,5,6),(2,3))
471
472 @test LazyTensors.split_index(Val(0),Val(1),Val(3),Val(3),1,2,3,4,5,6) == ((:,4,5,6),(1,2,3))
473 @test LazyTensors.split_index(Val(3),Val(1),Val(3),Val(0),1,2,3,4,5,6) == ((1,2,3,:),(4,5,6))
474
475 @inferred LazyTensors.split_index(Val(2),Val(3),Val(2),Val(2),1,2,3,2,2,4)
476 end
477
445 @testset "slice_tuple" begin 478 @testset "slice_tuple" begin
446 @test LazyTensors.slice_tuple((1,2,3),Val(1), Val(3)) == (1,2,3) 479 @test LazyTensors.slice_tuple((1,2,3),Val(1), Val(3)) == (1,2,3)
447 @test LazyTensors.slice_tuple((1,2,3,4,5,6),Val(2), Val(5)) == (2,3,4,5) 480 @test LazyTensors.slice_tuple((1,2,3,4,5,6),Val(2), Val(5)) == (2,3,4,5)
448 @test LazyTensors.slice_tuple((1,2,3,4,5,6),Val(1), Val(3)) == (1,2,3) 481 @test LazyTensors.slice_tuple((1,2,3,4,5,6),Val(1), Val(3)) == (1,2,3)
449 @test LazyTensors.slice_tuple((1,2,3,4,5,6),Val(4), Val(6)) == (4,5,6) 482 @test LazyTensors.slice_tuple((1,2,3,4,5,6),Val(4), Val(6)) == (4,5,6)
483 end
484
485 @testset "split_tuple" begin
486 @testset "2 parts" begin
487 @test LazyTensors.split_tuple((),Val(0)) == ((),())
488 @test LazyTensors.split_tuple((1,),Val(0)) == ((),(1,))
489 @test LazyTensors.split_tuple((1,),Val(1)) == ((1,),())
490
491 @test LazyTensors.split_tuple((1,2,3,4),Val(0)) == ((),(1,2,3,4))
492 @test LazyTensors.split_tuple((1,2,3,4),Val(1)) == ((1,),(2,3,4))
493 @test LazyTensors.split_tuple((1,2,3,4),Val(2)) == ((1,2),(3,4))
494 @test LazyTensors.split_tuple((1,2,3,4),Val(3)) == ((1,2,3),(4,))
495 @test LazyTensors.split_tuple((1,2,3,4),Val(4)) == ((1,2,3,4),())
496
497 @inferred LazyTensors.split_tuple((1,2,3,4),Val(3))
498 end
499
500 @testset "3 parts" begin
501 @test LazyTensors.split_tuple((),Val(0),Val(0)) == ((),(),())
502 @test LazyTensors.split_tuple((1,2,3),Val(1), Val(1)) == ((1,),(2,),(3,))
503
504 @test LazyTensors.split_tuple((1,2,3,4,5,6),Val(1),Val(2)) == ((1,),(2,3),(4,5,6))
505 @test LazyTensors.split_tuple((1,2,3,4,5,6),Val(3),Val(2)) == ((1,2,3),(4,5),(6,))
506
507 @inferred LazyTensors.split_tuple((1,2,3,4,5,6),Val(3),Val(2))
508 end
450 end 509 end
451 510
452 @testset "flatten_tuple" begin 511 @testset "flatten_tuple" begin
453 @test LazyTensors.flatten_tuple((1,)) == (1,) 512 @test LazyTensors.flatten_tuple((1,)) == (1,)
454 @test LazyTensors.flatten_tuple((1,2,3,4,5,6)) == (1,2,3,4,5,6) 513 @test LazyTensors.flatten_tuple((1,2,3,4,5,6)) == (1,2,3,4,5,6)