This commit is contained in:
Remi Ehounou
2021-04-19 09:38:40 -04:00
parent bff340453f
commit 9dd8ccf35a
8 changed files with 143 additions and 4 deletions

View File

@ -1,10 +1,11 @@
# directly running the DOE because existing surrogates can be explored with another workflow
from os import path
import importlib.util
import multiprocessing
import time
import re
from numpy import random as r
import shutil
@ -47,6 +48,67 @@ def measure(heuristicpath, heuristic_name, funcpath, funcname, objs, args, scale
connection.send(response)
def writerepresentation(funcpath, charas):
# Save a backup copy of the function file
shutil.copyfile(funcpath, funcpath + '.old')
# create a string format of the representation variables
representation = ''
for line in list(charas):
representation += '\n\t#_# ' + line + ': ' + str(charas[line])
representation+='\n'
# Creating the new docstring to be inserted into the file
with open(funcpath, "r") as file:
content = file.read()
docstrs = re.findall("def main\(.*?\):.*?'''(.*?)'''.*?return\s+.*?", content, re.DOTALL)[0]
docstrs += representation
repl = "\\1"+docstrs+"\t\\2"
# Create the new content of the file to replace the old. Overwriting the whole thing
pattrn = re.compile("(def main\(.*?\):.*?''').*?('''.*?return\s+.*?\n|$)", flags=re.DOTALL)
newContent = pattrn.sub(repl, content, count=1)
# Overwrite the test function file
with open(funcpath,"w") as file:
file.write(newContent)
def representfunc(funcpath):
#defining the function name
funcname = path.splitext(path.basename(funcpath))[0]
# loading the function to be represented
spec = importlib.util.spec_from_file_location(funcname, funcpath)
funcmodule = importlib.util.module_from_spec(spec)
spec.loader.exec_module(funcmodule)
# Finding the function characteristics inside the docstring
if funcmodule.main.__doc__:
regex = re.compile("#_#\s?(\w+):\s?([-+]?(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?)")
characs = re.findall(regex, funcmodule.main.__doc__)
results = {}
for charac in characs:
results[charac[0]] = float(charac[1])
# Automatically generate the representation if the docstrings did not return anything
if not results:
print("Calculating the Characteristics")
# Modality
# Basins
# Valleys
# Separability
# Dimensionality
# Writing the calculated representation into the test function file
writerepresentation(funcpath, results)
return results
def doe(heuristicpath, heuristic_name, testfunctionpaths, funcnames, objs, args, scale):
@ -91,4 +153,6 @@ def doe(heuristicpath, heuristic_name, testfunctionpaths, funcnames, objs, args,
for process in proc: print(process.name + "____\n" + str(responses[process.name]) + "\n_________________")
doe (heuristicpath, heuristic_name, testfunctionpaths, funcnames, objs, args, scale)
#doe (heuristicpath, heuristic_name, testfunctionpaths, funcnames, objs, args, scale)
representfunc("/home/remi/Documents/MDAF-GitLAB/SourceCode/TestFunctions/Bukin2.py")

View File

@ -1,2 +1,12 @@
def main(args):
'''
:param args: list of floats
:return: float
'''
return 100*(args[1]-0.01*args[0]**2+1)+0.01*(args[0]+10)**2
return 0

View File

@ -0,0 +1,8 @@
#Import math library
import math
def main(args):
for x in args:
if(x<0 | x>10): return 0
return (math.sin(args[0]-args[1])**2*math.sin(args[0]+args[1])**2)/(math.sqrt(args[0]**2+args[1]**2))

View File

@ -0,0 +1,8 @@
#Import math library
def main(args):
for x in args:
if x < -1.2 or x > 1.2:
return 0
return (100*(args[1]-args[0])**2)+(1-args[0])**2

View File

@ -0,0 +1,18 @@
def main(args):
"""
>>> main([0,1])
0.26
:param args: list of floats
:return: float
"""
for x in args:
if x < -10 or x > 10:
return 0
return (0.26*(args[0]**2+args[1]**2))-(0.48*args[0]*args[1])
if __name__ == "__main__":
import doctest
doctest.testmod()

View File

@ -0,0 +1,16 @@
import math
def main(args):
"""
>>>main([-0.547, -1.547])
0
:param args:
:return:
"""
for args[0] in args:
if args[0] < -1.5 or args[0] > 4:
return 0
if args[1] < -3 or args[1] > 3:
return 0
return math.sin(args[0]+args[1])+(args[0]-args[1])**2-(3*args[0]/2)+(5*args[1/2])+1

View File

@ -0,0 +1,16 @@
import math
def main(args):
"""
>>>main([0, 1, 1, 1])
0
:param args:
:return:
"""
for x in args:
if x < -1 or x > 1:
return 0
return (math.exp(-args[0])-args[1])**4+(100*(args[1]-args[2])**6)+(math.tan(args[2]-args[3]))**4+args[0]**8

View File

@ -1 +0,0 @@