#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Mon Aug 21 14:59:22 2023 @author: astral """ import json import math as m import numpy as np from numpy.linalg import norm from datetime import datetime from random import sample as choose from plot import qtplot eps_space = list(np.linspace(0.01,0.2,20)) def resultant(sample): phase_x = [m.cos(ind) for ind in sample] phase_y = [m.sin(ind) for ind in sample] return (np.average(phase_x), np.average(phase_y)) def H2(x): return -x*m.log2(x)-(1-x)*m.log2(1-x) extremes = 50000 maxdt = 500 for dim in [7]: for eps in eps_space: path=f'/cloud/Public/_data/neuropercolation/4lay/steps=1000100/dim={dim:02}/' try: with open(path+f"eps={round(eps,3):.3f}_phase_diff.txt", 'r', encoding='utf-8') as f: phase_diff = json.load(f) except: with open(path+f"eps={round(eps,3):.3f}_activation.txt", 'r', encoding='utf-8') as f: activation = json.load(f)[100:] osc = list(zip(*activation)) phase = np.array([[np.arctan2(*act[::-1]) for act in osc[i]] for i in range(2)]) phase_diff = (phase[1]-phase[0]+m.pi)%(2*m.pi)-m.pi with open(path+f"eps={round(eps,3):.3f}_phase_diff.txt", 'w', encoding='utf-8') as f: json.dump(list(phase_diff), f, indent=1) all_res = norm(resultant(phase_diff)) try: with open(path+f"eps={round(eps,3):.3f}_ei.txt", 'r', encoding='utf-8') as f: ei = json.load(f) except: with open(path+f"eps={round(eps,3):.3f}_channels.txt", 'r', encoding='utf-8') as f: channels = json.load(f)[100:] ei = [np.sum(cha)*(1-H2(eps)) for cha in channels] with open(path+f"eps={round(eps,3):.3f}_ei.txt", 'w', encoding='utf-8') as f: json.dump(ei, f, indent=1) bot_ei = sorted(enumerate(ei[:-maxdt]), key = lambda x: x[1])[ extremes] top_ei = sorted(enumerate(ei[:-maxdt]), key = lambda x: x[1])[-extremes] bot_ei_pool = [ei for ei in enumerate(ei[:-maxdt]) if ei[1] <= bot_ei[1]] top_ei_pool = [ei for ei in enumerate(ei[:-maxdt]) if ei[1] >= top_ei[1]] bot_eis = choose(bot_ei_pool, extremes) top_eis = choose(top_ei_pool, extremes) bot_ind = [enum[0] for enum in bot_eis] top_ind = [enum[0] for enum in top_eis] bot_res = [] top_res = [] for dt in range(maxdt): bot_pha = [phase_diff[i+dt] for i in bot_ind] top_pha = [phase_diff[i+dt] for i in top_ind] bot_res.append( norm(resultant(bot_pha)) ) top_res.append( norm(resultant(top_pha)) ) if dt%100==99: print(f'Done dt={dt}') qtplot(f'Diachronic resultant for dim={dim} with 4 layers', [np.array(range(maxdt))]*3, [bot_res, top_res, [all_res]*maxdt], ['Resultant ev of bottom 100 ei', 'Resultant ev of top 100 ei', 'Average Resultant'], x_tag = 'dt', y_tag = 'concentration', export=True, path=path, filename=f'Diachronic Resultant for eps={round(eps,3)} dim={dim} extremes={extremes}.png', close=True) print(f'Done eps={eps:.3f} with dim={dim} at {datetime.now()}') # qtplot(f'Resultant and EI evolution for dim={dim} with 4 layers', # [[0]+eps_space]*2, # [max(av_ei)*diff_res, av_ei], # ['Resultant', 'avEI'], # export=True, # path=path, # filename=f'Resultant and EI for dim={dim}.png', # close=True)