
271 laye r _ ids [ me mber s ] = idx
272 vis ited [ membe rs ] = T rue
273 idx += 1
274 else :
275 vis ited [ membe rs ] = T rue
276
277 # - -- Layer flatn e ss - --
278 substa n t i a l = [(i , m ) for i , m in enumer a te ( la yers ) if len ( m ) >= 10]
279 si gmas = []
280 for i , m in su b s t antial :
281 sigma s . append ({
282 ' layer ' : i ,
283 ' n_no des ' : len (m ) ,
284 ' sigm a_z ' : float ( np . std ( posi t ions [m , 2]) ) ,
285 ' z_m ean ' : flo at ( np . mean ( posi t ions [m , 2]) )
286 })
287 n_pe r f ect = sum (1 for s in si gmas if s [ ' sigm a_z ' ] < 1e -10)
288
289 # - -- Inter - lay er spac ing ---
290 z_m eans = s orte d ([ s[ ' z _mea n ' ] for s in sigmas ])
291 spa c ings = np . di ff ( z_me ans ) if len ( z_m eans ) > 1 else np . arra y ([])
292 ideal = np . sqrt (2.0 / 3.0)
293
294 # - -- Inter - lay er bonds ---
295 in_ l ayer = lay e r _ids >= 0
296 inter_ b o n d s = np . zeros ( len ( po s i tions ) , dt ype = int )
297 for node in range ( len ( pos i tions ) ) :
298 if layer _ i ds [ node ] < 0:
299 cont inue
300 for nbr in self . G . neigh b o rs ( n ode ) :
301 if layer _ i ds [ nbr ] >= 0 and layer_ i ds [ nbr ] != l ayer_i d s [ node ]:
302 i n t er_bonds [ node ] += 1
303 il_c o u nts = inter_b o n d s [ in_la yer ]
304
305 # - -- S urfac e shell t hickne s s ---
306 cen t roid = pos i t ions . mean ( axis =0)
307 radii = np . li nal g . norm ( posi t i ons - centroid , axis =1)
308 R_max = float ( rad ii . max () )
309 bulk _ m ask = deg rees == 12
310 R_ bulk = flo at ( radii [ bu l k_mask ]. max () ) if np . any ( b u lk_mas k ) else 0.0
311 delta = R_max - R_bul k
312
313 re turn {
314 ' n_la y ers ' : len ( laye rs ) ,
315 ' n o d e s _ in_layers ' : int ( sum ( len ( m ) for m in laye rs ) ) ,
316 ' n _ substantial ' : len ( s u bstantia l ) ,
317 ' n _ p erfect_flat ' : n_perf ect ,
318 ' l a yer_details ' : sigmas ,
319 ' spac i ngs ' : sp a cings . tolist () ,
320 ' s pacing_mea n ' : flo at ( s p acing s . mean () ) if len ( sp a cing s ) > 0 else 0.0 ,
321 ' spacing_ s t d ' : float ( s paci n gs . std () ) if len ( sp a cing s ) > 0 else 0.0 ,
322 ' i d eal_spacing ' : ideal ,
323 ' i l _bonds_mean ' : float ( il _ c ounts . mean () ) if len ( il_co u nts ) > 0 else 0.0 ,
324 ' i l _ frac_bonded ' : floa t ( np . mean ( i l_cou n t s > 0) ) if len ( il _ counts ) > 0 else
0.0 ,
325 ' R_ max ' : R_max ,
326 ' R_b ulk ' : R_bulk ,
327 ' de lta ' : delta ,
328 }
329
330 def main () :
331 parse r = argpa r se . ArgumentParse r (
332 descri p t i o n = SSM Hologr a p h ic V acuu m Si mulati o n )
333 parse r . add_argum e n t ( ' -- node s ' , type = int , d efau lt = 5000 )
334 parse r . add_argum e n t ( ' -- lift ' , ty pe = float , d e faul t =0.05 )
335 parse r . add_argum e n t ( ' -- seed ' , ty pe = int , de fault =42)
336 parse r . add_argum e n t ( ' -- swee p ' , a ction = ' store _ t r ue ' )
337 parse r . add_argum e n t ( ' --rex - sweep ' , act ion = ' st o r e _true ' )
338 parse r . add_argum e n t ( ' -- an a lyze ' , action = ' sto r e _true ' )
339 args = pa rser . p arse_a r g s ()
340
341 rando m . seed ( args . see d )
342 np . random . seed ( args . seed )
19