2021-12-15 14:21:21 +01:00
# 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
2021-12-21 20:24:45 +01:00
from shutil import copyfile
2021-12-23 14:48:41 +01:00
from enum import Enum
2021-12-15 14:21:21 +01:00
numberOfOptimizedPatterns = 0
numberOfSkippedPatterns = 0
2021-12-23 14:48:41 +01:00
numberOfFunctionCalls = 10
2021-12-15 14:21:21 +01:00
start_time = datetime . now ( )
2021-12-23 14:48:41 +01:00
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 :
2021-12-15 14:21:21 +01:00
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
2021-12-23 14:48:41 +01:00
# print("Before")
2021-12-15 14:21:21 +01:00
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))
2021-12-23 14:48:41 +01:00
def optimize ( fullPatternFilepath , reducedPatternFilepath , translationalObjectiveWeight , optimizationParameters , resultsDir , intermediateResultsDir ) :
2021-12-15 14:21:21 +01:00
""" Call run(), catch exceptions. """
2021-12-21 20:24:45 +01:00
dirname = os . path . abspath ( os . path . dirname ( __file__ ) )
# dirname="/home/iason/Coding/build/ReducedModelOptimization/Release"
2021-12-15 14:21:21 +01:00
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))))
2022-01-03 14:30:59 +01:00
putResultsTo , intermediateResultsDir , optimizationParameters )
2021-12-15 14:21:21 +01:00
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 " )
2021-12-23 14:48:41 +01:00
# print(output)
2021-12-15 14:21:21 +01:00
#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 ) )
2021-12-23 14:48:41 +01:00
def optimizeBatch ( fullPatternDirectory , optimizationParameters , resultsDir , intermediateResultsDir ) :
watcher = pool . apply_async ( listener , ( q , resultsDir ) )
# print(optimizationParameters)
2021-12-15 14:21:21 +01:00
if not os . path . exists ( resultsDir ) :
os . makedirs ( resultsDir )
#shutil.rmtree(resultsDir)
2021-12-23 14:48:41 +01:00
reducedPatternFilepath = " /home/iason/Coding/Projects/Approximating shapes with flat patterns/ReducedModelOptimization/TestSet/ReducedPatterns/single_reduced.ply "
2021-12-15 14:21:21 +01:00
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)]
2021-12-23 14:48:41 +01:00
optimizationParameters_str = list ( map ( str , optimizationParameters ) )
print ( str ( optimizationParameters ) )
jobs . extend ( list ( itertools . product ( fullPatternFilepaths , [ reducedPatternFilepath ] , translationalObjectiveWeights , [ str ( optimizationParameters ) ] , [ resultsDir ] , [ intermediateResultsDir ] ) ) )
2021-12-15 14:21:21 +01:00
#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 ) )
2021-12-21 20:24:45 +01:00
print ( " Results directory: " + str ( resultsDir ) )
2021-12-15 14:21:21 +01:00
print ( " Start time: " , start_time )
pool . starmap ( optimize , jobs )
print ( " Completed " )
q . put ( ' kill ' )
2021-12-23 14:48:41 +01:00
# 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 '
2022-01-03 14:30:59 +01:00
resultsDir = os . path . join ( dirOfThisFile , os . path . join ( ' Results/OptimizationResults/variableComparison_ensmallen/ ' ,
optimizationBatchName ) )
2021-12-23 14:48:41 +01:00
optimizeBatch ( fullPatternDirectory , optimizationParameters , resultsDir , intermediateResultsDir )
2021-12-15 14:21:21 +01:00
pool . close ( )
pool . join ( )