mollusk 0e4acfb8f2 fix incorrect folder name for julia-0.6.x
Former-commit-id: ef2c7401e0876f22d2f7762d182cfbcd5a7d9c70
2018-06-11 03:28:36 -07:00

295 lines
5.6 KiB
Julia

# This file is a part of Julia. License is MIT: https://julialang.org/license
module LinAlg
import Base: \, /, *, ^, +, -, ==
import Base: A_mul_Bt, At_ldiv_Bt, A_rdiv_Bc, At_ldiv_B, Ac_mul_Bc, A_mul_Bc, Ac_mul_B,
Ac_ldiv_B, Ac_ldiv_Bc, At_mul_Bt, A_rdiv_Bt, At_mul_B
import Base: USE_BLAS64, abs, big, broadcast, ceil, conj, convert, copy, copy!,
ctranspose, eltype, eye, findmax, findmin, fill!, floor, full, getindex,
hcat, imag, indices, inv, isapprox, kron, length, IndexStyle, map,
ndims, oneunit, parent, power_by_squaring, print_matrix, promote_rule, real, round,
setindex!, show, similar, size, transpose, trunc, typed_hcat
using Base: promote_op, _length, iszero, @pure, @propagate_inbounds, IndexLinear,
reduce, hvcat_fill, typed_vcat, promote_typeof
# We use `_length` because of non-1 indices; releases after julia 0.5
# can go back to `length`. `_length(A)` is equivalent to `length(linearindices(A))`.
export
# Modules
LAPACK,
BLAS,
# Types
RowVector,
ConjArray,
ConjVector,
ConjMatrix,
SymTridiagonal,
Tridiagonal,
Bidiagonal,
Factorization,
BunchKaufman,
Cholesky,
CholeskyPivoted,
Eigen,
GeneralizedEigen,
GeneralizedSVD,
GeneralizedSchur,
Hessenberg,
LU,
LDLt,
QR,
QRPivoted,
LQ,
Schur,
SVD,
Hermitian,
Symmetric,
LowerTriangular,
UpperTriangular,
Diagonal,
UniformScaling,
# Functions
axpy!,
bkfact,
bkfact!,
chol,
cholfact,
cholfact!,
cond,
condskeel,
copy!,
copy_transpose!,
cross,
ctranspose,
ctranspose!,
det,
diag,
diagind,
diagm,
diff,
dot,
eig,
eigfact,
eigfact!,
eigmax,
eigmin,
eigs,
eigvals,
eigvals!,
eigvecs,
expm,
eye,
factorize,
givens,
gradient,
hessfact,
hessfact!,
isdiag,
ishermitian,
isposdef,
isposdef!,
issymmetric,
istril,
istriu,
kron,
ldltfact!,
ldltfact,
linreg,
logabsdet,
logdet,
logm,
lu,
lufact,
lufact!,
lyap,
norm,
normalize,
normalize!,
nullspace,
ordschur!,
ordschur,
peakflops,
pinv,
qr,
qrfact!,
qrfact,
lq,
lqfact!,
lqfact,
rank,
scale!,
schur,
schurfact!,
schurfact,
sqrtm,
svd,
svdfact!,
svdfact,
svds,
svdvals!,
svdvals,
sylvester,
trace,
transpose,
transpose!,
transpose_type,
tril,
triu,
tril!,
triu!,
vecdot,
vecnorm,
# Operators
\,
/,
A_ldiv_B!,
A_ldiv_Bc,
A_ldiv_Bt,
A_mul_B!,
A_mul_Bc,
A_mul_Bc!,
A_mul_Bt,
A_mul_Bt!,
A_rdiv_Bc,
A_rdiv_Bt,
Ac_ldiv_B,
Ac_ldiv_Bc,
Ac_ldiv_B!,
Ac_mul_B,
Ac_mul_B!,
Ac_mul_Bc,
Ac_mul_Bc!,
Ac_rdiv_B,
Ac_rdiv_Bc,
At_ldiv_B,
At_ldiv_Bt,
At_ldiv_B!,
At_mul_B,
At_mul_B!,
At_mul_Bt,
At_mul_Bt!,
At_rdiv_B,
At_rdiv_Bt,
# Constants
I
const BlasFloat = Union{Float64,Float32,Complex128,Complex64}
const BlasReal = Union{Float64,Float32}
const BlasComplex = Union{Complex128,Complex64}
if USE_BLAS64
const BlasInt = Int64
else
const BlasInt = Int32
end
# Check that stride of matrix/vector is 1
# Writing like this to avoid splatting penalty when called with multiple arguments,
# see PR 16416
@inline chkstride1(A...) = _chkstride1(true, A...)
@noinline _chkstride1(ok::Bool) = ok || error("matrix does not have contiguous columns")
@inline _chkstride1(ok::Bool, A, B...) = _chkstride1(ok & (stride(A, 1) == 1), B...)
"""
LinAlg.checksquare(A)
Check that a matrix is square, then return its common dimension.
For multiple arguments, return a vector.
# Example
```jldoctest
julia> A = ones(4,4); B = zeros(5,5);
julia> LinAlg.checksquare(A, B)
2-element Array{Int64,1}:
4
5
```
"""
function checksquare(A)
m,n = size(A)
m == n || throw(DimensionMismatch("matrix is not square: dimensions are $(size(A))"))
m
end
function checksquare(A...)
sizes = Int[]
for a in A
size(a,1)==size(a,2) || throw(DimensionMismatch("matrix is not square: dimensions are $(size(a))"))
push!(sizes, size(a,1))
end
return sizes
end
function char_uplo(uplo::Symbol)
if uplo == :U
'U'
elseif uplo == :L
'L'
else
throw(ArgumentError("uplo argument must be either :U (upper) or :L (lower)"))
end
end
copy_oftype(A::AbstractArray{T}, ::Type{T}) where {T} = copy(A)
copy_oftype(A::AbstractArray{T,N}, ::Type{S}) where {T,N,S} = convert(AbstractArray{S,N}, A)
include("conjarray.jl")
include("transpose.jl")
include("rowvector.jl")
include("exceptions.jl")
include("generic.jl")
include("blas.jl")
import .BLAS: gemv! # consider renaming gemv! in matmul
include("matmul.jl")
include("lapack.jl")
include("dense.jl")
include("tridiag.jl")
include("triangular.jl")
include("factorization.jl")
include("qr.jl")
include("hessenberg.jl")
include("lq.jl")
include("eigen.jl")
include("svd.jl")
include("symmetric.jl")
include("cholesky.jl")
include("lu.jl")
include("bunchkaufman.jl")
include("diagonal.jl")
include("bidiag.jl")
include("uniformscaling.jl")
include("givens.jl")
include("special.jl")
include("bitarray.jl")
include("ldlt.jl")
include("schur.jl")
include("arpack.jl")
include("arnoldi.jl")
function __init__()
try
BLAS.check()
if BLAS.vendor() == :mkl
ccall((:MKL_Set_Interface_Layer, Base.libblas_name), Void, (Cint,), USE_BLAS64 ? 1 : 0)
end
catch ex
Base.showerror_nostdio(ex,
"WARNING: Error during initialization of module LinAlg")
end
end
end # module LinAlg