creation.py 29.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 42
    #       'create_lod_tensor',
    #       'create_random_int_lodtensor',
    'crop_tensor',
    'diag',
    'eye',
    'fill_constant',
    #       'get_tensor_from_selected_rows',
43
    'linspace',
44 45 46 47
    'ones',
    'ones_like',
    'zeros',
    'zeros_like',
48
    'arange',
49
    'eye',
W
wangchaochaohu 已提交
50
    'full',
P
Pei Yang 已提交
51
    'full_like',
W
WuHaobo 已提交
52 53
    'triu',
    'tril',
54
    'meshgrid'
W
wangchaochaohu 已提交
55 56 57
]


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

63 64
    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``.
65

P
Pei Yang 已提交
66
    Args:
67 68
        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.
69 70 71
        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.
72 73
        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 已提交
74
    Returns:
75
        Tensor: Tensor which is created according to ``x``, ``fill_value`` and ``dtype``.
76
    
77
    Raises:
78 79
        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.
80
    
P
Pei Yang 已提交
81 82
    Examples:
        .. code-block:: python
83

P
Pei Yang 已提交
84 85
          import paddle
          import numpy as np
86 87 88
          
          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 已提交
89
          output = paddle.full_like(input, 2.0)
90 91
          # [[2. 2. 2.]
          #  [2. 2. 2.]]
P
Pei Yang 已提交
92 93 94
    """

    if dtype is None:
95
        dtype = x.dtype
96
    else:
97 98 99 100 101
        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 已提交
102

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

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


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

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

    Args:
130 131
        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
132 133 134
            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`
    
135
    Returns:
136
        Tensor: A tensor of data type :attr:`dtype` with shape :attr:`shape` and all elements set to 1.
137

138
    Raises:
139
        TypeError: The ``dtype`` must be one of bool, float16, float32, float64, int32, int64 and None.
140 141
        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.
142
    
143 144 145
    Examples:
        .. code-block:: python

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


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

175 176
    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``.
177 178

    Args:
179 180 181 182 183 184 185 186 187 188
        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`.

189
    Returns:
190 191 192 193 194 195
        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.
196 197 198 199

    Examples:
        .. code-block:: python

200 201
        import paddle
        import numpy as np
202

203
        paddle.enable_imperative()
204

205 206 207
        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]
208

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


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

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

    Args:
221 222
        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
223 224 225
            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`.
226 227

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

230
    Raises:
231
        TypeError: The ``dtype`` must be one of bool, float16, float32, float64, int32, int64 and None.
232 233 234
        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.
    
235 236 237 238
    Examples:
        .. code-block:: python

          import paddle
239 240
          
          paddle.enable_imperative()  # Now we are in imperative mode
241 242 243 244 245 246 247 248 249 250 251 252 253
          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)
          data3 = paddle.ones(shape=shape, dtype='int32') 
          # [[0 0]
          #  [0 0]]
254
    """
255 256 257
    if dtype is None:
        dtype = 'float32'
    return fill_constant(value=0.0, shape=shape, dtype=dtype, name=name)
258 259


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

265 266
    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``.
267 268

    Args:
269 270 271 272 273 274
        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.
275 276 277
        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`.
278 279

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

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

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

290 291
        import paddle
        import numpy as np
292

293
        paddle.enable_imperative()
294

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

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


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

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

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

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

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

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


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

358
    This Op return a Tensor with the ``fill_value`` which size is same as ``shape``.
W
wangchaochaohu 已提交
359 360
    
    Args:
361
        shape(list|tuple|Tensor): Shape of the Tensor to be created.
W
wangchaochaohu 已提交
362 363
                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].
364 365 366 367
                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 已提交
368
            which can be float16, float32, float64, int32, int64, if dytpe is `None`, the data
369
            type of created Tensor is `float32`
W
wangchaochaohu 已提交
370 371 372
        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`.
    
373
    Returns:
374
        Tensor: Tensor which is created according to ``shape``, ``fill_value`` and ``dtype``.
375 376

    Raises:
377 378 379
        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
380
    
W
wangchaochaohu 已提交
381 382 383
    Examples:
        .. code-block:: python

384
          import paddle
W
wangchaochaohu 已提交
385

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

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

396
          # attr shape is a Tensor.
397 398 399 400
          shape = paddle.fill_constant([2], "int32", 2)
          data4 = paddle.full(shape=shape, dtype='bool', fill_value=True) 
          # [[True True] 
          #  [True True]]
401
          
402
          # attr fill_value is a Tensor.
403 404 405 406
          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 已提交
407 408 409 410 411
    """

    if dtype is None:
        dtype = 'float32'

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


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

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

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

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

    Parameters:
429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446
        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`.
447

448 449 450 451
    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``.
452

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

456 457 458 459
    examples:

        .. code-block:: python

460 461
        import paddle
        import numpy as np
462

463
        paddle.enable_imperative()
464

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

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

471 472 473
        # 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.]
474

475 476 477 478 479 480 481 482 483 484
        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
485

486
    return paddle.fluid.layers.range(start, end, step, dtype, name)
W
WuHaobo 已提交
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


def _tril_triu_op(helper):
    """Base op of tril_op and triu_op
    """
    op_type = helper.layer_type
    x = helper.kwargs.get('input', None)

    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:
        raise ValueError("input shape in {} must be at least 2-D".format(
            op_type))
    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


def tril(input, diagonal=0, name=None):
    """
526 527
	:alias_main: paddle.tril
	:alias: paddle.tril,paddle.tensor.tril,paddle.tensor.creation.tril
S
swtkiwi 已提交
528

W
WuHaobo 已提交
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 584 585 586 587 588 589 590 591 592
    This op returns the lower triangular part of a matrix (2-D tensor) or batch
    of matrices :attr:`input`, the other elements of the result tensor are set 
    to 0. The lower triangular part of the matrix is defined as the elements 
    on and below the diagonal.

    Args:
        input (Variable): The input variable which is a Tensor.
            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:
        Variable: Tensor, results of lower triangular operation by the specified diagonal of input tensor,
        it's data type is the same as input's Tensor.

    Raises:
        TypeError: diagonal is not a int type.
        ValueError: dimension of :attr:`input` is less than 2.

    Examples:
        .. code-block:: python

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

            data = np.arange(1, 13, dtype="int64").reshape(3,-1)
            # array([[ 1,  2,  3,  4],
            #        [ 5,  6,  7,  8],
            #        [ 9, 10, 11, 12]])
            x = fluid.data(shape=(-1, 4), dtype='int64', name='x')
            exe = fluid.Executor(fluid.CPUPlace())

            # example 1, default diagonal
            tril = tensor.tril(x)
            tril_out, = exe.run(fluid.default_main_program(), feed={"x": data},
                fetch_list=[tril], return_numpy=True)
            # array([[ 1,  0,  0,  0],
            #        [ 5,  6,  0,  0],
            #        [ 9, 10, 11,  0]])

            # example 2, positive diagonal value
            tril = tensor.tril(x, diagonal=2)
            tril_out, = exe.run(fluid.default_main_program(), feed={"x": data},
                fetch_list=[tril], return_numpy=True)
            # array([[ 1,  2,  3,  0], 
            #        [ 5,  6,  7,  8],
            #        [ 9, 10, 11, 12]])

            # example 3, negative diagonal value
            tril = tensor.tril(x, diagonal=-1)
            tril_out, = exe.run(fluid.default_main_program(), feed={"x": data},
                fetch_list=[tril], return_numpy=True)
            # array([[ 0,  0,  0,  0],
            #        [ 5,  0,  0,  0],
            #        [ 9, 10,  0,  0]])

593 594 595 596
    """
    if in_dygraph_mode():
        op = getattr(core.ops, 'tril_triu')
        return op(input, 'diagonal', diagonal, "lower", True)
W
WuHaobo 已提交
597 598 599 600 601 602

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


def triu(input, diagonal=0, name=None):
    """
603 604
	:alias_main: paddle.triu
	:alias: paddle.triu,paddle.tensor.triu,paddle.tensor.creation.triu
S
swtkiwi 已提交
605

W
WuHaobo 已提交
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 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670
    This op returns the upper triangular part of a matrix (2-D tensor) or batch of matrices
    :attr:`input`, the other elements of the result tensor are set to 0.
    The upper triangular part of the matrix is defined as the elements on and
    above the diagonal.

    Args:
        input (Variable): The input variable which is a Tensor.
            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:
        Variable: Tensor, results of upper triangular operation by the specified diagonal of input tensor,
        it's data type is the same as input's Tensor.

    Raises:
        TypeError: diagonal is not a int type.
        ValueError: dimension of :attr:`input` is less than 2.

    Examples:
        .. code-block:: python

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

            data = np.arange(1, 13, dtype="int64").reshape(3,-1)
            # array([[ 1,  2,  3,  4],
            #        [ 5,  6,  7,  8],
            #        [ 9, 10, 11, 12]])
            x = fluid.data(shape=(-1, 4), dtype='int64', name='x')
            exe = fluid.Executor(fluid.CPUPlace())

            # example 1, default diagonal
            triu = tensor.triu(x)
            triu_out, = exe.run(fluid.default_main_program(), feed={"x": data},
                fetch_list=[triu], return_numpy=True)
            # array([[ 1,  2,  3,  4],
            #        [ 0,  6,  7,  8],
            #        [ 0,  0, 11, 12]])

            # example 2, positive diagonal value
            triu = tensor.triu(x, diagonal=2)
            triu_out, = exe.run(fluid.default_main_program(), feed={"x": data},
                fetch_list=[triu], return_numpy=True)
            # array([[0, 0, 3, 4],
            #        [0, 0, 0, 8],
            #        [0, 0, 0, 0]])

            # example 3, negative diagonal value
            triu = tensor.triu(x, diagonal=-1)
            triu_out, = exe.run(fluid.default_main_program(), feed={"x": data},
                fetch_list=[triu], return_numpy=True)
            # array([[ 1,  2,  3,  4],
            #        [ 5,  6,  7,  8],
            #        [ 0, 10, 11, 12]])

    """
671 672 673
    if in_dygraph_mode():
        op = getattr(core.ops, 'tril_triu')
        return op(input, 'diagonal', diagonal, "lower", False)
W
WuHaobo 已提交
674 675

    return _tril_triu_op(LayerHelper('triu', **locals()))
S
suytingwan 已提交
676 677


678
def meshgrid(*args, **kwargs):
S
suytingwan 已提交
679
    """
680 681
	:alias_main: paddle.meshgrid
	:alias: paddle.meshgrid,paddle.tensor.meshgrid,paddle.tensor.creation.meshgrid
S
swtkiwi 已提交
682

683
    This op takes a list of N tensors as input *args, each of which is 1-dimensional 
S
suytingwan 已提交
684 685 686
    vector, and creates N-dimensional grids.
    
    Args:
687
        *args(Variable|list of Variable) : tensors (tuple(list) of tensor): the shapes of input k tensors are (N1,), 
S
suytingwan 已提交
688
            (N2,),..., (Nk,). Support data types: ``float64``, ``float32``, ``int32``, ``int64``.
689 690
        **kwargs (optional): Currently, we only accept name in **kwargs 
            The default value is None. Normally there is no need for
S
suytingwan 已提交
691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709
            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())
710
          grid_x, grid_y = paddle.tensor.meshgrid(x, y)
S
suytingwan 已提交
711 712 713 714 715 716 717 718 719 720 721 722 723 724
          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
725 726
          
          paddle.enable_imperative()
S
suytingwan 已提交
727 728 729

          input_3 = np.random.randint(0, 100, [100, ]).astype('int32')
          input_4 = np.random.randint(0, 100, [200, ]).astype('int32')
730 731 732
          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 已提交
733 734 735 736 737 738

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

    """

739 740
    if len(args) == 1 and isinstance(args[0], (list, tuple)):
        args = args[0]
S
suytingwan 已提交
741
    if in_dygraph_mode():
742 743
        num = len(args)
        out = core.ops.meshgrid(list(args), num)
S
suytingwan 已提交
744 745
        return out

746
    name = kwargs.get("name", None)
S
suytingwan 已提交
747 748
    helper = LayerHelper('meshgrid', **locals())

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

752
    for id, input_ in enumerate(args):
S
suytingwan 已提交
753 754 755 756
        check_dtype(input_.dtype, 'create data type',
                    ['float16', 'float32', 'float64', 'int32', 'int64'],
                    'meshgrid')

757
    num = len(args)
S
suytingwan 已提交
758
    out = [
759
        helper.create_variable_for_type_inference(dtype=args[i].dtype)
S
suytingwan 已提交
760 761
        for i in range(num)
    ]
762 763
    helper.append_op(
        type='meshgrid', inputs={'X': list(args)}, outputs={'Out': out})
S
suytingwan 已提交
764 765

    return out