xref: /aosp_15_r20/external/pytorch/benchmarks/sparse/utils.py (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Workerimport functools
2*da0073e9SAndroid Build Coastguard Workerimport operator
3*da0073e9SAndroid Build Coastguard Workerimport random
4*da0073e9SAndroid Build Coastguard Workerimport time
5*da0073e9SAndroid Build Coastguard Worker
6*da0073e9SAndroid Build Coastguard Workerimport numpy as np
7*da0073e9SAndroid Build Coastguard Worker
8*da0073e9SAndroid Build Coastguard Workerimport torch
9*da0073e9SAndroid Build Coastguard Worker
10*da0073e9SAndroid Build Coastguard Worker
11*da0073e9SAndroid Build Coastguard Worker# shim for torch.cuda.Event when running on cpu
12*da0073e9SAndroid Build Coastguard Workerclass Event:
13*da0073e9SAndroid Build Coastguard Worker    def __init__(self, enable_timing):
14*da0073e9SAndroid Build Coastguard Worker        pass
15*da0073e9SAndroid Build Coastguard Worker
16*da0073e9SAndroid Build Coastguard Worker    def record(self):
17*da0073e9SAndroid Build Coastguard Worker        self.time = time.perf_counter()
18*da0073e9SAndroid Build Coastguard Worker
19*da0073e9SAndroid Build Coastguard Worker    def elapsed_time(self, end_event):
20*da0073e9SAndroid Build Coastguard Worker        assert isinstance(end_event, Event)
21*da0073e9SAndroid Build Coastguard Worker        return end_event.time - self.time
22*da0073e9SAndroid Build Coastguard Worker
23*da0073e9SAndroid Build Coastguard Worker
24*da0073e9SAndroid Build Coastguard Workerdef gen_sparse_csr(shape, nnz):
25*da0073e9SAndroid Build Coastguard Worker    fill_value = 0
26*da0073e9SAndroid Build Coastguard Worker    total_values = functools.reduce(operator.mul, shape, 1)
27*da0073e9SAndroid Build Coastguard Worker    dense = np.random.randn(total_values)
28*da0073e9SAndroid Build Coastguard Worker    fills = random.sample(list(range(total_values)), total_values - nnz)
29*da0073e9SAndroid Build Coastguard Worker
30*da0073e9SAndroid Build Coastguard Worker    for f in fills:
31*da0073e9SAndroid Build Coastguard Worker        dense[f] = fill_value
32*da0073e9SAndroid Build Coastguard Worker    dense = torch.from_numpy(dense.reshape(shape))
33*da0073e9SAndroid Build Coastguard Worker
34*da0073e9SAndroid Build Coastguard Worker    return dense.to_sparse_csr()
35*da0073e9SAndroid Build Coastguard Worker
36*da0073e9SAndroid Build Coastguard Worker
37*da0073e9SAndroid Build Coastguard Workerdef gen_sparse_coo(shape, nnz):
38*da0073e9SAndroid Build Coastguard Worker    dense = np.random.randn(*shape)
39*da0073e9SAndroid Build Coastguard Worker    values = []
40*da0073e9SAndroid Build Coastguard Worker    indices = [[], []]
41*da0073e9SAndroid Build Coastguard Worker    for n in range(nnz):
42*da0073e9SAndroid Build Coastguard Worker        row = random.randint(0, shape[0] - 1)
43*da0073e9SAndroid Build Coastguard Worker        col = random.randint(0, shape[1] - 1)
44*da0073e9SAndroid Build Coastguard Worker        indices[0].append(row)
45*da0073e9SAndroid Build Coastguard Worker        indices[1].append(col)
46*da0073e9SAndroid Build Coastguard Worker        values.append(dense[row, col])
47*da0073e9SAndroid Build Coastguard Worker
48*da0073e9SAndroid Build Coastguard Worker    return torch.sparse_coo_tensor(indices, values, size=shape)
49*da0073e9SAndroid Build Coastguard Worker
50*da0073e9SAndroid Build Coastguard Worker
51*da0073e9SAndroid Build Coastguard Workerdef gen_sparse_coo_and_csr(shape, nnz):
52*da0073e9SAndroid Build Coastguard Worker    total_values = functools.reduce(operator.mul, shape, 1)
53*da0073e9SAndroid Build Coastguard Worker    dense = np.random.randn(total_values)
54*da0073e9SAndroid Build Coastguard Worker    fills = random.sample(list(range(total_values)), total_values - nnz)
55*da0073e9SAndroid Build Coastguard Worker
56*da0073e9SAndroid Build Coastguard Worker    for f in fills:
57*da0073e9SAndroid Build Coastguard Worker        dense[f] = 0
58*da0073e9SAndroid Build Coastguard Worker
59*da0073e9SAndroid Build Coastguard Worker    dense = torch.from_numpy(dense.reshape(shape))
60*da0073e9SAndroid Build Coastguard Worker    return dense.to_sparse(), dense.to_sparse_csr()
61