Skip to content

Commit

Permalink
replacing more function-generating macros
Browse files Browse the repository at this point in the history
  • Loading branch information
JeffBezanson committed Mar 5, 2012
1 parent 040ea7b commit 0a29305
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 71 deletions.
18 changes: 8 additions & 10 deletions jl/linalg_arpack.jl
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
_jl_libarpack = dlopen("libarpack")

macro _jl_arpack_aupd_macro(T, Tc, saupd, real_naupd, complex_naupd)
quote
for (T, Tc, saupd, real_naupd, complex_naupd) in
((:Float64,:Complex128,"dsaupd_","dnaupd_","znaupd_"),
(:Float32,:Complex64, "ssaupd_","snaupd_","cnaupd_"))
@eval begin

# call dsaupd
# ( IDO, BMAT, N, WHICH, NEV, TOL, RESID, NCV, V, LDV, IPARAM,
Expand Down Expand Up @@ -51,11 +53,10 @@ macro _jl_arpack_aupd_macro(T, Tc, saupd, real_naupd, complex_naupd)
end
end

@_jl_arpack_aupd_macro Float64 Complex128 "dsaupd_" "dnaupd_" "znaupd_"
@_jl_arpack_aupd_macro Float32 Complex64 "ssaupd_" "snaupd_" "cnaupd_"

macro _jl_arpack_eupd_macro(T, Tc, seupd, real_neupd, complex_neupd)
quote
for (T, Tc, seupd, real_neupd, complex_neupd) in
((:Float64,:Complex128,"dseupd_","dneupd_","zneupd_"),
(:Float32,:Complex64 ,"sseupd_","sneupd_","cneupd_"))
@eval begin

# call dseupd
# ( RVEC, HOWMNY, SELECT, D, Z, LDZ, SIGMA, BMAT, N, WHICH, NEV, TOL,
Expand Down Expand Up @@ -114,9 +115,6 @@ macro _jl_arpack_eupd_macro(T, Tc, seupd, real_neupd, complex_neupd)
end
end

@_jl_arpack_eupd_macro Float64 Complex128 "dseupd_" "dneupd_" "zneupd_"
@_jl_arpack_eupd_macro Float32 Complex64 "sseupd_" "sneupd_" "cneupd_"

eigs(A) = eigs(A, 6)
eigs(A, k) = eigs(A, k, "LM")

Expand Down
29 changes: 13 additions & 16 deletions jl/linalg_lapack.jl
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ function lu!{T<:Union(Float32,Float64,Complex64,Complex128)}(A::StridedMatrix{T}
info = _jl_lapack_getrf(m, n, A, stride(A,2), ipiv)

#if info > 0; error("matrix is singular"); end
P = [i | i = 1:m]
P = [1:m]
for i=1:min(m,n)
t = P[i]
P[i] = P[ipiv[i]]
Expand All @@ -103,8 +103,10 @@ function lu!{T<:Union(Float32,Float64,Complex64,Complex128)}(A::StridedMatrix{T}
end


macro _jl_lapack_qr_macro(real_geqp3, complex_geqp3, orgqr, ungqr, elty, celty)
quote
for (real_geqp3, complex_geqp3, orgqr, ungqr, elty, celty) in
(("dgeqp3_","zgeqp3_","dorgqr_","zungqr_",:Float64,:Complex128),
("sgeqp3_","cgeqp3_","sorgqr_","cungqr_",:Float32,:Complex64))
@eval begin

# SUBROUTINE DGEQP3( M, N, A, LDA, JPVT, TAU, WORK, LWORK, INFO )
# * .. Scalar Arguments ..
Expand Down Expand Up @@ -176,9 +178,6 @@ macro _jl_lapack_qr_macro(real_geqp3, complex_geqp3, orgqr, ungqr, elty, celty)
end
end

@_jl_lapack_qr_macro :dgeqp3_ :zgeqp3_ :dorgqr_ :zungqr_ Float64 Complex128
@_jl_lapack_qr_macro :sgeqp3_ :cgeqp3_ :sorgqr_ :cungqr_ Float32 Complex64

#possible TODO: economy mode?

qr{T<:Integer}(x::StridedMatrix{T}) = qr(float64(x))
Expand Down Expand Up @@ -238,8 +237,10 @@ function qr{T<:Union(Float32,Float64,Complex64,Complex128)}(A::StridedMatrix{T})
error("error in LAPACK orgqr/ungqr");
end

macro _jl_lapack_eig_macro(syev, heev, real_geev, complex_geev, elty, celty)
quote
for (syev, heev, real_geev, complex_geev, elty, celty) in
(("dsyev_","zheev_","dgeev_","zgeev_",:Float64,:Complex128),
("ssyev_","cheev_","sgeev_","cgeev_",:Float32,:Complex64))
@eval begin

# SUBROUTINE DSYEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO )
# * .. Scalar Arguments ..
Expand Down Expand Up @@ -320,9 +321,6 @@ macro _jl_lapack_eig_macro(syev, heev, real_geev, complex_geev, elty, celty)
end
end

@_jl_lapack_eig_macro :dsyev_ :zheev_ :dgeev_ :zgeev_ Float64 Complex128
@_jl_lapack_eig_macro :ssyev_ :cheev_ :sgeev_ :cgeev_ Float32 Complex64

eig{T<:Integer}(x::StridedMatrix{T}) = eig(float64(x))

function eig{T<:Union(Float64,Float32,Complex128,Complex64)}(A::StridedMatrix{T})
Expand Down Expand Up @@ -435,8 +433,10 @@ function trideig(d::Vector{Float64}, e::Vector{Float64})
end


macro _jl_lapack_gesvd_macro(real_gesvd, complex_gesvd, elty, celty)
quote
for (real_gesvd, complex_gesvd, elty, celty) in
(("dgesvd_","zgesvd_",:Float64,:Complex128),
("sgesvd_","cgesvd_",:Float32,:Complex64))
@eval begin

# SUBROUTINE DGESVD( JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK, LWORK, INFO )
# * .. Scalar Arguments ..
Expand Down Expand Up @@ -483,9 +483,6 @@ macro _jl_lapack_gesvd_macro(real_gesvd, complex_gesvd, elty, celty)
end
end

@_jl_lapack_gesvd_macro :dgesvd_ :zgesvd_ Float64 Complex128
@_jl_lapack_gesvd_macro :sgesvd_ :cgesvd_ Float32 Complex64

svd{T<:Integer}(x::StridedMatrix{T}) = svd(float64(x))

function svd{T<:Union(Float64,Float32,Complex128,Complex64)}(A::StridedMatrix{T})
Expand Down
45 changes: 20 additions & 25 deletions jl/linalg_suitesparse.jl
Original file line number Diff line number Diff line change
Expand Up @@ -329,8 +329,10 @@ end

## Wrappers around UMFPACK routines

macro _jl_umfpack_symbolic_macro(f_sym_r, f_sym_c, inttype)
quote
for (f_sym_r, f_sym_c, inttype) in
(("umfpack_di_symbolic","umfpack_zi_symbolic",:Int32),
("umfpack_dl_symbolic","umfpack_zl_symbolic",:Int64))
@eval begin

function _jl_umfpack_symbolic{Tv<:Float64,Ti<:$inttype}(S::SparseMatrixCSC{Tv,Ti})
# Pointer to store the symbolic factorization returned by UMFPACK
Expand Down Expand Up @@ -363,11 +365,10 @@ macro _jl_umfpack_symbolic_macro(f_sym_r, f_sym_c, inttype)
end
end

@_jl_umfpack_symbolic_macro :umfpack_di_symbolic :umfpack_zi_symbolic Int32
@_jl_umfpack_symbolic_macro :umfpack_dl_symbolic :umfpack_zl_symbolic Int64

macro _jl_umfpack_numeric_macro(f_num_r, f_num_c, inttype)
quote
for (f_num_r, f_num_c, inttype) in
(("umfpack_di_numeric","umfpack_zi_numeric",:Int32),
("umfpack_dl_numeric","umfpack_zl_numeric",:Int64))
@eval begin

function _jl_umfpack_numeric{Tv<:Float64,Ti<:$inttype}(S::SparseMatrixCSC{Tv,Ti}, Symbolic)
# Pointer to store the numeric factorization returned by UMFPACK
Expand Down Expand Up @@ -400,11 +401,10 @@ macro _jl_umfpack_numeric_macro(f_num_r, f_num_c, inttype)
end
end

@_jl_umfpack_numeric_macro :umfpack_di_numeric :umfpack_zi_numeric Int32
@_jl_umfpack_numeric_macro :umfpack_dl_numeric :umfpack_zl_numeric Int64

macro _jl_umfpack_solve_macro(f_sol_r, f_sol_c, inttype)
quote
for (f_sol_r, f_sol_c, inttype) in
(("umfpack_di_solve","umfpack_zi_solve",:Int32),
("umfpack_dl_solve","umfpack_zl_solve",:Int64))
@eval begin

function _jl_umfpack_solve{Tv<:Float64,Ti<:$inttype}(S::SparseMatrixCSC{Tv,Ti},
b::Vector{Tv}, Numeric)
Expand Down Expand Up @@ -436,23 +436,18 @@ macro _jl_umfpack_solve_macro(f_sol_r, f_sol_c, inttype)
end
end

@_jl_umfpack_solve_macro :umfpack_di_solve :umfpack_zi_solve Int32
@_jl_umfpack_solve_macro :umfpack_dl_solve :umfpack_zl_solve Int64

macro _jl_umfpack_free_macro(f_symfree, f_numfree, eltype, inttype)
quote
for (f_symfree, f_numfree, elty, inttype) in
(("umfpack_di_free_symbolic","umfpack_di_free_numeric",:Float64,:Int32),
("umfpack_zi_free_symbolic","umfpack_zi_free_numeric",:Complex128,:Int32),
("umfpack_dl_free_symbolic","umfpack_dl_free_numeric",:Float64,:Int64),
("umfpack_zl_free_symbolic","umfpack_zl_free_numeric",:Complex128,:Int64))
@eval begin

_jl_umfpack_free_symbolic{Tv<:$eltype,Ti<:$inttype}(S::SparseMatrixCSC{Tv,Ti}, Symbolic) =
_jl_umfpack_free_symbolic{Tv<:$elty,Ti<:$inttype}(S::SparseMatrixCSC{Tv,Ti}, Symbolic) =
ccall(dlsym(_jl_libsuitesparse, $f_symfree), Void, (Ptr{Void},), Symbolic)

_jl_umfpack_free_numeric{Tv<:$eltype,Ti<:$inttype}(S::SparseMatrixCSC{Tv,Ti}, Numeric) =
_jl_umfpack_free_numeric{Tv<:$elty,Ti<:$inttype}(S::SparseMatrixCSC{Tv,Ti}, Numeric) =
ccall(dlsym(_jl_libsuitesparse, $f_numfree), Void, (Ptr{Void},), Numeric)

end
end

@_jl_umfpack_free_macro :umfpack_di_free_symbolic :umfpack_di_free_numeric Float64 Int32
@_jl_umfpack_free_macro :umfpack_zi_free_symbolic :umfpack_zi_free_numeric Complex128 Int32
@_jl_umfpack_free_macro :umfpack_dl_free_symbolic :umfpack_dl_free_numeric Float64 Int64
@_jl_umfpack_free_macro :umfpack_zl_free_symbolic :umfpack_zl_free_numeric Complex128 Int64

36 changes: 16 additions & 20 deletions jl/signal_fftw.jl
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,10 @@ _jl_fftw_destroy_plan(precision::Union(Type{Float32}, Type{Complex64}), plan) =

# Create 1d plan

macro _jl_fftw_plan_dft_1d_macro(libname, fname_complex, fname_real, T_in, T_out)
quote
for (libname, fname_complex, fname_real, T_in, T_out) in
((:_jl_libfftw,"fftw_plan_dft_1d","fftw_plan_dft_r2c_1d",:Float64,:Complex128),
(:_jl_libfftwf,"fftwf_plan_dft_1d","fftwf_plan_dft_r2c_1d",:Float32,:Complex64))
@eval begin
function _jl_fftw_plan_dft(X::Vector{$T_out}, Y::Vector{$T_out}, direction::Integer)
ccall(dlsym($libname, $fname_complex),
Ptr{Void},
Expand All @@ -70,13 +72,12 @@ macro _jl_fftw_plan_dft_1d_macro(libname, fname_complex, fname_real, T_in, T_out
end
end

@_jl_fftw_plan_dft_1d_macro _jl_libfftw :fftw_plan_dft_1d :fftw_plan_dft_r2c_1d Float64 Complex128
@_jl_fftw_plan_dft_1d_macro _jl_libfftwf :fftwf_plan_dft_1d :fftwf_plan_dft_r2c_1d Float32 Complex64

# Create 2d plan

macro _jl_fftw_plan_dft_2d_macro(libname, fname_complex, fname_real, T_in, T_out)
quote
for (libname, fname_complex, fname_real, T_in, T_out) in
((:_jl_libfftw,"fftw_plan_dft_2d","fftw_plan_dft_r2c_2d",:Float64,:Complex128),
(:_jl_libfftwf,"fftwf_plan_dft_2d","fftwf_plan_dft_r2c_2d",:Float32,:Complex64))
@eval begin
function _jl_fftw_plan_dft(X::Matrix{$T_out}, Y::Matrix{$T_out}, direction::Integer)
ccall(dlsym($libname, $fname_complex),
Ptr{Void},
Expand All @@ -92,13 +93,12 @@ macro _jl_fftw_plan_dft_2d_macro(libname, fname_complex, fname_real, T_in, T_out
end
end

@_jl_fftw_plan_dft_2d_macro _jl_libfftw :fftw_plan_dft_2d :fftw_plan_dft_r2c_2d Float64 Complex128
@_jl_fftw_plan_dft_2d_macro _jl_libfftwf :fftwf_plan_dft_2d :fftwf_plan_dft_r2c_2d Float32 Complex64

# Create 3d plan

macro _jl_fftw_plan_dft_3d_macro(libname, fname_complex, fname_real, T_in, T_out)
quote
for (libname, fname_complex, fname_real, T_in, T_out) in
((:_jl_libfftw,"fftw_plan_dft_2d","fftw_plan_dft_r2c_2d",:Float64,:Complex128),
(:_jl_libfftwf,"fftwf_plan_dft_2d","fftwf_plan_dft_r2c_2d",:Float32,:Complex64))
@eval begin
function _jl_fftw_plan_dft(X::Array{$T_out,3}, Y::Array{$T_out,3}, direction::Integer)
ccall(dlsym($libname, $fname_complex),
Ptr{Void},
Expand All @@ -114,13 +114,12 @@ macro _jl_fftw_plan_dft_3d_macro(libname, fname_complex, fname_real, T_in, T_out
end
end

@_jl_fftw_plan_dft_3d_macro _jl_libfftw :fftw_plan_dft_2d :fftw_plan_dft_r2c_2d Float64 Complex128
@_jl_fftw_plan_dft_3d_macro _jl_libfftwf :fftwf_plan_dft_2d :fftwf_plan_dft_r2c_2d Float32 Complex64

# Create nd plan

macro _jl_fftw_plan_dft_nd_macro(libname, fname_complex, fname_real, T_in, T_out)
quote
for (libname, fname_complex, fname_real, T_in, T_out) in
((:_jl_libfftw,"fftw_plan_dft","fftw_plan_dft_r2c",:Float64,:Complex128),
(:_jl_libfftwf,"fftwf_plan_dft","fftwf_plan_dft_r2c",:Float32,:Complex64))
@eval begin
function _jl_fftw_plan_dft(X::Array{$T_out}, Y::Array{$T_out}, direction::Integer)
ccall(dlsym($libname, $fname_complex),
Ptr{Void},
Expand All @@ -136,9 +135,6 @@ macro _jl_fftw_plan_dft_nd_macro(libname, fname_complex, fname_real, T_in, T_out
end
end

@_jl_fftw_plan_dft_nd_macro _jl_libfftw :fftw_plan_dft :fftw_plan_dft_r2c Float64 Complex128
@_jl_fftw_plan_dft_nd_macro _jl_libfftwf :fftwf_plan_dft :fftwf_plan_dft_r2c Float32 Complex64

# Complex inputs

function fftn{T<:Union(Complex128,Complex64)}(X::Array{T})
Expand Down

0 comments on commit 0a29305

Please sign in to comment.