logic.py 45.0 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 ..common_ops_import import Variable
20 21
from ..fluid.data_feeder import check_type, check_variable_and_dtype
from .layer_function_generator import templatedoc
22

W
wanghuancoder 已提交
23
Tensor = paddle.fluid.framework.core.eager.Tensor
24

25
from paddle import _C_ops
26
from paddle.tensor.creation import full
27 28
from paddle.tensor.math import broadcast_shape
from paddle.utils.inplace_utils import inplace_apis_in_dygraph_only
29

30
from ..framework import LayerHelper, in_dynamic_mode
31

32 33
__all__ = []

34

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

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

81 82
        if binary_op and x.dtype != y.dtype:
            raise ValueError(
83
                f"(InvalidArgument) The DataType of {op_name} Op's Variable must be consistent, but received {x.dtype} and {y.dtype}."
84
            )
85

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

89 90 91 92 93 94 95 96
        if binary_op:
            helper.append_op(
                type=op_name, inputs={"X": x, "Y": y}, outputs={"Out": out}
            )
        else:
            helper.append_op(
                type=op_name, inputs={"X": x}, outputs={"Out": out}
            )
97

98
        return out
99 100 101 102 103


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

104
    Compute element-wise logical AND on ``x`` and ``y``, and return ``out``. ``out`` is N-dim boolean ``Tensor``.
105 106 107 108 109 110
    Each element of ``out`` is calculated by

    .. math::

        out = x \&\& y

111
    Note:
I
Infinity_lee 已提交
112 113 114
        ``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
115 116

    Args:
117 118
        x (Tensor): the input tensor, it's data type should be one of bool, int8, int16, in32, in64, float16, float32, float64.
        y (Tensor): the input tensor, it's data type should be one of bool, int8, int16, in32, in64, float16, float32, float64.
119
        out(Tensor, optional): 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.
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
        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]
    """
135
    if in_dynamic_mode():
136
        return _C_ops.logical_and(x, y)
137

138 139 140
    return _logical_op(
        op_name="logical_and", x=x, y=y, name=name, out=out, binary_op=True
    )
141 142


143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
@inplace_apis_in_dygraph_only
def logical_and_(x, y, name=None):
    r"""
    Inplace version of ``logical_and`` API, the output Tensor will be inplaced with input ``x``.
    Please refer to :ref:`api_paddle_logical_and`.
    """
    out_shape = broadcast_shape(x.shape, y.shape)
    if out_shape != x.shape:
        raise ValueError(
            "The shape of broadcast output {} is different from that of inplace tensor {} in the Inplace operation.".format(
                out_shape, x.shape
            )
        )
    if in_dynamic_mode():
        return _C_ops.logical_and_(x, y)


160 161 162 163 164 165 166 167 168 169
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

170
    Note:
I
Infinity_lee 已提交
171 172 173
        ``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
174

175
    Args:
176 177
        x (Tensor): the input tensor, it's data type should be one of bool, int8, int16, in32, in64, float16, float32, float64.
        y (Tensor): the input tensor, it's data type should be one of bool, int8, int16, in32, in64, float16, float32, float64.
178 179 180 181 182 183 184 185 186 187 188
        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

189 190
            x = paddle.to_tensor([True, False], dtype="bool").reshape([2, 1])
            y = paddle.to_tensor([True, False, True, False], dtype="bool").reshape([2, 2])
191
            res = paddle.logical_or(x, y)
192 193 194 195
            print(res)
            # Tensor(shape=[2, 2], dtype=bool, place=Place(cpu), stop_gradient=True,
            #        [[True , True ],
            #         [True , False]])
196
    """
197
    if in_dynamic_mode():
198
        return _C_ops.logical_or(x, y)
199 200 201
    return _logical_op(
        op_name="logical_or", x=x, y=y, name=name, out=out, binary_op=True
    )
202 203


204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
@inplace_apis_in_dygraph_only
def logical_or_(x, y, name=None):
    r"""
    Inplace version of ``logical_or`` API, the output Tensor will be inplaced with input ``x``.
    Please refer to :ref:`api_paddle_logical_or`.
    """
    out_shape = broadcast_shape(x.shape, y.shape)
    if out_shape != x.shape:
        raise ValueError(
            "The shape of broadcast output {} is different from that of inplace tensor {} in the Inplace operation.".format(
                out_shape, x.shape
            )
        )
    if in_dynamic_mode():
        return _C_ops.logical_or_(x, y)


221 222 223 224 225 226 227 228 229 230
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)

231
    Note:
I
Infinity_lee 已提交
232 233 234
        ``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
235 236

    Args:
237 238
        x (Tensor): the input tensor, it's data type should be one of bool, int8, int16, int32, int64, float16, float32, float64.
        y (Tensor): the input tensor, it's data type should be one of bool, int8, int16, int32, int64, float16, float32, float64.
239 240 241 242 243 244 245 246 247 248 249
        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

250 251
            x = paddle.to_tensor([True, False], dtype="bool").reshape([2, 1])
            y = paddle.to_tensor([True, False, True, False], dtype="bool").reshape([2, 2])
252
            res = paddle.logical_xor(x, y)
253 254 255 256
            print(res)
            # Tensor(shape=[2, 2], dtype=bool, place=Place(cpu), stop_gradient=True,
            #        [[False, True ],
            #         [True , False]])
257
    """
258
    if in_dynamic_mode():
259
        return _C_ops.logical_xor(x, y)
260

261 262 263
    return _logical_op(
        op_name="logical_xor", x=x, y=y, name=name, out=out, binary_op=True
    )
264 265


266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282
@inplace_apis_in_dygraph_only
def logical_xor_(x, y, name=None):
    r"""
    Inplace version of ``logical_xor`` API, the output Tensor will be inplaced with input ``x``.
    Please refer to :ref:`api_logical_xor`.
    """
    out_shape = broadcast_shape(x.shape, y.shape)
    if out_shape != x.shape:
        raise ValueError(
            "The shape of broadcast output {} is different from that of inplace tensor {} in the Inplace operation.".format(
                out_shape, x.shape
            )
        )
    if in_dynamic_mode():
        return _C_ops.logical_xor_(x, y)


283 284 285 286 287 288 289 290 291 292
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 已提交
293 294 295 296 297
    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

298
    Args:
299
        x(Tensor):  Operand of logical_not operator. Must be a Tensor of type bool, int8, int16, in32, in64, float16, float32, or float64.
300 301 302 303
        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:
304
        N-D Tensor. A location into which the result is stored. It's dimension equals with ``x``.
305 306 307 308 309 310 311 312 313 314

    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]
    """
315
    if in_dynamic_mode():
316
        return _C_ops.logical_not(x)
317 318 319
    return _logical_op(
        op_name="logical_not", x=x, y=None, name=name, out=out, binary_op=False
    )
320 321


322 323 324 325 326 327 328 329 330 331
@inplace_apis_in_dygraph_only
def logical_not_(x, name=None):
    r"""
    Inplace version of ``logical_not`` API, the output Tensor will be inplaced with input ``x``.
    Please refer to :ref:`api_paddle_logical_not`.
    """
    if in_dynamic_mode():
        return _C_ops.logical_not_(x)


332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352
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)
353 354
            # res: Tensor(shape=[], dtype=bool, place=Place(cpu), stop_gradient=True,
            #        False)
355 356

    """
357
    if in_dynamic_mode():
358
        return _C_ops.is_empty(x)
359 360 361 362 363
    else:
        check_variable_and_dtype(
            x, 'x', ['float32', 'float64', 'int32', 'int64'], 'is_empty'
        )
        check_type(name, "name", (str, type(None)), "is_empty")
364

365 366 367 368 369 370 371
        helper = LayerHelper("is_empty", **locals())
        cond = helper.create_variable_for_type_inference(dtype='bool')
        cond.stop_gradient = True
        helper.append_op(
            type='is_empty', inputs={'X': [x]}, outputs={'Out': [cond]}
        )
        return cond
372 373


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

378
    Note:
379
        The output has no gradient.
380 381

    Args:
382 383
        x(Tensor): Tensor, data type is bool, float32, float64, int32, int64.
        y(Tensor): Tensor, data type is bool, float32, float64, int32, int64.
W
wawltor 已提交
384 385
        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`.
386 387

    Returns:
W
wawltor 已提交
388
        Tensor: output Tensor, data type is bool, value is [False] or [True].
389 390 391 392 393

    Examples:
        .. code-block:: python

          import paddle
W
wawltor 已提交
394

395 396 397
          x = paddle.to_tensor([1, 2, 3])
          y = paddle.to_tensor([1, 2, 3])
          z = paddle.to_tensor([1, 4, 3])
W
wawltor 已提交
398
          result1 = paddle.equal_all(x, y)
399
          print(result1) # result1 = True
W
wawltor 已提交
400
          result2 = paddle.equal_all(x, z)
401
          print(result2) # result2 = False
402
    """
403
    if in_dynamic_mode():
404
        return _C_ops.equal_all(x, y)
405 406 407 408 409 410 411 412 413
    else:
        helper = LayerHelper("equal_all", **locals())
        out = helper.create_variable_for_type_inference(dtype='bool')
        helper.append_op(
            type='equal_all',
            inputs={'X': [x], 'Y': [y]},
            outputs={'Out': [out]},
        )
        return out
Z
Zhen Wang 已提交
414 415 416


@templatedoc()
417
def allclose(x, y, rtol=1e-05, atol=1e-08, equal_nan=False, name=None):
418 419 420 421 422 423
    r"""
    Check if all :math:`x` and :math:`y` satisfy the condition:

    .. math::
        \left| x - y \right| \leq atol + rtol \times \left| y \right|

H
hg-1099255210 已提交
424
    elementwise, for all elements of :math:`x` and :math:`y`. This is analogous to :math:`numpy.allclose`, namely that it returns :math:`True` if
425
    two tensors are elementwise equal within a tolerance.
Z
Zhen Wang 已提交
426 427

    Args:
428 429
        x(Tensor): The input tensor, it's data type should be float16, float32, float64..
        y(Tensor): The input tensor, it's data type should be float16, float32, float64..
H
huangxu96 已提交
430 431
        rtol(rtoltype, optional): The relative tolerance. Default: :math:`1e-5` .
        atol(atoltype, optional): The absolute tolerance. Default: :math:`1e-8` .
432 433 434
        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 已提交
435 436

    Returns:
437
        Tensor: The output tensor, it's data type is bool.
438

Z
Zhen Wang 已提交
439 440 441 442 443
    Examples:
        .. code-block:: python

          import paddle

444 445
          x = paddle.to_tensor([10000., 1e-07])
          y = paddle.to_tensor([10000.1, 1e-08])
446
          result1 = paddle.allclose(x, y, rtol=1e-05, atol=1e-08,
Z
Zhen Wang 已提交
447
                                  equal_nan=False, name="ignore_nan")
448
          # False
449

450
          result2 = paddle.allclose(x, y, rtol=1e-05, atol=1e-08,
Z
Zhen Wang 已提交
451
                                      equal_nan=True, name="equal_nan")
452
          # False
453

454 455
          x = paddle.to_tensor([1.0, float('nan')])
          y = paddle.to_tensor([1.0, float('nan')])
456 457
          result1 = paddle.allclose(x, y, rtol=1e-05, atol=1e-08,
                                  equal_nan=False, name="ignore_nan")
458
          # False
459

460 461
          result2 = paddle.allclose(x, y, rtol=1e-05, atol=1e-08,
                                      equal_nan=True, name="equal_nan")
462
          # True
Z
Zhen Wang 已提交
463 464
    """

465
    if in_dynamic_mode():
466
        return _C_ops.allclose(x, y, rtol, atol, equal_nan)
467
    else:
468 469 470 471 472 473
        check_variable_and_dtype(
            x, "input", ['float16', 'float32', 'float64'], 'allclose'
        )
        check_variable_and_dtype(
            y, "input", ['float16', 'float32', 'float64'], 'allclose'
        )
474 475 476 477 478 479 480 481 482 483 484 485
        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')

        inputs = {'Input': x, 'Other': y}
        outputs = {'Out': out}
        attrs = {'rtol': str(rtol), 'atol': str(atol), 'equal_nan': equal_nan}
        helper.append_op(
            type='allclose', inputs=inputs, outputs=outputs, attrs=attrs
486
        )
Z
Zhen Wang 已提交
487

488
        return out
489 490


W
wawltor 已提交
491 492
@templatedoc()
def equal(x, y, name=None):
493
    """
S
swtkiwi 已提交
494

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

497
    Note:
498
        The output has no gradient.
499 500

    Args:
陈沧夜 已提交
501 502
        x(Tensor): Tensor, data type is bool, float16, float32, float64, int32, int64.
        y(Tensor): Tensor, data type is bool, float16, float32, float64, int32, int64.
503 504 505 506
        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 已提交
507
        Tensor: output Tensor, it's shape is the same as the input's Tensor,
508
        and the data type is bool. The result of this op is stop_gradient.
509 510 511 512

    Examples:
        .. code-block:: python

W
wawltor 已提交
513 514
          import paddle

515 516
          x = paddle.to_tensor([1, 2, 3])
          y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
517
          result1 = paddle.equal(x, y)
N
Noel 已提交
518
          print(result1)  # result1 = [True False False]
519
    """
520 521
    if not isinstance(y, (int, bool, float, Variable)):
        raise TypeError(
522 523 524 525
            "Type of input args must be float, bool, int or Tensor, but received type {}".format(
                type(y)
            )
        )
526
    if not isinstance(y, Variable):
527
        y = full(shape=[], dtype=x.dtype, fill_value=y)
528

529
    if in_dynamic_mode():
530
        return _C_ops.equal(x, y)
J
Jiabin Yang 已提交
531
    else:
532 533 534
        check_variable_and_dtype(
            x,
            "x",
535 536 537 538 539 540 541 542 543
            [
                "bool",
                "float16",
                "float32",
                "float64",
                "int32",
                "int64",
                "uint16",
            ],
544 545 546 547 548
            "equal",
        )
        check_variable_and_dtype(
            y,
            "y",
549 550 551 552 553 554 555 556 557
            [
                "bool",
                "float16",
                "float32",
                "float64",
                "int32",
                "int64",
                "uint16",
            ],
558 559 560 561 562
            "equal",
        )
        helper = LayerHelper("equal", **locals())
        out = helper.create_variable_for_type_inference(dtype='bool')
        out.stop_gradient = True
J
Jiabin Yang 已提交
563

564 565 566 567 568 569
        helper.append_op(
            type='equal',
            inputs={'X': [x], 'Y': [y]},
            outputs={'Out': [out]},
        )
        return out
570

W
wawltor 已提交
571

572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588
@inplace_apis_in_dygraph_only
def equal_(x, y, name=None):
    r"""
    Inplace version of ``equal`` API, the output Tensor will be inplaced with input ``x``.
    Please refer to :ref:`api_paddle_equal`.
    """
    out_shape = broadcast_shape(x.shape, y.shape)
    if out_shape != x.shape:
        raise ValueError(
            "The shape of broadcast output {} is different from that of inplace tensor {} in the Inplace operation.".format(
                out_shape, x.shape
            )
        )
    if in_dynamic_mode():
        return _C_ops.equal_(x, y)


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

594
    Note:
595
        The output has no gradient.
W
wawltor 已提交
596 597

    Args:
598 599
        x(Tensor): First input to compare which is N-D tensor. The input data type should be bool, float16, float32, float64, int32, int64.
        y(Tensor): Second input to compare which is N-D tensor. The input data type should be bool, float16, float32, float64, int32, int64.
W
wawltor 已提交
600 601 602
        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:
603
        Tensor: The output shape is same as input :attr:`x`. The output data type is bool.
W
wawltor 已提交
604 605 606

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

W
wawltor 已提交
608 609
            import paddle

610 611
            x = paddle.to_tensor([1, 2, 3])
            y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
612
            result1 = paddle.greater_equal(x, y)
N
Noel 已提交
613
            print(result1)  # result1 = [True False True]
W
wawltor 已提交
614
    """
615
    if in_dynamic_mode():
616
        return _C_ops.greater_equal(x, y)
J
Jiabin Yang 已提交
617
    else:
618 619 620
        check_variable_and_dtype(
            x,
            "x",
621 622 623 624 625 626 627 628 629
            [
                "bool",
                "float16",
                "float32",
                "float64",
                "int32",
                "int64",
                "uint16",
            ],
630 631 632 633 634
            "greater_equal",
        )
        check_variable_and_dtype(
            y,
            "y",
635 636 637 638 639 640 641 642 643
            [
                "bool",
                "float16",
                "float32",
                "float64",
                "int32",
                "int64",
                "uint16",
            ],
644 645 646 647 648
            "greater_equal",
        )
        helper = LayerHelper("greater_equal", **locals())
        out = helper.create_variable_for_type_inference(dtype='bool')
        out.stop_gradient = True
J
Jiabin Yang 已提交
649

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


658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674
@inplace_apis_in_dygraph_only
def greater_equal_(x, y, name=None):
    r"""
    Inplace version of ``greater_equal`` API, the output Tensor will be inplaced with input ``x``.
    Please refer to :ref:`api_paddle_greater_equal`.
    """
    out_shape = broadcast_shape(x.shape, y.shape)
    if out_shape != x.shape:
        raise ValueError(
            "The shape of broadcast output {} is different from that of inplace tensor {} in the Inplace operation.".format(
                out_shape, x.shape
            )
        )
    if in_dynamic_mode():
        return _C_ops.greater_equal_(x, y)


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

680
    Note:
681
        The output has no gradient.
W
wawltor 已提交
682 683

    Args:
J
Jx-qi 已提交
684 685
        x(Tensor): First input to compare which is N-D tensor. The input data type should be bool, float16, float32, float64, int32, int64.
        y(Tensor): Second input to compare which is N-D tensor. The input data type should be bool, float16, float32, float64, int32, int64.
W
wawltor 已提交
686 687 688
        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:
689
        Tensor: The output shape is same as input :attr:`x`. The output data type is bool.
W
wawltor 已提交
690 691 692

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

W
wawltor 已提交
694 695
            import paddle

696 697
            x = paddle.to_tensor([1, 2, 3])
            y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
698
            result1 = paddle.greater_than(x, y)
N
Noel 已提交
699
            print(result1)  # result1 = [False False True]
W
wawltor 已提交
700
    """
701
    if in_dynamic_mode():
702
        return _C_ops.greater_than(x, y)
J
Jiabin Yang 已提交
703
    else:
704 705 706
        check_variable_and_dtype(
            x,
            "x",
707 708 709 710 711 712 713 714 715
            [
                "bool",
                "float16",
                "float32",
                "float64",
                "int32",
                "int64",
                "uint16",
            ],
716 717 718 719 720
            "greater_than",
        )
        check_variable_and_dtype(
            y,
            "y",
721 722 723 724 725 726 727 728 729
            [
                "bool",
                "float16",
                "float32",
                "float64",
                "int32",
                "int64",
                "uint16",
            ],
730 731 732 733 734
            "greater_than",
        )
        helper = LayerHelper("greater_than", **locals())
        out = helper.create_variable_for_type_inference(dtype='bool')
        out.stop_gradient = True
J
Jiabin Yang 已提交
735

736 737 738 739 740 741
        helper.append_op(
            type='greater_than',
            inputs={'X': [x], 'Y': [y]},
            outputs={'Out': [out]},
        )
        return out
W
wawltor 已提交
742 743


744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760
@inplace_apis_in_dygraph_only
def greater_than_(x, y, name=None):
    r"""
    Inplace version of ``greater_than`` API, the output Tensor will be inplaced with input ``x``.
    Please refer to :ref:`api_paddle_greater_than`.
    """
    out_shape = broadcast_shape(x.shape, y.shape)
    if out_shape != x.shape:
        raise ValueError(
            "The shape of broadcast output {} is different from that of inplace tensor {} in the Inplace operation.".format(
                out_shape, x.shape
            )
        )
    if in_dynamic_mode():
        return _C_ops.greater_than_(x, y)


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

766
    Note:
767
        The output has no gradient.
W
wawltor 已提交
768 769

    Args:
B
BellaZYL 已提交
770 771
        x(Tensor): First input to compare which is N-D tensor. The input data type should be bool, float16, float32, float64, int32, int64.
        y(Tensor): Second input to compare which is N-D tensor. The input data type should be bool, float16, float32, float64, int32, int64.
W
wawltor 已提交
772 773 774 775
        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:
776
        Tensor: The output shape is same as input :attr:`x`. The output data type is bool.
W
wawltor 已提交
777 778 779

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

W
wawltor 已提交
781 782
            import paddle

783 784
            x = paddle.to_tensor([1, 2, 3])
            y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
785
            result1 = paddle.less_equal(x, y)
N
Noel 已提交
786
            print(result1)  # result1 = [True True False]
W
wawltor 已提交
787
    """
788
    if in_dynamic_mode():
789
        return _C_ops.less_equal(x, y)
J
Jiabin Yang 已提交
790
    else:
791 792 793
        check_variable_and_dtype(
            x,
            "x",
794 795 796 797 798 799 800 801 802
            [
                "bool",
                "float16",
                "float32",
                "float64",
                "int32",
                "int64",
                "uint16",
            ],
803 804 805 806 807
            "less_equal",
        )
        check_variable_and_dtype(
            y,
            "y",
808 809 810 811 812 813 814 815 816
            [
                "bool",
                "float16",
                "float32",
                "float64",
                "int32",
                "int64",
                "uint16",
            ],
817 818 819 820 821
            "less_equal",
        )
        helper = LayerHelper("less_equal", **locals())
        out = helper.create_variable_for_type_inference(dtype='bool')
        out.stop_gradient = True
J
Jiabin Yang 已提交
822

823 824 825 826 827 828
        helper.append_op(
            type='less_equal',
            inputs={'X': [x], 'Y': [y]},
            outputs={'Out': [out]},
        )
        return out
W
wawltor 已提交
829 830


831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847
@inplace_apis_in_dygraph_only
def less_equal_(x, y, name=None):
    r"""
    Inplace version of ``less_equal`` API, the output Tensor will be inplaced with input ``x``.
    Please refer to :ref:`api_paddle_less_equal`.
    """
    out_shape = broadcast_shape(x.shape, y.shape)
    if out_shape != x.shape:
        raise ValueError(
            "The shape of broadcast output {} is different from that of inplace tensor {} in the Inplace operation.".format(
                out_shape, x.shape
            )
        )
    if in_dynamic_mode():
        return _C_ops.less_equal_(x, y)


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

853
    Note:
854
        The output has no gradient.
W
wawltor 已提交
855 856

    Args:
H
hh-qiao 已提交
857 858
        x(Tensor): First input to compare which is N-D tensor. The input data type should be bool, float16, float32, float64, int32, int64.
        y(Tensor): Second input to compare which is N-D tensor. The input data type should be bool, float16, float32, float64, int32, int64.
W
wawltor 已提交
859 860 861 862
        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:
863
        Tensor: The output shape is same as input :attr:`x`. The output data type is bool.
W
wawltor 已提交
864 865 866

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

W
wawltor 已提交
868 869
            import paddle

870 871
            x = paddle.to_tensor([1, 2, 3])
            y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
872
            result1 = paddle.less_than(x, y)
N
Noel 已提交
873
            print(result1)  # result1 = [False True False]
W
wawltor 已提交
874
    """
875
    if in_dynamic_mode():
876
        return _C_ops.less_than(x, y)
J
Jiabin Yang 已提交
877
    else:
878 879 880
        check_variable_and_dtype(
            x,
            "x",
881 882 883 884 885 886 887 888 889
            [
                "bool",
                "float16",
                "float32",
                "float64",
                "int32",
                "int64",
                "uint16",
            ],
890 891 892 893 894
            "less_than",
        )
        check_variable_and_dtype(
            y,
            "y",
895 896 897 898 899 900 901 902 903
            [
                "bool",
                "float16",
                "float32",
                "float64",
                "int32",
                "int64",
                "uint16",
            ],
904 905 906 907 908
            "less_than",
        )
        helper = LayerHelper("less_than", **locals())
        out = helper.create_variable_for_type_inference(dtype='bool')
        out.stop_gradient = True
J
Jiabin Yang 已提交
909

910 911 912 913 914 915
        helper.append_op(
            type='less_than',
            inputs={'X': [x], 'Y': [y]},
            outputs={'Out': [out]},
        )
        return out
W
wawltor 已提交
916 917


918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934
@inplace_apis_in_dygraph_only
def less_than_(x, y, name=None):
    r"""
    Inplace version of ``less_than`` API, the output Tensor will be inplaced with input ``x``.
    Please refer to :ref:`api_paddle_less_than`.
    """
    out_shape = broadcast_shape(x.shape, y.shape)
    if out_shape != x.shape:
        raise ValueError(
            "The shape of broadcast output {} is different from that of inplace tensor {} in the Inplace operation.".format(
                out_shape, x.shape
            )
        )
    if in_dynamic_mode():
        return _C_ops.less_than_(x, y)


W
wawltor 已提交
935 936 937
@templatedoc()
def not_equal(x, y, name=None):
    """
938
    Returns the truth value of :math:`x != y` elementwise, which is equivalent function to the overloaded operator `!=`.
939 940

    Note:
941
        The output has no gradient.
W
wawltor 已提交
942 943

    Args:
944 945
        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 已提交
946 947 948 949
        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:
950
        Tensor: The output shape is same as input :attr:`x`. The output data type is bool.
W
wawltor 已提交
951 952 953

    Examples:
        .. code-block:: python
954

W
wawltor 已提交
955 956
            import paddle

957 958
            x = paddle.to_tensor([1, 2, 3])
            y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
959
            result1 = paddle.not_equal(x, y)
N
Noel 已提交
960
            print(result1)  # result1 = [False True True]
W
wawltor 已提交
961
    """
962
    if in_dynamic_mode():
963
        return _C_ops.not_equal(x, y)
J
Jiabin Yang 已提交
964
    else:
965 966 967
        check_variable_and_dtype(
            x,
            "x",
968 969 970 971 972 973 974 975 976
            [
                "bool",
                "float16",
                "float32",
                "float64",
                "int32",
                "int64",
                "uint16",
            ],
977 978 979 980 981
            "not_equal",
        )
        check_variable_and_dtype(
            y,
            "y",
982 983 984 985 986 987 988 989 990
            [
                "bool",
                "float16",
                "float32",
                "float64",
                "int32",
                "int64",
                "uint16",
            ],
991 992 993 994 995
            "not_equal",
        )
        helper = LayerHelper("not_equal", **locals())
        out = helper.create_variable_for_type_inference(dtype='bool')
        out.stop_gradient = True
J
Jiabin Yang 已提交
996

997 998 999 1000 1001 1002
        helper.append_op(
            type='not_equal',
            inputs={'X': [x], 'Y': [y]},
            outputs={'Out': [out]},
        )
        return out
Z
zhulei 已提交
1003 1004


1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021
@inplace_apis_in_dygraph_only
def not_equal_(x, y, name=None):
    r"""
    Inplace version of ``not_equal`` API, the output Tensor will be inplaced with input ``x``.
    Please refer to :ref:`api_paddle_not_equal`.
    """
    out_shape = broadcast_shape(x.shape, y.shape)
    if out_shape != x.shape:
        raise ValueError(
            "The shape of broadcast output {} is different from that of inplace tensor {} in the Inplace operation.".format(
                out_shape, x.shape
            )
        )
    if in_dynamic_mode():
        return _C_ops.not_equal_(x, y)


Z
zhulei 已提交
1022 1023 1024
def is_tensor(x):
    """

C
Chen Long 已提交
1025
    Tests whether input object is a paddle.Tensor.
Z
zhulei 已提交
1026 1027 1028 1029 1030

    Args:
        x (object): Object to test.

    Returns:
C
Chen Long 已提交
1031
        A boolean value. True if ``x`` is a paddle.Tensor, otherwise False.
Z
zhulei 已提交
1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044

    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
1045

Z
zhulei 已提交
1046
    """
1047
    if in_dynamic_mode():
1048 1049 1050
        return isinstance(x, (Tensor, paddle.fluid.core.eager.Tensor))
    else:
        return isinstance(x, Variable)
1051 1052 1053


def _bitwise_op(op_name, x, y, out=None, name=None, binary_op=True):
1054
    if in_dynamic_mode():
W
wanghuancoder 已提交
1055
        op = getattr(_C_ops, op_name)
1056 1057 1058 1059
        if binary_op:
            return op(x, y)
        else:
            return op(x)
1060
    else:
1061
        check_variable_and_dtype(
1062 1063
            x,
            "x",
1064 1065 1066
            ["bool", "uint8", "int8", "int16", "int32", "int64"],
            op_name,
        )
1067 1068 1069 1070 1071 1072 1073 1074 1075
        if y is not None:
            check_variable_and_dtype(
                y,
                "y",
                ["bool", "uint8", "int8", "int16", "int32", "int64"],
                op_name,
            )
        if out is not None:
            check_type(out, "out", Variable, op_name)
1076

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

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

1084 1085 1086 1087 1088 1089 1090 1091
        if binary_op:
            helper.append_op(
                type=op_name, inputs={"X": x, "Y": y}, outputs={"Out": out}
            )
        else:
            helper.append_op(
                type=op_name, inputs={"X": x}, outputs={"Out": out}
            )
1092

1093
        return out
1094 1095 1096


def bitwise_and(x, y, out=None, name=None):
1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107
    r"""

    Apply ``bitwise_and`` on Tensor ``X`` and ``Y`` .

    .. math::
        Out = X \& Y

    .. note::
        ``paddle.bitwise_and`` supports broadcasting. If you want know more about broadcasting, please refer to please refer to `Introduction to Tensor`_ .

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

1109
    Args:
1110 1111 1112
        x (Tensor): Input Tensor of ``bitwise_and`` . It is a N-D Tensor of bool, uint8, int8, int16, int32, int64.
        y (Tensor): Input Tensor of ``bitwise_and`` . It is a N-D Tensor of bool, uint8, int8, int16, int32, int64.
        out(Tensor): Result of ``bitwise_and`` . It is a N-D Tensor with the same data type of input Tensor.
1113 1114

    Returns:
1115
        Tensor: Result of ``bitwise_and`` . It is a N-D Tensor with the same data type of input Tensor.
1116

1117 1118 1119 1120 1121 1122 1123 1124 1125
    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]
    """
1126
    if in_dynamic_mode() and out is None:
1127
        return _C_ops.bitwise_and(x, y)
1128 1129 1130
    return _bitwise_op(
        op_name="bitwise_and", x=x, y=y, name=name, out=out, binary_op=True
    )
1131 1132


1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149
@inplace_apis_in_dygraph_only
def bitwise_and_(x, y, name=None):
    r"""
    Inplace version of ``bitwise_and`` API, the output Tensor will be inplaced with input ``x``.
    Please refer to :ref:`api_paddle_bitwise_and`.
    """
    out_shape = broadcast_shape(x.shape, y.shape)
    if out_shape != x.shape:
        raise ValueError(
            "The shape of broadcast output {} is different from that of inplace tensor {} in the Inplace operation.".format(
                out_shape, x.shape
            )
        )
    if in_dynamic_mode():
        return _C_ops.bitwise_and_(x, y)


1150
def bitwise_or(x, y, out=None, name=None):
1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161
    r"""

    Apply ``bitwise_or`` on Tensor ``X`` and ``Y`` .

    .. math::
        Out = X | Y

    .. note::
        ``paddle.bitwise_or`` supports broadcasting. If you want know more about broadcasting, please refer to please refer to `Introduction to Tensor`_ .

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

1163
    Args:
1164 1165 1166
        x (Tensor): Input Tensor of ``bitwise_or`` . It is a N-D Tensor of bool, uint8, int8, int16, int32, int64.
        y (Tensor): Input Tensor of ``bitwise_or`` . It is a N-D Tensor of bool, uint8, int8, int16, int32, int64.
        out(Tensor): Result of ``bitwise_or`` . It is a N-D Tensor with the same data type of input Tensor.
1167 1168

    Returns:
1169
        Tensor: Result of ``bitwise_or`` . It is a N-D Tensor with the same data type of input Tensor.
1170 1171 1172 1173 1174 1175 1176 1177 1178 1179

    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]
    """
1180
    if in_dynamic_mode() and out is None:
1181
        return _C_ops.bitwise_or(x, y)
H
hong 已提交
1182

1183 1184 1185
    return _bitwise_op(
        op_name="bitwise_or", x=x, y=y, name=name, out=out, binary_op=True
    )
1186 1187


1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204
@inplace_apis_in_dygraph_only
def bitwise_or_(x, y, name=None):
    r"""
    Inplace version of ``bitwise_or`` API, the output Tensor will be inplaced with input ``x``.
    Please refer to :ref:`api_paddle_bitwise_or`.
    """
    out_shape = broadcast_shape(x.shape, y.shape)
    if out_shape != x.shape:
        raise ValueError(
            "The shape of broadcast output {} is different from that of inplace tensor {} in the Inplace operation.".format(
                out_shape, x.shape
            )
        )
    if in_dynamic_mode():
        return _C_ops.bitwise_or_(x, y)


1205
def bitwise_xor(x, y, out=None, name=None):
1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216
    r"""

    Apply ``bitwise_xor`` on Tensor ``X`` and ``Y`` .

    .. math::
        Out = X ^\wedge Y

    .. note::
        ``paddle.bitwise_xor`` supports broadcasting. If you want know more about broadcasting, please refer to please refer to `Introduction to Tensor`_ .

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

    Args:
1219 1220 1221
        x (Tensor): Input Tensor of ``bitwise_xor`` . It is a N-D Tensor of bool, uint8, int8, int16, int32, int64.
        y (Tensor): Input Tensor of ``bitwise_xor`` . It is a N-D Tensor of bool, uint8, int8, int16, int32, int64.
        out(Tensor): Result of ``bitwise_xor`` . It is a N-D Tensor with the same data type of input Tensor.
1222 1223

    Returns:
1224
        Tensor: Result of ``bitwise_xor`` . It is a N-D Tensor with the same data type of input Tensor.
1225 1226 1227 1228 1229 1230 1231 1232 1233 1234

    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]
    """
1235
    if in_dynamic_mode() and out is None:
1236
        return _C_ops.bitwise_xor(x, y)
1237 1238 1239
    return _bitwise_op(
        op_name="bitwise_xor", x=x, y=y, name=name, out=out, binary_op=True
    )
1240 1241


1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258
@inplace_apis_in_dygraph_only
def bitwise_xor_(x, y, name=None):
    r"""
    Inplace version of ``bitwise_xor`` API, the output Tensor will be inplaced with input ``x``.
    Please refer to :ref:`api_paddle_bitwise_xor`.
    """
    out_shape = broadcast_shape(x.shape, y.shape)
    if out_shape != x.shape:
        raise ValueError(
            "The shape of broadcast output {} is different from that of inplace tensor {} in the Inplace operation.".format(
                out_shape, x.shape
            )
        )
    if in_dynamic_mode():
        return _C_ops.bitwise_xor_(x, y)


1259
def bitwise_not(x, out=None, name=None):
1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270
    r"""

    Apply ``bitwise_not`` on Tensor ``X``.

    .. math::
        Out = \sim X

    .. note::
        ``paddle.bitwise_not`` supports broadcasting. If you want know more about broadcasting, please refer to please refer to `Introduction to Tensor`_ .

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

    Args:
1273 1274
        x (Tensor): Input Tensor of ``bitwise_not`` . It is a N-D Tensor of bool, uint8, int8, int16, int32, int64.
        out(Tensor): Result of ``bitwise_not`` . It is a N-D Tensor with the same data type of input Tensor.
1275

1276
    Returns:
1277
        Tensor: Result of ``bitwise_not`` . It is a N-D Tensor with the same data type of input Tensor.
1278 1279 1280 1281 1282 1283 1284 1285 1286

    Examples:
        .. code-block:: python

            import paddle
            x = paddle.to_tensor([-5, -1, 1])
            res = paddle.bitwise_not(x)
            print(res) # [4, 0, -2]
    """
1287
    if in_dynamic_mode() and out is None:
1288
        return _C_ops.bitwise_not(x)
1289

1290 1291 1292
    return _bitwise_op(
        op_name="bitwise_not", x=x, y=None, name=name, out=out, binary_op=False
    )
A
andyjpaddle 已提交
1293 1294


1295 1296 1297 1298 1299 1300 1301 1302 1303 1304
@inplace_apis_in_dygraph_only
def bitwise_not_(x, name=None):
    r"""
    Inplace version of ``bitwise_not`` API, the output Tensor will be inplaced with input ``x``.
    Please refer to :ref:`api_paddle_bitwise_not`.
    """
    if in_dynamic_mode():
        return _C_ops.bitwise_not_(x)


A
andyjpaddle 已提交
1305 1306
@templatedoc()
def isclose(x, y, rtol=1e-05, atol=1e-08, equal_nan=False, name=None):
1307
    r"""
1308
    Check if all :math:`x` and :math:`y` satisfy the condition:
1309 1310 1311 1312 1313 1314 1315 1316

    .. math::

        \left| x - y \right| \leq atol + rtol \times \left| y \right|

    elementwise, for all elements of :math:`x` and :math:`y`. The behaviour of this
    operator is analogous to :math:`numpy.isclose`, namely that it returns :math:`True` if
    two tensors are elementwise equal within a tolerance.
A
andyjpaddle 已提交
1317 1318

    Args:
1319 1320
        x(Tensor): The input tensor, it's data type should be float16, float32, float64.
        y(Tensor): The input tensor, it's data type should be float16, float32, float64.
A
andyjpaddle 已提交
1321 1322
        rtol(rtoltype, optional): The relative tolerance. Default: :math:`1e-5` .
        atol(atoltype, optional): The absolute tolerance. Default: :math:`1e-8` .
1323
        equal_nan(equalnantype, optional): If :math:`True` , then two :math:`NaNs` will be compared as equal. Default: :math:`False` .
A
andyjpaddle 已提交
1324 1325 1326 1327
        name (str, optional): Name for the operation. For more information, please
            refer to :ref:`api_guide_Name`. Default: None.

    Returns:
1328
        Tensor: The output tensor, it's data type is bool.
A
andyjpaddle 已提交
1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353

    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]
    """

1354
    if in_dynamic_mode():
1355
        return _C_ops.isclose(x, y, rtol, atol, equal_nan)
1356
    else:
1357 1358 1359 1360 1361 1362
        check_variable_and_dtype(
            x, "input", ['float16', 'float32', 'float64'], 'isclose'
        )
        check_variable_and_dtype(
            y, "input", ['float16', 'float32', 'float64'], 'isclose'
        )
1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374
        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}
        helper.append_op(
            type='isclose', inputs=inputs, outputs=outputs, attrs=attrs
1375
        )
1376
        return out