@@ -12,13 +12,17 @@ class NormalGenerator:
12
12
def __init__ (self ):
13
13
self .randn_generator = self .get_randn_generator ()
14
14
self .rand_generator = self .get_rand_generator ()
15
+ self .choice_generator = self .get_choice_generator ()
15
16
16
17
def randn (self , number ):
17
18
return next (self .randn_generator )
18
19
19
20
def rand (self , number ):
20
21
return next (self .rand_generator )
21
22
23
+ def choice (self , total_natoms , pert_natoms , replace ):
24
+ return next (self .choice_generator )[:pert_natoms ]
25
+
22
26
@staticmethod
23
27
def get_randn_generator ():
24
28
data = np .asarray (
@@ -44,18 +48,26 @@ def get_rand_generator():
44
48
[0.23182233 , 0.87106847 , 0.68728511 , 0.94180274 , 0.92860453 , 0.69191187 ]
45
49
)
46
50
51
+ @staticmethod
52
+ def get_choice_generator ():
53
+ yield np .asarray ([5 , 3 , 7 , 6 , 2 , 1 , 4 , 0 ])
54
+
47
55
48
56
class UniformGenerator :
49
57
def __init__ (self ):
50
58
self .randn_generator = self .get_randn_generator ()
51
59
self .rand_generator = self .get_rand_generator ()
60
+ self .choice_generator = self .get_choice_generator ()
52
61
53
62
def randn (self , number ):
54
63
return next (self .randn_generator )
55
64
56
65
def rand (self , number ):
57
66
return next (self .rand_generator )
58
67
68
+ def choice (self , total_natoms , pert_natoms , replace ):
69
+ return next (self .choice_generator )
70
+
59
71
@staticmethod
60
72
def get_randn_generator ():
61
73
data = [
@@ -97,18 +109,26 @@ def get_rand_generator():
97
109
yield np .asarray (data [count ])
98
110
count += 1
99
111
112
+ @staticmethod
113
+ def get_choice_generator ():
114
+ yield np .asarray ([5 , 3 , 7 , 6 , 2 , 1 , 4 , 0 ])
115
+
100
116
101
117
class ConstGenerator :
102
118
def __init__ (self ):
103
119
self .randn_generator = self .get_randn_generator ()
104
120
self .rand_generator = self .get_rand_generator ()
121
+ self .choice_generator = self .get_choice_generator ()
105
122
106
123
def randn (self , number ):
107
124
return next (self .randn_generator )
108
125
109
126
def rand (self , number ):
110
127
return next (self .rand_generator )
111
128
129
+ def choice (self , total_natoms , pert_natoms , replace ):
130
+ return next (self .choice_generator )
131
+
112
132
@staticmethod
113
133
def get_randn_generator ():
114
134
data = np .asarray (
@@ -135,13 +155,18 @@ def get_rand_generator():
135
155
[0.01525907 , 0.68387374 , 0.39768541 , 0.55596047 , 0.26557088 , 0.60883073 ]
136
156
)
137
157
158
+ @staticmethod
159
+ def get_choice_generator ():
160
+ yield np .asarray ([5 , 3 , 7 , 6 , 2 , 1 , 4 , 0 ])
161
+
138
162
139
163
# %%
140
164
class TestPerturbNormal (unittest .TestCase , CompSys , IsPBC ):
141
165
@patch ("numpy.random" )
142
166
def setUp (self , random_mock ):
143
167
random_mock .rand = NormalGenerator ().rand
144
168
random_mock .randn = NormalGenerator ().randn
169
+ random_mock .choice = NormalGenerator ().choice
145
170
system_1_origin = dpdata .System ("poscars/POSCAR.SiC" , fmt = "vasp/poscar" )
146
171
self .system_1 = system_1_origin .perturb (1 , 0.05 , 0.6 , "normal" )
147
172
self .system_2 = dpdata .System ("poscars/POSCAR.SiC.normal" , fmt = "vasp/poscar" )
@@ -153,6 +178,7 @@ class TestPerturbUniform(unittest.TestCase, CompSys, IsPBC):
153
178
def setUp (self , random_mock ):
154
179
random_mock .rand = UniformGenerator ().rand
155
180
random_mock .randn = UniformGenerator ().randn
181
+ random_mock .choice = UniformGenerator ().choice
156
182
system_1_origin = dpdata .System ("poscars/POSCAR.SiC" , fmt = "vasp/poscar" )
157
183
self .system_1 = system_1_origin .perturb (1 , 0.05 , 0.6 , "uniform" )
158
184
self .system_2 = dpdata .System ("poscars/POSCAR.SiC.uniform" , fmt = "vasp/poscar" )
@@ -164,11 +190,24 @@ class TestPerturbConst(unittest.TestCase, CompSys, IsPBC):
164
190
def setUp (self , random_mock ):
165
191
random_mock .rand = ConstGenerator ().rand
166
192
random_mock .randn = ConstGenerator ().randn
193
+ random_mock .choice = ConstGenerator ().choice
167
194
system_1_origin = dpdata .System ("poscars/POSCAR.SiC" , fmt = "vasp/poscar" )
168
195
self .system_1 = system_1_origin .perturb (1 , 0.05 , 0.6 , "const" )
169
196
self .system_2 = dpdata .System ("poscars/POSCAR.SiC.const" , fmt = "vasp/poscar" )
170
197
self .places = 6
171
198
172
199
200
+ class TestPerturbPartAtoms (unittest .TestCase , CompSys , IsPBC ):
201
+ @patch ("numpy.random" )
202
+ def setUp (self , random_mock ):
203
+ random_mock .rand = NormalGenerator ().rand
204
+ random_mock .randn = NormalGenerator ().randn
205
+ random_mock .choice = NormalGenerator ().choice
206
+ system_1_origin = dpdata .System ("poscars/POSCAR.SiC" , fmt = "vasp/poscar" )
207
+ self .system_1 = system_1_origin .perturb (1 , 0.05 , 0.6 , "normal" , 0.25 )
208
+ self .system_2 = dpdata .System ("poscars/POSCAR.SiC.partpert" , fmt = "vasp/poscar" )
209
+ self .places = 6
210
+
211
+
173
212
if __name__ == "__main__" :
174
213
unittest .main ()
0 commit comments