Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Hackathon 5th No.49][pir] add some method property - Part 2 #58042

Merged
merged 9 commits into from
Oct 17, 2023
4 changes: 2 additions & 2 deletions python/paddle/base/dygraph/math_op_patch.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ def _index_(var):
return int(np.array(var))

@property
def _ndim_(var):
def _ndim(var):
return len(var.shape)

def ndimension(var):
Expand Down Expand Up @@ -183,7 +183,7 @@ def _T_(var):
('astype', astype),
('dim', dim),
('ndimension', ndimension),
('ndim', _ndim_),
('ndim', _ndim),
('size', _size_),
('T', _T_),
# for logical compare
Expand Down
8 changes: 4 additions & 4 deletions python/paddle/base/layers/math_op_patch.py
Original file line number Diff line number Diff line change
Expand Up @@ -355,7 +355,7 @@ def pop(self, *args):

if self.type != core.VarDesc.VarType.LOD_TENSOR_ARRAY:
raise TypeError(
"Only Variable with VarType.LOD_TENSOR_ARRAY support `append` method, but received type: {}".format(
"Only Variable with VarType.LOD_TENSOR_ARRAY support `pop` method, but received type: {}".format(
self.type
)
)
Expand All @@ -376,7 +376,7 @@ def _neg_(var):
return _scalar_op_(var, -1.0, 0.0)

@property
def _ndim_(self):
def _ndim(self):
"""
Returns the dimension of current Variable

Expand All @@ -393,7 +393,7 @@ def _ndim_(self):
>>> # create a static Variable
>>> x = paddle.static.data(name='x', shape=[3, 2, 1])
>>> # print the dimension of the Variable
>>> print(x.ndim())
>>> print(x.ndim)
3
"""
return len(self.shape)
Expand Down Expand Up @@ -627,7 +627,7 @@ def to_dense(var):
('pop', pop),
('dim', dim),
('ndimension', ndimension),
('ndim', _ndim_),
('ndim', _ndim),
(
'__add__',
_binary_creator_('__add__', 'elementwise_add', False, _scalar_add_),
Expand Down
111 changes: 103 additions & 8 deletions python/paddle/pir/math_op_patch.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,23 @@
# limitations under the License.


import warnings

from paddle.base.libpaddle import DataType

from . import OpResult

_already_patch_opresult = False

_supported_int_dtype_ = [
DataType.BOOL,
DataType.UINT8,
DataType.INT8,
DataType.INT16,
DataType.INT32,
DataType.INT64,
]


def create_tensor_with_batchsize(ref_var, value, dtype):
assert isinstance(ref_var, OpResult)
Expand Down Expand Up @@ -54,14 +65,93 @@ def safe_get_dtype(var):
raise ValueError("Cannot get data type from var")
return dtype

_supported_int_dtype_ = [
DataType.BOOL,
DataType.UINT8,
DataType.INT8,
DataType.INT16,
DataType.INT32,
DataType.INT64,
]
def place(self):
"""
OpResult don't have 'place' interface in static graph mode
But this interface can greatly facilitate dy2static.
So we give a warnning here and return None.
"""
warnings.warn(
"OpResult do not have 'place' interface for pir graph mode, try not to use it. None will be returned."
)

@property
def _ndim(self):
"""
Returns the dimension of current OpResult

Returns:
the dimension

Examples:
.. code-block:: python

>>> import paddle

>>> paddle.enable_static()

>>> # create a static OpResult
>>> x = paddle.static.data(name='x', shape=[3, 2, 1])
>>> # print the dimension of the OpResult
>>> print(x.ndim)
3
"""
return len(self.shape)

def ndimension(self):
"""
Returns the dimension of current OpResult

Returns:
the dimension

Examples:
.. code-block:: python

>>> import paddle

>>> paddle.enable_static()

>>> # create a static OpResult
>>> x = paddle.static.data(name='x', shape=[3, 2, 1])
>>> # print the dimension of the OpResult
>>> print(x.ndimension())
3
"""
return len(self.shape)

def dim(self):
"""
Returns the dimension of current OpResult

Returns:
the dimension

Examples:
.. code-block:: python

>>> import paddle

>>> paddle.enable_static()

>>> # create a static OpResult
>>> x = paddle.static.data(name='x', shape=[3, 2, 1])
>>> # print the dimension of the OpResult
>>> print(x.dim())
3
"""
return len(self.shape)

def _item(self):
"""
In order to be compatible with the item interface introduced by the dynamic graph, it does nothing but returns self.
It will check that the shape must be a 1-D tensor
"""
if len(self.shape) > 1:
raise TypeError(
f"Required input var should be 1-D OpResult, but received {self.shape}"
)
return self

def _scalar_div_(var, value):
return paddle.scale(var, 1.0 / value, 0.0)
Expand Down Expand Up @@ -204,6 +294,11 @@ def astype(self, dtype):
import paddle

opresult_methods = [
('place', place),
('item', _item),
('dim', dim),
('ndimension', ndimension),
('ndim', _ndim),
('astype', astype),
(
'__div__',
Expand Down
30 changes: 30 additions & 0 deletions test/legacy_test/test_math_op_patch_pir.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,43 @@

import inspect
import unittest
import warnings

import paddle

paddle.enable_static()


class TestMathOpPatchesPir(unittest.TestCase):
def test_item(self):
with paddle.pir_utils.IrGuard():
x = paddle.static.data(name='x', shape=[3, 2, 1])
y = paddle.static.data(
name='y',
shape=[
3,
],
)
self.assertTrue(y.item() == y)
with self.assertRaises(TypeError):
x.item()

def test_place(self):
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter("always")
with paddle.pir_utils.IrGuard():
x = paddle.static.data(name='x', shape=[3, 2, 1])
x.place()
self.assertTrue(len(w) == 1)
self.assertTrue("place" in str(w[-1].message))

def test_some_dim(self):
with paddle.pir_utils.IrGuard():
x = paddle.static.data(name='x', shape=[3, 2, 1])
self.assertEqual(x.dim(), 3)
self.assertEqual(x.ndimension(), 3)
self.assertEqual(x.ndim, 3)

def test_math_exists(self):
with paddle.pir_utils.IrGuard():
a = paddle.static.data(name='a', shape=[1], dtype='float32')
Expand Down