Well. I agree with you 50%. This is why.
If you have a code that modifies .data you expect to modify what x_.data contains, that is true. The problem is, as far as I now, that when you pass an argument to a python function the input argument is not modified.
a=1
def function(a):
     return a+1
print function(a)
print a

a is still 1. In autograd this does not happens. In autograd if “a” is autograd variable  its content would be modified. If a is not a variable it would not.
I think that this is not the tipical behaviour of python code and that is why I call it a “bug”. In my example I understood that the variable inside normalize(), x_, is independent from the argument passed when calling normalize(). I expect that internal in the function  to the variable would not change the variable in the main program. With the next function everything would persist.
def normalize(y_):
	min_val_aux,ind=torch.min(y_.data,1)   
	max_val_aux,ind=torch.max(y_.data,1)
	min_val = torch.zeros(100,1).cuda()
	max_val = torch.zeros(100,1).cuda()                                                     
	min_val[:,0]=min_val_aux                                                          
	max_val[:,0]=max_val_aux 
	a,b=y_.shape
	min_val=min_val.expand(100,b)
	max_val=max_val.expand(100,b)
	
	y_.data=(y_.data-min_val)/(max_val-min_val)
	return y_.data.cpu()

And the “bug” would persists.
Hope it is clearer.