ReducedModelOptimization/main.py

173 lines
7.5 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
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()