30
30
#include < ciso646>
31
31
#include < functional>
32
32
#include < numeric>
33
+ #include < utility>
33
34
34
35
// Helper functions for autogenerated code
35
36
// These used to be inlined into the codegened Functions.cpp
@@ -361,7 +362,7 @@ Tensor norm_jvp(
361
362
const Tensor& self_t ,
362
363
const optional<Scalar>& p_,
363
364
Tensor norm) {
364
- return norm_jvp (self_p, self_t , p_, norm, {}, true );
365
+ return norm_jvp (self_p, self_t , p_, std::move ( norm) , {}, true );
365
366
}
366
367
367
368
Tensor _nested_from_padded_backward (
@@ -389,7 +390,7 @@ Tensor linalg_vector_norm_jvp(
389
390
// No need to handle the dtype arg as it's handled via broadcasting in the
390
391
// function
391
392
auto dim = opt_dim.value_or (IntArrayRef ({}));
392
- return norm_jvp (self_p, self_t , scalar_ord, norm, dim, keepdim);
393
+ return norm_jvp (self_p, self_t , scalar_ord, std::move ( norm) , dim, keepdim);
393
394
}
394
395
395
396
Tensor linalg_vector_norm_backward (
@@ -402,7 +403,8 @@ Tensor linalg_vector_norm_backward(
402
403
// No need to handle the dtype arg as it's handled via broadcasting in the
403
404
// function
404
405
auto dim = opt_dim.value_or (IntArrayRef ({}));
405
- return norm_backward (grad, self, scalar_ord, norm, dim, keepdim);
406
+ return norm_backward (
407
+ std::move (grad), self, scalar_ord, std::move (norm), dim, keepdim);
406
408
}
407
409
408
410
Tensor pow_backward (Tensor grad, const Tensor& self, const Scalar& exponent) {
@@ -415,7 +417,7 @@ Tensor pow_backward(Tensor grad, const Tensor& self, const Scalar& exponent) {
415
417
Tensor out = (exponent.isComplex ())
416
418
? grad_lambda (exponent.toComplexDouble ())
417
419
: grad_lambda (exponent.toDouble ());
418
- return handle_r_to_c (self, out);
420
+ return handle_r_to_c (self, std::move ( out) );
419
421
}
420
422
}
421
423
@@ -427,7 +429,7 @@ Tensor pow_backward_self(
427
429
exponent == 0.0 ,
428
430
at::zeros ({}, grad.options ()),
429
431
grad * (exponent * self.pow (exponent - 1 )).conj ());
430
- return handle_r_to_c (self, out);
432
+ return handle_r_to_c (self, std::move ( out) );
431
433
}
432
434
433
435
// Caveats:
@@ -455,7 +457,7 @@ Tensor pow_backward_exponent(
455
457
grad *
456
458
at::where (
457
459
cond, at::zeros ({}, grad.options ()), (result * self.log ()).conj ());
458
- return handle_r_to_c (exponent, out);
460
+ return handle_r_to_c (exponent, std::move ( out) );
459
461
}
460
462
461
463
Tensor pow_backward_exponent (
@@ -475,11 +477,11 @@ Tensor pow_backward_exponent(
475
477
auto out = grad *
476
478
at::where (cond (exponent),
477
479
at::zeros ({}, grad.options ()),
478
- grad_lambda (result, base));
479
- return handle_r_to_c (exponent, out);
480
+ grad_lambda (std::move ( result) , base));
481
+ return handle_r_to_c (exponent, std::move ( out) );
480
482
} else {
481
- auto out = grad * grad_lambda (result, base);
482
- return handle_r_to_c (exponent, out);
483
+ auto out = grad * grad_lambda (std::move ( result) , base);
484
+ return handle_r_to_c (exponent, std::move ( out) );
483
485
}
484
486
}
485
487
@@ -521,7 +523,7 @@ Tensor masked_fill_backward(const Tensor& grad, const Tensor& mask) {
521
523
522
524
Tensor mul_tensor_backward (Tensor grad, Tensor other, ScalarType self_st) {
523
525
auto out = grad * other.conj ();
524
- return handle_r_to_c (self_st, out);
526
+ return handle_r_to_c (self_st, std::move ( out) );
525
527
}
526
528
527
529
Tensor div_tensor_self_backward (
@@ -534,11 +536,12 @@ Tensor div_tensor_self_backward(
534
536
}
535
537
536
538
auto result = grad / other.conj ();
537
- return handle_r_to_c (self_st, result);
539
+ return handle_r_to_c (self_st, std::move ( result) );
538
540
}
539
541
540
542
Tensor div_tensor_self_backward (Tensor grad, Tensor other, ScalarType self_st) {
541
- return div_tensor_self_backward (grad, other, self_st, c10::nullopt);
543
+ return div_tensor_self_backward (
544
+ std::move (grad), std::move (other), self_st, c10::nullopt);
542
545
}
543
546
544
547
Tensor div_tensor_other_backward (
@@ -551,11 +554,12 @@ Tensor div_tensor_other_backward(
551
554
}
552
555
553
556
auto result = -grad * ((self / other) / other).conj ();
554
- return handle_r_to_c (other, result);
557
+ return handle_r_to_c (std::move ( other), std::move ( result) );
555
558
}
556
559
557
560
Tensor div_tensor_other_backward (Tensor grad, Tensor self, Tensor other) {
558
- return div_tensor_other_backward (grad, self, other, c10::nullopt);
561
+ return div_tensor_other_backward (
562
+ std::move (grad), std::move (self), std::move (other), c10::nullopt);
559
563
}
560
564
561
565
Tensor permute_backwards (const Tensor& grad, IntArrayRef fwd_dims) {
@@ -649,8 +653,9 @@ Tensor mean_backward(
649
653
c10::SymInt numel,
650
654
bool keepdim) {
651
655
bool is_all_reduce = !opt_dim.has_value () || opt_dim.value ().size () == 0 ;
652
- auto n = is_all_reduce ? numel : _safe_size (shape, opt_dim.value ());
653
- return sum_backward (grad, shape, opt_dim, keepdim) / n;
656
+ auto n =
657
+ is_all_reduce ? std::move (numel) : _safe_size (shape, opt_dim.value ());
658
+ return sum_backward (grad, shape, opt_dim, keepdim) / std::move (n);
654
659
}
655
660
656
661
std::vector<int64_t > reverse_list (const IntArrayRef list) {
@@ -692,7 +697,8 @@ Tensor prod_safe_zeros_backward(
692
697
693
698
Tensor narrow_reverse =
694
699
reverse_dim (inp.narrow (dim, 1 , inp.size (dim) - 1 ), dim);
695
- Tensor exclusive_reverse_nocp = at::cat ({ones, narrow_reverse}, dim);
700
+ Tensor exclusive_reverse_nocp =
701
+ at::cat ({std::move (ones), std::move (narrow_reverse)}, dim);
696
702
Tensor exclusive_reverse =
697
703
reverse_dim (exclusive_reverse_nocp.cumprod (dim), dim);
698
704
@@ -1387,8 +1393,8 @@ Tensor renorm_backward(
1387
1393
}
1388
1394
grad_output =
1389
1395
grad_output.sum (reduce_dims, /* keepdim=*/ true , /* dtype=*/ real_acc_type);
1390
- auto nb =
1391
- norm_backward (grad_output, self, p, norm, reduce_dims, /* keepdim=*/ true );
1396
+ auto nb = norm_backward (
1397
+ std::move (grad_output) , self, p, norm, reduce_dims, /* keepdim=*/ true );
1392
1398
1393
1399
auto invnorm = (norm + 1e-7 ).reciprocal ();
1394
1400
auto grad_norm = maxnorm * invnorm * (grad - invnorm * nb);
@@ -1571,7 +1577,7 @@ Tensor std_backward(
1571
1577
c10::optional<int64_t > correction,
1572
1578
bool keepdim) {
1573
1579
auto grad_var = (grad / (result * 2 )).masked_fill_ (result == 0 , 0 );
1574
- return var_backward (grad_var, self, dim, correction, keepdim);
1580
+ return var_backward (std::move ( grad_var) , self, dim, correction, keepdim);
1575
1581
}
1576
1582
1577
1583
Tensor var_mean_backward (
@@ -1593,7 +1599,7 @@ Tensor var_mean_backward(
1593
1599
dim_opt.value_or (IntArrayRef ({})),
1594
1600
self.sym_numel (),
1595
1601
keepdim);
1596
- gself = gself.defined () ? gself + aux : aux;
1602
+ gself = gself.defined () ? gself + aux : std::move ( aux) ;
1597
1603
}
1598
1604
return gself;
1599
1605
}
@@ -1618,7 +1624,7 @@ Tensor std_mean_backward(
1618
1624
dim_opt.value_or (IntArrayRef ({})),
1619
1625
self.sym_numel (),
1620
1626
keepdim);
1621
- gself = gself.defined () ? gself + aux : aux;
1627
+ gself = gself.defined () ? gself + aux : std::move ( aux) ;
1622
1628
}
1623
1629
return gself;
1624
1630
}
@@ -1637,8 +1643,9 @@ Tensor masked_scatter_backward(
1637
1643
// because mask_selected returns a 1-d tensor with size of masked elements
1638
1644
// that are 1, we need to fill out the rest with zeros then reshape back to
1639
1645
// tensor2's size.
1640
- auto zeros_fillin = at::zeros_symint ({diff_nelem}, grad.options ());
1641
- mask_selected = at::cat ({mask_selected, zeros_fillin}, 0 );
1646
+ auto zeros_fillin =
1647
+ at::zeros_symint ({std::move (diff_nelem)}, grad.options ());
1648
+ mask_selected = at::cat ({mask_selected, std::move (zeros_fillin)}, 0 );
1642
1649
}
1643
1650
return mask_selected.view_symint (sizes);
1644
1651
}
@@ -1661,7 +1668,7 @@ Tensor cholesky_jvp(const Tensor& dA, const Tensor& L, bool upper) {
1661
1668
dL = at::linalg_solve_triangular (L_.mH (), dL, /* upper=*/ true , /* left=*/ false );
1662
1669
dL = dL.tril () - dL.diagonal (0 , -2 , -1 ).mul (0.5 ).diag_embed ();
1663
1670
dL = L_.matmul (dL);
1664
- return upper ? dL.mH () : dL ;
1671
+ return upper ? dL.mH () : std::move (dL) ;
1665
1672
}
1666
1673
1667
1674
Tensor cholesky_backward (const Tensor& gL , bool upper, const Tensor& L) {
@@ -1899,7 +1906,7 @@ Tensor glu_double_backward(
1899
1906
auto gI_second_half =
1900
1907
ggI_second_half_times_first_half * gO * second_order_sh +
1901
1908
ggI_first_half * gO * sig_one_sub_sig;
1902
- return at::cat ({gI_first_half , gI_second_half }, dim);
1909
+ return at::cat ({std::move ( gI_first_half ), std::move ( gI_second_half ) }, dim);
1903
1910
}
1904
1911
1905
1912
Tensor glu_double_backward_grad_output (
@@ -2919,7 +2926,8 @@ Tensor as_strided_scatter_backward(
2919
2926
grad_.new_zeros_symint (input_geometry.sym_sizes ())
2920
2927
.as_strided_symint (
2921
2928
input_geometry.sym_sizes (), input_geometry.sym_strides ());
2922
- auto result_slice = result.as_strided_symint (sizes, strides, storage_offset);
2929
+ auto result_slice =
2930
+ result.as_strided_symint (sizes, strides, std::move (storage_offset));
2923
2931
result_slice.copy_ (grad_slice);
2924
2932
return result;
2925
2933
}
@@ -3014,7 +3022,12 @@ Tensor slice_backward_wrapper(
3014
3022
auto end_val = end.has_value () ? end.value () : INT64_MAX;
3015
3023
3016
3024
return slice_backward_symint (
3017
- grad, input_sizes, dim, start_val, end_val, step);
3025
+ grad,
3026
+ input_sizes,
3027
+ dim,
3028
+ std::move (start_val),
3029
+ std::move (end_val),
3030
+ std::move (step));
3018
3031
}
3019
3032
3020
3033
std::tuple<Tensor, Tensor, Tensor> linalg_svd_jvp (
@@ -3761,7 +3774,9 @@ Tensor differential_analytic_matrix_function(
3761
3774
// eg. if both are BatchedTensor at different level.
3762
3775
if (areAnyTensorSubclassLike ({A, grad})) {
3763
3776
meta_grad = at::cat (
3764
- {at::cat ({A, grad}, -1 ), at::cat ({at::zeros_like (A), A}, -1 )}, -2 );
3777
+ {at::cat ({A, grad}, -1 ),
3778
+ at::cat ({at::zeros_like (A), std::move (A)}, -1 )},
3779
+ -2 );
3765
3780
} else {
3766
3781
meta_grad = at::zeros (meta_grad_sizes, grad.options ());
3767
3782
meta_grad.narrow (-2 , 0 , n).narrow (-1 , 0 , n).copy_ (A);
@@ -4408,7 +4423,7 @@ std::tuple<Tensor, Tensor, Tensor> batchnorm_double_backward(
4408
4423
ggO = ggO.defined () ? ggO.add_ (ggO_G_term) : ggO_G_term;
4409
4424
}
4410
4425
if (ggB.defined ()) {
4411
- auto ggO_B_term = ggB_expanded;
4426
+ auto ggO_B_term = std::move ( ggB_expanded) ;
4412
4427
ggO = ggO.defined () ? ggO.add_ (ggO_B_term) : ggO_B_term;
4413
4428
}
4414
4429
@@ -4547,7 +4562,7 @@ std::tuple<Tensor, Tensor, Tensor> layer_norm_double_backward(
4547
4562
ggO = ggO.defined () ? ggO.add_ (ggO_G_term) : ggO_G_term;
4548
4563
}
4549
4564
if (ggB.defined ()) {
4550
- auto ggO_B_term = ggB_expanded;
4565
+ auto ggO_B_term = std::move ( ggB_expanded) ;
4551
4566
ggO = ggO.defined () ? ggO.add_ (ggO_B_term) : ggO_B_term;
4552
4567
}
4553
4568
if (ggO.defined ()) {
@@ -4589,7 +4604,7 @@ infinitely_differentiable_native_group_norm_backward(
4589
4604
Tensor ds;
4590
4605
Tensor db;
4591
4606
if (dY.defined ()) {
4592
- dY_tensor = dY.reshape_symint ({N, G, D, HxW});
4607
+ dY_tensor = dY.reshape_symint ({N, G, D, std::move ( HxW) });
4593
4608
ds = (dY_tensor * X_tensor).sum (3 ).unsqueeze_ (-1 );
4594
4609
db = dY_tensor.sum (3 ).unsqueeze_ (-1 );
4595
4610
}
@@ -4613,12 +4628,12 @@ infinitely_differentiable_native_group_norm_backward(
4613
4628
Tensor c = (isDefined (gamma ) ? (db * gamma_tensor).sum (2 ) : db.sum (2 ))
4614
4629
.unsqueeze_ (-2 );
4615
4630
b = (c * mean_tensor - b) * rstd_cube * s;
4616
- c = -b * mean_tensor - c * rstd_tensor * s ;
4631
+ c = -b * mean_tensor - c * rstd_tensor * std::move (s) ;
4617
4632
dX = a * dY_tensor + b * X_tensor + c;
4618
4633
if (dmean.defined () && drstd.defined ()) {
4619
4634
dX += var_mean_backward (
4620
4635
dvar,
4621
- dmean.view_symint ({N , G, 1 , 1 }),
4636
+ dmean.view_symint ({std::move (N) , G, 1 , 1 }),
4622
4637
X_tensor,
4623
4638
IntArrayRef{2 , 3 },
4624
4639
0 ,
@@ -4628,7 +4643,7 @@ infinitely_differentiable_native_group_norm_backward(
4628
4643
} else if (dmean.defined () && drstd.defined ()) {
4629
4644
dX = var_mean_backward (
4630
4645
dvar,
4631
- dmean.view_symint ({N , G, 1 , 1 }),
4646
+ dmean.view_symint ({std::move (N) , G, 1 , 1 }),
4632
4647
X_tensor,
4633
4648
IntArrayRef{2 , 3 },
4634
4649
0 ,
@@ -5463,7 +5478,7 @@ Tensor linalg_lu_solve_jvp(
5463
5478
/* unitriangular*/ true )
5464
5479
.matmul (P.mT ());
5465
5480
// dX = op_2(R^H) + S
5466
- return (left ? R.mH () : R ) + S;
5481
+ return (left ? R.mH () : std::move (R) ) + S;
5467
5482
}
5468
5483
}
5469
5484
@@ -5546,7 +5561,7 @@ std::tuple<Tensor, Tensor> linalg_solve_backward(
5546
5561
gA_ = left ? -gB_ .matmul (X_.mH ()) : -X_.mH ().matmul (gB_ );
5547
5562
}
5548
5563
return std::make_tuple (
5549
- A_requires_grad ? gA_ : Tensor{},
5564
+ A_requires_grad ? std::move ( gA_ ) : Tensor{},
5550
5565
B_requires_grad ? matrix_to_vector (gB_ ) : Tensor{});
5551
5566
}
5552
5567
@@ -6116,7 +6131,7 @@ Tensor linalg_lu_backward(
6116
6131
/* left=*/ true ,
6117
6132
/* unitriangular=*/ true );
6118
6133
6119
- return pivot ? P.matmul (std::move (A_grad)) : A_grad;
6134
+ return pivot ? P.matmul (std::move (A_grad)) : std::move ( A_grad) ;
6120
6135
} else if (m < n) {
6121
6136
// Wide case
6122
6137
// A1_grad = P L^{-H} [U1_grad + (L^H L_grad o 1_L - U_grad U^H o 1_U)
@@ -6275,7 +6290,8 @@ std::tuple<Tensor, Tensor> linalg_lu_jvp(
6275
6290
at::linalg_solve_triangular (
6276
6291
L1, PdA2, /* upper=*/ false , /* left=*/ true , /* unitriangular*/ true ) -
6277
6292
dK.tril (-1 ).matmul (U2);
6278
- return std::make_tuple (std::move (dL1), at::cat ({dU1, dU2}, /* dim=*/ -1 ));
6293
+ return std::make_tuple (
6294
+ std::move (dL1), at::cat ({std::move (dU1), std::move (dU2)}, /* dim=*/ -1 ));
6279
6295
} else {
6280
6296
// we only need to update dL2 defined as
6281
6297
// dL2 := PdA2 U^{-1} - L2 dK.triu()
@@ -6284,7 +6300,8 @@ std::tuple<Tensor, Tensor> linalg_lu_jvp(
6284
6300
auto dL2 =
6285
6301
at::linalg_solve_triangular (U1, PdA2, /* upper=*/ true , /* left=*/ false ) -
6286
6302
L2.matmul (dK.triu ());
6287
- return std::make_tuple (at::cat ({dL1, dL2}, /* dim=*/ -2 ), std::move (dU1));
6303
+ return std::make_tuple (
6304
+ at::cat ({std::move (dL1), std::move (dL2)}, /* dim=*/ -2 ), std::move (dU1));
6288
6305
}
6289
6306
}
6290
6307
@@ -6471,7 +6488,7 @@ std::tuple<Tensor, Tensor> scatter_reduce_backward(
6471
6488
auto node = std::make_shared<DelayedError>(
6472
6489
" scatter_reduce(): Double backward is unsupported for src when >1 zeros in src are scattered to the same position in self" ,
6473
6490
/* num inputs */ 1 );
6474
- auto result = node->apply ({grad_src1});
6491
+ auto result = node->apply ({std::move ( grad_src1) });
6475
6492
grad_src = result[0 ];
6476
6493
} else {
6477
6494
grad_src = grad_src1;
@@ -6565,7 +6582,7 @@ std::tuple<Tensor, Tensor> index_reduce_backward(
6565
6582
auto node = std::make_shared<DelayedError>(
6566
6583
" index_reduce(): Double backward is unsupported for source when >1 zeros in source are scattered to the same position in self" ,
6567
6584
/* num inputs */ 1 );
6568
- auto result = node->apply ({grad_src1});
6585
+ auto result = node->apply ({std::move ( grad_src1) });
6569
6586
grad_src = result[0 ];
6570
6587
} else {
6571
6588
grad_src = grad_src1;
0 commit comments