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

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
W
wawltor 已提交
18
from .. import fluid
19
from ..fluid.framework import in_dygraph_mode
Z
zhulei 已提交
20
from ..framework import VarBase as Tensor
21

22
# TODO: define logic functions of a tensor  
23 24 25 26 27 28 29
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

from paddle.common_ops_import import core
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
    """
62 63
    if in_dygraph_mode():
        return core.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
    """

125
    if in_dygraph_mode():
126 127 128
        return core.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
    if in_dygraph_mode():
        return core.ops.equal(x, y)

179 180 181 182
    check_variable_and_dtype(
        x, "x", ["bool", "float32", "float64", "int32", "int64"], "equal")
    check_variable_and_dtype(
        y, "y", ["bool", "float32", "float64", "int32", "int64"], "equal")
183 184 185 186 187 188 189
    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 已提交
190
    return out
191

W
wawltor 已提交
192 193 194 195 196

@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 已提交
197

W
wawltor 已提交
198 199 200
    **NOTICE**: The output of this OP has no gradient.

    Args:
201 202
        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 已提交
203 204 205 206 207 208 209
        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 已提交
210

W
wawltor 已提交
211 212
            import paddle

213 214
            x = paddle.to_tensor([1, 2, 3])
            y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
215
            result1 = paddle.greater_equal(x, y)
N
Noel 已提交
216
            print(result1)  # result1 = [True False True]
W
wawltor 已提交
217
    """
218 219 220
    if in_dygraph_mode():
        return core.ops.greater_equal(x, y)

221 222
    check_variable_and_dtype(x, "x",
                             ["bool", "float32", "float64", "int32", "int64"],
223
                             "greater_equal")
224 225
    check_variable_and_dtype(y, "y",
                             ["bool", "float32", "float64", "int32", "int64"],
226 227 228 229 230 231 232 233 234 235
                             "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 已提交
236 237 238 239 240 241 242
    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 已提交
243

W
wawltor 已提交
244 245 246
    **NOTICE**: The output of this OP has no gradient.

    Args:
247 248
        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 已提交
249 250 251 252 253 254 255
        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 已提交
256

W
wawltor 已提交
257 258
            import paddle

259 260
            x = paddle.to_tensor([1, 2, 3])
            y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
261
            result1 = paddle.greater_than(x, y)
N
Noel 已提交
262
            print(result1)  # result1 = [False False True]
W
wawltor 已提交
263
    """
264 265 266
    if in_dygraph_mode():
        return core.ops.greater_than(x, y)

267 268
    check_variable_and_dtype(x, "x",
                             ["bool", "float32", "float64", "int32", "int64"],
269
                             "greater_than")
270 271
    check_variable_and_dtype(y, "y",
                             ["bool", "float32", "float64", "int32", "int64"],
272 273 274 275 276 277 278 279 280 281
                             "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 已提交
282 283 284 285 286 287 288
    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 已提交
289

W
wawltor 已提交
290 291 292
    **NOTICE**: The output of this OP has no gradient.

    Args:
293 294
        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 已提交
295 296 297 298 299 300 301 302
        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 已提交
303

W
wawltor 已提交
304 305
            import paddle

306 307
            x = paddle.to_tensor([1, 2, 3])
            y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
308
            result1 = paddle.less_equal(x, y)
N
Noel 已提交
309
            print(result1)  # result1 = [True True False]
W
wawltor 已提交
310
    """
311 312 313
    if in_dygraph_mode():
        return core.ops.less_equal(x, y)

314 315 316 317
    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")
318 319 320 321 322 323 324
    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 已提交
325 326 327 328 329 330 331
    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 已提交
332

W
wawltor 已提交
333 334 335
    **NOTICE**: The output of this OP has no gradient.

    Args:
336 337
        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 已提交
338 339 340 341 342 343 344 345
        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 已提交
346

W
wawltor 已提交
347 348
            import paddle

349 350
            x = paddle.to_tensor([1, 2, 3])
            y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
351
            result1 = paddle.less_than(x, y)
N
Noel 已提交
352
            print(result1)  # result1 = [False True False]
W
wawltor 已提交
353
    """
354 355 356
    if in_dygraph_mode():
        return core.ops.less_than(x, y)

357 358 359 360
    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")
361 362 363 364 365 366 367
    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 已提交
368 369 370 371 372 373 374
    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 已提交
375
    
W
wawltor 已提交
376 377 378
    **NOTICE**: The output of this OP has no gradient.

    Args:
379 380
        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 已提交
381 382 383 384 385 386 387 388
        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
389

W
wawltor 已提交
390 391
            import paddle

392 393
            x = paddle.to_tensor([1, 2, 3])
            y = paddle.to_tensor([1, 3, 2])
W
wawltor 已提交
394
            result1 = paddle.not_equal(x, y)
N
Noel 已提交
395
            print(result1)  # result1 = [False True True]
W
wawltor 已提交
396
    """
397 398 399
    if in_dygraph_mode():
        return core.ops.not_equal(x, y)

400 401 402 403
    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")
404 405 406 407 408 409 410
    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]})
411
    return out
Z
zhulei 已提交
412 413 414 415 416


def is_tensor(x):
    """

C
chentianyu03 已提交
417
    This function tests whether input object is a paddle.Tensor.
Z
zhulei 已提交
418 419 420 421 422

    Args:
        x (object): Object to test.

    Returns:
C
chentianyu03 已提交
423
        A boolean value. True if 'x' is a paddle.Tensor, otherwise False.
Z
zhulei 已提交
424 425 426 427 428 429 430 431 432 433 434 435 436 437 438

    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 已提交
439
    return isinstance(x, Tensor)