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 # directly running the DOE because existing surrogates can be explored with another workflow
from os import path
import importlib.util import importlib.util
import multiprocessing import multiprocessing
import time import time
import re
from numpy import random as r 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) 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): 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_________________") 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): 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 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 @@