@@ -33,16 +33,16 @@ struct mpfr_t <: AbstractFloat
33
33
end
34
34
35
35
"""
36
- `BigFloat` is a mutable struct and there is no guarantee that each entry in
37
- an `Array {BigFloat}` has unique pointers . For example, looking at the `Limb`s,
36
+ `BigFloat` is a mutable struct and there is no guarantee that each entry in an
37
+ `AbstractArray {BigFloat}` is unique. For example, looking at the `Limb`s,
38
38
39
39
Id = Matrix{BigFloat}(I, 3, 3)
40
40
map(x->x.d, Id)
41
41
42
42
shows that the ones and the zeros all share the same pointers. If a C function
43
43
assumes unicity of each datum, then the array must be renewed with a `deepcopy`.
44
44
"""
45
- function renew! (x:: Array {BigFloat} )
45
+ function renew! (x:: AbstractArray {BigFloat} )
46
46
for i in eachindex (x)
47
47
@inbounds x[i] = deepcopy (x[i])
48
48
end
@@ -221,12 +221,20 @@ show(io::IO, p::FTPlan{T, 2, K}) where {T, K} = print(io, "FastTransforms plan f
221
221
show (io:: IO , p:: FTPlan{T, 3, K} ) where {T, K} = print (io, " FastTransforms plan for " , kind2string (K), " for $(p. n) ×$(p. l) ×$(p. m) -element array of " , T)
222
222
show (io:: IO , p:: FTPlan{T, 2, SPHERICALISOMETRY} ) where T = print (io, " FastTransforms " , kind2string (SPHERICALISOMETRY), " plan for $(p. n) ×$(2 p. n- 1 ) -element array of " , T)
223
223
224
- function checksize (p:: FTPlan{T, 1} , x:: Array {T} ) where T
224
+ function checksize (p:: FTPlan{T, 1} , x:: StridedArray {T} ) where T
225
225
if p. n != size (x, 1 )
226
226
throw (DimensionMismatch (" FTPlan has dimensions $(p. n) × $(p. n) , x has leading dimension $(size (x, 1 )) " ))
227
227
end
228
228
end
229
229
230
+ function checkstrides (p:: FTPlan{T, 1} , x:: StridedArray{T} ) where T
231
+ sz = size (x)
232
+ st = strides (x)
233
+ if (1 , cumprod (sz)... ) != (st... , length (x))
234
+ error (" FTPlan requires unit strides, x has strides $(strides (x)) " )
235
+ end
236
+ end
237
+
230
238
for (N, K) in ((2 , RECTDISK), (2 , TRIANGLE), (3 , TETRAHEDRON))
231
239
@eval function checksize (p:: FTPlan{T, $N, $K} , x:: Array{T, $N} ) where T
232
240
if p. n != size (x, 1 )
@@ -325,6 +333,14 @@ function checksize(p::AdjointFTPlan, x)
325
333
end
326
334
end
327
335
336
+ function checkstrides (p:: AdjointFTPlan , x)
337
+ try
338
+ checkstrides (p. adjoint, x)
339
+ catch
340
+ checkstrides (p. parent, x)
341
+ end
342
+ end
343
+
328
344
function unsafe_convert (:: Type{Ptr{ft_plan_struct}} , p:: AdjointFTPlan )
329
345
try
330
346
unsafe_convert (Ptr{ft_plan_struct}, p. adjoint)
@@ -373,6 +389,14 @@ function checksize(p::TransposeFTPlan, x)
373
389
end
374
390
end
375
391
392
+ function checkstrides (p:: TransposeFTPlan , x)
393
+ try
394
+ checkstrides (p. transpose, x)
395
+ catch
396
+ checkstrides (p. parent, x)
397
+ end
398
+ end
399
+
376
400
function unsafe_convert (:: Type{Ptr{ft_plan_struct}} , p:: TransposeFTPlan )
377
401
try
378
402
unsafe_convert (Ptr{ft_plan_struct}, p. transpose)
@@ -803,18 +827,21 @@ for (fJ, fC, elty) in ((:lmul!, :ft_bfmvf, :Float32),
803
827
(:lmul! , :ft_bfmv , :Float64 ),
804
828
(:ldiv! , :ft_bfsv , :Float64 ))
805
829
@eval begin
806
- function $fJ (p:: FTPlan{$elty, 1} , x:: Vector {$elty} )
830
+ function $fJ (p:: FTPlan{$elty, 1} , x:: StridedVector {$elty} )
807
831
checksize (p, x)
832
+ checkstrides (p, x)
808
833
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Ptr{ft_plan_struct}, Ptr{$ elty}), ' N' , p, x)
809
834
return x
810
835
end
811
- function $fJ (p:: AdjointFTPlan{$elty, FTPlan{$elty, 1, K}} , x:: Vector {$elty} ) where K
836
+ function $fJ (p:: AdjointFTPlan{$elty, FTPlan{$elty, 1, K}} , x:: StridedVector {$elty} ) where K
812
837
checksize (p, x)
838
+ checkstrides (p, x)
813
839
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Ptr{ft_plan_struct}, Ptr{$ elty}), ' T' , p, x)
814
840
return x
815
841
end
816
- function $fJ (p:: TransposeFTPlan{$elty, FTPlan{$elty, 1, K}} , x:: Vector {$elty} ) where K
842
+ function $fJ (p:: TransposeFTPlan{$elty, FTPlan{$elty, 1, K}} , x:: StridedVector {$elty} ) where K
817
843
checksize (p, x)
844
+ checkstrides (p, x)
818
845
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Ptr{ft_plan_struct}, Ptr{$ elty}), ' T' , p, x)
819
846
return x
820
847
end
@@ -824,18 +851,21 @@ end
824
851
for (fJ, fC, elty) in ((:lmul! , :ft_bbbfmvf , :Float32 ),
825
852
(:lmul! , :ft_bbbfmv , :Float64 ))
826
853
@eval begin
827
- function $fJ (p:: FTPlan{$elty, 1, ASSOCIATEDJAC2JAC} , x:: Vector {$elty} )
854
+ function $fJ (p:: FTPlan{$elty, 1, ASSOCIATEDJAC2JAC} , x:: StridedVector {$elty} )
828
855
checksize (p, x)
856
+ checkstrides (p, x)
829
857
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Cint, Cint, Ptr{ft_plan_struct}, Ptr{$ elty}), ' N' , ' 2' , ' 1' , p, x)
830
858
return x
831
859
end
832
- function $fJ (p:: AdjointFTPlan{$elty, FTPlan{$elty, 1, ASSOCIATEDJAC2JAC}} , x:: Vector {$elty} )
860
+ function $fJ (p:: AdjointFTPlan{$elty, FTPlan{$elty, 1, ASSOCIATEDJAC2JAC}} , x:: StridedVector {$elty} )
833
861
checksize (p, x)
862
+ checkstrides (p, x)
834
863
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Cint, Cint, Ptr{ft_plan_struct}, Ptr{$ elty}), ' T' , ' 1' , ' 2' , p, x)
835
864
return x
836
865
end
837
- function $fJ (p:: TransposeFTPlan{$elty, FTPlan{$elty, 1, ASSOCIATEDJAC2JAC}} , x:: Vector {$elty} )
866
+ function $fJ (p:: TransposeFTPlan{$elty, FTPlan{$elty, 1, ASSOCIATEDJAC2JAC}} , x:: StridedVector {$elty} )
838
867
checksize (p, x)
868
+ checkstrides (p, x)
839
869
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Cint, Cint, Ptr{ft_plan_struct}, Ptr{$ elty}), ' T' , ' 1' , ' 2' , p, x)
840
870
return x
841
871
end
@@ -845,18 +875,21 @@ end
845
875
for (fJ, fC, elty) in ((:lmul! , :ft_mpmv , :Float64 ),
846
876
(:ldiv! , :ft_mpsv , :Float64 ))
847
877
@eval begin
848
- function $fJ (p:: ModifiedFTPlan{$elty} , x:: Vector {$elty} )
878
+ function $fJ (p:: ModifiedFTPlan{$elty} , x:: StridedVector {$elty} )
849
879
checksize (p, x)
880
+ checkstrides (p, x)
850
881
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Ptr{ft_plan_struct}, Ptr{$ elty}), ' N' , p, x)
851
882
return x
852
883
end
853
- function $fJ (p:: AdjointFTPlan{$elty, ModifiedFTPlan{$elty}} , x:: Vector {$elty} )
884
+ function $fJ (p:: AdjointFTPlan{$elty, ModifiedFTPlan{$elty}} , x:: StridedVector {$elty} )
854
885
checksize (p, x)
886
+ checkstrides (p, x)
855
887
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Ptr{ft_plan_struct}, Ptr{$ elty}), ' T' , p, x)
856
888
return x
857
889
end
858
- function $fJ (p:: TransposeFTPlan{$elty, ModifiedFTPlan{$elty}} , x:: Vector {$elty} )
890
+ function $fJ (p:: TransposeFTPlan{$elty, ModifiedFTPlan{$elty}} , x:: StridedVector {$elty} )
859
891
checksize (p, x)
892
+ checkstrides (p, x)
860
893
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Ptr{ft_plan_struct}, Ptr{$ elty}), ' T' , p, x)
861
894
return x
862
895
end
@@ -866,18 +899,21 @@ end
866
899
for (fJ, fC) in ((:lmul! , :ft_mpfr_trmv_ptr ),
867
900
(:ldiv! , :ft_mpfr_trsv_ptr ))
868
901
@eval begin
869
- function $fJ (p:: FTPlan{BigFloat, 1} , x:: Vector {BigFloat} )
902
+ function $fJ (p:: FTPlan{BigFloat, 1} , x:: StridedVector {BigFloat} )
870
903
checksize (p, x)
904
+ checkstrides (p, x)
871
905
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Cint, Ptr{mpfr_t}, Cint, Ptr{BigFloat}, Int32), ' N' , p. n, p, p. n, renew! (x), Base. MPFR. ROUNDING_MODE[])
872
906
return x
873
907
end
874
- function $fJ (p:: AdjointFTPlan{BigFloat, FTPlan{BigFloat, 1, K}} , x:: Vector {BigFloat} ) where K
908
+ function $fJ (p:: AdjointFTPlan{BigFloat, FTPlan{BigFloat, 1, K}} , x:: StridedVector {BigFloat} ) where K
875
909
checksize (p, x)
910
+ checkstrides (p, x)
876
911
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Cint, Ptr{mpfr_t}, Cint, Ptr{BigFloat}, Int32), ' T' , p. parent. n, p, p. parent. n, renew! (x), Base. MPFR. ROUNDING_MODE[])
877
912
return x
878
913
end
879
- function $fJ (p:: TransposeFTPlan{BigFloat, FTPlan{BigFloat, 1, K}} , x:: Vector {BigFloat} ) where K
914
+ function $fJ (p:: TransposeFTPlan{BigFloat, FTPlan{BigFloat, 1, K}} , x:: StridedVector {BigFloat} ) where K
880
915
checksize (p, x)
916
+ checkstrides (p, x)
881
917
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Cint, Ptr{mpfr_t}, Cint, Ptr{BigFloat}, Int32), ' T' , p. parent. n, p, p. parent. n, renew! (x), Base. MPFR. ROUNDING_MODE[])
882
918
return x
883
919
end
@@ -889,18 +925,21 @@ for (fJ, fC, elty) in ((:lmul!, :ft_bfmmf, :Float32),
889
925
(:lmul! , :ft_bfmm , :Float64 ),
890
926
(:ldiv! , :ft_bfsm , :Float64 ))
891
927
@eval begin
892
- function $fJ (p:: FTPlan{$elty, 1} , x:: Matrix {$elty} )
928
+ function $fJ (p:: FTPlan{$elty, 1} , x:: StridedMatrix {$elty} )
893
929
checksize (p, x)
930
+ checkstrides (p, x)
894
931
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Ptr{ft_plan_struct}, Ptr{$ elty}, Cint, Cint), ' N' , p, x, size (x, 1 ), size (x, 2 ))
895
932
return x
896
933
end
897
- function $fJ (p:: AdjointFTPlan{$elty, FTPlan{$elty, 1, K}} , x:: Matrix {$elty} ) where K
934
+ function $fJ (p:: AdjointFTPlan{$elty, FTPlan{$elty, 1, K}} , x:: StridedMatrix {$elty} ) where K
898
935
checksize (p, x)
936
+ checkstrides (p, x)
899
937
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Ptr{ft_plan_struct}, Ptr{$ elty}, Cint, Cint), ' T' , p, x, size (x, 1 ), size (x, 2 ))
900
938
return x
901
939
end
902
- function $fJ (p:: TransposeFTPlan{$elty, FTPlan{$elty, 1, K}} , x:: Matrix {$elty} ) where K
940
+ function $fJ (p:: TransposeFTPlan{$elty, FTPlan{$elty, 1, K}} , x:: StridedMatrix {$elty} ) where K
903
941
checksize (p, x)
942
+ checkstrides (p, x)
904
943
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Ptr{ft_plan_struct}, Ptr{$ elty}, Cint, Cint), ' T' , p, x, size (x, 1 ), size (x, 2 ))
905
944
return x
906
945
end
@@ -910,18 +949,21 @@ end
910
949
for (fJ, fC, elty) in ((:lmul! , :ft_bbbfmmf , :Float32 ),
911
950
(:lmul! , :ft_bbbfmm , :Float64 ))
912
951
@eval begin
913
- function $fJ (p:: FTPlan{$elty, 1, ASSOCIATEDJAC2JAC} , x:: Matrix {$elty} )
952
+ function $fJ (p:: FTPlan{$elty, 1, ASSOCIATEDJAC2JAC} , x:: StridedMatrix {$elty} )
914
953
checksize (p, x)
954
+ checkstrides (p, x)
915
955
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Cint, Cint, Ptr{ft_plan_struct}, Ptr{$ elty}, Cint, Cint), ' N' , ' 2' , ' 1' , p, x, size (x, 1 ), size (x, 2 ))
916
956
return x
917
957
end
918
- function $fJ (p:: AdjointFTPlan{$elty, FTPlan{$elty, 1, ASSOCIATEDJAC2JAC}} , x:: Matrix {$elty} )
958
+ function $fJ (p:: AdjointFTPlan{$elty, FTPlan{$elty, 1, ASSOCIATEDJAC2JAC}} , x:: StridedMatrix {$elty} )
919
959
checksize (p, x)
960
+ checkstrides (p, x)
920
961
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Cint, Cint, Ptr{ft_plan_struct}, Ptr{$ elty}, Cint, Cint), ' T' , ' 1' , ' 2' , p, x, size (x, 1 ), size (x, 2 ))
921
962
return x
922
963
end
923
- function $fJ (p:: TransposeFTPlan{$elty, FTPlan{$elty, 1, ASSOCIATEDJAC2JAC}} , x:: Matrix {$elty} )
964
+ function $fJ (p:: TransposeFTPlan{$elty, FTPlan{$elty, 1, ASSOCIATEDJAC2JAC}} , x:: StridedMatrix {$elty} )
924
965
checksize (p, x)
966
+ checkstrides (p, x)
925
967
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Cint, Cint, Ptr{ft_plan_struct}, Ptr{$ elty}, Cint, Cint), ' T' , ' 1' , ' 2' , p, x, size (x, 1 ), size (x, 2 ))
926
968
return x
927
969
end
@@ -931,18 +973,21 @@ end
931
973
for (fJ, fC, elty) in ((:lmul! , :ft_mpmm , :Float64 ),
932
974
(:ldiv! , :ft_mpsm , :Float64 ))
933
975
@eval begin
934
- function $fJ (p:: ModifiedFTPlan{$elty} , x:: Matrix {$elty} )
976
+ function $fJ (p:: ModifiedFTPlan{$elty} , x:: StridedMatrix {$elty} )
935
977
checksize (p, x)
978
+ checkstrides (p, x)
936
979
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Ptr{ft_plan_struct}, Ptr{$ elty}, Cint, Cint), ' N' , p, x, size (x, 1 ), size (x, 2 ))
937
980
return x
938
981
end
939
- function $fJ (p:: AdjointFTPlan{$elty, ModifiedFTPlan{$elty}} , x:: Matrix {$elty} )
982
+ function $fJ (p:: AdjointFTPlan{$elty, ModifiedFTPlan{$elty}} , x:: StridedMatrix {$elty} )
940
983
checksize (p, x)
984
+ checkstrides (p, x)
941
985
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Ptr{ft_plan_struct}, Ptr{$ elty}, Cint, Cint), ' T' , p, x, size (x, 1 ), size (x, 2 ))
942
986
return x
943
987
end
944
- function $fJ (p:: TransposeFTPlan{$elty, ModifiedFTPlan{$elty}} , x:: Matrix {$elty} )
988
+ function $fJ (p:: TransposeFTPlan{$elty, ModifiedFTPlan{$elty}} , x:: StridedMatrix {$elty} )
945
989
checksize (p, x)
990
+ checkstrides (p, x)
946
991
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Ptr{ft_plan_struct}, Ptr{$ elty}, Cint, Cint), ' T' , p, x, size (x, 1 ), size (x, 2 ))
947
992
return x
948
993
end
@@ -952,18 +997,21 @@ end
952
997
for (fJ, fC) in ((:lmul! , :ft_mpfr_trmm_ptr ),
953
998
(:ldiv! , :ft_mpfr_trsm_ptr ))
954
999
@eval begin
955
- function $fJ (p:: FTPlan{BigFloat, 1} , x:: Matrix {BigFloat} )
1000
+ function $fJ (p:: FTPlan{BigFloat, 1} , x:: StridedMatrix {BigFloat} )
956
1001
checksize (p, x)
1002
+ checkstrides (p, x)
957
1003
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Cint, Ptr{mpfr_t}, Cint, Ptr{BigFloat}, Cint, Cint, Int32), ' N' , p. n, p, p. n, renew! (x), size (x, 1 ), size (x, 2 ), Base. MPFR. ROUNDING_MODE[])
958
1004
return x
959
1005
end
960
- function $fJ (p:: AdjointFTPlan{BigFloat, FTPlan{BigFloat, 1, K}} , x:: Matrix {BigFloat} ) where K
1006
+ function $fJ (p:: AdjointFTPlan{BigFloat, FTPlan{BigFloat, 1, K}} , x:: StridedMatrix {BigFloat} ) where K
961
1007
checksize (p, x)
1008
+ checkstrides (p, x)
962
1009
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Cint, Ptr{mpfr_t}, Cint, Ptr{BigFloat}, Cint, Cint, Int32), ' T' , p. parent. n, p, p. parent. n, renew! (x), size (x, 1 ), size (x, 2 ), Base. MPFR. ROUNDING_MODE[])
963
1010
return x
964
1011
end
965
- function $fJ (p:: TransposeFTPlan{BigFloat, FTPlan{BigFloat, 1, K}} , x:: Matrix {BigFloat} ) where K
1012
+ function $fJ (p:: TransposeFTPlan{BigFloat, FTPlan{BigFloat, 1, K}} , x:: StridedMatrix {BigFloat} ) where K
966
1013
checksize (p, x)
1014
+ checkstrides (p, x)
967
1015
ccall (($ (string (fC)), libfasttransforms), Cvoid, (Cint, Cint, Ptr{mpfr_t}, Cint, Ptr{BigFloat}, Cint, Cint, Int32), ' T' , p. parent. n, p, p. parent. n, renew! (x), size (x, 1 ), size (x, 2 ), Base. MPFR. ROUNDING_MODE[])
968
1016
return x
969
1017
end
@@ -1077,12 +1125,12 @@ function execute_sph_reflection!(p::FTPlan{Float64, 2, SPHERICALISOMETRY}, w, x:
1077
1125
end
1078
1126
execute_sph_reflection! (p:: FTPlan{Float64, 2, SPHERICALISOMETRY} , w1, w2, w3, x:: Matrix{Float64} ) = execute_sph_reflection! (p, ft_reflection (w1, w2, w3), x)
1079
1127
1080
- * (p:: FTPlan{T} , x:: Array {Complex{T}} ) where T = lmul! (p, deepcopy (x))
1081
- * (p:: AdjointFTPlan{T} , x:: Array {Complex{T}} ) where T = lmul! (p, deepcopy (x))
1082
- * (p:: TransposeFTPlan{T} , x:: Array {Complex{T}} ) where T = lmul! (p, deepcopy (x))
1083
- \ (p:: FTPlan{T} , x:: Array {Complex{T}} ) where T = ldiv! (p, deepcopy (x))
1084
- \ (p:: AdjointFTPlan{T} , x:: Array {Complex{T}} ) where T = ldiv! (p, deepcopy (x))
1085
- \ (p:: TransposeFTPlan{T} , x:: Array {Complex{T}} ) where T = ldiv! (p, deepcopy (x))
1128
+ * (p:: FTPlan{T} , x:: AbstractArray {Complex{T}} ) where T = lmul! (p, Array (x))
1129
+ * (p:: AdjointFTPlan{T} , x:: AbstractArray {Complex{T}} ) where T = lmul! (p, Array (x))
1130
+ * (p:: TransposeFTPlan{T} , x:: AbstractArray {Complex{T}} ) where T = lmul! (p, Array (x))
1131
+ \ (p:: FTPlan{T} , x:: AbstractArray {Complex{T}} ) where T = ldiv! (p, Array (x))
1132
+ \ (p:: AdjointFTPlan{T} , x:: AbstractArray {Complex{T}} ) where T = ldiv! (p, Array (x))
1133
+ \ (p:: TransposeFTPlan{T} , x:: AbstractArray {Complex{T}} ) where T = ldiv! (p, Array (x))
1086
1134
1087
1135
for fJ in (:lmul! , :ldiv! )
1088
1136
@eval begin
0 commit comments