logic.py 22.4 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.

Z
Zhen Wang 已提交
15
from ..fluid.layer_helper import LayerHelper
16
from ..fluid.data_feeder import check_type, check_variable_and_dtype
Z
Zhen Wang 已提交
17
from ..fluid.layers.layer_function_generator import templatedoc
Z
zhiboniu 已提交
18
from ..static import Variable
Z
zhulei 已提交
19
from ..framework import VarBase as Tensor
20

21
# TODO: define logic functions of a tensor  
22 23 24 25 26
from ..fluid.layers import is_empty  # noqa: F401
from ..fluid.layers import logical_and  # noqa: F401
from ..fluid.layers import logical_not  # noqa: F401
from ..fluid.layers import logical_or  # noqa: F401
from ..fluid.layers import logical_xor  # noqa: F401
Z
zhiboniu 已提交
27
import paddle
W
wanghuancoder 已提交
28
from paddle import _C_ops
29
from paddle.tensor.creation import full
30

31 32
__all__ = []

33

W
wawltor 已提交
34
def equal_all(x, y, name=None):
35 36 37
    """
    This OP returns the truth value of :math:`x == y`. True if two inputs have the same elements, False otherwise.

W
wawltor 已提交
38
    **NOTICE**: The output of this OP has no gradient.
39 40

    Args:
41 42
        x(Tensor): Tensor, data type is bool, float32, float64, int32, int64.
        y(Tensor): Tensor, data type is bool, float32, float64, int32, int64.
W
wawltor 已提交
43 44
        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`.
45 46

    Returns:
W
wawltor 已提交
47
        Tensor: output Tensor, data type is bool, value is [False] or [True].
48 49 50 51 52

    Examples:
        .. code-block:: python

          import paddle
W
wawltor 已提交
53

54 55 56
          x = paddle.to_tensor([1, 2, 3])
          y = paddle.to_tensor([1, 2, 3])
          z = paddle.to_tensor([1, 4, 3])
W
wawltor 已提交
57
          result1 = paddle.equal_all(x, y)
N
Noel 已提交
58
          print(result1) # result1 = [True ]
W
wawltor 已提交
59
          result2 = paddle.equal_all(x, z)
N
Noel 已提交
60
          print(result2) # result2 = [False ]
61
    """
Z
zhiboniu 已提交
62
    if paddle.in_dynamic_mode():
W
wanghuancoder 已提交
63
        return _C_ops.equal_all(x, y)
W
wawltor 已提交
64 65

    helper = LayerHelper("equal_all", **locals())
66 67
    out = helper.create_variable_for_type_inference(dtype='bool')
    helper.append_op(
W
wawltor 已提交
68 69
        type='equal_all', inputs={'X': [x],
                                  'Y': [y]}, outputs={'Out': [out]})
70
    return out
Z
Zhen Wang 已提交
71 72 73


@templatedoc()
74
def allclose(x, y, rtol=1e-05, atol=1e-08, equal_nan=False, name=None):
Z
Zhen Wang 已提交
75 76 77 78
    """
    ${comment}

    Args:
79 80
        x(Tensor): ${input_comment}.
        y(Tensor): ${other_comment}.
H
huangxu96 已提交
81 82
        rtol(rtoltype, optional): The relative tolerance. Default: :math:`1e-5` .
        atol(atoltype, optional): The absolute tolerance. Default: :math:`1e-8` .
83 84 85
        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 已提交
86 87

    Returns:
88 89 90 91 92 93 94 95
        Tensor: ${out_comment}.

    Raises:
        TypeError: The data type of ``x`` must be one of float32, float64.
        TypeError: The data type of ``y`` must be one of float32, float64.
        TypeError: The type of ``rtol`` must be float.
        TypeError: The type of ``atol`` must be float.
        TypeError: The type of ``equal_nan`` must be bool.
Z
Zhen Wang 已提交
96 97 98 99 100 101

    Examples:
        .. code-block:: python

          import paddle

102 103
          x = paddle.to_tensor([10000., 1e-07])
          y = paddle.to_tensor([10000.1, 1e-08])
104
          result1 = paddle.allclose(x, y, rtol=1e-05, atol=1e-08,
Z
Zhen Wang 已提交
105
                                  equal_nan=False, name="ignore_nan")
106 107 108
          np_result1 = result1.numpy()
          # [False]
          result2 = paddle.allclose(x, y, rtol=1e-05, atol=1e-08,
Z
Zhen Wang 已提交
109
                                      equal_nan=True, name="equal_nan")
110 111 112
          np_result2 = result2.numpy()
          # [False]

113 114
          x = paddle.to_tensor([1.0, float('nan')])
          y = paddle.to_tensor([1.0, float('nan')])
115 116 117 118 119 120 121 122
          result1 = paddle.allclose(x, y, rtol=1e-05, atol=1e-08,
                                  equal_nan=False, name="ignore_nan")
          np_result1 = result1.numpy()
          # [False]
          result2 = paddle.allclose(x, y, rtol=1e-05, atol=1e-08,
                                      equal_nan=True, name="equal_nan")
          np_result2 = result2.numpy()
          # [True]
Z
Zhen Wang 已提交
123 124
    """

Z
zhiboniu 已提交
125
    if paddle.in_dynamic_mode():
W
wanghuancoder 已提交
126 127 128
        return _C_ops.allclose(x, y, 'rtol',
                               str(rtol), 'atol',
                               str(atol), 'equal_nan', equal_nan)
129 130 131

    check_variable_and_dtype(x, "input", ['float32', 'float64'], 'allclose')
    check_variable_and_dtype(y, "input", ['float32', 'float64'], 'allclose')
Z
Zhen Wang 已提交
132 133 134 135 136 137 138
    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')

139
    inputs = {'Input': x, 'Other': y}
Z
Zhen Wang 已提交
140
    outputs = {'Out': out}
141
    attrs = {'rtol': str(rtol), 'atol': str(atol), 'equal_nan': equal_nan}
Z
Zhen Wang 已提交
142 143 144 145
    helper.append_op(
        type='allclose', inputs=inputs, outputs=outputs, attrs=attrs)

    return out
146 147


W
wawltor 已提交
148 149
@templatedoc()
def equal(x, y, name=None):
150
    """
S
swtkiwi 已提交
151

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

W
wawltor 已提交
154
    **NOTICE**: The output of this OP has no gradient.
155 156

    Args:
157 158
        x(Tensor): Tensor, data type is bool, float32, float64, int32, int64.
        y(Tensor): Tensor, data type is bool, float32, float64, int32, int64.
159 160 161 162
        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 已提交
163
        Tensor: output Tensor, it's shape is the same as the input's Tensor,
164 165 166 167 168
        and the data type is bool. The result of this op is stop_gradient. 

    Examples:
        .. code-block:: python

W
wawltor 已提交
169 170
          import paddle

171 172
          x = paddle.to_tensor([1, 2, 3])
          y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
173
          result1 = paddle.equal(x, y)
N
Noel 已提交
174
          print(result1)  # result1 = [True False False]
175
    """
176 177 178 179 180 181 182
    if not isinstance(y, (int, bool, float, Variable)):
        raise TypeError(
            "Type of input args must be float, bool, int or Tensor, but received type {}".
            format(type(y)))
    if not isinstance(y, Variable):
        y = full(shape=[1], dtype=x.dtype, fill_value=y)

Z
zhiboniu 已提交
183
    if paddle.in_dynamic_mode():
W
wanghuancoder 已提交
184
        return _C_ops.equal(x, y)
185

186 187 188 189
    check_variable_and_dtype(
        x, "x", ["bool", "float32", "float64", "int32", "int64"], "equal")
    check_variable_and_dtype(
        y, "y", ["bool", "float32", "float64", "int32", "int64"], "equal")
190 191 192 193 194 195 196
    helper = LayerHelper("equal", **locals())
    out = helper.create_variable_for_type_inference(dtype='bool')
    out.stop_gradient = True

    helper.append_op(
        type='equal', inputs={'X': [x],
                              'Y': [y]}, outputs={'Out': [out]})
W
wawltor 已提交
197
    return out
198

W
wawltor 已提交
199 200 201 202 203

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

W
wawltor 已提交
205 206 207
    **NOTICE**: The output of this OP has no gradient.

    Args:
208 209
        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 已提交
210 211 212 213 214 215 216
        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:
        Tensor, the output data type is bool: The tensor storing the output, the output shape is same as input :attr:`x`.

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

W
wawltor 已提交
218 219
            import paddle

220 221
            x = paddle.to_tensor([1, 2, 3])
            y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
222
            result1 = paddle.greater_equal(x, y)
N
Noel 已提交
223
            print(result1)  # result1 = [True False True]
W
wawltor 已提交
224
    """
Z
zhiboniu 已提交
225
    if paddle.in_dynamic_mode():
W
wanghuancoder 已提交
226
        return _C_ops.greater_equal(x, y)
227

228 229
    check_variable_and_dtype(x, "x",
                             ["bool", "float32", "float64", "int32", "int64"],
230
                             "greater_equal")
231 232
    check_variable_and_dtype(y, "y",
                             ["bool", "float32", "float64", "int32", "int64"],
233 234 235 236 237 238 239 240 241 242
                             "greater_equal")
    helper = LayerHelper("greater_equal", **locals())
    out = helper.create_variable_for_type_inference(dtype='bool')
    out.stop_gradient = True

    helper.append_op(
        type='greater_equal',
        inputs={'X': [x],
                'Y': [y]},
        outputs={'Out': [out]})
W
wawltor 已提交
243 244 245 246 247 248 249
    return out


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

W
wawltor 已提交
251 252 253
    **NOTICE**: The output of this OP has no gradient.

    Args:
254 255
        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 已提交
256 257 258 259 260 261 262
        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:
        Tensor, the output data type is bool: The tensor storing the output, the output shape is same as input :attr:`x` .

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

W
wawltor 已提交
264 265
            import paddle

266 267
            x = paddle.to_tensor([1, 2, 3])
            y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
268
            result1 = paddle.greater_than(x, y)
N
Noel 已提交
269
            print(result1)  # result1 = [False False True]
W
wawltor 已提交
270
    """
Z
zhiboniu 已提交
271
    if paddle.in_dynamic_mode():
W
wanghuancoder 已提交
272
        return _C_ops.greater_than(x, y)
273

274 275
    check_variable_and_dtype(x, "x",
                             ["bool", "float32", "float64", "int32", "int64"],
276
                             "greater_than")
277 278
    check_variable_and_dtype(y, "y",
                             ["bool", "float32", "float64", "int32", "int64"],
279 280 281 282 283 284 285 286 287 288
                             "greater_than")
    helper = LayerHelper("greater_than", **locals())
    out = helper.create_variable_for_type_inference(dtype='bool')
    out.stop_gradient = True

    helper.append_op(
        type='greater_than',
        inputs={'X': [x],
                'Y': [y]},
        outputs={'Out': [out]})
W
wawltor 已提交
289 290 291 292 293 294 295
    return out


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

W
wawltor 已提交
297 298 299
    **NOTICE**: The output of this OP has no gradient.

    Args:
300 301
        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 已提交
302 303 304 305 306 307 308 309
        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:
        Tensor, the output data type is bool: The tensor storing the output, the output shape is same as input :attr:`x`.

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

W
wawltor 已提交
311 312
            import paddle

313 314
            x = paddle.to_tensor([1, 2, 3])
            y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
315
            result1 = paddle.less_equal(x, y)
N
Noel 已提交
316
            print(result1)  # result1 = [True True False]
W
wawltor 已提交
317
    """
Z
zhiboniu 已提交
318
    if paddle.in_dynamic_mode():
W
wanghuancoder 已提交
319
        return _C_ops.less_equal(x, y)
320

321 322 323 324
    check_variable_and_dtype(
        x, "x", ["bool", "float32", "float64", "int32", "int64"], "less_equal")
    check_variable_and_dtype(
        y, "y", ["bool", "float32", "float64", "int32", "int64"], "less_equal")
325 326 327 328 329 330 331
    helper = LayerHelper("less_equal", **locals())
    out = helper.create_variable_for_type_inference(dtype='bool')
    out.stop_gradient = True

    helper.append_op(
        type='less_equal', inputs={'X': [x],
                                   'Y': [y]}, outputs={'Out': [out]})
W
wawltor 已提交
332 333 334 335 336 337 338
    return out


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

W
wawltor 已提交
340 341 342
    **NOTICE**: The output of this OP has no gradient.

    Args:
343 344
        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 已提交
345 346 347 348 349 350 351 352
        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:
        Tensor, the output data type is bool: The tensor storing the output, the output shape is same as input :attr:`x`.

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

W
wawltor 已提交
354 355
            import paddle

356 357
            x = paddle.to_tensor([1, 2, 3])
            y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
358
            result1 = paddle.less_than(x, y)
N
Noel 已提交
359
            print(result1)  # result1 = [False True False]
W
wawltor 已提交
360
    """
Z
zhiboniu 已提交
361
    if paddle.in_dynamic_mode():
W
wanghuancoder 已提交
362
        return _C_ops.less_than(x, y)
363

364 365 366 367
    check_variable_and_dtype(
        x, "x", ["bool", "float32", "float64", "int32", "int64"], "less_than")
    check_variable_and_dtype(
        y, "y", ["bool", "float32", "float64", "int32", "int64"], "less_than")
368 369 370 371 372 373 374
    helper = LayerHelper("less_than", **locals())
    out = helper.create_variable_for_type_inference(dtype='bool')
    out.stop_gradient = True

    helper.append_op(
        type='less_than', inputs={'X': [x],
                                  'Y': [y]}, outputs={'Out': [out]})
W
wawltor 已提交
375 376 377 378 379 380 381
    return out


@templatedoc()
def not_equal(x, y, name=None):
    """
    This OP returns the truth value of :math:`x != y` elementwise, which is equivalent function to the overloaded operator `!=`.
N
Noel 已提交
382
    
W
wawltor 已提交
383 384 385
    **NOTICE**: The output of this OP has no gradient.

    Args:
386 387
        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 已提交
388 389 390 391 392 393 394 395
        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:
        Tensor, the output data type is bool: The tensor storing the output, the output shape is same as input :attr:`x`.

    Examples:
        .. code-block:: python
396

W
wawltor 已提交
397 398
            import paddle

399 400
            x = paddle.to_tensor([1, 2, 3])
            y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
401
            result1 = paddle.not_equal(x, y)
N
Noel 已提交
402
            print(result1)  # result1 = [False True True]
W
wawltor 已提交
403
    """
Z
zhiboniu 已提交
404
    if paddle.in_dynamic_mode():
W
wanghuancoder 已提交
405
        return _C_ops.not_equal(x, y)
406

407 408 409 410
    check_variable_and_dtype(
        x, "x", ["bool", "float32", "float64", "int32", "int64"], "not_equal")
    check_variable_and_dtype(
        y, "y", ["bool", "float32", "float64", "int32", "int64"], "not_equal")
411 412 413 414 415 416 417
    helper = LayerHelper("not_equal", **locals())
    out = helper.create_variable_for_type_inference(dtype='bool')
    out.stop_gradient = True

    helper.append_op(
        type='not_equal', inputs={'X': [x],
                                  'Y': [y]}, outputs={'Out': [out]})
418
    return out
Z
zhulei 已提交
419 420 421 422 423


def is_tensor(x):
    """

C
chentianyu03 已提交
424
    This function tests whether input object is a paddle.Tensor.
Z
zhulei 已提交
425 426 427 428 429

    Args:
        x (object): Object to test.

    Returns:
C
chentianyu03 已提交
430
        A boolean value. True if 'x' is a paddle.Tensor, otherwise False.
Z
zhulei 已提交
431 432 433 434 435 436 437 438 439 440 441 442 443 444 445

    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
            
    """
C
chentianyu03 已提交
446
    return isinstance(x, Tensor)
447 448 449


def _bitwise_op(op_name, x, y, out=None, name=None, binary_op=True):
Z
zhiboniu 已提交
450
    if paddle.in_dynamic_mode():
W
wanghuancoder 已提交
451
        op = getattr(_C_ops, op_name)
452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583
        if binary_op:
            return op(x, y)
        else:
            return op(x)

    check_variable_and_dtype(
        x, "x", ["bool", "uint8", "int8", "int16", "int32", "int64"], op_name)
    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)

    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:
        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})

    return out


@templatedoc()
def bitwise_and(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_and(x, y)
            print(res)  # [0, 2, 1]
    """
    return _bitwise_op(
        op_name="bitwise_and", x=x, y=y, name=name, out=out, binary_op=True)


@templatedoc()
def bitwise_or(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_or(x, y)
            print(res)  # [-1, -1, -3]
    """
    return _bitwise_op(
        op_name="bitwise_or", x=x, y=y, name=name, out=out, binary_op=True)


@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]
    """
    return _bitwise_op(
        op_name="bitwise_xor", x=x, y=y, name=name, out=out, binary_op=True)


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

    Args:
        x(Tensor):  ${x_comment}
        out(Tensor): ${out_comment}
    
    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]
    """

    return _bitwise_op(
        op_name="bitwise_not", x=x, y=None, name=name, out=out, binary_op=False)
A
andyjpaddle 已提交
584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637


@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}.

    Raises:
        TypeError: The data type of ``x`` must be one of float32, float64.
        TypeError: The data type of ``y`` must be one of float32, float64.
        TypeError: The type of ``rtol`` must be float.
        TypeError: The type of ``atol`` must be float.
        TypeError: The type of ``equal_nan`` must be bool.

    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")
          np_result1 = result1.numpy()
          # [True, False]
          result2 = paddle.isclose(x, y, rtol=1e-05, atol=1e-08,
                                      equal_nan=True, name="equal_nan")
          np_result2 = result2.numpy()
          # [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")
          np_result1 = result1.numpy()
          # [True, False]
          result2 = paddle.isclose(x, y, rtol=1e-05, atol=1e-08,
                                      equal_nan=True, name="equal_nan")
          np_result2 = result2.numpy()
          # [True, True]
    """

Z
zhiboniu 已提交
638
    if paddle.in_dynamic_mode():
A
andyjpaddle 已提交
639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657
        return _C_ops.isclose(x, y, 'rtol',
                              str(rtol), 'atol',
                              str(atol), 'equal_nan', equal_nan)

    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}
    helper.append_op(
        type='isclose', inputs=inputs, outputs=outputs, attrs=attrs)
    return out