#!/usr/bin/env python3
#
# testing inplace opertions
#

import torch

print()
x = torch.tensor([1,2,3])
print(x," x original")          # tensor([1, 2, 3])
print(x.add(1), " x.add(1)")    # tensor([2, 3, 4])
print(x," x current")           # tensor([1, 2, 3])
print(x.add_(2), " x.add_(2)")  # tensor([3, 4, 5])  
                                # inplace operation, changes the value 
                                # of x in memory
print(x," x current")           # tensor([3, 4, 5])

print()
print("=========================")
print()

b  = torch.rand(4)
print(b._version, " b._version, id ", id(b))
b += 2              # an inplace operation
# b = b + 2         # new object generated
print(b._version, " b._version, id ", id(b))

print()
print("=========================")
print()

a = torch.rand(4, requires_grad=True)
c = a.pow(1)                   # compare
#c = a.pow_(1)                  # compare
c.sum().backward()
print("a       ", a)
print("a.grad  ", a.grad)
