From bcf73992f09b25875434b391bc7aa918f5185e20 Mon Sep 17 00:00:00 2001 From: Remi Ehounou Date: Wed, 19 May 2021 22:44:17 -0400 Subject: [PATCH] flacco has been integrated w rpy2 - basic function --- .idea/.gitignore | 3 + .idea/MDAF-GitLAB.iml | 8 ++ .idea/aws.xml | 11 ++ .../inspectionProfiles/profiles_settings.xml | 6 + .idea/misc.xml | 7 ++ .idea/modules.xml | 8 ++ .idea/vcs.xml | 6 + .spyproject/config/backups/codestyle.ini.bak | 8 ++ .spyproject/config/backups/encoding.ini.bak | 6 + .spyproject/config/backups/vcs.ini.bak | 7 ++ .spyproject/config/backups/workspace.ini.bak | 12 ++ .spyproject/config/codestyle.ini | 8 ++ .../defaults/defaults-codestyle-0.2.0.ini | 5 + .../defaults/defaults-encoding-0.2.0.ini | 3 + .../config/defaults/defaults-vcs-0.2.0.ini | 4 + .../defaults/defaults-workspace-0.2.0.ini | 6 + .spyproject/config/encoding.ini | 6 + .spyproject/config/vcs.ini | 7 ++ .spyproject/config/workspace.ini | 12 ++ .vscode/settings.json | 2 +- SourceCode/AlgorithmAnalyser.py | 118 ++++++------------ .../SampleAlgorithms/SimmulatedAnnealing.py | 2 +- .../SimmulatedAnnealing.cpython-39.pyc | Bin 0 -> 2059 bytes SourceCode/TestFunctions/Bukin6.py | 83 ------------ .../__pycache__/Brown.cpython-39.pyc | Bin 0 -> 426 bytes .../__pycache__/Bukin2.cpython-39.pyc | Bin 0 -> 663 bytes .../__pycache__/Bukin4.cpython-39.pyc | Bin 0 -> 376 bytes .../__pycache__/Bukin6.cpython-39.pyc | Bin 0 -> 425 bytes SourceCode/Testingground.py | 31 +++++ .../AlgorithmAnalyser.cpython-39.pyc | Bin 0 -> 2968 bytes SourceCode/calcFeatures.R | 31 +++++ 31 files changed, 232 insertions(+), 168 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/MDAF-GitLAB.iml create mode 100644 .idea/aws.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .spyproject/config/backups/codestyle.ini.bak create mode 100644 .spyproject/config/backups/encoding.ini.bak create mode 100644 .spyproject/config/backups/vcs.ini.bak create mode 100644 .spyproject/config/backups/workspace.ini.bak create mode 100644 .spyproject/config/codestyle.ini create mode 100644 .spyproject/config/defaults/defaults-codestyle-0.2.0.ini create mode 100644 .spyproject/config/defaults/defaults-encoding-0.2.0.ini create mode 100644 .spyproject/config/defaults/defaults-vcs-0.2.0.ini create mode 100644 .spyproject/config/defaults/defaults-workspace-0.2.0.ini create mode 100644 .spyproject/config/encoding.ini create mode 100644 .spyproject/config/vcs.ini create mode 100644 .spyproject/config/workspace.ini create mode 100644 SourceCode/SampleAlgorithms/__pycache__/SimmulatedAnnealing.cpython-39.pyc create mode 100644 SourceCode/TestFunctions/__pycache__/Brown.cpython-39.pyc create mode 100644 SourceCode/TestFunctions/__pycache__/Bukin2.cpython-39.pyc create mode 100644 SourceCode/TestFunctions/__pycache__/Bukin4.cpython-39.pyc create mode 100644 SourceCode/TestFunctions/__pycache__/Bukin6.cpython-39.pyc create mode 100644 SourceCode/Testingground.py create mode 100644 SourceCode/__pycache__/AlgorithmAnalyser.cpython-39.pyc create mode 100644 SourceCode/calcFeatures.R diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/MDAF-GitLAB.iml b/.idea/MDAF-GitLAB.iml new file mode 100644 index 0000000..8388dbc --- /dev/null +++ b/.idea/MDAF-GitLAB.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/aws.xml b/.idea/aws.xml new file mode 100644 index 0000000..b63b642 --- /dev/null +++ b/.idea/aws.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..f6104af --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..7e217d9 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.spyproject/config/backups/codestyle.ini.bak b/.spyproject/config/backups/codestyle.ini.bak new file mode 100644 index 0000000..0f54b4c --- /dev/null +++ b/.spyproject/config/backups/codestyle.ini.bak @@ -0,0 +1,8 @@ +[codestyle] +indentation = True +edge_line = True +edge_line_columns = 79 + +[main] +version = 0.2.0 + diff --git a/.spyproject/config/backups/encoding.ini.bak b/.spyproject/config/backups/encoding.ini.bak new file mode 100644 index 0000000..a17aced --- /dev/null +++ b/.spyproject/config/backups/encoding.ini.bak @@ -0,0 +1,6 @@ +[encoding] +text_encoding = utf-8 + +[main] +version = 0.2.0 + diff --git a/.spyproject/config/backups/vcs.ini.bak b/.spyproject/config/backups/vcs.ini.bak new file mode 100644 index 0000000..fd66eae --- /dev/null +++ b/.spyproject/config/backups/vcs.ini.bak @@ -0,0 +1,7 @@ +[vcs] +use_version_control = False +version_control_system = + +[main] +version = 0.2.0 + diff --git a/.spyproject/config/backups/workspace.ini.bak b/.spyproject/config/backups/workspace.ini.bak new file mode 100644 index 0000000..8760223 --- /dev/null +++ b/.spyproject/config/backups/workspace.ini.bak @@ -0,0 +1,12 @@ +[workspace] +restore_data_on_startup = True +save_data_on_exit = True +save_history = True +save_non_project_files = False +project_type = empty-project-type +recent_files = ['SourceCode/AlgorithmAnalyser.py'] + +[main] +version = 0.2.0 +recent_files = [] + diff --git a/.spyproject/config/codestyle.ini b/.spyproject/config/codestyle.ini new file mode 100644 index 0000000..0f54b4c --- /dev/null +++ b/.spyproject/config/codestyle.ini @@ -0,0 +1,8 @@ +[codestyle] +indentation = True +edge_line = True +edge_line_columns = 79 + +[main] +version = 0.2.0 + diff --git a/.spyproject/config/defaults/defaults-codestyle-0.2.0.ini b/.spyproject/config/defaults/defaults-codestyle-0.2.0.ini new file mode 100644 index 0000000..0b95e5c --- /dev/null +++ b/.spyproject/config/defaults/defaults-codestyle-0.2.0.ini @@ -0,0 +1,5 @@ +[codestyle] +indentation = True +edge_line = True +edge_line_columns = 79 + diff --git a/.spyproject/config/defaults/defaults-encoding-0.2.0.ini b/.spyproject/config/defaults/defaults-encoding-0.2.0.ini new file mode 100644 index 0000000..0ce193c --- /dev/null +++ b/.spyproject/config/defaults/defaults-encoding-0.2.0.ini @@ -0,0 +1,3 @@ +[encoding] +text_encoding = utf-8 + diff --git a/.spyproject/config/defaults/defaults-vcs-0.2.0.ini b/.spyproject/config/defaults/defaults-vcs-0.2.0.ini new file mode 100644 index 0000000..ee25483 --- /dev/null +++ b/.spyproject/config/defaults/defaults-vcs-0.2.0.ini @@ -0,0 +1,4 @@ +[vcs] +use_version_control = False +version_control_system = + diff --git a/.spyproject/config/defaults/defaults-workspace-0.2.0.ini b/.spyproject/config/defaults/defaults-workspace-0.2.0.ini new file mode 100644 index 0000000..2a73ab7 --- /dev/null +++ b/.spyproject/config/defaults/defaults-workspace-0.2.0.ini @@ -0,0 +1,6 @@ +[workspace] +restore_data_on_startup = True +save_data_on_exit = True +save_history = True +save_non_project_files = False + diff --git a/.spyproject/config/encoding.ini b/.spyproject/config/encoding.ini new file mode 100644 index 0000000..a17aced --- /dev/null +++ b/.spyproject/config/encoding.ini @@ -0,0 +1,6 @@ +[encoding] +text_encoding = utf-8 + +[main] +version = 0.2.0 + diff --git a/.spyproject/config/vcs.ini b/.spyproject/config/vcs.ini new file mode 100644 index 0000000..fd66eae --- /dev/null +++ b/.spyproject/config/vcs.ini @@ -0,0 +1,7 @@ +[vcs] +use_version_control = False +version_control_system = + +[main] +version = 0.2.0 + diff --git a/.spyproject/config/workspace.ini b/.spyproject/config/workspace.ini new file mode 100644 index 0000000..8760223 --- /dev/null +++ b/.spyproject/config/workspace.ini @@ -0,0 +1,12 @@ +[workspace] +restore_data_on_startup = True +save_data_on_exit = True +save_history = True +save_non_project_files = False +project_type = empty-project-type +recent_files = ['SourceCode/AlgorithmAnalyser.py'] + +[main] +version = 0.2.0 +recent_files = [] + diff --git a/.vscode/settings.json b/.vscode/settings.json index 7dc6613..e9d5e48 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,5 @@ { - "python.pythonPath": "/usr/bin/python3.8", + "python.pythonPath": "/usr/sbin/python", "python.testing.pytestArgs": [ "Sample codes" ], diff --git a/SourceCode/AlgorithmAnalyser.py b/SourceCode/AlgorithmAnalyser.py index 0210984..f6b1844 100644 --- a/SourceCode/AlgorithmAnalyser.py +++ b/SourceCode/AlgorithmAnalyser.py @@ -1,5 +1,6 @@ # directly running the DOE because existing surrogates can be explored with another workflow from os import path +from os import sys import importlib.util import multiprocessing import time @@ -15,6 +16,11 @@ import itertools import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D +# Test function representation +from rpy2 import robjects as robjs +from rpy2.robjects.packages import importr +from rpy2 import rinterface + # Test function characteristics import statistics as st from scipy import signal, misc, ndimage @@ -140,93 +146,30 @@ def representfunc(funcpath): # Automatically generate the representation if the docstrings did not return anything if not ('Represented' in results): - print("Warning, the Representation of the Test Function has not specified\n===\n******Calculating the Characteristics******") + print("Warning, the Representation of the Test Function has not been specified\n===\n******Calculating the Characteristics******") n = int(results['dimmensions']) - # pickle these steps - coords = arange(-10,10,0.5) - samplemx = array([*itertools.product(coords, repeat=n)]) - funcmap = array([* map(funcmodule.main, samplemx)]) - - # Arrays for plotting the test function - X = array([tp[0] for tp in samplemx]) - Y = array([tp[1] for tp in samplemx]) - Z = array(funcmap) - - # reshaping the array into a 3D topology - topology = reshape(Z,(coords.size,coords.size)) - ck = topology - - # Plotting the test function - fig = plt.figure() - ax = fig.add_subplot(111, projection='3d') - ax.plot_trisurf(X, Y, Z) - # plt.show() - + execpath = sys.executable + # creating the r functions + rlist = robjs.r['list'] + rapply = robjs.r['apply'] + rtestfunc = rinterface.rternalize(funcmodule.main) - # Number of Modes filter the data for local optima: look for circle like shapes, or squares or rectangles of very low derivative (tip of modes) + ### + lower =-10 + upper = 10 + X = flacco.createInitialSample(n_obs = 500, dim = 2, control = rlist(init_sample_type = 'lhs', init_sample_lower = lower, init_sample_upper = upper)) + y = rapply(X, 1, rtestfunc) + testfuncobj = flacco.createFeatureObject(X = X, y = y, fun = rtestfunc, lower = lower, upper = upper, blocks = 10) + + rawfeats = flacco.calculateFeatureSet(testfuncobj, set='ela_meta') + + pyfeat = asarray(rawfeats) - # Valleys and Bassins - # Alternative filter used for calculating derivatives - #derfilt = array([1.0, -2, 1.0], dtype=float32) - #alpha = signal.sepfir2d(ck, derfilt, [1]) + signal.sepfir2d(ck, [1], derfilt) - - # Currently used filter for Valley detection - hor = array([[0,1,1],[-1,0,1], [-1,-1,0]]) - vert = array([[-1,-1,0], [-1,0,1], [0,1,1]]) - - for i in range(1): betaH = signal.convolve(ck,hor,mode='valid') - for i in range(1): betaV = signal.convolve(ck,vert, mode='valid') - - beta = sqrt(betaH ** 2 + betaV ** 2) - - - #beta = beta[5:-5][5:-5] - - norm = linalg.norm(beta) - beta/= norm # normalized matrix - - - # custom filter for detection should light up the locaton of pattern - kernel = array([[1,1,1], [1,100,1], [1,1,1]]) - beta = beta < average(beta) - beta = beta * 1 - for i in range(100): - beta = ndimage.convolve(beta,kernel) - beta = beta >= 101 - beta = beta * 1 - - if any(beta): results['Valleys'] = True - - - # Separability: calculate the derivatives in one dimension and see if independant from other dimension - - - # Dimensionality: number of objectives, inputs: call function once and see what it gives | for number of inputs call until it works; try catch - - - # Pareto fronts: - - - # Noisyness: use the previously generated DOE and calculate a noisyness factor; average of derivative - - # Displaying the plots for development purposes - #img1 = plt.figure() - #ax2 = img1.add_subplot(111) - #ax2.imshow(alpha) - - img2 = plt.figure() - ax3 = img2.add_subplot(111) - ax3.imshow(beta) - - plt.show() - - # Writing the calculated representation into the test function file - # results['Represented'] = True writerepresentation(funcpath, results) @@ -285,14 +228,23 @@ if __name__ == '__main__': funcnames = ["Bukin2", "Bukin4", "Brown"] # testfunctionpaths = ["/home/remi/Documents/MDAF-GitLAB/SourceCode/TestFunctions/Bukin4.py"] # funcnames = ["Bukin4"] - + + # Installing the packages needed for FLACCO + utils = importr('utils') + #utils.install_packages('flacco', repos='https://utstat.toronto.edu/cran/') + #utils.install_packages('list', repos='https://utstat.toronto.edu/cran/') + ####utils.install_packages('reticulate', repos='https://utstat.toronto.edu/cran/') + + reticulate = importr('reticulate') + flacco = importr('flacco') + objs = 0 args = {"high": 200, "low": -200, "t": 1000, "p": 0.95} scale = 1 - data = doe (heuristicpath, heuristic_name, testfunctionpaths, funcnames, objs, args, scale) - print(data['Bukin2'][1][2]) - #representfunc("TestFunctions/Bukin6.py") + # data = doe (heuristicpath, heuristic_name, testfunctionpaths, funcnames, objs, args, scale) + # print([point[2] for point in data['Bukin2'][1]]) + representfunc("TestFunctions/Bukin2.py") # %% diff --git a/SourceCode/SampleAlgorithms/SimmulatedAnnealing.py b/SourceCode/SampleAlgorithms/SimmulatedAnnealing.py index 991ab89..90cf488 100644 --- a/SourceCode/SampleAlgorithms/SimmulatedAnnealing.py +++ b/SourceCode/SampleAlgorithms/SimmulatedAnnealing.py @@ -72,7 +72,7 @@ def main(func, obj, S, args): route.append(Best[:]) print(route) - if t < 0 or Quality(Best,y,func) > 200: + if t < 0 or Quality(Best,y,func) > 50: break #print('the Best Quality obtained was:{}'.format(Quality(Best,y))) print("Final Quality is: {}".format(Quality(Best,y,func))) diff --git a/SourceCode/SampleAlgorithms/__pycache__/SimmulatedAnnealing.cpython-39.pyc b/SourceCode/SampleAlgorithms/__pycache__/SimmulatedAnnealing.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4300cc8daece49ef4bb77f0dbf0f4b5a75fe815a GIT binary patch literal 2059 zcmZuy&2Jk;6rY*>@Or&=J{r=bsVc*P$~`nydjO%(QlNZDC~E6MRZCU6^=_O^cGu4A zm@4V`f{PjsNaYBpv>6L|#+{oQ-&!wfxsOg{`-^ab=iC{S3QGHc0#GTGVxjHysr~!au<* zA}oq2uGyH6`KRpR-I1fY5{K3i+p%S!#I_xAEh6!w7`fWgOgqa=yJv}eUfXZr3^=$B zBmR5LVry(S*gd}+Xa@JJb;)s7OBgHdca2kY!!&L=#(}fF7{oX?TuREBar3^+!n9TC zh_*6(0O_Qcg~r}WdRwIb#PG!M{3VmKkpKH)J4B%I&9v8-iQ3AF)pn9)!!%TJbTiN6 zFirB_<-wkD)RQ>enSoBxz{2<}4@84E0bMTVLFrmVpAH+4Ceey-uxLSf`T-d`091TO z$g9uUbG|7e9*Jk363QYDWpd0%R=#w=4)_uqS;~$qFT)_MOYA4HYquvEDARz{ipy6d1@=;OYMaBnyU`!2 z!BClM|M7O*Rmrz;DJkb5WBj!=DO9(g4X)E6e_^uyl{-UZOYL1=!!3nraUGjuseS*J zlzrJuiVvEv%gd}7TkQ>EW0Q<@VL(!K8D}7qTp0^QV}*~4mW`Y2%D0GTlViq-$<)M~ z1=1^Bs!UH`2BiqFFz)eyUl1N{NH&3Y={}AJT|S*xR`NgaNU=lIuCl0l$NUI+R`!^U zY|T;CR)n-s4Mzg70%!qxfHq*Yl=PKz=xTAqwU1_G--|UCIis4k4=cx%WmektBA4z_ zRZldkx~5%S89Spuc{(V$o)#tab)X&8jy0+)A5}EjH})4*Z9C9)-B@DUTfvQwX6~~* z;EcWpEEiXp@}kONUDuCLRXER!JYbCztO{&qf{~pa`vor+k%z_+(=$8l1(#Q$Ukn^YKPp!iKN%sCP zbJ{Mw@uJed;?=3uXcn)^_6xrIYIhs9=ME`b(-Ti3p8t<$Q!cvb%(|qKk##JFD@l)Y z@0Xux{C;EK@_m25ap&usUwwJ+!N%Ry)zzn?Q@lOJH)V)6>E~4APe&bR{nq`BcJJxJ zZ=e6M|Ln$VGP&=n=7&uv&*brw=ErfNE@42reBWMQC6R^Ck~~bC(`qgo1`11?CG}pM z4PqIpp^T@T){Mme1FccSabzrN9a|+?EYA^DbO*+Z;&{;Q;|X)a!642fxdK-CVwG)S zcxHHP+)a8oRr!jxX5|G^x6u2Bw~ZajUeR$Ro`l%&z0+LDx5*TR*0CuZStB)mw7lRl+(oAjxjg-QMn(Bd{0#^<>!Y_w|m2^YA{=h3u_B_%)$3+!Edjq+OpeS!O+ zH^ezm7NFr_=ZZyO@)~Tm<_u0zTk;YRb2O&;Tgr=4-9 z&>E!51o$&-sD3})NmL=}B{w!DQeMRNG=b%rZ-jXotGAZ*qhT6frx&lFe*{GtloPAx H`Cj#3`LESZ literal 0 HcmV?d00001 diff --git a/SourceCode/TestFunctions/Bukin6.py b/SourceCode/TestFunctions/Bukin6.py index e01548a..0c4d127 100644 --- a/SourceCode/TestFunctions/Bukin6.py +++ b/SourceCode/TestFunctions/Bukin6.py @@ -5,88 +5,5 @@ def main(args): ''' #_# dimmensions: 2 - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - - #_# dimmensions: 2.0 - #_# Valleys: True - - #_# dimmensions: 2.0 - #_# Valleys: True - - #_# dimmensions: 2.0 - #_# Valleys: True - - #_# dimmensions: 2.0 - #_# Valleys: True - - #_# dimmensions: 2.0 - #_# Valleys: True - - #_# dimmensions: 2.0 - #_# Valleys: True - - #_# dimmensions: 2.0 - #_# Valleys: True - - #_# dimmensions: 2.0 - #_# Valleys: True - - #_# dimmensions: 2.0 - #_# Valleys: True - - #_# dimmensions: 2.0 - #_# Valleys: True ''' return 100*sqrt(fabs(args[1]-0.01*args[0]**2))+0.01*fabs(args[0]+10) diff --git a/SourceCode/TestFunctions/__pycache__/Brown.cpython-39.pyc b/SourceCode/TestFunctions/__pycache__/Brown.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0530fff56451bfe8add2661e844bbf199e6dc88 GIT binary patch literal 426 zcmZ8dJ5R$f5I#F;RSKOzYP%J6$^cG+lDUK$a?>C^LO(~8@3@Q zw`&=}>9xo8W)D$G|DxYxu@GG9IFWj%w^gM}Tm#AAzEOD6%u0q2-w{Sys zrHi`aI-Qw<#09y317&aWJ@T&;!F|O=><3ANJ<@3ZFc?lY_G5D}9Qo5ERS_R2jQhu2 zn@K7oV;As8D!G%JHxGp?!dTk5x`6^UmvqR0DtpW$k5slAwjj$`D;m2ZVd;zyZ0{Em FegXaDTu=Z2 literal 0 HcmV?d00001 diff --git a/SourceCode/TestFunctions/__pycache__/Bukin2.cpython-39.pyc b/SourceCode/TestFunctions/__pycache__/Bukin2.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c38e353e7f793390c32e0070c2b291a7bd09e60c GIT binary patch literal 663 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