from operator import add, floordiv, getitem, mul, neg, pos, setitem, sub

import torch

__all__ = ['INPLACE_OPS', 'INPLACE_METHOD', 'NON_INPLACE_METHOD']

# TODO fill out the inplace ops
INPLACE_OPS = [
    add,
    sub,
    mul,
    floordiv,
    neg,
    pos,
    getitem,
    setitem,
    getattr,
    torch.Tensor.cpu,
]

# TODO: list all call_methods that are inplace here
INPLACE_METHOD = [
    'transpose',
    'permute',
    # TODO: reshape may return a copy of the data if the data is not contiguous
    'reshape',
    'dim',
    'flatten',
    'size',
    'view',
    'unsqueeze',
    'to',
    'type',
    'flatten',
]

# TODO: list all call_methods that are not inplace here
NON_INPLACE_METHOD = [
    'chunk',
    'contiguous',
    'expand',
    'mean',
    'split',
]
