import numpy as np import os import time from tools.connec.JoinCmaps import * import subprocess from tools.connec.PostConec import ConnecInd #k[x,y,z] import json def comp_connec(parser,rundir,nr): print(f"Rundir is {rundir}") kc=np.load(rundir+'k.npy') keep_aspect = parser.get('Connectivity','keep_aspect') kh,sx = float(parser.get('Generation','kh')),int(parser.get('Connectivity','block_size')) S_min_post = int(parser.get('Connectivity','indicators_MinBlockSize')) nimax =2** int(parser.get('Connectivity','Max_sample_size')) gcon =bool(parser.get('Connectivity','compGconec')) if S_min_post ==-1 or S_min_post > kc.shape[0]: S_min_post=kc.shape[0] #solo calcula indicadores para mayo escala if S_min_post ==0: S_min_post=sx #solo calcula indicadores para escalas a partir del optimo if sx > S_min_post: sx = get_min_nbl(kc,nimax,nr,S_min_post) #corta en mas artes para tener mediads de conec nbl=kc.shape[0]//sx if keep_aspect=='yes': keep_aspect=True else: keep_aspect=False t0=time.time() kc=np.where(kc==kh,1,0).astype(int) tcmaps=time.time() kc=get_smallCmap(kc,nbl,rundir,keep_aspect) tcmaps=time.time()-tcmaps kc,PostConTime=join(kc,nbl,keep_aspect,rundir,S_min_post,gcon) ttotal=time.time()-t0 summary = np.array([nbl,ttotal,tcmaps/ttotal,PostConTime/ttotal]) np.savetxt(rundir + 'ConnSummary.txt',summary,header='nbl,ttotal,tcmaps/ttotal,PostConTime/ttotal') np.save(rundir+'Cmap.npy',kc) return def get_min_nbl(kc,nimax,nr,smin): if kc.shape[2]==1: dim=2.0 else: dim=3.0 if nr>0: y=(1/dim)*np.log2(nr*kc.size/(nimax*(smin**dim))) else: y=0 y=int(y) s=int((2**y) * smin) if s connec.out 2>&1') #subprocess.call(['./tools/connec/'+execCon],cwd=rundir) #, '>/dev/null' , cwd=rundir os.chdir(wd) vec=np.loadtxt(rundir+params[-1]).reshape(vec.shape[0],vec.shape[1],vec.shape[2]).astype(int) return vec def ConConfig(sx,sy,sz,Nz,rundir): params=[] if Nz==1: params=['1','4','vecconec.txt',str(sx)+' '+str(sy),'1.0 1.0','pardol.CCO'] execCon='conec2d' else: params=['1','6','vecconec.txt',str(sx)+' '+str(sy)+' ' +str(sz),'1.0 1.0 1.0','pardol.CCO'] execCon='conec3d' with open(rundir+'coninput.txt', 'w') as f: for item in params: f.write("%s\n" % item) return params, execCon def join(vec,nbl,keep_aspect,datadir,S_min_post,gcon): Nx, Ny,Nz=vec.shape[0],vec.shape[1],vec.shape[2] sx = Nx//nbl if keep_aspect: sy,sz = Ny//nbl,Nz//nbl nblx, nbly,nblz = nbl, nbl, nbl else: sy,sz = sx,sx nblx=nbl nbly, nblz = Ny//sy, Nz//sz ex=np.log2(Nx) esx=np.log2(sx) join_z=True join_y=True if Nz==1: sz=1 nblz=1 post_time=0 sxL=[sx] for bs in range(0,int(ex-esx)): if vec.shape[0]==vec.shape[1] and sx>=S_min_post: t0=time.time() ConnecInd(vec,[sx],datadir) post_time=time.time()-t0 sx,sy,sz = 2*sx,2*sy,2*sz sxL+=[sx] if sz > Nz: sz=Nz nblz=1 join_z=False if sy > Ny: sy=Ny nbly=1 join_y=False nblx,nbly,nblz = Nx//sx, Ny//sy, Nz//sz for i in range(nblx): for j in range(nbly): for k in range(nblz): vec[i*sx:(i+1)*sx,j*sy:(j+1)*sy,k*sz:(k+1)*sz]=joinBox(vec[i*sx:(i+1)*sx,j*sy:(j+1)*sy,k*sz:(k+1)*sz],join_y,join_z) if vec.shape[0]==vec.shape[1] and sx>=S_min_post: # t0=time.time() ConnecInd(vec,[sx],datadir) post_time=post_time+(time.time()-t0) if gcon: ConnecInd(vec,sxL,datadir+'Global') return vec, post_time