179 lines
6.9 KiB
Python
179 lines
6.9 KiB
Python
# Copyright (c) 2024 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.
|
||
|
||
# [AUTO-GENERATED] Unit test for paddle.framework.random
|
||
# 自动生成的单测,覆盖 paddle.framework.random 模块中未覆盖的代码
|
||
# Target: cover uncovered lines in paddle/python/paddle/framework/random.py
|
||
# 目标:覆盖 random.py 中 get_rng_state、set_rng_state(CPU路径)、_manual_program_seed 等未覆盖行
|
||
|
||
"""
|
||
测试模块:paddle.framework.random
|
||
Test Module: paddle.framework.random
|
||
|
||
本测试覆盖以下功能:
|
||
This test covers the following functions:
|
||
1. get_rng_state(device='cpu') - 获取CPU随机状态 / Get CPU random state
|
||
2. set_rng_state(state_list, device='cpu') - 设置CPU随机状态 / Set CPU random state
|
||
3. _manual_program_seed() - 手动设置program的随机种子 / Manually set program random seed
|
||
4. set_random_seed_generator / get_random_seed_generator - 命名随机种子生成器 / Named random seed generators
|
||
5. Generator(device='cpu') - CPU随机数生成器 / CPU random number generator
|
||
|
||
覆盖的未覆盖行:54-56, 103-107, 113-114, 120, 185, 190-202, 205-206, 209-214, 242, 269, 273, 299-302
|
||
"""
|
||
|
||
import unittest
|
||
|
||
import paddle
|
||
|
||
|
||
class TestGetSetRngStateCPU(unittest.TestCase):
|
||
"""测试CPU设备上的随机状态获取和设置功能
|
||
Test get/set random state on CPU device"""
|
||
|
||
def setUp(self):
|
||
"""设置测试环境为动态图模式 / Set up dynamic graph mode"""
|
||
paddle.disable_static()
|
||
|
||
def test_get_rng_state_cpu(self):
|
||
"""测试获取CPU随机状态,应返回一个包含一个状态的列表
|
||
Test getting CPU random state, should return a list with one state"""
|
||
state_list = paddle.get_rng_state(device='cpu')
|
||
self.assertIsInstance(state_list, list)
|
||
self.assertEqual(len(state_list), 1)
|
||
|
||
def test_set_rng_state_cpu(self):
|
||
"""测试设置CPU随机状态后生成的随机数可复现
|
||
Test that setting CPU random state makes random numbers reproducible"""
|
||
# 设置设备为CPU以确保随机数在CPU上生成
|
||
# Set device to CPU to ensure random numbers are generated on CPU
|
||
paddle.set_device('cpu')
|
||
|
||
# 设置一个已知种子 / Set a known seed
|
||
paddle.seed(42)
|
||
|
||
# 获取当前CPU随机状态 / Get current CPU random state
|
||
state_list = paddle.get_rng_state(device='cpu')
|
||
self.assertEqual(len(state_list), 1)
|
||
|
||
# 使用此状态生成随机数 / Generate random numbers with this state
|
||
rand1 = paddle.randn([3, 3])
|
||
|
||
# 恢复状态并再次生成 / Restore state and generate again
|
||
paddle.set_rng_state(state_list, device='cpu')
|
||
rand2 = paddle.randn([3, 3])
|
||
|
||
# 两次生成的随机数应相同 / Both random numbers should be identical
|
||
self.assertTrue(paddle.equal_all(rand1, rand2).item())
|
||
|
||
# 恢复GPU设备 / Restore GPU device
|
||
if paddle.is_compiled_with_cuda():
|
||
paddle.set_device('gpu')
|
||
|
||
def test_set_rng_state_cpu_invalid_length(self):
|
||
"""测试设置CPU随机状态时传入错误长度应报错
|
||
Test that setting CPU state with wrong length raises ValueError"""
|
||
state_list = paddle.get_rng_state(device='cpu')
|
||
# CPU状态列表长度应为1,传入2个应报错
|
||
# CPU state list length should be 1, passing 2 should raise error
|
||
with self.assertRaises(ValueError):
|
||
paddle.set_rng_state(state_list + state_list, device='cpu')
|
||
|
||
def test_get_rng_state_default_device(self):
|
||
"""测试不指定设备时获取当前设备的随机状态
|
||
Test getting random state for current device when device is None"""
|
||
state_list = paddle.get_rng_state()
|
||
self.assertIsInstance(state_list, list)
|
||
self.assertGreaterEqual(len(state_list), 1)
|
||
|
||
|
||
class TestManualProgramSeed(unittest.TestCase):
|
||
"""测试手动设置program随机种子
|
||
Test _manual_program_seed function"""
|
||
|
||
def test_manual_program_seed(self):
|
||
"""测试_manual_program_seed设置种子到默认program
|
||
Test _manual_program_seed sets seed on default programs"""
|
||
paddle.enable_static()
|
||
try:
|
||
from paddle.framework.random import _manual_program_seed
|
||
|
||
_manual_program_seed(12345)
|
||
|
||
# 验证种子已设置到默认main program
|
||
# Verify seed is set on default main program
|
||
main_seed = paddle.static.default_main_program().random_seed
|
||
self.assertEqual(main_seed, 12345)
|
||
|
||
# 验证种子已设置到默认startup program
|
||
# Verify seed is set on default startup program
|
||
startup_seed = paddle.static.default_startup_program().random_seed
|
||
self.assertEqual(startup_seed, 12345)
|
||
finally:
|
||
paddle.disable_static()
|
||
|
||
|
||
class TestNamedRandomSeedGenerator(unittest.TestCase):
|
||
"""测试命名随机种子生成器的设置和获取
|
||
Test set/get named random seed generators"""
|
||
|
||
def setUp(self):
|
||
paddle.disable_static()
|
||
|
||
def test_set_and_get_random_seed_generator(self):
|
||
"""测试设置和获取命名随机种子生成器
|
||
Test setting and getting a named random seed generator"""
|
||
from paddle.framework.random import (
|
||
get_random_seed_generator,
|
||
set_random_seed_generator,
|
||
)
|
||
|
||
# 设置一个命名的随机种子生成器 / Set a named random seed generator
|
||
set_random_seed_generator('test_gen', 42)
|
||
|
||
# 获取该生成器 / Get the generator
|
||
gen = get_random_seed_generator('test_gen')
|
||
self.assertIsNotNone(gen)
|
||
|
||
|
||
class TestGeneratorClass(unittest.TestCase):
|
||
"""测试 Generator 类的创建
|
||
Test Generator class creation"""
|
||
|
||
def setUp(self):
|
||
paddle.disable_static()
|
||
|
||
def test_cpu_generator(self):
|
||
"""测试创建CPU Generator
|
||
Test creating a CPU Generator"""
|
||
gen = paddle.Generator('cpu')
|
||
self.assertIsNotNone(gen)
|
||
|
||
def test_default_generator(self):
|
||
"""测试创建默认设备的Generator
|
||
Test creating a default device Generator"""
|
||
gen = paddle.Generator()
|
||
self.assertIsNotNone(gen)
|
||
|
||
def test_generator_manual_seed(self):
|
||
"""测试Generator的manual_seed方法
|
||
Test Generator's manual_seed method"""
|
||
gen = paddle.Generator('cpu')
|
||
gen.manual_seed(99)
|
||
# 验证种子已设置 / Verify seed is set
|
||
self.assertIsNotNone(gen)
|
||
|
||
|
||
if __name__ == '__main__':
|
||
unittest.main()
|