MCPcopy Create free account
hub / github.com/Oneflow-Inc/oneflow / _generate_state

Function _generate_state

python/oneflow/utils/data/_utils/worker.py:183–232  ·  view source on GitHub ↗
(base_seed, worker_id)

Source from the content-addressed store, hash-verified

181# seed and algorithm for `numpy.random` and `random` modules.
182# TODO: Implement `SeedSequence` like object for `flow.random`
183def _generate_state(base_seed, worker_id):
184 INIT_A = 0x43B0D7E5
185 MULT_A = 0x931E8875
186 INIT_B = 0x8B51F9DD
187 MULT_B = 0x58F38DED
188 MIX_MULT_L = 0xCA01F9DD
189 MIX_MULT_R = 0x4973F715
190 XSHIFT = 4 * 8 // 2
191 MASK32 = 0xFFFFFFFF
192
193 entropy = [worker_id, base_seed & MASK32, base_seed >> 32, 0]
194 pool = [0] * 4
195
196 hash_const_A = INIT_A
197
198 def hash(value):
199 nonlocal hash_const_A
200 value = (value ^ hash_const_A) & MASK32
201 hash_const_A = (hash_const_A * MULT_A) & MASK32
202 value = (value * hash_const_A) & MASK32
203 value = (value ^ (value >> XSHIFT)) & MASK32
204 return value
205
206 def mix(x, y):
207 result_x = (MIX_MULT_L * x) & MASK32
208 result_y = (MIX_MULT_R * y) & MASK32
209 result = (result_x - result_y) & MASK32
210 result = (result ^ (result >> XSHIFT)) & MASK32
211 return result
212
213 # Add in the entropy to the pool.
214 for i in range(len(pool)):
215 pool[i] = hash(entropy[i])
216
217 # Mix all bits together so late bits can affect earlier bits.
218 for i_src in range(len(pool)):
219 for i_dst in range(len(pool)):
220 if i_src != i_dst:
221 pool[i_dst] = mix(pool[i_dst], hash(pool[i_src]))
222
223 hash_const_B = INIT_B
224 state = []
225 for i_dst in range(4):
226 data_val = pool[i_dst]
227 data_val = (data_val ^ hash_const_B) & MASK32
228 hash_const_B = (hash_const_B * MULT_B) & MASK32
229 data_val = (data_val * hash_const_B) & MASK32
230 data_val = (data_val ^ (data_val >> XSHIFT)) & MASK32
231 state.append(data_val)
232 return state
233
234
235def _worker_loop(

Callers 1

_worker_loopFunction · 0.85

Calls 3

hashFunction · 0.85
mixFunction · 0.85
appendMethod · 0.45

Tested by

no test coverage detected