# This is a sample Python script. # Press Shift+F10 to execute it or replace it with your code. # Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. import multiprocessing import subprocess import os from os import listdir from os.path import isfile, join import itertools import shutil import sys from datetime import datetime from subprocess import check_output from shutil import copyfile from enum import Enum numberOfOptimizedPatterns=0 numberOfSkippedPatterns=0 numberOfFunctionCalls=10 start_time = datetime.now() def listener(q,resultsDir): print("Entered") print("result dir in listener:",resultsDir) with open(os.path.join(resultsDir,'results.csv'), 'a',newline='\n') as f: while 1: m = q.get() if m == 'kill': # f.write('killed') break global numberOfOptimizedPatterns numberOfOptimizedPatterns = numberOfOptimizedPatterns + 1 print("Optimized patterns:" + str(numberOfOptimizedPatterns)) if not m: global numberOfSkippedPatterns numberOfSkippedPatterns=numberOfSkippedPatterns+1 continue f.write(m) f.flush() global start_time # print("Before") if numberOfSkippedPatterns != numberOfOptimizedPatterns: averageTimePerPattern_min=(datetime.now()-start_time).total_seconds()/(60*(numberOfOptimizedPatterns-numberOfSkippedPatterns)) print("Average minutes/pattern:"+str(averageTimePerPattern_min)) #print("After") # global totalNumberOfPatterns # print(totalNumberOfPatterns) # global totalNumberOfPatterns # print(totalNumberOfPatterns) # completionPercentage=numberOfOptimizedPatterns/totalNumberOfPatterns # print("Optimized patterns:" + str(completionPercentage)) def optimize(fullPatternFilepath, reducedPatternFilepath,translationalObjectiveWeight,optimizationParameters,resultsDir,intermediateResultsDir): """Call run(), catch exceptions.""" dirname = os.path.abspath(os.path.dirname(__file__)) # dirname="/home/iason/Coding/build/ReducedModelOptimization/Release" executableFilepath = os.path.join(dirname, 'ReducedModelOptimization') #putResultsTo=os.path.join(resultsDir,str(translationalObjectiveWeight)) #putResultsTo=os.path.join(putResultsTo,os.path.basename(os.path.dirname(os.path.dirname(fullPatternFilepath)))) putResultsTo=os.path.join(resultsDir,os.path.basename(os.path.dirname(os.path.dirname(fullPatternFilepath)))) try: # global resultsDir p = args = (executableFilepath, fullPatternFilepath, reducedPatternFilepath, str(numberOfFunctionCalls),str(translationalObjectiveWeight), #os.path.join(resultsDir,os.path.basename(os.path.dirname(fullPatternFilepath)))) putResultsTo,intermediateResultsDir,optimizationParameters) patternStartTime=datetime.now() #print("Optimizing " + fullPatternFilepath+" at "+str(datetime.now())) popen = subprocess.Popen(args, stdout=subprocess.PIPE,bufsize=1005024) #popen.wait() #output = popen.stdout.read() output = check_output(args).decode("utf-8") # print(output) #output,error=popen.communicate() duration_min=(datetime.now() - patternStartTime).total_seconds()/60 #print("Optimized " + fullPatternFilepath+" in "+str(duration_min)+" minutes") q.put(output) except Exception as e: print("error: %s run(*%r, **%r)" % (e, fullPatternFilepath,reducedPatternFilepath)) def optimizeBatch(fullPatternDirectory,optimizationParameters,resultsDir,intermediateResultsDir): watcher = pool.apply_async(listener, (q,resultsDir)) # print(optimizationParameters) if not os.path.exists(resultsDir): os.makedirs(resultsDir) #shutil.rmtree(resultsDir) reducedPatternFilepath= "/home/iason/Coding/Projects/Approximating shapes with flat patterns/ReducedModelOptimization/TestSet/ReducedPatterns/single_reduced.ply" fullPatternFilepaths=[] for subdir, dirs, files in os.walk(fullPatternDirectory): #print(subdir) #print(dirs) #print(files) #if !os.path.exists(resultsDir): # Write results #fullPatternFilepaths.extend([join(subdir, fullPatternFilepath) for fullPatternFilepath in listdir(subdir) if isfile(join(subdir, fullPatternFilepath))]) fullPatternFilepaths.extend(os.path.join(subdir, fullPatternFile) for fullPatternFile in files if fullPatternFile.endswith(".ply")) #fullPatternFilepaths.extend([os.path.join(fullPatternDirect]) #print(fullPatternFilepaths) #print(optimizationPairs) jobs=[] translationalObjectiveWeights=[1.2] #[x/10 for x in range(2,18,2)] optimizationParameters_str=list(map(str, optimizationParameters)) print(str(optimizationParameters)) jobs.extend(list(itertools.product(fullPatternFilepaths,[reducedPatternFilepath],translationalObjectiveWeights,[str(optimizationParameters)],[resultsDir],[intermediateResultsDir]))) #print(optimizationPairs) totalNumberOfPatterns=len(jobs) print("Runnning:",optimizationBatchName) print("Number of function calls:",numberOfFunctionCalls) print("Full pattern test set directory:"+fullPatternDirectory) print("Total number of optimization jobs:"+ str(totalNumberOfPatterns)) print("Results directory:"+str(resultsDir)) print("Start time:", start_time) pool.starmap(optimize,jobs) print("Completed") q.put('kill') # f.close() # Press the green button in the gutter to run the script. if __name__ == '__main__': # resultsDir="uninitialized dir" manager = multiprocessing.Manager() q = manager.Queue() pool=multiprocessing.Pool(2) #get latest optimization binary copyFrom="/home/iason/Coding/build/ReducedModelOptimization/Release/ReducedModelOptimization" dirOfThisFile = os.path.abspath(os.path.dirname(__file__)) copyfile(copyFrom, os.path.join(dirOfThisFile,"ReducedModelOptimization")) fullPatternDirectory= "/home/iason/Coding/Projects/Approximating shapes with flat patterns/ReducedModelOptimization/TestSet/FullPatterns/selectionOfPatterns" intermediateResultsDir='/home/iason/Coding/build/ReducedModelOptimization/IntermediateResults' E=0 A=1 I2=2 I3=3 J=4 R=5 Theta=6 # optimizationParametersScenarios=[] optimizationParametersScenarios={ "AllVar":{E, A, I2, I3, J, R, Theta}, "GeoYM":{R, Theta, E}, "noYM":{A, I2, I3, J, R, Theta}, "YMMat_Geo":[{E, A, I2, I3, J}, {R, Theta}], "YM_MatGeo":[{E}, {A, I2, I3, J, R, Theta}], "MatGeo_YM":[{A, I2, I3, J, R, Theta}, {E}], "Geo_YM_Mat":[{R, Theta}, {E}, {A, I2, I3, J}], "YM_Geo_Mat":[{E}, {R, Theta}, {A, I2, I3, J}], "Geo_Mat":[{R, Theta}, {A, I2, I3, J}], "YMGeo_Mat":[{E, R, Theta}, {A, I2, I3, J}] } for key, optimizationParameters in optimizationParametersScenarios.items(): optimizationBatchName='variableComparison_'+key+'_'+str(int(numberOfFunctionCalls/1000))+'k' resultsDir=os.path.join(dirOfThisFile,os.path.join('Results/OptimizationResults/variableComparison_ensmallen/', optimizationBatchName)) optimizeBatch(fullPatternDirectory,optimizationParameters,resultsDir,intermediateResultsDir) pool.close() pool.join()