173 lines
7.4 KiB
Python
173 lines
7.4 KiB
Python
# 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
|
|
print(m)
|
|
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,optimizationParameters,intermediateResultsDir)
|
|
|
|
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/',optimizationBatchName))
|
|
optimizeBatch(fullPatternDirectory,optimizationParameters,resultsDir,intermediateResultsDir)
|
|
|
|
pool.close()
|
|
pool.join()
|