mirror of
https://github.com/tinygrad/tinygrad.git
synced 2026-08-29 11:56:08 +00:00
xor -> bitwise_xor (#9264)
This commit is contained in:
@@ -65,7 +65,9 @@ Elementwise ops operate on a per element basis. They don't change the shape of t
|
||||
::: tinygrad.Tensor.div
|
||||
::: tinygrad.Tensor.idiv
|
||||
::: tinygrad.Tensor.mod
|
||||
::: tinygrad.Tensor.xor
|
||||
::: tinygrad.Tensor.bitwise_xor
|
||||
::: tinygrad.Tensor.bitwise_and
|
||||
::: tinygrad.Tensor.bitwise_or
|
||||
::: tinygrad.Tensor.lshift
|
||||
::: tinygrad.Tensor.rshift
|
||||
::: tinygrad.Tensor.pow
|
||||
|
||||
+2
-1
@@ -311,6 +311,7 @@ def get_onnx_ops():
|
||||
def Equal(x:Tensor,y:Tensor): return x == y
|
||||
def And(x:Tensor,y:Tensor): return (x==y).where(x, False)
|
||||
def Or(x:Tensor,y:Tensor): return (x==y).where(x, True)
|
||||
def Xor(x:Tensor,y:Tensor): return x.bool().bitwise_xor(y.bool())
|
||||
def BitwiseAnd(x:Tensor,y:Tensor): return x & y
|
||||
def BitwiseOr(x:Tensor,y:Tensor): return x | y
|
||||
def BitwiseXor(x:Tensor,y:Tensor): return x ^ y
|
||||
@@ -799,7 +800,7 @@ def get_onnx_ops():
|
||||
# Tensor ops
|
||||
**{op: getattr(Tensor, op.lower()) for op in ("Neg", "Reciprocal", "Pow", "Sqrt", "Sign", "Abs", "Exp", "Log", "Mish", "Sin", "Cos", "Tan",
|
||||
"Asin", "Acos", "Atan", "Relu", "Sigmoid", "MatMul", "Floor", "Ceil", "IsInf", "IsNaN", "Softplus", "HardSwish", "Where", "Mul", "Sinh", "Cosh",
|
||||
"Tanh", "Softsign", "Asinh", "Acosh", "Atanh", "Elu", "Celu", "Selu", "Xor", "Round", "Erf")},
|
||||
"Tanh", "Softsign", "Asinh", "Acosh", "Atanh", "Elu", "Celu", "Selu", "Round", "Erf")},
|
||||
# Implemented ops
|
||||
**{name:obj for name,obj in locals().items() if isinstance(obj, types.FunctionType) and not name.startswith("_") and name[0].isupper()},
|
||||
# Version ops
|
||||
|
||||
@@ -223,7 +223,7 @@ tiny_backend_out = {**{f"aten.{x}.out":getattr(Tensor,x) for x in simple_tensor_
|
||||
"aten.pow.Scalar_out": lambda x,y: x**y,
|
||||
"aten.bitwise_and.Tensor_out": Tensor.bitwise_and,
|
||||
"aten.bitwise_or.Tensor_out": Tensor.bitwise_or,
|
||||
"aten.bitwise_xor.Tensor_out": lambda x,y: x^y, # TODO: tinygrad lacks bitwise_xor, add it
|
||||
"aten.bitwise_xor.Tensor_out": Tensor.bitwise_xor,
|
||||
"aten.eq.Tensor_out": Tensor.eq, "aten.eq.Scalar_out": Tensor.eq,
|
||||
"aten.ne.Tensor_out": Tensor.ne, "aten.ne.Scalar_out": Tensor.ne,
|
||||
"aten.ge.Tensor_out": Tensor.__ge__, "aten.ge.Scalar_out": Tensor.__ge__,
|
||||
|
||||
Vendored
+1
-1
@@ -16,7 +16,7 @@ def gen_prg(device, inputs_cnt):
|
||||
with Context(DEBUG=0):
|
||||
fst = [Tensor.randn(BUF_LEN, dtype=dtypes.int).realize() for i in range(inputs_cnt)]
|
||||
s = fst[0]
|
||||
for i in range(1, inputs_cnt): s = s.xor(fst[i])
|
||||
for i in range(1, inputs_cnt): s = s.bitwise_xor(fst[i])
|
||||
|
||||
si = s.schedule()[-1]
|
||||
prg = get_runner(device, si.ast)
|
||||
|
||||
@@ -26,7 +26,7 @@ binary_operations = [operator.add, operator.sub, operator.mul, operator.lt, oper
|
||||
if Device.DEFAULT == "LLVM":
|
||||
binary_operations.remove(operator.lt)
|
||||
|
||||
integer_binary_operations = binary_operations + [(Tensor.xor, np.bitwise_xor), (Tensor.bitwise_and, np.bitwise_and),
|
||||
integer_binary_operations = binary_operations + [(Tensor.bitwise_xor, np.bitwise_xor), (Tensor.bitwise_and, np.bitwise_and),
|
||||
(Tensor.bitwise_or, np.bitwise_or)]
|
||||
unary_operations = [(Tensor.exp, np.exp), (Tensor.log, np.log), (Tensor.sin, np.sin),
|
||||
(Tensor.sqrt, np.sqrt), (Tensor.reciprocal, np.reciprocal)]
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@ def helper_exec_op(device, outbuf, inbufs):
|
||||
with Context(DEBUG=0):
|
||||
fst = [Tensor.randn(BUF_SIZE, dtype=dtypes.int).realize() for i in range(len(inbufs))]
|
||||
s = fst[0]
|
||||
for i in range(1, len(inbufs)): s = s.xor(fst[i])
|
||||
for i in range(1, len(inbufs)): s = s.bitwise_xor(fst[i])
|
||||
|
||||
si = s.schedule()[-1]
|
||||
prg = get_runner(device, si.ast)
|
||||
|
||||
+1
-1
@@ -695,7 +695,7 @@ class TestOps(unittest.TestCase):
|
||||
helper_test_op([], lambda: tor^0x1337, lambda: ten^0x1337, forward_only=True)
|
||||
helper_test_op([], lambda: 0x1337^tor, lambda: 0x1337^ten, forward_only=True)
|
||||
|
||||
self.helper_test_exception([(4), (4)], torch.bitwise_xor, Tensor.xor, expected=RuntimeError)
|
||||
self.helper_test_exception([(4), (4)], torch.bitwise_xor, Tensor.bitwise_xor, expected=RuntimeError)
|
||||
|
||||
def test_and(self):
|
||||
data = [[1,-8,1],[32,1,6]]
|
||||
|
||||
+3
-3
@@ -32,7 +32,7 @@ class SimpleMathTrait:
|
||||
def mul(self, x, reverse=False): return self._binop(Ops.MUL, x, reverse)
|
||||
def bitwise_and(self, x, reverse=False): return self._binop(Ops.AND, x, reverse)
|
||||
def bitwise_or(self, x, reverse=False): return self._binop(Ops.OR, x, reverse)
|
||||
def xor(self, x, reverse=False): return self._binop(Ops.XOR, x, reverse)
|
||||
def bitwise_xor(self, x, reverse=False): return self._binop(Ops.XOR, x, reverse)
|
||||
def idiv(self, x, reverse=False): return self._binop(Ops.IDIV, x, reverse)
|
||||
def mod(self, x, reverse=False): return self._binop(Ops.MOD, x, reverse)
|
||||
def sub(self, x, reverse=False): return self.ufix(x).alu(Ops.ADD, -self) if reverse else self.alu(Ops.ADD, self.ufix(-x))
|
||||
@@ -48,7 +48,7 @@ class SimpleMathTrait:
|
||||
def __mod__(self, x): return self.mod(x)
|
||||
def __and__(self, x): return self.bitwise_and(x)
|
||||
def __or__(self, x): return self.bitwise_or(x)
|
||||
def __xor__(self, x): return self.xor(x)
|
||||
def __xor__(self, x): return self.bitwise_xor(x)
|
||||
|
||||
def __radd__(self, x): return self.add(x, True)
|
||||
def __rsub__(self, x): return self.sub(x, True)
|
||||
@@ -57,7 +57,7 @@ class SimpleMathTrait:
|
||||
def __rfloordiv__(self, x): return self.idiv(x, True)
|
||||
def __rand__(self, x): return self.bitwise_and(x, True)
|
||||
def __ror__(self, x): return self.bitwise_or(x, True)
|
||||
def __rxor__(self, x): return self.xor(x, True)
|
||||
def __rxor__(self, x): return self.bitwise_xor(x, True)
|
||||
def __rmod__(self, x): return self.mod(x, True)
|
||||
|
||||
def __lt__(self, x): return self.alu(Ops.CMPLT, self.ufix(x))
|
||||
|
||||
+8
-8
@@ -3269,25 +3269,25 @@ class Tensor(SimpleMathTrait):
|
||||
a, b = self._broadcasted(x, reverse)
|
||||
return (r := a._apply_uop(UOp.mod, b)) + b * (((r < 0) & (b > 0)) | ((r > 0) & (b < 0)))
|
||||
|
||||
def xor(self, x:Union[Tensor, ConstType], reverse=False) -> Tensor:
|
||||
def bitwise_xor(self, x:Union[Tensor, ConstType], reverse=False) -> Tensor:
|
||||
"""
|
||||
Computes bitwise xor of `self` and `x`.
|
||||
Equivalent to `self ^ x`.
|
||||
Supports broadcasting to a common shape, type promotion, and integer, boolean inputs.
|
||||
|
||||
```python exec="true" source="above" session="tensor" result="python"
|
||||
print(Tensor([-1, -2, 3]).xor(Tensor([1, 0, 3])).numpy())
|
||||
print(Tensor([-1, -2, 3]).bitwise_xor(Tensor([1, 0, 3])).numpy())
|
||||
```
|
||||
```python exec="true" source="above" session="tensor" result="python"
|
||||
print(Tensor([True, True, False, False]).xor(Tensor([True, False, True, False])).numpy())
|
||||
print(Tensor([True, True, False, False]).bitwise_xor(Tensor([True, False, True, False])).numpy())
|
||||
```
|
||||
"""
|
||||
if self.dtype != dtypes.bool and not dtypes.is_int(self.dtype): raise RuntimeError(f"{self.dtype} is not supported")
|
||||
return self._apply_broadcasted_uop(UOp.xor, x, reverse)
|
||||
return self._apply_broadcasted_uop(UOp.bitwise_xor, x, reverse)
|
||||
|
||||
def bitwise_and(self, x:Union[Tensor, ConstType], reverse=False) -> Tensor:
|
||||
"""
|
||||
Compute the bit-wise AND of `self` and `x`.
|
||||
Compute the bitwise AND of `self` and `x`.
|
||||
Equivalent to `self & x`.
|
||||
Supports broadcasting to a common shape, type promotion, and integer, boolean inputs.
|
||||
```python exec="true" source="above" session="tensor" result="python"
|
||||
@@ -3302,7 +3302,7 @@ class Tensor(SimpleMathTrait):
|
||||
|
||||
def bitwise_or(self, x:Union[Tensor, ConstType], reverse=False) -> Tensor:
|
||||
"""
|
||||
Compute the bit-wise OR of `self` and `x`.
|
||||
Compute the bitwise OR of `self` and `x`.
|
||||
Equivalent to `self | x`.
|
||||
Supports broadcasting to a common shape, type promotion, and integer, boolean inputs.
|
||||
```python exec="true" source="above" session="tensor" result="python"
|
||||
@@ -3317,7 +3317,7 @@ class Tensor(SimpleMathTrait):
|
||||
|
||||
def bitwise_not(self) -> Tensor:
|
||||
"""
|
||||
Compute the bit-wise NOT of `self`.
|
||||
Compute the bitwise NOT of `self`.
|
||||
Equivalent to `~self`.
|
||||
```python exec="true" source="above" session="tensor" result="python"
|
||||
print(Tensor([0, 2, 5, 255], dtype="int8").bitwise_not().numpy())
|
||||
@@ -3451,7 +3451,7 @@ class Tensor(SimpleMathTrait):
|
||||
def __imatmul__(self, x) -> Tensor: return self.assign(self.matmul(x))
|
||||
def __iand__(self, x) -> Tensor: return self.assign(self.bitwise_and(x))
|
||||
def __ior__(self, x) -> Tensor: return self.assign(self.bitwise_or(x))
|
||||
def __ixor__(self, x) -> Tensor: return self.assign(self.xor(x))
|
||||
def __ixor__(self, x) -> Tensor: return self.assign(self.bitwise_xor(x))
|
||||
def __ilshift__(self, x) -> Tensor: return self.assign(self.lshift(x))
|
||||
def __irshift__(self, x) -> Tensor: return self.assign(self.rshift(x))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user