@@ -1287,6 +1287,27 @@ function A_rdiv_Bt!(A::StridedMatrix, B::UnitLowerTriangular)
1287
1287
A
1288
1288
end
1289
1289
1290
+ for f in (:A_rdiv_B! , :A_rdiv_Bc! , :A_rdiv_Bt! )
1291
+ for (uplo, fuplo) in ((:Lower , :tril! ), (:Upper , :triu! ))
1292
+ mat = Symbol (uplo, :Triangular )
1293
+ umat = Symbol (:Unit , mat)
1294
+ @eval begin
1295
+ $ f (A:: $mat , B:: Union{$mat,$umat} ) = ($ mat)($ f ($ fuplo (A. data), B))
1296
+ end
1297
+ end
1298
+ @eval $ f (A:: AbstractTriangular , B:: AbstractTriangular ) = $ f (full! (A), B)
1299
+ end
1300
+ for f in (:A_ldiv_B! , :Ac_ldiv_B! , :At_ldiv_B! )
1301
+ for (uplo, fuplo) in ((:Lower , :tril! ), (:Upper , :triu! ))
1302
+ mat = Symbol (uplo, :Triangular )
1303
+ umat = Symbol (:Unit , mat)
1304
+ @eval begin
1305
+ $ f (A:: Union{$mat,$umat} , B:: $mat ) = ($ mat)($ f (A, $ fuplo (B. data)))
1306
+ end
1307
+ end
1308
+ @eval $ f (A:: AbstractTriangular , B:: AbstractTriangular ) = $ f (A, full! (B))
1309
+ end
1310
+
1290
1311
# Promotion
1291
1312
# # Promotion methods in matmul don't apply to triangular multiplication since it is inplace. Hence we have to make very similar definitions, but without allocation of a result array. For multiplication and unit diagonal division the element type doesn't have to be stable under division whereas that is necessary in the general triangular solve problem.
1292
1313
@@ -1297,72 +1318,85 @@ for t in (UpperTriangular, UnitUpperTriangular, LowerTriangular, UnitLowerTriang
1297
1318
end
1298
1319
end
1299
1320
1300
- for f in (:* , :Ac_mul_B , :At_mul_B , :\ , :Ac_ldiv_B , :At_ldiv_B )
1321
+ # for f in (:*, :Ac_mul_B, :At_mul_B, :\, :Ac_ldiv_B, :At_ldiv_B)
1322
+ # @eval begin
1323
+ # ($f)(A::AbstractTriangular, B::AbstractTriangular) = ($f)(A, full(B))
1324
+ # end
1325
+ # end
1326
+ for f in (:* , :Ac_mul_B , :At_mul_B )
1301
1327
@eval begin
1302
1328
($ f)(A:: AbstractTriangular , B:: AbstractTriangular ) = ($ f)(A, full (B))
1303
1329
end
1304
1330
end
1305
- for f in (:A_mul_Bc , :A_mul_Bt , :Ac_mul_Bc , :At_mul_Bt , :/ , :A_rdiv_Bc , :A_rdiv_Bt )
1331
+ # for f in (:A_mul_Bc, :A_mul_Bt, :Ac_mul_Bc, :At_mul_Bt, :/, :A_rdiv_Bc, :A_rdiv_Bt)
1332
+ # @eval begin
1333
+ # ($f)(A::AbstractTriangular, B::AbstractTriangular) = ($f)(full(A), B)
1334
+ # end
1335
+ # end
1336
+ for f in (:A_mul_Bc , :A_mul_Bt , :Ac_mul_Bc , :At_mul_Bt )
1306
1337
@eval begin
1307
1338
($ f)(A:: AbstractTriangular , B:: AbstractTriangular ) = ($ f)(full (A), B)
1308
1339
end
1309
1340
end
1310
1341
1311
1342
# # The general promotion methods
1343
+ for mat in (:AbstractVector , AbstractMatrix)
1312
1344
# ## Multiplication with triangle to the left and hence rhs cannot be transposed.
1313
1345
for (f, g) in ((:* , :A_mul_B! ), (:Ac_mul_B , :Ac_mul_B! ), (:At_mul_B , :At_mul_B! ))
1314
1346
@eval begin
1315
- function ($ f){TA,TB} (A:: AbstractTriangular{TA} , B:: StridedVecOrMat{TB} )
1316
- TAB = typeof (zero (TA) * zero (TB) + zero (TA) * zero (TB ))
1347
+ function ($ f)(A:: AbstractTriangular , B:: $mat )
1348
+ TAB = typeof (zero (eltype (A)) * zero (eltype (B)) + zero (eltype (A)) * zero (eltype (B) ))
1317
1349
($ g)(convert (AbstractArray{TAB}, A), copy_oftype (B, TAB))
1318
1350
end
1319
1351
end
1320
1352
end
1321
1353
# ## Left division with triangle to the left hence rhs cannot be transposed. No quotients.
1322
1354
for (f, g) in ((:\ , :A_ldiv_B! ), (:Ac_ldiv_B , :Ac_ldiv_B! ), (:At_ldiv_B , :At_ldiv_B! ))
1323
1355
@eval begin
1324
- function ($ f){TA,TB,S} (A:: Union{UnitUpperTriangular{TA,S}, UnitLowerTriangular{TA,S}} , B:: StridedVecOrMat{TB} )
1325
- TAB = typeof (zero (TA) * zero (TB) + zero (TA) * zero (TB ))
1356
+ function ($ f)(A:: Union{UnitUpperTriangular, UnitLowerTriangular} , B:: $mat )
1357
+ TAB = typeof (zero (eltype (A)) * zero (eltype (B)) + zero (eltype (A)) * zero (eltype (B) ))
1326
1358
($ g)(convert (AbstractArray{TAB}, A), copy_oftype (B, TAB))
1327
1359
end
1328
1360
end
1329
1361
end
1330
1362
# ## Left division with triangle to the left hence rhs cannot be transposed. Quotients.
1331
1363
for (f, g) in ((:\ , :A_ldiv_B! ), (:Ac_ldiv_B , :Ac_ldiv_B! ), (:At_ldiv_B , :At_ldiv_B! ))
1332
1364
@eval begin
1333
- function ($ f){TA,TB,S} (A:: Union{UpperTriangular{TA,S}, LowerTriangular{TA,S}} , B:: StridedVecOrMat{TB} )
1334
- TAB = typeof ((zero (TA) * zero (TB) + zero (TA) * zero (TB)) / one (TA ))
1365
+ function ($ f)(A:: Union{UpperTriangular, LowerTriangular} , B:: $mat )
1366
+ TAB = typeof ((zero (eltype (A)) * zero (eltype (B)) + zero (eltype (A)) * zero (eltype (B))) / one (eltype (A) ))
1335
1367
($ g)(convert (AbstractArray{TAB}, A), copy_oftype (B, TAB))
1336
1368
end
1337
1369
end
1338
1370
end
1339
1371
# ## Multiplication with triangle to the rigth and hence lhs cannot be transposed.
1340
1372
for (f, g) in ((:* , :A_mul_B! ), (:A_mul_Bc , :A_mul_Bc! ), (:A_mul_Bt , :A_mul_Bt! ))
1341
1373
@eval begin
1342
- function ($ f){TA,TB} (A:: StridedVecOrMat{TA} , B:: AbstractTriangular{TB} )
1343
- TAB = typeof (zero (TA) * zero (TB) + zero (TA) * zero (TB ))
1374
+ function ($ f)(A:: $mat , B:: AbstractTriangular )
1375
+ TAB = typeof (zero (eltype (A)) * zero (eltype (B)) + zero (eltype (A)) * zero (eltype (B) ))
1344
1376
($ g)(copy_oftype (A, TAB), convert (AbstractArray{TAB}, B))
1345
1377
end
1346
1378
end
1347
1379
end
1348
1380
# ## Right division with triangle to the right hence lhs cannot be transposed. No quotients.
1349
1381
for (f, g) in ((:/ , :A_rdiv_B! ), (:A_rdiv_Bc , :A_rdiv_Bc! ), (:A_rdiv_Bt , :A_rdiv_Bt! ))
1350
1382
@eval begin
1351
- function ($ f){TA,TB,S} (A:: StridedVecOrMat{TA} , B:: Union{UnitUpperTriangular{TB,S}, UnitLowerTriangular{TB,S} } )
1352
- TAB = typeof (zero (TA) * zero (TB) + zero (TA) * zero (TB ))
1383
+ function ($ f)(A:: $mat , B:: Union{UnitUpperTriangular, UnitLowerTriangular} )
1384
+ TAB = typeof (zero (eltype (A)) * zero (eltype (B)) + zero (eltype (A)) * zero (eltype (B) ))
1353
1385
($ g)(copy_oftype (A, TAB), convert (AbstractArray{TAB}, B))
1354
1386
end
1355
1387
end
1356
1388
end
1389
+
1357
1390
# ## Right division with triangle to the right hence lhs cannot be transposed. Quotients.
1358
1391
for (f, g) in ((:/ , :A_rdiv_B! ), (:A_rdiv_Bc , :A_rdiv_Bc! ), (:A_rdiv_Bt , :A_rdiv_Bt! ))
1359
1392
@eval begin
1360
- function ($ f){TA,TB,S} (A:: StridedVecOrMat{TA} , B:: Union{UpperTriangular{TB,S}, LowerTriangular{TB,S} } )
1361
- TAB = typeof ((zero (TA) * zero (TB) + zero (TA) * zero (TB)) / one (TA ))
1393
+ function ($ f)(A:: $mat , B:: Union{UpperTriangular, LowerTriangular} )
1394
+ TAB = typeof ((zero (eltype (A)) * zero (eltype (B)) + zero (eltype (A)) * zero (eltype (B))) / one (eltype (A) ))
1362
1395
($ g)(copy_oftype (A, TAB), convert (AbstractArray{TAB}, B))
1363
1396
end
1364
1397
end
1365
1398
end
1399
+ end
1366
1400
# ## Fallbacks brought in from linalg/bidiag.jl while fixing #14506.
1367
1401
# Eventually the above promotion methods should be generalized as
1368
1402
# was done for bidiagonal matrices in #14506.
0 commit comments