1
- function * (A:: SparseMatrixCSR{Bi,Tv,Ti} ,B:: SparseMatrixCSR{Bi,Tv,Ti} ) where {Bi,Tv,Ti}
1
+ function Base.: * (A:: SparseMatrixCSR{Bi,Tv,Ti} ,B:: SparseMatrixCSR{Bi,Tv,Ti} ) where {Bi,Tv,Ti}
2
2
p,q = size (A)
3
3
r,s = size (B)
4
4
if q != r && throw (DimensionMismatch (" A has dimensions ($(p) ,$(q) ) but B has dimensions ($(p) ,$(q) )" ));end
@@ -8,7 +8,7 @@ function *(A::SparseMatrixCSR{Bi,Tv,Ti},B::SparseMatrixCSR{Bi,Tv,Ti}) where {Bi,
8
8
SparseMatrixCSR {Bi} (p, s, Ccsc. colptr, rowvals (Ccsc), nonzeros (Ccsc))
9
9
end
10
10
11
- function * (At:: Transpose{Tv, SparseMatrixCSR{Bi,Tv,Ti}} ,B:: SparseMatrixCSR{Bi,Tv,Ti} ) where {Bi,Tv,Ti}
11
+ function Base.: * (At:: Transpose{Tv, SparseMatrixCSR{Bi,Tv,Ti}} ,B:: SparseMatrixCSR{Bi,Tv,Ti} ) where {Bi,Tv,Ti}
12
12
p,q = size (At)
13
13
r,s = size (B)
14
14
if q != r && throw (DimensionMismatch (" At has dimensions ($(p) ,$(q) ) but B has dimensions ($(p) ,$(q) )" ));end
@@ -19,7 +19,7 @@ function *(At::Transpose{Tv, SparseMatrixCSR{Bi,Tv,Ti}},B::SparseMatrixCSR{Bi,Tv
19
19
SparseMatrixCSR {Bi} (p, s, Ccsc. colptr, rowvals (Ccsc), nonzeros (Ccsc))
20
20
end
21
21
22
- function * (A:: SparseMatrixCSR{Bi,Tv,Ti} ,Bt:: Transpose{Tv, SparseMatrixCSR{Bi,Tv,Ti}} ) where {Bi,Tv,Ti}
22
+ function Base.: * (A:: SparseMatrixCSR{Bi,Tv,Ti} ,Bt:: Transpose{Tv, SparseMatrixCSR{Bi,Tv,Ti}} ) where {Bi,Tv,Ti}
23
23
p,q = size (A)
24
24
r,s = size (Bt)
25
25
if q != r && throw (DimensionMismatch (" A has dimensions ($(p) ,$(q) ) but B has dimensions ($(p) ,$(q) )" ));end
@@ -30,7 +30,7 @@ function *(A::SparseMatrixCSR{Bi,Tv,Ti},Bt::Transpose{Tv, SparseMatrixCSR{Bi,Tv,
30
30
SparseMatrixCSR {Bi} (p, s, Ccsc. colptr, rowvals (Ccsc), nonzeros (Ccsc))
31
31
end
32
32
33
- function * (At:: Transpose{Tv,SparseMatrixCSR{Bi,Tv,Ti}} ,Bt:: Transpose{Tv, SparseMatrixCSR{Bi,Tv,Ti}} ) where {Bi,Tv,Ti}
33
+ function Base.: * (At:: Transpose{Tv,SparseMatrixCSR{Bi,Tv,Ti}} ,Bt:: Transpose{Tv, SparseMatrixCSR{Bi,Tv,Ti}} ) where {Bi,Tv,Ti}
34
34
p,q = size (At)
35
35
r,s = size (Bt)
36
36
if q != r && throw (DimensionMismatch (" A has dimensions ($(p) ,$(q) ) but B has dimensions ($(p) ,$(q) )" ));end
@@ -42,12 +42,12 @@ function *(At::Transpose{Tv,SparseMatrixCSR{Bi,Tv,Ti}},Bt::Transpose{Tv, SparseM
42
42
SparseMatrixCSR {Bi} (p, s, Ccsc. colptr, rowvals (Ccsc), nonzeros (Ccsc))
43
43
end
44
44
45
- function * (x:: Number ,A:: SparseMatrixCSR{Bi,Tv,Ti} ) where {Bi,Tv,Ti}
45
+ function Base.: * (x:: Number ,A:: SparseMatrixCSR{Bi,Tv,Ti} ) where {Bi,Tv,Ti}
46
46
SparseMatrixCSR {Bi} (size (A)... , copy (A. rowptr), copy (A. colval), map (a -> x* a, A. nzval))
47
47
end
48
- function * (A:: SparseMatrixCSR ,x:: Number ) * (x,A) end
48
+ function Base.: * (A:: SparseMatrixCSR ,x:: Number ) * (x,A) end
49
49
50
- function / (A:: SparseMatrixCSR{Bi,Tv,Ti} ,x:: Number ) where {Bi,Tv,Ti}
50
+ function Base.: / (A:: SparseMatrixCSR{Bi,Tv,Ti} ,x:: Number ) where {Bi,Tv,Ti}
51
51
SparseMatrixCSR {Bi} (size (A)... , copy (A. rowptr), copy (A. colval), map (a -> a/ x, A. nzval))
52
52
end
53
53
@@ -87,7 +87,9 @@ function LinearAlgebra.mul!(C::SparseMatrixCSC{Tv,Ti},
87
87
end
88
88
for ip in nzrange (C,j)
89
89
i = IC[ip]
90
- VC[ip] = x[i]
90
+ if xb[i] == j
91
+ VC[ip] = x[i]
92
+ end
91
93
end
92
94
end
93
95
C
@@ -132,7 +134,9 @@ function LinearAlgebra.mul!(C::SparseMatrixCSC{Tv,Ti},
132
134
end
133
135
for ip in nzrange (C,j)
134
136
i = IC[ip]
135
- VC[ip] += α* x[i]
137
+ if xb[i] == j
138
+ VC[ip] += α* x[i]
139
+ end
136
140
end
137
141
end
138
142
C
@@ -482,12 +486,6 @@ function LinearAlgebra.mul!(C::SparseMatrixCSC{Tv,Ti},
482
486
C
483
487
end
484
488
485
- # function LinearAlgebra.mul!(C::SparseMatrixCSC{Tv,Ti},At::Transpose{Tv,SparseMatrixCSC{Tv,Ti}},Bt::Transpose{Tv,SparseMatrixCSC{Tv,Ti}},α::Number,β::Number) where {Tv,Ti}
486
- # mul!(C,Bt.parent,At.parent,α,β)
487
- # C
488
- # end
489
-
490
-
491
489
function LinearAlgebra. mul! (C:: SparseMatrixCSR{Bi,Tv,Ti} ,
492
490
A:: SparseMatrixCSR{Bi,Tv,Ti} ,
493
491
B:: SparseMatrixCSR{Bi,Tv,Ti} ) where {Bi,Tv,Ti}
@@ -553,7 +551,7 @@ function LinearAlgebra.mul!(C::SparseMatrixCSR{Bi,Tv,Ti},
553
551
end
554
552
555
553
# Alternative to lazy csr to csc for matrix addition that does not drop structural zeros.
556
- function + (A:: SparseMatrixCSR{Bi,Tv,Ti} ,B:: SparseMatrixCSR{Bi,Tv,Ti} ) where {Bi,Tv,Ti}
554
+ function Base.: + (A:: SparseMatrixCSR{Bi,Tv,Ti} ,B:: SparseMatrixCSR{Bi,Tv,Ti} ) where {Bi,Tv,Ti}
557
555
if size (A) == size (B) || throw (DimensionMismatch (" Size of B $(size (B)) must match size of A $(size (A)) " ));end
558
556
p,q = size (A)
559
557
nnz_C_upperbound = nnz (A) + nnz (B)
@@ -611,7 +609,7 @@ function +(A::SparseMatrixCSR{Bi,Tv,Ti},B::SparseMatrixCSR{Bi,Tv,Ti}) where {Bi,
611
609
end
612
610
613
611
# Alternative to lazy csr to csc for matrix subtraction that does not drop structural zeros. Subtracts B from A, i.e. A - B.
614
- function - (A:: SparseMatrixCSR{Bi,Tv,Ti} ,B:: SparseMatrixCSR{Bi,Tv,Ti} ) where {Bi,Tv,Ti}
612
+ function Base.: - (A:: SparseMatrixCSR{Bi,Tv,Ti} ,B:: SparseMatrixCSR{Bi,Tv,Ti} ) where {Bi,Tv,Ti}
615
613
if size (A) == size (B) || throw (DimensionMismatch (" Size of B $(size (B)) must match size of A $(size (A)) " ));end
616
614
nnz_C_upperbound = nnz (A) + nnz (B)
617
615
p,r = size (A)
@@ -668,7 +666,7 @@ function -(A::SparseMatrixCSR{Bi,Tv,Ti},B::SparseMatrixCSR{Bi,Tv,Ti}) where {Bi,
668
666
SparseMatrixCSR {Bi} (p,r,IC,JC,VC) # A += B
669
667
end
670
668
671
- function - (A:: SparseMatrixCSR{Bi,Tv,Ti} ) where {Bi,Tv,Ti}
669
+ function Base.: - (A:: SparseMatrixCSR{Bi,Tv,Ti} ) where {Bi,Tv,Ti}
672
670
SparseMatrixCSR {Bi} (size (A)... , copy (A. rowptr), copy (A. colval), map (a-> - a, A. nzval))
673
671
end
674
672
@@ -731,7 +729,7 @@ function +(A::SparseMatrixCSC{Tv,Ti},B::SparseMatrixCSC{Tv,Ti}) where {Tv,Ti}
731
729
end
732
730
733
731
# Alternative to lazy csr to csc for matrix subtraction that does not drop structural zeros. Subtracts B from A, i.e. A - B.
734
- function - (A:: SparseMatrixCSC{Tv,Ti} ,B:: SparseMatrixCSC{Tv,Ti} ) where {Tv,Ti}
732
+ function Base.: - (A:: SparseMatrixCSC{Tv,Ti} ,B:: SparseMatrixCSC{Tv,Ti} ) where {Tv,Ti}
735
733
if size (A) == size (B) || throw (DimensionMismatch (" Size of B $(size (B)) must match size of A $(size (A)) " ));end
736
734
p,q = size (A)
737
735
nnz_C_upperbound = nnz (A) + nnz (B)
@@ -788,7 +786,7 @@ function -(A::SparseMatrixCSC{Tv,Ti},B::SparseMatrixCSC{Tv,Ti}) where {Tv,Ti}
788
786
SparseMatrixCSC {Tv,Ti} (p,q,JC,IC,VC)
789
787
end
790
788
791
- function - (A:: SparseMatrixCSC{Tv,Ti} ) where {Tv,Ti}
789
+ function Base.: - (A:: SparseMatrixCSC{Tv,Ti} ) where {Tv,Ti}
792
790
SparseMatrixCSC {Tv,Ti} (size (A)... , copy (A. colptr), copy (A. rowval), map (a-> - a, A. nzval))
793
791
end
794
792
@@ -1083,8 +1081,7 @@ function RAP!(C::SparseMatrixCSR{Bi,Tv,Ti}, Plt::Transpose{Tv,SparseMatrixCSR{Bi
1083
1081
v = nonzeros (Pl)[kp]
1084
1082
for jp in nzrange (C,k)
1085
1083
j = JC[jp]
1086
- if xb[j] == i
1087
- # println("HUHHH")
1084
+ if xb[j] == i
1088
1085
VC[jp] += v* x[j]
1089
1086
end
1090
1087
end
@@ -1183,15 +1180,12 @@ function RAP!(C::SparseMatrixCSR{Bi,Tv,Ti}, Plt::Transpose{Tv,SparseMatrixCSR{Bi
1183
1180
end
1184
1181
end
1185
1182
end
1186
- # @show((i,xb))
1187
- # @show((x))
1188
1183
for kp in nzrange (Pl, i)
1189
1184
k = colvals (Pl)[kp] # rowvals when transposed conceptually
1190
1185
v = nonzeros (Pl)[kp]
1191
1186
for jp in nzrange (C,k)
1192
1187
j = JC[jp]
1193
1188
if xb[j] == i
1194
- # println("EEEEEEEEEEEEEEEEEEHHH")
1195
1189
VC[jp] += α* v* x[j]
1196
1190
end
1197
1191
end
@@ -1312,7 +1306,9 @@ function RAP(Pl::SparseMatrixCSR{Bi,Tv,Ti}, A::SparseMatrixCSR{Bi,Tv,Ti}, Pr::Sp
1312
1306
end
1313
1307
for ind in nzrange (C,i)
1314
1308
j = JC[ind]
1315
- VC[ind] = xC[j]
1309
+ if xbC[j] == i
1310
+ VC[ind] = xC[j]
1311
+ end
1316
1312
end
1317
1313
end
1318
1314
end
@@ -1381,7 +1377,9 @@ function RAP!(C::SparseMatrixCSR{Bi,Tv,Ti},Pl::SparseMatrixCSR{Bi,Tv,Ti}, A::Spa
1381
1377
end
1382
1378
for ind in nzrange (C,i)
1383
1379
j = JC[ind]
1384
- VC[ind] = xC[j]
1380
+ if xbC[j] == i
1381
+ VC[ind] = xC[j]
1382
+ end
1385
1383
end
1386
1384
end
1387
1385
C
@@ -1441,7 +1439,9 @@ function RAP!(C::SparseMatrixCSR{Bi,Tv,Ti},Pl::SparseMatrixCSR{Bi,Tv,Ti}, A::Spa
1441
1439
end
1442
1440
for ind in nzrange (C,i)
1443
1441
j = JC[ind]
1444
- VC[ind] += α* xC[j]
1442
+ if xbC[j] == i
1443
+ VC[ind] += α* xC[j]
1444
+ end
1445
1445
end
1446
1446
end
1447
1447
C
@@ -1457,142 +1457,6 @@ function RAP(Pl::SparseMatrixCSR{Bi,Tv,Ti}, A::SparseMatrixCSR{Bi,Tv,Ti}, Prt::T
1457
1457
RAP (Pl,A,halfperm (Prt. parent))
1458
1458
end
1459
1459
1460
- # # Not worth it, complexity of N^2, very slow for small problems
1461
- # function RAP(Pl::SparseMatrixCSR{Bi,Tv,Ti}, A::SparseMatrixCSR{Bi,Tv,Ti}, Prt::Transpose{Tv,SparseMatrixCSR{Bi,Tv,Ti}}) where {Bi,Tv,Ti}
1462
- # p,q = size(Pl)
1463
- # m,r = size(A)
1464
- # n,s = size(Prt)
1465
- # if q == m || throw(DimensionMismatch("Invalid dimensions for R*A: ($p,$q)*($m,$r),"));end
1466
- # if r == n || throw(DimensionMismatch("Invalid dimensions: RA*P: ($p,$r)*($n,$s)"));end
1467
- # # find max row length of transposed matrix
1468
- # function find_row_lengths!(At,xb)
1469
- # foreach(colvals(At.parent)) do i
1470
- # xb[i] += 1
1471
- # end
1472
- # xb
1473
- # end
1474
- # function RAP_symbolic!(Pl,A,Prt)
1475
- # Pr = Prt.parent
1476
- # JPl = colvals(Pl)
1477
- # JA = colvals(A)
1478
- # IPr = colvals(Pr) # colvals can be interpreted as rowvals when Pr is virtually transposed.
1479
- # xb = zeros(Ti, q)
1480
- # x = similar(xb, Tv) # sparse accumulator
1481
- # max_rPl = find_max_row_length(Pl)
1482
- # max_rA = find_max_row_length(A)
1483
- # find_row_lengths!(Prt, xb)
1484
-
1485
- # max_rRA = max_rPl*max_rA
1486
- # JRA = Vector{Ti}(undef,max_rRA)
1487
- # JRA_permutation = collect(Ti, 1:max_rRA)
1488
- # nnz_C_upperbound = sum(l->max_rRA*l,xb)#p*max_rPl*max_rA*max_rPl
1489
- # # @show(nnz_C_upperbound)
1490
- # xb .= 0
1491
- # IC = Vector{Ti}(undef,p+1)
1492
- # JC = Vector{Ti}(undef, nnz_C_upperbound)
1493
- # nnz_C = 1
1494
- # IC[1] = nnz_C
1495
- # lp = Ref{Ti}()
1496
- # for i in 1:p
1497
- # lp[] = 0
1498
- # # local column pointer, refresh every row, start at 0 to allow empty rows
1499
- # # loop over columns "j" in row i of A
1500
- # for jp in nzrange(Pl, i)
1501
- # j = JPl[jp]
1502
- # # loop over columns "k" in row j of B
1503
- # for kp in nzrange(A, j)
1504
- # k = JA[kp]
1505
- # # since C is constructed rowwise, xb tracks if a column index is present in a new row in C.
1506
- # if xb[k] != i
1507
- # lp[] += 1
1508
- # JRA[lp[]] = k
1509
- # xb[k] = i
1510
- # end
1511
- # end
1512
- # end
1513
- # sort!(JRA_permutation,alg=QuickSort,by=i -> i <= lp[] ? JRA[i] : typemax(i))
1514
- # j_min = JRA[JRA_permutation[1]]
1515
- # j_max = JRA[JRA_permutation[lp[]]]
1516
- # for j in 1:size(Prt,2)
1517
- # ip_range = nzrange(Pr,j)
1518
- # ip = ip_range.start
1519
- # ip_stop = ip_range.stop
1520
- # i_min = IPr[ip]
1521
- # i_max = IPr[ip_stop]
1522
- # if i_min > j_max || j_min > i_max # no intersection
1523
- # continue
1524
- # end
1525
- # while ip <= ip_stop
1526
- # iPr = IPr[ip]
1527
- # if xb[iPr] == i
1528
- # JC[nnz_C] = j
1529
- # nnz_C += 1
1530
- # break
1531
- # end
1532
- # ip +=1
1533
- # end
1534
- # end
1535
- # IC[i+1] = nnz_C
1536
- # end
1537
- # nnz_C -= 1
1538
- # resize!(JC,nnz_C)
1539
- # VC = zeros(Tv,nnz_C)
1540
- # cache = (xb,x,JRA)
1541
- # SparseMatrixCSR{Bi}(p,s,IC,JC,VC), cache # values not yet initialized
1542
- # end
1543
-
1544
- # function RAP_numeric!(C,Pl,A,Prt,cache)
1545
- # Pr = Prt.parent
1546
- # JPl = colvals(Pl)
1547
- # VPl = nonzeros(Pl)
1548
- # JA = colvals(A)
1549
- # VA = nonzeros(A)
1550
- # IPr = colvals(Pr) # colvals can be interpreted as rowvals when Pr is virtually transposed.
1551
- # VPr = nonzeros(Pr)
1552
- # JC = colvals(C)
1553
- # VC = nonzeros(C)
1554
- # (xb,x,_) = cache
1555
- # for i in 1:p
1556
- # # loop over columns "j" in row i of A
1557
- # for jp in nzrange(Pl, i)
1558
- # j = JPl[jp]
1559
- # # loop over columns "k" in row j of B
1560
- # for kp in nzrange(A, j)
1561
- # k = JA[kp]
1562
- # # since C is constructed rowwise, xb tracks if a column index is present in a new row in C.
1563
- # if xb[k] != i
1564
- # xb[k] = i
1565
- # x[k] = VPl[jp] * VA[kp]
1566
- # else
1567
- # x[k] += VPl[jp] * VA[kp]
1568
- # end
1569
- # end
1570
- # end
1571
- # for col_ptr in nzrange(C,i)
1572
- # Pr_col = JC[col_ptr]
1573
- # Pr_rows_range = nzrange(Pr,Pr_col) # column l of Pr^T
1574
- # for ip in Pr_rows_range
1575
- # Pr_row = IPr[ip]
1576
- # if xb[Pr_row] == i
1577
- # VC[col_ptr] += x[Pr_row]*VPr[ip]
1578
- # end
1579
- # end
1580
- # end
1581
- # end
1582
- # end
1583
- # function _RAP(Pl,A,Prt)
1584
- # C,cache = RAP_symbolic!(Pl,A,Prt)
1585
- # # @code_warntype RAP_symbolic!(Pl,A,Prt)
1586
- # xb = cache[1]
1587
- # xb.=0
1588
- # RAP_numeric!(C,Pl,A,Prt,cache)
1589
- # # @code_warntype RAP_numeric!(C,Pl,A,Prt,cache)
1590
-
1591
- # C,cache
1592
- # end
1593
- # _RAP(Pl,A,Prt)
1594
- # end
1595
-
1596
1460
function RAP! (C:: SparseMatrixCSR{Bi,Tv,Ti} , Pl:: SparseMatrixCSR{Bi,Tv,Ti} , A:: SparseMatrixCSR{Bi,Tv,Ti} , Prt:: Transpose{Tv,SparseMatrixCSR{Bi,Tv,Ti}} ,cache) where {Bi,Tv,Ti}
1597
1461
p,q = size (Pl)
1598
1462
m,r = size (A)
@@ -1659,8 +1523,6 @@ function RAP!(C::SparseMatrixCSR{Bi,Tv,Ti}, Pl::SparseMatrixCSR{Bi,Tv,Ti}, A::Sp
1659
1523
VC .*= β
1660
1524
# some cache items are present with the regular RAP product in mind, which is how the allocating verison is performed
1661
1525
(xb,_,x,_,_) = cache
1662
- # yes = 0
1663
- # no = 0
1664
1526
for i in 1 : p
1665
1527
# loop over columns "j" in row i of A
1666
1528
for jp in nzrange (Pl, i)
@@ -1685,16 +1547,12 @@ function RAP!(C::SparseMatrixCSR{Bi,Tv,Ti}, Pl::SparseMatrixCSR{Bi,Tv,Ti}, A::Sp
1685
1547
iPr = IPr[ip]
1686
1548
if xb[iPr] == i
1687
1549
v += x[iPr]* VPr[ip]
1688
- # yes += 1
1689
- # else
1690
- # no += 1
1691
1550
end
1692
1551
end
1693
1552
1694
1553
VC[jpPr] += α* v
1695
1554
end
1696
1555
end
1697
- # @show((yes,no,yes/(yes+no),length(nonzeros(C))/p))
1698
1556
C
1699
1557
end
1700
1558
0 commit comments