10
10
DENSITY = 0.01
11
11
12
12
13
- def side_ids ( side ):
14
- return f"{ side = } "
13
+ def format_id ( format ):
14
+ return f"{ format = } "
15
15
16
16
17
- @pytest .mark .parametrize ("side" , [100 , 500 , 1000 ], ids = side_ids )
18
- def test_matmul (benchmark , side , seed , max_size ):
19
- if side ** 2 >= max_size :
17
+ @pytest .mark .parametrize ("format" , ["coo" , "gcxs" ])
18
+ def test_matmul (benchmark , sides , format , seed , max_size , ids = format_id ):
19
+ m , n , p = sides
20
+
21
+ if m * n >= max_size or n * p >= max_size :
20
22
pytest .skip ()
23
+
21
24
rng = np .random .default_rng (seed = seed )
22
- x = sparse .random ((side , side ), density = DENSITY , random_state = rng )
23
- y = sparse .random ((side , side ), density = DENSITY , random_state = rng )
25
+ x = sparse .random ((m , n ), density = DENSITY , format = format , random_state = rng )
26
+ y = sparse .random ((n , p ), density = DENSITY , format = format , random_state = rng )
24
27
25
28
x @ y # Numba compilation
26
29
@@ -29,20 +32,20 @@ def bench():
29
32
x @ y
30
33
31
34
32
- def get_test_id (param ):
33
- side , rank = param
34
- return f"{ side = } -{ rank = } "
35
+ def get_test_id (params ):
36
+ side , rank , format = params
37
+ return f"{ side = } -{ rank = } - { format = } "
35
38
36
39
37
- @pytest .fixture (params = itertools .product ([100 , 500 , 1000 ], [1 , 2 , 3 , 4 ]), ids = get_test_id )
40
+ @pytest .fixture (params = itertools .product ([100 , 500 , 1000 ], [1 , 2 , 3 , 4 ], [ "coo" , "gcxs" ] ), ids = get_test_id )
38
41
def elemwise_args (request , seed , max_size ):
39
- side , rank = request .param
42
+ side , rank , format = request .param
40
43
if side ** rank >= max_size :
41
44
pytest .skip ()
42
45
rng = np .random .default_rng (seed = seed )
43
46
shape = (side ,) * rank
44
- x = sparse .random (shape , density = DENSITY , random_state = rng )
45
- y = sparse .random (shape , density = DENSITY , random_state = rng )
47
+ x = sparse .random (shape , density = DENSITY , format = format , random_state = rng )
48
+ y = sparse .random (shape , density = DENSITY , format = format , random_state = rng )
46
49
return x , y
47
50
48
51
@@ -56,14 +59,19 @@ def bench():
56
59
f (x , y )
57
60
58
61
59
- @pytest .fixture (params = [100 , 500 , 1000 ], ids = side_ids )
62
+ def get_elemwise_ids (params ):
63
+ side , format = params
64
+ return f"{ side = } -{ format = } "
65
+
66
+
67
+ @pytest .fixture (params = itertools .product ([100 , 500 , 1000 ], ["coo" , "gcxs" ]), ids = get_elemwise_ids )
60
68
def elemwise_broadcast_args (request , seed , max_size ):
61
- side = request .param
69
+ side , format = request .param
62
70
if side ** 2 >= max_size :
63
71
pytest .skip ()
64
72
rng = np .random .default_rng (seed = seed )
65
- x = sparse .random ((side , 1 , side ), density = DENSITY , random_state = rng )
66
- y = sparse .random ((side , side ), density = DENSITY , random_state = rng )
73
+ x = sparse .random ((side , 1 , side ), density = DENSITY , format = format , random_state = rng )
74
+ y = sparse .random ((side , side ), density = DENSITY , format = format , random_state = rng )
67
75
return x , y
68
76
69
77
@@ -77,15 +85,15 @@ def bench():
77
85
f (x , y )
78
86
79
87
80
- @pytest .fixture (params = itertools .product ([100 , 500 , 1000 ], [1 , 2 , 3 ]), ids = get_test_id )
88
+ @pytest .fixture (params = itertools .product ([100 , 500 , 1000 ], [1 , 2 , 3 ], [ "coo" , "gcxs" ] ), ids = get_test_id )
81
89
def indexing_args (request , seed , max_size ):
82
- side , rank = request .param
90
+ side , rank , format = request .param
83
91
if side ** rank >= max_size :
84
92
pytest .skip ()
85
93
rng = np .random .default_rng (seed = seed )
86
94
shape = (side ,) * rank
87
95
88
- return sparse .random (shape , density = DENSITY , random_state = rng )
96
+ return sparse .random (shape , density = DENSITY , format = format , random_state = rng )
89
97
90
98
91
99
def test_index_scalar (benchmark , indexing_args ):
@@ -123,3 +131,43 @@ def test_index_fancy(benchmark, indexing_args, seed):
123
131
@benchmark
124
132
def bench ():
125
133
x [index ]
134
+
135
+
136
+ def get_sides_ids (param ):
137
+ m , n , p = param
138
+ return f"{ m = } -{ n = } -{ p = } "
139
+
140
+
141
+ @pytest .fixture (params = itertools .product ([200 , 500 , 1000 ], [200 , 500 , 1000 ], [200 , 500 , 1000 ]), ids = get_sides_ids )
142
+ def sides (request ):
143
+ m , n , p = request .param
144
+ return m , n , p
145
+
146
+
147
+ @pytest .fixture (params = ([(0 , "coo" ), (0 , "gcxs" ), (1 , "gcxs" )]), ids = ["coo" , "gcxs-0-axis" , "gcxs-1-axis" ])
148
+ def densemul_args (request , sides , seed , max_size ):
149
+ compressed_axis , format = request .param
150
+ m , n , p = sides
151
+ if m * n >= max_size or n * p >= max_size :
152
+ pytest .skip ()
153
+ rng = np .random .default_rng (seed = seed )
154
+ if format == "coo" :
155
+ x = sparse .random ((m , n ), density = DENSITY / 10 , format = format , random_state = rng )
156
+ else :
157
+ x = sparse .random ((m , n ), density = DENSITY / 10 , format = format , random_state = rng ).change_compressed_axes (
158
+ (compressed_axis ,)
159
+ )
160
+ t = rng .random ((n , p ))
161
+
162
+ return x , t
163
+
164
+
165
+ def test_gcxs_dot_ndarray (benchmark , densemul_args ):
166
+ x , t = densemul_args
167
+
168
+ # Numba compilation
169
+ x @ t
170
+
171
+ @benchmark
172
+ def bench ():
173
+ x @ t
0 commit comments