11# Julia interface when not defined in source files
22
3- eltype {T} (x:: DistMultiVec{T} ) = T
3+ Base . eltype {T} (x:: DistMultiVec{T} ) = T
44
5- function size (A:: ElementalMatrix , i:: Integer )
5+ function Base . size (A:: ElementalMatrix , i:: Integer )
66 if i < 1
77 error (" dimension out of range" )
88 elseif i == 1
@@ -14,17 +14,62 @@ function size(A::ElementalMatrix, i::Integer)
1414 end
1515end
1616
17- size (A:: ElementalMatrix ) = (size (A, 1 ), size (A, 2 ))
17+ Base . size (A:: ElementalMatrix ) = (size (A, 1 ), size (A, 2 ))
1818
19- (* ){T<: ElementalMatrix }(A:: T , B:: T ) = A_mul_B! (one (eltype (A)), A, B, zero (eltype (A)), similar (A, (size (A, 1 ), size (B, 2 ))))
20- (* ){T}(A:: DistSparseMatrix{T} , B:: DistMultiVec{T} ) = A_mul_B! (one (T), A, B, zero (T), similar (B, (size (A, 1 ), size (B, 2 ))))
21- Ac_mul_B {T<:ElementalMatrix} (A:: T , B:: T ) = Ac_mul_B! (one (eltype (A)), A, B, zero (eltype (A)), similar (A, (size (A, 2 ), size (B, 2 ))))
22- Ac_mul_B {T} (A:: DistSparseMatrix{T} , B:: DistMultiVec{T} ) = Ac_mul_B! (one (T), A, B, zero (T), similar (B, (size (A, 2 ), size (B, 2 ))))
19+ Base. copy! (A:: T , B:: T ) where {T<: ElementalMatrix } = _copy! (B, A)
20+ # copy(A::ElementalMatrix) = copy!(similar(A), A)
21+ Base. length (A:: ElementalMatrix ) = prod (size (A))
22+
23+ # # Current mutating Julia multiplication API
24+ Base. A_mul_B! (C:: T , A:: T , B:: T ) where {T<: ElementalMatrix } = gemm (NORMAL, NORMAL, one (eltype (T)), A, B, zero (eltype (T)), C)
25+ Base. Ac_mul_B! (C:: T , A:: T , B:: T ) where {T<: ElementalMatrix } = gemm (ADJOINT, NORMAL, one (eltype (T)), A, B, zero (eltype (T)), C)
26+ Base. At_mul_B! (C:: T , A:: T , B:: T ) where {T<: ElementalMatrix } = gemm (TRANSPOSE, NORMAL, one (eltype (T)), A, B, zero (eltype (T)), C)
27+ Base. A_mul_Bc! (C:: T , A:: T , B:: T ) where {T<: ElementalMatrix } = gemm (NORMAL, ADJOINT, one (eltype (T)), A, B, zero (eltype (T)), C)
28+ Base. A_mul_Bt! (C:: T , A:: T , B:: T ) where {T<: ElementalMatrix } = gemm (NORMAL, TRANSPOSE, one (eltype (T)), A, B, zero (eltype (T)), C)
29+
30+ # # BLAS like multiplication API (i.e. with α and β)
31+ Base. A_mul_B! (α:: Number , A:: S , B:: S , β:: Number , C:: S ) where {S<: ElementalMatrix{T} } where {T} =
32+ gemm (NORMAL, NORMAL, T (α), A, B, T (β), C)
33+ Base. Ac_mul_B! (α:: Number , A:: S , B:: S , β:: Number , C:: S ) where {S<: ElementalMatrix{T} } where {T} =
34+ gemm (ADJOINT, NORMAL, T (α), A, B, T (β), C)
35+ Base. At_mul_B! (α:: Number , A:: S , B:: S , β:: Number , C:: S ) where {S<: ElementalMatrix{T} } where {T} =
36+ gemm (TRANSPOSE, NORMAL, T (α), A, B, T (β), C)
37+ Base. A_mul_Bc! (α:: Number , A:: S , B:: S , β:: Number , C:: S ) where {S<: ElementalMatrix{T} } where {T} =
38+ gemm (NORMAL, ADJOINT, T (α), A, B, T (β), C)
39+ Base. A_mul_Bt! (α:: Number , A:: S , B:: S , β:: Number , C:: S ) where {S<: ElementalMatrix{T} } where {T} =
40+ gemm (NORMAL, TRANSPOSE, T (α), A, B, T (β), C)
41+
42+ # # Linear solve API
43+ Base. LinAlg. A_ldiv_B! (A:: LowerTriangular{T,S} , B:: S ) where {T,S<: ElementalMatrix } =
44+ trsm (LEFT, LOWER, NORMAL , NON_UNIT, one (T), A. data, B)
45+ Base. LinAlg. Ac_ldiv_B! (A:: LowerTriangular{T,S} , B:: S ) where {T,S<: ElementalMatrix } =
46+ trsm (LEFT, LOWER, ADJOINT , NON_UNIT, one (T), A. data, B)
47+ Base. LinAlg. At_ldiv_B! (A:: LowerTriangular{T,S} , B:: S ) where {T,S<: ElementalMatrix } =
48+ trsm (LEFT, LOWER, TRANSPOSE, NON_UNIT, one (T), A. data, B)
49+ Base. LinAlg. A_ldiv_B! (A:: UpperTriangular{T,S} , B:: S ) where {T,S<: ElementalMatrix } =
50+ trsm (LEFT, UPPER, NORMAL , NON_UNIT, one (T), A. data, B)
51+ Base. LinAlg. Ac_ldiv_B! (A:: UpperTriangular{T,S} , B:: S ) where {T,S<: ElementalMatrix } =
52+ trsm (LEFT, UPPER, ADJOINT , NON_UNIT, one (T), A. data, B)
53+ Base. LinAlg. At_ldiv_B! (A:: UpperTriangular{T,S} , B:: S ) where {T,S<: ElementalMatrix } =
54+ trsm (LEFT, UPPER, TRANSPOSE, NON_UNIT, one (T), A. data, B)
55+
56+ Base. LinAlg. A_rdiv_B! (A:: S , B:: LowerTriangular{T,S} ) where {T,S<: ElementalMatrix } =
57+ trsm (RIGHT, LOWER, NORMAL , NON_UNIT, one (T), B. data, A)
58+ Base. LinAlg. A_rdiv_Bc! (A:: S , B:: LowerTriangular{T,S} ) where {T,S<: ElementalMatrix } =
59+ trsm (RIGHT, LOWER, ADJOINT , NON_UNIT, one (T), B. data, A)
60+ Base. LinAlg. A_rdiv_Bt! (A:: S , B:: LowerTriangular{T,S} ) where {T,S<: ElementalMatrix } =
61+ trsm (RIGHT, LOWER, TRANSPOSE, NON_UNIT, one (T), B. data, A)
62+ Base. LinAlg. A_rdiv_B! (A:: S , B:: UpperTriangular{T,S} ) where {T,S<: ElementalMatrix } =
63+ trsm (RIGHT, UPPER, NORMAL , NON_UNIT, one (T), B. data, A)
64+ Base. LinAlg. A_rdiv_Bc! (A:: S , B:: UpperTriangular{T,S} ) where {T,S<: ElementalMatrix } =
65+ trsm (RIGHT, UPPER, ADJOINT , NON_UNIT, one (T), B. data, A)
66+ Base. LinAlg. A_rdiv_Bt! (A:: S , B:: UpperTriangular{T,S} ) where {T,S<: ElementalMatrix } =
67+ trsm (RIGHT, UPPER, TRANSPOSE, NON_UNIT, one (T), B. data, A)
2368
2469# Spectral
25- svd (A:: ElementalMatrix ) = svd! (copy (A))
26- svd (A:: ElementalMatrix , ctrl:: SVDCtrl ) = svd! (copy (A), ctrl)
27- svdvals (A:: ElementalMatrix , ctrl:: SVDCtrl ) = svdvals! (copy (A), ctrl)
70+ Base . LinAlg . svd (A:: ElementalMatrix ) = svd! (copy (A))
71+ Base . LinAlg . svd (A:: ElementalMatrix , ctrl:: SVDCtrl ) = svd! (copy (A), ctrl)
72+ Base . LinAlg . svdvals (A:: ElementalMatrix , ctrl:: SVDCtrl ) = svdvals! (copy (A), ctrl)
2873
2974# conversions to and from julia arrays
3075
@@ -43,7 +88,7 @@ svdvals(A::ElementalMatrix, ctrl::SVDCtrl) = svdvals!(copy(A), ctrl)
4388# return dest
4489# end
4590
46- function copy! {T} (dest:: DistMatrix{T} , src:: Base.VecOrMat )
91+ function Base . copy! {T} (dest:: DistMatrix{T} , src:: Base.VecOrMat )
4792 m, n = size (src, 1 ), size (src, 2 )
4893 zeros! (dest, m, n)
4994 if MPI. commRank (comm (dest)) == 0
@@ -57,21 +102,21 @@ function copy!{T}(dest::DistMatrix{T}, src::Base.VecOrMat)
57102 return dest
58103end
59104
60- function convert {T} (:: Type{Matrix{T}} , A:: Base.VecOrMat{T} )
105+ function Base . convert {T} (:: Type{Matrix{T}} , A:: Base.VecOrMat{T} )
61106 m, n = size (A, 1 ), size (A, 2 )
62107 B = Matrix (T)
63108 resize! (B, m, n)
64109 Base. unsafe_copy! (pointer (B), pointer (A), m* n)
65110 return B
66111end
67- function convert {T} (:: Type{Base.Matrix{T}} , A:: Matrix{T} )
112+ function Base . convert {T} (:: Type{Base.Matrix{T}} , A:: Matrix{T} )
68113 m, n = size (A)
69114 B = Base. Matrix {T} (m, n)
70115 Base. unsafe_copy! (pointer (B), pointer (A), m* n)
71116 return B
72117end
73118
74- function convert {T} (:: Type{DistMatrix{T}} , A:: Base.VecOrMat{T} )
119+ function Base . convert {T} (:: Type{DistMatrix{T}} , A:: Base.VecOrMat{T} )
75120 m, n = size (A, 1 ), size (A, 2 )
76121 B = DistMatrix (T)
77122 zeros! (B, m, n)
@@ -86,7 +131,7 @@ function convert{T}(::Type{DistMatrix{T}}, A::Base.VecOrMat{T})
86131 return B
87132end
88133
89- function convert {T} (:: Type{DistMultiVec{T}} , A:: Base.VecOrMat{T} )
134+ function Base . convert {T} (:: Type{DistMultiVec{T}} , A:: Base.VecOrMat{T} )
90135 m, n = size (A, 1 ), size (A, 2 )
91136 B = DistMultiVec (T)
92137 zeros! (B, m, n)
@@ -101,7 +146,7 @@ function convert{T}(::Type{DistMultiVec{T}}, A::Base.VecOrMat{T})
101146 return B
102147end
103148
104- function convert {T} (:: Type{DistMatrix{T}} , A:: DistMultiVec{T} )
149+ function Base . convert {T} (:: Type{DistMatrix{T}} , A:: DistMultiVec{T} )
105150 m, n = size (A)
106151 B = DistMatrix (T)
107152 zeros! (B, m, n)
@@ -115,7 +160,7 @@ function convert{T}(::Type{DistMatrix{T}}, A::DistMultiVec{T})
115160 return B
116161end
117162
118- function norm (x:: ElementalMatrix )
163+ function Base . LinAlg . norm (x:: ElementalMatrix )
119164 if size (x, 2 ) == 1
120165 return nrm2 (x)
121166 else
@@ -124,10 +169,11 @@ function norm(x::ElementalMatrix)
124169end
125170
126171# Multiplication
127- (* ){T}(A:: DistMatrix{T} , B:: Base.VecOrMat{T} ) = A* convert (DistMatrix{T}, B)
128- (* ){T}(A:: DistMultiVec{T} , B:: Base.VecOrMat{T} ) = convert (DistMatrix{T}, A)* convert (DistMatrix{T}, B)
129- (* ){T}(A:: DistSparseMatrix{T} , B:: Base.VecOrMat{T} ) = A* convert (DistMultiVec{T}, B)
130- Ac_mul_B {T} (A:: DistMatrix{T} , B:: Base.VecOrMat{T} ) = Ac_mul_B (A, convert (DistMatrix{T}, B))
131- Ac_mul_B {T} (A:: DistMultiVec{T} , B:: Base.VecOrMat{T} ) = Ac_mul_B (convert (DistMatrix{T}, A), convert (DistMatrix{T}, B))
132- Ac_mul_B {T} (A:: DistSparseMatrix{T} , B:: Base.VecOrMat{T} ) = Ac_mul_B (A, convert (DistMultiVec{T}, B))
172+ # (*){T}(A::DistMatrix{T}, B::Base.VecOrMat{T}) = A*convert(DistMatrix{T}, B)
173+ # (*){T}(A::DistMultiVec{T}, B::Base.VecOrMat{T}) = convert(DistMatrix{T}, A)*convert(DistMatrix{T}, B)
174+ # (*){T}(A::DistSparseMatrix{T}, B::Base.VecOrMat{T}) = A*convert(DistMultiVec{T}, B)
175+ # Ac_mul_B{T}(A::DistMatrix{T}, B::Base.VecOrMat{T}) = Ac_mul_B(A, convert(DistMatrix{T}, B))
176+ # Ac_mul_B{T}(A::DistMultiVec{T}, B::Base.VecOrMat{T}) = Ac_mul_B(convert(DistMatrix{T}, A), convert(DistMatrix{T}, B))
177+ # Ac_mul_B{T}(A::DistSparseMatrix{T}, B::Base.VecOrMat{T}) = Ac_mul_B(A, convert(DistMultiVec{T}, B))
133178
179+ Base. cholfact! (A:: Hermitian{<:Any,<:ElementalMatrix} , :: Type{Val{false}} ) = Base. LinAlg. Cholesky (cholesky (A. uplo == ' U' ? UPPER : LOWER, A. data), A. uplo)
0 commit comments