

def perform(self, node, inputs, outputs):
    (x_data, x_indices, x_indptr, x_shape, g_data, g_indices, g_indptr, g_shape) = inputs
    (g_out,) = outputs
    if ((len(x_indptr) - 1) == x_shape[0]):
        sp_dim = x_shape[1]
    else:
        sp_dim = x_shape[0]
    g_row = numpy.zeros(sp_dim, dtype=g_data.dtype)
    gout_data = numpy.zeros(x_data.shape, dtype=node.outputs[0].dtype)
    for i in range((len(x_indptr) - 1)):
        for j_ptr in range(g_indptr[i], g_indptr[(i + 1)]):
            g_row[g_indices[j_ptr]] += g_data[j_ptr]
        for j_ptr in range(x_indptr[i], x_indptr[(i + 1)]):
            gout_data[j_ptr] = g_row[x_indices[j_ptr]]
        for j_ptr in range(g_indptr[i], g_indptr[(i + 1)]):
            g_row[g_indices[j_ptr]] = 0
    if (self.kmap is None):
        g_out[0] = gout_data
    else:
        grad = numpy.zeros_like(x_data)
        grad[self.kmap] = gout_data
        g_out[0] = g_indices

dataset/ETHPy150Open rizar/attention-lvcsr/libs/Theano/theano/sparse/basic.py CSMGrad.perform/VarMisuse@288/411 `grad`->`g_indices`