+def generation_order(x, fixed_len):
+ if args.random_regression_order:
+ order = torch.rand(x.size(), device=x.device)
+ order[:, :fixed_len] = torch.linspace(-2, -1, fixed_len, device=x.device)
+ order = order.sort(1).indices
+ else:
+ order = (
+ torch.arange(x.size(1), device=x.device).unsqueeze(0).expand(x.size(0), -1)
+ )
+ return order
+
+
+def reorder(x, order, back=False): # x is NxTxD1x...xDk, order is NxT'
+ u = x.reshape(x.size()[:2] + (-1,))
+ order = order.unsqueeze(-1).expand(-1, -1, u.size(-1))
+ if back:
+ v = u.new(u.size())
+ v.scatter_(1, order, u)
+ else:
+ v = u.gather(1, order)
+ v = v.reshape(v.size()[:2] + x.size()[2:])
+ return v
+
+
+def shuffle(x, fixed_len):
+ order = generation_order(x, fixed_len)
+ return reorder(x, order), order
+
+
+######################################################################
+