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


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

    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 已提交
499
        raise ValueError("x shape in {} must be at least 2-D".format(op_type))
W
WuHaobo 已提交
500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522
    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 已提交
523
def tril(x, diagonal=0, name=None):
W
WuHaobo 已提交
524
    """
525 526
	:alias_main: paddle.tril
	:alias: paddle.tril,paddle.tensor.tril,paddle.tensor.creation.tril
S
swtkiwi 已提交
527

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

    Args:
Y
yaoxuefeng 已提交
534
        x (Variable): The input variable x which is a Tensor.
W
WuHaobo 已提交
535 536 537 538 539 540 541 542 543 544 545 546
            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 已提交
547 548
        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 已提交
549 550 551

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

    Examples:
        .. code-block:: python

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

            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 已提交
565 566 567 568 569
            paddle.enable_imperative()

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

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

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

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

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


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

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

    Args:
Y
yaoxuefeng 已提交
605
        x (Variable): The input variable x which is a Tensor.
W
WuHaobo 已提交
606 607 608 609 610 611 612 613 614 615 616 617
            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 已提交
618 619
        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 已提交
620 621 622

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

    Examples:
        .. code-block:: python

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

            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 已提交
635 636

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

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

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

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

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

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


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

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

          input_3 = np.random.randint(0, 100, [100, ]).astype('int32')
          input_4 = np.random.randint(0, 100, [200, ]).astype('int32')
717 718 719
          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 已提交
720 721 722 723 724 725

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

    """

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

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

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

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

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

    return out