

def perform(self, node, inputs, outputs):
    (a, b) = inputs
    (out,) = outputs
    if (a.shape[1] != b.shape[0]):
        raise ValueError('shape mismatch in StructuredDot.perform', (a.shape, b.shape))
    variable = (a * b)
    if isinstance(node.outputs[0].type, SparseType):
        assert _is_sparse(variable)
        out[0] = variable
        return
    assert _is_dense(variable)
    if (variable.ndim == 1):
        variable = numpy.expand_dims(variable, 1)
    elif (variable.ndim != 2):
        raise Exception('Output of structured dot should be a matrix (ndim=2)')
    assert (variable.ndim == 2)
    if (variable.shape != (a.shape[0], b.shape[1])):
        if (b.shape[0] == 1):
            raise Exception(('a.shape=%s, b.shape=%s, variable.shape=%s ??? This is probably because scipy.csc_matrix dot has a bug with singleton dimensions (i.e. b.shape[0]=1), for scipy 0.6. Use scipy 0.7. NB you have scipy version %s' % (a.shape, b.shape, variable.shape, scipy.__version__)))
        else:
            raise Exception('a.shape=%s, b.shape=%s, variable.shape=%s  ??? I have no idea why')
    out[0] = theano._asarray(variable, str(variable.dtype))

dataset/ETHPy150Open rizar/attention-lvcsr/libs/Theano/theano/sparse/basic.py StructuredDot.perform/original