#! /usr/bin/python3 import sys import os import re import random from subprocess import Popen import time import datetime def printUsageAndExit() : print("Usage : ",sys.argv[0]," templateFolder") exit(1) def getRelevantFilenames() : if len(sys.argv) != 2 : printUsageAndExit() folder = sys.argv[1] if not os.path.isdir(folder) : print(folder," doesn't exist") printUsageAndExit() files = os.listdir(folder) fms = [f for f in files if re.match(r"(.)*\.fm", f)] clas = [f for f in files if re.match(r"(.)*\.cla", f)] dicts = [f for f in files if re.match(r"(.)*\.dicts", f)][0] return folder, fms, clas, dicts def generateTopology() : activations = ["SIGMOID", "TANH", "RELU", "ELU", "LINEAR", "SPARSEMAX", "CUBE", "SOFTMAX"] minNeurons = 10 maxNeurons = 1000 maxLayers = 5 topology = "" layers = random.randrange(1, maxLayers+1) for i in range(layers) : topology += "("+str(random.randrange(minNeurons,maxNeurons))+","+random.choice(activations)+","+str(random.randrange(0, 101)/100)+")" return topology def rewriteClaFile(claFile) : f = open(claFile, "r") totalFile = "" while True : line = f.readline(); if len(line) == 0 : break if re.match(r"Topology(.)*", line) : line = "Topology : " + generateTopology() + "\n" totalFile += line f.close() f = open(claFile, "w") f.write(totalFile) f.close() def rewriteDictsFile(dictsFile) : firstColSize = 30 secondColSize = 5 minNeurons = 1 maxNeurons = 300 f = open(dictsFile, "r") totalFile = "" while True : line = f.readline(); if len(line) == 0 : break if not re.match(r"#(.)*", line) : neurons = str(random.randrange(minNeurons, maxNeurons+1)) lineSplit = line.split() line = lineSplit[0] + (firstColSize-len(lineSplit[0]))*" " + neurons + (secondColSize-len(neurons))*" " + lineSplit[2] + "\n" totalFile += line f.close() f = open(dictsFile, "w") f.write(totalFile) f.close() def done(p): return p.poll() is not None def success(p): return p.returncode == 0 def launchNewExperiment(folder, fms, clas, dicts, nbIter) : time.sleep(1) for cla in clas : rewriteClaFile(folder+"/"+cla) rewriteDictsFile(folder+"/"+dicts) date = str(datetime.datetime.now().time())[:8] print(date," : Launched experiment ",expCount) return Popen(["./train.sh", folder, folder+"_"+str(expCount), "-n", str(nbIter)]) nbConcurentExperiments = 20 nbIter = 20 folder, fms, clas, dicts = getRelevantFilenames() experiments = [] expCount = 0 while len(experiments) < nbConcurentExperiments : experiments.append(launchNewExperiment(folder, fms, clas, dicts, nbIter)) expCount += 1 while True : time.sleep(5) for exp in experiments : if done(exp) : exp = launchNewExperiment(folder, fms, clas, dicts, nbIter) expCount += 1