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