import os
import sys
from threading import Thread
from time import sleep # not ideal - better would use task finish to launch additional tasks
import numpy as np
RUN=1



today = '0730_invivo_randomized'

parent = os.getcwd()
path = os.path.join(parent,today)
tasks = []
in_vitro_string = 'python3.9 dep_fun.py %s_%s GABARUN=1 idel=5000 idur=2000 GRAPH=0 iamp=-20e-3 GRAPH=0' % ('invitro',today)

basic_string = 'python3.9 dep_fun.py %s GABARUN=1 idel=2000 idur=12000 iamp=0 GRAPH=0 fon=100 foff=100 NMDAFUNC=1 rtype=nexp won=100 woff=5900 UNIFORM=1' % today

array_string = 'python3.9 dep_fun.py %s_%s ARRAY=1 idel=5000 idur=2000 GRAPH=0 iamp=-20e-3 GRAPH=0' % ('array',today)

gaba_array_string = 'python3.9 dep_fun.py %s_%s GABA_ARRAY=1 idel=2000 won=100 woff=5900 UNIFORM=0 NMDAFUNC=1 idur=3000000 GRAPH=0 iamp=0 GRAPH=0' % ('gaba_array',today) # 100 runs of each


nruns = 500
#system('%s %s' % (basic_string,'number=10 regamp=0.05 kchip=0.56 fchip=0.44 freq=25'))
#system('%s %s' % (basic_string,'number=10 regamp=0.05 kchip=0.22 fchip=0.78 freq=25'))
"""
tasks.append('%s %s control=%d custom_name=%.2f_%.2f' % (in_vitro_string,'kchip=0.56 fchip=0.44',0,0,4))
tasks.append('%s %s control=%d custom_name=%.2f_%.2f' % (in_vitro_string,'kchip=0.22 fchip=0.78',0,0,5))
#"""

"""
tasks.append('%s %s control=%d custom_name=%.2f_%.2f' % (array_string,'kchip=0.56 fchip=0.44',0,0,4))
tasks.append('%s %s control=%d custom_name=%.2f_%.2f' % (array_string,'kchip=0.22 fchip=0.78',0,0,5))
#"""

"""
tasks.append('%s %s control=%d custom_name=%.2f_%.2f nmdaamp=6e-5 gabaamp=4e-3 regamp=0.07 freq=100' % (gaba_array_string,'kchip=0.56 fchip=0.44',0,0,4))
tasks.append('%s %s control=%d custom_name=%.2f_%.2f nmdaamp=6e-5 gabaamp=4e-3 regamp=0.07 freq=100' % (gaba_array_string,'kchip=0.22 fchip=0.78',0,0,5))
#"""


for i in range(nruns):
	np.random.seed(i)
	random0 = np.random.random()
	rand1 = 4.5+3*random0
	rand2 = 5-2*random0
	rand3 = 0.07#0.05+0.05*np.random.random()
	tasks.append('%s %s control=%d custom_name=%.2f_%.2f nmdaamp=%.2fe-5 gabaamp=%.2fe-3 regamp=%.4f' % (basic_string,'number=10 kchip=0.56 fchip=0.44 freq=100',i,i,0,rand1,rand2,rand3))
	tasks.append('%s %s control=%d custom_name=%.2f_%.2f nmdaamp=%.2fe-5 gabaamp=%.2fe-3 regamp=%.4f' % (basic_string,'number=10 kchip=0.22 fchip=0.78 freq=100',i,i,1,rand1,rand2,rand3))
	tasks.append('%s %s control=%d custom_name=%.2f_%.2f nmdaamp=%.2fe-5 gabaamp=%.2fe-3 regamp=%.4f' % (basic_string,'number=15 kchip=0.56 fchip=0.44 freq=100',i,i,2,rand1,rand2,rand3))
	tasks.append('%s %s control=%d custom_name=%.2f_%.2f nmdaamp=%.2fe-5 gabaamp=%.2fe-3 regamp=%.4f' % (basic_string,'number=15 kchip=0.22 fchip=0.78 freq=100',i,i,3,rand1,rand2,rand3))

MAX=100 # limited by memory, diminishing returns over ncores
#quit()
if RUN: # if 0, can diagnose what scripts it *thinks* will run
	ACTIVE=0
	if len(tasks) == 1:
		os.system('%s' % tasks[0])
	else :
		active=[]
		for things in tasks:	
			if ACTIVE >= MAX:
				ACTIVE=0
				#print(things)
				while any(x.is_alive() for x in active): # check if threads are running every now and then
					sleep(5)
				t = Thread(target=os.system,args=(str(things),))
				t.start()
				active=[t]
				ACTIVE+=1
			else:
				#print(things)
				#quit()

				t = Thread(target=os.system,args=(str(things),))
				t.start()
				active.append(t)
				ACTIVE+=1

if len(tasks) > 1:
	while any(x.is_alive() for x in active):
		sleep(5)
		

#os.system('%s %s/.' %(__file__,path))
os.system('mv *%s*.dat %s/.' % (today, path))