logic.py 33.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#   Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

15 16
# TODO: define logic functions of a tensor

17
import paddle
18

19
from ..fluid.data_feeder import check_type, check_variable_and_dtype
20
from ..fluid.framework import _in_eager_mode_
21 22
from ..static import Variable
from .layer_function_generator import templatedoc
23

24 25
if _in_eager_mode_:
    Tensor = paddle.fluid.framework.core.eager.Tensor
W
Weilong Wu 已提交
26 27
else:
    from ..framework import VarBase as Tensor
28

29
from paddle import _C_ops, _legacy_C_ops
30
from paddle.tensor.creation import full
31

32 33 34
from ..fluid.framework import _in_legacy_dygraph
from ..framework import LayerHelper, in_dygraph_mode

35 36
__all__ = []

37

38
def _logical_op(op_name, x, y, out=None, name=None, binary_op=True):
39
    if in_dygraph_mode():
40 41 42 43 44
        op = getattr(_C_ops, op_name)
        if binary_op:
            return op(x, y)
        else:
            return op(x)
45 46 47 48 49 50
    elif _in_legacy_dygraph():
        op = getattr(_legacy_C_ops, op_name)
        if binary_op:
            return op(x, y)
        else:
            return op(x)
51
    check_variable_and_dtype(
52 53
        x,
        "x",
54
        ["bool", "int8", "int16", "int32", "int64", "float32", "float64"],
55 56
        op_name,
    )
57
    if y is not None:
58
        check_variable_and_dtype(
59 60
            y,
            "y",
61
            ["bool", "int8", "int16", "int32", "int64", "float32", "float64"],
62 63
            op_name,
        )
64 65 66 67 68 69 70 71
    if out is not None:
        check_type(out, "out", Variable, op_name)

    helper = LayerHelper(op_name, **locals())

    if binary_op and x.dtype != y.dtype:
        raise ValueError(
            "(InvalidArgument) The DataType of %s Op's Variable must be consistent, but received %s and %s."
72 73
            % (op_name, x.dtype, y.dtype)
        )
74 75 76 77 78

    if out is None:
        out = helper.create_variable_for_type_inference(dtype=x.dtype)

    if binary_op:
79 80 81
        helper.append_op(
            type=op_name, inputs={"X": x, "Y": y}, outputs={"Out": out}
        )
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
    else:
        helper.append_op(type=op_name, inputs={"X": x}, outputs={"Out": out})

    return out


def logical_and(x, y, out=None, name=None):
    r"""

    ``logical_and`` operator computes element-wise logical AND on ``x`` and ``y``, and returns ``out``. ``out`` is N-dim boolean ``Tensor``.
    Each element of ``out`` is calculated by

    .. math::

        out = x \&\& y

98
    Note:
I
Infinity_lee 已提交
99 100 101
        ``paddle.logical_and`` supports broadcasting. If you want know more about broadcasting, please refer to `Introduction to Tensor`_ .

        .. _Introduction to Tensor: ../../guides/beginner/tensor_en.html#chapter5-broadcasting-of-tensor
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

    Args:
        x (Tensor): the input tensor, it's data type should be one of bool, int8, int16, in32, in64, float32, float64.
        y (Tensor): the input tensor, it's data type should be one of bool, int8, int16, in32, in64, float32, float64.
        out(Tensor): The ``Tensor`` that specifies the output of the operator, which can be any ``Tensor`` that has been created in the program. The default value is None, and a new ``Tensor`` will be created to save the output.
        name (str, optional): Name for the operation (optional, default is None). For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        N-D Tensor. A location into which the result is stored. It's dimension equals with ``x``.

    Examples:
        .. code-block:: python

            import paddle

            x = paddle.to_tensor([True])
            y = paddle.to_tensor([True, False, True, False])
            res = paddle.logical_and(x, y)
            print(res) # [True False True False]
    """
    if in_dygraph_mode():
123
        return _C_ops.logical_and(x, y)
124

125 126 127
    return _logical_op(
        op_name="logical_and", x=x, y=y, name=name, out=out, binary_op=True
    )
128 129 130 131 132 133 134 135 136 137 138 139


def logical_or(x, y, out=None, name=None):
    """

    ``logical_or`` operator computes element-wise logical OR on ``x`` and ``y``, and returns ``out``. ``out`` is N-dim boolean ``Tensor``.
    Each element of ``out`` is calculated by

    .. math::

        out = x || y

140
    Note:
I
Infinity_lee 已提交
141 142 143
        ``paddle.logical_or`` supports broadcasting. If you want know more about broadcasting, please refer to `Introduction to Tensor`_ .

        .. _Introduction to Tensor: ../../guides/beginner/tensor_en.html#chapter5-broadcasting-of-tensor
144

145 146 147 148 149 150 151 152 153 154 155 156 157 158
    Args:
        x (Tensor): the input tensor, it's data type should be one of bool, int8, int16, in32, in64, float32, float64.
        y (Tensor): the input tensor, it's data type should be one of bool, int8, int16, in32, in64, float32, float64.
        out(Tensor): The ``Variable`` that specifies the output of the operator, which can be any ``Tensor`` that has been created in the program. The default value is None, and a new ``Tensor`` will be created to save the output.
        name (str, optional): Name for the operation (optional, default is None). For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        N-D Tensor. A location into which the result is stored. It's dimension equals with ``x``.

    Examples:
        .. code-block:: python

            import paddle

159 160
            x = paddle.to_tensor([True, False], dtype="bool").reshape([2, 1])
            y = paddle.to_tensor([True, False, True, False], dtype="bool").reshape([2, 2])
161
            res = paddle.logical_or(x, y)
162 163 164 165
            print(res)
            # Tensor(shape=[2, 2], dtype=bool, place=Place(cpu), stop_gradient=True,
            #        [[True , True ],
            #         [True , False]])
166 167
    """
    if in_dygraph_mode():
168
        return _C_ops.logical_or(x, y)
169 170 171
    return _logical_op(
        op_name="logical_or", x=x, y=y, name=name, out=out, binary_op=True
    )
172 173 174 175 176 177 178 179 180 181 182 183


def logical_xor(x, y, out=None, name=None):
    r"""

    ``logical_xor`` operator computes element-wise logical XOR on ``x`` and ``y``, and returns ``out``. ``out`` is N-dim boolean ``Tensor``.
    Each element of ``out`` is calculated by

    .. math::

        out = (x || y) \&\& !(x \&\& y)

184
    Note:
I
Infinity_lee 已提交
185 186 187
        ``paddle.logical_xor`` supports broadcasting. If you want know more about broadcasting, please refer to `Introduction to Tensor`_ .

        .. _Introduction to Tensor: ../../guides/beginner/tensor_en.html#chapter5-broadcasting-of-tensor
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202

    Args:
        x (Tensor): the input tensor, it's data type should be one of bool, int8, int16, in32, in64, float32, float64.
        y (Tensor): the input tensor, it's data type should be one of bool, int8, int16, in32, in64, float32, float64.
        out(Tensor): The ``Tensor`` that specifies the output of the operator, which can be any ``Tensor`` that has been created in the program. The default value is None, and a new ``Tensor`` will be created to save the output.
        name (str, optional): Name for the operation (optional, default is None). For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        N-D Tensor. A location into which the result is stored. It's dimension equals with ``x``.

    Examples:
        .. code-block:: python

            import paddle

203 204
            x = paddle.to_tensor([True, False], dtype="bool").reshape([2, 1])
            y = paddle.to_tensor([True, False, True, False], dtype="bool").reshape([2, 2])
205
            res = paddle.logical_xor(x, y)
206 207 208 209
            print(res)
            # Tensor(shape=[2, 2], dtype=bool, place=Place(cpu), stop_gradient=True,
            #        [[False, True ],
            #         [True , False]])
210 211
    """
    if in_dygraph_mode():
212
        return _C_ops.logical_xor(x, y)
213

214 215 216
    return _logical_op(
        op_name="logical_xor", x=x, y=y, name=name, out=out, binary_op=True
    )
217 218 219 220 221 222 223 224 225 226 227 228 229


@templatedoc()
def logical_not(x, out=None, name=None):
    """

    ``logical_not`` operator computes element-wise logical NOT on ``x``, and returns ``out``. ``out`` is N-dim boolean ``Variable``.
    Each element of ``out`` is calculated by

    .. math::

        out = !x

I
Infinity_lee 已提交
230 231 232 233 234
    Note:
        ``paddle.logical_not`` supports broadcasting. If you want know more about broadcasting, please refer to `Introduction to Tensor`_ .

        .. _Introduction to Tensor: ../../guides/beginner/tensor_en.html#chapter5-broadcasting-of-tensor

235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
    Args:
        x(Tensor):  Operand of logical_not operator. Must be a Tensor of type bool, int8, int16, in32, in64, float32, or float64.
        out(Tensor): The ``Tensor`` that specifies the output of the operator, which can be any ``Tensor`` that has been created in the program. The default value is None, and a new ``Tensor` will be created to save the output.
        name(str|None): The default value is None. Normally there is no need for users to set this property. For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        Tensor: ${out_comment}

    Examples:
        .. code-block:: python

            import paddle

            x = paddle.to_tensor([True, False, True, False])
            res = paddle.logical_not(x)
            print(res) # [False  True False  True]
    """
    if in_dygraph_mode():
253
        return _C_ops.logical_not(x)
254 255 256
    return _logical_op(
        op_name="logical_not", x=x, y=None, name=name, out=out, binary_op=False
    )
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290


def is_empty(x, name=None):
    """

    Test whether a Tensor is empty.

    Args:
        x (Tensor): The Tensor to be tested.
        name (str, optional): The default value is ``None`` . Normally users
                            don't have to set this parameter. For more information,
                            please refer to :ref:`api_guide_Name` .

    Returns:
        Tensor: A bool scalar Tensor. True if 'x' is an empty Tensor.

    Examples:
        .. code-block:: python

            import paddle

            input = paddle.rand(shape=[4, 32, 32], dtype='float32')
            res = paddle.is_empty(x=input)
            print("res:", res)
            # ('res:', Tensor: eager_tmp_1
            #    - place: CPUPlace
            #    - shape: [1]
            #    - layout: NCHW
            #    - dtype: bool
            #    - data: [0])

    """
    if in_dygraph_mode():
        return _C_ops.is_empty(x)
291 292
    if _in_legacy_dygraph():
        return _legacy_C_ops.is_empty(x)
293

294 295 296
    check_variable_and_dtype(
        x, 'x', ['float32', 'float64', 'int32', 'int64'], 'is_empty'
    )
297 298 299 300 301
    check_type(name, "name", (str, type(None)), "is_empty")

    helper = LayerHelper("is_empty", **locals())
    cond = helper.create_variable_for_type_inference(dtype='bool')
    cond.stop_gradient = True
302 303 304
    helper.append_op(
        type='is_empty', inputs={'X': [x]}, outputs={'Out': [cond]}
    )
305 306 307
    return cond


W
wawltor 已提交
308
def equal_all(x, y, name=None):
309
    """
310
    Returns the truth value of :math:`x == y`. True if two inputs have the same elements, False otherwise.
311

312
    Note:
313
        The output has no gradient.
314 315

    Args:
316 317
        x(Tensor): Tensor, data type is bool, float32, float64, int32, int64.
        y(Tensor): Tensor, data type is bool, float32, float64, int32, int64.
W
wawltor 已提交
318 319
        name(str, optional): The default value is None.  Normally there is no need for
            user to set this property.  For more information, please refer to :ref:`api_guide_Name`.
320 321

    Returns:
W
wawltor 已提交
322
        Tensor: output Tensor, data type is bool, value is [False] or [True].
323 324 325 326 327

    Examples:
        .. code-block:: python

          import paddle
W
wawltor 已提交
328

329 330 331
          x = paddle.to_tensor([1, 2, 3])
          y = paddle.to_tensor([1, 2, 3])
          z = paddle.to_tensor([1, 4, 3])
W
wawltor 已提交
332
          result1 = paddle.equal_all(x, y)
N
Noel 已提交
333
          print(result1) # result1 = [True ]
W
wawltor 已提交
334
          result2 = paddle.equal_all(x, z)
N
Noel 已提交
335
          print(result2) # result2 = [False ]
336
    """
H
hong 已提交
337
    if in_dygraph_mode():
338
        return _C_ops.equal_all(x, y)
H
hong 已提交
339

Z
zhiboniu 已提交
340
    if paddle.in_dynamic_mode():
341
        return _legacy_C_ops.equal_all(x, y)
W
wawltor 已提交
342 343

    helper = LayerHelper("equal_all", **locals())
344
    out = helper.create_variable_for_type_inference(dtype='bool')
345 346 347
    helper.append_op(
        type='equal_all', inputs={'X': [x], 'Y': [y]}, outputs={'Out': [out]}
    )
348
    return out
Z
Zhen Wang 已提交
349 350 351


@templatedoc()
352
def allclose(x, y, rtol=1e-05, atol=1e-08, equal_nan=False, name=None):
Z
Zhen Wang 已提交
353 354 355 356
    """
    ${comment}

    Args:
357 358
        x(Tensor): ${input_comment}.
        y(Tensor): ${other_comment}.
H
huangxu96 已提交
359 360
        rtol(rtoltype, optional): The relative tolerance. Default: :math:`1e-5` .
        atol(atoltype, optional): The absolute tolerance. Default: :math:`1e-8` .
361 362 363
        equal_nan(equalnantype, optional): ${equal_nan_comment}.
        name (str, optional): Name for the operation. For more information, please
            refer to :ref:`api_guide_Name`. Default: None.
Z
Zhen Wang 已提交
364 365

    Returns:
366 367
        Tensor: ${out_comment}.

Z
Zhen Wang 已提交
368 369 370 371 372
    Examples:
        .. code-block:: python

          import paddle

373 374
          x = paddle.to_tensor([10000., 1e-07])
          y = paddle.to_tensor([10000.1, 1e-08])
375
          result1 = paddle.allclose(x, y, rtol=1e-05, atol=1e-08,
Z
Zhen Wang 已提交
376
                                  equal_nan=False, name="ignore_nan")
377
          # [False]
378

379
          result2 = paddle.allclose(x, y, rtol=1e-05, atol=1e-08,
Z
Zhen Wang 已提交
380
                                      equal_nan=True, name="equal_nan")
381 382
          # [False]

383 384
          x = paddle.to_tensor([1.0, float('nan')])
          y = paddle.to_tensor([1.0, float('nan')])
385 386 387
          result1 = paddle.allclose(x, y, rtol=1e-05, atol=1e-08,
                                  equal_nan=False, name="ignore_nan")
          # [False]
388

389 390 391
          result2 = paddle.allclose(x, y, rtol=1e-05, atol=1e-08,
                                      equal_nan=True, name="equal_nan")
          # [True]
Z
Zhen Wang 已提交
392 393
    """

394
    if in_dygraph_mode():
395
        return _C_ops.allclose(x, y, rtol, atol, equal_nan)
396
    if _in_legacy_dygraph():
397 398 399
        return _legacy_C_ops.allclose(
            x, y, 'rtol', str(rtol), 'atol', str(atol), 'equal_nan', equal_nan
        )
400 401
    check_variable_and_dtype(x, "input", ['float32', 'float64'], 'allclose')
    check_variable_and_dtype(y, "input", ['float32', 'float64'], 'allclose')
Z
Zhen Wang 已提交
402 403 404 405 406 407 408
    check_type(rtol, 'rtol', float, 'allclose')
    check_type(atol, 'atol', float, 'allclose')
    check_type(equal_nan, 'equal_nan', bool, 'allclose')

    helper = LayerHelper("allclose", **locals())
    out = helper.create_variable_for_type_inference(dtype='bool')

409
    inputs = {'Input': x, 'Other': y}
Z
Zhen Wang 已提交
410
    outputs = {'Out': out}
411
    attrs = {'rtol': str(rtol), 'atol': str(atol), 'equal_nan': equal_nan}
412 413 414
    helper.append_op(
        type='allclose', inputs=inputs, outputs=outputs, attrs=attrs
    )
Z
Zhen Wang 已提交
415 416

    return out
417 418


W
wawltor 已提交
419 420
@templatedoc()
def equal(x, y, name=None):
421
    """
S
swtkiwi 已提交
422

423
    This layer returns the truth value of :math:`x == y` elementwise.
N
Noel 已提交
424

425
    Note:
426
        The output has no gradient.
427 428

    Args:
429 430
        x(Tensor): Tensor, data type is bool, float32, float64, int32, int64.
        y(Tensor): Tensor, data type is bool, float32, float64, int32, int64.
431 432 433 434
        name(str, optional): The default value is None.  Normally there is no need for
            user to set this property.  For more information, please refer to :ref:`api_guide_Name`.

    Returns:
W
wawltor 已提交
435
        Tensor: output Tensor, it's shape is the same as the input's Tensor,
436
        and the data type is bool. The result of this op is stop_gradient.
437 438 439 440

    Examples:
        .. code-block:: python

W
wawltor 已提交
441 442
          import paddle

443 444
          x = paddle.to_tensor([1, 2, 3])
          y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
445
          result1 = paddle.equal(x, y)
N
Noel 已提交
446
          print(result1)  # result1 = [True False False]
447
    """
448 449
    if not isinstance(y, (int, bool, float, Variable)):
        raise TypeError(
450 451 452 453
            "Type of input args must be float, bool, int or Tensor, but received type {}".format(
                type(y)
            )
        )
454 455 456
    if not isinstance(y, Variable):
        y = full(shape=[1], dtype=x.dtype, fill_value=y)

J
Jiabin Yang 已提交
457
    if in_dygraph_mode():
458
        return _C_ops.equal(x, y)
J
Jiabin Yang 已提交
459 460
    else:
        if _in_legacy_dygraph():
461
            return _legacy_C_ops.equal(x, y)
J
Jiabin Yang 已提交
462 463
        else:
            check_variable_and_dtype(
464 465 466 467 468
                x,
                "x",
                ["bool", "float32", "float64", "int32", "int64"],
                "equal",
            )
J
Jiabin Yang 已提交
469
            check_variable_and_dtype(
470 471 472 473 474
                y,
                "y",
                ["bool", "float32", "float64", "int32", "int64"],
                "equal",
            )
J
Jiabin Yang 已提交
475 476 477 478
            helper = LayerHelper("equal", **locals())
            out = helper.create_variable_for_type_inference(dtype='bool')
            out.stop_gradient = True

479 480 481 482 483
            helper.append_op(
                type='equal',
                inputs={'X': [x], 'Y': [y]},
                outputs={'Out': [out]},
            )
J
Jiabin Yang 已提交
484
            return out
485

W
wawltor 已提交
486 487 488 489

@templatedoc()
def greater_equal(x, y, name=None):
    """
490
    Returns the truth value of :math:`x >= y` elementwise, which is equivalent function to the overloaded operator `>=`.
N
Noel 已提交
491

492
    Note:
493
        The output has no gradient.
W
wawltor 已提交
494 495

    Args:
496 497
        x(Tensor): First input to compare which is N-D tensor. The input data type should be bool, float32, float64, int32, int64.
        y(Tensor): Second input to compare which is N-D tensor. The input data type should be bool, float32, float64, int32, int64.
W
wawltor 已提交
498 499 500
        name(str, optional): The default value is None.  Normally there is no need for
            user to set this property.  For more information, please refer to :ref:`api_guide_Name`.
    Returns:
501
        Tensor: The output shape is same as input :attr:`x`. The output data type is bool.
W
wawltor 已提交
502 503 504

    Examples:
        .. code-block:: python
N
Noel 已提交
505

W
wawltor 已提交
506 507
            import paddle

508 509
            x = paddle.to_tensor([1, 2, 3])
            y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
510
            result1 = paddle.greater_equal(x, y)
N
Noel 已提交
511
            print(result1)  # result1 = [True False True]
W
wawltor 已提交
512
    """
J
Jiabin Yang 已提交
513
    if in_dygraph_mode():
514
        return _C_ops.greater_equal(x, y)
J
Jiabin Yang 已提交
515 516
    else:
        if _in_legacy_dygraph():
517
            return _legacy_C_ops.greater_equal(x, y)
J
Jiabin Yang 已提交
518 519
        else:
            check_variable_and_dtype(
520 521 522 523 524
                x,
                "x",
                ["bool", "float32", "float64", "int32", "int64"],
                "greater_equal",
            )
J
Jiabin Yang 已提交
525
            check_variable_and_dtype(
526 527 528 529 530
                y,
                "y",
                ["bool", "float32", "float64", "int32", "int64"],
                "greater_equal",
            )
J
Jiabin Yang 已提交
531 532 533 534
            helper = LayerHelper("greater_equal", **locals())
            out = helper.create_variable_for_type_inference(dtype='bool')
            out.stop_gradient = True

535 536 537 538 539
            helper.append_op(
                type='greater_equal',
                inputs={'X': [x], 'Y': [y]},
                outputs={'Out': [out]},
            )
J
Jiabin Yang 已提交
540
            return out
W
wawltor 已提交
541 542 543 544 545


@templatedoc()
def greater_than(x, y, name=None):
    """
546
    Returns the truth value of :math:`x > y` elementwise, which is equivalent function to the overloaded operator `>`.
N
Noel 已提交
547

548
    Note:
549
        The output has no gradient.
W
wawltor 已提交
550 551

    Args:
552 553
        x(Tensor): First input to compare which is N-D tensor. The input data type should be bool, float32, float64, int32, int64.
        y(Tensor): Second input to compare which is N-D tensor. The input data type should be bool, float32, float64, int32, int64.
W
wawltor 已提交
554 555 556
        name(str, optional): The default value is None.  Normally there is no need for
            user to set this property.  For more information, please refer to :ref:`api_guide_Name`.
    Returns:
557
        Tensor: The output shape is same as input :attr:`x`. The output data type is bool.
W
wawltor 已提交
558 559 560

    Examples:
        .. code-block:: python
N
Noel 已提交
561

W
wawltor 已提交
562 563
            import paddle

564 565
            x = paddle.to_tensor([1, 2, 3])
            y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
566
            result1 = paddle.greater_than(x, y)
N
Noel 已提交
567
            print(result1)  # result1 = [False False True]
W
wawltor 已提交
568
    """
J
Jiabin Yang 已提交
569
    if in_dygraph_mode():
570
        return _C_ops.greater_than(x, y)
J
Jiabin Yang 已提交
571 572
    else:
        if _in_legacy_dygraph():
573
            return _legacy_C_ops.greater_than(x, y)
J
Jiabin Yang 已提交
574 575
        else:
            check_variable_and_dtype(
576 577 578 579 580
                x,
                "x",
                ["bool", "float32", "float64", "int32", "int64"],
                "greater_than",
            )
J
Jiabin Yang 已提交
581
            check_variable_and_dtype(
582 583 584 585 586
                y,
                "y",
                ["bool", "float32", "float64", "int32", "int64"],
                "greater_than",
            )
J
Jiabin Yang 已提交
587 588 589 590
            helper = LayerHelper("greater_than", **locals())
            out = helper.create_variable_for_type_inference(dtype='bool')
            out.stop_gradient = True

591 592 593 594 595
            helper.append_op(
                type='greater_than',
                inputs={'X': [x], 'Y': [y]},
                outputs={'Out': [out]},
            )
J
Jiabin Yang 已提交
596
            return out
W
wawltor 已提交
597 598 599 600 601


@templatedoc()
def less_equal(x, y, name=None):
    """
602
    Returns the truth value of :math:`x <= y` elementwise, which is equivalent function to the overloaded operator `<=`.
N
Noel 已提交
603

604
    Note:
605
        The output has no gradient.
W
wawltor 已提交
606 607

    Args:
608 609
        x(Tensor): First input to compare which is N-D tensor. The input data type should be bool, float32, float64, int32, int64.
        y(Tensor): Second input to compare which is N-D tensor. The input data type should be bool, float32, float64, int32, int64.
W
wawltor 已提交
610 611 612 613
        name(str, optional): The default value is None.  Normally there is no need for
            user to set this property.  For more information, please refer to :ref:`api_guide_Name`.

    Returns:
614
        Tensor: The output shape is same as input :attr:`x`. The output data type is bool.
W
wawltor 已提交
615 616 617

    Examples:
        .. code-block:: python
N
Noel 已提交
618

W
wawltor 已提交
619 620
            import paddle

621 622
            x = paddle.to_tensor([1, 2, 3])
            y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
623
            result1 = paddle.less_equal(x, y)
N
Noel 已提交
624
            print(result1)  # result1 = [True True False]
W
wawltor 已提交
625
    """
J
Jiabin Yang 已提交
626
    if in_dygraph_mode():
627
        return _C_ops.less_equal(x, y)
J
Jiabin Yang 已提交
628 629
    else:
        if _in_legacy_dygraph():
630
            return _legacy_C_ops.less_equal(x, y)
J
Jiabin Yang 已提交
631 632
        else:
            check_variable_and_dtype(
633 634 635 636 637
                x,
                "x",
                ["bool", "float32", "float64", "int32", "int64"],
                "less_equal",
            )
J
Jiabin Yang 已提交
638
            check_variable_and_dtype(
639 640 641 642 643
                y,
                "y",
                ["bool", "float32", "float64", "int32", "int64"],
                "less_equal",
            )
J
Jiabin Yang 已提交
644 645 646 647
            helper = LayerHelper("less_equal", **locals())
            out = helper.create_variable_for_type_inference(dtype='bool')
            out.stop_gradient = True

648 649 650 651 652
            helper.append_op(
                type='less_equal',
                inputs={'X': [x], 'Y': [y]},
                outputs={'Out': [out]},
            )
J
Jiabin Yang 已提交
653
            return out
W
wawltor 已提交
654 655 656 657 658


@templatedoc()
def less_than(x, y, name=None):
    """
659
    Returns the truth value of :math:`x < y` elementwise, which is equivalent function to the overloaded operator `<`.
N
Noel 已提交
660

661
    Note:
662
        The output has no gradient.
W
wawltor 已提交
663 664

    Args:
665 666
        x(Tensor): First input to compare which is N-D tensor. The input data type should be bool, float32, float64, int32, int64.
        y(Tensor): Second input to compare which is N-D tensor. The input data type should be bool, float32, float64, int32, int64.
W
wawltor 已提交
667 668 669 670
        name(str, optional): The default value is None.  Normally there is no need for
            user to set this property.  For more information, please refer to :ref:`api_guide_Name`.

    Returns:
671
        Tensor: The output shape is same as input :attr:`x`. The output data type is bool.
W
wawltor 已提交
672 673 674

    Examples:
        .. code-block:: python
N
Noel 已提交
675

W
wawltor 已提交
676 677
            import paddle

678 679
            x = paddle.to_tensor([1, 2, 3])
            y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
680
            result1 = paddle.less_than(x, y)
N
Noel 已提交
681
            print(result1)  # result1 = [False True False]
W
wawltor 已提交
682
    """
J
Jiabin Yang 已提交
683
    if in_dygraph_mode():
684
        return _C_ops.less_than(x, y)
J
Jiabin Yang 已提交
685 686
    else:
        if _in_legacy_dygraph():
687
            return _legacy_C_ops.less_than(x, y)
J
Jiabin Yang 已提交
688 689
        else:
            check_variable_and_dtype(
690 691 692 693 694
                x,
                "x",
                ["bool", "float32", "float64", "int32", "int64"],
                "less_than",
            )
J
Jiabin Yang 已提交
695
            check_variable_and_dtype(
696 697 698 699 700
                y,
                "y",
                ["bool", "float32", "float64", "int32", "int64"],
                "less_than",
            )
J
Jiabin Yang 已提交
701 702 703 704
            helper = LayerHelper("less_than", **locals())
            out = helper.create_variable_for_type_inference(dtype='bool')
            out.stop_gradient = True

705 706 707 708 709
            helper.append_op(
                type='less_than',
                inputs={'X': [x], 'Y': [y]},
                outputs={'Out': [out]},
            )
J
Jiabin Yang 已提交
710
            return out
W
wawltor 已提交
711 712 713 714 715


@templatedoc()
def not_equal(x, y, name=None):
    """
716
    Returns the truth value of :math:`x != y` elementwise, which is equivalent function to the overloaded operator `!=`.
717 718

    Note:
719
        The output has no gradient.
W
wawltor 已提交
720 721

    Args:
722 723
        x(Tensor): First input to compare which is N-D tensor. The input data type should be bool, float32, float64, int32, int64.
        y(Tensor): Second input to compare which is N-D tensor. The input data type should be bool, float32, float64, int32, int64.
W
wawltor 已提交
724 725 726 727
        name(str, optional): The default value is None.  Normally there is no need for
            user to set this property.  For more information, please refer to :ref:`api_guide_Name`.

    Returns:
728
        Tensor: The output shape is same as input :attr:`x`. The output data type is bool.
W
wawltor 已提交
729 730 731

    Examples:
        .. code-block:: python
732

W
wawltor 已提交
733 734
            import paddle

735 736
            x = paddle.to_tensor([1, 2, 3])
            y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
737
            result1 = paddle.not_equal(x, y)
N
Noel 已提交
738
            print(result1)  # result1 = [False True True]
W
wawltor 已提交
739
    """
J
Jiabin Yang 已提交
740
    if in_dygraph_mode():
741
        return _C_ops.not_equal(x, y)
J
Jiabin Yang 已提交
742 743
    else:
        if _in_legacy_dygraph():
744
            return _legacy_C_ops.not_equal(x, y)
J
Jiabin Yang 已提交
745 746
        else:
            check_variable_and_dtype(
747 748 749 750 751
                x,
                "x",
                ["bool", "float32", "float64", "int32", "int64"],
                "not_equal",
            )
J
Jiabin Yang 已提交
752
            check_variable_and_dtype(
753 754 755 756 757
                y,
                "y",
                ["bool", "float32", "float64", "int32", "int64"],
                "not_equal",
            )
J
Jiabin Yang 已提交
758 759 760 761
            helper = LayerHelper("not_equal", **locals())
            out = helper.create_variable_for_type_inference(dtype='bool')
            out.stop_gradient = True

762 763 764 765 766
            helper.append_op(
                type='not_equal',
                inputs={'X': [x], 'Y': [y]},
                outputs={'Out': [out]},
            )
J
Jiabin Yang 已提交
767
            return out
Z
zhulei 已提交
768 769 770 771 772


def is_tensor(x):
    """

C
Chen Long 已提交
773
    Tests whether input object is a paddle.Tensor.
Z
zhulei 已提交
774 775 776 777 778

    Args:
        x (object): Object to test.

    Returns:
C
Chen Long 已提交
779
        A boolean value. True if ``x`` is a paddle.Tensor, otherwise False.
Z
zhulei 已提交
780 781 782 783 784 785 786 787 788 789 790 791 792

    Examples:
        .. code-block:: python

            import paddle

            input1 = paddle.rand(shape=[2, 3, 5], dtype='float32')
            check = paddle.is_tensor(input1)
            print(check)  #True

            input3 = [1, 4]
            check = paddle.is_tensor(input3)
            print(check)  #False
793

Z
zhulei 已提交
794
    """
H
hong 已提交
795
    return isinstance(x, (Tensor, paddle.fluid.core.eager.Tensor))
796 797 798


def _bitwise_op(op_name, x, y, out=None, name=None, binary_op=True):
799
    if in_dygraph_mode():
W
wanghuancoder 已提交
800
        op = getattr(_C_ops, op_name)
801 802 803 804
        if binary_op:
            return op(x, y)
        else:
            return op(x)
805 806 807 808 809 810
    elif _in_legacy_dygraph():
        op = getattr(_legacy_C_ops, op_name)
        if binary_op:
            return op(x, y)
        else:
            return op(x)
811 812

    check_variable_and_dtype(
813 814
        x, "x", ["bool", "uint8", "int8", "int16", "int32", "int64"], op_name
    )
815 816
    if y is not None:
        check_variable_and_dtype(
817 818 819 820 821
            y,
            "y",
            ["bool", "uint8", "int8", "int16", "int32", "int64"],
            op_name,
        )
822 823 824 825 826 827 828 829 830 831 832
    if out is not None:
        check_type(out, "out", Variable, op_name)

    helper = LayerHelper(op_name, **locals())
    if binary_op:
        assert x.dtype == y.dtype

    if out is None:
        out = helper.create_variable_for_type_inference(dtype=x.dtype)

    if binary_op:
833 834 835
        helper.append_op(
            type=op_name, inputs={"X": x, "Y": y}, outputs={"Out": out}
        )
836 837 838 839 840 841 842 843 844 845
    else:
        helper.append_op(type=op_name, inputs={"X": x}, outputs={"Out": out})

    return out


@templatedoc()
def bitwise_and(x, y, out=None, name=None):
    """
    ${comment}
846

847 848 849 850 851 852 853
    Args:
        x (Tensor): ${x_comment}
        y (Tensor): ${y_comment}
        out(Tensor): ${out_comment}

    Returns:
        Tensor: ${out_comment}
854

855 856 857 858 859 860 861 862 863
    Examples:
        .. code-block:: python

            import paddle
            x = paddle.to_tensor([-5, -1, 1])
            y = paddle.to_tensor([4,  2, -3])
            res = paddle.bitwise_and(x, y)
            print(res)  # [0, 2, 1]
    """
0
0x45f 已提交
864
    if in_dygraph_mode() and out is None:
865
        return _C_ops.bitwise_and(x, y)
866 867 868
    return _bitwise_op(
        op_name="bitwise_and", x=x, y=y, name=name, out=out, binary_op=True
    )
869 870 871 872 873 874


@templatedoc()
def bitwise_or(x, y, out=None, name=None):
    """
    ${comment}
875

876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892
    Args:
        x (Tensor): ${x_comment}
        y (Tensor): ${y_comment}
        out(Tensor): ${out_comment}

    Returns:
        Tensor: ${out_comment}

    Examples:
        .. code-block:: python

            import paddle
            x = paddle.to_tensor([-5, -1, 1])
            y = paddle.to_tensor([4,  2, -3])
            res = paddle.bitwise_or(x, y)
            print(res)  # [-1, -1, -3]
    """
0
0x45f 已提交
893
    if in_dygraph_mode() and out is None:
894
        return _C_ops.bitwise_or(x, y)
H
hong 已提交
895

896 897 898
    return _bitwise_op(
        op_name="bitwise_or", x=x, y=y, name=name, out=out, binary_op=True
    )
899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922


@templatedoc()
def bitwise_xor(x, y, out=None, name=None):
    """
    ${comment}

    Args:
        x (Tensor): ${x_comment}
        y (Tensor): ${y_comment}
        out(Tensor): ${out_comment}

    Returns:
        Tensor: ${out_comment}

    Examples:
        .. code-block:: python

            import paddle
            x = paddle.to_tensor([-5, -1, 1])
            y = paddle.to_tensor([4,  2, -3])
            res = paddle.bitwise_xor(x, y)
            print(res) # [-1, -3, -4]
    """
0
0x45f 已提交
923
    if in_dygraph_mode() and out is None:
924
        return _C_ops.bitwise_xor(x, y)
925 926 927
    return _bitwise_op(
        op_name="bitwise_xor", x=x, y=y, name=name, out=out, binary_op=True
    )
928 929 930 931 932 933 934 935 936 937


@templatedoc()
def bitwise_not(x, out=None, name=None):
    """
    ${comment}

    Args:
        x(Tensor):  ${x_comment}
        out(Tensor): ${out_comment}
938

939 940 941 942 943 944 945 946 947 948 949
    Returns:
        Tensor: ${out_comment}

    Examples:
        .. code-block:: python

            import paddle
            x = paddle.to_tensor([-5, -1, 1])
            res = paddle.bitwise_not(x)
            print(res) # [4, 0, -2]
    """
0
0x45f 已提交
950
    if in_dygraph_mode() and out is None:
951
        return _C_ops.bitwise_not(x)
952

953 954 955
    return _bitwise_op(
        op_name="bitwise_not", x=x, y=None, name=name, out=out, binary_op=False
    )
A
andyjpaddle 已提交
956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998


@templatedoc()
def isclose(x, y, rtol=1e-05, atol=1e-08, equal_nan=False, name=None):
    """
    ${comment}

    Args:
        x(Tensor): ${input_comment}.
        y(Tensor): ${other_comment}.
        rtol(rtoltype, optional): The relative tolerance. Default: :math:`1e-5` .
        atol(atoltype, optional): The absolute tolerance. Default: :math:`1e-8` .
        equal_nan(equalnantype, optional): ${equal_nan_comment}.
        name (str, optional): Name for the operation. For more information, please
            refer to :ref:`api_guide_Name`. Default: None.

    Returns:
        Tensor: ${out_comment}.

    Examples:
        .. code-block:: python

          import paddle

          x = paddle.to_tensor([10000., 1e-07])
          y = paddle.to_tensor([10000.1, 1e-08])
          result1 = paddle.isclose(x, y, rtol=1e-05, atol=1e-08,
                                  equal_nan=False, name="ignore_nan")
          # [True, False]
          result2 = paddle.isclose(x, y, rtol=1e-05, atol=1e-08,
                                      equal_nan=True, name="equal_nan")
          # [True, False]

          x = paddle.to_tensor([1.0, float('nan')])
          y = paddle.to_tensor([1.0, float('nan')])
          result1 = paddle.isclose(x, y, rtol=1e-05, atol=1e-08,
                                  equal_nan=False, name="ignore_nan")
          # [True, False]
          result2 = paddle.isclose(x, y, rtol=1e-05, atol=1e-08,
                                      equal_nan=True, name="equal_nan")
          # [True, True]
    """

999
    if in_dygraph_mode():
1000
        return _C_ops.isclose(x, y, rtol, atol, equal_nan)
1001
    if _in_legacy_dygraph():
1002 1003 1004
        return _legacy_C_ops.isclose(
            x, y, 'rtol', str(rtol), 'atol', str(atol), 'equal_nan', equal_nan
        )
A
andyjpaddle 已提交
1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017

    check_variable_and_dtype(x, "input", ['float32', 'float64'], 'isclose')
    check_variable_and_dtype(y, "input", ['float32', 'float64'], 'isclose')
    check_type(rtol, 'rtol', float, 'isclose')
    check_type(atol, 'atol', float, 'isclose')
    check_type(equal_nan, 'equal_nan', bool, 'isclose')

    helper = LayerHelper("isclose", **locals())
    out = helper.create_variable_for_type_inference(dtype='bool')

    inputs = {'Input': x, 'Other': y}
    outputs = {'Out': out}
    attrs = {'rtol': str(rtol), 'atol': str(atol), 'equal_nan': equal_nan}
1018 1019 1020
    helper.append_op(
        type='isclose', inputs=inputs, outputs=outputs, attrs=attrs
    )
A
andyjpaddle 已提交
1021
    return out