Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dispose Scalars implicitly created in Tensor operators #1434

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
225 changes: 184 additions & 41 deletions src/TorchSharp/Tensor/Tensor.Operators.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,66 +12,209 @@ public partial class Tensor
public static Tensor operator +(Tensor left, Scalar right) => left.add(right);
public static Tensor operator +(Scalar left, Tensor right) => right.add(left);

public static Tensor operator +(Tensor left, int right) => left.add(right);
public static Tensor operator +(Tensor left, long right) => left.add(right);
public static Tensor operator +(Tensor left, float right) => left.add(right);
public static Tensor operator +(Tensor left, double right) => left.add(right);

public static Tensor operator +(int left, Tensor right) => right.add(left);
public static Tensor operator +(long left, Tensor right) => right.add(left);
public static Tensor operator +(float left, Tensor right) => right.add(left);
public static Tensor operator +(double left, Tensor right) => right.add(left);
public static Tensor operator +(Tensor left, int right)
{
using Scalar scalar = right;
return left + scalar;
}
public static Tensor operator +(Tensor left, long right)
{
using Scalar scalar = right;
return left + scalar;
}
public static Tensor operator +(Tensor left, float right)
{
using Scalar scalar = right;
return left + scalar;
}
public static Tensor operator +(Tensor left, double right)
{
using Scalar scalar = right;
return left + scalar;
}

public static Tensor operator +(int left, Tensor right)
{
using Scalar scalar = left;
return scalar + right;
}
public static Tensor operator +(long left, Tensor right)
{
using Scalar scalar = left;
return scalar + right;
}
public static Tensor operator +(float left, Tensor right)
{
using Scalar scalar = left;
return scalar + right;
}
public static Tensor operator +(double left, Tensor right)
{
using Scalar scalar = left;
return scalar + right;
}

public static Tensor operator *(Tensor left, Tensor right) => left.mul(right);
public static Tensor operator *(Tensor left, Scalar right) => left.mul(right);
public static Tensor operator *(Scalar left, Tensor right) => right.mul(left);

public static Tensor operator *(Tensor left, int right) => left.mul(right);
public static Tensor operator *(Tensor left, long right) => left.mul(right);
public static Tensor operator *(Tensor left, float right) => left.mul(right);
public static Tensor operator *(Tensor left, double right) => left.mul(right);

public static Tensor operator *(int left, Tensor right) => right.mul(left);
public static Tensor operator *(long left, Tensor right) => right.mul(left);
public static Tensor operator *(float left, Tensor right) => right.mul(left);
public static Tensor operator *(double left, Tensor right) => right.mul(left);
public static Tensor operator *(Tensor left, int right)
{
using Scalar scalar = right;
return left * scalar;
}
public static Tensor operator *(Tensor left, long right)
{
using Scalar scalar = right;
return left * scalar;
}
public static Tensor operator *(Tensor left, float right)
{
using Scalar scalar = right;
return left * scalar;
}
public static Tensor operator *(Tensor left, double right)
{
using Scalar scalar = right;
return left * scalar;
}

public static Tensor operator *(int left, Tensor right)
{
using Scalar scalar = left;
return scalar * right;
}
public static Tensor operator *(long left, Tensor right)
{
using Scalar scalar = left;
return scalar * right;
}
public static Tensor operator *(float left, Tensor right)
{
using Scalar scalar = left;
return scalar * right;
}
public static Tensor operator *(double left, Tensor right)
{
using Scalar scalar = left;
return scalar * right;
}

public static Tensor operator -(Tensor left, Tensor right) => left.sub(right);
public static Tensor operator -(Tensor left, Scalar right) => left.sub(right);
public static Tensor operator -(Scalar left, Tensor right) => right.negative().add(left);

public static Tensor operator -(Tensor left, int right) => left.sub(right);
public static Tensor operator -(Tensor left, long right) => left.sub(right);
public static Tensor operator -(Tensor left, float right) => left.sub(right);
public static Tensor operator -(Tensor left, double right) => left.sub(right);

public static Tensor operator -(int left, Tensor right) => right.negative().add(left);
public static Tensor operator -(long left, Tensor right) => right.negative().add(left);
public static Tensor operator -(float left, Tensor right) => right.negative().add(left);
public static Tensor operator -(double left, Tensor right) => right.negative().add(left);
public static Tensor operator -(Tensor left, int right)
{
using Scalar scalar = right;
return left - scalar;
}
public static Tensor operator -(Tensor left, long right)
{
using Scalar scalar = right;
return left - scalar;
}
public static Tensor operator -(Tensor left, float right)
{
using Scalar scalar = right;
return left - scalar;
}
public static Tensor operator -(Tensor left, double right)
{
using Scalar scalar = right;
return left - scalar;
}

public static Tensor operator -(int left, Tensor right)
{
using Scalar scalar = left;
return scalar - right;
}
public static Tensor operator -(long left, Tensor right)
{
using Scalar scalar = left;
return scalar - right;
}
public static Tensor operator -(float left, Tensor right)
{
using Scalar scalar = left;
return scalar - right;
}
public static Tensor operator -(double left, Tensor right)
{
using Scalar scalar = left;
return scalar - right;
}

public static Tensor operator /(Tensor left, Tensor right) => left.div(right);
public static Tensor operator /(Tensor left, Scalar right) => left.div(right);
public static Tensor operator /(Scalar left, Tensor right) => right.reciprocal().mul(left);

public static Tensor operator /(Tensor left, int right) => left.div(right);
public static Tensor operator /(Tensor left, long right) => left.div(right);
public static Tensor operator /(Tensor left, float right) => left.div(right);
public static Tensor operator /(Tensor left, double right) => left.div(right);

public static Tensor operator /(int left, Tensor right) => right.reciprocal().mul(left);
public static Tensor operator /(long left, Tensor right) => right.reciprocal().mul(left);
public static Tensor operator /(float left, Tensor right) => right.reciprocal().mul(left);
public static Tensor operator /(double left, Tensor right) => right.reciprocal().mul(left);

public static Tensor operator /(Tensor left, int right)
{
using Scalar scalar = right;
return left / scalar;
}
public static Tensor operator /(Tensor left, long right)
{
using Scalar scalar = right;
return left / scalar;
}
public static Tensor operator /(Tensor left, float right)
{
using Scalar scalar = right;
return left / scalar;
}
public static Tensor operator /(Tensor left, double right)
{
using Scalar scalar = right;
return left / scalar;
}

public static Tensor operator /(int left, Tensor right)
{
using Scalar scalar = left;
return scalar / right;
}
public static Tensor operator /(long left, Tensor right)
{
using Scalar scalar = left;
return scalar / right;
}
public static Tensor operator /(float left, Tensor right)
{
using Scalar scalar = left;
return scalar / right;
}
public static Tensor operator /(double left, Tensor right)
{
using Scalar scalar = left;
return scalar / right;
}

public static Tensor operator %(Tensor left, Tensor right) => left.remainder(right);
public static Tensor operator %(Tensor left, Scalar right) => left.remainder(right);

public static Tensor operator %(Tensor left, int right) => left.remainder(right);
public static Tensor operator %(Tensor left, long right) => left.remainder(right);
public static Tensor operator %(Tensor left, float right) => left.remainder(right);
public static Tensor operator %(Tensor left, double right) => left.remainder(right);
public static Tensor operator %(Tensor left, int right)
{
using Scalar scalar = right;
return left % scalar;
}
public static Tensor operator %(Tensor left, long right)
{
using Scalar scalar = right;
return left % scalar;
}
public static Tensor operator %(Tensor left, float right)
{
using Scalar scalar = right;
return left % scalar;
}
public static Tensor operator %(Tensor left, double right)
{
using Scalar scalar = right;
return left % scalar;
}

public static Tensor operator &(Tensor left, Tensor right) => left.bitwise_and(right);

Expand Down