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

P
Pei Yang 已提交
15
from __future__ import print_function
L
Li Fuchen 已提交
16
from ..fluid.framework import Variable
P
Pei Yang 已提交
17 18 19 20 21 22
from ..fluid.initializer import Constant
from ..fluid.layers import core
from ..fluid.layer_helper import LayerHelper
from ..fluid.data_feeder import check_variable_and_dtype, check_type, check_dtype, convert_dtype
from ..fluid.framework import convert_np_dtype_to_dtype_, in_dygraph_mode, _varbase_creator, device_guard, OpProtoHolder
from ..fluid.layers import fill_constant
23
from paddle.common_ops_import import *
24
import paddle
W
wangchaochaohu 已提交
25

26
# TODO: define functions to get create a tensor  
27 28 29
from ..fluid.layers import crop_tensor  #DEFINE_ALIAS
from ..fluid.layers import diag  #DEFINE_ALIAS
from ..fluid.layers import fill_constant  #DEFINE_ALIAS
30
from ..fluid.layers import create_tensor  #DEFINE_ALIAS
31
from ..fluid.layers import linspace  #DEFINE_ALIAS
32
import paddle
33

W
wangchaochaohu 已提交
34
__all__ = [
35
    'create_tensor',
36 37 38 39 40 41
    #       'create_lod_tensor',
    #       'create_random_int_lodtensor',
    'crop_tensor',
    'diag',
    'fill_constant',
    #       'get_tensor_from_selected_rows',
42
    'linspace',
43 44 45 46
    'ones',
    'ones_like',
    'zeros',
    'zeros_like',
47
    'arange',
48
    'eye',
W
wangchaochaohu 已提交
49
    'full',
P
Pei Yang 已提交
50
    'full_like',
W
WuHaobo 已提交
51 52
    'triu',
    'tril',
53
    'meshgrid'
W
wangchaochaohu 已提交
54 55 56
]


57
def full_like(x, fill_value, dtype=None, name=None):
P
Pei Yang 已提交
58
    """
59
	:alias_main: paddle.full_like
60
	:alias: paddle.tensor.full_like, paddle.tensor.creation.full_like
S
swtkiwi 已提交
61

62 63
    This function creates a tensor filled with ``fill_value`` which has identical shape of ``x`` and ``dtype``.
    If the ``dtype`` is None, the data type of Tensor is same with ``x``.
64

P
Pei Yang 已提交
65
    Args:
66 67
        x(Tensor): The input tensor which specifies shape and data type. The data type can be bool, float16, float32, float64, int32, int64.
        fill_value(bool|float|int): The value to fill the tensor with. Note: this value shouldn't exceed the range of the output data type.
68 69 70
        dtype(np.dtype|core.VarDesc.VarType|str, optional): The data type of output. The data type can be one
            of bool, float16, float32, float64, int32, int64. The default value is None, which means the output 
            data type is the same as input.
71 72
        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`
    
P
Pei Yang 已提交
73
    Returns:
74
        Tensor: Tensor which is created according to ``x``, ``fill_value`` and ``dtype``.
75
    
76
    Raises:
77 78
        TypeError: The data type of ``x`` must be one of bool, float16, float32, float64, int32, int64.
        TypeError: The ``dtype`` must be one of bool, float16, float32, float64, int32, int64 and None.
79
    
P
Pei Yang 已提交
80 81
    Examples:
        .. code-block:: python
82

P
Pei Yang 已提交
83 84
          import paddle
          import numpy as np
85 86 87
          
          paddle.enable_imperative()  # Now we are in imperative mode 
          input = paddle.full(shape=[2, 3], fill_value=0.0, dtype='float32', name='input')
P
Pei Yang 已提交
88
          output = paddle.full_like(input, 2.0)
89 90
          # [[2. 2. 2.]
          #  [2. 2. 2.]]
P
Pei Yang 已提交
91 92 93
    """

    if dtype is None:
94
        dtype = x.dtype
95
    else:
96 97 98 99 100
        if not isinstance(dtype, core.VarDesc.VarType):
            dtype = convert_np_dtype_to_dtype_(dtype)

    if in_dygraph_mode():
        return core.ops.fill_any_like(x, 'value', fill_value, 'dtype', dtype)
P
Pei Yang 已提交
101

102
    helper = LayerHelper("full_like", **locals())
103 104 105
    check_variable_and_dtype(
        x, 'x', ['bool', 'float16', 'float32', 'float64', 'int32', 'int64'],
        'full_like')
106 107
    check_dtype(dtype, 'dtype',
                ['bool', 'float16', 'float32', 'float64', 'int32', 'int64'],
108
                'full_like/zeros_like/ones_like')
109
    out = helper.create_variable_for_type_inference(dtype=dtype)
110

P
Pei Yang 已提交
111 112
    helper.append_op(
        type='fill_any_like',
113
        inputs={'X': [x]},
114
        attrs={'value': fill_value,
115
               "dtype": dtype},
P
Pei Yang 已提交
116
        outputs={'Out': [out]})
117
    out.stop_gradient = True
P
Pei Yang 已提交
118 119 120
    return out


121
def ones(shape, dtype=None, name=None):
122
    """
123
	:alias_main: paddle.ones
124
	:alias: paddle.tensor.ones, paddle.tensor.creation.ones
S
swtkiwi 已提交
125

126 127 128
    The OP creates a tensor of specified :attr:`shape` and :attr:`dtype`, and fills it with 1.

    Args:
129 130
        shape(tuple|list|Tensor): Shape of the Tensor to be created, the data type of shape is int32 or int64.
        dtype(np.dtype|core.VarDesc.VarType|str, optional): Data type of output Tensor, it supports
131 132 133
            bool, float16, float32, float64, int32 and int64. Default: if None, the data type is 'float32'.
        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`
    
134
    Returns:
135
        Tensor: A tensor of data type :attr:`dtype` with shape :attr:`shape` and all elements set to 1.
136

137
    Raises:
138
        TypeError: The ``dtype`` must be one of bool, float16, float32, float64, int32, int64 and None.
139 140
        TypeError: The ``shape`` must be one of list, tuple and Tensor. The data type of ``shape`` must
            be int32 or int64 when it's a Tensor.
141
    
142 143 144
    Examples:
        .. code-block:: python

145 146 147
          import paddle 
          paddle.enable_imperative()
          
148
          # default dtype for ones OP
149 150 151 152 153 154 155 156 157
          data1 = paddle.ones(shape=[3, 2]) 
          # [[1. 1.]
          #  [1. 1.]
          #  [1. 1.]]
          
          data2 = paddle.ones(shape=[2, 2], dtype='int32') 
          # [[1 1]
          #  [1 1]]
          
158
          # shape is a Tensor
159 160 161 162
          shape = paddle.fill_constant(shape=[2], dtype='int32', value=2)
          data3 = paddle.ones(shape=shape, dtype='int32') 
          # [[1 1]
          #  [1 1]]
163
    """
164 165 166
    if dtype is None:
        dtype = 'float32'
    return fill_constant(value=1.0, shape=shape, dtype=dtype, name=name)
167 168


169
def ones_like(x, dtype=None, name=None):
170
    """
171
	:alias_main: paddle.ones_like
172
	:alias: paddle.tensor.ones_like, paddle.tensor.creation.ones_like
S
swtkiwi 已提交
173

174 175
    This OP returns a Tensor filled with the value 1, with the same shape and
    data type (use ``dtype`` if ``dtype`` is not None) as ``x``.
176 177

    Args:
178 179 180 181 182 183 184 185 186 187
        x(Tensor): The input tensor which specifies shape and dtype. The
            dtype of ``x`` can be bool, float16, float32, float64, int32, int64.
        dtype(str|np.dtype|core.VarDesc.VarType, optional): The data type of the
            output tensor. Supported data types: bool, float16, float32, float64,
            int32, int64. If ``dtype`` is None, the data type is the same as ``x``.
            Default is None.
        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`.

188
    Returns:
189 190 191 192 193 194
        Tensor: A Tensor filled with the value 1, with the same shape and
        data type (use ``dtype`` if ``dtype`` is not None) as ``x``.

    Raise:
        TypeError: If ``dtype`` is not None and is not bool, float16, float32,
            float64, int32 or int64.
195 196 197 198

    Examples:
        .. code-block:: python

199 200
        import paddle
        import numpy as np
201

202
        paddle.enable_imperative()
203

204 205 206
        x = paddle.imperative.to_variable(np.array([1,2,3], dtype='float32'))
        out1 = paddle.zeros_like(x) # [1., 1., 1.]
        out2 = paddle.zeros_like(x, dtype='int32') # [1, 1, 1]
207

208 209
    """
    return full_like(x=x, fill_value=1, dtype=dtype, name=name)
210 211


212
def zeros(shape, dtype=None, name=None):
213
    """
214
	:alias_main: paddle.zeros
215
	:alias: paddle.tensor.zeros, paddle.tensor.creation.zeros
S
swtkiwi 已提交
216

217 218 219
    The OP creates a tensor of specified :attr:`shape` and :attr:`dtype`, and fills it with 0.

    Args:
220 221
        shape(tuple|list|Tensor): Shape of the Tensor to be created, the data type of ``shape`` is int32 or int64.
        dtype(np.dtype|core.VarDesc.VarType|str, optional): Data type of output Tensor, it supports
222 223 224
            bool, float16, float32, float64, int32 and int64. Default: if None, the date type is float32.
        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`.
225 226

    Returns:
227
        Tensor: A tensor of data type :attr:`dtype` with shape :attr:`shape` and all elements set to 0.
228

229
    Raises:
230
        TypeError: The ``dtype`` must be one of bool, float16, float32, float64, int32, int64 and None.
231 232 233
        TypeError: The ``shape`` must be one of list, tuple and Tensor. The data type of ``shape`` must
            be int32 or int64 when it's a Tensor.
    
234 235 236 237
    Examples:
        .. code-block:: python

          import paddle
238 239
          
          paddle.enable_imperative()  # Now we are in imperative mode
240 241 242 243 244 245 246 247 248 249
          data = paddle.zeros(shape=[3, 2], dtype='float32') 
          # [[0. 0.]
          #  [0. 0.]
          #  [0. 0.]]
          data = paddle.zeros(shape=[2, 2]) 
          # [[0. 0.]
          #  [0. 0.]]
          
          # shape is a Tensor
          shape = paddle.fill_constant(shape=[2], dtype='int32', value=2)
250
          data3 = paddle.zeros(shape=shape, dtype='int32') 
251 252
          # [[0 0]
          #  [0 0]]
253
    """
254 255 256
    if dtype is None:
        dtype = 'float32'
    return fill_constant(value=0.0, shape=shape, dtype=dtype, name=name)
257 258


259
def zeros_like(x, dtype=None, name=None):
260
    """
261
	:alias_main: paddle.zeros_like
262
	:alias: paddle.tensor.zeros_like, paddle.tensor.creation.zeros_like
S
swtkiwi 已提交
263

264 265
    This OP returns a Tensor filled with the value 0, with the same shape and
    data type (use ``dtype`` if ``dtype`` is not None) as ``x``.
266 267

    Args:
268 269 270 271 272 273
        x(Tensor): The input tensor which specifies shape and dtype. The
            dtype of ``x`` can be bool, float16, float32, float64, int32, int64.
        dtype(str|np.dtype|core.VarDesc.VarType, optional): The data type of the
            output tensor. Supported data types: bool, float16, float32, float64,
            int32, int64. If ``dtype`` is None, the data type is the same as ``x``.
            Default is None.
274 275 276
        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`.
277 278

    Returns:
279 280
        Tensor: A Tensor filled with the value 0, with the same shape and
        data type (use ``dtype`` if ``dtype`` is not None) as ``x``.
281

282
    Raise:
283 284
        TypeError: If ``dtype`` is not None and is not bool, float16, float32,
            float64, int32 or int64.
285

286 287 288
    Examples:
        .. code-block:: python

289 290
        import paddle
        import numpy as np
291

292
        paddle.enable_imperative()
293

294
        x = paddle.imperative.to_variable(np.array([1,2,3], dtype='float32'))
295 296
        out1 = paddle.zeros_like(x) # [0., 0., 0.]
        out2 = paddle.zeros_like(x, dtype='int32') # [0, 0, 0]
297

298 299
    """
    return full_like(x=x, fill_value=0, dtype=dtype, name=name)
300 301


302
def eye(num_rows, num_columns=None, dtype=None, name=None):
303
    """
304 305 306
	:alias_main: paddle.eye
	:alias: paddle.tensor.eye, paddle.tensor.creation.eye
    
307
    This function constructs 2-D Tensor with ones on the diagonal and zeros elsewhere.
308

309
    Args:
310 311
        num_rows(int): the number of rows in each batch Tensor.
        num_columns(int, optional): the number of columns in each batch Tensor.
312
            If None, default: num_rows.
313
        dtype(np.dtype|core.VarDesc.VarType|str, optional): The data type of the returned Tensor.
314 315
            It should be int32, int64, float16, float32, float64. Default: if None, the data type
            is float32.
316 317
        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`
318

319
    Returns:
320
        Tensor: An identity Tensor or LoDTensor of shape [num_rows, num_columns].
321 322
    
    Raises:
323 324
        TypeError: The ``dtype`` must be one of float16, float32, float64, int32 int64 and None.
        TypeError: The ``num_columns`` must be non-negative int.
325

326 327
    Examples:
        .. code-block:: python
328
          
329
          import paddle
330 331

          paddle.enable_imperative()  # Now we are in imperative mode
332
          data = paddle.eye(3, dtype='int32')
333 334 335
          # [[1 0 0]
          #  [0 1 0]
          #  [0 0 1]]
336
          data = paddle.eye(2, 3, dtype='int32')
337 338
          # [[1 0 0]
          #  [0 1 0]]
339 340
    """

341 342 343
    if dtype is None:
        dtype = 'float32'
    if num_columns is None:
344
        num_columns = num_rows
345 346 347 348 349
    return paddle.fluid.layers.eye(num_rows=num_rows,
                                   num_columns=num_columns,
                                   batch_shape=None,
                                   dtype=dtype,
                                   name=name)
350 351


352
def full(shape, fill_value, dtype=None, name=None):
W
wangchaochaohu 已提交
353
    """
354
	:alias_main: paddle.full
355
	:alias: paddle.tensor.full, paddle.tensor.creation.full
S
swtkiwi 已提交
356

357
    This Op return a Tensor with the ``fill_value`` which size is same as ``shape``.
W
wangchaochaohu 已提交
358 359
    
    Args:
360
        shape(list|tuple|Tensor): Shape of the Tensor to be created.
W
wangchaochaohu 已提交
361 362
                The data type is ``int32`` or ``int64`` . If ``shape`` is a list or tuple,
                the elements of it should be integers or Tensors with shape [1].
363 364 365 366
                If ``shape`` is an Tensor, it should be an 1-D Tensor .
        fill_value(bool|float|int|Tensor): The constant value
            used to initialize the Tensor to be created. If ``fill_value`` is an Tensor, it must be an 1-D Tensor.
        dtype(np.dtype|core.VarDesc.VarType|str, optional): Data type of the output Tensor
W
wangchaochaohu 已提交
367
            which can be float16, float32, float64, int32, int64, if dytpe is `None`, the data
368
            type of created Tensor is `float32`
W
wangchaochaohu 已提交
369 370 371
        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`.
    
372
    Returns:
373
        Tensor: Tensor which is created according to ``shape``, ``fill_value`` and ``dtype``.
374 375

    Raises:
376 377 378
        TypeError: The ``dtype`` must be one of None, bool, float16, float32, float64, int32 and int64.
        TypeError: The ``shape`` must be one of Tensor, list and tuple. The data type of ``shape`` must
            be int32 or int64 when the it's a Tensor
379
    
W
wangchaochaohu 已提交
380 381 382
    Examples:
        .. code-block:: python

383
          import paddle
W
wangchaochaohu 已提交
384

385
          paddle.enable_imperative()  # Now we are in imperative mode
386 387 388
          data1 = paddle.full(shape=[2,1], fill_value=0, dtype='int64') 
          #[[0]
          # [0]]
W
wangchaochaohu 已提交
389

390
          # attr shape is a list which contains Tensor.
391
          positive_2 = paddle.fill_constant([1], "int32", 2)
392 393
          data3 = paddle.full(shape=[1, positive_2], dtype='float32', fill_value=1.5)
          # [[1.5 1.5]]
W
wangchaochaohu 已提交
394

395
          # attr shape is a Tensor.
396 397 398 399
          shape = paddle.fill_constant([2], "int32", 2)
          data4 = paddle.full(shape=shape, dtype='bool', fill_value=True) 
          # [[True True] 
          #  [True True]]
400
          
401
          # attr fill_value is a Tensor.
402 403 404 405
          val = paddle.fill_constant([1], "float32", 2.0)
          data5 = paddle.full(shape=[2,1], fill_value=val, dtype='float32')
          # [[2.0] 
          #  [2.0]]
W
wangchaochaohu 已提交
406 407 408 409 410
    """

    if dtype is None:
        dtype = 'float32'

411
    return fill_constant(shape=shape, dtype=dtype, value=fill_value, name=name)
412 413


414
def arange(start=0, end=None, step=1, dtype=None, name=None):
415
    """
416
	:alias_main: paddle.arange
417
	:alias: paddle.tensor.arange, paddle.tensor.creation.arange
S
swtkiwi 已提交
418

419
    This OP returns a 1-D Tensor with spaced values within a given interval.
420

421 422
    Values are generated into the half-open interval [``start``, ``end``) with
    the ``step``. (the interval including ``start`` but excluding ``end``).
423

424 425
    If ``dtype`` is float32 or float64, we advise adding a small epsilon to
    ``end`` to avoid floating point rounding errors when comparing against ``end``.
426 427

    Parameters:
428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445
        start(float|int|Tensor): Start of interval. The interval includes this
            value. If ``end`` is None, the half-open interval is [0, ``start``).
            If ``start`` is a Tensor, it is a 1-D Tensor with shape [1], with
            data type int32, int64, float32, float64. Default is 0.
        end(float|int|Tensor, optional): End of interval. The interval does not
            include this value. If ``end`` is a Tensor, it is a 1-D Tensor with
            shape [1], with data type int32, int64, float32, float64. If ``end``
            is None, the half-open interval is [0, ``start``). Default is None.
        step(float|int|Tensor, optional): Spacing between values. For any out,
            it is the istance between two adjacent values, out[i+1] - out[i].
            If ``step`` is a Tensor, it is a 1-D Tensor with shape [1], with
            data type int32, int64, float32, float64. Default is 1.
        dtype(str|np.dtype|core.VarDesc.VarType, optional): The data type of the
            output tensor. Supported data types: int32, int64, float32, float64.
            If ``dytpe`` is None, the data type is float32. Default is None.
        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`.
446

447 448 449 450
    Returns: 
        Tensor: A 1-D Tensor with values from the interval [``start``, ``end``)
            taken with common difference ``step`` beginning from ``start``. Its
            data type is set by ``dtype``.
451

452
    Raises:
453
        TypeError: If ``dtype`` is not int32, int64, float32, float64.
454

455 456 457 458
    examples:

        .. code-block:: python

459 460
        import paddle
        import numpy as np
461

462
        paddle.enable_imperative()
463

464 465
        out1 = paddle.arange(5)
        # [0, 1, 2, 3, 4]
466

467 468
        out2 = paddle.arange(3, 9, 2.0)
        # [3, 5, 7]
469

470 471 472
        # use 4.999 instead of 5.0 to avoid floating point rounding errors
        out3 = paddle.arange(4.999, dtype='float32')
        # [0., 1., 2., 3., 4.]
473

474 475 476 477 478 479 480 481 482 483
        start_var = paddle.imperative.to_variable(np.array([3]))
        out4 = paddle.arange(start_var, 7)
        # [3, 4, 5, 6]
             
    """
    if dtype is None:
        dtype = 'int64'
    if end is None:
        end = start
        start = 0
484

485
    return paddle.fluid.layers.range(start, end, step, dtype, name)
W
WuHaobo 已提交
486 487 488 489 490 491


def _tril_triu_op(helper):
    """Base op of tril_op and triu_op
    """
    op_type = helper.layer_type
Y
yaoxuefeng 已提交
492
    x = helper.kwargs.get('x', None)
W
WuHaobo 已提交
493 494 495 496 497

    assert x is not None, 'x cannot be None in {}'.format(op_type)
    check_variable_and_dtype(x, 'x', ['float32', 'float64', 'int32', 'int64'],
                             op_type)
    if len(x.shape) < 2:
Y
yaoxuefeng 已提交
498
        raise ValueError("x shape in {} must be at least 2-D".format(op_type))
W
WuHaobo 已提交
499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521
    diagonal = helper.kwargs.get('diagonal', 0)
    if not isinstance(diagonal, (int, )):
        raise TypeError("diagonal in {} must be a python Int".format(op_type))
    name = helper.kwargs.get('name', None)

    if name is None:
        out = helper.create_variable_for_type_inference(dtype=x.dtype)
    else:
        out = helper.create_variable(
            name=name, dtype=x.dtype, persistable=False)

    helper.append_op(
        type="tril_triu",
        inputs={"X": x},
        attrs={
            "diagonal": diagonal,
            "lower": True if op_type == 'tril' else False,
        },
        outputs={"Out": out}, )

    return out


Y
yaoxuefeng 已提交
522
def tril(x, diagonal=0, name=None):
W
WuHaobo 已提交
523
    """
524 525
	:alias_main: paddle.tril
	:alias: paddle.tril,paddle.tensor.tril,paddle.tensor.creation.tril
S
swtkiwi 已提交
526

W
WuHaobo 已提交
527
    This op returns the lower triangular part of a matrix (2-D tensor) or batch
Y
yaoxuefeng 已提交
528
    of matrices :attr:`x`, the other elements of the result tensor are set 
W
WuHaobo 已提交
529 530 531 532
    to 0. The lower triangular part of the matrix is defined as the elements 
    on and below the diagonal.

    Args:
Y
yaoxuefeng 已提交
533
        x (Variable): The input variable x which is a Tensor.
W
WuHaobo 已提交
534 535 536 537 538 539 540 541 542 543 544 545
            Support data types: ``float64``, ``float32``, ``int32``, ``int64``.
        diagonal (int, optional): The diagonal to consider, default value is 0.
            If :attr:`diagonal` = 0, all elements on and below the main diagonal are
            retained. A positive value includes just as many diagonals above the main
            diagonal, and similarly a negative value excludes just as many diagonals below
            the main diagonal. The main diagonal are the set of indices
            :math:`\{(i, i)\}` for :math:`i \in [0, \min\{d_{1}, d_{2}\} - 1]` where
            :math:`d_{1}, d_{2}` are the dimensions of the matrix.
        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:
Y
yaoxuefeng 已提交
546 547
        Variable: Tensor, results of lower triangular operation by the specified diagonal of input tensor x,
        it's data type is the same as x's Tensor.
W
WuHaobo 已提交
548 549 550

    Raises:
        TypeError: diagonal is not a int type.
Y
yaoxuefeng 已提交
551
        ValueError: dimension of :attr:`x` is less than 2.
W
WuHaobo 已提交
552 553 554 555 556

    Examples:
        .. code-block:: python

            import numpy as np
Y
yaoxuefeng 已提交
557
            import paddle
W
WuHaobo 已提交
558 559 560 561 562 563

            data = np.arange(1, 13, dtype="int64").reshape(3,-1)
            # array([[ 1,  2,  3,  4],
            #        [ 5,  6,  7,  8],
            #        [ 9, 10, 11, 12]])

Y
yaoxuefeng 已提交
564 565 566 567 568
            paddle.enable_imperative()

            x = paddle.imperative.to_variable(data)
            
            tril1 = paddle.tensor.tril(x)
W
WuHaobo 已提交
569 570 571 572 573
            # array([[ 1,  0,  0,  0],
            #        [ 5,  6,  0,  0],
            #        [ 9, 10, 11,  0]])

            # example 2, positive diagonal value
Y
yaoxuefeng 已提交
574
            tril2 = paddle.tensor.tril(x, diagonal=2)
W
WuHaobo 已提交
575 576 577 578 579
            # array([[ 1,  2,  3,  0], 
            #        [ 5,  6,  7,  8],
            #        [ 9, 10, 11, 12]])

            # example 3, negative diagonal value
Y
yaoxuefeng 已提交
580
            tril3 = paddle.tensor.tril(x, diagonal=-1)
W
WuHaobo 已提交
581 582 583 584
            # array([[ 0,  0,  0,  0],
            #        [ 5,  0,  0,  0],
            #        [ 9, 10,  0,  0]])

585 586 587
    """
    if in_dygraph_mode():
        op = getattr(core.ops, 'tril_triu')
Y
yaoxuefeng 已提交
588
        return op(x, 'diagonal', diagonal, "lower", True)
W
WuHaobo 已提交
589 590 591 592

    return _tril_triu_op(LayerHelper('tril', **locals()))


Y
yaoxuefeng 已提交
593
def triu(x, diagonal=0, name=None):
W
WuHaobo 已提交
594
    """
595 596
	:alias_main: paddle.triu
	:alias: paddle.triu,paddle.tensor.triu,paddle.tensor.creation.triu
S
swtkiwi 已提交
597

W
WuHaobo 已提交
598
    This op returns the upper triangular part of a matrix (2-D tensor) or batch of matrices
Y
yaoxuefeng 已提交
599
    :attr:`x`, the other elements of the result tensor are set to 0.
W
WuHaobo 已提交
600 601 602 603
    The upper triangular part of the matrix is defined as the elements on and
    above the diagonal.

    Args:
Y
yaoxuefeng 已提交
604
        x (Variable): The input variable x which is a Tensor.
W
WuHaobo 已提交
605 606 607 608 609 610 611 612 613 614 615 616
            Support data types: ``float64``, ``float32``, ``int32``, ``int64``.
        diagonal (int, optional): The diagonal to consider, default value is 0.
            If :attr:`diagonal` = 0, all elements on and above the main diagonal are
            retained. A positive value excludes just as many diagonals above the main
            diagonal, and similarly a negative value includes just as many diagonals below
            the main diagonal. The main diagonal are the set of indices
            :math:`\{(i, i)\}` for :math:`i \in [0, \min\{d_{1}, d_{2}\} - 1]` where
            :math:`d_{1}, d_{2}` are the dimensions of the matrix.
        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:
Y
yaoxuefeng 已提交
617 618
        Variable: Tensor, results of upper triangular operation by the specified diagonal of input tensor x,
        it's data type is the same as x's Tensor.
W
WuHaobo 已提交
619 620 621

    Raises:
        TypeError: diagonal is not a int type.
Y
yaoxuefeng 已提交
622
        ValueError: dimension of :attr:`x` is less than 2.
W
WuHaobo 已提交
623 624 625 626 627

    Examples:
        .. code-block:: python

            import numpy as np
Y
yaoxuefeng 已提交
628
            import paddle
W
WuHaobo 已提交
629 630 631 632 633

            data = np.arange(1, 13, dtype="int64").reshape(3,-1)
            # array([[ 1,  2,  3,  4],
            #        [ 5,  6,  7,  8],
            #        [ 9, 10, 11, 12]])
Y
yaoxuefeng 已提交
634 635

            paddle.enable_imperative()
W
WuHaobo 已提交
636 637

            # example 1, default diagonal
Y
yaoxuefeng 已提交
638 639
            x = paddle.imperative.to_variable(data)
            triu1 = paddle.tensor.triu(x)
W
WuHaobo 已提交
640 641 642 643 644
            # array([[ 1,  2,  3,  4],
            #        [ 0,  6,  7,  8],
            #        [ 0,  0, 11, 12]])

            # example 2, positive diagonal value
Y
yaoxuefeng 已提交
645
            triu2 = paddle.tensor.triu(x, diagonal=2)
W
WuHaobo 已提交
646 647 648 649 650
            # array([[0, 0, 3, 4],
            #        [0, 0, 0, 8],
            #        [0, 0, 0, 0]])

            # example 3, negative diagonal value
Y
yaoxuefeng 已提交
651
            triu3 = paddle.tensor.triu(x, diagonal=-1)
W
WuHaobo 已提交
652 653 654 655 656
            # array([[ 1,  2,  3,  4],
            #        [ 5,  6,  7,  8],
            #        [ 0, 10, 11, 12]])

    """
657 658
    if in_dygraph_mode():
        op = getattr(core.ops, 'tril_triu')
Y
yaoxuefeng 已提交
659
        return op(x, 'diagonal', diagonal, "lower", False)
W
WuHaobo 已提交
660 661

    return _tril_triu_op(LayerHelper('triu', **locals()))
S
suytingwan 已提交
662 663


664
def meshgrid(*args, **kwargs):
S
suytingwan 已提交
665
    """
666 667
	:alias_main: paddle.meshgrid
	:alias: paddle.meshgrid,paddle.tensor.meshgrid,paddle.tensor.creation.meshgrid
S
swtkiwi 已提交
668

669
    This op takes a list of N tensors as input *args, each of which is 1-dimensional 
S
suytingwan 已提交
670 671 672
    vector, and creates N-dimensional grids.
    
    Args:
673
        *args(Variable|list of Variable) : tensors (tuple(list) of tensor): the shapes of input k tensors are (N1,), 
S
suytingwan 已提交
674
            (N2,),..., (Nk,). Support data types: ``float64``, ``float32``, ``int32``, ``int64``.
675 676
        **kwargs (optional): Currently, we only accept name in **kwargs 
            The default value is None. Normally there is no need for
S
suytingwan 已提交
677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695
            user to set this property. For more information, please refer to :ref:`api_guide_Name`.
 
    Returns:
         Variable: k tensors. The shape of each tensor is (N1, N2, ..., Nk)

    Examples:
      .. code-block:: python

          import paddle
          import paddle.fluid as fluid
          import numpy as np

          x = fluid.data(name='x', shape=[100], dtype='int32')
          y = fluid.data(name='y', shape=[200], dtype='int32')

          input_1 = np.random.randint(0, 100, [100, ]).astype('int32')
          input_2 = np.random.randint(0, 100, [200, ]).astype('int32')

          exe = fluid.Executor(place=fluid.CPUPlace())
696
          grid_x, grid_y = paddle.tensor.meshgrid(x, y)
S
suytingwan 已提交
697 698 699 700 701 702 703 704 705 706 707 708 709 710
          res_1, res_2 = exe.run(fluid.default_main_program(),
                                 feed={'x': input_1,
                                       'y': input_2},
                                 fetch_list=[grid_x, grid_y])
     
          #the shape of res_1 is (100, 200)
          #the shape of res_2 is (100, 200)

      .. code-block:: python

          #example 2: in dygraph mode

          import paddle
          import numpy as np
711 712
          
          paddle.enable_imperative()
S
suytingwan 已提交
713 714 715

          input_3 = np.random.randint(0, 100, [100, ]).astype('int32')
          input_4 = np.random.randint(0, 100, [200, ]).astype('int32')
716 717 718
          tensor_3 = paddle.imperative.to_variable(input_3)
          tensor_4 = paddle.imperative.to_variable(input_4)
          grid_x, grid_y = paddle.tensor.meshgrid(tensor_3, tensor_4)
S
suytingwan 已提交
719 720 721 722 723 724

          #the shape of grid_x is (100, 200)
          #the shape of grid_y is (100, 200)

    """

725 726
    if len(args) == 1 and isinstance(args[0], (list, tuple)):
        args = args[0]
S
suytingwan 已提交
727
    if in_dygraph_mode():
728 729
        num = len(args)
        out = core.ops.meshgrid(list(args), num)
S
suytingwan 已提交
730 731
        return out

732
    name = kwargs.get("name", None)
S
suytingwan 已提交
733 734
    helper = LayerHelper('meshgrid', **locals())

735 736
    if not isinstance(args, (list, tuple)):
        raise TypeError("The type of input args in meshgrid should be list.")
S
suytingwan 已提交
737

738
    for id, input_ in enumerate(args):
S
suytingwan 已提交
739 740 741 742
        check_dtype(input_.dtype, 'create data type',
                    ['float16', 'float32', 'float64', 'int32', 'int64'],
                    'meshgrid')

743
    num = len(args)
S
suytingwan 已提交
744
    out = [
745
        helper.create_variable_for_type_inference(dtype=args[i].dtype)
S
suytingwan 已提交
746 747
        for i in range(num)
    ]
748 749
    helper.append_op(
        type='meshgrid', inputs={'X': list(args)}, outputs={'Out': out})
S
suytingwan 已提交
750 751

    return out