diff --git a/paconvert/api_mapping.json b/paconvert/api_mapping.json index 2b4e144f8..3ed36fc8a 100644 --- a/paconvert/api_mapping.json +++ b/paconvert/api_mapping.json @@ -600,22 +600,7 @@ "Matcher": "ChangePrefixMatcher" }, "torch.Tensor.backward": { - "Matcher": "GenericMatcher", - "paddle_api": "paddle.Tensor.backward", - "min_input_args": 0, - "args_list": [ - "gradient", - "retain_graph", - "create_graph", - "inputs" - ], - "kwargs_change": { - "gradient": "grad_tensor" - }, - "unsupport_args": [ - "create_graph", - "inputs" - ] + "Matcher": "ChangePrefixMatcher" }, "torch.Tensor.baddbmm": { "Matcher": "ChangePrefixMatcher" @@ -1689,9 +1674,7 @@ "Matcher": "ChangePrefixMatcher" }, "torch.Tensor.movedim": { - "Matcher": "ChangeAPIMatcher", - "paddle_api": "paddle.Tensor.moveaxis", - "min_input_args": 2 + "Matcher": "ChangePrefixMatcher" }, "torch.Tensor.msort": { "Matcher": "ChangePrefixMatcher" @@ -1731,18 +1714,7 @@ "Matcher": "ChangePrefixMatcher" }, "torch.Tensor.nanmean": { - "Matcher": "GenericMatcher", - "paddle_api": "paddle.Tensor.nanmean", - "min_input_args": 0, - "args_list": [ - "dim", - "keepdim", - "*", - "dtype" - ], - "kwargs_change": { - "dim": "axis" - } + "Matcher": "ChangePrefixMatcher" }, "torch.Tensor.nanmedian": { "Matcher": "GenericMatcher", @@ -1763,19 +1735,7 @@ "Matcher": "ChangePrefixMatcher" }, "torch.Tensor.nansum": { - "Matcher": "GenericMatcher", - "paddle_api": "paddle.Tensor.nansum", - "min_input_args": 0, - "args_list": [ - "dim", - "keepdim", - "*", - "dtype" - ], - "kwargs_change": { - "dim": "axis", - "dtype": "dtype" - } + "Matcher": "ChangePrefixMatcher" }, "torch.Tensor.narrow": { "Matcher": "ChangePrefixMatcher" @@ -3604,17 +3564,7 @@ "Matcher": "ChangePrefixMatcher" }, "torch.clone": { - "Matcher": "GenericMatcher", - "paddle_api": "paddle.clone", - "min_input_args": 1, - "args_list": [ - "input", - "*", - "memory_format" - ], - "kwargs_change": { - "input": "x" - } + "Matcher": "ChangePrefixMatcher" }, "torch.column_stack": { "Matcher": "GenericMatcher", @@ -5679,8 +5629,7 @@ ] }, "torch.initial_seed": { - "Matcher": "SeedMatcher", - "min_input_args": 0 + "Matcher": "ChangePrefixMatcher" }, "torch.inner": { "Matcher": "ChangePrefixMatcher" @@ -6586,17 +6535,7 @@ } }, "torch.movedim": { - "Matcher": "GenericMatcher", - "paddle_api": "paddle.moveaxis", - "min_input_args": 3, - "args_list": [ - "input", - "source", - "destination" - ], - "kwargs_change": { - "input": "x" - } + "Matcher": "ChangePrefixMatcher" }, "torch.msort": { "Matcher": "ChangePrefixMatcher" @@ -6668,21 +6607,7 @@ } }, "torch.nanmean": { - "Matcher": "GenericMatcher", - "paddle_api": "paddle.nanmean", - "min_input_args": 1, - "args_list": [ - "input", - "dim", - "keepdim", - "*", - "dtype", - "out" - ], - "kwargs_change": { - "input": "x", - "dim": "axis" - } + "Matcher": "ChangePrefixMatcher" }, "torch.nanmedian": { "Matcher": "ChangeAPIMatcher", @@ -6692,22 +6617,7 @@ "Matcher": "ChangePrefixMatcher" }, "torch.nansum": { - "Matcher": "GenericMatcher", - "paddle_api": "paddle.nansum", - "min_input_args": 1, - "args_list": [ - "input", - "dim", - "keepdim", - "*", - "dtype", - "out" - ], - "kwargs_change": { - "input": "x", - "dim": "axis", - "dtype": "dtype" - } + "Matcher": "ChangePrefixMatcher" }, "torch.narrow": { "Matcher": "ChangePrefixMatcher" @@ -9248,6 +9158,9 @@ "torch.nn.init.orthogonal_": { "Matcher": "ChangePrefixMatcher" }, + "torch.nn.init.sparse_": { + "Matcher": "ChangePrefixMatcher" + }, "torch.nn.init.trunc_normal_": { "Matcher": "ChangePrefixMatcher" }, @@ -9931,29 +9844,10 @@ ] }, "torch.optim.lr_scheduler.CosineAnnealingLR": { - "Matcher": "Optim2LrSchedulerMatcher", - "paddle_api": "paddle.optimizer.lr.CosineAnnealingDecay", - "min_input_args": 2, - "args_list": [ - "optimizer", - "T_max", - "eta_min", - "last_epoch", - "verbose" - ] + "Matcher": "ChangePrefixMatcher" }, "torch.optim.lr_scheduler.CosineAnnealingWarmRestarts": { - "Matcher": "Optim2LrSchedulerMatcher", - "paddle_api": "paddle.optimizer.lr.CosineAnnealingWarmRestarts", - "min_input_args": 2, - "args_list": [ - "optimizer", - "T_0", - "T_mult", - "eta_min", - "last_epoch", - "verbose" - ] + "Matcher": "ChangePrefixMatcher" }, "torch.optim.lr_scheduler.CyclicLR": { "Matcher": "LRSchedulerMatcher", @@ -9990,15 +9884,7 @@ } }, "torch.optim.lr_scheduler.ExponentialLR": { - "Matcher": "Optim2LrSchedulerMatcher", - "paddle_api": "paddle.optimizer.lr.ExponentialDecay", - "min_input_args": 2, - "args_list": [ - "optimizer", - "gamma", - "last_epoch", - "verbose" - ] + "Matcher": "ChangePrefixMatcher" }, "torch.optim.lr_scheduler.LambdaLR": { "Matcher": "Optim2LrSchedulerMatcher", @@ -10031,16 +9917,7 @@ } }, "torch.optim.lr_scheduler.MultiStepLR": { - "Matcher": "Optim2LrSchedulerMatcher", - "paddle_api": "paddle.optimizer.lr.MultiStepDecay", - "min_input_args": 2, - "args_list": [ - "optimizer", - "milestones", - "gamma", - "last_epoch", - "verbose" - ] + "Matcher": "ChangePrefixMatcher" }, "torch.optim.lr_scheduler.MultiplicativeLR": { "Matcher": "Optim2LrSchedulerMatcher", @@ -10086,36 +9963,10 @@ ] }, "torch.optim.lr_scheduler.ReduceLROnPlateau": { - "Matcher": "Optim2LrSchedulerMatcher", - "paddle_api": "paddle.optimizer.lr.ReduceOnPlateau", - "min_input_args": 1, - "args_list": [ - "optimizer", - "mode", - "factor", - "patience", - "threshold", - "threshold_mode", - "cooldown", - "min_lr", - "eps", - "verbose" - ], - "kwargs_change": { - "eps": "epsilon" - } + "Matcher": "ChangePrefixMatcher" }, "torch.optim.lr_scheduler.StepLR": { - "Matcher": "Optim2LrSchedulerMatcher", - "paddle_api": "paddle.optimizer.lr.StepDecay", - "min_input_args": 2, - "args_list": [ - "optimizer", - "step_size", - "gamma", - "last_epoch", - "verbose" - ] + "Matcher": "ChangePrefixMatcher" }, "torch.ormqr": { "Matcher": "GenericMatcher", @@ -10527,15 +10378,7 @@ } }, "torch.set_rng_state": { - "Matcher": "GenericMatcher", - "paddle_api": "paddle.set_rng_state", - "min_input_args": 1, - "args_list": [ - "new_state" - ], - "kwargs_change": { - "new_state": "state_list" - } + "Matcher": "ChangePrefixMatcher" }, "torch.sgn": { "Matcher": "GenericMatcher", @@ -11679,12 +11522,7 @@ ] }, "torch.utils.data.TensorDataset": { - "Matcher": "TensorDatasetMatcher", - "paddle_api": "paddle.io.TensorDataset", - "min_input_args": 1, - "args_list": [ - "*tensors" - ] + "Matcher": "ChangePrefixMatcher" }, "torch.utils.data.WeightedRandomSampler": { "Matcher": "GenericMatcher", diff --git a/paconvert/api_matcher.py b/paconvert/api_matcher.py index ee78d4282..ad52765e8 100644 --- a/paconvert/api_matcher.py +++ b/paconvert/api_matcher.py @@ -566,13 +566,6 @@ def generate_code(self, kwargs): return code -class TensorNbytesMatcher(BaseMatcher): - def get_paddle_class_attribute_nodes(self, node): - self.parse_func(node) - code = "{}.size * {}.element_size()".format(self.paddleClass, self.paddleClass) - return ast.parse(code).body - - class DimOrderMatcher(BaseMatcher): def generate_code(self, kwargs): API_TEMPLATE = textwrap.dedent( diff --git a/paconvert/attribute_mapping.json b/paconvert/attribute_mapping.json index 96d4603b8..6f5b9b73b 100644 --- a/paconvert/attribute_mapping.json +++ b/paconvert/attribute_mapping.json @@ -51,7 +51,7 @@ }, "torch.Tensor.names": {}, "torch.Tensor.nbytes": { - "Matcher": "TensorNbytesMatcher" + "Matcher": "ChangePrefixMatcher" }, "torch.Tensor.ndim": { "Matcher": "ChangePrefixMatcher" diff --git a/tests/test_Tensor_backward.py b/tests/test_Tensor_backward.py index 6fc247466..42a2c1df5 100644 --- a/tests/test_Tensor_backward.py +++ b/tests/test_Tensor_backward.py @@ -90,3 +90,18 @@ def test_case_5(): """ ) obj.run(pytorch_code, ["result"]) + + +def test_case_6(): + # Create graph=True + pytorch_code = textwrap.dedent( + """ + import torch + a = torch.tensor([1., 2., 3.], requires_grad=True) + out = a ** 2 + out.sum().backward(create_graph=True) + a.grad = torch.tensor(a.grad, requires_grad=True) + result = a.grad + """ + ) + obj.run(pytorch_code, ["result"]) diff --git a/tests/test_Tensor_nanmean.py b/tests/test_Tensor_nanmean.py index 02990932d..9debcebc6 100644 --- a/tests/test_Tensor_nanmean.py +++ b/tests/test_Tensor_nanmean.py @@ -81,7 +81,7 @@ def test_case_6(): import torch input = torch.tensor([[1, 2], [3., float("nan")]]) dim, keepdim = 1, False - result = input.nanmean(dim, keepdim=keepdim) + result = input.nanmean(dtype=torch.float64) """ ) obj.run(pytorch_code, ["result"]) diff --git a/tests/test_nn_init_sparse_.py b/tests/test_nn_init_sparse_.py new file mode 100644 index 000000000..d2caf0c3d --- /dev/null +++ b/tests/test_nn_init_sparse_.py @@ -0,0 +1,79 @@ +# Copyright (c) 2026 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. + +import textwrap + +from apibase import APIBase + +obj = APIBase("torch.nn.init.sparse_") + + +def test_case_1(): + pytorch_code = textwrap.dedent( + """ + import torch + tensor = torch.empty(3, 5) + torch.nn.init.sparse_(tensor, sparsity=0.1, std=0.01) + result = tensor + """ + ) + obj.run(pytorch_code, ["result"], check_value=False) + + +def test_case_2(): + pytorch_code = textwrap.dedent( + """ + import torch + tensor = torch.empty(4, 6) + torch.nn.init.sparse_(tensor=tensor, sparsity=0.2, std=0.05) + result = tensor + """ + ) + obj.run(pytorch_code, ["result"], check_value=False) + + +def test_case_3(): + pytorch_code = textwrap.dedent( + """ + import torch + tensor = torch.empty(5, 10) + torch.nn.init.sparse_(tensor, std=0.1, sparsity=0.3) + result = tensor + """ + ) + obj.run(pytorch_code, ["result"], check_value=False) + + +def test_case_4(): + pytorch_code = textwrap.dedent( + """ + import torch + tensor = torch.empty(8, 8) + torch.nn.init.sparse_(tensor, 0.5, 0.2) + result = tensor + """ + ) + obj.run(pytorch_code, ["result"], check_value=False) + + +def test_case_5(): + pytorch_code = textwrap.dedent( + """ + import torch + tensor = torch.empty(3, 2) + torch.nn.init.sparse_(sparsity=0.2, std=0.05, tensor=tensor) + result = tensor + """ + ) + obj.run(pytorch_code, ["result"], check_value=False)