# Copyright (c) 2025 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 unittest import numpy as np import paddle class TestLogOutAndParamDecorator(unittest.TestCase): def setUp(self): paddle.disable_static() self.x_np = np.random.uniform(0.1, 1, [3, 4]).astype(np.float32) self.test_types = ["decorator", "out", "out_decorator"] def do_test(self, test_type): x = paddle.to_tensor(self.x_np, stop_gradient=False) if test_type == 'raw': result = paddle.log(x) result.mean().backward() return result, x.grad elif test_type == 'decorator': result = paddle.log(input=x) result.mean().backward() return result, x.grad elif test_type == 'out': out = paddle.empty_like(x) out.stop_gradient = False paddle.log(x, out=out) out.mean().backward() return out, x.grad elif test_type == 'out_decorator': out = paddle.empty_like(x) out.stop_gradient = False paddle.log(input=x, out=out) out.mean().backward() return out, x.grad else: raise ValueError(f"Unknown test type: {test_type}") def test_all(self): out_std, grad_std = self.do_test('raw') for test_type in self.test_types: out, grad = self.do_test(test_type) np.testing.assert_allclose(out.numpy(), out_std.numpy(), rtol=1e-20) np.testing.assert_allclose( grad.numpy(), grad_std.numpy(), rtol=1e-20 ) if __name__ == "__main__": unittest.main()