From ae7fac6c124781a911045f3d188ce9b83315bdde Mon Sep 17 00:00:00 2001 From: algorithm1832 <737634857@qq.com> Date: Thu, 16 Jul 2026 21:25:27 +0800 Subject: [PATCH 1/8] torch.optim.Optimizer --- paconvert/api_mapping.json | 8 +------- tests/test_optim_Optimizer.py | 36 +++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/paconvert/api_mapping.json b/paconvert/api_mapping.json index 016695ef6..995d0c7aa 100644 --- a/paconvert/api_mapping.json +++ b/paconvert/api_mapping.json @@ -8683,13 +8683,7 @@ } }, "torch.optim.Optimizer": { - "Matcher": "OptimOptimizerMatcher", - "paddle_api": "paddle.optimizer.Optimizer", - "min_input_args": 2, - "args_list": [ - "params", - "defaults" - ] + "Matcher": "ChangePrefixMatcher" }, "torch.optim.Optimizer.add_param_group": { "Matcher": "ChangeAPIMatcher", diff --git a/tests/test_optim_Optimizer.py b/tests/test_optim_Optimizer.py index 173f69ca6..3583e0bdc 100644 --- a/tests/test_optim_Optimizer.py +++ b/tests/test_optim_Optimizer.py @@ -35,6 +35,7 @@ def compare( obj = optimOptimizerAPIBase("torch.optim.Optimizer") +common_obj = APIBase("torch.optim.Optimizer") def test_case_1(): @@ -87,3 +88,38 @@ def test_case_4(): """ ) obj.run(pytorch_code, ["result"]) + + +def test_case_5(): + pytorch_code = textwrap.dedent( + """ + import torch + + class SignSGD(torch.optim.Optimizer): + def __init__(self, params, lr=0.01): + self.params = params + self.lr = lr + defaults = dict(lr=lr) + super(SignSGD, self).__init__(params, defaults) + + def step(self): + for p in self.params: + if p.grad is None: + continue + grad = p.grad.data + # p = p - lr * sign(grad) + p.data.add_(grad.sign(), alpha=-self.lr) + + x = torch.tensor([[1.0, 2.0, 3.0]]) + x.requires_grad = True + optimizer = SignSGD([x], lr=0.01) + result = [] + for i in range(5): + loss = x.sum() + optimizer.zero_grad() + loss.backward() + optimizer.step() + result.append(loss.item()) + """ + ) + common_obj.run(pytorch_code, ["result"]) From 1b2825d9388da1f09a04d7897e04adc05c22e9b4 Mon Sep 17 00:00:00 2001 From: algorithm1832 <737634857@qq.com> Date: Thu, 16 Jul 2026 21:28:58 +0800 Subject: [PATCH 2/8] torch.utils.data.distributed.DistributedSampler --- ...ils_data_distributed_DistributedSampler.py | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 tests/distributed/utils_data_distributed_DistributedSampler.py diff --git a/tests/distributed/utils_data_distributed_DistributedSampler.py b/tests/distributed/utils_data_distributed_DistributedSampler.py new file mode 100644 index 000000000..10785fd7b --- /dev/null +++ b/tests/distributed/utils_data_distributed_DistributedSampler.py @@ -0,0 +1,56 @@ +# Copyright (c) 2023 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 os + +import numpy as np +import torch +import torch.distributed as dist +from torch.utils.data import Dataset +from torch.utils.data.distributed import DistributedSampler + +dist.init_process_group(backend="nccl") +rank = dist.get_rank() +torch.cuda.set_device(rank) + + +class RandomDataset(Dataset): + def __init__(self, num_samples): + self.num_samples = num_samples + + def __getitem__(self, idx): + image = np.random.random([16]).astype("float32") + label = np.random.randint(0, 9, (1,)).astype("int64") + return image, label + + def __len__(self): + return self.num_samples + + +dataset = RandomDataset(16) +sampler = DistributedSampler( + dataset=dataset, + num_replicas=None, + rank=None, + shuffle=False, + seed=0, + drop_last=False, +) + +data = [i for i in sampler] +data = torch.tensor(data).squeeze() +if rank == 0: + print(data) + torch.save(data, os.environ["DUMP_FILE"]) From 2d188003e8a292a2816fb635bc79ebf41d222bee Mon Sep 17 00:00:00 2001 From: algorithm1832 <737634857@qq.com> Date: Thu, 16 Jul 2026 21:42:33 +0800 Subject: [PATCH 3/8] nn_modules_module__IncompatibleKeys --- ...est_nn_modules_module__IncompatibleKeys.py | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 tests/test_nn_modules_module__IncompatibleKeys.py diff --git a/tests/test_nn_modules_module__IncompatibleKeys.py b/tests/test_nn_modules_module__IncompatibleKeys.py new file mode 100644 index 000000000..48453e141 --- /dev/null +++ b/tests/test_nn_modules_module__IncompatibleKeys.py @@ -0,0 +1,71 @@ +# 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.modules.module._IncompatibleKeys") + + +def test_case_1(): + pytorch_code = textwrap.dedent( + """ + import torch + model = torch.nn.Linear(1, 2) + incompatible_keys = model.load_state_dict({"a": 2.0}, strict=False) + """ + ) + obj.run(pytorch_code, ["incompatible_keys"]) + + +def test_case_2(): + pytorch_code = textwrap.dedent( + """ + import torch + model = torch.nn.Linear(2, 3) + missing, unexpected = model.load_state_dict({"b": -2.0}, strict=False) + """ + ) + obj.run(pytorch_code, ["missing", "unexpected"]) + + +def test_case_3(): + pytorch_code = textwrap.dedent( + """ + import torch + model = torch.nn.Linear(6, 2) + result = model.load_state_dict({"c": -6.0}, strict=False) + result_0 = result[0] + result_1 = result[1] + result_missing = result.missing_keys + result_unexpected = result.unexpected_keys + """ + ) + obj.run( + pytorch_code, ["result_0", "result_1", "result_missing", "result_unexpected"] + ) + + +def test_case_4(): + pytorch_code = textwrap.dedent( + """ + import torch + from collections import namedtuple + model = torch.nn.Linear(6, 2) + result = model.load_state_dict({"c": -6.0}, strict=False) + is_tuple = isinstance(result, tuple) + """ + ) + obj.run(pytorch_code, ["is_tuple"]) From ae53bf3f13a5c59757b718216244cff6e09f9780 Mon Sep 17 00:00:00 2001 From: algorithm1832 <737634857@qq.com> Date: Fri, 17 Jul 2026 22:41:40 +0800 Subject: [PATCH 4/8] torch.utils.data.DataLoader, torch.utils.data.dataloader.DataLoader --- paconvert/api_mapping.json | 37 ++----------------- tests/test_utils_data_DataLoader.py | 7 +--- .../test_utils_data_dataloader_DataLoader.py | 7 +--- 3 files changed, 8 insertions(+), 43 deletions(-) diff --git a/paconvert/api_mapping.json b/paconvert/api_mapping.json index 995d0c7aa..192dce495 100644 --- a/paconvert/api_mapping.json +++ b/paconvert/api_mapping.json @@ -10234,39 +10234,7 @@ "Matcher": "ChangePrefixMatcher" }, "torch.utils.data.DataLoader": { - "Matcher": "GenericMatcher", - "paddle_api": "paddle.io.DataLoader", - "min_input_args": 1, - "args_list": [ - "dataset", - "batch_size", - "shuffle", - "sampler", - "batch_sampler", - "num_workers", - "collate_fn", - "pin_memory", - "drop_last", - "timeout", - "worker_init_fn", - "multiprocessing_context", - "generator", - "*", - "prefetch_factor", - "persistent_workers", - "pin_memory_device" - ], - "kwargs_change": { - "pin_memory": "", - "multiprocessing_context": "", - "generator": "", - "persistent_workers": "", - "pin_memory_device": "" - }, - "unsupport_args": [ - "sampler", - "prefetch_factor" - ] + "Matcher": "ChangePrefixMatcher" }, "torch.utils.data.Dataset": { "Matcher": "ChangePrefixMatcher" @@ -10315,6 +10283,9 @@ "torch.utils.data._utils.collate.default_collate": { "Matcher": "ChangePrefixMatcher" }, + "torch.utils.data.dataloader.DataLoader": { + "Matcher": "ChangePrefixMatcher" + }, "torch.utils.data.dataloader.default_collate": { "Matcher": "ChangePrefixMatcher" }, diff --git a/tests/test_utils_data_DataLoader.py b/tests/test_utils_data_DataLoader.py index aa9c5b8f0..7f6f315a5 100644 --- a/tests/test_utils_data_DataLoader.py +++ b/tests/test_utils_data_DataLoader.py @@ -172,15 +172,13 @@ def __len__(self): obj.run( pytorch_code, ["result"], - unsupport=True, - reason="The parameter sampler not support.", ) def test_case_6(): pytorch_code = textwrap.dedent( """ - from torch.utils.data import Dataset + from torch.utils.data import Dataset, SequentialSampler import torch class Data(Dataset): def __init__(self): @@ -194,6 +192,7 @@ def __len__(self): data = Data() + sampler = SequentialSampler(data) result = torch.utils.data.DataLoader(dataset=data, batch_size=1, shuffle=False, sampler=sampler, batch_sampler=None, num_workers=0, collate_fn=None, @@ -209,6 +208,4 @@ def __len__(self): obj.run( pytorch_code, ["result"], - unsupport=True, - reason="The parameter 'sampler' not support.", ) diff --git a/tests/test_utils_data_dataloader_DataLoader.py b/tests/test_utils_data_dataloader_DataLoader.py index ff4c7584f..e6eb19846 100644 --- a/tests/test_utils_data_dataloader_DataLoader.py +++ b/tests/test_utils_data_dataloader_DataLoader.py @@ -172,15 +172,13 @@ def __len__(self): obj.run( pytorch_code, ["result"], - unsupport=True, - reason="The parameter sampler not support.", ) def test_case_6(): pytorch_code = textwrap.dedent( """ - from torch.utils.data import Dataset + from torch.utils.data import Dataset, SequentialSampler import torch class Data(Dataset): def __init__(self): @@ -194,6 +192,7 @@ def __len__(self): data = Data() + sampler = SequentialSampler(data) result = torch.utils.data.dataloader.DataLoader(dataset=data, batch_size=1, shuffle=False, sampler=sampler, batch_sampler=None, num_workers=0, collate_fn=None, @@ -209,8 +208,6 @@ def __len__(self): obj.run( pytorch_code, ["result"], - unsupport=True, - reason="The parameter 'sampler' not support.", ) From 324fb80c97400a12020da5a9140d6fcc189b0a16 Mon Sep 17 00:00:00 2001 From: algorithm1832 <737634857@qq.com> Date: Fri, 17 Jul 2026 23:07:58 +0800 Subject: [PATCH 5/8] torch.optim.SGD --- paconvert/api_mapping.json | 33 +-------------------------------- tests/test_optim_SGD.py | 20 ++++---------------- 2 files changed, 5 insertions(+), 48 deletions(-) diff --git a/paconvert/api_mapping.json b/paconvert/api_mapping.json index 192dce495..fbc5ff577 100644 --- a/paconvert/api_mapping.json +++ b/paconvert/api_mapping.json @@ -8806,38 +8806,7 @@ ] }, "torch.optim.SGD": { - "Matcher": "GenericMatcher", - "paddle_api": "paddle.optimizer.SGD", - "min_input_args": 1, - "args_list": [ - "params", - "lr", - "momentum", - "dampening", - "weight_decay", - "nesterov", - "*", - "maximize", - "foreach", - "differentiable", - "fused" - ], - "unsupport_args": [ - "momentum", - "dampening", - "nesterov", - "maximize", - "foreach", - "differentiable", - "fused" - ], - "kwargs_change": { - "params": "parameters", - "lr": "learning_rate" - }, - "paddle_default_kwargs": { - "weight_decay": 0.0 - } + "Matcher": "ChangePrefixMatcher" }, "torch.optim.lr_scheduler.ConstantLR": { "Matcher": "ConstantLRMatcher", diff --git a/tests/test_optim_SGD.py b/tests/test_optim_SGD.py index 72a9ecb02..0064ba576 100644 --- a/tests/test_optim_SGD.py +++ b/tests/test_optim_SGD.py @@ -83,11 +83,7 @@ def test_case_8(): "torch.optim.SGD(params=conv.parameters(), lr=0.8, momentum=0, dampening=0, weight_decay=0, nesterov=False, maximize=False, foreach=None, differentiable=False)" ) ) - obj.run( - pytorch_code, - unsupport=True, - reason="`momentum`, `dampening`, `nesterov`, `maximize`, `foreach` and `differentiable` is not supported.", - ) + obj.run(pytorch_code, ["result"]) def test_case_9(): @@ -96,21 +92,13 @@ def test_case_9(): "torch.optim.SGD(conv.parameters(), 0.8, 0, 0, 0, False, maximize=False, foreach=None, differentiable=False)" ) ) - obj.run( - pytorch_code, - unsupport=True, - reason="`momentum`, `dampening`, `nesterov`, `maximize`, `foreach` and `differentiable` is not supported.", - ) + obj.run(pytorch_code, ["result"]) def test_case_10(): pytorch_code = textwrap.dedent( generate_optimizer_test_code( - "torch.optim.SGD(params=conv.parameters(), lr=0.8, weight_decay=0, momentum=0, dampening=0, maximize=False, nesterov=False, foreach=None, differentiable=False)" + "torch.optim.SGD(params=conv.parameters(), lr=0.8, weight_decay=0, momentum=0, dampening=0, maximize=True, nesterov=False, foreach=None, differentiable=False)" ) ) - obj.run( - pytorch_code, - unsupport=True, - reason="`momentum`, `dampening`, `nesterov`, `maximize`, `foreach` and `differentiable` is not supported.", - ) + obj.run(pytorch_code, ["result"]) From 36f0f870f8bb3a1f82e02ecddfa42b884ef67723 Mon Sep 17 00:00:00 2001 From: algorithm1832 <737634857@qq.com> Date: Fri, 17 Jul 2026 23:10:34 +0800 Subject: [PATCH 6/8] torch.optim.Adagrad --- paconvert/api_mapping.json | 34 +--------------------------------- tests/test_optim_Adagrad.py | 24 ++++++------------------ 2 files changed, 7 insertions(+), 51 deletions(-) diff --git a/paconvert/api_mapping.json b/paconvert/api_mapping.json index fbc5ff577..38337407e 100644 --- a/paconvert/api_mapping.json +++ b/paconvert/api_mapping.json @@ -8497,39 +8497,7 @@ } }, "torch.optim.Adagrad": { - "Matcher": "GenericMatcher", - "paddle_api": "paddle.optimizer.Adagrad", - "min_input_args": 1, - "args_list": [ - "params", - "lr", - "lr_decay", - "weight_decay", - "initial_accumulator_value", - "eps", - "foreach", - "*", - "maximize", - "differentiable", - "fused" - ], - "unsupport_args": [ - "lr_decay", - "foreach", - "maximize", - "differentiable", - "fused" - ], - "kwargs_change": { - "params": "parameters", - "lr": "learning_rate", - "eps": "epsilon" - }, - "paddle_default_kwargs": { - "weight_decay": 0.0, - "epsilon": 1e-10, - "learning_rate": 0.01 - } + "Matcher": "ChangePrefixMatcher" }, "torch.optim.Adam": { "Matcher": "OptimAdamMatcher", diff --git a/tests/test_optim_Adagrad.py b/tests/test_optim_Adagrad.py index 697be40ed..9ea77693a 100644 --- a/tests/test_optim_Adagrad.py +++ b/tests/test_optim_Adagrad.py @@ -82,37 +82,25 @@ def test_case_7(): def test_case_8(): pytorch_code = textwrap.dedent( generate_optimizer_test_code( - "torch.optim.Adagrad(params=conv.parameters(), lr=0.01, lr_decay=0, weight_decay=0, initial_accumulator_value=0, eps=1e-10, foreach=None, maximize=False, differentiable=False)" + "torch.optim.Adagrad(params=conv.parameters(), lr=0.01, lr_decay=0.1, weight_decay=0, initial_accumulator_value=0, eps=1e-10, foreach=None, maximize=False, differentiable=False)" ) ) - obj.run( - pytorch_code, - unsupport=True, - reason="`lr_decay`, `foreach`, 'maximize` and `differentiable` is not supported.", - ) + obj.run(pytorch_code, ["result"]) def test_case_9(): pytorch_code = textwrap.dedent( generate_optimizer_test_code( - "torch.optim.Adagrad(conv.parameters(), 0.01, 0, 0, 0, 1e-10, None, maximize=False, differentiable=False)" + "torch.optim.Adagrad(conv.parameters(), 0.01, 0.1, 0.01, 0, 1e-10, None, maximize=True, differentiable=False)" ) ) - obj.run( - pytorch_code, - unsupport=True, - reason="`lr_decay`, `foreach`, 'maximize` and `differentiable` is not supported.", - ) + obj.run(pytorch_code, ["result"]) def test_case_10(): pytorch_code = textwrap.dedent( generate_optimizer_test_code( - "torch.optim.Adagrad(params=conv.parameters(), lr_decay=0, lr=0.01, initial_accumulator_value=0, weight_decay=0, eps=1e-10, foreach=None, maximize=False, differentiable=False)" + "torch.optim.Adagrad(params=conv.parameters(), lr_decay=0, lr=0.01, initial_accumulator_value=0, weight_decay=0, eps=1e-10, foreach=None, maximize=True, differentiable=False)" ) ) - obj.run( - pytorch_code, - unsupport=True, - reason="`lr_decay`, `foreach`, 'maximize` and `differentiable` is not supported.", - ) + obj.run(pytorch_code, ["result"]) From d5fda154183e62e31ab52d88be5f454d994e67d5 Mon Sep 17 00:00:00 2001 From: algorithm1832 <737634857@qq.com> Date: Fri, 17 Jul 2026 23:12:57 +0800 Subject: [PATCH 7/8] torch.optim.AdamW --- paconvert/api_mapping.json | 34 +--------------------------------- 1 file changed, 1 insertion(+), 33 deletions(-) diff --git a/paconvert/api_mapping.json b/paconvert/api_mapping.json index 38337407e..a4c860082 100644 --- a/paconvert/api_mapping.json +++ b/paconvert/api_mapping.json @@ -8537,39 +8537,7 @@ } }, "torch.optim.AdamW": { - "Matcher": "OptimAdamMatcher", - "paddle_api": "paddle.optimizer.AdamW", - "min_input_args": 1, - "args_list": [ - "params", - "lr", - "betas", - "eps", - "weight_decay", - "amsgrad", - "*", - "maximize", - "foreach", - "capturable", - "differentiable", - "fused" - ], - "unsupport_args": [ - "amsgrad", - "maximize", - "foreach", - "capturable", - "differentiable", - "fused" - ], - "kwargs_change": { - "params": "parameters", - "lr": "learning_rate", - "eps": "epsilon" - }, - "paddle_default_kwargs": { - "weight_decay": 0.0 - } + "Matcher": "ChangePrefixMatcher" }, "torch.optim.Adamax": { "Matcher": "OptimAdamMatcher", From 9165554869c9bb01ad73d48adfa8eb56963fc727 Mon Sep 17 00:00:00 2001 From: algorithm1832 <737634857@qq.com> Date: Sat, 18 Jul 2026 10:38:19 +0800 Subject: [PATCH 8/8] update static check file --- .../code_case/paddle_code/class_method_static_call.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/code_library/code_case/paddle_code/class_method_static_call.py b/tests/code_library/code_case/paddle_code/class_method_static_call.py index 37add8025..fa7974725 100644 --- a/tests/code_library/code_case/paddle_code/class_method_static_call.py +++ b/tests/code_library/code_case/paddle_code/class_method_static_call.py @@ -1,7 +1,7 @@ import paddle -class PT_Optimizer(paddle.optimizer.Optimizer): +class PT_Optimizer(paddle.optim.Optimizer): pass