forked from jazdev/libLAFF
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Mvmult_n.py
93 lines (69 loc) · 2.33 KB
/
Mvmult_n.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# Programmed by: Jasdev Singh
#
import flame
import laff as laff
def Mvmult_n_unb_var1(A, x, y):
"""
Mvmult_n_unb_var1(matrix, vector, vector)
Compuyes y = A * x + y using DOT products.
Traverses matrix A from TOP to BOTTOM,
vector y from TOP to BOTTOM.
"""
AT, \
AB = flame.part_2x1(A, \
0, 'TOP')
yT, \
yB = flame.part_2x1(y, \
0, 'TOP')
while AT.shape[0] < A.shape[0]:
A0, \
a1t, \
A2 = flame.repart_2x1_to_3x1(AT, \
AB, \
1, 'BOTTOM')
y0, \
psi1, \
y2 = flame.repart_2x1_to_3x1(yT, \
yB, \
1, 'BOTTOM')
laff.dots( a1t, x, psi1 )
AT, \
AB = flame.cont_with_3x1_to_2x1(A0, \
a1t, \
A2, \
'TOP')
yT, \
yB = flame.cont_with_3x1_to_2x1(y0, \
psi1, \
y2, \
'TOP')
flame.merge_2x1(yT, \
yB, y)
def Mvmult_n_unb_var2(A, x, y):
"""
Mvmult_n_unb_var2(matrix, vector, vector)
Compuyes y = A * x + y using AXPY operations.
Traverses matrix A from LEFT to RIGHT,
vector x from TOP to BOTTOM.
"""
AL, AR = flame.part_1x2(A, \
0, 'LEFT')
xT, \
xB = flame.part_2x1(x, \
0, 'TOP')
while AL.shape[1] < A.shape[1]:
A0, a1, A2 = flame.repart_1x2_to_1x3(AL, AR, \
1, 'RIGHT')
x0, \
chi1, \
x2 = flame.repart_2x1_to_3x1(xT, \
xB, \
1, 'BOTTOM')
laff.axpy( chi1, a1, y )
AL, AR = flame.cont_with_1x3_to_1x2(A0, a1, A2, \
'LEFT')
xT, \
xB = flame.cont_with_3x1_to_2x1(x0, \
chi1, \
x2, \
'TOP')