import torch import functools import random import operator import numpy as np import time # shim for torch.cuda.Event when running on cpu class Event(object): def __init__(self, enable_timing): pass def record(self): self.time = time.perf_counter() def elapsed_time(self, end_event): assert isinstance(end_event, Event) return end_event.time - self.time def gen_sparse_csr(shape, nnz): fill_value = 0 total_values = functools.reduce(operator.mul, shape, 1) dense = np.random.randn(total_values) fills = random.sample(list(range(total_values)), total_values - nnz) for f in fills: dense[f] = fill_value dense = torch.from_numpy(dense.reshape(shape)) return dense.to_sparse_csr() def gen_sparse_coo(shape, nnz): dense = np.random.randn(*shape) values = [] indices = [[], []] for n in range(nnz): row = random.randint(0, shape[0] - 1) col = random.randint(0, shape[1] - 1) indices[0].append(row) indices[1].append(col) values.append(dense[row, col]) return torch.sparse_coo_tensor(indices, values, size=shape) def gen_sparse_coo_and_csr(shape, nnz): total_values = functools.reduce(operator.mul, shape, 1) dense = np.random.randn(total_values) fills = random.sample(list(range(total_values)), total_values - nnz) for f in fills: dense[f] = 0 dense = torch.from_numpy(dense.reshape(shape)) return dense.to_sparse(), dense.to_sparse_csr()