diff --git a/config_files/config.yml b/config_files/config.yml index bcd99f24eea4b96b91abe4e562cb82304a02aaa9..bf55f8fd1a7241a3d07e4278e8e3a1b2d9a6eec5 100644 --- a/config_files/config.yml +++ b/config_files/config.yml @@ -22,7 +22,7 @@ Classification: nb_folds: 2 nb_class: 2 classes: ["yes", "no"] - type: ["multiview", "monoview"] + type: ["multiview",] algos_monoview: ["all"] algos_multiview: ["all"] stats_iter: 2 diff --git a/multiview_platform/mono_multi_view_classifiers/exec_classif.py b/multiview_platform/mono_multi_view_classifiers/exec_classif.py index 8f8ebb7ece1cb8b2e67b744d8eae4725adae17e7..854ba809f1a3426e760c4e9003e7f0a3b28a6191 100644 --- a/multiview_platform/mono_multi_view_classifiers/exec_classif.py +++ b/multiview_platform/mono_multi_view_classifiers/exec_classif.py @@ -124,15 +124,17 @@ def init_argument_dictionaries(benchmark, views_dictionary, def init_multiview_exps(classifier_names, views_dictionary, nb_class, kwargs_init): multiview_arguments = [] for classifier_name in classifier_names: - if multiple_args(classifier_name, kwargs_init): - multiview_arguments += gen_multiple_args_dictionnaries(nb_class, + if multiple_args(get_path_dict(kwargs_init[classifier_name])): + multiview_arguments += gen_multiple_args_dictionnaries( + nb_class, kwargs_init, classifier_name, views_dictionary=views_dictionary, framework="multiview") else: + arguments = get_path_dict(kwargs_init[classifier_name]) multiview_arguments += [gen_single_multiview_arg_dictionary(classifier_name, - kwargs_init, + arguments, nb_class, views_dictionary=views_dictionary)] return multiview_arguments @@ -166,7 +168,7 @@ def init_monoview_exps(classifier_names, monoview_arguments = [] for view_name, view_index in views_dictionary.items(): for classifier in classifier_names: - if multiple_args(classifier, kwargs_init): + if multiple_args(kwargs_init[classifier]): monoview_arguments += gen_multiple_args_dictionnaries(nb_class, kwargs_init, classifier, @@ -199,20 +201,113 @@ def gen_single_multiview_arg_dictionary(classifier_name,arguments,nb_class, 'view_indices': list(views_dictionary.values()), "nb_class": nb_class, "labels_names": None, - classifier_name: dict((key, value[0]) for key, value in arguments[ - classifier_name].items() if isinstance(value, list)) + classifier_name: extract_dict(arguments) } -def multiple_args(classifier, kwargsInit): +def extract_dict(classifier_config): + extracted_dict = {} + for key, value in classifier_config.items(): + if isinstance(value, list): + extracted_dict = set_element(extracted_dict, key, value[0]) + else: + extracted_dict = set_element(extracted_dict, key, value) + return extracted_dict + +# def simplify_dict(dictionary): + # + # simplified_dict = dict((key, value[0]) if isinstance(value, list) + # else (key, value) if not isinstance(value, dict) + # else (key, {}) for key, value in dictionary.items() + # ) + # dictionaries = {"":dict((key, value) for key, value in dictionary.items() + # if isinstance(value, dict))} + # while np.array([parent_dictionary for parent_dictionary in dictionaries.values()]).any(): + # new_dicts ={} + # for path, parent_dictionary in dictionaries.items(): + # if parent_dictionary: + # for name, dictionary in parent_dictionary.items(): + # path = ".".join([path, name]) + # new_dicts[path] = {} + # for key, value in dictionary.items(): + # if isinstance(value, dict): + # simplified_dict = set_element(simplified_dict, + # path, key, {}) + # new_dicts[path][key] = value + # elif isinstance(value, list): + # simplified_dict = set_element(simplified_dict, path, + # key, value[0]) + # else: + # simplified_dict = set_element(simplified_dict, path, + # key, value) + # dictionaries = new_dicts + # return simplified_dict + + +def set_element(dictionary, path, value): + existing_keys = path.split(".")[:-1] + dict_state = dictionary + for existing_key in existing_keys: + if existing_key in dict_state: + dict_state = dict_state[existing_key] + else: + dict_state[existing_key] = {} + dict_state = dict_state[existing_key] + dict_state[path.split(".")[-1]] = value + return dictionary + + +def multiview_multiple_args(classifier_name, kwargs_init): + args = [value for value in kwargs_init[classifier_name].values() if + isinstance(value, dict)] + arg_values = [value for value in kwargs_init[classifier_name].values() if not isinstance(value, dict)] + while args: + args_to_add = [] + for arg_index, arg in enumerate(args): + for key, value in arg.items(): + if isinstance(value, dict): + args_to_add.append(value) + else: + arg_values.append(value) + args.pop(arg_index) + args = args_to_add + listed_args = [type(value) == list and len(value) > 1 for value in + arg_values] + if True in listed_args: + return True + else: + return False + + +def multiple_args(classifier_configuration): listed_args = [type(value) == list and len(value)>1 for key, value in - kwargsInit[classifier].items()] + classifier_configuration.items()] if True in listed_args: return True else: return False +def get_path_dict(multiview_classifier_args): + path_dict = dict((key, value) for key, value in multiview_classifier_args.items()) + paths = is_dict_in(path_dict) + while paths: + for path in paths: + for key, value in path_dict[path].items(): + path_dict[".".join([path, key])] = value + path_dict.pop(path) + paths = is_dict_in(path_dict) + return path_dict + + +def is_dict_in(dictionary): + paths = [] + for key, value in dictionary.items(): + if isinstance(value, dict): + paths.append(key) + return paths + + def gen_multiple_kwargs_combinations(clKWARGS): values = list(clKWARGS.values()) listed_values = [[_] if type(_) is not list else _ for _ in values] @@ -232,9 +327,14 @@ def gen_multiple_kwargs_combinations(clKWARGS): def gen_multiple_args_dictionnaries(nb_class, kwargsInit, classifier, - view_name=None, view_index=None, views_indices=None, + view_name=None, view_index=None, + views_dictionary=None, framework="monoview"): - multiple_kwargs_list, reduced_multiple_kwargs_list = gen_multiple_kwargs_combinations(kwargsInit[classifier]) + if framework=="multiview": + classifier_config = get_path_dict(kwargsInit[classifier]) + else: + classifier_config = kwargsInit[classifier] + multiple_kwargs_list, reduced_multiple_kwargs_list = gen_multiple_kwargs_combinations(classifier_config) multiple_kwargs_dict = dict( (classifier+"_"+"_".join(map(str,list(reduced_dictionary.values()))), dictionary) for reduced_dictionary, dictionary in zip(reduced_multiple_kwargs_list, multiple_kwargs_list )) @@ -247,7 +347,7 @@ def gen_multiple_args_dictionnaries(nb_class, kwargsInit, classifier, gen_single_multiview_arg_dictionary(classifier_name, arguments, nb_class, - views_indices=views_indices) + views_dictionary=views_dictionary) for classifier_name, arguments in multiple_kwargs_dict.items()] return args_dictionnaries diff --git a/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/weighted_linear_early_fusion.py b/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/weighted_linear_early_fusion.py index 25539a9f90982fb05de991587693f7f123bb29bb..a851a609a1221a8560ec16c278ce0fb8ca9338b2 100644 --- a/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/weighted_linear_early_fusion.py +++ b/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/weighted_linear_early_fusion.py @@ -17,15 +17,15 @@ class WeightedLinearEarlyFusion(BaseMultiviewClassifier): self.view_weights = view_weights self.monoview_classifier_name = monoview_classifier_name self.short_name = "early fusion " + monoview_classifier_name + if monoview_classifier_name in monoview_classifier_config: + self.monoview_classifier_config = monoview_classifier_config[monoview_classifier_name] self.monoview_classifier_config = monoview_classifier_config - monoview_classifier_module = getattr(monoview_classifiers, self.monoview_classifier_name) monoview_classifier_class = getattr(monoview_classifier_module, monoview_classifier_module.classifier_class_name) self.monoview_classifier = monoview_classifier_class(random_state=random_state, **self.monoview_classifier_config) - self.param_names = ["monoview_classifier_name", "monoview_classifier_config"] classifier_names = [] for module_name in dir(monoview_classifiers): diff --git a/multiview_platform/tests/test_ExecClassif.py b/multiview_platform/tests/test_ExecClassif.py index 1af0dc200460ac4b1b3ef60549df5a6969424438..e6d75018483426d9c372c84d9729383addc40326 100644 --- a/multiview_platform/tests/test_ExecClassif.py +++ b/multiview_platform/tests/test_ExecClassif.py @@ -88,6 +88,122 @@ class Test_init_argument_dictionaries(unittest.TestCase): },] self.assertEqual(arguments["multiview"][0], expected_output[0]) + def test_init_argument_dictionaries_multiview_multiple(self): + self.multiview_classifier_arg_value = ["fake_value_2", "fake_arg_value_3"] + self.init_kwargs = { + 'monoview': { + self.monoview_classifier_name: + { + self.monoview_classifier_arg_name: self.monoview_classifier_arg_value} + }, + "multiview": { + self.multiview_classifier_name: { + self.multiview_classifier_arg_name: self.multiview_classifier_arg_value} + } + } + self.benchmark["multiview"] = ["fake_multiview_classifier"] + self.benchmark["monoview"] = {} + arguments = exec_classif.init_argument_dictionaries(self.benchmark, + self.views_dictionnary, + self.nb_class, + self.init_kwargs) + expected_output = [{ + "classifier_name": self.multiview_classifier_name+"_fake_value_2", + "view_indices": [0,1], + "view_names": ["test_view_0", "test_view"], + "nb_class": self.nb_class, + "labels_names":None, + self.multiview_classifier_name + "_fake_value_2": { + self.multiview_classifier_arg_name: + self.multiview_classifier_arg_value[0]}, + }, + { + "classifier_name": self.multiview_classifier_name+"_fake_arg_value_3", + "view_indices": [0, 1], + "view_names": ["test_view_0", "test_view"], + "nb_class": self.nb_class, + "labels_names": None, + self.multiview_classifier_name+"_fake_arg_value_3": { + self.multiview_classifier_arg_name: + self.multiview_classifier_arg_value[1]}, + } + ] + self.assertEqual(arguments["multiview"][0], expected_output[0]) + + + def test_init_argument_dictionaries_multiview_complex(self): + self.multiview_classifier_arg_value = {"fake_value_2":"plif", "plaf":"plouf"} + self.init_kwargs = { + 'monoview': { + self.monoview_classifier_name: + { + self.monoview_classifier_arg_name: self.monoview_classifier_arg_value} + }, + "multiview": { + self.multiview_classifier_name: { + self.multiview_classifier_arg_name: self.multiview_classifier_arg_value} + } + } + self.benchmark["multiview"] = ["fake_multiview_classifier"] + self.benchmark["monoview"] = {} + arguments = exec_classif.init_argument_dictionaries(self.benchmark, + self.views_dictionnary, + self.nb_class, + self.init_kwargs) + expected_output = [{ + "classifier_name": self.multiview_classifier_name, + "view_indices": [0,1], + "view_names": ["test_view_0", "test_view"], + "nb_class": self.nb_class, + "labels_names":None, + self.multiview_classifier_name: { + self.multiview_classifier_arg_name: + self.multiview_classifier_arg_value}, + }] + self.assertEqual(arguments["multiview"][0], expected_output[0]) + + def test_init_argument_dictionaries_multiview_multiple_complex(self): + self.multiview_classifier_arg_value = {"fake_value_2":["plif", "pluf"], "plaf":"plouf"} + self.init_kwargs = { + 'monoview': { + self.monoview_classifier_name: + { + self.monoview_classifier_arg_name: self.monoview_classifier_arg_value} + }, + "multiview": { + self.multiview_classifier_name: { + self.multiview_classifier_arg_name: self.multiview_classifier_arg_value} + } + } + self.benchmark["multiview"] = ["fake_multiview_classifier"] + self.benchmark["monoview"] = {} + arguments = exec_classif.init_argument_dictionaries(self.benchmark, + self.views_dictionnary, + self.nb_class, + self.init_kwargs) + expected_output = [{ + "classifier_name": self.multiview_classifier_name+"_plif_plouf", + "view_indices": [0,1], + "view_names": ["test_view_0", "test_view"], + "nb_class": self.nb_class, + "labels_names":None, + self.multiview_classifier_name + "_plif_plouf": { + self.multiview_classifier_arg_name: + {"fake_value_2": "plif", "plaf": "plouf"}}, + }, + { + "classifier_name": self.multiview_classifier_name+"_pluf_plouf", + "view_indices": [0, 1], + "view_names": ["test_view_0", "test_view"], + "nb_class": self.nb_class, + "labels_names": None, + self.multiview_classifier_name+"_pluf_plouf": { + self.multiview_classifier_arg_name: + {"fake_value_2":"pluf", "plaf":"plouf"}}, + } + ] + self.assertEqual(arguments["multiview"][0], expected_output[0]) + def fakeBenchmarkExec(coreIndex=-1, a=7, args=1): return [coreIndex, a] @@ -342,6 +458,83 @@ class Test_execOneBenchmark_multicore(unittest.TestCase): os.remove(os.path.join(path, file_name)) os.rmdir(path) +class Test_multiview_multiple_args(unittest.TestCase): + + @classmethod + def setUpClass(cls): + cls.classifier_name = "a" + cls.kwarg_init = {"a": + {"b":{ + "c":{ + "d":{ + "e":1, + "f":[1] + } + } + }}} + + @classmethod + def tearDownClass(cls): + pass + + def test_simple(self): + is_multiple = exec_classif.multiview_multiple_args(self.classifier_name, + self.kwarg_init) + self.assertEqual(is_multiple, False) + self.kwarg_init["a"]["b"]["c"]["d"]["g"] = [1,2] + is_multiple = exec_classif.multiview_multiple_args(self.classifier_name, + self.kwarg_init) + self.assertEqual(is_multiple, True) + + +class Test_set_element(unittest.TestCase): + + @classmethod + def setUpClass(cls): + cls.dictionary = {"a": + {"b":{ + "c":{ + "d":{ + "e":1, + "f":[1] + } + } + }}} + cls.elements = {"a.b.c.d.e":1, "a.b.c.d.f":[1]} + + @classmethod + def tearDownClass(cls): + pass + + def test_simple(self): + simplified_dict = {} + for path, value in self.elements.items(): + simplified_dict = exec_classif.set_element(simplified_dict, path, value) + self.assertEqual(simplified_dict, self.dictionary) + + +class Test_get_path_dict(unittest.TestCase): + + @classmethod + def setUpClass(cls): + cls.dictionary = {"a": + {"b":{ + "c":{ + "d":{ + "e":1, + "f":[1] + } + } + }}} + + @classmethod + def tearDownClass(cls): + pass + + def test_simple(self): + path_dict = exec_classif.get_path_dict(self.dictionary) + self.assertEqual(path_dict, {"a.b.c.d.e":1, "a.b.c.d.f":[1]}) + # # class Test_analyzeMulticlass(unittest.TestCase): diff --git a/multiview_platform/tests/test_utils/test_configuration.py b/multiview_platform/tests/test_utils/test_configuration.py index bc922be1e50733cc8dd61e343e2cd3f73d35ac45..289af382ed4695e55d0c1528459cc905d1af7909 100644 --- a/multiview_platform/tests/test_utils/test_configuration.py +++ b/multiview_platform/tests/test_utils/test_configuration.py @@ -38,37 +38,37 @@ class Test_get_the_args(unittest.TestCase): self.assertEqual(config_dict["Base"]["second_arg"], [12.5, 1e-06]) self.assertEqual(config_dict["Classification"]["third_arg"], True) -class Test_format_the_args(unittest.TestCase): - - def test_bool(self): - value = configuration.format_raw_arg("bool ; yes") - self.assertEqual(value, True) - - def test_int(self): - value = configuration.format_raw_arg("int ; 1") - self.assertEqual(value, 1) - - def test_float(self): - value = configuration.format_raw_arg("float ; 1.5") - self.assertEqual(value, 1.5) - - def test_string(self): - value = configuration.format_raw_arg("str ; chicken_is_heaven") - self.assertEqual(value, "chicken_is_heaven") - - def test_list_bool(self): - value = configuration.format_raw_arg("list_bool ; yes no yes yes") - self.assertEqual(value, [True, False, True, True]) - - def test_list_int(self): - value = configuration.format_raw_arg("list_int ; 1 2 3 4") - self.assertEqual(value, [1,2,3,4]) - - def test_list_float(self): - value = configuration.format_raw_arg("list_float ; 1.5 1.6 1.7") - self.assertEqual(value, [1.5, 1.6, 1.7]) - - def test_list_string(self): - value = configuration.format_raw_arg("list_str ; list string") - self.assertEqual(value, ["list", "string"]) +# class Test_format_the_args(unittest.TestCase): +# +# def test_bool(self): +# value = configuration.format_raw_arg("bool ; yes") +# self.assertEqual(value, True) +# +# def test_int(self): +# value = configuration.format_raw_arg("int ; 1") +# self.assertEqual(value, 1) +# +# def test_float(self): +# value = configuration.format_raw_arg("float ; 1.5") +# self.assertEqual(value, 1.5) +# +# def test_string(self): +# value = configuration.format_raw_arg("str ; chicken_is_heaven") +# self.assertEqual(value, "chicken_is_heaven") +# +# def test_list_bool(self): +# value = configuration.format_raw_arg("list_bool ; yes no yes yes") +# self.assertEqual(value, [True, False, True, True]) +# +# def test_list_int(self): +# value = configuration.format_raw_arg("list_int ; 1 2 3 4") +# self.assertEqual(value, [1,2,3,4]) +# +# def test_list_float(self): +# value = configuration.format_raw_arg("list_float ; 1.5 1.6 1.7") +# self.assertEqual(value, [1.5, 1.6, 1.7]) +# +# def test_list_string(self): +# value = configuration.format_raw_arg("list_str ; list string") +# self.assertEqual(value, ["list", "string"])