def local_reshape_dimshuffle(node):
    """
    If a dimshuffle is inside a reshape and does not change the order
    of dimensions, remove it.

    Reshape(Dimshuffle(x), shp) -> Reshape(x, shp)
    """
    if isinstance(node.op, T.Reshape):
        input_ = node.inputs[0]
        if input_.owner and isinstance(input_.owner.op, DimShuffle):
            new_order = input_.owner.op.new_order
            offset = 0
            for dim in new_order:
                if dim == 'x':
                    continue
                elif dim != offset:
                    return False
                else:
                    offset += 1
            return [
                T.reshape(input_.owner.inputs[0],
                          node.inputs[1],
                          ndim=node.outputs[0].ndim)
            ]
    return False
def local_reshape_dimshuffle(node):
    """
    If a dimshuffle is inside a reshape and does not change the order
    of dimensions, remove it.

    Reshape(Dimshuffle(x), shp) -> Reshape(x, shp)
    """
    if isinstance(node.op, T.Reshape):
        input_ = node.inputs[0]
        if input_.owner and isinstance(input_.owner.op, DimShuffle):
            new_order = input_.owner.op.new_order
            offset = 0
            for dim in new_order:
                if dim == 'x':
                    continue
                elif dim != offset:
                    return False
                else:
                    offset += 1
            return [T.reshape(input_.owner.inputs[0], node.inputs[1])]
    return False