Skip to content

Commit 8048e77

Browse files
authored
Use a local Numpy random generator. (#1030)
* Use a local Numpy random generator. * Fix import error. * Replace random generator in test_gen_stat_data.py.
1 parent fd1f371 commit 8048e77

File tree

6 files changed

+82
-15
lines changed

6 files changed

+82
-15
lines changed

deepmd/entrypoints/test.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import numpy as np
77
from deepmd import DeepPotential
88
from deepmd.common import expand_sys_str
9+
from deepmd.utils import random as dp_random
910
from deepmd.utils.data import DeepmdData
1011
from deepmd.utils.weight_avg import weighted_average
1112

@@ -64,7 +65,7 @@ def test(
6465

6566
# init random seed
6667
if rand_seed is not None:
67-
np.random.seed(rand_seed % (2 ** 32))
68+
dp_random.seed(rand_seed % (2 ** 32))
6869

6970
# init model
7071
dp = DeepPotential(model)

deepmd/entrypoints/train.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
import os
1010
from typing import Dict, List, Optional, Any
1111

12-
import numpy as np
1312
from deepmd.common import data_requirement, expand_sys_str, j_loader, j_must_have
1413
from deepmd.env import tf, reset_default_tf_session_config
1514
from deepmd.infer.data_modifier import DipoleChargeModifier
1615
from deepmd.train.run_options import BUILD, CITATION, WELCOME, RunOptions
1716
from deepmd.train.trainer import DPTrainer
17+
from deepmd.utils import random as dp_random
1818
from deepmd.utils.argcheck import normalize
1919
from deepmd.utils.compat import updata_deepmd_input
2020
from deepmd.utils.data_system import DeepmdDataSystem
@@ -135,7 +135,7 @@ def _do_work(jdata: Dict[str, Any], run_opt: RunOptions, is_compress: bool = Fal
135135
seed = jdata["training"].get("seed", None)
136136
if seed is not None:
137137
seed = seed % (2 ** 32)
138-
np.random.seed(seed)
138+
dp_random.seed(seed)
139139

140140
# setup data modifier
141141
modifier = get_modifier(jdata["model"].get("modifier", None))

deepmd/utils/data.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
from deepmd.env import GLOBAL_NP_FLOAT_PRECISION
1111
from deepmd.env import GLOBAL_ENER_FLOAT_PRECISION
12+
from deepmd.utils import random as dp_random
1213

1314
log = logging.getLogger(__name__)
1415

@@ -396,7 +397,7 @@ def _shuffle_data (self,
396397
ret = {}
397398
nframes = data['coord'].shape[0]
398399
idx = np.arange (nframes)
399-
np.random.shuffle (idx)
400+
dp_random.shuffle(idx)
400401
for kk in data :
401402
if type(data[kk]) == np.ndarray and \
402403
len(data[kk].shape) == 2 and \
@@ -676,7 +677,7 @@ def load_set(self, set_name, shuffle = True):
676677
# shuffle data
677678
if shuffle:
678679
idx = np.arange (nframe)
679-
np.random.shuffle (idx)
680+
dp_random.shuffle(idx)
680681
for ii in data:
681682
if ii != "prop_c":
682683
data[ii] = data[ii][idx]

deepmd/utils/data_system.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import numpy as np
88
from typing import Tuple, List
99

10+
from deepmd.utils import random as dp_random
1011
from deepmd.utils.data import DataSets
1112
from deepmd.utils.data import DeepmdData
1213

@@ -330,7 +331,7 @@ def get_batch(self, sys_idx : int = None):
330331
self.pick_idx = sys_idx
331332
else :
332333
# prob = self._get_sys_probs(sys_probs, auto_prob_style)
333-
self.pick_idx = np.random.choice(np.arange(self.nsystems), p=self.sys_probs)
334+
self.pick_idx = dp_random.choice(np.arange(self.nsystems), p=self.sys_probs)
334335
b_data = self.data_systems[self.pick_idx].get_batch(self.batch_size[self.pick_idx])
335336
b_data["natoms_vec"] = self.natoms_vec[self.pick_idx]
336337
b_data["default_mesh"] = self.default_mesh[self.pick_idx]
@@ -671,7 +672,7 @@ def get_batch (self,
671672
raise RuntimeError("unkown get_batch style")
672673
else :
673674
prob = self.process_sys_weights(sys_weights)
674-
self.pick_idx = np.random.choice(np.arange(self.nsystems), p = prob)
675+
self.pick_idx = dp_random.choice(np.arange(self.nsystems), p=prob)
675676
b_data = self.data_systems[self.pick_idx].get_batch(self.batch_size[self.pick_idx])
676677
b_data["natoms_vec"] = self.natoms_vec[self.pick_idx]
677678
b_data["default_mesh"] = self.default_mesh[self.pick_idx]

deepmd/utils/random.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import numpy as np
2+
3+
4+
_RANDOM_GENERATOR = np.random.RandomState()
5+
6+
7+
def choice(a: np.ndarray, p: np.ndarray = None):
8+
"""Generates a random sample from a given 1-D array.
9+
10+
Parameters
11+
----------
12+
a : np.ndarray
13+
A random sample is generated from its elements.
14+
p : np.ndarray
15+
The probabilities associated with each entry in a.
16+
17+
Returns
18+
-------
19+
np.ndarray
20+
arrays with results and their shapes
21+
"""
22+
return _RANDOM_GENERATOR.choice(a, p=p)
23+
24+
25+
def random(size=None):
26+
"""Return random floats in the half-open interval [0.0, 1.0).
27+
28+
Parameters
29+
----------
30+
size
31+
Output shape.
32+
33+
Returns
34+
-------
35+
np.ndarray
36+
Arrays with results and their shapes.
37+
"""
38+
return _RANDOM_GENERATOR.random_sample(size)
39+
40+
41+
def seed(val: int = None):
42+
"""Seed the generator.
43+
44+
Parameters
45+
----------
46+
val : int
47+
Seed.
48+
"""
49+
_RANDOM_GENERATOR.seed(val)
50+
51+
52+
def shuffle(x: np.ndarray):
53+
"""Modify a sequence in-place by shuffling its contents.
54+
55+
Parameters
56+
----------
57+
x : np.ndarray
58+
The array or list to be shuffled.
59+
"""
60+
_RANDOM_GENERATOR.shuffle(x)
61+
62+
63+
__all__ = ['choice', 'random', 'seed', 'shuffle']

source/tests/test_gen_stat_data.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import os,sys,platform,json,shutil
1+
import shutil
22
import numpy as np
33
import unittest
44
import dpdata
55

6+
from deepmd.utils import random as dp_random
67
from deepmd.utils.data_system import DeepmdDataSystem
78
from deepmd.fit import EnerFitting
89
from deepmd.model.model_stat import make_stat_input, merge_sys_stat, _make_all_stat_ref
@@ -46,31 +47,31 @@ def _comp_data(self, d0, d1) :
4647
self.assertAlmostEqual(d0[ii][jj][kk], d1[ii][jj][kk])
4748

4849
def test_merge_all_stat(self):
49-
np.random.seed(0)
50+
dp_random.seed(0)
5051
data0 = DeepmdDataSystem(['system_0', 'system_1'],
5152
5,
5253
10,
5354
1.0)
5455
data0.add('energy', 1, must = True)
55-
np.random.seed(0)
56+
dp_random.seed(0)
5657
data1 = DeepmdDataSystem(['system_0', 'system_1'],
5758
5,
5859
10,
5960
1.0)
6061
data1.add('force', 3, atomic = True, must = True)
61-
np.random.seed(0)
62+
dp_random.seed(0)
6263
data2 = DeepmdDataSystem(['system_0', 'system_1'],
6364
5,
6465
10,
6566
1.0)
6667
data2.add('force', 3, atomic = True, must = True)
6768

68-
np.random.seed(0)
69+
dp_random.seed(0)
6970
all_stat_0 = make_stat_input(data0, 10, merge_sys = False)
70-
np.random.seed(0)
71+
dp_random.seed(0)
7172
all_stat_1 = make_stat_input(data1, 10, merge_sys = True)
7273
all_stat_2 = merge_sys_stat(all_stat_0)
73-
np.random.seed(0)
74+
dp_random.seed(0)
7475
all_stat_3 = _make_all_stat_ref(data2, 10)
7576

7677
####################################
@@ -109,7 +110,7 @@ def tearDown(self):
109110
shutil.rmtree('system_1')
110111

111112
def test_ener_shift(self):
112-
np.random.seed(0)
113+
dp_random.seed(0)
113114
data = DeepmdDataSystem(['system_0', 'system_1'],
114115
5,
115116
10,

0 commit comments

Comments
 (0)