diff --git a/surfaces/_base_test_function.py b/surfaces/_base_test_function.py new file mode 100644 index 0000000..7ff4525 --- /dev/null +++ b/surfaces/_base_test_function.py @@ -0,0 +1,102 @@ +# Author: Simon Blanke +# Email: simon.blanke@yahoo.com +# License: MIT License + + +import time +import numpy as np +import pandas as pd +from functools import reduce + +from hyperactive import Hyperactive +from hyperactive.optimizers import GridSearchOptimizer + +from ..machine_learning.data_collector import SurfacesDataCollector + + +class ObjectiveFunction: + explanation = """ """ + + dimensions = " " + formula = r" " + global_minimum = r" " + + def __init__(self, metric="score", input_type="dictionary", sleep=0): + self.metric = metric + self.input_type = input_type + self.sleep = sleep + + self.sql_data = SurfacesDataCollector() + + def search_space(self, min=-5, max=5, step=0.1, value_typ="array"): + search_space_ = {} + + for dim in range(self.n_dim): + dim_str = "x" + str(dim) + + values = np.arange(min, max, step) + if value_typ == "list": + values = list(values) + search_space_[dim_str] = values + + return search_space_ + + def collect_data(self, if_exists="append"): + para_names = list(self.search_space().keys()) + search_data_cols = para_names + ["score"] + search_data = pd.DataFrame([], columns=search_data_cols) + search_data_length = 0 + + dim_sizes_list = [len(array) for array in self.search_space().values()] + search_space_size = reduce((lambda x, y: x * y), dim_sizes_list) + + while search_data_length < search_space_size: + hyper = Hyperactive(verbosity=["progress_bar"]) + hyper.add_search( + self.objective_function_dict, + self.search_space(value_typ="list"), + initialize={}, + n_iter=search_space_size, + optimizer=GridSearchOptimizer(direction="orthogonal"), + memory_warm_start=search_data, + ) + hyper.run() + + search_data = pd.concat( + [search_data, hyper.search_data(self.objective_function_dict)], + ignore_index=True, + ) + + search_data = search_data.drop_duplicates(subset=para_names) + search_data_length = len(search_data) + + self.sql_data.save(self.__name__, search_data, if_exists) + + def load_search_data(self): + try: + dataframe = self.sql_data.load(self.__name__) + except: + print("Path 2 database: ", self.sql_data.path) + return dataframe + + def return_metric(self, loss): + if self.metric == "score": + return -loss + elif self.metric == "loss": + return loss + + def objective_function_np(self, *args): + para = {} + for i, arg in enumerate(args): + dim_str = "x" + str(i) + para[dim_str] = arg + + return self.objective_function_dict(para) + + def __call__(self, *input): + time.sleep(self.sleep) + + if self.input_type == "dictionary": + return self.objective_function_dict(*input) + elif self.input_type == "arrays": + return self.objective_function_np(*input) diff --git a/surfaces/machine_learning/data_collector/__init__.py b/surfaces/data_collector/__init__.py similarity index 100% rename from surfaces/machine_learning/data_collector/__init__.py rename to surfaces/data_collector/__init__.py diff --git a/surfaces/machine_learning/data_collector/config.py b/surfaces/data_collector/config.py similarity index 100% rename from surfaces/machine_learning/data_collector/config.py rename to surfaces/data_collector/config.py diff --git a/surfaces/machine_learning/data_collector/surfaces_data_collector.py b/surfaces/data_collector/surfaces_data_collector.py similarity index 100% rename from surfaces/machine_learning/data_collector/surfaces_data_collector.py rename to surfaces/data_collector/surfaces_data_collector.py diff --git a/surfaces/machine_learning/__init__.py b/surfaces/machine_learning/__init__.py deleted file mode 100644 index fe38a8a..0000000 --- a/surfaces/machine_learning/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -# Author: Simon Blanke -# Email: simon.blanke@yahoo.com -# License: MIT License - -from .machine_learning_functions.tabular_classifiers import KNeighborsClassifierFunction -from .machine_learning_functions.tabular_regressors import ( - GradientBoostingRegressorFunction, - KNeighborsRegressorFunction, -) diff --git a/surfaces/machine_learning/machine_learning_functions/__init__.py b/surfaces/machine_learning_functions/__init__.py similarity index 100% rename from surfaces/machine_learning/machine_learning_functions/__init__.py rename to surfaces/machine_learning_functions/__init__.py diff --git a/surfaces/machine_learning/machine_learning_functions/base_machine_learning_function.py b/surfaces/machine_learning_functions/base_machine_learning_function.py similarity index 97% rename from surfaces/machine_learning/machine_learning_functions/base_machine_learning_function.py rename to surfaces/machine_learning_functions/base_machine_learning_function.py index c8d6681..c7e8daf 100644 --- a/surfaces/machine_learning/machine_learning_functions/base_machine_learning_function.py +++ b/surfaces/machine_learning_functions/base_machine_learning_function.py @@ -1,4 +1,8 @@ -import os +# Author: Simon Blanke +# Email: simon.blanke@yahoo.com +# License: MIT License + + import time import numpy as np diff --git a/surfaces/machine_learning/datasets/__init__.py b/surfaces/machine_learning_functions/datasets/__init__.py similarity index 100% rename from surfaces/machine_learning/datasets/__init__.py rename to surfaces/machine_learning_functions/datasets/__init__.py diff --git a/surfaces/machine_learning/datasets/tabular_classification.py b/surfaces/machine_learning_functions/datasets/tabular_classification.py similarity index 100% rename from surfaces/machine_learning/datasets/tabular_classification.py rename to surfaces/machine_learning_functions/datasets/tabular_classification.py diff --git a/surfaces/machine_learning/datasets/tabular_regression.py b/surfaces/machine_learning_functions/datasets/tabular_regression.py similarity index 100% rename from surfaces/machine_learning/datasets/tabular_regression.py rename to surfaces/machine_learning_functions/datasets/tabular_regression.py diff --git a/surfaces/machine_learning/machine_learning_functions/tabular_classifiers.py b/surfaces/machine_learning_functions/tabular_classifiers.py similarity index 94% rename from surfaces/machine_learning/machine_learning_functions/tabular_classifiers.py rename to surfaces/machine_learning_functions/tabular_classifiers.py index 17db33c..a891298 100644 --- a/surfaces/machine_learning/machine_learning_functions/tabular_classifiers.py +++ b/surfaces/machine_learning_functions/tabular_classifiers.py @@ -4,7 +4,7 @@ from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import cross_val_score -from ..datasets import digits_data, wine_data, iris_data +from .datasets import digits_data, wine_data, iris_data from .base_machine_learning_function import BaseMachineLearningFunction diff --git a/surfaces/machine_learning/machine_learning_functions/tabular_regressors.py b/surfaces/machine_learning_functions/tabular_regressors.py similarity index 97% rename from surfaces/machine_learning/machine_learning_functions/tabular_regressors.py rename to surfaces/machine_learning_functions/tabular_regressors.py index 9c96e42..bcd7429 100644 --- a/surfaces/machine_learning/machine_learning_functions/tabular_regressors.py +++ b/surfaces/machine_learning_functions/tabular_regressors.py @@ -5,7 +5,7 @@ from sklearn.ensemble import GradientBoostingRegressor from sklearn.model_selection import cross_val_score -from ..datasets import diabetes_data +from .datasets import diabetes_data from .base_machine_learning_function import BaseMachineLearningFunction diff --git a/surfaces/test_functions/__init__.py b/surfaces/mathematical_functions/__init__.py similarity index 100% rename from surfaces/test_functions/__init__.py rename to surfaces/mathematical_functions/__init__.py diff --git a/surfaces/test_functions/_base_objective_function.py b/surfaces/mathematical_functions/_base_objective_function.py similarity index 95% rename from surfaces/test_functions/_base_objective_function.py rename to surfaces/mathematical_functions/_base_objective_function.py index a2f2b83..1fbf5b6 100644 --- a/surfaces/test_functions/_base_objective_function.py +++ b/surfaces/mathematical_functions/_base_objective_function.py @@ -11,10 +11,16 @@ from hyperactive import Hyperactive from hyperactive.optimizers import GridSearchOptimizer -from ..machine_learning.data_collector import SurfacesDataCollector +from ..data_collector import SurfacesDataCollector class ObjectiveFunction: + explanation = """ """ + + dimensions = " " + formula = r" " + global_minimum = r" " + def __init__(self, metric="score", input_type="dictionary", sleep=0): self.metric = metric self.input_type = input_type diff --git a/surfaces/test_functions/ackley_function.py b/surfaces/mathematical_functions/ackley_function.py similarity index 100% rename from surfaces/test_functions/ackley_function.py rename to surfaces/mathematical_functions/ackley_function.py diff --git a/surfaces/test_functions/beale_function.py b/surfaces/mathematical_functions/beale_function.py similarity index 100% rename from surfaces/test_functions/beale_function.py rename to surfaces/mathematical_functions/beale_function.py diff --git a/surfaces/test_functions/booth_function.py b/surfaces/mathematical_functions/booth_function.py similarity index 100% rename from surfaces/test_functions/booth_function.py rename to surfaces/mathematical_functions/booth_function.py diff --git a/surfaces/test_functions/bukin_function_n6.py b/surfaces/mathematical_functions/bukin_function_n6.py similarity index 100% rename from surfaces/test_functions/bukin_function_n6.py rename to surfaces/mathematical_functions/bukin_function_n6.py diff --git a/surfaces/test_functions/cross_in_tray_function.py b/surfaces/mathematical_functions/cross_in_tray_function.py similarity index 100% rename from surfaces/test_functions/cross_in_tray_function.py rename to surfaces/mathematical_functions/cross_in_tray_function.py diff --git a/surfaces/test_functions/drop_wave_function.py b/surfaces/mathematical_functions/drop_wave_function.py similarity index 100% rename from surfaces/test_functions/drop_wave_function.py rename to surfaces/mathematical_functions/drop_wave_function.py diff --git a/surfaces/test_functions/easom_function.py b/surfaces/mathematical_functions/easom_function.py similarity index 100% rename from surfaces/test_functions/easom_function.py rename to surfaces/mathematical_functions/easom_function.py diff --git a/surfaces/test_functions/eggholder_function.py b/surfaces/mathematical_functions/eggholder_function.py similarity index 100% rename from surfaces/test_functions/eggholder_function.py rename to surfaces/mathematical_functions/eggholder_function.py diff --git a/surfaces/test_functions/goldstein_price_function.py b/surfaces/mathematical_functions/goldstein_price_function.py similarity index 100% rename from surfaces/test_functions/goldstein_price_function.py rename to surfaces/mathematical_functions/goldstein_price_function.py diff --git a/surfaces/test_functions/gramacy_and_lee_function.py b/surfaces/mathematical_functions/gramacy_and_lee_function.py similarity index 100% rename from surfaces/test_functions/gramacy_and_lee_function.py rename to surfaces/mathematical_functions/gramacy_and_lee_function.py diff --git a/surfaces/test_functions/griewank_function.py b/surfaces/mathematical_functions/griewank_function.py similarity index 100% rename from surfaces/test_functions/griewank_function.py rename to surfaces/mathematical_functions/griewank_function.py diff --git a/surfaces/test_functions/himmelblaus_function.py b/surfaces/mathematical_functions/himmelblaus_function.py similarity index 100% rename from surfaces/test_functions/himmelblaus_function.py rename to surfaces/mathematical_functions/himmelblaus_function.py diff --git "a/surfaces/test_functions/h\303\266lder_table_function.py" "b/surfaces/mathematical_functions/h\303\266lder_table_function.py" similarity index 100% rename from "surfaces/test_functions/h\303\266lder_table_function.py" rename to "surfaces/mathematical_functions/h\303\266lder_table_function.py" diff --git a/surfaces/test_functions/langermann_function.py b/surfaces/mathematical_functions/langermann_function.py similarity index 100% rename from surfaces/test_functions/langermann_function.py rename to surfaces/mathematical_functions/langermann_function.py diff --git a/surfaces/test_functions/levi_function_n13.py b/surfaces/mathematical_functions/levi_function_n13.py similarity index 100% rename from surfaces/test_functions/levi_function_n13.py rename to surfaces/mathematical_functions/levi_function_n13.py diff --git a/surfaces/test_functions/matyas_function.py b/surfaces/mathematical_functions/matyas_function.py similarity index 100% rename from surfaces/test_functions/matyas_function.py rename to surfaces/mathematical_functions/matyas_function.py diff --git a/surfaces/test_functions/mccormick_function.py b/surfaces/mathematical_functions/mccormick_function.py similarity index 100% rename from surfaces/test_functions/mccormick_function.py rename to surfaces/mathematical_functions/mccormick_function.py diff --git a/surfaces/test_functions/rastrigin_function.py b/surfaces/mathematical_functions/rastrigin_function.py similarity index 100% rename from surfaces/test_functions/rastrigin_function.py rename to surfaces/mathematical_functions/rastrigin_function.py diff --git a/surfaces/test_functions/rosenbrock_function.py b/surfaces/mathematical_functions/rosenbrock_function.py similarity index 100% rename from surfaces/test_functions/rosenbrock_function.py rename to surfaces/mathematical_functions/rosenbrock_function.py diff --git a/surfaces/test_functions/schaffer_function_n2.py b/surfaces/mathematical_functions/schaffer_function_n2.py similarity index 100% rename from surfaces/test_functions/schaffer_function_n2.py rename to surfaces/mathematical_functions/schaffer_function_n2.py diff --git a/surfaces/test_functions/simionescu_function.py b/surfaces/mathematical_functions/simionescu_function.py similarity index 100% rename from surfaces/test_functions/simionescu_function.py rename to surfaces/mathematical_functions/simionescu_function.py diff --git a/surfaces/test_functions/sphere_function.py b/surfaces/mathematical_functions/sphere_function.py similarity index 71% rename from surfaces/test_functions/sphere_function.py rename to surfaces/mathematical_functions/sphere_function.py index 817645e..f8185f2 100644 --- a/surfaces/test_functions/sphere_function.py +++ b/surfaces/mathematical_functions/sphere_function.py @@ -10,6 +10,12 @@ class SphereFunction(ObjectiveFunction): _name_ = "sphere_function" __name__ = "SphereFunction" + explanation = """The Sphere function has d local minima except for the global one. It is continuous, convex and unimodal. The plot shows its two-dimensional form.""" + + dimensions = "n" + formula = r"f(\vec{x}) = \sum^n_{i=1}x^2_i" + global_minimum = r"f(\vec{x}=0) = 0" + def __init__(self, n_dim, A=1, metric="score", input_type="dictionary", sleep=0): super().__init__(metric, input_type, sleep) self.n_dim = n_dim diff --git a/surfaces/test_functions/styblinski_tang_function.py b/surfaces/mathematical_functions/styblinski_tang_function.py similarity index 100% rename from surfaces/test_functions/styblinski_tang_function.py rename to surfaces/mathematical_functions/styblinski_tang_function.py diff --git a/surfaces/test_functions/three_hump_camel_function.py b/surfaces/mathematical_functions/three_hump_camel_function.py similarity index 100% rename from surfaces/test_functions/three_hump_camel_function.py rename to surfaces/mathematical_functions/three_hump_camel_function.py