From 4728e99fa3d009bc4c1fb5a8d0d42216b64eccfe Mon Sep 17 00:00:00 2001 From: Luca Moretti Date: Sat, 13 Mar 2021 18:28:46 +0100 Subject: [PATCH 001/139] Updated json importer and tests --- PyCTBN/PyCTBN/utility/json_importer.py | 11 ++++++++--- PyCTBN/tests/utility/test_json_importer.py | 4 ++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/PyCTBN/PyCTBN/utility/json_importer.py b/PyCTBN/PyCTBN/utility/json_importer.py index edff212..2cadff4 100644 --- a/PyCTBN/PyCTBN/utility/json_importer.py +++ b/PyCTBN/PyCTBN/utility/json_importer.py @@ -49,10 +49,10 @@ class JsonImporter(AbstractImporter): super(JsonImporter, self).__init__(file_path) self._raw_data = self.read_json_file() - def import_data(self, indx: int) -> None: + def import_data(self, indx: int = 0) -> None: """Implements the abstract method of :class:`AbstractImporter`. - :param indx: the index of the outer JsonArray to extract the data from + :param indx: the index of the outer JsonArray to extract the data from, default to 0 :type indx: int """ self._array_indx = indx @@ -101,7 +101,12 @@ class JsonImporter(AbstractImporter): """ with open(self._file_path) as f: data = json.load(f) - return data + + if (isinstance(data,list)): + return data + else: + return [data] + def one_level_normalizing(self, raw_data: typing.List, indx: int, key: str) -> pd.DataFrame: """Extracts the one-level nested data in the list ``raw_data`` at the index ``indx`` at the key ``key``. diff --git a/PyCTBN/tests/utility/test_json_importer.py b/PyCTBN/tests/utility/test_json_importer.py index 877805b..a4bb4c0 100644 --- a/PyCTBN/tests/utility/test_json_importer.py +++ b/PyCTBN/tests/utility/test_json_importer.py @@ -39,7 +39,7 @@ class TestJsonImporter(unittest.TestCase): path = os.getcwd() path = path + '/data.json' j1 = JsonImporter(path, '', '', '', '', '') - self.assertTrue(self.ordered(data_set) == self.ordered(j1._raw_data)) + self.assertTrue(self.ordered([data_set]) == self.ordered(j1._raw_data)) os.remove('data.json') def test_read_json_file_not_found(self): @@ -155,7 +155,7 @@ class TestJsonImporter(unittest.TestCase): self.assertEqual(j1.file_path, "./PyCTBN/test_data/networks_and_trajectories_binary_data_01_3.json") def test_import_data(self): - j1 = JsonImporter("./PyCTBN/test_data/networks_and_trajectories_binary_data_01_3.json", 'samples', 'dyn.str', 'variables', 'Time', 'Name') + j1 = JsonImporter("./PyCTBN/test_data/networks_and_trajectories_binary_data_02_10_1.json", 'samples', 'dyn.str', 'variables', 'Time', 'Name') j1.import_data(0) self.assertEqual(list(j1.variables[j1._variables_key]), list(j1.concatenated_samples.columns.values[1:len(j1.variables[j1._variables_key]) + 1])) From 683780e555893eabd8d18927ac6c02849701b955 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sat, 13 Mar 2021 17:30:00 +0000 Subject: [PATCH 002/139] Update documentation --- .../doctrees/PyCTBN.PyCTBN.utility.doctree | Bin 151587 -> 151908 bytes docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes .../_build/html/PyCTBN.PyCTBN.utility.html | 4 ++-- docs-out/_build/html/searchindex.js | 2 +- docs/PyCTBN.PyCTBN.utility.html | 4 ++-- docs/searchindex.js | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs-out/_build/doctrees/PyCTBN.PyCTBN.utility.doctree b/docs-out/_build/doctrees/PyCTBN.PyCTBN.utility.doctree index 508570a1d4df367cdd853b345fe5bcdee5aeba94..a895732eb322969feb1f1757cdde2aedb703347b 100644 GIT binary patch delta 10265 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 delta 9887 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 J<40gA{68UFY})_; diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 73cc95323e5747cdd9506eb85884df4a094b5971..a6906b6442bb5b721a2a813fef5543b79fd79de3 100644 GIT binary patch delta 7402 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 E26Bk1HUIzs delta 7406 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
-import_data(indx: int) → None
+import_data(indx: int = 0) → None

Implements the abstract method of AbstractImporter.

Parameters
-

indx (int) – the index of the outer JsonArray to extract the data from

+

indx (int) – the index of the outer JsonArray to extract the data from, default to 0

diff --git a/docs-out/_build/html/searchindex.js b/docs-out/_build/html/searchindex.js index c34509d..8061880 100644 --- a/docs-out/_build/html/searchindex.js +++ b/docs-out/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["PyCTBN","PyCTBN.PyCTBN","PyCTBN.PyCTBN.estimators","PyCTBN.PyCTBN.optimizers","PyCTBN.PyCTBN.structure_graph","PyCTBN.PyCTBN.utility","PyCTBN.tests","PyCTBN.tests.estimators","PyCTBN.tests.optimizers","PyCTBN.tests.structure_graph","PyCTBN.tests.utility","basic_main","examples","index","modules","setup"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["PyCTBN.rst","PyCTBN.PyCTBN.rst","PyCTBN.PyCTBN.estimators.rst","PyCTBN.PyCTBN.optimizers.rst","PyCTBN.PyCTBN.structure_graph.rst","PyCTBN.PyCTBN.utility.rst","PyCTBN.tests.rst","PyCTBN.tests.estimators.rst","PyCTBN.tests.optimizers.rst","PyCTBN.tests.structure_graph.rst","PyCTBN.tests.utility.rst","basic_main.rst","examples.rst","index.rst","modules.rst","setup.rst"],objects:{"":{PyCTBN:[0,0,0,"-"]},"PyCTBN.PyCTBN":{estimators:[2,0,0,"-"],optimizers:[3,0,0,"-"],structure_graph:[4,0,0,"-"],utility:[5,0,0,"-"]},"PyCTBN.PyCTBN.estimators":{fam_score_calculator:[2,0,0,"-"],parameters_estimator:[2,0,0,"-"],structure_constraint_based_estimator:[2,0,0,"-"],structure_estimator:[2,0,0,"-"],structure_score_based_estimator:[2,0,0,"-"]},"PyCTBN.PyCTBN.estimators.fam_score_calculator":{FamScoreCalculator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator":{get_fam_score:[2,2,1,""],marginal_likelihood_q:[2,2,1,""],marginal_likelihood_theta:[2,2,1,""],single_cim_xu_marginal_likelihood_q:[2,2,1,""],single_cim_xu_marginal_likelihood_theta:[2,2,1,""],single_internal_cim_xxu_marginal_likelihood_theta:[2,2,1,""],variable_cim_xu_marginal_likelihood_q:[2,2,1,""],variable_cim_xu_marginal_likelihood_theta:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator":{ParametersEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator":{compute_parameters_for_node:[2,2,1,""],compute_state_res_time_for_node:[2,2,1,""],compute_state_transitions_for_a_node:[2,2,1,""],fast_init:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator":{StructureConstraintBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator":{complete_test:[2,2,1,""],compute_thumb_value:[2,2,1,""],ctpc_algorithm:[2,2,1,""],estimate_structure:[2,2,1,""],independence_test:[2,2,1,""],one_iteration_of_CTPC_algorithm:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator":{StructureEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator":{adjacency_matrix:[2,2,1,""],build_complete_graph:[2,2,1,""],build_removable_edges_matrix:[2,2,1,""],estimate_structure:[2,2,1,""],generate_possible_sub_sets_of_size:[2,2,1,""],save_plot_estimated_structure_graph:[2,2,1,""],save_results:[2,2,1,""],spurious_edges:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator":{StructureScoreBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator":{estimate_parents:[2,2,1,""],estimate_structure:[2,2,1,""],get_score_from_graph:[2,2,1,""]},"PyCTBN.PyCTBN.optimizers":{constraint_based_optimizer:[3,0,0,"-"],hill_climbing_search:[3,0,0,"-"],optimizer:[3,0,0,"-"],tabu_search:[3,0,0,"-"]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer":{ConstraintBasedOptimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search":{HillClimbing:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search.HillClimbing":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer":{Optimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer.Optimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search":{TabuSearch:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search.TabuSearch":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.structure_graph":{conditional_intensity_matrix:[4,0,0,"-"],network_graph:[4,0,0,"-"],sample_path:[4,0,0,"-"],set_of_cims:[4,0,0,"-"],structure:[4,0,0,"-"],trajectory:[4,0,0,"-"]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix":{ConditionalIntensityMatrix:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix":{cim:[4,2,1,""],compute_cim_coefficients:[4,2,1,""],state_residence_times:[4,2,1,""],state_transition_matrix:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph":{NetworkGraph:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph":{add_edges:[4,2,1,""],add_nodes:[4,2,1,""],build_p_comb_structure_for_a_node:[4,2,1,""],build_time_columns_filtering_for_a_node:[4,2,1,""],build_time_scalar_indexing_structure_for_a_node:[4,2,1,""],build_transition_filtering_for_a_node:[4,2,1,""],build_transition_scalar_indexing_structure_for_a_node:[4,2,1,""],clear_indexing_filtering_structures:[4,2,1,""],edges:[4,2,1,""],fast_init:[4,2,1,""],get_node_indx:[4,2,1,""],get_ordered_by_indx_set_of_parents:[4,2,1,""],get_parents_by_id:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],has_edge:[4,2,1,""],nodes:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_values:[4,2,1,""],p_combs:[4,2,1,""],remove_edges:[4,2,1,""],remove_node:[4,2,1,""],time_filtering:[4,2,1,""],time_scalar_indexing_strucure:[4,2,1,""],transition_filtering:[4,2,1,""],transition_scalar_indexing_structure:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path":{SamplePath:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath":{build_structure:[4,2,1,""],build_trajectories:[4,2,1,""],clear_memory:[4,2,1,""],has_prior_net_structure:[4,2,1,""],structure:[4,2,1,""],total_variables_count:[4,2,1,""],trajectories:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims":{SetOfCims:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims":{actual_cims:[4,2,1,""],build_cims:[4,2,1,""],build_times_and_transitions_structures:[4,2,1,""],filter_cims_with_mask:[4,2,1,""],get_cims_number:[4,2,1,""],p_combs:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.structure":{Structure:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.structure.Structure":{add_edge:[4,2,1,""],clean_structure_edges:[4,2,1,""],contains_edge:[4,2,1,""],edges:[4,2,1,""],get_node_id:[4,2,1,""],get_node_indx:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_labels:[4,2,1,""],nodes_values:[4,2,1,""],remove_edge:[4,2,1,""],remove_node:[4,2,1,""],total_variables_number:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory":{Trajectory:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory":{complete_trajectory:[4,2,1,""],size:[4,2,1,""],times:[4,2,1,""],trajectory:[4,2,1,""]},"PyCTBN.PyCTBN.utility":{abstract_importer:[5,0,0,"-"],cache:[5,0,0,"-"],json_importer:[5,0,0,"-"],sample_importer:[5,0,0,"-"]},"PyCTBN.PyCTBN.utility.abstract_importer":{AbstractImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter":{build_list_of_samples_array:[5,2,1,""],build_sorter:[5,2,1,""],clear_concatenated_frame:[5,2,1,""],compute_row_delta_in_all_samples_frames:[5,2,1,""],compute_row_delta_sigle_samples_frame:[5,2,1,""],concatenated_samples:[5,2,1,""],dataset_id:[5,2,1,""],file_path:[5,2,1,""],sorter:[5,2,1,""],structure:[5,2,1,""],variables:[5,2,1,""]},"PyCTBN.PyCTBN.utility.cache":{Cache:[5,1,1,""]},"PyCTBN.PyCTBN.utility.cache.Cache":{clear:[5,2,1,""],find:[5,2,1,""],put:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_importer":{JsonImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_importer.JsonImporter":{build_sorter:[5,2,1,""],clear_data_frame_list:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""],import_sampled_cims:[5,2,1,""],import_structure:[5,2,1,""],import_trajectories:[5,2,1,""],import_variables:[5,2,1,""],normalize_trajectories:[5,2,1,""],one_level_normalizing:[5,2,1,""],read_json_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.sample_importer":{SampleImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.sample_importer.SampleImporter":{build_sorter:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""]},"PyCTBN.tests":{estimators:[7,0,0,"-"],optimizers:[8,0,0,"-"],structure_graph:[9,0,0,"-"],utility:[10,0,0,"-"]},"PyCTBN.tests.estimators":{test_parameters_estimator:[7,0,0,"-"],test_structure_constraint_based_estimator:[7,0,0,"-"],test_structure_estimator:[7,0,0,"-"],test_structure_score_based_estimator:[7,0,0,"-"]},"PyCTBN.tests.estimators.test_parameters_estimator":{TestParametersEstimatior:[7,1,1,""]},"PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior":{aux_import_sampled_cims:[7,2,1,""],cim_equality_test:[7,2,1,""],equality_of_cims_of_node:[7,2,1,""],setUpClass:[7,2,1,""],test_compute_parameters_for_node:[7,2,1,""],test_fast_init:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator":{TestStructureConstraintBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_estimator":{TestStructureEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator":{setUpClass:[7,2,1,""],test_adjacency_matrix:[7,2,1,""],test_build_complete_graph:[7,2,1,""],test_build_removable_edges_matrix:[7,2,1,""],test_generate_possible_sub_sets_of_size:[7,2,1,""],test_init:[7,2,1,""],test_save_plot_estimated_graph:[7,2,1,""],test_save_results:[7,2,1,""],test_time:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator":{TestStructureScoreBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""],test_structure_monoprocesso:[7,2,1,""]},"PyCTBN.tests.optimizers":{test_hill_climbing_search:[8,0,0,"-"],test_tabu_search:[8,0,0,"-"]},"PyCTBN.tests.optimizers.test_hill_climbing_search":{TestHillClimbingSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_hill_climbing_search.TestHillClimbingSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.optimizers.test_tabu_search":{TestTabuSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_tabu_search.TestTabuSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.structure_graph":{test_cim:[9,0,0,"-"],test_networkgraph:[9,0,0,"-"],test_sample_path:[9,0,0,"-"],test_setofcims:[9,0,0,"-"],test_structure:[9,0,0,"-"],test_trajectory:[9,0,0,"-"]},"PyCTBN.tests.structure_graph.test_cim":{TestConditionalIntensityMatrix:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix":{setUpClass:[9,2,1,""],test_compute_cim_coefficients:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph":{TestNetworkGraph:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph":{aux_build_p_combs_structure:[9,2,1,""],aux_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],aux_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],aux_build_transition_columns_filtering_structure:[9,2,1,""],aux_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_add_edges:[9,2,1,""],test_add_nodes:[9,2,1,""],test_build_p_combs_structure:[9,2,1,""],test_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],test_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],test_build_transition_columns_filtering_structure:[9,2,1,""],test_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],test_fast_init:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_ordered_by_indx_set_of_parents:[9,2,1,""],test_get_parents_by_id:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_sample_path":{TestSamplePath:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath":{setUpClass:[9,2,1,""],test_buid_samplepath_no_concatenated_samples:[9,2,1,""],test_buid_samplepath_no_variables:[9,2,1,""],test_build_saplepath_no_prior_net_structure:[9,2,1,""],test_build_structure:[9,2,1,""],test_build_structure_bad_sorter:[9,2,1,""],test_build_trajectories:[9,2,1,""],test_init:[9,2,1,""],test_init_not_filled_dataframse:[9,2,1,""],test_init_not_initialized_importer:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_setofcims":{TestSetOfCims:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims":{another_filtering_method:[9,2,1,""],aux_test_build_cims:[9,2,1,""],aux_test_init:[9,2,1,""],build_p_comb_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_build_cims:[9,2,1,""],test_filter_cims_with_mask:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_structure":{TestStructure:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_structure.TestStructure":{setUpClass:[9,2,1,""],test_edges_operations:[9,2,1,""],test_equality:[9,2,1,""],test_get_node_id:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_positional_node_indx:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectory":{TestTrajectory:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory":{setUpClass:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.utility":{test_cache:[10,0,0,"-"],test_json_importer:[10,0,0,"-"],test_sample_importer:[10,0,0,"-"]},"PyCTBN.tests.utility.test_cache":{TestCache:[10,1,1,""]},"PyCTBN.tests.utility.test_cache.TestCache":{test_clear:[10,2,1,""],test_find:[10,2,1,""],test_init:[10,2,1,""],test_put:[10,2,1,""]},"PyCTBN.tests.utility.test_json_importer":{TestJsonImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_json_importer.TestJsonImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_build_sorter:[10,2,1,""],test_clear_concatenated_frame:[10,2,1,""],test_clear_data_frame_list:[10,2,1,""],test_compute_row_delta_in_all_frames:[10,2,1,""],test_compute_row_delta_in_all_frames_not_init_sorter:[10,2,1,""],test_compute_row_delta_single_samples_frame:[10,2,1,""],test_dataset_id:[10,2,1,""],test_file_path:[10,2,1,""],test_import_data:[10,2,1,""],test_import_sampled_cims:[10,2,1,""],test_import_structure:[10,2,1,""],test_import_variables:[10,2,1,""],test_init:[10,2,1,""],test_normalize_trajectories:[10,2,1,""],test_normalize_trajectories_wrong_indx:[10,2,1,""],test_normalize_trajectories_wrong_key:[10,2,1,""],test_read_json_file_found:[10,2,1,""],test_read_json_file_not_found:[10,2,1,""]},"PyCTBN.tests.utility.test_sample_importer":{TestSampleImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_sample_importer.TestSampleImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_init:[10,2,1,""],test_order:[10,2,1,""]},PyCTBN:{PyCTBN:[1,0,0,"-"],tests:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"abstract":[2,3,4,5,12],"boolean":[2,4],"case":[7,8,9,10],"class":[2,3,4,5,7,8,9,10,12],"default":[2,3],"float":2,"function":2,"import":[4,5,13,14],"int":[2,3,4,5],"null":2,"return":[2,3,4,5,9,12],"static":[2,4],"super":12,"true":[2,12],"var":12,HAS:5,Has:[2,4],NOT:2,The:[2,4,5,12],Use:[2,12],__actual_cach:5,__init__:12,__list_of_sets_of_par:5,_actual_cim:4,_actual_trajectori:4,_aggregated_info_about_nodes_par:4,_array_indx:5,_cach:2,_cim:4,_complete_graph:2,_df_samples_list:[5,12],_df_structur:5,_df_variabl:[5,12],_file_path:12,_graph:[4,12],_import:4,_net_graph:2,_node:2,_node_id:4,_nodes_indx:2,_nodes_v:2,_p_combs_structur:4,_raw_data:5,_sample_path:2,_single_set_of_cim:2,_sorter:[5,12],_state_residence_tim:4,_structur:4,_structure_label:5,_time:4,_time_filt:4,_time_scalar_indexing_structur:4,_total_variables_count:4,_total_variables_numb:4,_trajectori:4,_transition_filt:4,_transition_matric:4,_transition_scalar_indexing_structur:4,_variables_label:5,abc:[3,5],about:[3,4],abstract_import:[0,1,4,13,14],abstractimport:[4,5,12],act:5,actual:[2,4],actual_cim:[4,12],add:[4,5],add_edg:4,add_nod:4,added:2,addit:2,adjac:[2,12],adjacency_matrix:[2,12],after:5,against:2,aggreg:4,algorithm:[2,3,12],all:[2,3,4,5,9,12],alpha_xu:2,alpha_xxu:2,alreadi:[5,12],also:[2,4],ani:[2,3],anoth:4,another_filtering_method:9,approach:2,arc:5,arrai:[2,4,5,12],assign:2,assum:2,aux_build_p_combs_structur:9,aux_build_time_columns_filtering_structure_for_a_nod:9,aux_build_time_scalar_indexing_structure_for_a_nod:9,aux_build_transition_columns_filtering_structur:9,aux_build_transition_scalar_indexing_structure_for_a_nod:9,aux_import_sampled_cim:7,aux_test_build_cim:9,aux_test_init:9,axi:12,base:[2,3,4,5,7,8,9,10],bayesian:2,befor:[2,3,7,8,9,10],belong:2,best:2,between:5,bool:[2,4],both:[2,5],bound:4,build:[2,4,5,9,12],build_cim:4,build_complete_graph:2,build_list_of_samples_arrai:5,build_p_comb_structure_for_a_nod:[4,9],build_removable_edges_matrix:2,build_sort:[5,12],build_structur:[4,12],build_time_columns_filtering_for_a_nod:4,build_time_scalar_indexing_structure_for_a_nod:4,build_times_and_transitions_structur:4,build_trajectori:[4,12],build_transition_filtering_for_a_nod:4,build_transition_scalar_indexing_structure_for_a_nod:4,built:2,cach:[0,1,2,13,14],calcul:2,call:[5,12],cardin:[2,4,5,9],cardinalit:[4,5],caridin:4,caridinalit:4,chang:[4,5],check:4,chi:2,chi_test:2,chi_test_alfa:2,child:[2,3],child_indx:2,child_states_numb:2,child_val:2,cim1:[2,7],cim2:[2,7],cim:[2,4,5,12],cim_equality_test:7,cims_kei:5,cims_label:7,classmethod:[7,8,9,10],clean_structure_edg:4,clear:[4,5],clear_concatenated_fram:5,clear_data_frame_list:5,clear_indexing_filtering_structur:4,clear_memori:4,climb:[2,3],coeffici:4,col:4,color:2,cols_filt:2,column:[2,4,5,12],columns_head:5,comb:4,combin:[4,5,9],combinatori:[4,9],common:2,complet:[2,4,5],complete_test:2,complete_trajectori:4,comput:[2,3,4,5,12],compute_cim_coeffici:4,compute_parameters_for_nod:[2,12],compute_row_delta_in_all_samples_fram:[5,12],compute_row_delta_sigle_samples_fram:5,compute_state_res_time_for_nod:2,compute_state_transitions_for_a_nod:2,compute_thumb_valu:2,concatanated_sampl:5,concaten:[4,5],concatenated_sampl:5,condit:4,conditional_intensity_matrix:[0,1,2,13,14],conditionalintensitymatrix:[2,4],consid:[2,4],constraint:2,constraint_based_optim:[0,1,13,14],constraintbasedoptim:3,construct:[4,5,12],conta:5,contain:[2,4,5,9],contains_edg:4,content:[13,14],convert:[2,5],copi:5,core:5,correct:[4,5],could:2,count:4,creat:[2,4,12],csv:12,csvimport:12,ctbn:2,ctpc:[2,3,12],ctpc_algorithm:[2,12],current:[2,3,5],cut:5,dafram:5,data:[2,3,4,5,13,14],datafram:[4,5,12],dataset:[3,4,5],dataset_id:[5,12],datfram:5,def:12,defin:5,definit:5,defualt:2,delta:[2,4,5],demonstr:12,describ:5,desir:[2,4],df_samples_list:5,dict:[5,12],dictionari:5,differ:5,differt:2,digraph:2,dimens:4,dir:12,direct:[2,4],directli:5,disabl:[2,3],disable_multiprocess:2,distribuit:2,doc:5,doubl:4,download:12,drop:12,duplic:4,dyn:12,each:[2,3,5],edg:[2,4,5,12],edges_list:4,end:5,entir:2,equal:4,equality_of_cims_of_nod:7,est:12,estim:[0,1,3,4,6,13,14],estimate_par:2,estimate_structur:2,estimated_cim:7,everi:[4,5],exam:12,exampl:[5,13,14],exclud:2,exctract:5,exist:5,exp_test_alfa:2,exponenti:2,expos:5,extend:12,extens:[2,5],extract:[4,5],fals:2,fam_score_calcul:[0,1,13,14],famscor:2,famscorecalcul:2,fast_init:[2,4,12],file:[2,5,12],file_path:[2,5,12],filepath:5,fill:[2,12],filter:[2,4],filter_cims_with_mask:4,find:[2,5],first:[2,12],fixtur:[7,8,9,10],follow:[4,5],form:4,format:12,formula:2,found:5,frame:5,from:[4,5,12],from_nod:5,gener:2,generate_possible_sub_sets_of_s:2,get:[2,5],get_cims_numb:4,get_fam_scor:2,get_node_id:4,get_node_indx:4,get_ordered_by_indx_set_of_par:4,get_parents_by_id:4,get_positional_node_indx:4,get_score_from_graph:2,get_states_numb:4,given:[2,4,5],glob:12,graph:[2,4,9,12],graph_struct:4,graphic:2,grid:[4,9],grpah:12,has:[5,12],has_edg:4,has_prior_net_structur:4,have:5,header:5,header_column:5,hill:[2,3],hill_climbing_search:[0,1,13,14],hillclimb:3,hold:[2,4],hook:[7,8,9,10],how:5,hyperparamet:2,hypothesi:2,identifi:[2,4,5],iff:2,implement:[3,5,13,14],import_data:[5,12],import_sampled_cim:5,import_structur:5,import_trajectori:5,import_vari:[5,12],improv:[2,3],includ:2,independ:2,independence_test:2,index:[2,4,5,12,13],indic:4,indx:5,info:[4,12],inform:[3,4],init:12,initi:[2,4,5,12],inplac:12,insid:12,instal:[13,14],interest:4,interfac:3,intes:4,iter:[2,3],iterations_numb:[2,3],its:[2,3],join:12,json:[2,5,12],json_import:[0,1,13,14],jsonarrai:5,jsonimport:[5,12],keep:[2,3,5],kei:5,kind:2,knowledg:2,known:2,known_edg:2,label:[2,3,4,5],lenght:[2,3],level:[2,5],likelihood:2,list:[2,3,4,5,12],list_of_column:4,list_of_edg:4,list_of_nod:4,load:5,loop:2,m_xu_suff_stat:2,m_xxu_suff_stat:2,main:12,margin:2,marginal_likelihood_q:2,marginal_likelihood_theta:2,mask:[4,9],mask_arr:4,matric:[2,4],matrix:[2,4,5,9,12],max_par:[2,3],maximum:[2,3],member:[4,5],mention:4,merg:5,method:[2,5,7,8,9,10],methodnam:[7,8,9,10],model:2,modul:[13,14],multipl:5,multiprocess:2,name:[2,4,5,12],ndarrai:[2,4,5],necessari:[2,4,5],nest:5,net:[2,3,4,5,12],net_graph:2,network:[2,4,5],network_graph:[0,1,2,13,14],networkgraph:[2,4,12],networkx:2,node:[2,3,4,5,9,12],node_id:[2,3,4,9],node_index:4,node_indx:[2,4],node_st:[4,9],node_states_numb:[4,9],nodes_index:4,nodes_indexes_arr:4,nodes_label:4,nodes_labels_list:4,nodes_numb:4,nodes_vals_arr:4,nodes_valu:[4,12],none:[2,3,4,5,7,9,10,12],normal:5,normalize_trajectori:5,number:[2,3,4],numpi:[2,4,5,9],obj:[10,12],object:[2,3,4,5,12],one:[4,5],one_iteration_of_ctpc_algorithm:2,one_level_norm:5,onli:5,oper:2,optim:[0,1,2,6,13,14],optimize_structur:3,option:[2,3],order:[2,5,10],origin:5,original_cols_numb:4,otherwis:[2,5],out:5,outer:[5,12],over:2,own:[13,14],p_comb:[4,9],p_indx:[4,9],p_val:9,p_valu:9,packag:[13,14],page:13,panda:[5,12],param:4,paramet:[2,3,4,5,9,13,14],parameters_estim:[0,1,13,14],parametersestim:[2,12],parent:[2,3,4,5],parent_indx:2,parent_label:2,parent_set:2,parent_set_v:2,parent_v:2,parent_valu:9,parents_cardin:4,parents_comb:5,parents_index:4,parents_indx:9,parents_label:[4,9],parents_states_numb:[4,9],parents_v:[4,9],parents_valu:[4,9],part:2,particular:[2,5],pass:12,path:[2,5,12],patienc:[2,3],peest:12,perform:2,pip:12,place:5,plot:2,png:2,posit:[4,5],possibl:[2,4],predict:3,prepar:5,present:[2,5],print:12,prior:[2,12],prior_net_structur:5,process:[2,3,4,5],properli:5,properti:[4,5],put:5,pyctbn:12,q_xx:4,rappres:4,raw:5,raw_data:5,read:[5,12],read_csv:12,read_csv_fil:12,read_fil:12,read_json_fil:5,real:[2,4,5,12],red:2,refer:[4,5],reject:2,rel:4,relat:5,releas:12,remain:5,remov:[2,4,5],remove_edg:4,remove_nod:4,repres:4,represent:2,res:4,resid:[2,4],result:[2,5,12],rtype:4,rule:[2,3],run:[7,8,9,10],runtest:[7,8,9,10],same:5,sampl:[4,5,12],sample_fram:[5,12],sample_import:[0,1,13,14],sample_path:[0,1,2,13,14],sampled_cim:7,sampleimport:5,samplepath:[2,4,12],samples_label:5,save:[2,12],save_plot_estimated_structure_graph:2,save_result:[2,12],scalar_index:2,scalar_indexes_struct:2,score:2,se1:12,search:[2,3,13],second:2,see:5,select:12,self:[2,5,12],sep:2,sep_set:2,set:[2,4,5,7,8,9,10],set_of_cim:[0,1,2,5,13,14],setofcim:[2,4,5,12],setupclass:[7,8,9,10],shift:[4,5],shifted_cols_head:5,show:2,signific:2,simbol:5,simpl:12,simpli:12,sinc:4,single_cim_xu_marginal_likelihood_q:2,single_cim_xu_marginal_likelihood_theta:2,single_internal_cim_xxu_marginal_likelihood_theta:2,size:[2,4],socim:5,sofc1:12,sorter:5,specif:[2,4,12],spuriou:2,spurious_edg:2,start:5,state:[2,4],state_res_tim:4,state_residence_tim:4,state_transition_matrix:4,statist:2,stop:[2,3],str:[2,3,4,5,12],string:[2,3,4,5],structur:[0,1,2,3,5,9,13,14],structure_constraint_based_estim:[0,1,13,14],structure_estim:[0,1,3,13,14],structure_estimation_exampl:12,structure_graph:[0,1,2,5,6,13,14],structure_label:5,structure_score_based_estim:[0,1,13,14],structureconstraintbasedestim:2,structureestim:[2,3,12],structurescorebasedestim:2,structut:4,style:2,submodul:[1,6,13,14],subpackag:[13,14],subset:2,suffici:2,suffuci:2,symbol:[4,5],synthet:5,t_xu_suff_stat:2,tabu:[2,3],tabu_length:[2,3],tabu_rules_dur:[2,3],tabu_search:[0,1,13,14],tabusearch:3,take:12,tar:12,task:[2,4],tau_xu:2,ternari:12,test:2,test_add_edg:9,test_add_nod:9,test_adjacency_matrix:7,test_buid_samplepath_no_concatenated_sampl:9,test_buid_samplepath_no_vari:9,test_build_cim:9,test_build_complete_graph:7,test_build_p_combs_structur:9,test_build_removable_edges_matrix:7,test_build_saplepath_no_prior_net_structur:9,test_build_sort:10,test_build_structur:9,test_build_structure_bad_sort:9,test_build_time_columns_filtering_structure_for_a_nod:9,test_build_time_scalar_indexing_structure_for_a_nod:9,test_build_trajectori:9,test_build_transition_columns_filtering_structur:9,test_build_transition_scalar_indexing_structure_for_a_nod:9,test_cach:6,test_child:2,test_cim:6,test_clear:10,test_clear_concatenated_fram:10,test_clear_data_frame_list:10,test_compute_cim_coeffici:9,test_compute_parameters_for_nod:7,test_compute_row_delta_in_all_fram:10,test_compute_row_delta_in_all_frames_not_init_sort:10,test_compute_row_delta_single_samples_fram:10,test_dataset_id:10,test_edges_oper:9,test_equ:9,test_fast_init:[7,9],test_file_path:10,test_filter_cims_with_mask:9,test_find:10,test_generate_possible_sub_sets_of_s:7,test_get_node_id:9,test_get_node_indx:9,test_get_ordered_by_indx_set_of_par:9,test_get_parents_by_id:9,test_get_positional_node_indx:9,test_get_states_numb:9,test_hill_climbing_search:6,test_import_data:10,test_import_sampled_cim:10,test_import_structur:10,test_import_vari:10,test_init:[7,9,10],test_init_not_filled_dataframs:9,test_init_not_initialized_import:9,test_json_import:6,test_networkgraph:6,test_normalize_trajectori:10,test_normalize_trajectories_wrong_indx:10,test_normalize_trajectories_wrong_kei:10,test_ord:10,test_par:2,test_parameters_estim:6,test_put:10,test_read_json_file_found:10,test_read_json_file_not_found:10,test_repr:9,test_sample_import:6,test_sample_path:6,test_save_plot_estimated_graph:7,test_save_result:7,test_setofcim:6,test_structur:[6,8],test_structure_1:7,test_structure_2:7,test_structure_3:[7,8],test_structure_constraint_based_estim:6,test_structure_estim:6,test_structure_monoprocesso:7,test_structure_score_based_estim:6,test_tabu_search:6,test_tim:7,test_trajectori:6,testcach:10,testcas:[7,8,9,10],testconditionalintensitymatrix:9,testhillclimbingsearch:8,testjsonimport:10,testnetworkgraph:9,testparametersestimatior:7,testsampleimport:10,testsamplepath:9,testsetofcim:9,teststructur:9,teststructureconstraintbasedestim:7,teststructureestim:7,teststructurescorebasedestim:7,testtabusearch:8,testtrajectori:9,tha:5,theta:2,thi:[2,4,5,12],three:12,threshold:2,thumb:2,thumb_threshold:2,thumb_valu:2,time:[2,4,5,12],time_filt:4,time_kei:5,time_scalar_indexing_strucur:4,timestamp:5,to_nod:5,tot_vars_count:[2,3],total:[2,4],total_variables_count:4,total_variables_numb:4,traj:5,trajecory_head:5,trajectori:[0,1,2,5,12,13,14],trajectories_kei:5,trajectory_list:5,trajectri:12,transit:[2,4,5],transition_filt:4,transition_matric:4,transition_scalar_indexing_structur:4,tri:5,tupl:4,tutori:5,two:2,type:[2,3,4,5,12],union:5,uniqu:5,unittest:[7,8,9,10],unus:4,usag:[13,14],use:[2,12],used:[2,3,4,5],using:[2,3,4,5],util:[0,1,4,6,13,14],valid:2,valu:[2,3,4,5,9,12],values_list:12,var_id:2,variabl:[2,3,4,5,12],variable_cardin:5,variable_cim_xu_marginal_likelihood_q:2,variable_cim_xu_marginal_likelihood_theta:2,variable_label:5,variables_kei:5,variables_label:5,vector:[2,4],want:12,when:2,where:5,which:[2,3,4,5],whl:12,who:2,without:[2,3],you:[2,5,12],your:[13,14]},titles:["PyCTBN package","PyCTBN.PyCTBN package","PyCTBN.PyCTBN.estimators package","PyCTBN.PyCTBN.optimizers package","PyCTBN.PyCTBN.structure_graph package","PyCTBN.PyCTBN.utility package","PyCTBN.tests package","PyCTBN.tests.estimators package","PyCTBN.tests.optimizers package","PyCTBN.tests.structure_graph package","PyCTBN.tests.utility package","basic_main module","Examples","Welcome to PyCTBN\u2019s documentation!","PyCTBN","setup module"],titleterms:{"import":12,abstract_import:5,basic_main:11,cach:5,conditional_intensity_matrix:4,constraint_based_optim:3,content:[0,1,2,3,4,5,6,7,8,9,10],data:12,document:13,estim:[2,7,12],exampl:12,fam_score_calcul:2,hill_climbing_search:3,implement:12,indic:13,instal:12,json_import:5,modul:[0,1,2,3,4,5,6,7,8,9,10,11,15],network_graph:4,optim:[3,8],own:12,packag:[0,1,2,3,4,5,6,7,8,9,10],paramet:12,parameters_estim:2,pyctbn:[0,1,2,3,4,5,6,7,8,9,10,13,14],sample_import:5,sample_path:4,set_of_cim:4,setup:15,structur:[4,12],structure_constraint_based_estim:2,structure_estim:2,structure_graph:[4,9],structure_score_based_estim:2,submodul:[0,2,3,4,5,7,8,9,10],subpackag:[0,1,6],tabl:13,tabu_search:3,test:[6,7,8,9,10],test_cach:10,test_cim:9,test_hill_climbing_search:8,test_json_import:10,test_networkgraph:9,test_parameters_estim:7,test_sample_import:10,test_sample_path:9,test_setofcim:9,test_structur:9,test_structure_constraint_based_estim:7,test_structure_estim:7,test_structure_score_based_estim:7,test_tabu_search:8,test_trajectori:9,trajectori:4,usag:12,util:[5,10],welcom:13,your:12}}) \ No newline at end of file +Search.setIndex({docnames:["PyCTBN","PyCTBN.PyCTBN","PyCTBN.PyCTBN.estimators","PyCTBN.PyCTBN.optimizers","PyCTBN.PyCTBN.structure_graph","PyCTBN.PyCTBN.utility","PyCTBN.tests","PyCTBN.tests.estimators","PyCTBN.tests.optimizers","PyCTBN.tests.structure_graph","PyCTBN.tests.utility","basic_main","examples","index","modules","setup"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["PyCTBN.rst","PyCTBN.PyCTBN.rst","PyCTBN.PyCTBN.estimators.rst","PyCTBN.PyCTBN.optimizers.rst","PyCTBN.PyCTBN.structure_graph.rst","PyCTBN.PyCTBN.utility.rst","PyCTBN.tests.rst","PyCTBN.tests.estimators.rst","PyCTBN.tests.optimizers.rst","PyCTBN.tests.structure_graph.rst","PyCTBN.tests.utility.rst","basic_main.rst","examples.rst","index.rst","modules.rst","setup.rst"],objects:{"":{PyCTBN:[0,0,0,"-"]},"PyCTBN.PyCTBN":{estimators:[2,0,0,"-"],optimizers:[3,0,0,"-"],structure_graph:[4,0,0,"-"],utility:[5,0,0,"-"]},"PyCTBN.PyCTBN.estimators":{fam_score_calculator:[2,0,0,"-"],parameters_estimator:[2,0,0,"-"],structure_constraint_based_estimator:[2,0,0,"-"],structure_estimator:[2,0,0,"-"],structure_score_based_estimator:[2,0,0,"-"]},"PyCTBN.PyCTBN.estimators.fam_score_calculator":{FamScoreCalculator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator":{get_fam_score:[2,2,1,""],marginal_likelihood_q:[2,2,1,""],marginal_likelihood_theta:[2,2,1,""],single_cim_xu_marginal_likelihood_q:[2,2,1,""],single_cim_xu_marginal_likelihood_theta:[2,2,1,""],single_internal_cim_xxu_marginal_likelihood_theta:[2,2,1,""],variable_cim_xu_marginal_likelihood_q:[2,2,1,""],variable_cim_xu_marginal_likelihood_theta:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator":{ParametersEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator":{compute_parameters_for_node:[2,2,1,""],compute_state_res_time_for_node:[2,2,1,""],compute_state_transitions_for_a_node:[2,2,1,""],fast_init:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator":{StructureConstraintBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator":{complete_test:[2,2,1,""],compute_thumb_value:[2,2,1,""],ctpc_algorithm:[2,2,1,""],estimate_structure:[2,2,1,""],independence_test:[2,2,1,""],one_iteration_of_CTPC_algorithm:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator":{StructureEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator":{adjacency_matrix:[2,2,1,""],build_complete_graph:[2,2,1,""],build_removable_edges_matrix:[2,2,1,""],estimate_structure:[2,2,1,""],generate_possible_sub_sets_of_size:[2,2,1,""],save_plot_estimated_structure_graph:[2,2,1,""],save_results:[2,2,1,""],spurious_edges:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator":{StructureScoreBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator":{estimate_parents:[2,2,1,""],estimate_structure:[2,2,1,""],get_score_from_graph:[2,2,1,""]},"PyCTBN.PyCTBN.optimizers":{constraint_based_optimizer:[3,0,0,"-"],hill_climbing_search:[3,0,0,"-"],optimizer:[3,0,0,"-"],tabu_search:[3,0,0,"-"]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer":{ConstraintBasedOptimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search":{HillClimbing:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search.HillClimbing":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer":{Optimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer.Optimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search":{TabuSearch:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search.TabuSearch":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.structure_graph":{conditional_intensity_matrix:[4,0,0,"-"],network_graph:[4,0,0,"-"],sample_path:[4,0,0,"-"],set_of_cims:[4,0,0,"-"],structure:[4,0,0,"-"],trajectory:[4,0,0,"-"]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix":{ConditionalIntensityMatrix:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix":{cim:[4,2,1,""],compute_cim_coefficients:[4,2,1,""],state_residence_times:[4,2,1,""],state_transition_matrix:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph":{NetworkGraph:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph":{add_edges:[4,2,1,""],add_nodes:[4,2,1,""],build_p_comb_structure_for_a_node:[4,2,1,""],build_time_columns_filtering_for_a_node:[4,2,1,""],build_time_scalar_indexing_structure_for_a_node:[4,2,1,""],build_transition_filtering_for_a_node:[4,2,1,""],build_transition_scalar_indexing_structure_for_a_node:[4,2,1,""],clear_indexing_filtering_structures:[4,2,1,""],edges:[4,2,1,""],fast_init:[4,2,1,""],get_node_indx:[4,2,1,""],get_ordered_by_indx_set_of_parents:[4,2,1,""],get_parents_by_id:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],has_edge:[4,2,1,""],nodes:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_values:[4,2,1,""],p_combs:[4,2,1,""],remove_edges:[4,2,1,""],remove_node:[4,2,1,""],time_filtering:[4,2,1,""],time_scalar_indexing_strucure:[4,2,1,""],transition_filtering:[4,2,1,""],transition_scalar_indexing_structure:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path":{SamplePath:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath":{build_structure:[4,2,1,""],build_trajectories:[4,2,1,""],clear_memory:[4,2,1,""],has_prior_net_structure:[4,2,1,""],structure:[4,2,1,""],total_variables_count:[4,2,1,""],trajectories:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims":{SetOfCims:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims":{actual_cims:[4,2,1,""],build_cims:[4,2,1,""],build_times_and_transitions_structures:[4,2,1,""],filter_cims_with_mask:[4,2,1,""],get_cims_number:[4,2,1,""],p_combs:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.structure":{Structure:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.structure.Structure":{add_edge:[4,2,1,""],clean_structure_edges:[4,2,1,""],contains_edge:[4,2,1,""],edges:[4,2,1,""],get_node_id:[4,2,1,""],get_node_indx:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_labels:[4,2,1,""],nodes_values:[4,2,1,""],remove_edge:[4,2,1,""],remove_node:[4,2,1,""],total_variables_number:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory":{Trajectory:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory":{complete_trajectory:[4,2,1,""],size:[4,2,1,""],times:[4,2,1,""],trajectory:[4,2,1,""]},"PyCTBN.PyCTBN.utility":{abstract_importer:[5,0,0,"-"],cache:[5,0,0,"-"],json_importer:[5,0,0,"-"],sample_importer:[5,0,0,"-"]},"PyCTBN.PyCTBN.utility.abstract_importer":{AbstractImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter":{build_list_of_samples_array:[5,2,1,""],build_sorter:[5,2,1,""],clear_concatenated_frame:[5,2,1,""],compute_row_delta_in_all_samples_frames:[5,2,1,""],compute_row_delta_sigle_samples_frame:[5,2,1,""],concatenated_samples:[5,2,1,""],dataset_id:[5,2,1,""],file_path:[5,2,1,""],sorter:[5,2,1,""],structure:[5,2,1,""],variables:[5,2,1,""]},"PyCTBN.PyCTBN.utility.cache":{Cache:[5,1,1,""]},"PyCTBN.PyCTBN.utility.cache.Cache":{clear:[5,2,1,""],find:[5,2,1,""],put:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_importer":{JsonImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_importer.JsonImporter":{build_sorter:[5,2,1,""],clear_data_frame_list:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""],import_sampled_cims:[5,2,1,""],import_structure:[5,2,1,""],import_trajectories:[5,2,1,""],import_variables:[5,2,1,""],normalize_trajectories:[5,2,1,""],one_level_normalizing:[5,2,1,""],read_json_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.sample_importer":{SampleImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.sample_importer.SampleImporter":{build_sorter:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""]},"PyCTBN.tests":{estimators:[7,0,0,"-"],optimizers:[8,0,0,"-"],structure_graph:[9,0,0,"-"],utility:[10,0,0,"-"]},"PyCTBN.tests.estimators":{test_parameters_estimator:[7,0,0,"-"],test_structure_constraint_based_estimator:[7,0,0,"-"],test_structure_estimator:[7,0,0,"-"],test_structure_score_based_estimator:[7,0,0,"-"]},"PyCTBN.tests.estimators.test_parameters_estimator":{TestParametersEstimatior:[7,1,1,""]},"PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior":{aux_import_sampled_cims:[7,2,1,""],cim_equality_test:[7,2,1,""],equality_of_cims_of_node:[7,2,1,""],setUpClass:[7,2,1,""],test_compute_parameters_for_node:[7,2,1,""],test_fast_init:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator":{TestStructureConstraintBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_estimator":{TestStructureEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator":{setUpClass:[7,2,1,""],test_adjacency_matrix:[7,2,1,""],test_build_complete_graph:[7,2,1,""],test_build_removable_edges_matrix:[7,2,1,""],test_generate_possible_sub_sets_of_size:[7,2,1,""],test_init:[7,2,1,""],test_save_plot_estimated_graph:[7,2,1,""],test_save_results:[7,2,1,""],test_time:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator":{TestStructureScoreBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""],test_structure_monoprocesso:[7,2,1,""]},"PyCTBN.tests.optimizers":{test_hill_climbing_search:[8,0,0,"-"],test_tabu_search:[8,0,0,"-"]},"PyCTBN.tests.optimizers.test_hill_climbing_search":{TestHillClimbingSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_hill_climbing_search.TestHillClimbingSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.optimizers.test_tabu_search":{TestTabuSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_tabu_search.TestTabuSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.structure_graph":{test_cim:[9,0,0,"-"],test_networkgraph:[9,0,0,"-"],test_sample_path:[9,0,0,"-"],test_setofcims:[9,0,0,"-"],test_structure:[9,0,0,"-"],test_trajectory:[9,0,0,"-"]},"PyCTBN.tests.structure_graph.test_cim":{TestConditionalIntensityMatrix:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix":{setUpClass:[9,2,1,""],test_compute_cim_coefficients:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph":{TestNetworkGraph:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph":{aux_build_p_combs_structure:[9,2,1,""],aux_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],aux_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],aux_build_transition_columns_filtering_structure:[9,2,1,""],aux_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_add_edges:[9,2,1,""],test_add_nodes:[9,2,1,""],test_build_p_combs_structure:[9,2,1,""],test_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],test_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],test_build_transition_columns_filtering_structure:[9,2,1,""],test_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],test_fast_init:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_ordered_by_indx_set_of_parents:[9,2,1,""],test_get_parents_by_id:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_sample_path":{TestSamplePath:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath":{setUpClass:[9,2,1,""],test_buid_samplepath_no_concatenated_samples:[9,2,1,""],test_buid_samplepath_no_variables:[9,2,1,""],test_build_saplepath_no_prior_net_structure:[9,2,1,""],test_build_structure:[9,2,1,""],test_build_structure_bad_sorter:[9,2,1,""],test_build_trajectories:[9,2,1,""],test_init:[9,2,1,""],test_init_not_filled_dataframse:[9,2,1,""],test_init_not_initialized_importer:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_setofcims":{TestSetOfCims:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims":{another_filtering_method:[9,2,1,""],aux_test_build_cims:[9,2,1,""],aux_test_init:[9,2,1,""],build_p_comb_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_build_cims:[9,2,1,""],test_filter_cims_with_mask:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_structure":{TestStructure:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_structure.TestStructure":{setUpClass:[9,2,1,""],test_edges_operations:[9,2,1,""],test_equality:[9,2,1,""],test_get_node_id:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_positional_node_indx:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectory":{TestTrajectory:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory":{setUpClass:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.utility":{test_cache:[10,0,0,"-"],test_json_importer:[10,0,0,"-"],test_sample_importer:[10,0,0,"-"]},"PyCTBN.tests.utility.test_cache":{TestCache:[10,1,1,""]},"PyCTBN.tests.utility.test_cache.TestCache":{test_clear:[10,2,1,""],test_find:[10,2,1,""],test_init:[10,2,1,""],test_put:[10,2,1,""]},"PyCTBN.tests.utility.test_json_importer":{TestJsonImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_json_importer.TestJsonImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_build_sorter:[10,2,1,""],test_clear_concatenated_frame:[10,2,1,""],test_clear_data_frame_list:[10,2,1,""],test_compute_row_delta_in_all_frames:[10,2,1,""],test_compute_row_delta_in_all_frames_not_init_sorter:[10,2,1,""],test_compute_row_delta_single_samples_frame:[10,2,1,""],test_dataset_id:[10,2,1,""],test_file_path:[10,2,1,""],test_import_data:[10,2,1,""],test_import_sampled_cims:[10,2,1,""],test_import_structure:[10,2,1,""],test_import_variables:[10,2,1,""],test_init:[10,2,1,""],test_normalize_trajectories:[10,2,1,""],test_normalize_trajectories_wrong_indx:[10,2,1,""],test_normalize_trajectories_wrong_key:[10,2,1,""],test_read_json_file_found:[10,2,1,""],test_read_json_file_not_found:[10,2,1,""]},"PyCTBN.tests.utility.test_sample_importer":{TestSampleImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_sample_importer.TestSampleImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_init:[10,2,1,""],test_order:[10,2,1,""]},PyCTBN:{PyCTBN:[1,0,0,"-"],tests:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"abstract":[2,3,4,5,12],"boolean":[2,4],"case":[7,8,9,10],"class":[2,3,4,5,7,8,9,10,12],"default":[2,3,5],"float":2,"function":2,"import":[4,5,13,14],"int":[2,3,4,5],"null":2,"return":[2,3,4,5,9,12],"static":[2,4],"super":12,"true":[2,12],"var":12,HAS:5,Has:[2,4],NOT:2,The:[2,4,5,12],Use:[2,12],__actual_cach:5,__init__:12,__list_of_sets_of_par:5,_actual_cim:4,_actual_trajectori:4,_aggregated_info_about_nodes_par:4,_array_indx:5,_cach:2,_cim:4,_complete_graph:2,_df_samples_list:[5,12],_df_structur:5,_df_variabl:[5,12],_file_path:12,_graph:[4,12],_import:4,_net_graph:2,_node:2,_node_id:4,_nodes_indx:2,_nodes_v:2,_p_combs_structur:4,_raw_data:5,_sample_path:2,_single_set_of_cim:2,_sorter:[5,12],_state_residence_tim:4,_structur:4,_structure_label:5,_time:4,_time_filt:4,_time_scalar_indexing_structur:4,_total_variables_count:4,_total_variables_numb:4,_trajectori:4,_transition_filt:4,_transition_matric:4,_transition_scalar_indexing_structur:4,_variables_label:5,abc:[3,5],about:[3,4],abstract_import:[0,1,4,13,14],abstractimport:[4,5,12],act:5,actual:[2,4],actual_cim:[4,12],add:[4,5],add_edg:4,add_nod:4,added:2,addit:2,adjac:[2,12],adjacency_matrix:[2,12],after:5,against:2,aggreg:4,algorithm:[2,3,12],all:[2,3,4,5,9,12],alpha_xu:2,alpha_xxu:2,alreadi:[5,12],also:[2,4],ani:[2,3],anoth:4,another_filtering_method:9,approach:2,arc:5,arrai:[2,4,5,12],assign:2,assum:2,aux_build_p_combs_structur:9,aux_build_time_columns_filtering_structure_for_a_nod:9,aux_build_time_scalar_indexing_structure_for_a_nod:9,aux_build_transition_columns_filtering_structur:9,aux_build_transition_scalar_indexing_structure_for_a_nod:9,aux_import_sampled_cim:7,aux_test_build_cim:9,aux_test_init:9,axi:12,base:[2,3,4,5,7,8,9,10],bayesian:2,befor:[2,3,7,8,9,10],belong:2,best:2,between:5,bool:[2,4],both:[2,5],bound:4,build:[2,4,5,9,12],build_cim:4,build_complete_graph:2,build_list_of_samples_arrai:5,build_p_comb_structure_for_a_nod:[4,9],build_removable_edges_matrix:2,build_sort:[5,12],build_structur:[4,12],build_time_columns_filtering_for_a_nod:4,build_time_scalar_indexing_structure_for_a_nod:4,build_times_and_transitions_structur:4,build_trajectori:[4,12],build_transition_filtering_for_a_nod:4,build_transition_scalar_indexing_structure_for_a_nod:4,built:2,cach:[0,1,2,13,14],calcul:2,call:[5,12],cardin:[2,4,5,9],cardinalit:[4,5],caridin:4,caridinalit:4,chang:[4,5],check:4,chi:2,chi_test:2,chi_test_alfa:2,child:[2,3],child_indx:2,child_states_numb:2,child_val:2,cim1:[2,7],cim2:[2,7],cim:[2,4,5,12],cim_equality_test:7,cims_kei:5,cims_label:7,classmethod:[7,8,9,10],clean_structure_edg:4,clear:[4,5],clear_concatenated_fram:5,clear_data_frame_list:5,clear_indexing_filtering_structur:4,clear_memori:4,climb:[2,3],coeffici:4,col:4,color:2,cols_filt:2,column:[2,4,5,12],columns_head:5,comb:4,combin:[4,5,9],combinatori:[4,9],common:2,complet:[2,4,5],complete_test:2,complete_trajectori:4,comput:[2,3,4,5,12],compute_cim_coeffici:4,compute_parameters_for_nod:[2,12],compute_row_delta_in_all_samples_fram:[5,12],compute_row_delta_sigle_samples_fram:5,compute_state_res_time_for_nod:2,compute_state_transitions_for_a_nod:2,compute_thumb_valu:2,concatanated_sampl:5,concaten:[4,5],concatenated_sampl:5,condit:4,conditional_intensity_matrix:[0,1,2,13,14],conditionalintensitymatrix:[2,4],consid:[2,4],constraint:2,constraint_based_optim:[0,1,13,14],constraintbasedoptim:3,construct:[4,5,12],conta:5,contain:[2,4,5,9],contains_edg:4,content:[13,14],convert:[2,5],copi:5,core:5,correct:[4,5],could:2,count:4,creat:[2,4,12],csv:12,csvimport:12,ctbn:2,ctpc:[2,3,12],ctpc_algorithm:[2,12],current:[2,3,5],cut:5,dafram:5,data:[2,3,4,5,13,14],datafram:[4,5,12],dataset:[3,4,5],dataset_id:[5,12],datfram:5,def:12,defin:5,definit:5,defualt:2,delta:[2,4,5],demonstr:12,describ:5,desir:[2,4],df_samples_list:5,dict:[5,12],dictionari:5,differ:5,differt:2,digraph:2,dimens:4,dir:12,direct:[2,4],directli:5,disabl:[2,3],disable_multiprocess:2,distribuit:2,doc:5,doubl:4,download:12,drop:12,duplic:4,dyn:12,each:[2,3,5],edg:[2,4,5,12],edges_list:4,end:5,entir:2,equal:4,equality_of_cims_of_nod:7,est:12,estim:[0,1,3,4,6,13,14],estimate_par:2,estimate_structur:2,estimated_cim:7,everi:[4,5],exam:12,exampl:[5,13,14],exclud:2,exctract:5,exist:5,exp_test_alfa:2,exponenti:2,expos:5,extend:12,extens:[2,5],extract:[4,5],fals:2,fam_score_calcul:[0,1,13,14],famscor:2,famscorecalcul:2,fast_init:[2,4,12],file:[2,5,12],file_path:[2,5,12],filepath:5,fill:[2,12],filter:[2,4],filter_cims_with_mask:4,find:[2,5],first:[2,12],fixtur:[7,8,9,10],follow:[4,5],form:4,format:12,formula:2,found:5,frame:5,from:[4,5,12],from_nod:5,gener:2,generate_possible_sub_sets_of_s:2,get:[2,5],get_cims_numb:4,get_fam_scor:2,get_node_id:4,get_node_indx:4,get_ordered_by_indx_set_of_par:4,get_parents_by_id:4,get_positional_node_indx:4,get_score_from_graph:2,get_states_numb:4,given:[2,4,5],glob:12,graph:[2,4,9,12],graph_struct:4,graphic:2,grid:[4,9],grpah:12,has:[5,12],has_edg:4,has_prior_net_structur:4,have:5,header:5,header_column:5,hill:[2,3],hill_climbing_search:[0,1,13,14],hillclimb:3,hold:[2,4],hook:[7,8,9,10],how:5,hyperparamet:2,hypothesi:2,identifi:[2,4,5],iff:2,implement:[3,5,13,14],import_data:[5,12],import_sampled_cim:5,import_structur:5,import_trajectori:5,import_vari:[5,12],improv:[2,3],includ:2,independ:2,independence_test:2,index:[2,4,5,12,13],indic:4,indx:5,info:[4,12],inform:[3,4],init:12,initi:[2,4,5,12],inplac:12,insid:12,instal:[13,14],interest:4,interfac:3,intes:4,iter:[2,3],iterations_numb:[2,3],its:[2,3],join:12,json:[2,5,12],json_import:[0,1,13,14],jsonarrai:5,jsonimport:[5,12],keep:[2,3,5],kei:5,kind:2,knowledg:2,known:2,known_edg:2,label:[2,3,4,5],lenght:[2,3],level:[2,5],likelihood:2,list:[2,3,4,5,12],list_of_column:4,list_of_edg:4,list_of_nod:4,load:5,loop:2,m_xu_suff_stat:2,m_xxu_suff_stat:2,main:12,margin:2,marginal_likelihood_q:2,marginal_likelihood_theta:2,mask:[4,9],mask_arr:4,matric:[2,4],matrix:[2,4,5,9,12],max_par:[2,3],maximum:[2,3],member:[4,5],mention:4,merg:5,method:[2,5,7,8,9,10],methodnam:[7,8,9,10],model:2,modul:[13,14],multipl:5,multiprocess:2,name:[2,4,5,12],ndarrai:[2,4,5],necessari:[2,4,5],nest:5,net:[2,3,4,5,12],net_graph:2,network:[2,4,5],network_graph:[0,1,2,13,14],networkgraph:[2,4,12],networkx:2,node:[2,3,4,5,9,12],node_id:[2,3,4,9],node_index:4,node_indx:[2,4],node_st:[4,9],node_states_numb:[4,9],nodes_index:4,nodes_indexes_arr:4,nodes_label:4,nodes_labels_list:4,nodes_numb:4,nodes_vals_arr:4,nodes_valu:[4,12],none:[2,3,4,5,7,9,10,12],normal:5,normalize_trajectori:5,number:[2,3,4],numpi:[2,4,5,9],obj:[10,12],object:[2,3,4,5,12],one:[4,5],one_iteration_of_ctpc_algorithm:2,one_level_norm:5,onli:5,oper:2,optim:[0,1,2,6,13,14],optimize_structur:3,option:[2,3],order:[2,5,10],origin:5,original_cols_numb:4,otherwis:[2,5],out:5,outer:[5,12],over:2,own:[13,14],p_comb:[4,9],p_indx:[4,9],p_val:9,p_valu:9,packag:[13,14],page:13,panda:[5,12],param:4,paramet:[2,3,4,5,9,13,14],parameters_estim:[0,1,13,14],parametersestim:[2,12],parent:[2,3,4,5],parent_indx:2,parent_label:2,parent_set:2,parent_set_v:2,parent_v:2,parent_valu:9,parents_cardin:4,parents_comb:5,parents_index:4,parents_indx:9,parents_label:[4,9],parents_states_numb:[4,9],parents_v:[4,9],parents_valu:[4,9],part:2,particular:[2,5],pass:12,path:[2,5,12],patienc:[2,3],peest:12,perform:2,pip:12,place:5,plot:2,png:2,posit:[4,5],possibl:[2,4],predict:3,prepar:5,present:[2,5],print:12,prior:[2,12],prior_net_structur:5,process:[2,3,4,5],properli:5,properti:[4,5],put:5,pyctbn:12,q_xx:4,rappres:4,raw:5,raw_data:5,read:[5,12],read_csv:12,read_csv_fil:12,read_fil:12,read_json_fil:5,real:[2,4,5,12],red:2,refer:[4,5],reject:2,rel:4,relat:5,releas:12,remain:5,remov:[2,4,5],remove_edg:4,remove_nod:4,repres:4,represent:2,res:4,resid:[2,4],result:[2,5,12],rtype:4,rule:[2,3],run:[7,8,9,10],runtest:[7,8,9,10],same:5,sampl:[4,5,12],sample_fram:[5,12],sample_import:[0,1,13,14],sample_path:[0,1,2,13,14],sampled_cim:7,sampleimport:5,samplepath:[2,4,12],samples_label:5,save:[2,12],save_plot_estimated_structure_graph:2,save_result:[2,12],scalar_index:2,scalar_indexes_struct:2,score:2,se1:12,search:[2,3,13],second:2,see:5,select:12,self:[2,5,12],sep:2,sep_set:2,set:[2,4,5,7,8,9,10],set_of_cim:[0,1,2,5,13,14],setofcim:[2,4,5,12],setupclass:[7,8,9,10],shift:[4,5],shifted_cols_head:5,show:2,signific:2,simbol:5,simpl:12,simpli:12,sinc:4,single_cim_xu_marginal_likelihood_q:2,single_cim_xu_marginal_likelihood_theta:2,single_internal_cim_xxu_marginal_likelihood_theta:2,size:[2,4],socim:5,sofc1:12,sorter:5,specif:[2,4,12],spuriou:2,spurious_edg:2,start:5,state:[2,4],state_res_tim:4,state_residence_tim:4,state_transition_matrix:4,statist:2,stop:[2,3],str:[2,3,4,5,12],string:[2,3,4,5],structur:[0,1,2,3,5,9,13,14],structure_constraint_based_estim:[0,1,13,14],structure_estim:[0,1,3,13,14],structure_estimation_exampl:12,structure_graph:[0,1,2,5,6,13,14],structure_label:5,structure_score_based_estim:[0,1,13,14],structureconstraintbasedestim:2,structureestim:[2,3,12],structurescorebasedestim:2,structut:4,style:2,submodul:[1,6,13,14],subpackag:[13,14],subset:2,suffici:2,suffuci:2,symbol:[4,5],synthet:5,t_xu_suff_stat:2,tabu:[2,3],tabu_length:[2,3],tabu_rules_dur:[2,3],tabu_search:[0,1,13,14],tabusearch:3,take:12,tar:12,task:[2,4],tau_xu:2,ternari:12,test:2,test_add_edg:9,test_add_nod:9,test_adjacency_matrix:7,test_buid_samplepath_no_concatenated_sampl:9,test_buid_samplepath_no_vari:9,test_build_cim:9,test_build_complete_graph:7,test_build_p_combs_structur:9,test_build_removable_edges_matrix:7,test_build_saplepath_no_prior_net_structur:9,test_build_sort:10,test_build_structur:9,test_build_structure_bad_sort:9,test_build_time_columns_filtering_structure_for_a_nod:9,test_build_time_scalar_indexing_structure_for_a_nod:9,test_build_trajectori:9,test_build_transition_columns_filtering_structur:9,test_build_transition_scalar_indexing_structure_for_a_nod:9,test_cach:6,test_child:2,test_cim:6,test_clear:10,test_clear_concatenated_fram:10,test_clear_data_frame_list:10,test_compute_cim_coeffici:9,test_compute_parameters_for_nod:7,test_compute_row_delta_in_all_fram:10,test_compute_row_delta_in_all_frames_not_init_sort:10,test_compute_row_delta_single_samples_fram:10,test_dataset_id:10,test_edges_oper:9,test_equ:9,test_fast_init:[7,9],test_file_path:10,test_filter_cims_with_mask:9,test_find:10,test_generate_possible_sub_sets_of_s:7,test_get_node_id:9,test_get_node_indx:9,test_get_ordered_by_indx_set_of_par:9,test_get_parents_by_id:9,test_get_positional_node_indx:9,test_get_states_numb:9,test_hill_climbing_search:6,test_import_data:10,test_import_sampled_cim:10,test_import_structur:10,test_import_vari:10,test_init:[7,9,10],test_init_not_filled_dataframs:9,test_init_not_initialized_import:9,test_json_import:6,test_networkgraph:6,test_normalize_trajectori:10,test_normalize_trajectories_wrong_indx:10,test_normalize_trajectories_wrong_kei:10,test_ord:10,test_par:2,test_parameters_estim:6,test_put:10,test_read_json_file_found:10,test_read_json_file_not_found:10,test_repr:9,test_sample_import:6,test_sample_path:6,test_save_plot_estimated_graph:7,test_save_result:7,test_setofcim:6,test_structur:[6,8],test_structure_1:7,test_structure_2:7,test_structure_3:[7,8],test_structure_constraint_based_estim:6,test_structure_estim:6,test_structure_monoprocesso:7,test_structure_score_based_estim:6,test_tabu_search:6,test_tim:7,test_trajectori:6,testcach:10,testcas:[7,8,9,10],testconditionalintensitymatrix:9,testhillclimbingsearch:8,testjsonimport:10,testnetworkgraph:9,testparametersestimatior:7,testsampleimport:10,testsamplepath:9,testsetofcim:9,teststructur:9,teststructureconstraintbasedestim:7,teststructureestim:7,teststructurescorebasedestim:7,testtabusearch:8,testtrajectori:9,tha:5,theta:2,thi:[2,4,5,12],three:12,threshold:2,thumb:2,thumb_threshold:2,thumb_valu:2,time:[2,4,5,12],time_filt:4,time_kei:5,time_scalar_indexing_strucur:4,timestamp:5,to_nod:5,tot_vars_count:[2,3],total:[2,4],total_variables_count:4,total_variables_numb:4,traj:5,trajecory_head:5,trajectori:[0,1,2,5,12,13,14],trajectories_kei:5,trajectory_list:5,trajectri:12,transit:[2,4,5],transition_filt:4,transition_matric:4,transition_scalar_indexing_structur:4,tri:5,tupl:4,tutori:5,two:2,type:[2,3,4,5,12],union:5,uniqu:5,unittest:[7,8,9,10],unus:4,usag:[13,14],use:[2,12],used:[2,3,4,5],using:[2,3,4,5],util:[0,1,4,6,13,14],valid:2,valu:[2,3,4,5,9,12],values_list:12,var_id:2,variabl:[2,3,4,5,12],variable_cardin:5,variable_cim_xu_marginal_likelihood_q:2,variable_cim_xu_marginal_likelihood_theta:2,variable_label:5,variables_kei:5,variables_label:5,vector:[2,4],want:12,when:2,where:5,which:[2,3,4,5],whl:12,who:2,without:[2,3],you:[2,5,12],your:[13,14]},titles:["PyCTBN package","PyCTBN.PyCTBN package","PyCTBN.PyCTBN.estimators package","PyCTBN.PyCTBN.optimizers package","PyCTBN.PyCTBN.structure_graph package","PyCTBN.PyCTBN.utility package","PyCTBN.tests package","PyCTBN.tests.estimators package","PyCTBN.tests.optimizers package","PyCTBN.tests.structure_graph package","PyCTBN.tests.utility package","basic_main module","Examples","Welcome to PyCTBN\u2019s documentation!","PyCTBN","setup module"],titleterms:{"import":12,abstract_import:5,basic_main:11,cach:5,conditional_intensity_matrix:4,constraint_based_optim:3,content:[0,1,2,3,4,5,6,7,8,9,10],data:12,document:13,estim:[2,7,12],exampl:12,fam_score_calcul:2,hill_climbing_search:3,implement:12,indic:13,instal:12,json_import:5,modul:[0,1,2,3,4,5,6,7,8,9,10,11,15],network_graph:4,optim:[3,8],own:12,packag:[0,1,2,3,4,5,6,7,8,9,10],paramet:12,parameters_estim:2,pyctbn:[0,1,2,3,4,5,6,7,8,9,10,13,14],sample_import:5,sample_path:4,set_of_cim:4,setup:15,structur:[4,12],structure_constraint_based_estim:2,structure_estim:2,structure_graph:[4,9],structure_score_based_estim:2,submodul:[0,2,3,4,5,7,8,9,10],subpackag:[0,1,6],tabl:13,tabu_search:3,test:[6,7,8,9,10],test_cach:10,test_cim:9,test_hill_climbing_search:8,test_json_import:10,test_networkgraph:9,test_parameters_estim:7,test_sample_import:10,test_sample_path:9,test_setofcim:9,test_structur:9,test_structure_constraint_based_estim:7,test_structure_estim:7,test_structure_score_based_estim:7,test_tabu_search:8,test_trajectori:9,trajectori:4,usag:12,util:[5,10],welcom:13,your:12}}) \ No newline at end of file diff --git a/docs/PyCTBN.PyCTBN.utility.html b/docs/PyCTBN.PyCTBN.utility.html index ba10218..5f834ce 100644 --- a/docs/PyCTBN.PyCTBN.utility.html +++ b/docs/PyCTBN.PyCTBN.utility.html @@ -391,11 +391,11 @@ dataset

-import_data(indx: int) → None
+import_data(indx: int = 0) → None

Implements the abstract method of AbstractImporter.

Parameters
-

indx (int) – the index of the outer JsonArray to extract the data from

+

indx (int) – the index of the outer JsonArray to extract the data from, default to 0

diff --git a/docs/searchindex.js b/docs/searchindex.js index c34509d..8061880 100644 --- a/docs/searchindex.js +++ b/docs/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["PyCTBN","PyCTBN.PyCTBN","PyCTBN.PyCTBN.estimators","PyCTBN.PyCTBN.optimizers","PyCTBN.PyCTBN.structure_graph","PyCTBN.PyCTBN.utility","PyCTBN.tests","PyCTBN.tests.estimators","PyCTBN.tests.optimizers","PyCTBN.tests.structure_graph","PyCTBN.tests.utility","basic_main","examples","index","modules","setup"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["PyCTBN.rst","PyCTBN.PyCTBN.rst","PyCTBN.PyCTBN.estimators.rst","PyCTBN.PyCTBN.optimizers.rst","PyCTBN.PyCTBN.structure_graph.rst","PyCTBN.PyCTBN.utility.rst","PyCTBN.tests.rst","PyCTBN.tests.estimators.rst","PyCTBN.tests.optimizers.rst","PyCTBN.tests.structure_graph.rst","PyCTBN.tests.utility.rst","basic_main.rst","examples.rst","index.rst","modules.rst","setup.rst"],objects:{"":{PyCTBN:[0,0,0,"-"]},"PyCTBN.PyCTBN":{estimators:[2,0,0,"-"],optimizers:[3,0,0,"-"],structure_graph:[4,0,0,"-"],utility:[5,0,0,"-"]},"PyCTBN.PyCTBN.estimators":{fam_score_calculator:[2,0,0,"-"],parameters_estimator:[2,0,0,"-"],structure_constraint_based_estimator:[2,0,0,"-"],structure_estimator:[2,0,0,"-"],structure_score_based_estimator:[2,0,0,"-"]},"PyCTBN.PyCTBN.estimators.fam_score_calculator":{FamScoreCalculator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator":{get_fam_score:[2,2,1,""],marginal_likelihood_q:[2,2,1,""],marginal_likelihood_theta:[2,2,1,""],single_cim_xu_marginal_likelihood_q:[2,2,1,""],single_cim_xu_marginal_likelihood_theta:[2,2,1,""],single_internal_cim_xxu_marginal_likelihood_theta:[2,2,1,""],variable_cim_xu_marginal_likelihood_q:[2,2,1,""],variable_cim_xu_marginal_likelihood_theta:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator":{ParametersEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator":{compute_parameters_for_node:[2,2,1,""],compute_state_res_time_for_node:[2,2,1,""],compute_state_transitions_for_a_node:[2,2,1,""],fast_init:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator":{StructureConstraintBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator":{complete_test:[2,2,1,""],compute_thumb_value:[2,2,1,""],ctpc_algorithm:[2,2,1,""],estimate_structure:[2,2,1,""],independence_test:[2,2,1,""],one_iteration_of_CTPC_algorithm:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator":{StructureEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator":{adjacency_matrix:[2,2,1,""],build_complete_graph:[2,2,1,""],build_removable_edges_matrix:[2,2,1,""],estimate_structure:[2,2,1,""],generate_possible_sub_sets_of_size:[2,2,1,""],save_plot_estimated_structure_graph:[2,2,1,""],save_results:[2,2,1,""],spurious_edges:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator":{StructureScoreBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator":{estimate_parents:[2,2,1,""],estimate_structure:[2,2,1,""],get_score_from_graph:[2,2,1,""]},"PyCTBN.PyCTBN.optimizers":{constraint_based_optimizer:[3,0,0,"-"],hill_climbing_search:[3,0,0,"-"],optimizer:[3,0,0,"-"],tabu_search:[3,0,0,"-"]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer":{ConstraintBasedOptimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search":{HillClimbing:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search.HillClimbing":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer":{Optimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer.Optimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search":{TabuSearch:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search.TabuSearch":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.structure_graph":{conditional_intensity_matrix:[4,0,0,"-"],network_graph:[4,0,0,"-"],sample_path:[4,0,0,"-"],set_of_cims:[4,0,0,"-"],structure:[4,0,0,"-"],trajectory:[4,0,0,"-"]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix":{ConditionalIntensityMatrix:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix":{cim:[4,2,1,""],compute_cim_coefficients:[4,2,1,""],state_residence_times:[4,2,1,""],state_transition_matrix:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph":{NetworkGraph:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph":{add_edges:[4,2,1,""],add_nodes:[4,2,1,""],build_p_comb_structure_for_a_node:[4,2,1,""],build_time_columns_filtering_for_a_node:[4,2,1,""],build_time_scalar_indexing_structure_for_a_node:[4,2,1,""],build_transition_filtering_for_a_node:[4,2,1,""],build_transition_scalar_indexing_structure_for_a_node:[4,2,1,""],clear_indexing_filtering_structures:[4,2,1,""],edges:[4,2,1,""],fast_init:[4,2,1,""],get_node_indx:[4,2,1,""],get_ordered_by_indx_set_of_parents:[4,2,1,""],get_parents_by_id:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],has_edge:[4,2,1,""],nodes:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_values:[4,2,1,""],p_combs:[4,2,1,""],remove_edges:[4,2,1,""],remove_node:[4,2,1,""],time_filtering:[4,2,1,""],time_scalar_indexing_strucure:[4,2,1,""],transition_filtering:[4,2,1,""],transition_scalar_indexing_structure:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path":{SamplePath:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath":{build_structure:[4,2,1,""],build_trajectories:[4,2,1,""],clear_memory:[4,2,1,""],has_prior_net_structure:[4,2,1,""],structure:[4,2,1,""],total_variables_count:[4,2,1,""],trajectories:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims":{SetOfCims:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims":{actual_cims:[4,2,1,""],build_cims:[4,2,1,""],build_times_and_transitions_structures:[4,2,1,""],filter_cims_with_mask:[4,2,1,""],get_cims_number:[4,2,1,""],p_combs:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.structure":{Structure:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.structure.Structure":{add_edge:[4,2,1,""],clean_structure_edges:[4,2,1,""],contains_edge:[4,2,1,""],edges:[4,2,1,""],get_node_id:[4,2,1,""],get_node_indx:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_labels:[4,2,1,""],nodes_values:[4,2,1,""],remove_edge:[4,2,1,""],remove_node:[4,2,1,""],total_variables_number:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory":{Trajectory:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory":{complete_trajectory:[4,2,1,""],size:[4,2,1,""],times:[4,2,1,""],trajectory:[4,2,1,""]},"PyCTBN.PyCTBN.utility":{abstract_importer:[5,0,0,"-"],cache:[5,0,0,"-"],json_importer:[5,0,0,"-"],sample_importer:[5,0,0,"-"]},"PyCTBN.PyCTBN.utility.abstract_importer":{AbstractImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter":{build_list_of_samples_array:[5,2,1,""],build_sorter:[5,2,1,""],clear_concatenated_frame:[5,2,1,""],compute_row_delta_in_all_samples_frames:[5,2,1,""],compute_row_delta_sigle_samples_frame:[5,2,1,""],concatenated_samples:[5,2,1,""],dataset_id:[5,2,1,""],file_path:[5,2,1,""],sorter:[5,2,1,""],structure:[5,2,1,""],variables:[5,2,1,""]},"PyCTBN.PyCTBN.utility.cache":{Cache:[5,1,1,""]},"PyCTBN.PyCTBN.utility.cache.Cache":{clear:[5,2,1,""],find:[5,2,1,""],put:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_importer":{JsonImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_importer.JsonImporter":{build_sorter:[5,2,1,""],clear_data_frame_list:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""],import_sampled_cims:[5,2,1,""],import_structure:[5,2,1,""],import_trajectories:[5,2,1,""],import_variables:[5,2,1,""],normalize_trajectories:[5,2,1,""],one_level_normalizing:[5,2,1,""],read_json_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.sample_importer":{SampleImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.sample_importer.SampleImporter":{build_sorter:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""]},"PyCTBN.tests":{estimators:[7,0,0,"-"],optimizers:[8,0,0,"-"],structure_graph:[9,0,0,"-"],utility:[10,0,0,"-"]},"PyCTBN.tests.estimators":{test_parameters_estimator:[7,0,0,"-"],test_structure_constraint_based_estimator:[7,0,0,"-"],test_structure_estimator:[7,0,0,"-"],test_structure_score_based_estimator:[7,0,0,"-"]},"PyCTBN.tests.estimators.test_parameters_estimator":{TestParametersEstimatior:[7,1,1,""]},"PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior":{aux_import_sampled_cims:[7,2,1,""],cim_equality_test:[7,2,1,""],equality_of_cims_of_node:[7,2,1,""],setUpClass:[7,2,1,""],test_compute_parameters_for_node:[7,2,1,""],test_fast_init:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator":{TestStructureConstraintBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_estimator":{TestStructureEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator":{setUpClass:[7,2,1,""],test_adjacency_matrix:[7,2,1,""],test_build_complete_graph:[7,2,1,""],test_build_removable_edges_matrix:[7,2,1,""],test_generate_possible_sub_sets_of_size:[7,2,1,""],test_init:[7,2,1,""],test_save_plot_estimated_graph:[7,2,1,""],test_save_results:[7,2,1,""],test_time:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator":{TestStructureScoreBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""],test_structure_monoprocesso:[7,2,1,""]},"PyCTBN.tests.optimizers":{test_hill_climbing_search:[8,0,0,"-"],test_tabu_search:[8,0,0,"-"]},"PyCTBN.tests.optimizers.test_hill_climbing_search":{TestHillClimbingSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_hill_climbing_search.TestHillClimbingSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.optimizers.test_tabu_search":{TestTabuSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_tabu_search.TestTabuSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.structure_graph":{test_cim:[9,0,0,"-"],test_networkgraph:[9,0,0,"-"],test_sample_path:[9,0,0,"-"],test_setofcims:[9,0,0,"-"],test_structure:[9,0,0,"-"],test_trajectory:[9,0,0,"-"]},"PyCTBN.tests.structure_graph.test_cim":{TestConditionalIntensityMatrix:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix":{setUpClass:[9,2,1,""],test_compute_cim_coefficients:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph":{TestNetworkGraph:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph":{aux_build_p_combs_structure:[9,2,1,""],aux_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],aux_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],aux_build_transition_columns_filtering_structure:[9,2,1,""],aux_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_add_edges:[9,2,1,""],test_add_nodes:[9,2,1,""],test_build_p_combs_structure:[9,2,1,""],test_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],test_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],test_build_transition_columns_filtering_structure:[9,2,1,""],test_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],test_fast_init:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_ordered_by_indx_set_of_parents:[9,2,1,""],test_get_parents_by_id:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_sample_path":{TestSamplePath:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath":{setUpClass:[9,2,1,""],test_buid_samplepath_no_concatenated_samples:[9,2,1,""],test_buid_samplepath_no_variables:[9,2,1,""],test_build_saplepath_no_prior_net_structure:[9,2,1,""],test_build_structure:[9,2,1,""],test_build_structure_bad_sorter:[9,2,1,""],test_build_trajectories:[9,2,1,""],test_init:[9,2,1,""],test_init_not_filled_dataframse:[9,2,1,""],test_init_not_initialized_importer:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_setofcims":{TestSetOfCims:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims":{another_filtering_method:[9,2,1,""],aux_test_build_cims:[9,2,1,""],aux_test_init:[9,2,1,""],build_p_comb_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_build_cims:[9,2,1,""],test_filter_cims_with_mask:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_structure":{TestStructure:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_structure.TestStructure":{setUpClass:[9,2,1,""],test_edges_operations:[9,2,1,""],test_equality:[9,2,1,""],test_get_node_id:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_positional_node_indx:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectory":{TestTrajectory:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory":{setUpClass:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.utility":{test_cache:[10,0,0,"-"],test_json_importer:[10,0,0,"-"],test_sample_importer:[10,0,0,"-"]},"PyCTBN.tests.utility.test_cache":{TestCache:[10,1,1,""]},"PyCTBN.tests.utility.test_cache.TestCache":{test_clear:[10,2,1,""],test_find:[10,2,1,""],test_init:[10,2,1,""],test_put:[10,2,1,""]},"PyCTBN.tests.utility.test_json_importer":{TestJsonImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_json_importer.TestJsonImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_build_sorter:[10,2,1,""],test_clear_concatenated_frame:[10,2,1,""],test_clear_data_frame_list:[10,2,1,""],test_compute_row_delta_in_all_frames:[10,2,1,""],test_compute_row_delta_in_all_frames_not_init_sorter:[10,2,1,""],test_compute_row_delta_single_samples_frame:[10,2,1,""],test_dataset_id:[10,2,1,""],test_file_path:[10,2,1,""],test_import_data:[10,2,1,""],test_import_sampled_cims:[10,2,1,""],test_import_structure:[10,2,1,""],test_import_variables:[10,2,1,""],test_init:[10,2,1,""],test_normalize_trajectories:[10,2,1,""],test_normalize_trajectories_wrong_indx:[10,2,1,""],test_normalize_trajectories_wrong_key:[10,2,1,""],test_read_json_file_found:[10,2,1,""],test_read_json_file_not_found:[10,2,1,""]},"PyCTBN.tests.utility.test_sample_importer":{TestSampleImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_sample_importer.TestSampleImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_init:[10,2,1,""],test_order:[10,2,1,""]},PyCTBN:{PyCTBN:[1,0,0,"-"],tests:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"abstract":[2,3,4,5,12],"boolean":[2,4],"case":[7,8,9,10],"class":[2,3,4,5,7,8,9,10,12],"default":[2,3],"float":2,"function":2,"import":[4,5,13,14],"int":[2,3,4,5],"null":2,"return":[2,3,4,5,9,12],"static":[2,4],"super":12,"true":[2,12],"var":12,HAS:5,Has:[2,4],NOT:2,The:[2,4,5,12],Use:[2,12],__actual_cach:5,__init__:12,__list_of_sets_of_par:5,_actual_cim:4,_actual_trajectori:4,_aggregated_info_about_nodes_par:4,_array_indx:5,_cach:2,_cim:4,_complete_graph:2,_df_samples_list:[5,12],_df_structur:5,_df_variabl:[5,12],_file_path:12,_graph:[4,12],_import:4,_net_graph:2,_node:2,_node_id:4,_nodes_indx:2,_nodes_v:2,_p_combs_structur:4,_raw_data:5,_sample_path:2,_single_set_of_cim:2,_sorter:[5,12],_state_residence_tim:4,_structur:4,_structure_label:5,_time:4,_time_filt:4,_time_scalar_indexing_structur:4,_total_variables_count:4,_total_variables_numb:4,_trajectori:4,_transition_filt:4,_transition_matric:4,_transition_scalar_indexing_structur:4,_variables_label:5,abc:[3,5],about:[3,4],abstract_import:[0,1,4,13,14],abstractimport:[4,5,12],act:5,actual:[2,4],actual_cim:[4,12],add:[4,5],add_edg:4,add_nod:4,added:2,addit:2,adjac:[2,12],adjacency_matrix:[2,12],after:5,against:2,aggreg:4,algorithm:[2,3,12],all:[2,3,4,5,9,12],alpha_xu:2,alpha_xxu:2,alreadi:[5,12],also:[2,4],ani:[2,3],anoth:4,another_filtering_method:9,approach:2,arc:5,arrai:[2,4,5,12],assign:2,assum:2,aux_build_p_combs_structur:9,aux_build_time_columns_filtering_structure_for_a_nod:9,aux_build_time_scalar_indexing_structure_for_a_nod:9,aux_build_transition_columns_filtering_structur:9,aux_build_transition_scalar_indexing_structure_for_a_nod:9,aux_import_sampled_cim:7,aux_test_build_cim:9,aux_test_init:9,axi:12,base:[2,3,4,5,7,8,9,10],bayesian:2,befor:[2,3,7,8,9,10],belong:2,best:2,between:5,bool:[2,4],both:[2,5],bound:4,build:[2,4,5,9,12],build_cim:4,build_complete_graph:2,build_list_of_samples_arrai:5,build_p_comb_structure_for_a_nod:[4,9],build_removable_edges_matrix:2,build_sort:[5,12],build_structur:[4,12],build_time_columns_filtering_for_a_nod:4,build_time_scalar_indexing_structure_for_a_nod:4,build_times_and_transitions_structur:4,build_trajectori:[4,12],build_transition_filtering_for_a_nod:4,build_transition_scalar_indexing_structure_for_a_nod:4,built:2,cach:[0,1,2,13,14],calcul:2,call:[5,12],cardin:[2,4,5,9],cardinalit:[4,5],caridin:4,caridinalit:4,chang:[4,5],check:4,chi:2,chi_test:2,chi_test_alfa:2,child:[2,3],child_indx:2,child_states_numb:2,child_val:2,cim1:[2,7],cim2:[2,7],cim:[2,4,5,12],cim_equality_test:7,cims_kei:5,cims_label:7,classmethod:[7,8,9,10],clean_structure_edg:4,clear:[4,5],clear_concatenated_fram:5,clear_data_frame_list:5,clear_indexing_filtering_structur:4,clear_memori:4,climb:[2,3],coeffici:4,col:4,color:2,cols_filt:2,column:[2,4,5,12],columns_head:5,comb:4,combin:[4,5,9],combinatori:[4,9],common:2,complet:[2,4,5],complete_test:2,complete_trajectori:4,comput:[2,3,4,5,12],compute_cim_coeffici:4,compute_parameters_for_nod:[2,12],compute_row_delta_in_all_samples_fram:[5,12],compute_row_delta_sigle_samples_fram:5,compute_state_res_time_for_nod:2,compute_state_transitions_for_a_nod:2,compute_thumb_valu:2,concatanated_sampl:5,concaten:[4,5],concatenated_sampl:5,condit:4,conditional_intensity_matrix:[0,1,2,13,14],conditionalintensitymatrix:[2,4],consid:[2,4],constraint:2,constraint_based_optim:[0,1,13,14],constraintbasedoptim:3,construct:[4,5,12],conta:5,contain:[2,4,5,9],contains_edg:4,content:[13,14],convert:[2,5],copi:5,core:5,correct:[4,5],could:2,count:4,creat:[2,4,12],csv:12,csvimport:12,ctbn:2,ctpc:[2,3,12],ctpc_algorithm:[2,12],current:[2,3,5],cut:5,dafram:5,data:[2,3,4,5,13,14],datafram:[4,5,12],dataset:[3,4,5],dataset_id:[5,12],datfram:5,def:12,defin:5,definit:5,defualt:2,delta:[2,4,5],demonstr:12,describ:5,desir:[2,4],df_samples_list:5,dict:[5,12],dictionari:5,differ:5,differt:2,digraph:2,dimens:4,dir:12,direct:[2,4],directli:5,disabl:[2,3],disable_multiprocess:2,distribuit:2,doc:5,doubl:4,download:12,drop:12,duplic:4,dyn:12,each:[2,3,5],edg:[2,4,5,12],edges_list:4,end:5,entir:2,equal:4,equality_of_cims_of_nod:7,est:12,estim:[0,1,3,4,6,13,14],estimate_par:2,estimate_structur:2,estimated_cim:7,everi:[4,5],exam:12,exampl:[5,13,14],exclud:2,exctract:5,exist:5,exp_test_alfa:2,exponenti:2,expos:5,extend:12,extens:[2,5],extract:[4,5],fals:2,fam_score_calcul:[0,1,13,14],famscor:2,famscorecalcul:2,fast_init:[2,4,12],file:[2,5,12],file_path:[2,5,12],filepath:5,fill:[2,12],filter:[2,4],filter_cims_with_mask:4,find:[2,5],first:[2,12],fixtur:[7,8,9,10],follow:[4,5],form:4,format:12,formula:2,found:5,frame:5,from:[4,5,12],from_nod:5,gener:2,generate_possible_sub_sets_of_s:2,get:[2,5],get_cims_numb:4,get_fam_scor:2,get_node_id:4,get_node_indx:4,get_ordered_by_indx_set_of_par:4,get_parents_by_id:4,get_positional_node_indx:4,get_score_from_graph:2,get_states_numb:4,given:[2,4,5],glob:12,graph:[2,4,9,12],graph_struct:4,graphic:2,grid:[4,9],grpah:12,has:[5,12],has_edg:4,has_prior_net_structur:4,have:5,header:5,header_column:5,hill:[2,3],hill_climbing_search:[0,1,13,14],hillclimb:3,hold:[2,4],hook:[7,8,9,10],how:5,hyperparamet:2,hypothesi:2,identifi:[2,4,5],iff:2,implement:[3,5,13,14],import_data:[5,12],import_sampled_cim:5,import_structur:5,import_trajectori:5,import_vari:[5,12],improv:[2,3],includ:2,independ:2,independence_test:2,index:[2,4,5,12,13],indic:4,indx:5,info:[4,12],inform:[3,4],init:12,initi:[2,4,5,12],inplac:12,insid:12,instal:[13,14],interest:4,interfac:3,intes:4,iter:[2,3],iterations_numb:[2,3],its:[2,3],join:12,json:[2,5,12],json_import:[0,1,13,14],jsonarrai:5,jsonimport:[5,12],keep:[2,3,5],kei:5,kind:2,knowledg:2,known:2,known_edg:2,label:[2,3,4,5],lenght:[2,3],level:[2,5],likelihood:2,list:[2,3,4,5,12],list_of_column:4,list_of_edg:4,list_of_nod:4,load:5,loop:2,m_xu_suff_stat:2,m_xxu_suff_stat:2,main:12,margin:2,marginal_likelihood_q:2,marginal_likelihood_theta:2,mask:[4,9],mask_arr:4,matric:[2,4],matrix:[2,4,5,9,12],max_par:[2,3],maximum:[2,3],member:[4,5],mention:4,merg:5,method:[2,5,7,8,9,10],methodnam:[7,8,9,10],model:2,modul:[13,14],multipl:5,multiprocess:2,name:[2,4,5,12],ndarrai:[2,4,5],necessari:[2,4,5],nest:5,net:[2,3,4,5,12],net_graph:2,network:[2,4,5],network_graph:[0,1,2,13,14],networkgraph:[2,4,12],networkx:2,node:[2,3,4,5,9,12],node_id:[2,3,4,9],node_index:4,node_indx:[2,4],node_st:[4,9],node_states_numb:[4,9],nodes_index:4,nodes_indexes_arr:4,nodes_label:4,nodes_labels_list:4,nodes_numb:4,nodes_vals_arr:4,nodes_valu:[4,12],none:[2,3,4,5,7,9,10,12],normal:5,normalize_trajectori:5,number:[2,3,4],numpi:[2,4,5,9],obj:[10,12],object:[2,3,4,5,12],one:[4,5],one_iteration_of_ctpc_algorithm:2,one_level_norm:5,onli:5,oper:2,optim:[0,1,2,6,13,14],optimize_structur:3,option:[2,3],order:[2,5,10],origin:5,original_cols_numb:4,otherwis:[2,5],out:5,outer:[5,12],over:2,own:[13,14],p_comb:[4,9],p_indx:[4,9],p_val:9,p_valu:9,packag:[13,14],page:13,panda:[5,12],param:4,paramet:[2,3,4,5,9,13,14],parameters_estim:[0,1,13,14],parametersestim:[2,12],parent:[2,3,4,5],parent_indx:2,parent_label:2,parent_set:2,parent_set_v:2,parent_v:2,parent_valu:9,parents_cardin:4,parents_comb:5,parents_index:4,parents_indx:9,parents_label:[4,9],parents_states_numb:[4,9],parents_v:[4,9],parents_valu:[4,9],part:2,particular:[2,5],pass:12,path:[2,5,12],patienc:[2,3],peest:12,perform:2,pip:12,place:5,plot:2,png:2,posit:[4,5],possibl:[2,4],predict:3,prepar:5,present:[2,5],print:12,prior:[2,12],prior_net_structur:5,process:[2,3,4,5],properli:5,properti:[4,5],put:5,pyctbn:12,q_xx:4,rappres:4,raw:5,raw_data:5,read:[5,12],read_csv:12,read_csv_fil:12,read_fil:12,read_json_fil:5,real:[2,4,5,12],red:2,refer:[4,5],reject:2,rel:4,relat:5,releas:12,remain:5,remov:[2,4,5],remove_edg:4,remove_nod:4,repres:4,represent:2,res:4,resid:[2,4],result:[2,5,12],rtype:4,rule:[2,3],run:[7,8,9,10],runtest:[7,8,9,10],same:5,sampl:[4,5,12],sample_fram:[5,12],sample_import:[0,1,13,14],sample_path:[0,1,2,13,14],sampled_cim:7,sampleimport:5,samplepath:[2,4,12],samples_label:5,save:[2,12],save_plot_estimated_structure_graph:2,save_result:[2,12],scalar_index:2,scalar_indexes_struct:2,score:2,se1:12,search:[2,3,13],second:2,see:5,select:12,self:[2,5,12],sep:2,sep_set:2,set:[2,4,5,7,8,9,10],set_of_cim:[0,1,2,5,13,14],setofcim:[2,4,5,12],setupclass:[7,8,9,10],shift:[4,5],shifted_cols_head:5,show:2,signific:2,simbol:5,simpl:12,simpli:12,sinc:4,single_cim_xu_marginal_likelihood_q:2,single_cim_xu_marginal_likelihood_theta:2,single_internal_cim_xxu_marginal_likelihood_theta:2,size:[2,4],socim:5,sofc1:12,sorter:5,specif:[2,4,12],spuriou:2,spurious_edg:2,start:5,state:[2,4],state_res_tim:4,state_residence_tim:4,state_transition_matrix:4,statist:2,stop:[2,3],str:[2,3,4,5,12],string:[2,3,4,5],structur:[0,1,2,3,5,9,13,14],structure_constraint_based_estim:[0,1,13,14],structure_estim:[0,1,3,13,14],structure_estimation_exampl:12,structure_graph:[0,1,2,5,6,13,14],structure_label:5,structure_score_based_estim:[0,1,13,14],structureconstraintbasedestim:2,structureestim:[2,3,12],structurescorebasedestim:2,structut:4,style:2,submodul:[1,6,13,14],subpackag:[13,14],subset:2,suffici:2,suffuci:2,symbol:[4,5],synthet:5,t_xu_suff_stat:2,tabu:[2,3],tabu_length:[2,3],tabu_rules_dur:[2,3],tabu_search:[0,1,13,14],tabusearch:3,take:12,tar:12,task:[2,4],tau_xu:2,ternari:12,test:2,test_add_edg:9,test_add_nod:9,test_adjacency_matrix:7,test_buid_samplepath_no_concatenated_sampl:9,test_buid_samplepath_no_vari:9,test_build_cim:9,test_build_complete_graph:7,test_build_p_combs_structur:9,test_build_removable_edges_matrix:7,test_build_saplepath_no_prior_net_structur:9,test_build_sort:10,test_build_structur:9,test_build_structure_bad_sort:9,test_build_time_columns_filtering_structure_for_a_nod:9,test_build_time_scalar_indexing_structure_for_a_nod:9,test_build_trajectori:9,test_build_transition_columns_filtering_structur:9,test_build_transition_scalar_indexing_structure_for_a_nod:9,test_cach:6,test_child:2,test_cim:6,test_clear:10,test_clear_concatenated_fram:10,test_clear_data_frame_list:10,test_compute_cim_coeffici:9,test_compute_parameters_for_nod:7,test_compute_row_delta_in_all_fram:10,test_compute_row_delta_in_all_frames_not_init_sort:10,test_compute_row_delta_single_samples_fram:10,test_dataset_id:10,test_edges_oper:9,test_equ:9,test_fast_init:[7,9],test_file_path:10,test_filter_cims_with_mask:9,test_find:10,test_generate_possible_sub_sets_of_s:7,test_get_node_id:9,test_get_node_indx:9,test_get_ordered_by_indx_set_of_par:9,test_get_parents_by_id:9,test_get_positional_node_indx:9,test_get_states_numb:9,test_hill_climbing_search:6,test_import_data:10,test_import_sampled_cim:10,test_import_structur:10,test_import_vari:10,test_init:[7,9,10],test_init_not_filled_dataframs:9,test_init_not_initialized_import:9,test_json_import:6,test_networkgraph:6,test_normalize_trajectori:10,test_normalize_trajectories_wrong_indx:10,test_normalize_trajectories_wrong_kei:10,test_ord:10,test_par:2,test_parameters_estim:6,test_put:10,test_read_json_file_found:10,test_read_json_file_not_found:10,test_repr:9,test_sample_import:6,test_sample_path:6,test_save_plot_estimated_graph:7,test_save_result:7,test_setofcim:6,test_structur:[6,8],test_structure_1:7,test_structure_2:7,test_structure_3:[7,8],test_structure_constraint_based_estim:6,test_structure_estim:6,test_structure_monoprocesso:7,test_structure_score_based_estim:6,test_tabu_search:6,test_tim:7,test_trajectori:6,testcach:10,testcas:[7,8,9,10],testconditionalintensitymatrix:9,testhillclimbingsearch:8,testjsonimport:10,testnetworkgraph:9,testparametersestimatior:7,testsampleimport:10,testsamplepath:9,testsetofcim:9,teststructur:9,teststructureconstraintbasedestim:7,teststructureestim:7,teststructurescorebasedestim:7,testtabusearch:8,testtrajectori:9,tha:5,theta:2,thi:[2,4,5,12],three:12,threshold:2,thumb:2,thumb_threshold:2,thumb_valu:2,time:[2,4,5,12],time_filt:4,time_kei:5,time_scalar_indexing_strucur:4,timestamp:5,to_nod:5,tot_vars_count:[2,3],total:[2,4],total_variables_count:4,total_variables_numb:4,traj:5,trajecory_head:5,trajectori:[0,1,2,5,12,13,14],trajectories_kei:5,trajectory_list:5,trajectri:12,transit:[2,4,5],transition_filt:4,transition_matric:4,transition_scalar_indexing_structur:4,tri:5,tupl:4,tutori:5,two:2,type:[2,3,4,5,12],union:5,uniqu:5,unittest:[7,8,9,10],unus:4,usag:[13,14],use:[2,12],used:[2,3,4,5],using:[2,3,4,5],util:[0,1,4,6,13,14],valid:2,valu:[2,3,4,5,9,12],values_list:12,var_id:2,variabl:[2,3,4,5,12],variable_cardin:5,variable_cim_xu_marginal_likelihood_q:2,variable_cim_xu_marginal_likelihood_theta:2,variable_label:5,variables_kei:5,variables_label:5,vector:[2,4],want:12,when:2,where:5,which:[2,3,4,5],whl:12,who:2,without:[2,3],you:[2,5,12],your:[13,14]},titles:["PyCTBN package","PyCTBN.PyCTBN package","PyCTBN.PyCTBN.estimators package","PyCTBN.PyCTBN.optimizers package","PyCTBN.PyCTBN.structure_graph package","PyCTBN.PyCTBN.utility package","PyCTBN.tests package","PyCTBN.tests.estimators package","PyCTBN.tests.optimizers package","PyCTBN.tests.structure_graph package","PyCTBN.tests.utility package","basic_main module","Examples","Welcome to PyCTBN\u2019s documentation!","PyCTBN","setup module"],titleterms:{"import":12,abstract_import:5,basic_main:11,cach:5,conditional_intensity_matrix:4,constraint_based_optim:3,content:[0,1,2,3,4,5,6,7,8,9,10],data:12,document:13,estim:[2,7,12],exampl:12,fam_score_calcul:2,hill_climbing_search:3,implement:12,indic:13,instal:12,json_import:5,modul:[0,1,2,3,4,5,6,7,8,9,10,11,15],network_graph:4,optim:[3,8],own:12,packag:[0,1,2,3,4,5,6,7,8,9,10],paramet:12,parameters_estim:2,pyctbn:[0,1,2,3,4,5,6,7,8,9,10,13,14],sample_import:5,sample_path:4,set_of_cim:4,setup:15,structur:[4,12],structure_constraint_based_estim:2,structure_estim:2,structure_graph:[4,9],structure_score_based_estim:2,submodul:[0,2,3,4,5,7,8,9,10],subpackag:[0,1,6],tabl:13,tabu_search:3,test:[6,7,8,9,10],test_cach:10,test_cim:9,test_hill_climbing_search:8,test_json_import:10,test_networkgraph:9,test_parameters_estim:7,test_sample_import:10,test_sample_path:9,test_setofcim:9,test_structur:9,test_structure_constraint_based_estim:7,test_structure_estim:7,test_structure_score_based_estim:7,test_tabu_search:8,test_trajectori:9,trajectori:4,usag:12,util:[5,10],welcom:13,your:12}}) \ No newline at end of file +Search.setIndex({docnames:["PyCTBN","PyCTBN.PyCTBN","PyCTBN.PyCTBN.estimators","PyCTBN.PyCTBN.optimizers","PyCTBN.PyCTBN.structure_graph","PyCTBN.PyCTBN.utility","PyCTBN.tests","PyCTBN.tests.estimators","PyCTBN.tests.optimizers","PyCTBN.tests.structure_graph","PyCTBN.tests.utility","basic_main","examples","index","modules","setup"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["PyCTBN.rst","PyCTBN.PyCTBN.rst","PyCTBN.PyCTBN.estimators.rst","PyCTBN.PyCTBN.optimizers.rst","PyCTBN.PyCTBN.structure_graph.rst","PyCTBN.PyCTBN.utility.rst","PyCTBN.tests.rst","PyCTBN.tests.estimators.rst","PyCTBN.tests.optimizers.rst","PyCTBN.tests.structure_graph.rst","PyCTBN.tests.utility.rst","basic_main.rst","examples.rst","index.rst","modules.rst","setup.rst"],objects:{"":{PyCTBN:[0,0,0,"-"]},"PyCTBN.PyCTBN":{estimators:[2,0,0,"-"],optimizers:[3,0,0,"-"],structure_graph:[4,0,0,"-"],utility:[5,0,0,"-"]},"PyCTBN.PyCTBN.estimators":{fam_score_calculator:[2,0,0,"-"],parameters_estimator:[2,0,0,"-"],structure_constraint_based_estimator:[2,0,0,"-"],structure_estimator:[2,0,0,"-"],structure_score_based_estimator:[2,0,0,"-"]},"PyCTBN.PyCTBN.estimators.fam_score_calculator":{FamScoreCalculator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator":{get_fam_score:[2,2,1,""],marginal_likelihood_q:[2,2,1,""],marginal_likelihood_theta:[2,2,1,""],single_cim_xu_marginal_likelihood_q:[2,2,1,""],single_cim_xu_marginal_likelihood_theta:[2,2,1,""],single_internal_cim_xxu_marginal_likelihood_theta:[2,2,1,""],variable_cim_xu_marginal_likelihood_q:[2,2,1,""],variable_cim_xu_marginal_likelihood_theta:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator":{ParametersEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator":{compute_parameters_for_node:[2,2,1,""],compute_state_res_time_for_node:[2,2,1,""],compute_state_transitions_for_a_node:[2,2,1,""],fast_init:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator":{StructureConstraintBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator":{complete_test:[2,2,1,""],compute_thumb_value:[2,2,1,""],ctpc_algorithm:[2,2,1,""],estimate_structure:[2,2,1,""],independence_test:[2,2,1,""],one_iteration_of_CTPC_algorithm:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator":{StructureEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator":{adjacency_matrix:[2,2,1,""],build_complete_graph:[2,2,1,""],build_removable_edges_matrix:[2,2,1,""],estimate_structure:[2,2,1,""],generate_possible_sub_sets_of_size:[2,2,1,""],save_plot_estimated_structure_graph:[2,2,1,""],save_results:[2,2,1,""],spurious_edges:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator":{StructureScoreBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator":{estimate_parents:[2,2,1,""],estimate_structure:[2,2,1,""],get_score_from_graph:[2,2,1,""]},"PyCTBN.PyCTBN.optimizers":{constraint_based_optimizer:[3,0,0,"-"],hill_climbing_search:[3,0,0,"-"],optimizer:[3,0,0,"-"],tabu_search:[3,0,0,"-"]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer":{ConstraintBasedOptimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search":{HillClimbing:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search.HillClimbing":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer":{Optimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer.Optimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search":{TabuSearch:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search.TabuSearch":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.structure_graph":{conditional_intensity_matrix:[4,0,0,"-"],network_graph:[4,0,0,"-"],sample_path:[4,0,0,"-"],set_of_cims:[4,0,0,"-"],structure:[4,0,0,"-"],trajectory:[4,0,0,"-"]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix":{ConditionalIntensityMatrix:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix":{cim:[4,2,1,""],compute_cim_coefficients:[4,2,1,""],state_residence_times:[4,2,1,""],state_transition_matrix:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph":{NetworkGraph:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph":{add_edges:[4,2,1,""],add_nodes:[4,2,1,""],build_p_comb_structure_for_a_node:[4,2,1,""],build_time_columns_filtering_for_a_node:[4,2,1,""],build_time_scalar_indexing_structure_for_a_node:[4,2,1,""],build_transition_filtering_for_a_node:[4,2,1,""],build_transition_scalar_indexing_structure_for_a_node:[4,2,1,""],clear_indexing_filtering_structures:[4,2,1,""],edges:[4,2,1,""],fast_init:[4,2,1,""],get_node_indx:[4,2,1,""],get_ordered_by_indx_set_of_parents:[4,2,1,""],get_parents_by_id:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],has_edge:[4,2,1,""],nodes:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_values:[4,2,1,""],p_combs:[4,2,1,""],remove_edges:[4,2,1,""],remove_node:[4,2,1,""],time_filtering:[4,2,1,""],time_scalar_indexing_strucure:[4,2,1,""],transition_filtering:[4,2,1,""],transition_scalar_indexing_structure:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path":{SamplePath:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath":{build_structure:[4,2,1,""],build_trajectories:[4,2,1,""],clear_memory:[4,2,1,""],has_prior_net_structure:[4,2,1,""],structure:[4,2,1,""],total_variables_count:[4,2,1,""],trajectories:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims":{SetOfCims:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims":{actual_cims:[4,2,1,""],build_cims:[4,2,1,""],build_times_and_transitions_structures:[4,2,1,""],filter_cims_with_mask:[4,2,1,""],get_cims_number:[4,2,1,""],p_combs:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.structure":{Structure:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.structure.Structure":{add_edge:[4,2,1,""],clean_structure_edges:[4,2,1,""],contains_edge:[4,2,1,""],edges:[4,2,1,""],get_node_id:[4,2,1,""],get_node_indx:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_labels:[4,2,1,""],nodes_values:[4,2,1,""],remove_edge:[4,2,1,""],remove_node:[4,2,1,""],total_variables_number:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory":{Trajectory:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory":{complete_trajectory:[4,2,1,""],size:[4,2,1,""],times:[4,2,1,""],trajectory:[4,2,1,""]},"PyCTBN.PyCTBN.utility":{abstract_importer:[5,0,0,"-"],cache:[5,0,0,"-"],json_importer:[5,0,0,"-"],sample_importer:[5,0,0,"-"]},"PyCTBN.PyCTBN.utility.abstract_importer":{AbstractImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter":{build_list_of_samples_array:[5,2,1,""],build_sorter:[5,2,1,""],clear_concatenated_frame:[5,2,1,""],compute_row_delta_in_all_samples_frames:[5,2,1,""],compute_row_delta_sigle_samples_frame:[5,2,1,""],concatenated_samples:[5,2,1,""],dataset_id:[5,2,1,""],file_path:[5,2,1,""],sorter:[5,2,1,""],structure:[5,2,1,""],variables:[5,2,1,""]},"PyCTBN.PyCTBN.utility.cache":{Cache:[5,1,1,""]},"PyCTBN.PyCTBN.utility.cache.Cache":{clear:[5,2,1,""],find:[5,2,1,""],put:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_importer":{JsonImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_importer.JsonImporter":{build_sorter:[5,2,1,""],clear_data_frame_list:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""],import_sampled_cims:[5,2,1,""],import_structure:[5,2,1,""],import_trajectories:[5,2,1,""],import_variables:[5,2,1,""],normalize_trajectories:[5,2,1,""],one_level_normalizing:[5,2,1,""],read_json_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.sample_importer":{SampleImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.sample_importer.SampleImporter":{build_sorter:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""]},"PyCTBN.tests":{estimators:[7,0,0,"-"],optimizers:[8,0,0,"-"],structure_graph:[9,0,0,"-"],utility:[10,0,0,"-"]},"PyCTBN.tests.estimators":{test_parameters_estimator:[7,0,0,"-"],test_structure_constraint_based_estimator:[7,0,0,"-"],test_structure_estimator:[7,0,0,"-"],test_structure_score_based_estimator:[7,0,0,"-"]},"PyCTBN.tests.estimators.test_parameters_estimator":{TestParametersEstimatior:[7,1,1,""]},"PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior":{aux_import_sampled_cims:[7,2,1,""],cim_equality_test:[7,2,1,""],equality_of_cims_of_node:[7,2,1,""],setUpClass:[7,2,1,""],test_compute_parameters_for_node:[7,2,1,""],test_fast_init:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator":{TestStructureConstraintBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_estimator":{TestStructureEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator":{setUpClass:[7,2,1,""],test_adjacency_matrix:[7,2,1,""],test_build_complete_graph:[7,2,1,""],test_build_removable_edges_matrix:[7,2,1,""],test_generate_possible_sub_sets_of_size:[7,2,1,""],test_init:[7,2,1,""],test_save_plot_estimated_graph:[7,2,1,""],test_save_results:[7,2,1,""],test_time:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator":{TestStructureScoreBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""],test_structure_monoprocesso:[7,2,1,""]},"PyCTBN.tests.optimizers":{test_hill_climbing_search:[8,0,0,"-"],test_tabu_search:[8,0,0,"-"]},"PyCTBN.tests.optimizers.test_hill_climbing_search":{TestHillClimbingSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_hill_climbing_search.TestHillClimbingSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.optimizers.test_tabu_search":{TestTabuSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_tabu_search.TestTabuSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.structure_graph":{test_cim:[9,0,0,"-"],test_networkgraph:[9,0,0,"-"],test_sample_path:[9,0,0,"-"],test_setofcims:[9,0,0,"-"],test_structure:[9,0,0,"-"],test_trajectory:[9,0,0,"-"]},"PyCTBN.tests.structure_graph.test_cim":{TestConditionalIntensityMatrix:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix":{setUpClass:[9,2,1,""],test_compute_cim_coefficients:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph":{TestNetworkGraph:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph":{aux_build_p_combs_structure:[9,2,1,""],aux_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],aux_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],aux_build_transition_columns_filtering_structure:[9,2,1,""],aux_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_add_edges:[9,2,1,""],test_add_nodes:[9,2,1,""],test_build_p_combs_structure:[9,2,1,""],test_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],test_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],test_build_transition_columns_filtering_structure:[9,2,1,""],test_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],test_fast_init:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_ordered_by_indx_set_of_parents:[9,2,1,""],test_get_parents_by_id:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_sample_path":{TestSamplePath:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath":{setUpClass:[9,2,1,""],test_buid_samplepath_no_concatenated_samples:[9,2,1,""],test_buid_samplepath_no_variables:[9,2,1,""],test_build_saplepath_no_prior_net_structure:[9,2,1,""],test_build_structure:[9,2,1,""],test_build_structure_bad_sorter:[9,2,1,""],test_build_trajectories:[9,2,1,""],test_init:[9,2,1,""],test_init_not_filled_dataframse:[9,2,1,""],test_init_not_initialized_importer:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_setofcims":{TestSetOfCims:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims":{another_filtering_method:[9,2,1,""],aux_test_build_cims:[9,2,1,""],aux_test_init:[9,2,1,""],build_p_comb_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_build_cims:[9,2,1,""],test_filter_cims_with_mask:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_structure":{TestStructure:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_structure.TestStructure":{setUpClass:[9,2,1,""],test_edges_operations:[9,2,1,""],test_equality:[9,2,1,""],test_get_node_id:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_positional_node_indx:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectory":{TestTrajectory:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory":{setUpClass:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.utility":{test_cache:[10,0,0,"-"],test_json_importer:[10,0,0,"-"],test_sample_importer:[10,0,0,"-"]},"PyCTBN.tests.utility.test_cache":{TestCache:[10,1,1,""]},"PyCTBN.tests.utility.test_cache.TestCache":{test_clear:[10,2,1,""],test_find:[10,2,1,""],test_init:[10,2,1,""],test_put:[10,2,1,""]},"PyCTBN.tests.utility.test_json_importer":{TestJsonImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_json_importer.TestJsonImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_build_sorter:[10,2,1,""],test_clear_concatenated_frame:[10,2,1,""],test_clear_data_frame_list:[10,2,1,""],test_compute_row_delta_in_all_frames:[10,2,1,""],test_compute_row_delta_in_all_frames_not_init_sorter:[10,2,1,""],test_compute_row_delta_single_samples_frame:[10,2,1,""],test_dataset_id:[10,2,1,""],test_file_path:[10,2,1,""],test_import_data:[10,2,1,""],test_import_sampled_cims:[10,2,1,""],test_import_structure:[10,2,1,""],test_import_variables:[10,2,1,""],test_init:[10,2,1,""],test_normalize_trajectories:[10,2,1,""],test_normalize_trajectories_wrong_indx:[10,2,1,""],test_normalize_trajectories_wrong_key:[10,2,1,""],test_read_json_file_found:[10,2,1,""],test_read_json_file_not_found:[10,2,1,""]},"PyCTBN.tests.utility.test_sample_importer":{TestSampleImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_sample_importer.TestSampleImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_init:[10,2,1,""],test_order:[10,2,1,""]},PyCTBN:{PyCTBN:[1,0,0,"-"],tests:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"abstract":[2,3,4,5,12],"boolean":[2,4],"case":[7,8,9,10],"class":[2,3,4,5,7,8,9,10,12],"default":[2,3,5],"float":2,"function":2,"import":[4,5,13,14],"int":[2,3,4,5],"null":2,"return":[2,3,4,5,9,12],"static":[2,4],"super":12,"true":[2,12],"var":12,HAS:5,Has:[2,4],NOT:2,The:[2,4,5,12],Use:[2,12],__actual_cach:5,__init__:12,__list_of_sets_of_par:5,_actual_cim:4,_actual_trajectori:4,_aggregated_info_about_nodes_par:4,_array_indx:5,_cach:2,_cim:4,_complete_graph:2,_df_samples_list:[5,12],_df_structur:5,_df_variabl:[5,12],_file_path:12,_graph:[4,12],_import:4,_net_graph:2,_node:2,_node_id:4,_nodes_indx:2,_nodes_v:2,_p_combs_structur:4,_raw_data:5,_sample_path:2,_single_set_of_cim:2,_sorter:[5,12],_state_residence_tim:4,_structur:4,_structure_label:5,_time:4,_time_filt:4,_time_scalar_indexing_structur:4,_total_variables_count:4,_total_variables_numb:4,_trajectori:4,_transition_filt:4,_transition_matric:4,_transition_scalar_indexing_structur:4,_variables_label:5,abc:[3,5],about:[3,4],abstract_import:[0,1,4,13,14],abstractimport:[4,5,12],act:5,actual:[2,4],actual_cim:[4,12],add:[4,5],add_edg:4,add_nod:4,added:2,addit:2,adjac:[2,12],adjacency_matrix:[2,12],after:5,against:2,aggreg:4,algorithm:[2,3,12],all:[2,3,4,5,9,12],alpha_xu:2,alpha_xxu:2,alreadi:[5,12],also:[2,4],ani:[2,3],anoth:4,another_filtering_method:9,approach:2,arc:5,arrai:[2,4,5,12],assign:2,assum:2,aux_build_p_combs_structur:9,aux_build_time_columns_filtering_structure_for_a_nod:9,aux_build_time_scalar_indexing_structure_for_a_nod:9,aux_build_transition_columns_filtering_structur:9,aux_build_transition_scalar_indexing_structure_for_a_nod:9,aux_import_sampled_cim:7,aux_test_build_cim:9,aux_test_init:9,axi:12,base:[2,3,4,5,7,8,9,10],bayesian:2,befor:[2,3,7,8,9,10],belong:2,best:2,between:5,bool:[2,4],both:[2,5],bound:4,build:[2,4,5,9,12],build_cim:4,build_complete_graph:2,build_list_of_samples_arrai:5,build_p_comb_structure_for_a_nod:[4,9],build_removable_edges_matrix:2,build_sort:[5,12],build_structur:[4,12],build_time_columns_filtering_for_a_nod:4,build_time_scalar_indexing_structure_for_a_nod:4,build_times_and_transitions_structur:4,build_trajectori:[4,12],build_transition_filtering_for_a_nod:4,build_transition_scalar_indexing_structure_for_a_nod:4,built:2,cach:[0,1,2,13,14],calcul:2,call:[5,12],cardin:[2,4,5,9],cardinalit:[4,5],caridin:4,caridinalit:4,chang:[4,5],check:4,chi:2,chi_test:2,chi_test_alfa:2,child:[2,3],child_indx:2,child_states_numb:2,child_val:2,cim1:[2,7],cim2:[2,7],cim:[2,4,5,12],cim_equality_test:7,cims_kei:5,cims_label:7,classmethod:[7,8,9,10],clean_structure_edg:4,clear:[4,5],clear_concatenated_fram:5,clear_data_frame_list:5,clear_indexing_filtering_structur:4,clear_memori:4,climb:[2,3],coeffici:4,col:4,color:2,cols_filt:2,column:[2,4,5,12],columns_head:5,comb:4,combin:[4,5,9],combinatori:[4,9],common:2,complet:[2,4,5],complete_test:2,complete_trajectori:4,comput:[2,3,4,5,12],compute_cim_coeffici:4,compute_parameters_for_nod:[2,12],compute_row_delta_in_all_samples_fram:[5,12],compute_row_delta_sigle_samples_fram:5,compute_state_res_time_for_nod:2,compute_state_transitions_for_a_nod:2,compute_thumb_valu:2,concatanated_sampl:5,concaten:[4,5],concatenated_sampl:5,condit:4,conditional_intensity_matrix:[0,1,2,13,14],conditionalintensitymatrix:[2,4],consid:[2,4],constraint:2,constraint_based_optim:[0,1,13,14],constraintbasedoptim:3,construct:[4,5,12],conta:5,contain:[2,4,5,9],contains_edg:4,content:[13,14],convert:[2,5],copi:5,core:5,correct:[4,5],could:2,count:4,creat:[2,4,12],csv:12,csvimport:12,ctbn:2,ctpc:[2,3,12],ctpc_algorithm:[2,12],current:[2,3,5],cut:5,dafram:5,data:[2,3,4,5,13,14],datafram:[4,5,12],dataset:[3,4,5],dataset_id:[5,12],datfram:5,def:12,defin:5,definit:5,defualt:2,delta:[2,4,5],demonstr:12,describ:5,desir:[2,4],df_samples_list:5,dict:[5,12],dictionari:5,differ:5,differt:2,digraph:2,dimens:4,dir:12,direct:[2,4],directli:5,disabl:[2,3],disable_multiprocess:2,distribuit:2,doc:5,doubl:4,download:12,drop:12,duplic:4,dyn:12,each:[2,3,5],edg:[2,4,5,12],edges_list:4,end:5,entir:2,equal:4,equality_of_cims_of_nod:7,est:12,estim:[0,1,3,4,6,13,14],estimate_par:2,estimate_structur:2,estimated_cim:7,everi:[4,5],exam:12,exampl:[5,13,14],exclud:2,exctract:5,exist:5,exp_test_alfa:2,exponenti:2,expos:5,extend:12,extens:[2,5],extract:[4,5],fals:2,fam_score_calcul:[0,1,13,14],famscor:2,famscorecalcul:2,fast_init:[2,4,12],file:[2,5,12],file_path:[2,5,12],filepath:5,fill:[2,12],filter:[2,4],filter_cims_with_mask:4,find:[2,5],first:[2,12],fixtur:[7,8,9,10],follow:[4,5],form:4,format:12,formula:2,found:5,frame:5,from:[4,5,12],from_nod:5,gener:2,generate_possible_sub_sets_of_s:2,get:[2,5],get_cims_numb:4,get_fam_scor:2,get_node_id:4,get_node_indx:4,get_ordered_by_indx_set_of_par:4,get_parents_by_id:4,get_positional_node_indx:4,get_score_from_graph:2,get_states_numb:4,given:[2,4,5],glob:12,graph:[2,4,9,12],graph_struct:4,graphic:2,grid:[4,9],grpah:12,has:[5,12],has_edg:4,has_prior_net_structur:4,have:5,header:5,header_column:5,hill:[2,3],hill_climbing_search:[0,1,13,14],hillclimb:3,hold:[2,4],hook:[7,8,9,10],how:5,hyperparamet:2,hypothesi:2,identifi:[2,4,5],iff:2,implement:[3,5,13,14],import_data:[5,12],import_sampled_cim:5,import_structur:5,import_trajectori:5,import_vari:[5,12],improv:[2,3],includ:2,independ:2,independence_test:2,index:[2,4,5,12,13],indic:4,indx:5,info:[4,12],inform:[3,4],init:12,initi:[2,4,5,12],inplac:12,insid:12,instal:[13,14],interest:4,interfac:3,intes:4,iter:[2,3],iterations_numb:[2,3],its:[2,3],join:12,json:[2,5,12],json_import:[0,1,13,14],jsonarrai:5,jsonimport:[5,12],keep:[2,3,5],kei:5,kind:2,knowledg:2,known:2,known_edg:2,label:[2,3,4,5],lenght:[2,3],level:[2,5],likelihood:2,list:[2,3,4,5,12],list_of_column:4,list_of_edg:4,list_of_nod:4,load:5,loop:2,m_xu_suff_stat:2,m_xxu_suff_stat:2,main:12,margin:2,marginal_likelihood_q:2,marginal_likelihood_theta:2,mask:[4,9],mask_arr:4,matric:[2,4],matrix:[2,4,5,9,12],max_par:[2,3],maximum:[2,3],member:[4,5],mention:4,merg:5,method:[2,5,7,8,9,10],methodnam:[7,8,9,10],model:2,modul:[13,14],multipl:5,multiprocess:2,name:[2,4,5,12],ndarrai:[2,4,5],necessari:[2,4,5],nest:5,net:[2,3,4,5,12],net_graph:2,network:[2,4,5],network_graph:[0,1,2,13,14],networkgraph:[2,4,12],networkx:2,node:[2,3,4,5,9,12],node_id:[2,3,4,9],node_index:4,node_indx:[2,4],node_st:[4,9],node_states_numb:[4,9],nodes_index:4,nodes_indexes_arr:4,nodes_label:4,nodes_labels_list:4,nodes_numb:4,nodes_vals_arr:4,nodes_valu:[4,12],none:[2,3,4,5,7,9,10,12],normal:5,normalize_trajectori:5,number:[2,3,4],numpi:[2,4,5,9],obj:[10,12],object:[2,3,4,5,12],one:[4,5],one_iteration_of_ctpc_algorithm:2,one_level_norm:5,onli:5,oper:2,optim:[0,1,2,6,13,14],optimize_structur:3,option:[2,3],order:[2,5,10],origin:5,original_cols_numb:4,otherwis:[2,5],out:5,outer:[5,12],over:2,own:[13,14],p_comb:[4,9],p_indx:[4,9],p_val:9,p_valu:9,packag:[13,14],page:13,panda:[5,12],param:4,paramet:[2,3,4,5,9,13,14],parameters_estim:[0,1,13,14],parametersestim:[2,12],parent:[2,3,4,5],parent_indx:2,parent_label:2,parent_set:2,parent_set_v:2,parent_v:2,parent_valu:9,parents_cardin:4,parents_comb:5,parents_index:4,parents_indx:9,parents_label:[4,9],parents_states_numb:[4,9],parents_v:[4,9],parents_valu:[4,9],part:2,particular:[2,5],pass:12,path:[2,5,12],patienc:[2,3],peest:12,perform:2,pip:12,place:5,plot:2,png:2,posit:[4,5],possibl:[2,4],predict:3,prepar:5,present:[2,5],print:12,prior:[2,12],prior_net_structur:5,process:[2,3,4,5],properli:5,properti:[4,5],put:5,pyctbn:12,q_xx:4,rappres:4,raw:5,raw_data:5,read:[5,12],read_csv:12,read_csv_fil:12,read_fil:12,read_json_fil:5,real:[2,4,5,12],red:2,refer:[4,5],reject:2,rel:4,relat:5,releas:12,remain:5,remov:[2,4,5],remove_edg:4,remove_nod:4,repres:4,represent:2,res:4,resid:[2,4],result:[2,5,12],rtype:4,rule:[2,3],run:[7,8,9,10],runtest:[7,8,9,10],same:5,sampl:[4,5,12],sample_fram:[5,12],sample_import:[0,1,13,14],sample_path:[0,1,2,13,14],sampled_cim:7,sampleimport:5,samplepath:[2,4,12],samples_label:5,save:[2,12],save_plot_estimated_structure_graph:2,save_result:[2,12],scalar_index:2,scalar_indexes_struct:2,score:2,se1:12,search:[2,3,13],second:2,see:5,select:12,self:[2,5,12],sep:2,sep_set:2,set:[2,4,5,7,8,9,10],set_of_cim:[0,1,2,5,13,14],setofcim:[2,4,5,12],setupclass:[7,8,9,10],shift:[4,5],shifted_cols_head:5,show:2,signific:2,simbol:5,simpl:12,simpli:12,sinc:4,single_cim_xu_marginal_likelihood_q:2,single_cim_xu_marginal_likelihood_theta:2,single_internal_cim_xxu_marginal_likelihood_theta:2,size:[2,4],socim:5,sofc1:12,sorter:5,specif:[2,4,12],spuriou:2,spurious_edg:2,start:5,state:[2,4],state_res_tim:4,state_residence_tim:4,state_transition_matrix:4,statist:2,stop:[2,3],str:[2,3,4,5,12],string:[2,3,4,5],structur:[0,1,2,3,5,9,13,14],structure_constraint_based_estim:[0,1,13,14],structure_estim:[0,1,3,13,14],structure_estimation_exampl:12,structure_graph:[0,1,2,5,6,13,14],structure_label:5,structure_score_based_estim:[0,1,13,14],structureconstraintbasedestim:2,structureestim:[2,3,12],structurescorebasedestim:2,structut:4,style:2,submodul:[1,6,13,14],subpackag:[13,14],subset:2,suffici:2,suffuci:2,symbol:[4,5],synthet:5,t_xu_suff_stat:2,tabu:[2,3],tabu_length:[2,3],tabu_rules_dur:[2,3],tabu_search:[0,1,13,14],tabusearch:3,take:12,tar:12,task:[2,4],tau_xu:2,ternari:12,test:2,test_add_edg:9,test_add_nod:9,test_adjacency_matrix:7,test_buid_samplepath_no_concatenated_sampl:9,test_buid_samplepath_no_vari:9,test_build_cim:9,test_build_complete_graph:7,test_build_p_combs_structur:9,test_build_removable_edges_matrix:7,test_build_saplepath_no_prior_net_structur:9,test_build_sort:10,test_build_structur:9,test_build_structure_bad_sort:9,test_build_time_columns_filtering_structure_for_a_nod:9,test_build_time_scalar_indexing_structure_for_a_nod:9,test_build_trajectori:9,test_build_transition_columns_filtering_structur:9,test_build_transition_scalar_indexing_structure_for_a_nod:9,test_cach:6,test_child:2,test_cim:6,test_clear:10,test_clear_concatenated_fram:10,test_clear_data_frame_list:10,test_compute_cim_coeffici:9,test_compute_parameters_for_nod:7,test_compute_row_delta_in_all_fram:10,test_compute_row_delta_in_all_frames_not_init_sort:10,test_compute_row_delta_single_samples_fram:10,test_dataset_id:10,test_edges_oper:9,test_equ:9,test_fast_init:[7,9],test_file_path:10,test_filter_cims_with_mask:9,test_find:10,test_generate_possible_sub_sets_of_s:7,test_get_node_id:9,test_get_node_indx:9,test_get_ordered_by_indx_set_of_par:9,test_get_parents_by_id:9,test_get_positional_node_indx:9,test_get_states_numb:9,test_hill_climbing_search:6,test_import_data:10,test_import_sampled_cim:10,test_import_structur:10,test_import_vari:10,test_init:[7,9,10],test_init_not_filled_dataframs:9,test_init_not_initialized_import:9,test_json_import:6,test_networkgraph:6,test_normalize_trajectori:10,test_normalize_trajectories_wrong_indx:10,test_normalize_trajectories_wrong_kei:10,test_ord:10,test_par:2,test_parameters_estim:6,test_put:10,test_read_json_file_found:10,test_read_json_file_not_found:10,test_repr:9,test_sample_import:6,test_sample_path:6,test_save_plot_estimated_graph:7,test_save_result:7,test_setofcim:6,test_structur:[6,8],test_structure_1:7,test_structure_2:7,test_structure_3:[7,8],test_structure_constraint_based_estim:6,test_structure_estim:6,test_structure_monoprocesso:7,test_structure_score_based_estim:6,test_tabu_search:6,test_tim:7,test_trajectori:6,testcach:10,testcas:[7,8,9,10],testconditionalintensitymatrix:9,testhillclimbingsearch:8,testjsonimport:10,testnetworkgraph:9,testparametersestimatior:7,testsampleimport:10,testsamplepath:9,testsetofcim:9,teststructur:9,teststructureconstraintbasedestim:7,teststructureestim:7,teststructurescorebasedestim:7,testtabusearch:8,testtrajectori:9,tha:5,theta:2,thi:[2,4,5,12],three:12,threshold:2,thumb:2,thumb_threshold:2,thumb_valu:2,time:[2,4,5,12],time_filt:4,time_kei:5,time_scalar_indexing_strucur:4,timestamp:5,to_nod:5,tot_vars_count:[2,3],total:[2,4],total_variables_count:4,total_variables_numb:4,traj:5,trajecory_head:5,trajectori:[0,1,2,5,12,13,14],trajectories_kei:5,trajectory_list:5,trajectri:12,transit:[2,4,5],transition_filt:4,transition_matric:4,transition_scalar_indexing_structur:4,tri:5,tupl:4,tutori:5,two:2,type:[2,3,4,5,12],union:5,uniqu:5,unittest:[7,8,9,10],unus:4,usag:[13,14],use:[2,12],used:[2,3,4,5],using:[2,3,4,5],util:[0,1,4,6,13,14],valid:2,valu:[2,3,4,5,9,12],values_list:12,var_id:2,variabl:[2,3,4,5,12],variable_cardin:5,variable_cim_xu_marginal_likelihood_q:2,variable_cim_xu_marginal_likelihood_theta:2,variable_label:5,variables_kei:5,variables_label:5,vector:[2,4],want:12,when:2,where:5,which:[2,3,4,5],whl:12,who:2,without:[2,3],you:[2,5,12],your:[13,14]},titles:["PyCTBN package","PyCTBN.PyCTBN package","PyCTBN.PyCTBN.estimators package","PyCTBN.PyCTBN.optimizers package","PyCTBN.PyCTBN.structure_graph package","PyCTBN.PyCTBN.utility package","PyCTBN.tests package","PyCTBN.tests.estimators package","PyCTBN.tests.optimizers package","PyCTBN.tests.structure_graph package","PyCTBN.tests.utility package","basic_main module","Examples","Welcome to PyCTBN\u2019s documentation!","PyCTBN","setup module"],titleterms:{"import":12,abstract_import:5,basic_main:11,cach:5,conditional_intensity_matrix:4,constraint_based_optim:3,content:[0,1,2,3,4,5,6,7,8,9,10],data:12,document:13,estim:[2,7,12],exampl:12,fam_score_calcul:2,hill_climbing_search:3,implement:12,indic:13,instal:12,json_import:5,modul:[0,1,2,3,4,5,6,7,8,9,10,11,15],network_graph:4,optim:[3,8],own:12,packag:[0,1,2,3,4,5,6,7,8,9,10],paramet:12,parameters_estim:2,pyctbn:[0,1,2,3,4,5,6,7,8,9,10,13,14],sample_import:5,sample_path:4,set_of_cim:4,setup:15,structur:[4,12],structure_constraint_based_estim:2,structure_estim:2,structure_graph:[4,9],structure_score_based_estim:2,submodul:[0,2,3,4,5,7,8,9,10],subpackag:[0,1,6],tabl:13,tabu_search:3,test:[6,7,8,9,10],test_cach:10,test_cim:9,test_hill_climbing_search:8,test_json_import:10,test_networkgraph:9,test_parameters_estim:7,test_sample_import:10,test_sample_path:9,test_setofcim:9,test_structur:9,test_structure_constraint_based_estim:7,test_structure_estim:7,test_structure_score_based_estim:7,test_tabu_search:8,test_trajectori:9,trajectori:4,usag:12,util:[5,10],welcom:13,your:12}}) \ No newline at end of file From 6cfa4b9d4da047004345af774596a7581460bec4 Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sat, 13 Mar 2021 19:42:45 +0100 Subject: [PATCH 003/139] Create .gitattributes --- .gitattributes | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..da3301e --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +*.js linguist-vendored=false +*.html linguist-vendored=false +*.css linguist-vendored=false From b24bb1c2b0be934d20490a7b9e23cb3de4710ab8 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sat, 13 Mar 2021 18:43:56 +0000 Subject: [PATCH 004/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index a6906b6442bb5b721a2a813fef5543b79fd79de3..c969b746c087cf8ceef70ba0b45ef83c9d2f5ec1 100644 GIT binary patch delta 4990 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 NEo436+01kF{{wK3nG*m2 delta 4989 zcmbtXdtB93ws&ok!&5jMP*Gm;R^D#`c`4!*aFD^A)C5GHKR|4N8GLJY$%CNiI=Qv- zlhe)l*kg*@&l#_kfa#c83Z~7}R5~Wr%$Q20siVlOy|*6a-ut=#+<*A4wb$C~x!3v~ z-q~dT&L;aVlNWg4Q=2`|&)dj*`oYn;-JxtrW6jc%`Xx2XEC@R$uy!y0n^oXtV`=xs zZO`~%hu8Q}r@1R;%$xqR$fk~3gvR&HwC@3ayt zSMptqR%7L=GV8RZR&K@F5UtqCJv($ktFUsL&hONgSh+nn&uO(*Ztu)Nt*q3_{$cP# zt=!7>=I_!T$_{7QYV}sx;rCj#YAg5twB=gWLvHh4O|x<*p1Fe;{Zb7g$*q=9+>;oD zLE&yV803g+r+DK0pmM~d7;KG+#2XO_*z7+8zwwX7KZVZ37s7q;YQRE#F+36DL&8Yc z4gLIG(K*H$o1^2a=WAW|DYekwk zCL#kTPR>AaPo)27DNja(NuAc9c(g=Lfwb+h@fa25K;em}BEsto&X(pxg&$P@(W+jI ziXv_ClpZ7_H224Zki%+xJf_&DQ>#ENHWCuiCt)Hs#JliPd**=C6GAZ{Gz+~GCR-g` zicgWP6D=x=&&A)y&BWdDIk<3gJpPmzWf1RBxtTBTiaamH8*y=>Bi>E$5v_$_yhv`U z6P>X>*%2=U`#W}OW$Ipg7?vgl*(|N8$CTta`EY~<5pYRTJT94b6PAGG&<<((z5}7of&|uTEozoS&3gy z3&1?|*Wb(Z06dZrfbIJtuqMj|qo*&xGg$%p8`FybcV`D+!f8L8p1lY|W(Htyb`{p= z1YqvW-DsX3fNAI5(I=+>wC&mc*qO6l?iDS`hN2QXMJp7P*e6IEephqg*k zqVbwpP-1^*Tu@?nXnO@E`lacD5*^SE3rZA8>l2hr|4TuMHKAR$iJ-q?M`*Xjq1X?a z;W7Fnc7x_YRCD`dO$|#MEo&^HTBZKptZ=|r&IjsFv!@8ch`!JHVO8#X*mA*DkIPGD z;!s~RXN8pNhJs~)=BfrNaR3?$i?FNSh~3R5eQhD#@2aO6dd?R=`*|1C>1{`1c)%=nmN9D&cc0?(T5jZyH6}OF(K9iN{5tQ zYmX6KpLD~_dnUa4vYWo5tXHY#mcOY8`^xozpZ{X5=sB)S_rT!lBJ?X$LGG?5e|}|d zxOR?@e!XVDWb}7xf0D%ZC&%$&d+^n7)$dV~*BZ_!qT{Jul0b*bae6`HAvgSDdjq|s zwb+Y+y7#kWwii_zO`D#VjPBcZL=iu3KB0(H9iJ$@j^7(Gy3K|64uK1vKIx`k-?~t# zlx$lA*gUs^US=~cEDY2Kkm|ayQ1qoA%|#}i?by%6f&RhH`7Y?x+CcAiJ&tKp8AiWK zp^Rx$89w{k+mg}q-uQ<){p@L1>_2A9?=`_heCH`Qz3okMEc9Rc?O1W@fD0Pk^w6$+ zK<|AG_{Q`&9Q$?=I=vdGcf3ueonBR04(K~2qj&uNvLeg}t}F5IBBStudk%Q;L0{&m z|MB1-luG-%N*CMTjo_V=nVo*<(0?gWYtPGyNIty93Agtp;-1H+(%?1Xy0bDf{OI&C z-1wW{!8f)htzB|-L4SVwU5C_FNmxL@PeQ$t*Bg095*v>#_cHMEkc;7dg1qHJSgAA`jXd02Y9!;TVUty( z{3BRTroR3NHV{;u0!`_!qyIL%$m8HC_!$W@PQ!eH9jBpzz_t%Is^V_mahR&tdBcHs zjfNbnRb#&_-}C*DNa|<$VGh)A-!o82(0T?|bJuW`e(rh&{KU|Nap#%f$Omsz1B?0Q8&FE{ z-3?f*6c6#v8<5AZ=77WfY>WBpKS?F0n~+SpIX5Ad;OU!?P4IyNr&}>ASs_7_k(J0_-CDbe zr{9M0yfl@`PjDDN)eH~bc`Z+NW0j=8$BiWr{K<`FKp7uvV#Nf_CRRuAm5HslmA?aD z=G|T_p7*b$#4}gI==*&v|{r!NzfH3xV5s z#tB{<&#IN_USawdyup*X()oH%Y43_BTS;8?1ZE)^n!vUbbWUVj3H-d+PJ)A8QZv|_ z>Q%ga}%vO++X9&F`iY@0B=`@xXOlAgk8pYS8FdrWEJbeI36iU7h zPGGr^z3*fOP* zeLpU{muPsp{sV0Ji{Z>s$!7gGnWMD;4iPMu%sd{!9w&G`f-NO*iImV7$x`V1{AMIO z?o8jtUr%G+Y4Sg&3C2;Qs`IP!%}tgK7VWR%Be&Ue)TmJPsq+~jHF!Lf@-t+Dw&^tm z&S{bhQ!raV4X+|dlmCPLW`v#2hjyg&wGq-69+C3H%F=~2c8yj>Upm>P{j9(-LvoW9 z%o0$+D>9f)^X!>PTrE!`NRw;iIn$$gJ~rN(iJX>QBcu}_k@9WAQW<|s!6^lo71(D9 L*@2KOX0rJgTtJP> From 6a357d7331b8b24223f02b1b2f6b32e57803d848 Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sat, 13 Mar 2021 19:45:11 +0100 Subject: [PATCH 005/139] Update .gitattributes --- .gitattributes | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitattributes b/.gitattributes index da3301e..7c40d77 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,3 @@ -*.js linguist-vendored=false -*.html linguist-vendored=false -*.css linguist-vendored=false +*.js linguist-vendored +*.html linguist-vendored +*.css linguist-vendored From d2fe3f190cdadf29bc3e5140628872aba95d010b Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sat, 13 Mar 2021 18:46:12 +0000 Subject: [PATCH 006/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index c969b746c087cf8ceef70ba0b45ef83c9d2f5ec1..b661d54406cc7b2439c6303287f1233a832661af 100644 GIT binary patch delta 6771 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 delta 6873 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 V-4YH Date: Sat, 13 Mar 2021 20:28:13 +0100 Subject: [PATCH 007/139] Update python-PyCTBN-package.yml --- .github/workflows/python-PyCTBN-package.yml | 25 +++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/.github/workflows/python-PyCTBN-package.yml b/.github/workflows/python-PyCTBN-package.yml index 347b134..e86ae63 100644 --- a/.github/workflows/python-PyCTBN-package.yml +++ b/.github/workflows/python-PyCTBN-package.yml @@ -40,3 +40,28 @@ jobs: - name: Test with pytest run: | pytest PyCTBN/tests/ + - name: Install pypa/build + run: >- + python -m + pip install + build + --user + - name: Build a binary wheel and a source tarball + run: >- + python -m + build + --sdist + --wheel + --outdir dist/ + . + git config --local user.email "f.martini@campus.unimib.it" + git config --local user.name "philipMartini" + git add . + git commit -m "Create New Realease at dist/" -a || true + # The above command will fail if no changes were present, so we ignore + # that. + - name: Push changes + uses: ad-m/github-push-action@master + with: + branch: master + github_token: ${{ secrets.PYCTBN_TOK }} From 6a053e8458d1cf427b4361389fab3206a6fe798f Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sat, 13 Mar 2021 19:29:18 +0000 Subject: [PATCH 008/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index b661d54406cc7b2439c6303287f1233a832661af..c72e8ebc3595b94272ff8f812fe0715e4cab4727 100644 GIT binary patch delta 6978 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 F{{|wr^!xw- From aff6727f9afd0e0ebc8cedfc6b7b35311067800b Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sat, 13 Mar 2021 20:57:58 +0100 Subject: [PATCH 009/139] Update python-PyCTBN-package.yml --- .github/workflows/python-PyCTBN-package.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/python-PyCTBN-package.yml b/.github/workflows/python-PyCTBN-package.yml index e86ae63..3f70711 100644 --- a/.github/workflows/python-PyCTBN-package.yml +++ b/.github/workflows/python-PyCTBN-package.yml @@ -8,6 +8,8 @@ on: paths-ignore: -'docs/**' -'docs-out/**' + -'dist/**' + -'build/**' branches: [ master ] pull_request: branches: [ master ] From bfeec3fd4f3d85a2059d200d337b35f46bad506d Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sat, 13 Mar 2021 19:58:46 +0000 Subject: [PATCH 010/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index c72e8ebc3595b94272ff8f812fe0715e4cab4727..640055bd4d25efb7545c928d723970b2fbe1da6d 100644 GIT binary patch delta 7098 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 YoUhQ9Jf|&rMvF@{OL+}jQ`si=A4!=zS^xk5 delta 7100 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 From 3182b9b114d23e9a82b8f51e46c50c4f53a6f38c Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sat, 13 Mar 2021 21:19:34 +0100 Subject: [PATCH 011/139] Update python-PyCTBN-package.yml --- .github/workflows/python-PyCTBN-package.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/python-PyCTBN-package.yml b/.github/workflows/python-PyCTBN-package.yml index 3f70711..21d19f5 100644 --- a/.github/workflows/python-PyCTBN-package.yml +++ b/.github/workflows/python-PyCTBN-package.yml @@ -62,6 +62,7 @@ jobs: git commit -m "Create New Realease at dist/" -a || true # The above command will fail if no changes were present, so we ignore # that. + git pull - name: Push changes uses: ad-m/github-push-action@master with: From 801d653ede28cbf0ae562b45e3bb402e33f9c43d Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sat, 13 Mar 2021 20:20:36 +0000 Subject: [PATCH 012/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 640055bd4d25efb7545c928d723970b2fbe1da6d..32897a460317f3397147ac60cff64a8b7c37f4c7 100644 GIT binary patch delta 7424 zcmb7Idq7oH)^}}{%S*WT@>X5~3i5s^2#BB}eu{{OJ$wQRUhY9e2P{++twy~FiEeDA zWid_DXOBthOfgm>rekIam^Ep>jnq%G@G=YF`+ z?!%3CjV|7ax{}g@<%T7JKub41%{IvR-L2?n&8#Yy_3Jlj+zFRSuX*(wqvTns!TCmIk(HY8NUl<1r82J- zDkdwHZ~LBNwo=R7y_Eth^@l;%ltL?2KWDnK&`NEe`>ay@(BNNnt%_o0HZA^H$+uE} zcZgDo9#UJgmBm(S&(N{T{D)NKL1lrJ+PBw_U+_=1(}LVwA5s&?*A4gPQzE?h&w&~I zvB*(;M_@E>2pGqAjPT(*gT43@A+h{}U?cYrwB=)mx^wra2wo5{hW{EL#;*-c=QCr1 z_?Vz%o)+%RKZq{ie++Wrt-~F7)5uBuR!F#=7SDgSG-H?_Y5xCPn-)wS{Rc~0asIcZ zoe^pOXIy6@QeYZ?IbtL~6XtD=tSowhh)UXt;WNTQAxlWrGACXgI*7Z3j^yiuj55v< zo_2Mj705O}9}r2Lc#$EJf?$!~%J@N?YzaR!e<&|t;yy#YcwVr9?+uh1X9mS`&GyBp zC_XbNP-e7O=0AvzCQDjlX_nGrgZcNt5&Xf(Sn@W%PmSJ>iRfRa6mTVWxSiH)T2_Yh z86$`A%J^yg&L{&v6{p81fw}QRag+I_;BY=G!GZgRj^JD368XLGSkVqzX{V2zLbT>g zIF&TRp-%LxrZ9o$#}DC#cwf;jnvT5q5nAFPQgAZk-K=3qhl+cL3^6=E(Vw4Bu;FVH z2JwT5@gkgVKOoM^eLvBe&rWjSxk14qJwGKx@}Clh+UDk(mzc|QbNTeqNmfH2M33Rc ziSDG9o$x$}iT~YG+ zk>ohY^f|n1LLhHRH}R*^0{N7QJGmt#kf)q=<-Qr&Jd1dB8EeI$QWE-;yV@O7 zW@szz4k)?WN*hi}iMG-Pld?)%X}zOZw3RlH6x3E)e<**^R@xv^RBctPt@djxZT={2 z+De-}${B5?%^l@x{|Nf84ISmKwy6yqMK^%{i3GaQYI)6o^3sK6^{eYclw9@WN#Vd} z&j?Z-Cx>ba1NYnJ&rMT4=9V128kd>Kv`uw&)(XK@b=gaRTTG>t`#`Rnk;5BH47_={ zi@Ih8oo_6miL}j+pM0bd^3>{_&zZKRnjR|$Sj5}TETIZT@`@*N_~I;i?8XzpKt!~f zF?*M`FuphUy2SZLrqOCp-tS_AZ`h~j`ng7)_P~W-f7Ph2SkNLEYG%P-<-&eZ74WTX zrM>#VjSnx%;Z?__wVg#|t?IauugUUNZ=3%n2=&9_pT%P9To3HB13&fGk_O3nv-Fr; z)GpgD7TkW3hnihh1pJv3K74oEBh+Fe`RwI6y#2I6ZC;)Pw2ukcy7Ad( zf&1(#r5<0y9p4C2eKt^xj&B(F>MTFCeB%y5sD9N4-lG+|4GPqo+YT{}R1d#U2E3`f zlrB{S|7J%Hzfmaubof^`&%S*K((7sXzJ+((hC)^>29dJwd3MZ~rKFPd=^Z?T2je zK{>s3e7MZ0R=-2xY4WeU?yl|H^I2s^HKcJW@YXZbJLBWH`+GV3wX;EL?R%v9wX-sp z9qJ2$P;1}6Di@Zf+mhWi$DrBZ4NY!%(~mi*|Jd_^6sh@0%JQ0zBCu`*vsL%*{kvqX z-$#Weu%(M|hG84pvB%U@MGnp8Tw7G!Sd^f>KGdHhZSx56RU&-TVzVn6x{@ZunuA1;X znv^zrnxVGzuTYuKLpx%s#AMZu34L`+#z65v7arFs|J8?@(ubPbhuUB-&uL-QDV9Fe zran|{Z^~IXLl1m8;uotwbo>tVXuNc36y$O5%i~~?I{)%HKPYJ$s{?->n3{5(U_-P{ zd)QDw*c=1Cn41P(Sp5bVux&D3{?uwC7EJ-irUj|c=?VoneI}$rVN=~qC?A5C#)1>> zoC)I6=yA6*b8VWs6t>tvanso+VMi1wO)Fl9!|p!XLy5AfJ&_1x3Wc9UEx`GEVd@+$ za~6>-i>R(e6xSkZYZ0Zjh{{?-VJ)Jr7ExAZGU0^fa5Oi;ZK$_cvmK?OlY3p`D5uLaiIh(~n{jy?=wyzxpfUwX}! zFX;?(R8G25tp#@^es)lD@x~`G3^#uQwsic3Phca#&;yW3P;vm~5PWt3RuZHigeroA z2jN+Q$^QVePN z#+@AWJq)fS5qB8s2o4^G%>*+)gPl^oz<~M)lGh)BaAKq!fmsB21WF{o#DKL4%#&9< zNaa`WJL|dw#EQ>hrIaW$V7QNvNaU-!T&xlWU%*;Y_5Bw>uU}|73W}7cr`SGkvUu|- zOe02WD?CQyJStLH{o)wI!JSCCnsv?MqMyoR32q!Sv&hL4e0$F2U{NFrFacE9!(2T=x~^5?uI- zRF|OV*L2*3C0~sJgF1!Vuv0k*aI8BfzfC-fLFJFCcN-Zu#kN5H?T>{w^6tu z6mG?N2(qo0=`-QD6YvO$)t`V|DR#nuTke1#R-K11Og{;FxqZrjSyvzm+XurC^!*lW z@U4>&Kqp&I!Wx3CZ(+TZ>@eV((PU@-ZO}{0*5X>gR=H+wsi>J9d&KLa+B_mcs~-tBR;!3PFl@fpyQ*2*)mLW38ErcYMMRB02e~%Fmx0*c3DHvi$~kb9ySA8e7yPw=VleYOIMI>W z=V2j1^Ldz0;B!Gx>n^|oY2Cw!sl&;7a|c#B}XYU z`@o(S#L6vw`&b~9n*B`A_wlC4@ivEvdLr6Xgz9k~(>0S{Xx^)mIi32QIITzPns zmZ%u?zXHQ)f6^5iP9|)*0w&3xj(TE09|Oaz!Bqc1x7vgqKfpw3X_gTUUEqo4bSiecss<(n>9)DL6fmI(E%8Wl%xPiykXB@22UcDg_mUt5iNdD!UG+#`3=cb4*>z1g*o3|jD zHZR?RabU)ff6-+$^>C*URTz!x7x+|XPrO1yDMPjhv9=MQ#ihDGKL{K*$UL75_WJ3~mb%?0O{tg9F zTUEQ767>y?wl3GnPx>*I4;vQIb&>clc(A$mEp z1q7AOY$-vfGh1#WzW&#uw>`N<-zws@D;%@*%*j5tC)R~{O3yOrM1XHvU1QlbutB_1_V^irswHup7(BZ}^2+L{RESxh}?!{MchstkVTkZ_?0@ z@@JEzKR3}}OZkp`PJ3z%WwtnHDAVI}&w*>t@GizKe^yCqDu=T51pNb8snqs+cYnY5 z3_aHy{aGNk1u$O{xgNm&K#(8E3Z&#fS9ue9B>mAZhz%u?aY1Y~!M-3inZRxs%ORLI zj2f>Pj}BwS(n$}zkVH;4z5vPAQoJ&ptso(}!Ar5zihzjfpVUy*-aC92RVzduecg!BabaFQetCE;6M(v<)0b+%a ztvw@HiDZtl`sI$%Vayv>hcai9s10RB(qyu$_Bi##w;CV=>wFk}Kwy3tTTbvz7+WHR z(!2e#eT4>1rT|z)Kn@*c$(QG2Yo@n+6fnyAtrxQQCE$=qJF-EBPB8CDJ zj8(4IhO@!eSeAfwvCNCkz8TAw5qQV3RZ{XYz! zVkxs7XT;MLd--ql%IBBRqxU6O?cJ1KkhG(f3Cy0(Y)GI!Rq(e2YC;7oMzc!k!!B3t zYoObQh&|wp=bB(3&QD}IDezYB=!K^w)${(W;HgA5NeaH}iu?W8V08KzqIxcrf-93~ zP?P6LtWb)5=xQBa88V2yT5DzFy=0MqL1S1f9Y`C);^}MesWHqaMf~DA*wC+E(bS@; zmh$>_^~!nevu%@CzkVU|eR|xGFepV(VG<^5P=Y3c6!9DGpZe&j zd#Fcn-|WMEu@@KjOHJoAFyVa(L&gd!QNrT{DdN?6ma%s%jqX-&1=rGt`)MyOzN=|6 zW1ECd2@a`ZbA*IR1S#SdXJ?n*R_1zGt%xV9OCRp4UR?Z>rl}D3NjM|no(A+VOB0Yl zkRl#N+xqAk;AyoYhV}M7+#$WVxJA=cjJqWqm2g#p-8jJuCP)#NVII}{Vf8(!@ZHrH W+|oYW(q3F#r)g4}UKz(;Wd8>DmA9n; delta 7437 zcmbtYYg|>;wr@<8%}d#PgFKX%fP%ac0Ra*5fk%+g&`OQ>-U3Sz3n=n!dDV@W=p;v3 z7Ims?kCW8u!|s}NG(J0q?MU+$C?v1(C^+)_sjmzF~^wWJ;z#Wf3(5w zqYZWq&YsxN3d4*wgJ(WDdG@6H!zI+!xbu{94_@v$9R0^LS5`BWKe}-!2d@#}#kZ{W z_N}q$ksMUA*krD%tFbT0FE1&~EzK`kTvy|UH!8p_q^@RAxw)cpNnMSuw9Hhw$Xs4m zq3^eC0?V{+)j!zYy$1TqE!FbKnz3dhl)WQT#?wsGXL`{uYnXiHLXy{`2VI|F7k( zG5-ITVVzbpGR*5oKi+M|gI@}ntOW=eyfb(#cM2QMuLmb>4Hwb!hS1>Nh~a)Ak{{yv z*VudG{@<-f+SQ5m3kSxs+}=LAGM)QW!UpRgyQ#y}`v6ET7> ziySP{|7+kF5zDst@jNdeh)!vJ*Z-7OvLjJR{MXnp{&-ZhC|Q6g`-CXR0kz5^u8bK4 z`TTBtvX8{R6w+lzJHvaZ;6W~7qnZ`<3i3j2cDSVjGuo5dLEiE zmTyf6>X!?D9+lv3o10s*xTGRCmv2dow$bjHqVU6s(XfEuOS}xZTc`MO+oU!8@>GBR zP7?AT#%t)rGt2GystGH(M~Xl9P5wJSO1NxY2scbzzynD(o%``mCT8=l$^LwN%Cr1H zvOllc8OBReoOtA6$47{<@S#_KqtPw`;`>YQyO8W#Br~&DJ zW7?LwGNVfHRNKr_fLz{kb}^;jpX+92@kJT({K{E$eo=-zf9in-$W^PezGB*zTJ&HA z@aD5+RHJZS^>7w{?OcF*{oz2Mg@Lcg@KICe?G%LCHUE0|BHNj1Y}G&Su9RE1&%pJM z82Q9|&ivY|M)k>pCMlX`dRH#&7OVzdIa9OK(+flSsNyU>Z&rZ1qnPZ?nYjza$=$B`?$~7qKI-qK^^)~w*)h4Od33v!v0LD-W|kKNPuyNc{WX@)tIXn?-Y}?* zl?gx#BVU=}tp+{unIP1ARk!8trjPaHxlZ+6)*?4vJS;Z2ew6{60>ObF++$Fuu6VT{ zSJkijLT>n0yS=|guGLdd?GT&lhP7*fd+jWv24Be?-waT_)>D9vZ^{5GHjvLms6N#P zi&U&_UiP2WnnP5(6T$Z98Sx(iOc`LI#Fxp|%x$=$L7_|qr7_^y@*=+ad3)-$ro z?VPIIdPb{q3!m|wv&y!8z_bnZ&~xR$zc>=h^Xh0UrG)Vl+q3x2<^c8n7s#!h&C;#c zUu=*>+B&mK3DI+G;;AL&csd@z2bH;`S7|j3JWK@4TRIlxKE|>c=6PT0Q ze0Y&|B=PGS;9FZ_dHtMmG|S5Qs^cPW{Ojg}+)`9VGtHH|wPx{#QklnQkX$CsEqqBoS?D5~YpI^g&`?l881e({040Ob0P0iKmUobSCB_Z7RIx z`^iHzbJ=yu8XA)MN-jV9y(cWGkdajo*VepFgNYDPb5y}dlAg;A?m`cWJEQJeZwPQn>_tjalGr2g3cC(!fp(xn)h z(4Lo5AV6J=9-ED^{Q3O|WbFlR5!n6D+=B9dhh)wPJ?T10IvqO=xKS&JyFMbyh{A|k?cZ4`9r(CE51a~Zc`I+S6^-p0WZvGT( z>G*S>!Ulp72OyoG^Z?8!`0@ZOC7ALVtRndAGgwP7{c|W0Z^Ft9175odK0NbgByMg7 z8)7;ggeM6s2ceq4|Euu;mlP`E)9Zq)?{u&tBnGh@n0c!0#}PC~8}J88fz zx4;KiU4Rgraticv`?LWwu0RB~4uj$7{T`~z!8$3~Zork}$WG2p z&`B*Mu0t;m@Uc2K>onBRp>wCHb|RP#10L<@QUB%{aFpAfeVs}61bft<1slox#efrT z_c&Vb1p{&6Sd z24QOlL`wN9=fP3#+G5ge@YMo}!t@I;gpSO+0EGmN7a)hgt4&aA+MqyMcQa!0D6-zz zPS$Hj(&6}v!ojqQbeqk%?;_o8GlqN*%j5xnBeuoUft`WiZ%x(p@2NY@IH4W#3F_Oy zEd7bVr1RvZK9rP)2g6{@{h=o_V~kjOgfg=)1V-V>;66=p^apA;GlpM+VyPw3s>L1K zFM&}yGNId%E0N&W+bYSIsmIN@=`uVb4^Pt)6@|W6U=;07yF$asj7?XdNU~?5p4i)> zV5Bve>L2M=o3Z^zm?|yJHKL&lTyW_a>bA0wRX?81%jn-C3qk|3|BAuljkWJKA9X%l} z)j~?cneo)IE3bi#RK5Z`uEG>-z6M5;Zo5XK(u_&hVSx-{9i>Z8b^CEBxNUvf!5Zz= z>mp(ConRvQmpW;_nDJJph%V!XsKi@0AdxmN-GCG*#GwDsWh}&H|A9vdI{rfqRfw~G zp*AhV{lCyXE5wO6X|xpL-kY${MtqHZpk>)tdo+gN;Hlt%owq5Ag}Ct+3A&_?7KZI#J7JHLXN*dJjtg1M$Q!CQ@_C!f-fXE{tlCgn)$o%aO>}oM%3Bg z>FHF6<8D)Ag}CE3RkaX*yAAWi^IB;)qE8?tWXT^eMH;`1EACKUcg8Zk6#1!FBnnM; zz?l?O-Ju~Qg6izOIy!91gaqtr7g0_46HHR$uUf%_u=P)fq@!?GcscbhU6w+uy9+r| z5p%`_dSGE>7L4i1%&dEKUkkC}9z+wg-=pqbgbrOatMl=pE{Z50Kk0%EI`Lua;fyQ4 z0(ZPJ8-lmZg<;SBH*<&lXPej>5}O39oZv%X7J`Y4Jwfm<#&QYV2MCev1K4Jwf(No~ z1p5hWgx)xe7|1Mk(cL|okJksW`$=Mg4a+B}w_#-jdL3IvP@`k32pnzMdV)Gzwn-|< zL|Z@RgY^sOI>~{ak6Z27S`u=z7tU<97kawv**w~u=O8wZIk5jC>S0G#BlQ$vwj*1G znS+?E+)%_uAMd&bGo&LpgvAgX8N$+`1U;Ns0l{)7wuGR=iB;N&zW`RFr#-nvUn}CZ zD-<*IY>0hsPpl<)TF+AHgr9-UBB(I1T%9;rqrL>=jcftQ z*Bi-+68yK3C4&iFommb+r88SZaM78qwh{k6yo!yUY%I1er6!rU6b5xC$b_vfLNaM6 zn?VPvhqAc@?L%1=K{kEE5!`TPTL_+ZW6uy6-6?hxzU9t}rRpY4^+Qg>&c!Y*yAZAM|n}cOo(1o1rvICvkIN?xXl@B_fhl> z-t0kQ=zLfaL75Nb+Jqnbum`1BhchO3($J6aWz(cTooKM7e1|`yJ+($KTbw_F>G7Fo zz@=w+o3P85Ehjb0N3eAS1N>N-)b?k0f4}fFJ=Yt2nLoDpF>eyN=Eoi*$oFR^DLKeR z-h>`WU-SuJBS<7AfUO|d7r>?y*o|aa1lc30@l1GRBwHw*bi=j;aGEJG z4jIX!v`<%8%pA>hayJ53B`|M{*iPR9#0nx?dq%TT$&9i3<%*FZ%oA4xGbfVR6wHdH z$wU|Jaq5n5*F!4SdNKNd!2A$aNpK>BEtW!4y8W_!nFdY6-|7A6#ZcxTdDH&F>v=+$ z&_0Z%k(xPSY!1QOVXTnADO^B#I7=Yv-EbBU1$ZT#O(qD9pes{=Df!=}Z$5N5RcC`y88!6-W-lo@sKgTiyDH{^Q z%r=5si)#X@y6>v=%Gw&k9Ef=)hPtHyXT-8aQs#M_6-!s_r4Q(p&nK=&?~5+lyD7aO zX-AjGF?%|*K92gd0RM=iCM>|JacsHtVW*4sHPG!t*dB1g^SfaX=EO6d6nMLD^ukk; z>Un=Iz|-+;niPD`1^4@~VL0Ryi0HXc1-LYU1~qw}z|2zYBNyxNN|izE)mkeP?<9%@ z3?9$M(1D5LSuB0+Ju#knC5gXXhZ*j>uXslB3`<4bnmXlz_Sv@4)ND{BkbB%ptX>hfAE4Y?^+%NiY@jXpbA+|{9kl>IkHb+aCMvx@_c6M^^YvmC) zs}=ENb?(Pq)`yF)XqxhIpM5* zGT|->M83+#UY Date: Sat, 13 Mar 2021 21:39:00 +0100 Subject: [PATCH 013/139] Add build and dist directories --- .gitignore | 3 +- build/lib/PyCTBN/PyCTBN/__init__.py | 8 + .../lib/PyCTBN/PyCTBN/estimators/__init__.py | 5 + .../PyCTBN/estimators/fam_score_calculator.py | 265 ++++++++++++++++ .../PyCTBN/estimators/parameters_estimator.py | 117 +++++++ .../structure_constraint_based_estimator.py | 246 +++++++++++++++ .../PyCTBN/estimators/structure_estimator.py | 183 +++++++++++ .../structure_score_based_estimator.py | 236 ++++++++++++++ .../lib/PyCTBN/PyCTBN/optimizers/__init__.py | 4 + .../optimizers/constraint_based_optimizer.py | 84 +++++ .../PyCTBN/optimizers/hill_climbing_search.py | 135 ++++++++ .../lib/PyCTBN/PyCTBN/optimizers/optimizer.py | 39 +++ .../PyCTBN/PyCTBN/optimizers/tabu_search.py | 188 +++++++++++ .../PyCTBN/PyCTBN/structure_graph/__init__.py | 6 + .../conditional_intensity_matrix.py | 42 +++ .../PyCTBN/structure_graph/network_graph.py | 293 ++++++++++++++++++ .../PyCTBN/structure_graph/sample_path.py | 93 ++++++ .../PyCTBN/structure_graph/set_of_cims.py | 97 ++++++ .../PyCTBN/structure_graph/structure.py | 124 ++++++++ .../PyCTBN/structure_graph/trajectory.py | 45 +++ build/lib/PyCTBN/PyCTBN/utility/__init__.py | 4 + .../PyCTBN/utility/abstract_importer.py | 163 ++++++++++ build/lib/PyCTBN/PyCTBN/utility/cache.py | 54 ++++ .../PyCTBN/PyCTBN/utility/json_importer.py | 181 +++++++++++ .../PyCTBN/PyCTBN/utility/sample_importer.py | 62 ++++ build/lib/PyCTBN/__init__.py | 2 + build/lib/PyCTBN/basic_main.py | 39 +++ build/lib/PyCTBN/setup.py | 20 ++ dist/PyCTBN-1.0-py3-none-any.whl | Bin 0 -> 35618 bytes dist/PyCTBN-1.0.tar.gz | Bin 0 -> 24165 bytes 30 files changed, 2736 insertions(+), 2 deletions(-) create mode 100644 build/lib/PyCTBN/PyCTBN/__init__.py create mode 100644 build/lib/PyCTBN/PyCTBN/estimators/__init__.py create mode 100644 build/lib/PyCTBN/PyCTBN/estimators/fam_score_calculator.py create mode 100644 build/lib/PyCTBN/PyCTBN/estimators/parameters_estimator.py create mode 100644 build/lib/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py create mode 100644 build/lib/PyCTBN/PyCTBN/estimators/structure_estimator.py create mode 100644 build/lib/PyCTBN/PyCTBN/estimators/structure_score_based_estimator.py create mode 100644 build/lib/PyCTBN/PyCTBN/optimizers/__init__.py create mode 100644 build/lib/PyCTBN/PyCTBN/optimizers/constraint_based_optimizer.py create mode 100644 build/lib/PyCTBN/PyCTBN/optimizers/hill_climbing_search.py create mode 100644 build/lib/PyCTBN/PyCTBN/optimizers/optimizer.py create mode 100644 build/lib/PyCTBN/PyCTBN/optimizers/tabu_search.py create mode 100644 build/lib/PyCTBN/PyCTBN/structure_graph/__init__.py create mode 100644 build/lib/PyCTBN/PyCTBN/structure_graph/conditional_intensity_matrix.py create mode 100644 build/lib/PyCTBN/PyCTBN/structure_graph/network_graph.py create mode 100644 build/lib/PyCTBN/PyCTBN/structure_graph/sample_path.py create mode 100644 build/lib/PyCTBN/PyCTBN/structure_graph/set_of_cims.py create mode 100644 build/lib/PyCTBN/PyCTBN/structure_graph/structure.py create mode 100644 build/lib/PyCTBN/PyCTBN/structure_graph/trajectory.py create mode 100644 build/lib/PyCTBN/PyCTBN/utility/__init__.py create mode 100644 build/lib/PyCTBN/PyCTBN/utility/abstract_importer.py create mode 100644 build/lib/PyCTBN/PyCTBN/utility/cache.py create mode 100644 build/lib/PyCTBN/PyCTBN/utility/json_importer.py create mode 100644 build/lib/PyCTBN/PyCTBN/utility/sample_importer.py create mode 100644 build/lib/PyCTBN/__init__.py create mode 100644 build/lib/PyCTBN/basic_main.py create mode 100644 build/lib/PyCTBN/setup.py create mode 100644 dist/PyCTBN-1.0-py3-none-any.whl create mode 100644 dist/PyCTBN-1.0.tar.gz diff --git a/.gitignore b/.gitignore index 7195554..9c3a923 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ __pycache__ **/__pycache__ **/data **/PyCTBN.egg-info -**/dist **/results_data **/.scannerwork -**/build + diff --git a/build/lib/PyCTBN/PyCTBN/__init__.py b/build/lib/PyCTBN/PyCTBN/__init__.py new file mode 100644 index 0000000..faff79c --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/__init__.py @@ -0,0 +1,8 @@ +import PyCTBN.PyCTBN.estimators +from PyCTBN.PyCTBN.estimators import * +import PyCTBN.PyCTBN.optimizers +from PyCTBN.PyCTBN.optimizers import * +import PyCTBN.PyCTBN.structure_graph +from PyCTBN.PyCTBN.structure_graph import * +import PyCTBN.PyCTBN.utility +from PyCTBN.PyCTBN.utility import * \ No newline at end of file diff --git a/build/lib/PyCTBN/PyCTBN/estimators/__init__.py b/build/lib/PyCTBN/PyCTBN/estimators/__init__.py new file mode 100644 index 0000000..112086f --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/estimators/__init__.py @@ -0,0 +1,5 @@ +from .fam_score_calculator import FamScoreCalculator +from .parameters_estimator import ParametersEstimator +from .structure_estimator import StructureEstimator +from .structure_constraint_based_estimator import StructureConstraintBasedEstimator +from .structure_score_based_estimator import StructureScoreBasedEstimator diff --git a/build/lib/PyCTBN/PyCTBN/estimators/fam_score_calculator.py b/build/lib/PyCTBN/PyCTBN/estimators/fam_score_calculator.py new file mode 100644 index 0000000..d8ec3a0 --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/estimators/fam_score_calculator.py @@ -0,0 +1,265 @@ + +import itertools +import json +import typing + +import networkx as nx +import numpy as np +from networkx.readwrite import json_graph + +from math import log + +from scipy.special import loggamma +from random import choice + +from ..structure_graph.set_of_cims import SetOfCims +from ..structure_graph.network_graph import NetworkGraph +from ..structure_graph.conditional_intensity_matrix import ConditionalIntensityMatrix + + +''' + +''' + + +class FamScoreCalculator: + """ + Has the task of calculating the FamScore of a node by using a Bayesian score function + """ + + def __init__(self): + #np.seterr('raise') + pass + + # region theta + + def marginal_likelihood_theta(self, + cims: ConditionalIntensityMatrix, + alpha_xu: float, + alpha_xxu: float): + """ + Calculate the FamScore value of the node identified by the label node_id + + :param cims: np.array with all the node's cims + :type cims: np.array + :param alpha_xu: hyperparameter over the CTBN’s q parameters, default to 0.1 + :type alpha_xu: float + :param alpha_xxu: distribuited hyperparameter over the CTBN’s theta parameters + :type alpha_xxu: float + + :return: the value of the marginal likelihood over theta + :rtype: float + """ + return np.sum( + [self.variable_cim_xu_marginal_likelihood_theta(cim, + alpha_xu, + alpha_xxu) + for cim in cims]) + + def variable_cim_xu_marginal_likelihood_theta(self, + cim: ConditionalIntensityMatrix, + alpha_xu: float, + alpha_xxu: float): + """ + Calculate the value of the marginal likelihood over theta given a cim + + :param cim: A conditional_intensity_matrix object with the sufficient statistics + :type cim: class:'ConditionalIntensityMatrix' + :param alpha_xu: hyperparameter over the CTBN’s q parameters, default to 0.1 + :type alpha_xu: float + :param alpha_xxu: distribuited hyperparameter over the CTBN’s theta parameters + :type alpha_xxu: float + + :return: the value of the marginal likelihood over theta + :rtype: float + """ + + 'get cim length' + values = len(cim._state_residence_times) + + 'compute the marginal likelihood for the current cim' + return np.sum([ + self.single_cim_xu_marginal_likelihood_theta( + index, + cim, + alpha_xu, + alpha_xxu) + for index in range(values)]) + + def single_cim_xu_marginal_likelihood_theta(self, + index: int, + cim: ConditionalIntensityMatrix, + alpha_xu: float, + alpha_xxu: float): + """ + Calculate the marginal likelihood on q of the node when assumes a specif value + and a specif parents's assignment + + :param cim: A conditional_intensity_matrix object with the sufficient statistics + :type cim: class:'ConditionalIntensityMatrix' + :param alpha_xu: hyperparameter over the CTBN’s q parameters + :type alpha_xu: float + :param alpha_xxu: distribuited hyperparameter over the CTBN’s theta parameters + :type alpha_xxu: float + + :return: the value of the marginal likelihood over theta when the node assumes a specif value + :rtype: float + """ + + values = list(range(len(cim._state_residence_times))) + + 'remove the index because of the x != x^ condition in the summation ' + values.remove(index) + + 'uncomment for alpha xx not uniform' + #alpha_xxu = alpha_xu * cim.state_transition_matrix[index,index_x_first] / cim.state_transition_matrix[index, index]) + + return (loggamma(alpha_xu) - loggamma(alpha_xu + cim.state_transition_matrix[index, index])) \ + + \ + np.sum([self.single_internal_cim_xxu_marginal_likelihood_theta( + cim.state_transition_matrix[index,index_x_first], + alpha_xxu) + for index_x_first in values]) + + + def single_internal_cim_xxu_marginal_likelihood_theta(self, + M_xxu_suff_stats: float, + alpha_xxu: float=1): + """Calculate the second part of the marginal likelihood over theta formula + + :param M_xxu_suff_stats: value of the suffucient statistic M[xx'|u] + :type M_xxu_suff_stats: float + :param alpha_xxu: distribuited hyperparameter over the CTBN’s theta parameters + :type alpha_xxu: float + + :return: the value of the marginal likelihood over theta when the node assumes a specif value + :rtype: float + """ + return loggamma(alpha_xxu+M_xxu_suff_stats) - loggamma(alpha_xxu) + + # endregion + + # region q + + def marginal_likelihood_q(self, + cims: np.array, + tau_xu: float=0.1, + alpha_xu: float=1): + """ + Calculate the value of the marginal likelihood over q of the node identified by the label node_id + + :param cims: np.array with all the node's cims + :type cims: np.array + :param tau_xu: hyperparameter over the CTBN’s q parameters + :type tau_xu: float + :param alpha_xu: hyperparameter over the CTBN’s q parameters + :type alpha_xu: float + + + :return: the value of the marginal likelihood over q + :rtype: float + """ + + return np.sum([self.variable_cim_xu_marginal_likelihood_q(cim, tau_xu, alpha_xu) for cim in cims]) + + def variable_cim_xu_marginal_likelihood_q(self, + cim: ConditionalIntensityMatrix, + tau_xu: float=0.1, + alpha_xu: float=1): + """ + Calculate the value of the marginal likelihood over q given a cim + + :param cim: A conditional_intensity_matrix object with the sufficient statistics + :type cim: class:'ConditionalIntensityMatrix' + :param tau_xu: hyperparameter over the CTBN’s q parameters + :type tau_xu: float + :param alpha_xu: hyperparameter over the CTBN’s q parameters + :type alpha_xu: float + + + :return: the value of the marginal likelihood over q + :rtype: float + """ + + 'get cim length' + values=len(cim._state_residence_times) + + 'compute the marginal likelihood for the current cim' + return np.sum([ + self.single_cim_xu_marginal_likelihood_q( + cim.state_transition_matrix[index, index], + cim._state_residence_times[index], + tau_xu, + alpha_xu) + for index in range(values)]) + + + def single_cim_xu_marginal_likelihood_q(self, + M_xu_suff_stats: float, + T_xu_suff_stats: float, + tau_xu: float=0.1, + alpha_xu: float=1): + """ + Calculate the marginal likelihood on q of the node when assumes a specif value + and a specif parents's assignment + + :param M_xu_suff_stats: value of the suffucient statistic M[x|u] + :type M_xxu_suff_stats: float + :param T_xu_suff_stats: value of the suffucient statistic T[x|u] + :type T_xu_suff_stats: float + :param cim: A conditional_intensity_matrix object with the sufficient statistics + :type cim: class:'ConditionalIntensityMatrix' + :param tau_xu: hyperparameter over the CTBN’s q parameters + :type tau_xu: float + :param alpha_xu: hyperparameter over the CTBN’s q parameters + :type alpha_xu: float + + + :return: the value of the marginal likelihood of the node when assumes a specif value + :rtype: float + """ + return ( + loggamma(alpha_xu + M_xu_suff_stats + 1) + + (log(tau_xu) + * + (alpha_xu+1)) + ) \ + - \ + (loggamma(alpha_xu + 1)+( + log(tau_xu + T_xu_suff_stats) + * + (alpha_xu + M_xu_suff_stats + 1)) + ) + + # end region + + def get_fam_score(self, + cims: np.array, + tau_xu: float=0.1, + alpha_xu: float=1): + """ + Calculate the FamScore value of the node + + + :param cims: np.array with all the node's cims + :type cims: np.array + :param tau_xu: hyperparameter over the CTBN’s q parameters, default to 0.1 + :type tau_xu: float, optional + :param alpha_xu: hyperparameter over the CTBN’s q parameters, default to 1 + :type alpha_xu: float, optional + + + :return: the FamScore value of the node + :rtype: float + """ + + 'calculate alpha_xxu as a uniform distribution' + alpha_xxu = alpha_xu /(len(cims[0]._state_residence_times) - 1) + + return self.marginal_likelihood_q(cims, + tau_xu, + alpha_xu) \ + + \ + self.marginal_likelihood_theta(cims, + alpha_xu, + alpha_xxu) diff --git a/build/lib/PyCTBN/PyCTBN/estimators/parameters_estimator.py b/build/lib/PyCTBN/PyCTBN/estimators/parameters_estimator.py new file mode 100644 index 0000000..6b6883b --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/estimators/parameters_estimator.py @@ -0,0 +1,117 @@ +import sys +sys.path.append('../') +import numpy as np + +from ..structure_graph.network_graph import NetworkGraph +from ..structure_graph.set_of_cims import SetOfCims +from ..structure_graph.trajectory import Trajectory + + +class ParametersEstimator(object): + """Has the task of computing the cims of particular node given the trajectories and the net structure + in the graph ``_net_graph``. + + :param trajectories: the trajectories + :type trajectories: Trajectory + :param net_graph: the net structure + :type net_graph: NetworkGraph + :_single_set_of_cims: the set of cims object that will hold the cims of the node + """ + + def __init__(self, trajectories: Trajectory, net_graph: NetworkGraph): + """Constructor Method + """ + self._trajectories = trajectories + self._net_graph = net_graph + self._single_set_of_cims = None + + def fast_init(self, node_id: str) -> None: + """Initializes all the necessary structures for the parameters estimation for the node ``node_id``. + + :param node_id: the node label + :type node_id: string + """ + p_vals = self._net_graph._aggregated_info_about_nodes_parents[2] + node_states_number = self._net_graph.get_states_number(node_id) + self._single_set_of_cims = SetOfCims(node_id, p_vals, node_states_number, self._net_graph.p_combs) + + def compute_parameters_for_node(self, node_id: str) -> SetOfCims: + """Compute the CIMS of the node identified by the label ``node_id``. + + :param node_id: the node label + :type node_id: string + :return: A SetOfCims object filled with the computed CIMS + :rtype: SetOfCims + """ + node_indx = self._net_graph.get_node_indx(node_id) + state_res_times = self._single_set_of_cims._state_residence_times + transition_matrices = self._single_set_of_cims._transition_matrices + ParametersEstimator.compute_state_res_time_for_node(self._trajectories.times, + self._trajectories.trajectory, + self._net_graph.time_filtering, + self._net_graph.time_scalar_indexing_strucure, + state_res_times) + ParametersEstimator.compute_state_transitions_for_a_node(node_indx, self._trajectories.complete_trajectory, + self._net_graph.transition_filtering, + self._net_graph.transition_scalar_indexing_structure, + transition_matrices) + self._single_set_of_cims.build_cims(state_res_times, transition_matrices) + return self._single_set_of_cims + + @staticmethod + def compute_state_res_time_for_node(times: np.ndarray, trajectory: np.ndarray, + cols_filter: np.ndarray, scalar_indexes_struct: np.ndarray, + T: np.ndarray) -> None: + """Compute the state residence times for a node and fill the matrix ``T`` with the results + + :param node_indx: the index of the node + :type node_indx: int + :param times: the times deltas vector + :type times: numpy.array + :param trajectory: the trajectory + :type trajectory: numpy.ndArray + :param cols_filter: the columns filtering structure + :type cols_filter: numpy.array + :param scalar_indexes_struct: the indexing structure + :type scalar_indexes_struct: numpy.array + :param T: the state residence times vectors + :type T: numpy.ndArray + """ + T[:] = np.bincount(np.sum(trajectory[:, cols_filter] * scalar_indexes_struct / scalar_indexes_struct[0], axis=1) + .astype(np.int), \ + times, + minlength=scalar_indexes_struct[-1]).reshape(-1, T.shape[1]) + + @staticmethod + def compute_state_transitions_for_a_node(node_indx: int, trajectory: np.ndarray, cols_filter: np.ndarray, + scalar_indexing: np.ndarray, M: np.ndarray) -> None: + """Compute the state residence times for a node and fill the matrices ``M`` with the results. + + :param node_indx: the index of the node + :type node_indx: int + :param trajectory: the trajectory + :type trajectory: numpy.ndArray + :param cols_filter: the columns filtering structure + :type cols_filter: numpy.array + :param scalar_indexing: the indexing structure + :type scalar_indexing: numpy.array + :param M: the state transitions matrices + :type M: numpy.ndArray + """ + diag_indices = np.array([x * M.shape[1] + x % M.shape[1] for x in range(M.shape[0] * M.shape[1])], + dtype=np.int64) + trj_tmp = trajectory[trajectory[:, int(trajectory.shape[1] / 2) + node_indx].astype(np.int) >= 0] + M[:] = np.bincount(np.sum(trj_tmp[:, cols_filter] * scalar_indexing / scalar_indexing[0], axis=1).astype(np.int) + , minlength=scalar_indexing[-1]).reshape(-1, M.shape[1], M.shape[2]) + M_raveled = M.ravel() + M_raveled[diag_indices] = 0 + M_raveled[diag_indices] = np.sum(M, axis=2).ravel() + + + + + + + + + diff --git a/build/lib/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py b/build/lib/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py new file mode 100644 index 0000000..0013d80 --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py @@ -0,0 +1,246 @@ + +import itertools +import json +import typing + +import networkx as nx +import numpy as np +from networkx.readwrite import json_graph +import os +from scipy.stats import chi2 as chi2_dist +from scipy.stats import f as f_dist +from tqdm import tqdm + +from ..utility.cache import Cache +from ..structure_graph.conditional_intensity_matrix import ConditionalIntensityMatrix +from ..structure_graph.network_graph import NetworkGraph +from .parameters_estimator import ParametersEstimator +from .structure_estimator import StructureEstimator +from ..structure_graph.sample_path import SamplePath +from ..structure_graph.structure import Structure +from ..optimizers.constraint_based_optimizer import ConstraintBasedOptimizer + +import concurrent.futures + + + +import multiprocessing +from multiprocessing import Pool + + +class StructureConstraintBasedEstimator(StructureEstimator): + """ + Has the task of estimating the network structure given the trajectories in samplepath by using a constraint-based approach. + + :param sample_path: the _sample_path object containing the trajectories and the real structure + :type sample_path: SamplePath + :param exp_test_alfa: the significance level for the exponential Hp test + :type exp_test_alfa: float + :param chi_test_alfa: the significance level for the chi Hp test + :type chi_test_alfa: float + :param known_edges: the prior known edges in the net structure if present + :type known_edges: List + :param thumb_threshold: the threshold value to consider a valid independence test + :type thumb_threshold: int + :_nodes: the nodes labels + :_nodes_vals: the nodes cardinalities + :_nodes_indxs: the nodes indexes + :_complete_graph: the complete directed graph built using the nodes labels in ``_nodes`` + :_cache: the Cache object + """ + + def __init__(self, sample_path: SamplePath, exp_test_alfa: float, chi_test_alfa: float,known_edges: typing.List= [], + thumb_threshold:int = 25): + super().__init__(sample_path,known_edges) + self._exp_test_sign = exp_test_alfa + self._chi_test_alfa = chi_test_alfa + self._thumb_threshold = thumb_threshold + self._cache = Cache() + + def complete_test(self, test_parent: str, test_child: str, parent_set: typing.List, child_states_numb: int, + tot_vars_count: int, parent_indx, child_indx) -> bool: + """Performs a complete independence test on the directed graphs G1 = {test_child U parent_set} + G2 = {G1 U test_parent} (added as an additional parent of the test_child). + Generates all the necessary structures and datas to perform the tests. + + :param test_parent: the node label of the test parent + :type test_parent: string + :param test_child: the node label of the child + :type test_child: string + :param parent_set: the common parent set + :type parent_set: List + :param child_states_numb: the cardinality of the ``test_child`` + :type child_states_numb: int + :param tot_vars_count: the total number of variables in the net + :type tot_vars_count: int + :return: True iff test_child and test_parent are independent given the sep_set parent_set. False otherwise + :rtype: bool + """ + p_set = parent_set[:] + complete_info = parent_set[:] + complete_info.append(test_child) + + parents = np.array(parent_set) + parents = np.append(parents, test_parent) + sorted_parents = self._nodes[np.isin(self._nodes, parents)] + cims_filter = sorted_parents != test_parent + + p_set.insert(0, test_parent) + sofc2 = self._cache.find(set(p_set)) + + if not sofc2: + complete_info.append(test_parent) + bool_mask2 = np.isin(self._nodes, complete_info) + l2 = list(self._nodes[bool_mask2]) + indxs2 = self._nodes_indxs[bool_mask2] + vals2 = self._nodes_vals[bool_mask2] + eds2 = list(itertools.product(p_set, test_child)) + s2 = Structure(l2, indxs2, vals2, eds2, tot_vars_count) + g2 = NetworkGraph(s2) + g2.fast_init(test_child) + p2 = ParametersEstimator(self._sample_path.trajectories, g2) + p2.fast_init(test_child) + sofc2 = p2.compute_parameters_for_node(test_child) + self._cache.put(set(p_set), sofc2) + + del p_set[0] + sofc1 = self._cache.find(set(p_set)) + if not sofc1: + g2.remove_node(test_parent) + g2.fast_init(test_child) + p2 = ParametersEstimator(self._sample_path.trajectories, g2) + p2.fast_init(test_child) + sofc1 = p2.compute_parameters_for_node(test_child) + self._cache.put(set(p_set), sofc1) + thumb_value = 0.0 + if child_states_numb > 2: + parent_val = self._sample_path.structure.get_states_number(test_parent) + bool_mask_vals = np.isin(self._nodes, parent_set) + parents_vals = self._nodes_vals[bool_mask_vals] + thumb_value = self.compute_thumb_value(parent_val, child_states_numb, parents_vals) + for cim1, p_comb in zip(sofc1.actual_cims, sofc1.p_combs): + cond_cims = sofc2.filter_cims_with_mask(cims_filter, p_comb) + for cim2 in cond_cims: + if not self.independence_test(child_states_numb, cim1, cim2, thumb_value, parent_indx, child_indx): + return False + return True + + def independence_test(self, child_states_numb: int, cim1: ConditionalIntensityMatrix, + cim2: ConditionalIntensityMatrix, thumb_value: float, parent_indx, child_indx) -> bool: + """Compute the actual independence test using two cims. + It is performed first the exponential test and if the null hypothesis is not rejected, + it is performed also the chi_test. + + :param child_states_numb: the cardinality of the test child + :type child_states_numb: int + :param cim1: a cim belonging to the graph without test parent + :type cim1: ConditionalIntensityMatrix + :param cim2: a cim belonging to the graph with test parent + :type cim2: ConditionalIntensityMatrix + :return: True iff both tests do NOT reject the null hypothesis of independence. False otherwise. + :rtype: bool + """ + M1 = cim1.state_transition_matrix + M2 = cim2.state_transition_matrix + r1s = M1.diagonal() + r2s = M2.diagonal() + C1 = cim1.cim + C2 = cim2.cim + if child_states_numb > 2 and (np.sum(np.diagonal(M1)) / thumb_value) < self._thumb_threshold: + self._removable_edges_matrix[parent_indx][child_indx] = False + return False + F_stats = C2.diagonal() / C1.diagonal() + exp_alfa = self._exp_test_sign + for val in range(0, child_states_numb): + if F_stats[val] < f_dist.ppf(exp_alfa / 2, r1s[val], r2s[val]) or \ + F_stats[val] > f_dist.ppf(1 - exp_alfa / 2, r1s[val], r2s[val]): + return False + M1_no_diag = M1[~np.eye(M1.shape[0], dtype=bool)].reshape(M1.shape[0], -1) + M2_no_diag = M2[~np.eye(M2.shape[0], dtype=bool)].reshape( + M2.shape[0], -1) + chi_2_quantile = chi2_dist.ppf(1 - self._chi_test_alfa, child_states_numb - 1) + Ks = np.sqrt(r1s / r2s) + Ls = np.sqrt(r2s / r1s) + for val in range(0, child_states_numb): + Chi = np.sum(np.power(Ks[val] * M2_no_diag[val] - Ls[val] *M1_no_diag[val], 2) / + (M1_no_diag[val] + M2_no_diag[val])) + if Chi > chi_2_quantile: + return False + return True + + def compute_thumb_value(self, parent_val, child_val, parent_set_vals): + """Compute the value to test against the thumb_threshold. + + :param parent_val: test parent's variable cardinality + :type parent_val: int + :param child_val: test child's variable cardinality + :type child_val: int + :param parent_set_vals: the cardinalities of the nodes in the current sep-set + :type parent_set_vals: List + :return: the thumb value for the current independence test + :rtype: int + """ + df = (child_val - 1) ** 2 + df = df * parent_val + for v in parent_set_vals: + df = df * v + return df + + def one_iteration_of_CTPC_algorithm(self, var_id: str, tot_vars_count: int)-> typing.List: + """Performs an iteration of the CTPC algorithm using the node ``var_id`` as ``test_child``. + + :param var_id: the node label of the test child + :type var_id: string + """ + optimizer_obj = ConstraintBasedOptimizer( + node_id = var_id, + structure_estimator = self, + tot_vars_count = tot_vars_count) + return optimizer_obj.optimize_structure() + + + def ctpc_algorithm(self,disable_multiprocessing:bool= False ): + """Compute the CTPC algorithm over the entire net. + """ + ctpc_algo = self.one_iteration_of_CTPC_algorithm + total_vars_numb = self._sample_path.total_variables_count + + n_nodes= len(self._nodes) + + total_vars_numb_array = [total_vars_numb] * n_nodes + + 'get the number of CPU' + cpu_count = multiprocessing.cpu_count() + + + + 'Remove all the edges from the structure' + self._sample_path.structure.clean_structure_edges() + + 'Estimate the best parents for each node' + #with multiprocessing.Pool(processes=cpu_count) as pool: + #with get_context("spawn").Pool(processes=cpu_count) as pool: + if disable_multiprocessing: + print("DISABILITATO") + cpu_count = 1 + list_edges_partial = [ctpc_algo(n,total_vars_numb) for n in self._nodes] + else: + with concurrent.futures.ProcessPoolExecutor(max_workers=cpu_count) as executor: + list_edges_partial = executor.map(ctpc_algo, + self._nodes, + total_vars_numb_array) + + 'Update the graph' + edges = set(itertools.chain.from_iterable(list_edges_partial)) + self._complete_graph = nx.DiGraph() + self._complete_graph.add_edges_from(edges) + + return edges + + + def estimate_structure(self,disable_multiprocessing:bool=False): + return self.ctpc_algorithm(disable_multiprocessing=disable_multiprocessing) + + + + diff --git a/build/lib/PyCTBN/PyCTBN/estimators/structure_estimator.py b/build/lib/PyCTBN/PyCTBN/estimators/structure_estimator.py new file mode 100644 index 0000000..b77e21f --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/estimators/structure_estimator.py @@ -0,0 +1,183 @@ + +import itertools +import json +import typing + +import matplotlib.pyplot as plt +import networkx as nx +import numpy as np +from networkx.readwrite import json_graph + +from abc import ABC +import os +import abc + +from ..utility.cache import Cache +from ..structure_graph.conditional_intensity_matrix import ConditionalIntensityMatrix +from ..structure_graph.network_graph import NetworkGraph +from .parameters_estimator import ParametersEstimator +from ..structure_graph.sample_path import SamplePath +from ..structure_graph.structure import Structure + + +class StructureEstimator(object): + """Has the task of estimating the network structure given the trajectories in ``samplepath``. + + :param sample_path: the _sample_path object containing the trajectories and the real structure + :type sample_path: SamplePath + :param known_edges: the prior known edges in the net structure if present + :type known_edges: List + :_nodes: the nodes labels + :_nodes_vals: the nodes cardinalities + :_nodes_indxs: the nodes indexes + :_complete_graph: the complete directed graph built using the nodes labels in ``_nodes`` + """ + + def __init__(self, sample_path: SamplePath, known_edges: typing.List = None): + self._sample_path = sample_path + self._nodes = np.array(self._sample_path.structure.nodes_labels) + self._nodes_vals = self._sample_path.structure.nodes_values + self._nodes_indxs = self._sample_path.structure.nodes_indexes + self._removable_edges_matrix = self.build_removable_edges_matrix(known_edges) + self._complete_graph = StructureEstimator.build_complete_graph(self._sample_path.structure.nodes_labels) + + + def build_removable_edges_matrix(self, known_edges: typing.List): + """Builds a boolean matrix who shows if a edge could be removed or not, based on prior knowledge given: + + :param known_edges: the list of nodes labels + :type known_edges: List + :return: a boolean matrix + :rtype: np.ndarray + """ + tot_vars_count = self._sample_path.total_variables_count + complete_adj_matrix = np.full((tot_vars_count, tot_vars_count), True) + if known_edges: + for edge in known_edges: + i = self._sample_path.structure.get_node_indx(edge[0]) + j = self._sample_path.structure.get_node_indx(edge[1]) + complete_adj_matrix[i][j] = False + return complete_adj_matrix + + @staticmethod + def build_complete_graph(node_ids: typing.List) -> nx.DiGraph: + """Builds a complete directed graph (no self loops) given the nodes labels in the list ``node_ids``: + + :param node_ids: the list of nodes labels + :type node_ids: List + :return: a complete Digraph Object + :rtype: networkx.DiGraph + """ + complete_graph = nx.DiGraph() + complete_graph.add_nodes_from(node_ids) + complete_graph.add_edges_from(itertools.permutations(node_ids, 2)) + return complete_graph + + + @staticmethod + def generate_possible_sub_sets_of_size( u: typing.List, size: int, parent_label: str): + """Creates a list containing all possible subsets of the list ``u`` of size ``size``, + that do not contains a the node identified by ``parent_label``. + + :param u: the list of nodes + :type u: List + :param size: the size of the subsets + :type size: int + :param parent_label: the node to exclude in the subsets generation + :type parent_label: string + :return: an Iterator Object containing a list of lists + :rtype: Iterator + """ + list_without_test_parent = u[:] + list_without_test_parent.remove(parent_label) + return map(list, itertools.combinations(list_without_test_parent, size)) + + def save_results(self, file_path: str) -> None: + """Save the estimated Structure to a .json file in file_path. + + :param file_path: the path including the file name with .json extension + :type file_path: string + """ + res = json_graph.node_link_data(self._complete_graph) + with open(file_path, 'w') as f: + json.dump(res, f) + + + #def remove_diagonal_elements(self, matrix): + # m = matrix.shape[0] + # strided = np.lib.stride_tricks.as_strided + # s0, s1 = matrix.strides + # return strided(matrix.ravel()[1:], shape=(m - 1, m), strides=(s0 + s1, s1)).reshape(m, -1) + + + @abc.abstractmethod + def estimate_structure(self) -> typing.List: + """Abstract method to estimate the structure + + :return: List of estimated edges + :rtype: Typing.List + """ + pass + + def adjacency_matrix(self) -> np.ndarray: + """Converts the estimated structure ``_complete_graph`` to a boolean adjacency matrix representation. + + :return: The adjacency matrix of the graph ``_complete_graph`` + :rtype: numpy.ndArray + """ + return nx.adj_matrix(self._complete_graph, self._nodes).toarray().astype(bool) + + def spurious_edges(self) -> typing.List: + """Return the spurious edges present in the estimated structure, if a prior net structure is present in + ``_sample_path.structure``. + + :return: A list containing the spurious edges + :rtype: List + """ + if not self._sample_path.has_prior_net_structure: + return [] + real_graph = nx.DiGraph() + real_graph.add_nodes_from(self._sample_path.structure.nodes_labels) + real_graph.add_edges_from(self._sample_path.structure.edges) + return nx.difference(real_graph, self._complete_graph).edges + + def save_plot_estimated_structure_graph(self, file_path: str) -> None: + """Plot the estimated structure in a graphical model style, use .png extension. + Spurious edges are colored in red if a prior structure is present. + + :param file_path: path to save the file to + :type: string + """ + graph_to_draw = nx.DiGraph() + spurious_edges = self.spurious_edges() + non_spurious_edges = list(set(self._complete_graph.edges) - set(spurious_edges)) + edges_colors = ['red' if edge in spurious_edges else 'black' for edge in self._complete_graph.edges] + graph_to_draw.add_edges_from(spurious_edges) + graph_to_draw.add_edges_from(non_spurious_edges) + pos = nx.spring_layout(graph_to_draw, k=0.5*1/np.sqrt(len(graph_to_draw.nodes())), iterations=50,scale=10) + options = { + "node_size": 2000, + "node_color": "white", + "edgecolors": "black", + 'linewidths':2, + "with_labels":True, + "font_size":13, + 'connectionstyle': 'arc3, rad = 0.1', + "arrowsize": 15, + "arrowstyle": '<|-', + "width": 1, + "edge_color":edges_colors, + } + + nx.draw(graph_to_draw, pos, **options) + ax = plt.gca() + ax.margins(0.20) + plt.axis("off") + plt.savefig(file_path) + plt.clf() + print("Estimated Structure Plot Saved At: ", os.path.abspath(file_path)) + + + + + diff --git a/build/lib/PyCTBN/PyCTBN/estimators/structure_score_based_estimator.py b/build/lib/PyCTBN/PyCTBN/estimators/structure_score_based_estimator.py new file mode 100644 index 0000000..12222f9 --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/estimators/structure_score_based_estimator.py @@ -0,0 +1,236 @@ + +import itertools +import json +import typing + +import networkx as nx +import numpy as np +from networkx.readwrite import json_graph + +from random import choice + +import concurrent.futures + +import copy + +from ..structure_graph.conditional_intensity_matrix import ConditionalIntensityMatrix +from ..structure_graph.network_graph import NetworkGraph +from .parameters_estimator import ParametersEstimator +from .structure_estimator import StructureEstimator +from ..structure_graph.sample_path import SamplePath +from ..structure_graph.structure import Structure +from .fam_score_calculator import FamScoreCalculator +from ..optimizers.hill_climbing_search import HillClimbing +from ..optimizers.tabu_search import TabuSearch + + +import multiprocessing +from multiprocessing import Pool + + + + +class StructureScoreBasedEstimator(StructureEstimator): + """ + Has the task of estimating the network structure given the trajectories in samplepath by + using a score based approach and differt kinds of optimization algorithms. + + :param sample_path: the _sample_path object containing the trajectories and the real structure + :type sample_path: SamplePath + :param tau_xu: hyperparameter over the CTBN’s q parameters, default to 0.1 + :type tau_xu: float, optional + :param alpha_xu: hyperparameter over the CTBN’s q parameters, default to 1 + :type alpha_xu: float, optional + :param known_edges: List of known edges, default to [] + :type known_edges: List, optional + + """ + + def __init__(self, sample_path: SamplePath, tau_xu:int=0.1, alpha_xu:int = 1,known_edges: typing.List= []): + super().__init__(sample_path,known_edges) + self.tau_xu=tau_xu + self.alpha_xu=alpha_xu + + + def estimate_structure(self, max_parents:int = None, iterations_number:int= 40, + patience:int = None, tabu_length:int = None, tabu_rules_duration:int = None, + optimizer: str = 'tabu',disable_multiprocessing:bool= False ): + """ + Compute the score-based algorithm to find the optimal structure + + :param max_parents: maximum number of parents for each variable. If None, disabled, default to None + :type max_parents: int, optional + :param iterations_number: maximum number of optimization algorithm's iteration, default to 40 + :type iterations_number: int, optional + :param patience: number of iteration without any improvement before to stop the search.If None, disabled, default to None + :type patience: int, optional + :param tabu_length: maximum lenght of the data structures used in the optimization process, default to None + :type tabu_length: int, optional + :param tabu_rules_duration: number of iterations in which each rule keeps its value, default to None + :type tabu_rules_duration: int, optional + :param optimizer: name of the optimizer algorithm. Possible values: 'hill' (Hill climbing),'tabu' (tabu search), defualt to 'tabu' + :type optimizer: string, optional + :param disable_multiprocessing: true if you desire to disable the multiprocessing operations, default to False + :type disable_multiprocessing: Boolean, optional + """ + 'Save the true edges structure in tuples' + true_edges = copy.deepcopy(self._sample_path.structure.edges) + true_edges = set(map(tuple, true_edges)) + + 'Remove all the edges from the structure' + self._sample_path.structure.clean_structure_edges() + + estimate_parents = self.estimate_parents + + n_nodes= len(self._nodes) + + l_max_parents= [max_parents] * n_nodes + l_iterations_number = [iterations_number] * n_nodes + l_patience = [patience] * n_nodes + l_tabu_length = [tabu_length] * n_nodes + l_tabu_rules_duration = [tabu_rules_duration] * n_nodes + l_optimizer = [optimizer] * n_nodes + + + 'get the number of CPU' + cpu_count = multiprocessing.cpu_count() + print(f"CPU COUNT: {cpu_count}") + + if disable_multiprocessing: + cpu_count = 1 + + + + + + #with get_context("spawn").Pool(processes=cpu_count) as pool: + #with multiprocessing.Pool(processes=cpu_count) as pool: + + 'Estimate the best parents for each node' + if disable_multiprocessing: + list_edges_partial = [estimate_parents(n,max_parents,iterations_number,patience,tabu_length,tabu_rules_duration,optimizer) for n in self._nodes] + else: + with concurrent.futures.ProcessPoolExecutor(max_workers=cpu_count) as executor: + list_edges_partial = executor.map(estimate_parents, + self._nodes, + l_max_parents, + l_iterations_number, + l_patience, + l_tabu_length, + l_tabu_rules_duration, + l_optimizer) + + + 'Concatenate all the edges list' + set_list_edges = set(itertools.chain.from_iterable(list_edges_partial)) + + + 'calculate precision and recall' + n_missing_edges = 0 + n_added_fake_edges = 0 + + try: + n_added_fake_edges = len(set_list_edges.difference(true_edges)) + + n_missing_edges = len(true_edges.difference(set_list_edges)) + + n_true_positive = len(true_edges) - n_missing_edges + + precision = n_true_positive / (n_true_positive + n_added_fake_edges) + + recall = n_true_positive / (n_true_positive + n_missing_edges) + + print(true_edges) + print(set_list_edges) + print(f"precision: {precision} ") + print(f"recall: {recall} ") + except Exception as e: + print(f"errore: {e}") + + + 'Update the graph' + self._complete_graph = nx.DiGraph() + self._complete_graph.add_edges_from(set_list_edges) + + return set_list_edges + + + def estimate_parents(self,node_id:str, max_parents:int = None, iterations_number:int= 40, + patience:int = 10, tabu_length:int = None, tabu_rules_duration:int=5, + optimizer:str = 'hill' ): + """ + Use the FamScore of a node in order to find the best parent nodes + + :param node_id: current node's id + :type node_id: string + :param max_parents: maximum number of parents for each variable. If None, disabled, default to None + :type max_parents: int, optional + :param iterations_number: maximum number of optimization algorithm's iteration, default to 40 + :type iterations_number: int, optional + :param patience: number of iteration without any improvement before to stop the search.If None, disabled, default to None + :type patience: int, optional + :param tabu_length: maximum lenght of the data structures used in the optimization process, default to None + :type tabu_length: int, optional + :param tabu_rules_duration: number of iterations in which each rule keeps its value, default to None + :type tabu_rules_duration: int, optional + :param optimizer: name of the optimizer algorithm. Possible values: 'hill' (Hill climbing),'tabu' (tabu search), defualt to 'tabu' + :type optimizer: string, optional + + :return: A list of the best edges for the currente node + :rtype: List + """ + + "choose the optimizer algotithm" + if optimizer == 'tabu': + optimizer = TabuSearch( + node_id = node_id, + structure_estimator = self, + max_parents = max_parents, + iterations_number = iterations_number, + patience = patience, + tabu_length = tabu_length, + tabu_rules_duration = tabu_rules_duration) + else: #if optimizer == 'hill': + optimizer = HillClimbing( + node_id = node_id, + structure_estimator = self, + max_parents = max_parents, + iterations_number = iterations_number, + patience = patience) + + "call the optmizer's function that calculates the current node's parents" + return optimizer.optimize_structure() + + + def get_score_from_graph(self, + graph: NetworkGraph, + node_id:str): + """ + Get the FamScore of a node + + :param node_id: current node's id + :type node_id: string + :param graph: current graph to be computed + :type graph: class:'NetworkGraph' + + + :return: The FamSCore for this graph structure + :rtype: float + """ + + 'inizialize the graph for a single node' + graph.fast_init(node_id) + + params_estimation = ParametersEstimator(self._sample_path.trajectories, graph) + + 'Inizialize and compute parameters for node' + params_estimation.fast_init(node_id) + SoCims = params_estimation.compute_parameters_for_node(node_id) + + 'calculate the FamScore for the node' + fam_score_obj = FamScoreCalculator() + + score = fam_score_obj.get_fam_score(SoCims.actual_cims,tau_xu = self.tau_xu,alpha_xu=self.alpha_xu) + + #print(f" lo score per {node_id} risulta: {score} ") + return score diff --git a/build/lib/PyCTBN/PyCTBN/optimizers/__init__.py b/build/lib/PyCTBN/PyCTBN/optimizers/__init__.py new file mode 100644 index 0000000..4162bf1 --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/optimizers/__init__.py @@ -0,0 +1,4 @@ +from .optimizer import Optimizer +from .tabu_search import TabuSearch +from .hill_climbing_search import HillClimbing +from .constraint_based_optimizer import ConstraintBasedOptimizer \ No newline at end of file diff --git a/build/lib/PyCTBN/PyCTBN/optimizers/constraint_based_optimizer.py b/build/lib/PyCTBN/PyCTBN/optimizers/constraint_based_optimizer.py new file mode 100644 index 0000000..9ad05fc --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/optimizers/constraint_based_optimizer.py @@ -0,0 +1,84 @@ + +import itertools +import json +import typing + +import networkx as nx +import numpy as np + +from random import choice + +from abc import ABC + +import copy + + +from .optimizer import Optimizer +from ..estimators.structure_estimator import StructureEstimator +from ..structure_graph.network_graph import NetworkGraph + + +class ConstraintBasedOptimizer(Optimizer): + """ + Optimizer class that implement a CTPC Algorithm + + :param node_id: current node's id + :type node_id: string + :param structure_estimator: a structure estimator object with the information about the net + :type structure_estimator: class:'StructureEstimator' + :param tot_vars_count: number of variables in the dataset + :type tot_vars_count: int + """ + def __init__(self, + node_id:str, + structure_estimator: StructureEstimator, + tot_vars_count:int + ): + """ + Constructor + """ + super().__init__(node_id, structure_estimator) + self.tot_vars_count = tot_vars_count + + + + def optimize_structure(self): + """ + Compute Optimization process for a structure_estimator by using a CTPC Algorithm + + :return: the estimated structure for the node + :rtype: List + """ + print("##################TESTING VAR################", self.node_id) + + graph = NetworkGraph(self.structure_estimator._sample_path.structure) + + other_nodes = [node for node in self.structure_estimator._sample_path.structure.nodes_labels if node != self.node_id] + + for possible_parent in other_nodes: + graph.add_edges([(possible_parent,self.node_id)]) + + + u = other_nodes + child_states_numb = self.structure_estimator._sample_path.structure.get_states_number(self.node_id) + b = 0 + while b < len(u): + parent_indx = 0 + while parent_indx < len(u): + removed = False + test_parent = u[parent_indx] + i = self.structure_estimator._sample_path.structure.get_node_indx(test_parent) + j = self.structure_estimator._sample_path.structure.get_node_indx(self.node_id) + if self.structure_estimator._removable_edges_matrix[i][j]: + S = StructureEstimator.generate_possible_sub_sets_of_size(u, b, test_parent) + for parents_set in S: + if self.structure_estimator.complete_test(test_parent, self.node_id, parents_set, child_states_numb, self.tot_vars_count,i,j): + graph.remove_edges([(test_parent, self.node_id)]) + u.remove(test_parent) + removed = True + break + if not removed: + parent_indx += 1 + b += 1 + self.structure_estimator._cache.clear() + return graph.edges \ No newline at end of file diff --git a/build/lib/PyCTBN/PyCTBN/optimizers/hill_climbing_search.py b/build/lib/PyCTBN/PyCTBN/optimizers/hill_climbing_search.py new file mode 100644 index 0000000..6783be0 --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/optimizers/hill_climbing_search.py @@ -0,0 +1,135 @@ + +import itertools +import json +import typing + +import networkx as nx +import numpy as np + +from random import choice + +from abc import ABC + + +from .optimizer import Optimizer +from ..estimators.structure_estimator import StructureEstimator +from ..structure_graph.network_graph import NetworkGraph + + +class HillClimbing(Optimizer): + """ + Optimizer class that implement Hill Climbing Search + + + :param node_id: current node's id + :type node_id: string + :param structure_estimator: a structure estimator object with the information about the net + :type structure_estimator: class:'StructureEstimator' + :param max_parents: maximum number of parents for each variable. If None, disabled, default to None + :type max_parents: int, optional + :param iterations_number: maximum number of optimization algorithm's iteration, default to 40 + :type iterations_number: int, optional + :param patience: number of iteration without any improvement before to stop the search.If None, disabled, default to None + :type patience: int, optional + + + + """ + def __init__(self, + node_id:str, + structure_estimator: StructureEstimator, + max_parents:int = None, + iterations_number:int= 40, + patience:int = None + ): + """ + Constructor + """ + super().__init__(node_id, structure_estimator) + self.max_parents = max_parents + self.iterations_number = iterations_number + self.patience = patience + + + + def optimize_structure(self) -> typing.List: + """ + Compute Optimization process for a structure_estimator by using a Hill Climbing Algorithm + + :return: the estimated structure for the node + :rtype: List + """ + + #'Create the graph for the single node' + graph = NetworkGraph(self.structure_estimator._sample_path.structure) + + 'get the index for the current node' + node_index = self.structure_estimator._sample_path._structure.get_node_indx(self.node_id) + + 'list of prior edges' + prior_parents = set() + + 'Add the edges from prior knowledge' + for i in range(len(self.structure_estimator._removable_edges_matrix)): + if not self.structure_estimator._removable_edges_matrix[i][node_index]: + parent_id= self.structure_estimator._sample_path._structure.get_node_id(i) + prior_parents.add(parent_id) + + 'Add the node to the starting structure' + graph.add_edges([(parent_id, self.node_id)]) + + + + 'get all the possible parents' + other_nodes = [node for node in + self.structure_estimator._sample_path.structure.nodes_labels if + node != self.node_id and + not prior_parents.__contains__(node)] + + actual_best_score = self.structure_estimator.get_score_from_graph(graph,self.node_id) + + patince_count = 0 + for i in range(self.iterations_number): + 'choose a new random edge' + current_new_parent = choice(other_nodes) + current_edge = (current_new_parent,self.node_id) + added = False + parent_removed = None + + + if graph.has_edge(current_edge): + graph.remove_edges([current_edge]) + else: + 'check the max_parents constraint' + if self.max_parents is not None: + parents_list = graph.get_parents_by_id(self.node_id) + if len(parents_list) >= self.max_parents : + parent_removed = (choice(parents_list), self.node_id) + graph.remove_edges([parent_removed]) + graph.add_edges([current_edge]) + added = True + #print('**************************') + current_score = self.structure_estimator.get_score_from_graph(graph,self.node_id) + + + if current_score > actual_best_score: + 'update current best score' + actual_best_score = current_score + patince_count = 0 + else: + 'undo the last update' + if added: + graph.remove_edges([current_edge]) + 'If a parent was removed, add it again to the graph' + if parent_removed is not None: + graph.add_edges([parent_removed]) + else: + graph.add_edges([current_edge]) + 'update patience count' + patince_count += 1 + + if self.patience is not None and patince_count > self.patience: + break + + print(f"finito variabile: {self.node_id}") + return graph.edges \ No newline at end of file diff --git a/build/lib/PyCTBN/PyCTBN/optimizers/optimizer.py b/build/lib/PyCTBN/PyCTBN/optimizers/optimizer.py new file mode 100644 index 0000000..1984f06 --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/optimizers/optimizer.py @@ -0,0 +1,39 @@ + +import itertools +import json +import typing + +import networkx as nx +import numpy as np + +import abc + +from ..estimators.structure_estimator import StructureEstimator + + + +class Optimizer(abc.ABC): + """ + Interface class for all the optimizer's child PyCTBN + + :param node_id: the node label + :type node_id: string + :param structure_estimator: A structureEstimator Object to predict the structure + :type structure_estimator: class:'StructureEstimator' + + """ + + def __init__(self, node_id:str, structure_estimator: StructureEstimator): + self.node_id = node_id + self.structure_estimator = structure_estimator + + + @abc.abstractmethod + def optimize_structure(self) -> typing.List: + """ + Compute Optimization process for a structure_estimator + + :return: the estimated structure for the node + :rtype: List + """ + pass diff --git a/build/lib/PyCTBN/PyCTBN/optimizers/tabu_search.py b/build/lib/PyCTBN/PyCTBN/optimizers/tabu_search.py new file mode 100644 index 0000000..b7b2bc9 --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/optimizers/tabu_search.py @@ -0,0 +1,188 @@ + +import itertools +import json +import typing + +import networkx as nx +import numpy as np + +from random import choice,sample + +from abc import ABC + + +from .optimizer import Optimizer +from ..estimators.structure_estimator import StructureEstimator +from ..structure_graph.network_graph import NetworkGraph + +import queue + + +class TabuSearch(Optimizer): + """ + Optimizer class that implement Tabu Search + + + :param node_id: current node's id + :type node_id: string + :param structure_estimator: a structure estimator object with the information about the net + :type structure_estimator: class:'StructureEstimator' + :param max_parents: maximum number of parents for each variable. If None, disabled, default to None + :type max_parents: int, optional + :param iterations_number: maximum number of optimization algorithm's iteration, default to 40 + :type iterations_number: int, optional + :param patience: number of iteration without any improvement before to stop the search.If None, disabled, default to None + :type patience: int, optional + :param tabu_length: maximum lenght of the data structures used in the optimization process, default to None + :type tabu_length: int, optional + :param tabu_rules_duration: number of iterations in which each rule keeps its value, default to None + :type tabu_rules_duration: int, optional + + + """ + def __init__(self, + node_id:str, + structure_estimator: StructureEstimator, + max_parents:int = None, + iterations_number:int= 40, + patience:int = None, + tabu_length:int = None, + tabu_rules_duration = None + ): + """ + Constructor + """ + super().__init__(node_id, structure_estimator) + self.max_parents = max_parents + self.iterations_number = iterations_number + self.patience = patience + self.tabu_length = tabu_length + self.tabu_rules_duration = tabu_rules_duration + + + def optimize_structure(self) -> typing.List: + """ + Compute Optimization process for a structure_estimator by using a Hill Climbing Algorithm + + :return: the estimated structure for the node + :rtype: List + """ + print(f"tabu search is processing the structure of {self.node_id}") + + 'Create the graph for the single node' + graph = NetworkGraph(self.structure_estimator._sample_path.structure) + + 'get the index for the current node' + node_index = self.structure_estimator._sample_path._structure.get_node_indx(self.node_id) + + 'list of prior edges' + prior_parents = set() + + 'Add the edges from prior knowledge' + for i in range(len(self.structure_estimator._removable_edges_matrix)): + if not self.structure_estimator._removable_edges_matrix[i][node_index]: + parent_id= self.structure_estimator._sample_path._structure.get_node_id(i) + prior_parents.add(parent_id) + + 'Add the node to the starting structure' + graph.add_edges([(parent_id, self.node_id)]) + + + + 'get all the possible parents' + other_nodes = set([node for node in + self.structure_estimator._sample_path.structure.nodes_labels if + node != self.node_id and + not prior_parents.__contains__(node)]) + + 'calculate the score for the node without parents' + actual_best_score = self.structure_estimator.get_score_from_graph(graph,self.node_id) + + + 'initialize tabu_length and tabu_rules_duration if None' + if self.tabu_length is None: + self.tabu_length = len(other_nodes) + + if self.tabu_rules_duration is None: + self.tabu_rules_duration = len(other_nodes) + + 'inizialize the data structures' + tabu_set = set() + tabu_queue = queue.Queue() + + patince_count = 0 + tabu_count = 0 + for i in range(self.iterations_number): + + current_possible_nodes = other_nodes.difference(tabu_set) + + 'choose a new random edge according to tabu restiction' + if(len(current_possible_nodes) > 0): + current_new_parent = sample(current_possible_nodes,k=1)[0] + else: + current_new_parent = tabu_queue.get() + tabu_set.remove(current_new_parent) + + + + current_edge = (current_new_parent,self.node_id) + added = False + parent_removed = None + + if graph.has_edge(current_edge): + graph.remove_edges([current_edge]) + else: + 'check the max_parents constraint' + if self.max_parents is not None: + parents_list = graph.get_parents_by_id(self.node_id) + if len(parents_list) >= self.max_parents : + parent_removed = (choice(parents_list), self.node_id) + graph.remove_edges([parent_removed]) + graph.add_edges([current_edge]) + added = True + + current_score = self.structure_estimator.get_score_from_graph(graph,self.node_id) + + if current_score > actual_best_score: + 'update current best score' + actual_best_score = current_score + patince_count = 0 + 'update tabu list' + + + else: + 'undo the last update' + if added: + graph.remove_edges([current_edge]) + 'If a parent was removed, add it again to the graph' + if parent_removed is not None: + graph.add_edges([parent_removed]) + else: + graph.add_edges([current_edge]) + 'update patience count' + patince_count += 1 + + + if tabu_queue.qsize() >= self.tabu_length: + current_removed = tabu_queue.get() + tabu_set.remove(current_removed) + 'Add the node on the tabu list' + tabu_queue.put(current_new_parent) + tabu_set.add(current_new_parent) + + tabu_count += 1 + + 'Every tabu_rules_duration step remove an item from the tabu list ' + if tabu_count % self.tabu_rules_duration == 0: + if tabu_queue.qsize() > 0: + current_removed = tabu_queue.get() + tabu_set.remove(current_removed) + tabu_count = 0 + else: + tabu_count = 0 + + if self.patience is not None and patince_count > self.patience: + break + + print(f"finito variabile: {self.node_id}") + return graph.edges \ No newline at end of file diff --git a/build/lib/PyCTBN/PyCTBN/structure_graph/__init__.py b/build/lib/PyCTBN/PyCTBN/structure_graph/__init__.py new file mode 100644 index 0000000..85f18a2 --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/structure_graph/__init__.py @@ -0,0 +1,6 @@ +from .conditional_intensity_matrix import ConditionalIntensityMatrix +from .network_graph import NetworkGraph +from .sample_path import SamplePath +from .set_of_cims import SetOfCims +from .structure import Structure +from .trajectory import Trajectory \ No newline at end of file diff --git a/build/lib/PyCTBN/PyCTBN/structure_graph/conditional_intensity_matrix.py b/build/lib/PyCTBN/PyCTBN/structure_graph/conditional_intensity_matrix.py new file mode 100644 index 0000000..4abfdd0 --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/structure_graph/conditional_intensity_matrix.py @@ -0,0 +1,42 @@ +import numpy as np + + +class ConditionalIntensityMatrix(object): + """Abstracts the Conditional Intesity matrix of a node as aggregation of the state residence times vector + and state transition matrix and the actual CIM matrix. + + :param state_residence_times: state residence times vector + :type state_residence_times: numpy.array + :param state_transition_matrix: the transitions count matrix + :type state_transition_matrix: numpy.ndArray + :_cim: the actual cim of the node + """ + def __init__(self, state_residence_times: np.array, state_transition_matrix: np.array): + """Constructor Method + """ + self._state_residence_times = state_residence_times + self._state_transition_matrix = state_transition_matrix + self._cim = self.state_transition_matrix.astype(np.float64) + + def compute_cim_coefficients(self) -> None: + """Compute the coefficients of the matrix _cim by using the following equality q_xx' = M[x, x'] / T[x]. + The class member ``_cim`` will contain the computed cim + """ + np.fill_diagonal(self._cim, self._cim.diagonal() * -1) + self._cim = ((self._cim.T + 1) / (self._state_residence_times + 1)).T + + @property + def state_residence_times(self) -> np.ndarray: + return self._state_residence_times + + @property + def state_transition_matrix(self) -> np.ndarray: + return self._state_transition_matrix + + @property + def cim(self) -> np.ndarray: + return self._cim + + def __repr__(self): + return 'CIM:\n' + str(self.cim) + diff --git a/build/lib/PyCTBN/PyCTBN/structure_graph/network_graph.py b/build/lib/PyCTBN/PyCTBN/structure_graph/network_graph.py new file mode 100644 index 0000000..6fb3639 --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/structure_graph/network_graph.py @@ -0,0 +1,293 @@ + +import typing + +import networkx as nx +import numpy as np + +from .structure import Structure + + +class NetworkGraph(object): + """Abstracts the infos contained in the Structure class in the form of a directed graph. + Has the task of creating all the necessary filtering and indexing structures for parameters estimation + + :param graph_struct: the ``Structure`` object from which infos about the net will be extracted + :type graph_struct: Structure + :_graph: directed graph + :_aggregated_info_about_nodes_parents: a structure that contains all the necessary infos + about every parents of the node of which all the indexing and filtering structures will be constructed. + :_time_scalar_indexing_structure: the indexing structure for state res time estimation + :_transition_scalar_indexing_structure: the indexing structure for transition computation + :_time_filtering: the columns filtering structure used in the computation of the state res times + :_transition_filtering: the columns filtering structure used in the computation of the transition + from one state to another + :_p_combs_structure: all the possible parents states combination for the node of interest + """ + + def __init__(self, graph_struct: Structure): + """Constructor Method + """ + self._graph_struct = graph_struct + self._graph = nx.DiGraph() + self._aggregated_info_about_nodes_parents = None + self._time_scalar_indexing_structure = None + self._transition_scalar_indexing_structure = None + self._time_filtering = None + self._transition_filtering = None + self._p_combs_structure = None + + #def init_graph(self): + # self.add_nodes(self._nodes_labels) + # self.add_edges(self.graph_struct.edges) + # self.aggregated_info_about_nodes_parents = self.get_ord_set_of_par_of_all_nodes() + # self._fancy_indexing = self.build_fancy_indexing_structure(0) + # self.build_scalar_indexing_structures() + # self.build_time_columns_filtering_structure() + # self.build_transition_columns_filtering_structure() + # self._p_combs_structure = self.build_p_combs_structure() + + def fast_init(self, node_id: str) -> None: + """Initializes all the necessary structures for parameters estimation of the node identified by the label + node_id + + :param node_id: the label of the node + :type node_id: string + """ + self.add_nodes(self._graph_struct.nodes_labels) + self.add_edges(self._graph_struct.edges) + self._aggregated_info_about_nodes_parents = self.get_ordered_by_indx_set_of_parents(node_id) + p_indxs = self._aggregated_info_about_nodes_parents[1] + p_vals = self._aggregated_info_about_nodes_parents[2] + node_states = self.get_states_number(node_id) + node_indx = self.get_node_indx(node_id) + cols_number = self._graph_struct.total_variables_number + self._time_scalar_indexing_structure = NetworkGraph.\ + build_time_scalar_indexing_structure_for_a_node(node_states, p_vals) + self._transition_scalar_indexing_structure = NetworkGraph.\ + build_transition_scalar_indexing_structure_for_a_node(node_states, p_vals) + self._time_filtering = NetworkGraph.build_time_columns_filtering_for_a_node(node_indx, p_indxs) + self._transition_filtering = NetworkGraph.build_transition_filtering_for_a_node(node_indx, p_indxs, cols_number) + self._p_combs_structure = NetworkGraph.build_p_comb_structure_for_a_node(p_vals) + + def add_nodes(self, list_of_nodes: typing.List) -> None: + """Adds the nodes to the ``_graph`` contained in the list of nodes ``list_of_nodes``. + Sets all the properties that identify a nodes (index, positional index, cardinality) + + :param list_of_nodes: the nodes to add to ``_graph`` + :type list_of_nodes: List + """ + nodes_indxs = self._graph_struct.nodes_indexes + nodes_vals = self._graph_struct.nodes_values + pos = 0 + for id, node_indx, node_val in zip(list_of_nodes, nodes_indxs, nodes_vals): + self._graph.add_node(id, indx=node_indx, val=node_val, pos_indx=pos) + pos += 1 + + def has_edge(self,edge:tuple)-> bool: + """ + Check if the graph contains a specific edge + + Parameters: + edge: a tuple that rappresents the edge + Returns: + bool + """ + return self._graph.has_edge(edge[0],edge[1]) + + def add_edges(self, list_of_edges: typing.List) -> None: + """Add the edges to the ``_graph`` contained in the list ``list_of_edges``. + + :param list_of_edges: the list containing of tuples containing the edges + :type list_of_edges: List + """ + self._graph.add_edges_from(list_of_edges) + + def remove_node(self, node_id: str) -> None: + """Remove the node ``node_id`` from all the class members. + Initialize all the filtering/indexing structures. + """ + self._graph.remove_node(node_id) + self._graph_struct.remove_node(node_id) + self.clear_indexing_filtering_structures() + + def clear_indexing_filtering_structures(self) -> None: + """Initialize all the filtering/indexing structures. + """ + self._aggregated_info_about_nodes_parents = None + self._time_scalar_indexing_structure = None + self._transition_scalar_indexing_structure = None + self._time_filtering = None + self._transition_filtering = None + self._p_combs_structure = None + + def get_ordered_by_indx_set_of_parents(self, node: str) -> typing.Tuple: + """Builds the aggregated structure that holds all the infos relative to the parent set of the node, namely + (parents_labels, parents_indexes, parents_cardinalities). + + :param node: the label of the node + :type node: string + :return: a tuple containing all the parent set infos + :rtype: Tuple + """ + parents = self.get_parents_by_id(node) + nodes = self._graph_struct.nodes_labels + d = {v: i for i, v in enumerate(nodes)} + sorted_parents = sorted(parents, key=lambda v: d[v]) + get_node_indx = self.get_node_indx + p_indxes = [get_node_indx(node) for node in sorted_parents] + p_values = [self.get_states_number(node) for node in sorted_parents] + return sorted_parents, p_indxes, p_values + + def remove_edges(self, list_of_edges: typing.List) -> None: + """Remove the edges to the graph contained in the list list_of_edges. + + :param list_of_edges: The edges to remove from the graph + :type list_of_edges: List + """ + self._graph.remove_edges_from(list_of_edges) + + @staticmethod + def build_time_scalar_indexing_structure_for_a_node(node_states: int, + parents_vals: typing.List) -> np.ndarray: + """Builds an indexing structure for the computation of state residence times values. + + :param node_states: the node cardinality + :type node_states: int + :param parents_vals: the caridinalites of the node's parents + :type parents_vals: List + :return: The time indexing structure + :rtype: numpy.ndArray + """ + T_vector = np.array([node_states]) + T_vector = np.append(T_vector, parents_vals) + T_vector = T_vector.cumprod().astype(np.int) + return T_vector + + @staticmethod + def build_transition_scalar_indexing_structure_for_a_node(node_states_number: int, parents_vals: typing.List) \ + -> np.ndarray: + """Builds an indexing structure for the computation of state transitions values. + + :param node_states_number: the node cardinality + :type node_states_number: int + :param parents_vals: the caridinalites of the node's parents + :type parents_vals: List + :return: The transition indexing structure + :rtype: numpy.ndArray + """ + M_vector = np.array([node_states_number, + node_states_number]) + M_vector = np.append(M_vector, parents_vals) + M_vector = M_vector.cumprod().astype(np.int) + return M_vector + + @staticmethod + def build_time_columns_filtering_for_a_node(node_indx: int, p_indxs: typing.List) -> np.ndarray: + """ + Builds the necessary structure to filter the desired columns indicated by ``node_indx`` and ``p_indxs`` + in the dataset. + This structute will be used in the computation of the state res times. + :param node_indx: the index of the node + :type node_indx: int + :param p_indxs: the indexes of the node's parents + :type p_indxs: List + :return: The filtering structure for times estimation + :rtype: numpy.ndArray + """ + return np.append(np.array([node_indx], dtype=np.int), p_indxs).astype(np.int) + + @staticmethod + def build_transition_filtering_for_a_node(node_indx: int, p_indxs: typing.List, nodes_number: int) \ + -> np.ndarray: + """Builds the necessary structure to filter the desired columns indicated by ``node_indx`` and ``p_indxs`` + in the dataset. + This structure will be used in the computation of the state transitions values. + :param node_indx: the index of the node + :type node_indx: int + :param p_indxs: the indexes of the node's parents + :type p_indxs: List + :param nodes_number: the total number of nodes in the dataset + :type nodes_number: int + :return: The filtering structure for transitions estimation + :rtype: numpy.ndArray + """ + return np.array([node_indx + nodes_number, node_indx, *p_indxs], dtype=np.int) + + @staticmethod + def build_p_comb_structure_for_a_node(parents_values: typing.List) -> np.ndarray: + """ + Builds the combinatorial structure that contains the combinations of all the values contained in + ``parents_values``. + + :param parents_values: the cardinalities of the nodes + :type parents_values: List + :return: A numpy matrix containing a grid of the combinations + :rtype: numpy.ndArray + """ + tmp = [] + for val in parents_values: + tmp.append([x for x in range(val)]) + if len(parents_values) > 0: + parents_comb = np.array(np.meshgrid(*tmp)).T.reshape(-1, len(parents_values)) + if len(parents_values) > 1: + tmp_comb = parents_comb[:, 1].copy() + parents_comb[:, 1] = parents_comb[:, 0].copy() + parents_comb[:, 0] = tmp_comb + else: + parents_comb = np.array([[]], dtype=np.int) + return parents_comb + + def get_parents_by_id(self, node_id) -> typing.List: + """Returns a list of labels of the parents of the node ``node_id`` + + :param node_id: the node label + :type node_id: string + :return: a List of labels of the parents + :rtype: List + """ + return list(self._graph.predecessors(node_id)) + + def get_states_number(self, node_id) -> int: + return self._graph.nodes[node_id]['val'] + + def get_node_indx(self, node_id) -> int: + return nx.get_node_attributes(self._graph, 'indx')[node_id] + + def get_positional_node_indx(self, node_id) -> int: + return self._graph.nodes[node_id]['pos_indx'] + + @property + def nodes(self) -> typing.List: + return self._graph_struct.nodes_labels + + @property + def edges(self) -> typing.List: + return list(self._graph.edges) + + @property + def nodes_indexes(self) -> np.ndarray: + return self._graph_struct.nodes_indexes + + @property + def nodes_values(self) -> np.ndarray: + return self._graph_struct.nodes_values + + @property + def time_scalar_indexing_strucure(self) -> np.ndarray: + return self._time_scalar_indexing_structure + + @property + def time_filtering(self) -> np.ndarray: + return self._time_filtering + + @property + def transition_scalar_indexing_structure(self) -> np.ndarray: + return self._transition_scalar_indexing_structure + + @property + def transition_filtering(self) -> np.ndarray: + return self._transition_filtering + + @property + def p_combs(self) -> np.ndarray: + return self._p_combs_structure diff --git a/build/lib/PyCTBN/PyCTBN/structure_graph/sample_path.py b/build/lib/PyCTBN/PyCTBN/structure_graph/sample_path.py new file mode 100644 index 0000000..88e9649 --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/structure_graph/sample_path.py @@ -0,0 +1,93 @@ + + +import numpy as np +import pandas as pd + +from .structure import Structure +from .trajectory import Trajectory +from ..utility.abstract_importer import AbstractImporter + + +MESSAGE_HAS_TO_CONTAIN_EXCEPTION = 'The importer object has to contain the all processed data!' + + +class SamplePath(object): + """Aggregates all the informations about the trajectories, the real structure of the sampled net and variables + cardinalites. Has the task of creating the objects ``Trajectory`` and ``Structure`` that will + contain the mentioned data. + + :param importer: the Importer object which contains the imported and processed data + :type importer: AbstractImporter + :_trajectories: the ``Trajectory`` object that will contain all the concatenated trajectories + :_structure: the ``Structure`` Object that will contain all the structural infos about the net + :_total_variables_count: the number of variables in the net + """ + def __init__(self, importer: AbstractImporter): + """Constructor Method + """ + self._importer = importer + if self._importer._df_variables is None or self._importer._concatenated_samples is None: + raise RuntimeError() + if self._importer._df_variables.empty: + raise RuntimeError(MESSAGE_HAS_TO_CONTAIN_EXCEPTION) + if isinstance(self._importer._concatenated_samples, pd.DataFrame) and\ + self._importer._concatenated_samples.empty: + raise RuntimeError(MESSAGE_HAS_TO_CONTAIN_EXCEPTION) + if isinstance(self._importer._concatenated_samples, np.ndarray) and\ + self._importer._concatenated_samples.size == 0: + raise RuntimeError(MESSAGE_HAS_TO_CONTAIN_EXCEPTION) + self._trajectories = None + self._structure = None + self._total_variables_count = None + + def build_trajectories(self) -> None: + """Builds the Trajectory object that will contain all the trajectories. + Clears all the unused dataframes in ``_importer`` Object + """ + self._trajectories = \ + Trajectory(self._importer.build_list_of_samples_array(self._importer.concatenated_samples), + len(self._importer.sorter) + 1) + self._importer.clear_concatenated_frame() + + def build_structure(self) -> None: + """ + Builds the ``Structure`` object that aggregates all the infos about the net. + """ + if self._importer.sorter != self._importer.variables.iloc[:, 0].to_list(): + raise RuntimeError("The Dataset columns order have to match the order of labels in the variables Frame!") + + self._total_variables_count = len(self._importer.sorter) + labels = self._importer.variables.iloc[:, 0].to_list() + indxs = self._importer.variables.index.to_numpy() + vals = self._importer.variables.iloc[:, 1].to_numpy() + if self._importer.structure is None or self._importer.structure.empty: + edges = [] + else: + edges = list(self._importer.structure.to_records(index=False)) + self._structure = Structure(labels, indxs, vals, edges, + self._total_variables_count) + + def clear_memory(self): + self._importer._raw_data = [] + + @property + def trajectories(self) -> Trajectory: + return self._trajectories + + @property + def structure(self) -> Structure: + return self._structure + + @property + def total_variables_count(self) -> int: + return self._total_variables_count + + @property + def has_prior_net_structure(self) -> bool: + return bool(self._structure.edges) + + + + + + diff --git a/build/lib/PyCTBN/PyCTBN/structure_graph/set_of_cims.py b/build/lib/PyCTBN/PyCTBN/structure_graph/set_of_cims.py new file mode 100644 index 0000000..81caff5 --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/structure_graph/set_of_cims.py @@ -0,0 +1,97 @@ + + +import typing + +import numpy as np + +from .conditional_intensity_matrix import ConditionalIntensityMatrix + + +class SetOfCims(object): + """Aggregates all the CIMS of the node identified by the label _node_id. + + :param node_id: the node label + :type node_ind: string + :param parents_states_number: the cardinalities of the parents + :type parents_states_number: List + :param node_states_number: the caridinality of the node + :type node_states_number: int + :param p_combs: the p_comb structure bound to this node + :type p_combs: numpy.ndArray + :_state_residence_time: matrix containing all the state residence time vectors for the node + :_transition_matrices: matrix containing all the transition matrices for the node + :_actual_cims: the cims of the node + """ + + def __init__(self, node_id: str, parents_states_number: typing.List, node_states_number: int, p_combs: np.ndarray): + """Constructor Method + """ + self._node_id = node_id + self._parents_states_number = parents_states_number + self._node_states_number = node_states_number + self._actual_cims = [] + self._state_residence_times = None + self._transition_matrices = None + self._p_combs = p_combs + self.build_times_and_transitions_structures() + + def build_times_and_transitions_structures(self) -> None: + """Initializes at the correct dimensions the state residence times matrix and the state transition matrices. + """ + if not self._parents_states_number: + self._state_residence_times = np.zeros((1, self._node_states_number), dtype=np.float) + self._transition_matrices = np.zeros((1, self._node_states_number, self._node_states_number), dtype=np.int) + else: + self._state_residence_times = \ + np.zeros((np.prod(self._parents_states_number), self._node_states_number), dtype=np.float) + self._transition_matrices = np.zeros([np.prod(self._parents_states_number), self._node_states_number, + self._node_states_number], dtype=np.int) + + def build_cims(self, state_res_times: np.ndarray, transition_matrices: np.ndarray) -> None: + """Build the ``ConditionalIntensityMatrix`` objects given the state residence times and transitions matrices. + Compute the cim coefficients.The class member ``_actual_cims`` will contain the computed cims. + + :param state_res_times: the state residence times matrix + :type state_res_times: numpy.ndArray + :param transition_matrices: the transition matrices + :type transition_matrices: numpy.ndArray + """ + for state_res_time_vector, transition_matrix in zip(state_res_times, transition_matrices): + cim_to_add = ConditionalIntensityMatrix(state_res_time_vector, transition_matrix) + cim_to_add.compute_cim_coefficients() + self._actual_cims.append(cim_to_add) + self._actual_cims = np.array(self._actual_cims) + self._transition_matrices = None + self._state_residence_times = None + + def filter_cims_with_mask(self, mask_arr: np.ndarray, comb: typing.List) -> np.ndarray: + """Filter the cims contained in the array ``_actual_cims`` given the boolean mask ``mask_arr`` and the index + ``comb``. + + :param mask_arr: the boolean mask that indicates which parent to consider + :type mask_arr: numpy.array + :param comb: the state/s of the filtered parents + :type comb: numpy.array + :return: Array of ``ConditionalIntensityMatrix`` objects + :rtype: numpy.array + """ + if mask_arr.size <= 1: + return self._actual_cims + else: + flat_indxs = np.argwhere(np.all(self._p_combs[:, mask_arr] == comb, axis=1)).ravel() + return self._actual_cims[flat_indxs] + + @property + def actual_cims(self) -> np.ndarray: + return self._actual_cims + + @property + def p_combs(self) -> np.ndarray: + return self._p_combs + + def get_cims_number(self): + return len(self._actual_cims) + + + + diff --git a/build/lib/PyCTBN/PyCTBN/structure_graph/structure.py b/build/lib/PyCTBN/PyCTBN/structure_graph/structure.py new file mode 100644 index 0000000..f79c875 --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/structure_graph/structure.py @@ -0,0 +1,124 @@ + +import typing as ty + +import numpy as np + + +class Structure(object): + """Contains all the infos about the network structure(nodes labels, nodes caridinalites, edges, indexes) + + :param nodes_labels_list: the symbolic names of the variables + :type nodes_labels_list: List + :param nodes_indexes_arr: the indexes of the nodes + :type nodes_indexes_arr: numpy.ndArray + :param nodes_vals_arr: the cardinalites of the nodes + :type nodes_vals_arr: numpy.ndArray + :param edges_list: the edges of the network + :type edges_list: List + :param total_variables_number: the total number of variables in the dataset + :type total_variables_number: int + """ + + def __init__(self, nodes_labels_list: ty.List, nodes_indexes_arr: np.ndarray, nodes_vals_arr: np.ndarray, + edges_list: ty.List, total_variables_number: int): + """Constructor Method + """ + self._nodes_labels_list = nodes_labels_list + self._nodes_indexes_arr = nodes_indexes_arr + self._nodes_vals_arr = nodes_vals_arr + self._edges_list = edges_list + self._total_variables_number = total_variables_number + + def remove_node(self, node_id: str) -> None: + """Remove the node ``node_id`` from all the class members. + The class member ``_total_variables_number`` since it refers to the total number of variables in the dataset. + """ + node_positional_indx = self._nodes_labels_list.index(node_id) + del self._nodes_labels_list[node_positional_indx] + self._nodes_indexes_arr = np.delete(self._nodes_indexes_arr, node_positional_indx) + self._nodes_vals_arr = np.delete(self._nodes_vals_arr, node_positional_indx) + self._edges_list = [(from_node, to_node) for (from_node, to_node) in self._edges_list if (from_node != node_id + and to_node != node_id)] + + @property + def edges(self) -> ty.List: + return self._edges_list + + @property + def nodes_labels(self) -> ty.List: + return self._nodes_labels_list + + @property + def nodes_indexes(self) -> np.ndarray: + return self._nodes_indexes_arr + + @property + def nodes_values(self) -> np.ndarray: + return self._nodes_vals_arr + + @property + def total_variables_number(self) -> int: + return self._total_variables_number + + def get_node_id(self, node_indx: int) -> str: + """Given the ``node_index`` returns the node label. + + :param node_indx: the node index + :type node_indx: int + :return: the node label + :rtype: string + """ + return self._nodes_labels_list[node_indx] + + def clean_structure_edges(self): + self._edges_list = list() + + def add_edge(self,edge: tuple): + self._edges_list.append(edge) + + + def remove_edge(self,edge: tuple): + self._edges_list.remove(edge) + + def contains_edge(self,edge:tuple) -> bool: + return edge in self._edges_list + + def get_node_indx(self, node_id: str) -> int: + """Given the ``node_index`` returns the node label. + + :param node_id: the node label + :type node_id: string + :return: the node index + :rtype: int + """ + pos_indx = self._nodes_labels_list.index(node_id) + return self._nodes_indexes_arr[pos_indx] + + def get_positional_node_indx(self, node_id: str) -> int: + return self._nodes_labels_list.index(node_id) + + def get_states_number(self, node: str) -> int: + """Given the node label ``node`` returns the cardinality of the node. + + :param node: the node label + :type node: string + :return: the node cardinality + :rtype: int + """ + pos_indx = self._nodes_labels_list.index(node) + return self._nodes_vals_arr[pos_indx] + + def __repr__(self): + return "Variables:\n" + str(self._nodes_labels_list) +"\nValues:\n"+ str(self._nodes_vals_arr) +\ + "\nEdges: \n" + str(self._edges_list) + + def __eq__(self, other): + """Overrides the default implementation""" + if isinstance(other, Structure): + return set(self._nodes_labels_list) == set(other._nodes_labels_list) and \ + np.array_equal(self._nodes_vals_arr, other._nodes_vals_arr) and \ + np.array_equal(self._nodes_indexes_arr, other._nodes_indexes_arr) and \ + self._edges_list == other._edges_list + + return False + diff --git a/build/lib/PyCTBN/PyCTBN/structure_graph/trajectory.py b/build/lib/PyCTBN/PyCTBN/structure_graph/trajectory.py new file mode 100644 index 0000000..36899b3 --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/structure_graph/trajectory.py @@ -0,0 +1,45 @@ + +import typing + +import numpy as np + + +class Trajectory(object): + """ Abstracts the infos about a complete set of trajectories, represented as a numpy array of doubles + (the time deltas) and a numpy matrix of ints (the changes of states). + + :param list_of_columns: the list containing the times array and values matrix + :type list_of_columns: List + :param original_cols_number: total number of cols in the data + :type original_cols_number: int + :_actual_trajectory: the trajectory containing also the duplicated/shifted values + :_times: the array containing the time deltas + """ + + def __init__(self, list_of_columns: typing.List, original_cols_number: int): + """Constructor Method + """ + self._times = list_of_columns[0] + self._actual_trajectory = list_of_columns[1] + self._original_cols_number = original_cols_number + + @property + def trajectory(self) -> np.ndarray: + return self._actual_trajectory[:, :self._original_cols_number - 1] + + @property + def complete_trajectory(self) -> np.ndarray: + return self._actual_trajectory + + @property + def times(self): + return self._times + + def size(self): + return self._actual_trajectory.shape[0] + + def __repr__(self): + return "Complete Trajectory Rows: " + str(self.size()) + "\n" + self.complete_trajectory.__repr__() + \ + "\nTimes Rows:" + str(self.times.size) + "\n" + self.times.__repr__() + + diff --git a/build/lib/PyCTBN/PyCTBN/utility/__init__.py b/build/lib/PyCTBN/PyCTBN/utility/__init__.py new file mode 100644 index 0000000..f79749c --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/utility/__init__.py @@ -0,0 +1,4 @@ +from .abstract_importer import AbstractImporter +from .cache import Cache +from .json_importer import JsonImporter +from .sample_importer import SampleImporter \ No newline at end of file diff --git a/build/lib/PyCTBN/PyCTBN/utility/abstract_importer.py b/build/lib/PyCTBN/PyCTBN/utility/abstract_importer.py new file mode 100644 index 0000000..8984b4d --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/utility/abstract_importer.py @@ -0,0 +1,163 @@ + +import typing +from abc import ABC, abstractmethod + +import numpy as np +import pandas as pd + +import copy + + + +class AbstractImporter(ABC): + """Abstract class that exposes all the necessary methods to process the trajectories and the net structure. + + :param file_path: the file path, or dataset name if you import already processed data + :type file_path: str + :param trajectory_list: Dataframe or numpy array containing the concatenation of all the processed trajectories + :type trajectory_list: typing.Union[pandas.DataFrame, numpy.ndarray] + :param variables: Dataframe containing the nodes labels and cardinalities + :type variables: pandas.DataFrame + :prior_net_structure: Dataframe containing the structure of the network (edges) + :type prior_net_structure: pandas.DataFrame + :_sorter: A list containing the variables labels in the SAME order as the columns in ``concatenated_samples`` + + .. warning:: + The parameters ``variables`` and ``prior_net_structure`` HAVE to be properly constructed + as Pandas Dataframes with the following structure: + Header of _df_structure = [From_Node | To_Node] + Header of _df_variables = [Variable_Label | Variable_Cardinality] + See the tutorial on how to construct a correct ``concatenated_samples`` Dataframe/ndarray. + + .. note:: + See :class:``JsonImporter`` for an example implementation + + """ + + def __init__(self, file_path: str = None, trajectory_list: typing.Union[pd.DataFrame, np.ndarray] = None, + variables: pd.DataFrame = None, prior_net_structure: pd.DataFrame = None): + """Constructor + """ + self._file_path = file_path + self._df_samples_list = trajectory_list + self._concatenated_samples = [] + self._df_variables = variables + self._df_structure = prior_net_structure + self._sorter = None + super().__init__() + + @abstractmethod + def build_sorter(self, trajecory_header: object) -> typing.List: + """Initializes the ``_sorter`` class member from a trajectory dataframe, exctracting the header of the frame + and keeping ONLY the variables symbolic labels, cutting out the time label in the header. + + :param trajecory_header: an object that will be used to define the header + :type trajecory_header: object + :return: A list containing the processed header. + :rtype: List + """ + pass + + def compute_row_delta_sigle_samples_frame(self, sample_frame: pd.DataFrame, + columns_header: typing.List, shifted_cols_header: typing.List) \ + -> pd.DataFrame: + """Computes the difference between each value present in th time column. + Copies and shift by one position up all the values present in the remaining columns. + + :param sample_frame: the traj to be processed + :type sample_frame: pandas.Dataframe + :param columns_header: the original header of sample_frame + :type columns_header: List + :param shifted_cols_header: a copy of columns_header with changed names of the contents + :type shifted_cols_header: List + :return: The processed dataframe + :rtype: pandas.Dataframe + + .. warning:: + the Dataframe ``sample_frame`` has to follow the column structure of this header: + Header of sample_frame = [Time | Variable values] + """ + sample_frame = copy.deepcopy(sample_frame) + sample_frame.iloc[:, 0] = sample_frame.iloc[:, 0].diff().shift(-1) + shifted_cols = sample_frame[columns_header].shift(-1).fillna(0).astype('int32') + shifted_cols.columns = shifted_cols_header + sample_frame = sample_frame.assign(**shifted_cols) + sample_frame.drop(sample_frame.tail(1).index, inplace=True) + return sample_frame + + def compute_row_delta_in_all_samples_frames(self, df_samples_list: typing.List) -> None: + """Calls the method ``compute_row_delta_sigle_samples_frame`` on every dataframe present in the list + ``df_samples_list``. + Concatenates the result in the dataframe ``concatanated_samples`` + + :param df_samples_list: the datframe's list to be processed and concatenated + :type df_samples_list: List + + .. warning:: + The Dataframe sample_frame has to follow the column structure of this header: + Header of sample_frame = [Time | Variable values] + The class member self._sorter HAS to be properly INITIALIZED (See class members definition doc) + .. note:: + After the call of this method the class member ``concatanated_samples`` will contain all processed + and merged trajectories + """ + if not self._sorter: + raise RuntimeError("The class member self._sorter has to be INITIALIZED!") + shifted_cols_header = [s + "S" for s in self._sorter] + compute_row_delta = self.compute_row_delta_sigle_samples_frame + proc_samples_list = [compute_row_delta(sample, self._sorter, shifted_cols_header) + for sample in df_samples_list] + self._concatenated_samples = pd.concat(proc_samples_list) + + complete_header = self._sorter[:] + complete_header.insert(0,'Time') + complete_header.extend(shifted_cols_header) + self._concatenated_samples = self._concatenated_samples[complete_header] + + def build_list_of_samples_array(self, concatenated_sample: pd.DataFrame) -> typing.List: + """Builds a List containing the the delta times numpy array, and the complete transitions matrix + + :param concatenated_sample: the dataframe/array from which the time, and transitions matrix have to be extracted + and converted + :type concatenated_sample: pandas.Dataframe + :return: the resulting list of numpy arrays + :rtype: List + """ + + concatenated_array = concatenated_sample.to_numpy() + columns_list = [concatenated_array[:, 0], concatenated_array[:, 1:].astype(int)] + + return columns_list + + def clear_concatenated_frame(self) -> None: + """Removes all values in the dataframe concatenated_samples. + """ + if isinstance(self._concatenated_samples, pd.DataFrame): + self._concatenated_samples = self._concatenated_samples.iloc[0:0] + + @abstractmethod + def dataset_id(self) -> object: + """If the original dataset contains multiple dataset, this method returns a unique id to identify the current + dataset + """ + pass + + @property + def concatenated_samples(self) -> pd.DataFrame: + return self._concatenated_samples + + @property + def variables(self) -> pd.DataFrame: + return self._df_variables + + @property + def structure(self) -> pd.DataFrame: + return self._df_structure + + @property + def sorter(self) -> typing.List: + return self._sorter + + @property + def file_path(self) -> str: + return self._file_path diff --git a/build/lib/PyCTBN/PyCTBN/utility/cache.py b/build/lib/PyCTBN/PyCTBN/utility/cache.py new file mode 100644 index 0000000..5191af3 --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/utility/cache.py @@ -0,0 +1,54 @@ + +import typing + +from ..structure_graph.set_of_cims import SetOfCims + + +class Cache: + """This class acts as a cache of ``SetOfCims`` objects for a node. + + :__list_of_sets_of_parents: a list of ``Sets`` objects of the parents to which the cim in cache at SAME + index is related + :__actual_cache: a list of setOfCims objects + """ + + def __init__(self): + """Constructor Method + """ + self._list_of_sets_of_parents = [] + self._actual_cache = [] + + def find(self, parents_comb: typing.Set): #typing.Union[typing.Set, str] + """ + Tries to find in cache given the symbolic parents combination ``parents_comb`` the ``SetOfCims`` + related to that ``parents_comb``. + + :param parents_comb: the parents related to that ``SetOfCims`` + :type parents_comb: Set + :return: A ``SetOfCims`` object if the ``parents_comb`` index is found in ``__list_of_sets_of_parents``. + None otherwise. + :rtype: SetOfCims + """ + try: + result = self._actual_cache[self._list_of_sets_of_parents.index(parents_comb)] + return result + except ValueError: + return None + + def put(self, parents_comb: typing.Set, socim: SetOfCims): + """Place in cache the ``SetOfCims`` object, and the related symbolic index ``parents_comb`` in + ``__list_of_sets_of_parents``. + + :param parents_comb: the symbolic set index + :type parents_comb: Set + :param socim: the related SetOfCims object + :type socim: SetOfCims + """ + self._list_of_sets_of_parents.append(parents_comb) + self._actual_cache.append(socim) + + def clear(self): + """Clear the contents both of ``__actual_cache`` and ``__list_of_sets_of_parents``. + """ + del self._list_of_sets_of_parents[:] + del self._actual_cache[:] \ No newline at end of file diff --git a/build/lib/PyCTBN/PyCTBN/utility/json_importer.py b/build/lib/PyCTBN/PyCTBN/utility/json_importer.py new file mode 100644 index 0000000..2cadff4 --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/utility/json_importer.py @@ -0,0 +1,181 @@ +import json +import typing + +import pandas as pd + + +from .abstract_importer import AbstractImporter + + +class JsonImporter(AbstractImporter): + """Implements the abstracts methods of AbstractImporter and adds all the necessary methods to process and prepare + the data in json extension. + + :param file_path: the path of the file that contains tha data to be imported + :type file_path: string + :param samples_label: the reference key for the samples in the trajectories + :type samples_label: string + :param structure_label: the reference key for the structure of the network data + :type structure_label: string + :param variables_label: the reference key for the cardinalites of the nodes data + :type variables_label: string + :param time_key: the key used to identify the timestamps in each trajectory + :type time_key: string + :param variables_key: the key used to identify the names of the variables in the net + :type variables_key: string + :_array_indx: the index of the outer JsonArray to extract the data from + :type _array_indx: int + :_df_samples_list: a Dataframe list in which every dataframe contains a trajectory + :_raw_data: The raw contents of the json file to import + :type _raw_data: List + """ + + def __init__(self, file_path: str, samples_label: str, structure_label: str, variables_label: str, time_key: str, + variables_key: str): + """Constructor method + + .. note:: + This constructor calls also the method ``read_json_file()``, so after the construction of the object + the class member ``_raw_data`` will contain the raw imported json data. + + """ + self._samples_label = samples_label + self._structure_label = structure_label + self._variables_label = variables_label + self._time_key = time_key + self._variables_key = variables_key + self._df_samples_list = None + self._array_indx = None + super(JsonImporter, self).__init__(file_path) + self._raw_data = self.read_json_file() + + def import_data(self, indx: int = 0) -> None: + """Implements the abstract method of :class:`AbstractImporter`. + + :param indx: the index of the outer JsonArray to extract the data from, default to 0 + :type indx: int + """ + self._array_indx = indx + self._df_samples_list = self.import_trajectories(self._raw_data) + self._sorter = self.build_sorter(self._df_samples_list[0]) + self.compute_row_delta_in_all_samples_frames(self._df_samples_list) + self.clear_data_frame_list() + self._df_structure = self.import_structure(self._raw_data) + self._df_variables = self.import_variables(self._raw_data) + + def import_trajectories(self, raw_data: typing.List) -> typing.List: + """Imports the trajectories from the list of dicts ``raw_data``. + + :param raw_data: List of Dicts + :type raw_data: List + :return: List of dataframes containing all the trajectories + :rtype: List + """ + return self.normalize_trajectories(raw_data, self._array_indx, self._samples_label) + + def import_structure(self, raw_data: typing.List) -> pd.DataFrame: + """Imports in a dataframe the data in the list raw_data at the key ``_structure_label`` + + :param raw_data: List of Dicts + :type raw_data: List + :return: Dataframe containg the starting node a ending node of every arc of the network + :rtype: pandas.Dataframe + """ + return self.one_level_normalizing(raw_data, self._array_indx, self._structure_label) + + def import_variables(self, raw_data: typing.List) -> pd.DataFrame: + """Imports the data in ``raw_data`` at the key ``_variables_label``. + + :param raw_data: List of Dicts + :type raw_data: List + :return: Datframe containg the variables simbolic labels and their cardinalities + :rtype: pandas.Dataframe + """ + return self.one_level_normalizing(raw_data, self._array_indx, self._variables_label) + + def read_json_file(self) -> typing.List: + """Reads the JSON file in the path self.filePath. + + :return: The contents of the json file + :rtype: List + """ + with open(self._file_path) as f: + data = json.load(f) + + if (isinstance(data,list)): + return data + else: + return [data] + + + def one_level_normalizing(self, raw_data: typing.List, indx: int, key: str) -> pd.DataFrame: + """Extracts the one-level nested data in the list ``raw_data`` at the index ``indx`` at the key ``key``. + + :param raw_data: List of Dicts + :type raw_data: List + :param indx: The index of the array from which the data have to be extracted + :type indx: int + :param key: the key for the Dicts from which exctract data + :type key: string + :return: A normalized dataframe + :rtype: pandas.Datframe + """ + return pd.DataFrame(raw_data[indx][key]) + + def normalize_trajectories(self, raw_data: typing.List, indx: int, trajectories_key: str) -> typing.List: + """ + Extracts the trajectories in ``raw_data`` at the index ``index`` at the key ``trajectories key``. + + :param raw_data: List of Dicts + :type raw_data: List + :param indx: The index of the array from which the data have to be extracted + :type indx: int + :param trajectories_key: the key of the trajectories objects + :type trajectories_key: string + :return: A list of daframes containg the trajectories + :rtype: List + """ + dataframe = pd.DataFrame + smps = raw_data[indx][trajectories_key] + df_samples_list = [dataframe(sample) for sample in smps] + return df_samples_list + + def build_sorter(self, sample_frame: pd.DataFrame) -> typing.List: + """Implements the abstract method build_sorter of the :class:`AbstractImporter` for this dataset. + """ + columns_header = list(sample_frame.columns.values) + columns_header.remove(self._time_key) + return columns_header + + def clear_data_frame_list(self) -> None: + """Removes all values present in the dataframes in the list ``_df_samples_list``. + """ + for indx in range(len(self._df_samples_list)): + self._df_samples_list[indx] = self._df_samples_list[indx].iloc[0:0] + + def dataset_id(self) -> object: + return self._array_indx + + def import_sampled_cims(self, raw_data: typing.List, indx: int, cims_key: str) -> typing.Dict: + """Imports the synthetic CIMS in the dataset in a dictionary, using variables labels + as keys for the set of CIMS of a particular node. + + :param raw_data: List of Dicts + :type raw_data: List + :param indx: The index of the array from which the data have to be extracted + :type indx: int + :param cims_key: the key where the json object cims are placed + :type cims_key: string + :return: a dictionary containing the sampled CIMS for all the variables in the net + :rtype: Dictionary + """ + cims_for_all_vars = {} + for var in raw_data[indx][cims_key]: + sampled_cims_list = [] + cims_for_all_vars[var] = sampled_cims_list + for p_comb in raw_data[indx][cims_key][var]: + cims_for_all_vars[var].append(pd.DataFrame(raw_data[indx][cims_key][var][p_comb]).to_numpy()) + return cims_for_all_vars + + + diff --git a/build/lib/PyCTBN/PyCTBN/utility/sample_importer.py b/build/lib/PyCTBN/PyCTBN/utility/sample_importer.py new file mode 100644 index 0000000..b0b6e8f --- /dev/null +++ b/build/lib/PyCTBN/PyCTBN/utility/sample_importer.py @@ -0,0 +1,62 @@ +import json +import typing + +import pandas as pd +import numpy as np + +from .abstract_importer import AbstractImporter + + + +class SampleImporter(AbstractImporter): + """Implements the abstracts methods of AbstractImporter and adds all the necessary methods to process and prepare + the data loaded directly by using DataFrame + + :param trajectory_list: the data that describes the trajectories + :type trajectory_list: typing.Union[pd.DataFrame, np.ndarray, typing.List] + :param variables: the data that describes the variables with name and cardinality + :type variables: typing.Union[pd.DataFrame, np.ndarray, typing.List] + :param prior_net_structure: the data of the real structure, if it exists + :type prior_net_structure: typing.Union[pd.DataFrame, np.ndarray, typing.List] + + :_df_samples_list: a Dataframe list in which every dataframe contains a trajectory + :_raw_data: The raw contents of the json file to import + :type _raw_data: List + """ + + def __init__(self, + trajectory_list: typing.Union[pd.DataFrame, np.ndarray, typing.List] = None, + variables: typing.Union[pd.DataFrame, np.ndarray, typing.List] = None, + prior_net_structure: typing.Union[pd.DataFrame, np.ndarray,typing.List] = None): + + 'If the data are not DataFrame, it will be converted' + if isinstance(variables,list) or isinstance(variables,np.ndarray): + variables = pd.DataFrame(variables) + if isinstance(prior_net_structure,list) or isinstance(prior_net_structure,np.ndarray): + prior_net_structure=pd.DataFrame(prior_net_structure) + + super(SampleImporter, self).__init__(trajectory_list =trajectory_list, + variables= variables, + prior_net_structure=prior_net_structure) + + def import_data(self, header_column = None): + + if header_column is not None: + self._sorter = header_column + else: + self._sorter = self.build_sorter(self._df_samples_list[0]) + + samples_list= self._df_samples_list + + self.compute_row_delta_in_all_samples_frames(samples_list) + + def build_sorter(self, sample_frame: pd.DataFrame) -> typing.List: + """Implements the abstract method build_sorter of the :class:`AbstractImporter` in order to get the ordered variables list. + """ + columns_header = list(sample_frame.columns.values) + del columns_header[0] + return columns_header + + + def dataset_id(self) -> str: + return str("") \ No newline at end of file diff --git a/build/lib/PyCTBN/__init__.py b/build/lib/PyCTBN/__init__.py new file mode 100644 index 0000000..7adf0d7 --- /dev/null +++ b/build/lib/PyCTBN/__init__.py @@ -0,0 +1,2 @@ +import PyCTBN.PyCTBN +from PyCTBN.PyCTBN import * diff --git a/build/lib/PyCTBN/basic_main.py b/build/lib/PyCTBN/basic_main.py new file mode 100644 index 0000000..b1288db --- /dev/null +++ b/build/lib/PyCTBN/basic_main.py @@ -0,0 +1,39 @@ +import glob +import os + +import sys +sys.path.append("./PyCTBN/") + +import structure_graph.network_graph as ng +import structure_graph.sample_path as sp +import structure_graph.set_of_cims as sofc +import estimators.parameters_estimator as pe +import utility.json_importer as ji + + +def main(): + read_files = glob.glob(os.path.join('./data', "*.json")) #Take all json files in this dir + #import data + importer = ji.JsonImporter(read_files[0], 'samples', 'dyn.str', 'variables', 'Time', 'Name') + #Create a SamplePath Obj + s1 = sp.SamplePath(importer) + #Build The trajectries and the structural infos + s1.build_trajectories() + s1.build_structure() + #From The Structure Object build the Graph + g = ng.NetworkGraph(s1.structure) + #Select a node you want to estimate the parameters + node = g.nodes[1] + #Init the graph specifically for THIS node + g.fast_init(node) + #Use SamplePath and Grpah to create a ParametersEstimator Object + p1 = pe.ParametersEstimator(s1, g) + #Init the peEst specifically for THIS node + p1.fast_init(node) + #Compute the parameters + sofc1 = p1.compute_parameters_for_node(node) + #The est CIMS are inside the resultant SetOfCIms Obj + print(sofc1.actual_cims) + +if __name__ == "__main__": + main() diff --git a/build/lib/PyCTBN/setup.py b/build/lib/PyCTBN/setup.py new file mode 100644 index 0000000..56dd72f --- /dev/null +++ b/build/lib/PyCTBN/setup.py @@ -0,0 +1,20 @@ +from setuptools import setup, find_packages + + +setup(name='PyCTBN', + version='1.0', + url='https://github.com/philipMartini/PyCTBN', + license='MIT', + author=['Alessandro Bregoli', 'Filippo Martini','Luca Moretti'], + author_email=['a.bregoli1@campus.unimib.it', 'f.martini@campus.unimib.it','lucamoretti96@gmail.com'], + description='A Continuous Time Bayesian Networks Library', + packages=find_packages('.', exclude=['tests']), + #packages=['PyCTBN.PyCTBN'], + install_requires=[ + 'numpy', 'pandas', 'networkx', 'scipy', 'matplotlib', 'tqdm'], + dependency_links=['https://github.com/numpy/numpy', 'https://github.com/pandas-dev/pandas', + 'https://github.com/networkx/networkx', 'https://github.com/scipy/scipy', + 'https://github.com/tqdm/tqdm'], + #long_description=open('../README.md').read(), + zip_safe=False, + python_requires='>=3.6') diff --git a/dist/PyCTBN-1.0-py3-none-any.whl b/dist/PyCTBN-1.0-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..d2b496a1025fb4985feb27982534d70cb100bf67 GIT binary patch literal 35618 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 literal 0 HcmV?d00001 diff --git a/dist/PyCTBN-1.0.tar.gz b/dist/PyCTBN-1.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..89ad1845c56e021dbc593aca29bee16ed7ed017a GIT binary patch literal 24165 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 Date: Sat, 13 Mar 2021 20:40:18 +0000 Subject: [PATCH 014/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 32897a460317f3397147ac60cff64a8b7c37f4c7..7b4e98c2502b88dfa372c31909776569ae31c8db 100644 GIT binary patch delta 6168 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 From 8fae012b663c0416f90a37cea0a56591b3018515 Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sat, 13 Mar 2021 21:51:18 +0100 Subject: [PATCH 015/139] Update python-PyCTBN-package.yml --- .github/workflows/python-PyCTBN-package.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/python-PyCTBN-package.yml b/.github/workflows/python-PyCTBN-package.yml index 21d19f5..3f70711 100644 --- a/.github/workflows/python-PyCTBN-package.yml +++ b/.github/workflows/python-PyCTBN-package.yml @@ -62,7 +62,6 @@ jobs: git commit -m "Create New Realease at dist/" -a || true # The above command will fail if no changes were present, so we ignore # that. - git pull - name: Push changes uses: ad-m/github-push-action@master with: From 53f79875827ab77b00a3cbbfdcc95bc8c143fa1e Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sat, 13 Mar 2021 20:52:23 +0000 Subject: [PATCH 016/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 7b4e98c2502b88dfa372c31909776569ae31c8db..6fcdb1402740ca4c6539d7977f4cb5ce965ee20b 100644 GIT binary patch delta 6293 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 Wt?VbQyidwkX_iXcUrcA)*#83P#{Z@O From 3a9856dab1171305fb98b72699bb27fd15e9895c Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sat, 13 Mar 2021 22:09:32 +0100 Subject: [PATCH 017/139] Update python-PyCTBN-package.yml --- .github/workflows/python-PyCTBN-package.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/python-PyCTBN-package.yml b/.github/workflows/python-PyCTBN-package.yml index 3f70711..557f683 100644 --- a/.github/workflows/python-PyCTBN-package.yml +++ b/.github/workflows/python-PyCTBN-package.yml @@ -62,6 +62,7 @@ jobs: git commit -m "Create New Realease at dist/" -a || true # The above command will fail if no changes were present, so we ignore # that. + git pull origin - name: Push changes uses: ad-m/github-push-action@master with: From bbe312d08f3a9c32ad04c667f64589b1ff5d7432 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sat, 13 Mar 2021 21:10:42 +0000 Subject: [PATCH 018/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 6fcdb1402740ca4c6539d7977f4cb5ce965ee20b..6addccd1a9b870344ff5e5275a2686907829645e 100644 GIT binary patch delta 6628 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 delta 6708 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 From be2bbae710d6b4c92e9fc37908659e5798483767 Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sat, 13 Mar 2021 22:19:48 +0100 Subject: [PATCH 019/139] Update python-PyCTBN-package.yml --- .github/workflows/python-PyCTBN-package.yml | 25 +-------------------- 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/.github/workflows/python-PyCTBN-package.yml b/.github/workflows/python-PyCTBN-package.yml index 557f683..3842459 100644 --- a/.github/workflows/python-PyCTBN-package.yml +++ b/.github/workflows/python-PyCTBN-package.yml @@ -42,29 +42,6 @@ jobs: - name: Test with pytest run: | pytest PyCTBN/tests/ - - name: Install pypa/build - run: >- - python -m - pip install - build - --user - - name: Build a binary wheel and a source tarball - run: >- - python -m - build - --sdist - --wheel - --outdir dist/ - . - git config --local user.email "f.martini@campus.unimib.it" - git config --local user.name "philipMartini" - git add . - git commit -m "Create New Realease at dist/" -a || true - # The above command will fail if no changes were present, so we ignore - # that. - git pull origin - - name: Push changes - uses: ad-m/github-push-action@master - with: + branch: master github_token: ${{ secrets.PYCTBN_TOK }} From 6052877d1fd026cebffb881b2eb628d741357807 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sat, 13 Mar 2021 21:20:51 +0000 Subject: [PATCH 020/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 6addccd1a9b870344ff5e5275a2686907829645e..32fbbeb8cd6b62eb3a3689f27e9fe368fb5a31a4 100644 GIT binary patch delta 6772 zcmbVQdsvlK)^}}{gMh+0AQ$B(ARre7MGzGMMI1py!z^#y#3R0d*Z_uCG#m9GD7w*Q zmPMCow3=jkn;0zt(^0bo)J#qB7GBCwES++^@U3@mIl_F;Jm2$tf9P+oz1Cj$z4m+9 zx4zfD^}VX?UHMSg{#F)KmW-P=c5-EzE55x9TzQDA9_yOGn%{MGvF}+hudrxQWtlE7 zKdUHrUO{D<8{hn@`=Bzb%#4BsbJOxN7A&kRvymzW7tSjvBoWJb#Tj{vgtQahEd;0T zm1TYTOB?z^C5LVO&}%evQsdleSxFk})@?%US^LDm&mwv#nP#fS^sbU&rkbz!QBuv+ zb)Rn(qnUcRxLL{Rpn_~t|EOe}sopbem0UCBclDv7n5m#Ma5Po8SGk-tCo97I(S4BdFtRmk{-&7d}6v+D4G8ciz)wyrQ5#$&05C) zvi4|D48^yE{uy|imo-oKcM-8Q3=A>HbaGGt@9p=Wv5XCz%0~x8iI{lcluj|F^36kC z%-T*4lA8Ag$8yb@mO09d`E2Uo0Lp`ryOR|ygI9;7^B)I1%k)kEVSIH^9KS;zULNSq z!-o#*rM1zfO8>GzzIup@$hC*RPnY@_eS`Re&?x?1sGoKMvbi$U7jn&3I@d`%`{uA% zszXWJQE)jRT>) zeuO7?8)47uMr1;mpe9E+iuSA(ZVS zHhA;qk1fQS;=?Cd2`R`cln7}Z@z48AlJtjdHXnTp2)rU z7cq1Ajq%=mbnI5{M_9Him@kO6}#UCyd|8O;O%F>Y@X8k5A?iW{EsH{g}{@jAf6_x%3;&q;El}-sW5|i@rx-uH%S`2^P(RR5u(P=+@&oHpUl23G1b5{TJ=eP zBsTcEIy-JR+rVR<*z?=(7}O=1^@5=$X8lzztc)eV3;&kisr-GpZ*~e_u~%B#nN8MK z>^1O}N$%>s1)mB+-Iwz(ZQ(`Qb=ckuJk;OwswC@!{1b9f{?cn=!L5u=YH~p~@GXt` z)K+19W>E?+Ii*)?i$(%1q;CJ04+%njQv5*fmVd5!uTwpjHOh@Qj)@I!SE9#yKYBb5 z@71g0SG?1OtJ;+uksF?+PM@rnYxUeKJH@8D{?%83yY0%SzFx^~cKfJq>nK2*-Fm(v z$wMt%ze5nJN9jSi_;tfqa&f%;w3I9VJB^D{TdaQ!w!Gn(LA|$WrW8rryaM=<mguHsD>WJN=ElZ~beGVAL;AaNqp#E*WGyXRi9<4uPx@JS)`=lfnVsHGoMc$)lM z?>lO{R(wW*LG`bm1pLAlYMimdxZ@`&yq^20<)4u1dM@2>QMU_1E&uy1xiHn-lkE0c zdd&u}s_Bbu9?V+(=ibkxNZIF7mY01Vj1_~JrMiFrKO}2y9Tl3CtC0sb+Hjk-;k@ek z5j15Ac%M=c8ULo?FfW>tPt(ScJ2j>7nNxk#jZG0i3%&Z?iQRHhaq45aNIw0(Tv(i; zy44iA@v5_D`JLsOG6%l%+#Z;#CVjt#(UyTV8 zwUjaO25`TJ5V{^|uq`vyytA76>x#b`^k6mu<6Cx%*LFEP=G(#9Ey zXtRtcZIC7Q6jO{uv=NqQA?8;ih~Y&%ZEz(rF|}wji9(HK_}= z&Ptxs!l+P8U8oIRsPfK~t#F3kJ2`#lsz0_o0(!5mUms56(e*|wWT>e(E_py|%@`ec z>cCi&)(6&w=(Kl$0>au*aL2S5aKX~upvT6EbUC9-4Vaw(HZ_^i(CPr$IAt0{LvBsQ zG$`y33KDv29c_nuY?(vNq(!jV0@7KB0L?unahDn$(2@57N(6bgMLK-I5LLg+~ zvRaq`8F;W3W)is9K@LG_9TXC@*FiBsaXq|3@UR}%T8O7J6h|C|Kwf>*k1zV!k}qrx zv{BAEP}v1H48J-gxp?PG7>Jv`1WP);{YzL+FyJ606676(Sp;7lgrx*=hoFSu&>?u0 zVB$YvfljEJq{rL0z=J2>3&BkdU_ngV!?1+FbQnqr9FD+dDf*%wQ*D?t=AQ>0zjHqY z-H(C;Nenv*6$FQl!X|=gU%^f(pQT5;V3M~x20_G#ItDWc@EGJtex4r7BbYNUeiF@Z zJ+{?74G@dJhNV)XK#xIgLL!ncYqvK`WPJmxNY%A(fWCup{&7&GJUuOSu4J+8I7}u+ zbOTH$*wz5~1Qw03MkaT|wgZ&Ciu+br-4o)?TJ=pLeLI>UoWxHwK@y~*#|bbJtUUqC z(ZiMXMBPcMW-2D1glPotoupP2`}U_`G;K^d1@Q!U3TDgw-%r69+KBj;S|Sx!e@lHK zMb zNTK^v=*5@8$FfqU(ulEV;W-kkJPT=3?5rL)-v3>K32s~*QZ=y0^k4SHZsGuV;V<;}1}iagL`wKKU= z|1&sA&xKsVMe0f;rd<>nZM+ECM2)xvX%@nlp4ik1AyWS4C9sjZmKgN_JhgyAG4V3= zp(8Ud!(4*e%aBUoc12LDuRx}>?qtAdU$S1?Le?t=(&5Of!oh^AbhC|Eca`qB5d(jK zW%7Wx0k1^Tfn9#!ZBEslAE;A}IHm&+zbJ)XRQ)_gZkZwpaFYg=5$kWle94}IcEsKm3Iol-l>SIJ+=wkd!gy(Eh5_~M;DAeq zQn%&*MAOBHi+_R_2pWFs2sIP$-lyyh8BX(j`7P*6%q_Rzd4ij_V3stN(@7@eXRy{U z%qs3^a+>4HLW8*#66m0Ht4L>FE6gG4>(-8tmTDm-;FL(}*p;`zLMmT@t+yZ!8*YPv zq_5njv1!DpJ7APStfh3>QQdy*3r<_sSev80bw?yDvJJ9G{>?U;HAcMOCZbEaD=P89 zT^L21*Y83sjAbQyDS*)Q-CLF+HnP&qjDS8CH7Jn$>svmA`M2g?ce--8?r@gwO| zEz6$T+Zc$w$AdMtJ)kV+;D-B0{P15w$mTbQB-!}i z$eA2``S7>VsIBC0Wu zAWLfemsW6pYP{ELc8)osKOdDATbL0vk)Vj-b+#l}jbbXz9f~u*yi+Ne=W}+|rA^NOWknX^m-#AmwIa7VKD~l4$&U50O6!PK!Si-3o=$k_*;Il;JxkMx zgJt&GNO#8cQB3?o3B=V70R~Cj%OQ}g>mO{^`2};K%2O$~NmrbGrrG429f|kClm|zb5%p$n!$TkzKabg<@ z49*mLI)32HvZd;JP4x?y@51b8f0c{S*XqKS5|!PLRT4bz$F>ku^rz~lqo*s|PO#Ti zNcy@_zS0rhs0!)m=FSRr!s9FUSW!pOSG%+6#L#)L`2_hMl7)~08A(o7Z--IlQoQBMmXMH(AN3LW=EvqsS#K4?dLm`?5v!IF{89f#}yM~&rA zw)PHUd6GHY?3W{k1Tt4#5x{IoqC9|QOOvAh9V z>m3QbqXZQwVWI}9IG-R&{6X&RE_y1S=@Hxyx^Q3b#Ki+r(!F@lPe@B%@U z_|}?X=p0M6quE=*HFe=0>BPmqX_|7dQ9`Q(>u9k#NWuhyDDme*Tl>ydW;>a!h*50c zg}ba17vI)2TBpjD; QOG2+$jaTCr%j~=V4?OqN?*IS* delta 6735 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 b%QtDB^7wlaj!C#7p?`*^+Z~d@T>JhDxtrb& From 97dd047b58197841102a6611f146b03907972fa7 Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sat, 13 Mar 2021 22:23:03 +0100 Subject: [PATCH 021/139] Update python-PyCTBN-package.yml --- .github/workflows/python-PyCTBN-package.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/python-PyCTBN-package.yml b/.github/workflows/python-PyCTBN-package.yml index 3842459..c8d0ea6 100644 --- a/.github/workflows/python-PyCTBN-package.yml +++ b/.github/workflows/python-PyCTBN-package.yml @@ -42,6 +42,3 @@ jobs: - name: Test with pytest run: | pytest PyCTBN/tests/ - - branch: master - github_token: ${{ secrets.PYCTBN_TOK }} From 4bfa81ed36c4fd09e2240c22010f39850fbceaf4 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sat, 13 Mar 2021 21:23:50 +0000 Subject: [PATCH 022/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 32fbbeb8cd6b62eb3a3689f27e9fe368fb5a31a4..3a63d5f15059bfbef1a5203d065ab2113f56c744 100644 GIT binary patch delta 7219 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 Date: Sat, 13 Mar 2021 23:25:01 +0100 Subject: [PATCH 023/139] Update python-PyCTBN-package.yml --- .github/workflows/python-PyCTBN-package.yml | 26 +++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/.github/workflows/python-PyCTBN-package.yml b/.github/workflows/python-PyCTBN-package.yml index c8d0ea6..aa1fa2d 100644 --- a/.github/workflows/python-PyCTBN-package.yml +++ b/.github/workflows/python-PyCTBN-package.yml @@ -42,3 +42,29 @@ jobs: - name: Test with pytest run: | pytest PyCTBN/tests/ + - name: Install pypa/build + run: >- + python -m + pip install + build + --user + - name: Build a binary wheel and a source tarball + run: >- + git clone https://github.com/philipMartini/PyCTBN --branch master --single-branch + python -m + build + --sdist + --wheel + --outdir dist/. + git config --local user.email "f.martini@campus.unimib.it" + git config --local user.name "philipMartini" + git add . + git commit -m "Create New Realease at dist/" -a || true + # The above command will fail if no changes were present, so we ignore + # that. + #git pull origin + - name: Push changes + uses: ad-m/github-push-action@master + with: + branch: master + github_token: ${{ secrets.PYCTBN_TOK }} From 21a600a91b6e976168c62b43160de2d1c49c3279 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sat, 13 Mar 2021 22:25:56 +0000 Subject: [PATCH 024/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 3a63d5f15059bfbef1a5203d065ab2113f56c744..d6f60c1fe465c5e190672dd4d00fa92d308dd0e6 100644 GIT binary patch delta 7011 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 JV>Ek}{Wmeb68HcB From 76d963cb3f87846ac8ce8203a88491f68bc93815 Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sat, 13 Mar 2021 23:55:17 +0100 Subject: [PATCH 025/139] Update python-PyCTBN-package.yml --- .github/workflows/python-PyCTBN-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python-PyCTBN-package.yml b/.github/workflows/python-PyCTBN-package.yml index aa1fa2d..1640330 100644 --- a/.github/workflows/python-PyCTBN-package.yml +++ b/.github/workflows/python-PyCTBN-package.yml @@ -43,13 +43,13 @@ jobs: run: | pytest PyCTBN/tests/ - name: Install pypa/build - run: >- + run: | python -m pip install build --user - name: Build a binary wheel and a source tarball - run: >- + run: | git clone https://github.com/philipMartini/PyCTBN --branch master --single-branch python -m build From ed407573972bf1a6a771c7202ea0eda39c75c9d5 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sat, 13 Mar 2021 22:56:18 +0000 Subject: [PATCH 026/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index d6f60c1fe465c5e190672dd4d00fa92d308dd0e6..9e8e8953336a2c485568af9dae7693dbcd6dd7d1 100644 GIT binary patch delta 7300 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 YeaS8E#x3r`#pOa%*3Q>QvRBxD0n0#$XaE2J delta 7296 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 From 28714b2ee0f328db26e565ad1e29e446a156c9b8 Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sun, 14 Mar 2021 00:10:02 +0100 Subject: [PATCH 027/139] Update python-PyCTBN-package.yml --- .github/workflows/python-PyCTBN-package.yml | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/.github/workflows/python-PyCTBN-package.yml b/.github/workflows/python-PyCTBN-package.yml index 1640330..ea7de22 100644 --- a/.github/workflows/python-PyCTBN-package.yml +++ b/.github/workflows/python-PyCTBN-package.yml @@ -44,18 +44,11 @@ jobs: pytest PyCTBN/tests/ - name: Install pypa/build run: | - python -m - pip install - build - --user + python -m pip install build - name: Build a binary wheel and a source tarball run: | git clone https://github.com/philipMartini/PyCTBN --branch master --single-branch - python -m - build - --sdist - --wheel - --outdir dist/. + python -m build --sdist --wheel --outdir dist/. git config --local user.email "f.martini@campus.unimib.it" git config --local user.name "philipMartini" git add . From ec7c7fe89b6ff60ec19a779db7f5d85162b5c224 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sat, 13 Mar 2021 23:11:00 +0000 Subject: [PATCH 028/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 9e8e8953336a2c485568af9dae7693dbcd6dd7d1..7370d3b5d36d37df1624d68f508923a4c5136b94 100644 GIT binary patch delta 6768 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 OO7WE6{7wpall%wh@V^TH delta 6809 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 Date: Sun, 14 Mar 2021 01:17:06 +0100 Subject: [PATCH 029/139] Update python-PyCTBN-package.yml --- .github/workflows/python-PyCTBN-package.yml | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/.github/workflows/python-PyCTBN-package.yml b/.github/workflows/python-PyCTBN-package.yml index ea7de22..c8d0ea6 100644 --- a/.github/workflows/python-PyCTBN-package.yml +++ b/.github/workflows/python-PyCTBN-package.yml @@ -42,22 +42,3 @@ jobs: - name: Test with pytest run: | pytest PyCTBN/tests/ - - name: Install pypa/build - run: | - python -m pip install build - - name: Build a binary wheel and a source tarball - run: | - git clone https://github.com/philipMartini/PyCTBN --branch master --single-branch - python -m build --sdist --wheel --outdir dist/. - git config --local user.email "f.martini@campus.unimib.it" - git config --local user.name "philipMartini" - git add . - git commit -m "Create New Realease at dist/" -a || true - # The above command will fail if no changes were present, so we ignore - # that. - #git pull origin - - name: Push changes - uses: ad-m/github-push-action@master - with: - branch: master - github_token: ${{ secrets.PYCTBN_TOK }} From 58d6961f8b680d4e7170aa52a1af8d65e38a8d14 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 00:18:05 +0000 Subject: [PATCH 030/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 7370d3b5d36d37df1624d68f508923a4c5136b94..a20ba121531b882612a7d6deb06d2fed672ab392 100644 GIT binary patch delta 7016 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 From aaec2574f7a4bb3d823f6eef0b0a19e655e0540b Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sun, 14 Mar 2021 11:42:07 +0100 Subject: [PATCH 031/139] Update python-PyCTBN-package.yml --- .github/workflows/python-PyCTBN-package.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.github/workflows/python-PyCTBN-package.yml b/.github/workflows/python-PyCTBN-package.yml index c8d0ea6..de4697b 100644 --- a/.github/workflows/python-PyCTBN-package.yml +++ b/.github/workflows/python-PyCTBN-package.yml @@ -42,3 +42,20 @@ jobs: - name: Test with pytest run: | pytest PyCTBN/tests/ + - name: Install pypa/build + run: | + python -m pip install build + - name: Build a binary wheel and a source tarball + run: | + python -m build --sdist --wheel --outdir dist/. + git config --local user.email "f.martini@campus.unimib.it" + git config --local user.name "philipMartini" + git add . + git commit -m "Create New Realease at dist/" -a || true + # The above command will fail if no changes were present, so we ignore + # that. + - name: Push changes + uses: ad-m/github-push-action@master + with: + branch: master + github_token: ${{ secrets.PYCTBN_TOK }} From 257c2538b05f845917e5444cc30122a326c0b4f3 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 10:50:53 +0000 Subject: [PATCH 032/139] Create New Realease at dist/ --- dist/PyCTBN-1.0-py3-none-any.whl | Bin 35618 -> 35618 bytes dist/PyCTBN-1.0.tar.gz | Bin 24165 -> 24271 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/PyCTBN-1.0-py3-none-any.whl b/dist/PyCTBN-1.0-py3-none-any.whl index d2b496a1025fb4985feb27982534d70cb100bf67..e229e0310fd9b42e3e655a303894742e886d4146 100644 GIT binary patch delta 589 zcmZ29jcL&|Cf)#VW)=|!1_llWztFsiyxz<}YGZUK6NujYoarMYh%xy#%S14p&$<&V zq0JV`24*z#lYzlu@{?m+q&7u#-AOmcAoP|uuPUq9mHX;-Tb(~A~u1+ zEMUf@&^Zu>VN?c$F()nzta$R*gf_5}x8eJ5Fny*m8cb_7LFkUAY%u>@QxupEZcYQ!dzvBY`C1ae{Gt|! z`U@=qV7_u|5SXrL4FS{VTQk74Ra+#Op4Ju)rawSwul7(de^GlFnEu`F1E#$?pyC~# mVE(&~Krrpp84M1B8J!+r`f;Z#nAYwJ0n<%gzF_)NR{#J(6ww?2 delta 589 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�j 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

gsqkH#N0Hdq>m&+t}_~APVWd_ zwsXRw+_R1Q&=iS`CmSgRG~w#wWvhaypY&-kOQmcCdtdp9OhqTy8h7F>lui%Z$*#Xk zwk7R0qMqC7t_Mq%IprrmhzDn`aYI741CIqR90TKhh)T7G$iSqvtzcr2 zw%VMCy1$G^;wC1VVphzJ4}M&=_V2P66KsgRBJZ~6aS}`0*v2F=v|ojjN0U>ruG~;^ z;j-16^%Un|S20z3k*e);YH_QrtqI9U5)(c?J;i_%eVCn@C8_U6m)0=1P zD)RB=L~A%R4?YlXL;-ZC^xj4fVAjNAuLTLFvLQEq`8VI)jj(i(=Yuc5T2*)PyO#kA3!ezcr25_3ii|Uf{|(ur|9m0g!#u{K*7j~?JW4h>Ii=d?zUcJnt6wu~pbH#+kBxvcKMvvlZ2zy7?&cn}<`w8c IVL(IqAIf;Z6#xJL delta 23570 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 From fc0f8635fc9f630439bb2c3ccf3493c554dce985 Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sun, 14 Mar 2021 12:51:59 +0100 Subject: [PATCH 033/139] Update main.yml --- .github/workflows/main.yml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 21c11eb..cfbae9d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -4,13 +4,10 @@ name: Sphinx Docs on: - push: - paths-ignore: - -'docs/**' - -'docs-out/**' - branches: [ master ] - pull_request: - branches: [ master ] + workflow_run: + workflows: ["Python package"] + types: + - completed jobs: build: From 34c6e0283e4fa501a732e666605352c8d7619820 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 12:01:11 +0000 Subject: [PATCH 034/139] Create New Realease at dist/ --- dist/PyCTBN-1.0-py3-none-any.whl | Bin 35618 -> 35618 bytes dist/PyCTBN-1.0.tar.gz | Bin 24271 -> 24232 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/PyCTBN-1.0-py3-none-any.whl b/dist/PyCTBN-1.0-py3-none-any.whl index e229e0310fd9b42e3e655a303894742e886d4146..974a54d6a50e564d5ea1efd9cb460bb8ab7243d7 100644 GIT binary patch delta 485 zcmXBPJxBs!90u_7{H$yUnu3;yASa8KGAjEp%s$loC=;`mIM5&*%pmg4k2?<<^hlv_ z$e}UF+iD5g3MyB(3L1ilLYIcjwey4v_ic(!u0K3|2OienU4syn*7Jhd^bn`CsHgq0p#QqXeKRSn4JR&)(IZi zAQdUNxc*YAJGYlBb2Ea*n4Scn*^FE|= n-Vc8HC14j?Ltz2wQ*Z-o&V#>{a(3{VvjLOn1+2IXYNG2OlM1*@ delta 485 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 From d2c7577e946112f777f9401b004c67a0189fcc20 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 12:02:14 +0000 Subject: [PATCH 035/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index a20ba121531b882612a7d6deb06d2fed672ab392..3458ea09dd1b7dcff0b4a51c889143e4bf6f8bb6 100644 GIT binary patch delta 7466 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 From 4a16a7c5141e94db32d9221297221762bfb58f10 Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 17:36:48 +0100 Subject: [PATCH 036/139] Update python-PyCTBN-package.yml --- .github/workflows/python-PyCTBN-package.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/python-PyCTBN-package.yml b/.github/workflows/python-PyCTBN-package.yml index de4697b..43ea496 100644 --- a/.github/workflows/python-PyCTBN-package.yml +++ b/.github/workflows/python-PyCTBN-package.yml @@ -11,6 +11,8 @@ on: -'dist/**' -'build/**' branches: [ master ] + tags-ignore: + - 'v*' pull_request: branches: [ master ] From 6fc38cce24689920e6c745c2ccd29b2bec0d392f Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 17:44:47 +0100 Subject: [PATCH 037/139] Create Build_Release.yml --- .github/workflows/Build_Release.yml | 61 +++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 .github/workflows/Build_Release.yml diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml new file mode 100644 index 0000000..1947734 --- /dev/null +++ b/.github/workflows/Build_Release.yml @@ -0,0 +1,61 @@ +on: + push: + # Sequence of patterns matched against refs/tags + branches: [ master ] + tags: + - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10 + +name: Upload Release Asset + +jobs: + build: + name: Upload Release Asset + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python -m pip install flake8 pytest + if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + - name: Lint with flake8 + run: | + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + - name: Test with pytest + run: | + pytest PyCTBN/tests/ + - name: Install pypa/build + run: | + python -m pip install build + - name: Checkout code + uses: actions/checkout@v2 + - name: Build project # This would actually build your project, using zip for an example artifact + run: | + python -m build --sdist --wheel --outdir dist/. + - name: Create Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.PYCTBN_TOK }} + with: + tag_name: ${{ github.ref }} + release_name: Release ${{ github.ref }} + draft: false + prerelease: false + - name: Upload Release Asset + id: upload-release-asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.PYCTBN_TOK }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps + asset_path: ./dist/Py + asset_name: PyCTBN-1.0.tar.gz + asset_content_type: application/tar+gzip From 85e3ff588315c971b0622c057d3f370b50149999 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 16:46:52 +0000 Subject: [PATCH 038/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 3458ea09dd1b7dcff0b4a51c889143e4bf6f8bb6..7880f4000ec7aaccc4afde4dddcd46ac5caa5ff8 100644 GIT binary patch delta 6782 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 From f90f2afb5335d9c18ea6bda5117ea70bf0b9cdd4 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 16:54:58 +0000 Subject: [PATCH 039/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 7880f4000ec7aaccc4afde4dddcd46ac5caa5ff8..44a56ecdc50a35336bd2948a30f2aa846d482a56 100644 GIT binary patch delta 7348 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 entc~ae0%l4lU1!$JyWia~ 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 Date: Sun, 14 Mar 2021 17:57:27 +0100 Subject: [PATCH 040/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 43 ++++++++++------------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index 1947734..a9b3ab3 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -1,7 +1,6 @@ on: push: # Sequence of patterns matched against refs/tags - branches: [ master ] tags: - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10 @@ -12,33 +11,19 @@ jobs: name: Upload Release Asset runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python-version }} - - name: Install dependencies - run: | - python -m pip install --upgrade pip - python -m pip install flake8 pytest - if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - - name: Lint with flake8 - run: | - # stop the build if there are Python syntax errors or undefined names - flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics - # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide - flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - - name: Test with pytest - run: | - pytest PyCTBN/tests/ - - name: Install pypa/build - run: | - python -m pip install build - name: Checkout code uses: actions/checkout@v2 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python -m pip install flake8 pytest + if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + - name: Install pypa/build + run: | + python -m pip install build - name: Build project # This would actually build your project, using zip for an example artifact run: | - python -m build --sdist --wheel --outdir dist/. + python -m build --sdist --wheel --outdir dist/. - name: Create Release id: create_release uses: actions/create-release@v1 @@ -53,9 +38,9 @@ jobs: id: upload-release-asset uses: actions/upload-release-asset@v1 env: - GITHUB_TOKEN: ${{ secrets.PYCTBN_TOK }} + GITHUB_TOKEN: ${{ secrets.PYCTBN_TOK }} with: - upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps - asset_path: ./dist/Py - asset_name: PyCTBN-1.0.tar.gz - asset_content_type: application/tar+gzip + upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps + asset_path: ./dist/Py + asset_name: PyCTBN-1.0.tar.gz + asset_content_type: application/tar+gzip From 53cc2cac960c692ab628d2bd3cdbf263b9322bc0 Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 17:59:04 +0100 Subject: [PATCH 041/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index a9b3ab3..8684ae8 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -4,7 +4,7 @@ on: tags: - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10 -name: Upload Release Asset +name: Upload Release Asset jobs: build: From 9369f75db18dd2203a88e57ff22da770c6dfaf13 Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 18:00:23 +0100 Subject: [PATCH 042/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index 8684ae8..6d2fca5 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -1,9 +1,9 @@ on: push: # Sequence of patterns matched against refs/tags - tags: - - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10 - + #tags: + #- 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10 + name: Upload Release Asset jobs: From 7bd6503a52d2606422d3450091660d384e82b20f Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 18:03:26 +0100 Subject: [PATCH 043/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index 6d2fca5..4788655 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -41,6 +41,6 @@ jobs: GITHUB_TOKEN: ${{ secrets.PYCTBN_TOK }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps - asset_path: ./dist/Py + asset_path: ./dist/PyCTBN-1.0.tar.gz asset_name: PyCTBN-1.0.tar.gz asset_content_type: application/tar+gzip From 9e0f551fba73949a1a596e2a32b417d0aab99bc7 Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 18:07:30 +0100 Subject: [PATCH 044/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index 4788655..8a6cff0 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -30,8 +30,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.PYCTBN_TOK }} with: - tag_name: ${{ github.ref }} - release_name: Release ${{ github.ref }} + tag_name: v.${{ github.ref }} + release_name: Release v ${{ github.ref }} draft: false prerelease: false - name: Upload Release Asset From 2c853e7588585f802ae86bafd7c5e43a6c6170d1 Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 18:16:53 +0100 Subject: [PATCH 045/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index 8a6cff0..12cb5ca 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -1,4 +1,5 @@ -on: + + on: push: # Sequence of patterns matched against refs/tags #tags: @@ -31,16 +32,13 @@ jobs: GITHUB_TOKEN: ${{ secrets.PYCTBN_TOK }} with: tag_name: v.${{ github.ref }} - release_name: Release v ${{ github.ref }} + release_name: Release v- ${{ github.ref }} draft: false prerelease: false - name: Upload Release Asset id: upload-release-asset - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.PYCTBN_TOK }} + uses: AButler/upload-release-assets@v2.0 with: - upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps - asset_path: ./dist/PyCTBN-1.0.tar.gz - asset_name: PyCTBN-1.0.tar.gz - asset_content_type: application/tar+gzip + files: 'dist/*;' + repo-token: ${{ secrets.PYCTBN_TOK }} + From 9375051bee460d83646689046c6468875493d034 Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 18:21:19 +0100 Subject: [PATCH 046/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index 12cb5ca..79be794 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -32,7 +32,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.PYCTBN_TOK }} with: tag_name: v.${{ github.ref }} - release_name: Release v- ${{ github.ref }} + release_name: Release v. ${{ github.ref }} draft: false prerelease: false - name: Upload Release Asset From 104b5170b7fa181b1b4dea45c3e23a972ea1bc9a Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 18:22:37 +0100 Subject: [PATCH 047/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index 79be794..434d1fa 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -1,5 +1,5 @@ - on: +on: push: # Sequence of patterns matched against refs/tags #tags: From cbab17e422a51c875cdf6cbf320ef79fddfc32f7 Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 18:28:57 +0100 Subject: [PATCH 048/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index 434d1fa..7bac19f 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -37,8 +37,9 @@ jobs: prerelease: false - name: Upload Release Asset id: upload-release-asset - uses: AButler/upload-release-assets@v2.0 + uses: dwenegar/upload-release-assets@v1 + env: + GITHUB_TOKEN: ${{ secrets.PYCTBN_TOK }} with: - files: 'dist/*;' - repo-token: ${{ secrets.PYCTBN_TOK }} - + release_id: ${{ steps.create_release.outputs.id }} + assets_path: ./dist From dd980902ffb1db0595f2f8d65db788eec4a65903 Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 18:30:56 +0100 Subject: [PATCH 049/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index 7bac19f..a7c17c0 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -31,8 +31,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.PYCTBN_TOK }} with: - tag_name: v.${{ github.ref }} - release_name: Release v. ${{ github.ref }} + tag_name: ver.${{ github.ref }} + release_name: Release ver. ${{ github.ref }} draft: false prerelease: false - name: Upload Release Asset From df2599f6350248cf7c28b4b4f1d50b6350b27210 Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 18:35:51 +0100 Subject: [PATCH 050/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index a7c17c0..8b99191 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -12,13 +12,32 @@ jobs: name: Upload Release Asset runs-on: ubuntu-latest steps: - - name: Checkout code - uses: actions/checkout@v2 +< - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip python -m pip install flake8 pytest if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + - name: Lint with flake8 + run: | + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + - name: Test with pytest + run: | + pytest PyCTBN/tests/> + - name: Checkout code + uses: actions/checkout@v2 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python -m pip install flake8 pytest + if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - name: Install pypa/build run: | python -m pip install build From 5e9144efe18fecd6f48a4f209890984569790003 Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 18:36:41 +0100 Subject: [PATCH 051/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index 8b99191..546f8ab 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -12,7 +12,7 @@ jobs: name: Upload Release Asset runs-on: ubuntu-latest steps: -< - uses: actions/checkout@v2 + - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: From 2efdbe4ee91bdf31bbffe80361c6481f9c7230d5 Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 18:37:15 +0100 Subject: [PATCH 052/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index 546f8ab..38369f8 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -31,8 +31,6 @@ jobs: - name: Test with pytest run: | pytest PyCTBN/tests/> - - name: Checkout code - uses: actions/checkout@v2 - name: Install dependencies run: | python -m pip install --upgrade pip From b088d6ddf622715f104e649f651c8d5a294bf85c Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 18:37:52 +0100 Subject: [PATCH 053/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index 38369f8..625d492 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -32,7 +32,7 @@ jobs: run: | pytest PyCTBN/tests/> - name: Install dependencies - run: | + run: | python -m pip install --upgrade pip python -m pip install flake8 pytest if [ -f requirements.txt ]; then pip install -r requirements.txt; fi From 6c341138f3071e0ab5e5c3accdb272b3f83a8946 Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 18:40:40 +0100 Subject: [PATCH 054/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index 625d492..40e0bfe 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -31,11 +31,13 @@ jobs: - name: Test with pytest run: | pytest PyCTBN/tests/> + - name: Checkout code + uses: actions/checkout@v2 - name: Install dependencies run: | - python -m pip install --upgrade pip - python -m pip install flake8 pytest - if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + python -m pip install --upgrade pip + python -m pip install flake8 pytest + if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - name: Install pypa/build run: | python -m pip install build From c0dcc8ab2378af1ec7f14ead86f8f2b9acc6adbc Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 18:41:00 +0100 Subject: [PATCH 055/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index 40e0bfe..43b35e4 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -31,8 +31,6 @@ jobs: - name: Test with pytest run: | pytest PyCTBN/tests/> - - name: Checkout code - uses: actions/checkout@v2 - name: Install dependencies run: | python -m pip install --upgrade pip From 918f0ab290024a642003e49ecd6ec3efb1647348 Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 18:43:54 +0100 Subject: [PATCH 056/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index 43b35e4..661733a 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -9,6 +9,12 @@ name: Upload Release Asset jobs: build: + + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [3.8] + name: Upload Release Asset runs-on: ubuntu-latest steps: From f9a9f17cf9a04da5a1514fe7d23aa261ff3a0609 Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 18:44:32 +0100 Subject: [PATCH 057/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index 661733a..76c6f24 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -16,7 +16,6 @@ jobs: python-version: [3.8] name: Upload Release Asset - runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} From c1a6f376e5ad7c53eb001d1356235603dbe1d2da Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 18:46:27 +0100 Subject: [PATCH 058/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index 76c6f24..61f99f8 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -35,7 +35,7 @@ jobs: flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: Test with pytest run: | - pytest PyCTBN/tests/> + pytest PyCTBN/tests/ - name: Install dependencies run: | python -m pip install --upgrade pip From 70d15fb7540ca6f83ca574722378a4fc81496016 Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 18:47:17 +0100 Subject: [PATCH 059/139] Update main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index cfbae9d..2c1aa31 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -5,7 +5,7 @@ name: Sphinx Docs on: workflow_run: - workflows: ["Python package"] + workflows: ["Python package","Upload Release Asset"] types: - completed From 01825691fa11f8e63dec39b922ad37477e674ff7 Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 18:48:02 +0100 Subject: [PATCH 060/139] Update python-PyCTBN-package.yml --- .github/workflows/python-PyCTBN-package.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/python-PyCTBN-package.yml b/.github/workflows/python-PyCTBN-package.yml index 43ea496..5d3cf42 100644 --- a/.github/workflows/python-PyCTBN-package.yml +++ b/.github/workflows/python-PyCTBN-package.yml @@ -44,10 +44,6 @@ jobs: - name: Test with pytest run: | pytest PyCTBN/tests/ - - name: Install pypa/build - run: | - python -m pip install build - - name: Build a binary wheel and a source tarball run: | python -m build --sdist --wheel --outdir dist/. git config --local user.email "f.martini@campus.unimib.it" From 36e12821afa8d30655e62288b248581db72440bc Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 17:53:23 +0000 Subject: [PATCH 061/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 44a56ecdc50a35336bd2948a30f2aa846d482a56..bfbb664e664fcf47d775ff042e52215a4b9832d6 100644 GIT binary patch delta 6879 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 Fe*@}O4kG{n delta 6939 zcmcIoX#FVZD{@O_7w6Bdt9DX*5oP&v%ZT*mYhU%@&feX@gQv~)WYxX! zmon%TTvzR2$(>s?J*OnMXjWZykG50o3cD4}%FC~)tMc^iv zG>eUDvChym8+HGFp_Xf-9$ffUo7zs@b+bBX`8LXvJ);#(vymZri?m`J6|>qyn_;5{ zx@g)H$$?egTA_^>YlzfJo=`8{)TZ00LC!z$^M1(&5#*Y>V7@ddoPW{BgGWWg@+o0v zULRx6ANlv>GyUWE$6@KbPv3C9yx%asH7Jc=4vyu&#`NW1CJf}y^&iBa35?{w$A$B5 z5n=ptXdI7Aj;4PBJS)hBcMXZ`UMrI)tV|8^<7?u>{y(fZ*2K~kH@=-H&c5Xk!kd-B0iJ=#tLcCFQNxfUJ4Ur7p+5p>MAI5jyok-r=z>jV9` zF{ZbDPEOIRqOzPE?hrGU&j^X*=VDFVFUH6d272-dF(W83BgkFRfyxb)n)V`+QdS+o z&&T@l4_kwXbcDwbq<=y7Wq&E3URM5>e7-tyknAoCWwL8X6vu=<{B)!fxhU>I$4s@k z2;qE7k~e=Q$t*gNRR<91!M&4ukh6h&b5b;)m=wfcOCDe+u8uaHA54yc9R4Wz3O|w- z!0l6(@+%_(_(v(otwRO6@Ue3p_~OBfz_M<*Kle-hJ1HnWIkwS{4;?;mZrmq*EMGr7fY+ukk%LEz?@E4(p`(oxD=~1i9I+DJrde(RPcK$fI^xtYkt?iOivAPBLvyE9dG%9erPJruEvyUHa`ewfh5_Hj19hiSA!1?TzOVW5g3+Jz*4K=B zOhzIToBG1cd6KIe#?Auny|I*%9>5Lbvboa-f%>9xbk^wub@s$_^-!Q!Wq-}YmOf*A zIq=5QrBsy&Uhz^k|Hqj?z4fIapoNJq%=FdMCvKF4{&-Sr+hU3<6Kp+T+CwF`e5Z*U zC!6_@N3Q(F`(}NfWtS2iowr#ny3bewyzFCPr@i{_ykB89U%1W0ca*#8>kG-|!fj^0 zDAPy3RkT$S`lmC07Yl#VZotRg!B@XqvO%#vEIpzYHFMsS3+^zZmp*oGA%KM+K0S-t zY9OCjp3RFhP5O@VB%np49{kt6Vqw-FRos&cUh|nzXxIG~99A3e9F!Z}xY&fdg20jQ z+h)>7EPTHcS2r%+uQvRudVR7~t@RVHte2bm%2!_nKJt7VpH`PheZ7eLUkKE_R|ElQ zyd-mgUbgZrTIw!UM+ID5bwa@QnoEMe@ZWuSWR(lygaLv z?nXJEI4)3c=2X{-<3wGXxHa2VXRmK%Vng5m#&{QQEhwd%vxL`|s0>GbKpCztQ5jzG z;U|*NGd{Yec2B%ws6a4D$cwA>M3>|_=LG;J-B`h@P;xfO_pZ(h6Z=M>B}7TFSq@llBoGi ziBd(vu(m(5*SBx~k7BLZ`JP%N?Oq0a{~?vv*~3Ek_&wQtV`HFxXb)N6*r-}I@XIPm z=sWivQ@g%ZCJN3K>+7Kh|D(pNUpqi;MDptvDn?ckbI}_Q7OQg^-&6u$cHEn9IqbW-f0!B?IN(H16Y0%S&m}^yIyovbi(q79G60DISP0>&K4JjS-8rNB>tXvcCT( z@MqV$>D`ab2Y&KJZ@%I9aqedk2i^Gk6I-BA&-`&2qb)PPaO!8i{fknXTm^jdK4tU3 znR+PUnLm!ucbv5XUw1f8x>cM0G(UVkn=d}9#L_RE(!`@9<0(1aGP=sqmSHdFT82Rm zwT$j^q7fy=8HtElMwA$28QtU*BM~veGVJ91$^bdMh$jYD29r~ZHmCFIi^H6SxhZwp zQW{;kS^+2a<0 zOebn|Cu&S5YK4P3C&H-JtevP;ov50Ql#6tRK67dgm*_t=KLGk%UA`O(1>EaO8qCzE zUODRvc@2XN;Aa3!Lyj}7h?MUL3J7;Zfe+>k0Z**@08Dsz6kXHQDl-<22B!u~Dzvyk zZbR1du(da)7{D3VKM(T$7;%dWb88qg8`j$4RA+E*xc)NK41nT>dH;d~J-x-Zf-)&S z6a*@LGS@^+$En+4%p{R8t4x$tR@N#DYn64i%CcHzRjsn9R#{W4EU8si)G7;Vl{T!> zgjHIwl7VhJU=-xw*c}iG1-M`bjD(rEX9r9q@YxA7395EN8NuV7P(e_!3tl0(zYCVz z$uDRWCLDlJUVk-+&;Hq-&uR&E(oVQh^(A*8ezjL|vGoh+i)+3BdpiEc7qF6`&mPDi zDA@y(2)^0_^9hFUg~bGW_rj|LqrQY9gH$!fgg35(FCTj=64x|>9Wh<@!8`)%KByva z+Yf7%=u0M?>cl*-^duN~>+NjxIRI`X5pw`)3HBaQ)P07<&W~Ucfym<(oB}Qr^j3;=#5lRW{4#P5)+*PmdrtH<;cEI{>kZ#jzYLe-D zs|n&r{74gILLT}aff)qLk3c2*da-V3_?D`fhhx8m=L!DtEof@r^(YLYjjW@PPJl;Y zvf96U6b92q{CCt6dARgD>I9c3^rCOp#8uKt5l;H0*1c627y3mnjR8tfGBHxmxN*Y4;B zZ+Hr4o(3antvn6$l*m03)_agEyMBgV%5y0<`V4iY1#`~Gj2=D%g+wKsg&aHSOE+w4 zfk-8P^(;84U3*Nq2Yw=;D9ktq&U9qrIhanc;~Y#S@IEi8rRTw-toJfwYCp2RqnWJN z_NBv#7o>xuFVM}l;LZzl&n*~w5f-Qe0cJd(NC!3sL4Yk)trw|NEjYLtatSsxL%#B7 z0H&NJFO6ZOJR$^oV9urX%tV{9abKOj;r?L!r`=Y}4X_&6mNf z92wl^$kj;jf6^+cSE%1DSaSs?tHUEjqN336D)giMkymL@S#Z}?C{XMyG!pyuDClbo zrs^lU;TCNE2}USO6U=CO3~o3-n!2s@8ci1qzI+W{BxtXc94nu85~Ws@+#V!oaVST%WP|f(R9$UMW(Z)1*Q=7bxV6l^F>Ib zF)NWecF_&6Q_2@&%XJuzjW@td(&ul`*tB3uE6h+qET?oCsct{HL$7tq9Bt8FZo9e}QD$y!;EK(U=JSl`f-(3x0(;1TDW(LuokfH)>N2 zcmGEBOv53!ppszwEtqL1e=BVjS@sj3$WZJt0vz$?J<6hnt8T+If}d~06eYMFYi~ma z-be?BHV-x2^t%*tx&w(Mn|_C!(eRZ!Fq~k&0;jt$jHs-;(!+IkVKh;v@6wk_!-RVj znTG4{QB^g(a}OrU@3z)#M&BSx$m~C0xH5hP7v875Zj56_C35YFNEGJX2Uk*1ai4~e z4C>~St7E`jV<8D2H_NC7KY%=?@pn=1U~GB-k#rOuN-sw|q|2gV-9wnF6fsv!qK_9w zWJ96BZwhrenj1y+u-;ZdKe)eJzbcEpwflSCTMYC<#_Hp=mtyB%Ypfd zm$`gdgkh$UIXmRUwDnj%o;0#_I^l0(<8TR`zzP$aWRO2tt6jyU^1x}yOuqO-@lZLq z;DaMntrWAgx53O}>GTg~mI_7K)0IsnD0gMW1Q%S{5 zvy;E9cL_@`VyP!HlBOk|Qhkdjqx&Hg7C+5u)e-2;R;yKAZ?;Nt1HD+C+S~5M3h8`5 zZ^~v7qBr{=0&gEyW{_6SyJGE5N=&^E8&3>_FDoD@^<^0ZpZT)!O02~dQ*Y9k8{o%A zD)(-p$)2hav0BXOKFl5`^Aj zDZ!z>Y^L(F7oJZdKkMIsWLvG??Z@V+?05&sGFJw%0wo@R)$t@g>rDv99dDCwS;5Rs zInvJ!O)cbd;hPYH8-rz8wgt0MG9U;;=e{gT{Eq91WBW6M+8uz4lb8<&@(ln;Xi?366!bSxRVl zn_u?t(gmykJG~3u31g0mH}X%s_Q_a;4&iJxsd*usy+E)joJ}WiiI6Zif+Z2PIf5lZ zF?u{N4{(%BEA*&G6|7`8x3zUqc^j!_Ciw?IJ;^<e7oLv+{BxV9tPrQWju4BGb`e$Rg3YDce3!iRF^P zQ%NjeiGAv3n{MeUi0z`a#^U{CnSdUHSTr3NGKj^|%l5B>n0Jc&W8l-KE?o-86ppc$ z)h(^l&WWEct311O306N~d^&Lr?oYUQgjCS;yH!Dt6iJ0D7$qPN3kXu=pBLZjq^I_Y z9?AW%6Zh>7T->cRofTlghYETRmQ Date: Sun, 14 Mar 2021 17:56:52 +0000 Subject: [PATCH 062/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index bfbb664e664fcf47d775ff042e52215a4b9832d6..ac18e18a57337cded8e386d80da1ca1b07d22267 100644 GIT binary patch delta 7408 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 ZPxd9ZydSr`4;NPpO@+H&oWP!C{{xGUxD)^Y delta 7484 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 T+|nLgTqQJ>G`*P0o@4(3xme3c From 986225405abfe4bde22acfb1039415610db6aa94 Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 18:57:00 +0100 Subject: [PATCH 063/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index 61f99f8..bc23a91 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -2,8 +2,8 @@ on: push: # Sequence of patterns matched against refs/tags - #tags: - #- 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10 + tags: + - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10 name: Upload Release Asset From 8546e8bc818e8350b719bf4da5d8221ec0b69484 Mon Sep 17 00:00:00 2001 From: Filippo Martini Date: Sun, 14 Mar 2021 19:00:39 +0100 Subject: [PATCH 064/139] Delete basic_main --- PyCTBN/basic_main.py | 39 --------------------------------------- 1 file changed, 39 deletions(-) delete mode 100644 PyCTBN/basic_main.py diff --git a/PyCTBN/basic_main.py b/PyCTBN/basic_main.py deleted file mode 100644 index b1288db..0000000 --- a/PyCTBN/basic_main.py +++ /dev/null @@ -1,39 +0,0 @@ -import glob -import os - -import sys -sys.path.append("./PyCTBN/") - -import structure_graph.network_graph as ng -import structure_graph.sample_path as sp -import structure_graph.set_of_cims as sofc -import estimators.parameters_estimator as pe -import utility.json_importer as ji - - -def main(): - read_files = glob.glob(os.path.join('./data', "*.json")) #Take all json files in this dir - #import data - importer = ji.JsonImporter(read_files[0], 'samples', 'dyn.str', 'variables', 'Time', 'Name') - #Create a SamplePath Obj - s1 = sp.SamplePath(importer) - #Build The trajectries and the structural infos - s1.build_trajectories() - s1.build_structure() - #From The Structure Object build the Graph - g = ng.NetworkGraph(s1.structure) - #Select a node you want to estimate the parameters - node = g.nodes[1] - #Init the graph specifically for THIS node - g.fast_init(node) - #Use SamplePath and Grpah to create a ParametersEstimator Object - p1 = pe.ParametersEstimator(s1, g) - #Init the peEst specifically for THIS node - p1.fast_init(node) - #Compute the parameters - sofc1 = p1.compute_parameters_for_node(node) - #The est CIMS are inside the resultant SetOfCIms Obj - print(sofc1.actual_cims) - -if __name__ == "__main__": - main() From f4e1ec2194123063790aae68aad8487c13c3922d Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 14 Mar 2021 19:05:43 +0100 Subject: [PATCH 065/139] Update python-PyCTBN-package.yml --- .github/workflows/python-PyCTBN-package.yml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/.github/workflows/python-PyCTBN-package.yml b/.github/workflows/python-PyCTBN-package.yml index 5d3cf42..5b78767 100644 --- a/.github/workflows/python-PyCTBN-package.yml +++ b/.github/workflows/python-PyCTBN-package.yml @@ -44,16 +44,3 @@ jobs: - name: Test with pytest run: | pytest PyCTBN/tests/ - run: | - python -m build --sdist --wheel --outdir dist/. - git config --local user.email "f.martini@campus.unimib.it" - git config --local user.name "philipMartini" - git add . - git commit -m "Create New Realease at dist/" -a || true - # The above command will fail if no changes were present, so we ignore - # that. - - name: Push changes - uses: ad-m/github-push-action@master - with: - branch: master - github_token: ${{ secrets.PYCTBN_TOK }} From 37c5468e4cc6dbf1562a256cfe97e8cbba322b18 Mon Sep 17 00:00:00 2001 From: Luca Moretti Date: Sun, 14 Mar 2021 19:07:49 +0100 Subject: [PATCH 066/139] test commit --- PyCTBN/tests/utility/test_cache.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PyCTBN/tests/utility/test_cache.py b/PyCTBN/tests/utility/test_cache.py index 5d9c766..087750d 100644 --- a/PyCTBN/tests/utility/test_cache.py +++ b/PyCTBN/tests/utility/test_cache.py @@ -53,5 +53,5 @@ class TestCache(unittest.TestCase): self.assertFalse(c1._actual_cache) -if __name__ == '__main__': +if __name__ == '__main__': unittest.main() From 9de3b2a3906797f3e7b7807aad6c727eb44459f3 Mon Sep 17 00:00:00 2001 From: Luca Moretti Date: Sun, 14 Mar 2021 19:10:16 +0100 Subject: [PATCH 067/139] test commit --- PyCTBN/tests/utility/test_cache.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PyCTBN/tests/utility/test_cache.py b/PyCTBN/tests/utility/test_cache.py index 087750d..5d9c766 100644 --- a/PyCTBN/tests/utility/test_cache.py +++ b/PyCTBN/tests/utility/test_cache.py @@ -53,5 +53,5 @@ class TestCache(unittest.TestCase): self.assertFalse(c1._actual_cache) -if __name__ == '__main__': +if __name__ == '__main__': unittest.main() From f3ad55cb51d7df72798065724f169f6c29834e48 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 18:14:05 +0000 Subject: [PATCH 068/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index ac18e18a57337cded8e386d80da1ca1b07d22267..a706946cbb5b8583a9b81b78fc737c361edeb08c 100644 GIT binary patch delta 6165 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 ReYkwRrm3KHZzg+|{SSxt3i$v4 delta 6187 zcmbVQc|cX=ws(CBhe;0SfDFnE0y2XP0wSP@SAozlD^ozg18zBj0XK3&v!@;eMHc!w zG*GvCHoT;EU9uD~%gjPC>sB|l=gphFx~Sc>GzZ?=-vs#|)dmrB2 zV*BnE+jeJ9aL0^l57y|$f35*Hx7J3Txw5pjVrg}2qh0Zm>SZN`<|WHkaKEX{9bwma zL!-mo$7jr+eqUtG(&`#g^1>ZYdb37P{@iNtG_*EaEn88#w63+$TB`Bad%@Gc(PnAg z5_6TXYE`|ornaiJaqNH{2{_NwL(TN+WcB52)Tmh*UpXW1`PxUR7~)PvPf(T(aW`(i zp%e^qyIJmfW$6&-vG=@U9^yj#@|DsdF6{erO34s6YrVfxIK<`r?LEa*G{hEfJ){&5 zaVy@LqbwQXDvMhbqIY{HqpawTx4X_Ky8X5Q*eGvBtAIN*b-=uk^UZddeT%p77~j` zg2HfDh!MMEY;anPE2$)4K;R5K5}JkA0t0YoNDNv<#o0ECO8(z2@uFYEAN_;}`TRe8 zX?+^-@KWk!Y$Gk7i{OcY4VQ%0f{MjM=g zE5j>E)g2Z%)fB=-8jdjzR8`?`bhBbcub4!<5*seMp*6`pB@n}6r?SRCTp8hk$738w ztrV5mAoQdrL0p_@`Gm<8sMRJ2bK@uATd^sa6F(ad#Ld#$#u}&7aVT$Az!jSl#z2B# zi)@)47KM)yvm)ojof6O{m=eGZF%jA%QPii&piaYf1kYwbx*@lc53~!Ou)y|190`GFf^o_@DeFyqdy)> zUyMi70&r@^PVAo%fQ|bja9M^Pqo+TN9vNg{`g3T`3c#uv+cB5q@h5$8dgdc&nI3@M znPqsIbmq)_8j4yn{W0~t3wmee;XkJaU~|@bv7eO0(G;h)o0NGPrOmris8QPdDQ1n* z#!6YOQQ9t2EE=WlA%$y{wu6)xHA?HAqH2`ZBjt!jY1LCsX_U5dlye%TtsCX1(Gm1l z+cnBf?NHk@if#=35tSQ9RBhv!n#z*u*0rr6O1XMyRyd$m`4omGd~p&DaE-<>{K zHs=tOtAW{nV%m|qF1Jp|RGU0Aprx#m${v8adHL9Gmbcf^&n)}os2}a7+B$5iq;ZbGFZbr7 zV}s1{zI_yqV}s1{#i!aOll_`29%ysoMGt@rDn&+Bedco^QTMdjF->26`}uK_IQzmI zQuORg>i|FMNx-7kBzj!dq{X0LvD@UK#%={>26P49*C=1I&(J$(2bDcaoioFtNu zYy_NjK_*r;BNP`L%}4)#1gbqpg8_=soExPEe%L^ydf?b4?L^<;NB*37dpnH9-+6Z{~{RC`#U*M(j94L#+{Wzj#p+x-ZuNdhPeZwy(ZIhnEBKsju6iOwIlK zMns$pjmJ|L@^Rt3K+O8bSw;Kk z$Q~osR`zJIv$Ac(!phc(ZIx{+RuysDo+1@(NfD=QsB9~-o=8R8P1)9BF=d0;N+i=Z zQZ^Iohz^%y<99P0HFt|!l?}9$mM9f??mJH?#oxd4bkUR-({{3UqP=B9f0imm7WLb%qh={mZ`O^q)&Im4N1h?5v-qX@(RxBg9ts}Um;hbIsLvJm)V2jlM zxp*7sJ@oze@lb)Dmoi|PT5#!GA1LUUri1;7I&HC2BD^yOym?_dc<_do!N5<=rl&ov z!N|+!fI~-d8uYn9DW5wZ(x9ZHc|O!kfI?0fpgkl`{D7XhbmUaQ4r?%Voc}ZIje_Ei z$6tcuu3p;qrxI$bpFq}46q&f?yx=h8Jfcx3|<;Hx`f7A)gOJ7FP#cNZ)tXy}3(g8nY3 zBdF_!CkSqJ!zOF-PK@DGjzbu>{}7B-|FXdqePIsD*Dlm{A&ui7e;}p&%KI>pZ+{ldU;YVvFz;G4-+mIT zNvJ;tj}usqK?8xyN3cVxK4jnp4$PfbegitZay_4W9|srGn0y?X2|hRu+X?1>3{Ok_ zQUiC2AbqD35Ke;B6YwwrKLKVbHye0UBK$Pe0zH#fz(g;LM{|=pVMF>*mN4!5RCqeN?XA5K7;uLFMI|Hf&L7n z6U;pWSp@tHEF!pe2Bs4veom86z&Csjg#;HqC({KT?q7i33(P#^-*7*{>VLyZg1&!4 z3BkNyC|WZ=@(ZjZNWVsY&HV5+SZ*yohu-2&ec-D-G+}(~Ot9xyZ&K6DeCu^6BKX&J zSS%F}^XBW2%`azx-9UzB{_3wn$>BFhBHgUtAcf$G-yoCVBMA;SUZ$Jh?%MF-A zaP9_;u9;7{38e&2-=s#G`ENI2p?H#&i$?AfOl7b79Wtf!OMLAun8WucFej<<<2{ua zUV00h$w1vLD3sExMxGW#20AZ-j(6ulGVi}AvYK`qN~OhL`OnuOg!kTtXu1k_M3gh{ zP@m1b^$rwBL(G{c(=_wwe25*a%)Gl$KuYa*VKTwRyAVW6#lD{!S;8Oer;JMYp?=t+ z6JM4d&V1b`;Ld-T523prhVeW9let65&Th7W)TRTgCip8b3qd+#j}g4XSRsM?XrZ!q zG}}&G=oq$(;0S@Wu$#!E#xRTR`uFpfP;aB&=~BUtRpkl<%mwu4}!8{0-;bf?@+{1tarE<8ZD zX7@o}>A{@ne7y&&An5a8s|d=+vsQvT<5>$q^91U?iTir8-2?|cg=UZ!)yu@W7j?nJ zy}VhCPK0~GnKyS)_U+zm0SR~2uST#E8J=?_tq~Kij%3LMuSc>ZDCR#z zvKa*7QS{&x^K}w>CHP0PxpY_^&1MoDjAr)}IK;5UI`Jd8b|8W+F~Y>BF_fDStace1 zJ8OP2mL>A$Smr@@Ux{Ta2|OpW)l&0G7rydKszTTSC>tyHmawpyCZn6q-P`Gv))q&t z62}cLJk3aTzxyi0@Y`|BK*k*7*-~pEZRQ(-smHIYFopNVGkX%Aji;F@<~a$hLh9_{ z^AhMmd*&^$<35RlcAs+LJFb(v{o2(viOi1fY)+(UE#|)`(kK@5x+!dpjA6fv_Q5a^ zL&QPQ^KUz75fmgbom6;rc=jSv(()MSPBH%`iOrIVZ@BOyK5RU9JOojLk5w^Wl}ziJ zB2Q*ZrP{kLLn|yxCUIDst~`D#MHFD{R2EAY(xsbX3eQ$y~x$DKMe&>kVJ93ib7CgmG6OT`_}X0Uzie*ueF26g}d From f7464e39d0089b3c2eddbfea4fbda74d8db4247a Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 18:23:40 +0000 Subject: [PATCH 069/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index a706946cbb5b8583a9b81b78fc737c361edeb08c..9627ce7c00df2706663d9285fc8a925324199e6c 100644 GIT binary patch delta 4950 zcmb7Hd03TI8u$H_eY^L93JHSTE3(5SK@r&$VFFPQ&BWxQ2*L-54p>eoWK-%zNaO`i z*;urhHcnAr4b!IB%&1R2qPV1Hs3_(ZE~P1zG4FSdTw$8|qks6F_ndd%zRSn!?LJ;_ z*W&6q+%e-%Q)f?^5n7R7UQymyYgL|Kv0@npc=}?or#(uWJ-ljd^H(k`T~?A$&rbKb z1vJ)aoDJ`+kuZ_LG5|Hoqn>u}}?_3+2TY3a#Iiiylz*ioECn z_5B*zWT9S6e*wFErsC%YJ^BQ@;0S#pj*AM$&Hg%UGumRDaRl!5pM$r@j>fpL9yrc_ zD((qPb{!rX8YXfXW-=8mEvhh?@Ke8Vv<;n%bI0l$3=SCT>w(>4LU6V*6zA&4qg7ZW z*7@o%BSecI`8z=wmkj*FOT?LIUxYK`+&&(?J&m?7 z1=Aw~S-lJ+us&)S&L1}(Rm0OGAHgjFu4-ebebn}FB1Cb{Tsz4gbAyNB-Y6|Dh}7WZ zhpEk|1yg*J!H-x*p)q6;k{Rj^bv6bTW^dFaOUt^)7yEC+I;2 zz=+Ey_~7mdR@f8mgk=-LC}9q`G&;zVoALKKM&Jg$k>U-;+(`~tIbj5s+8rH+*C*!V zWq)TOxEMhSQngGZjaS*Rrq8A&13xQI5kd>m1~1gn^1sTlk}K|zW8av z0{myZ9w#R@p+}+-!>737-?lqqQKE|yKII@_N1`4h+kJ3K(tNx)O|P^ijRP!A)?@5x zHyoWj6Z@v>u|BybMO|ic=1}^hcD!s-Pin8prRqs-9l26HshuF3)swooWTu|fr6s?q zo(gbbidTTTi{ws~R`-y6RXwRYNbXfn>i&^!hS49B@>WW_Ew)yap>3=lZ8Ed)`YJ8% zTH&fxWd;HfI`nDs#*?#JAYZA;`chJ_lqHY)YH>wI*?=q!N58@>%+53@TMH?`>`X1L zPWM)B6@9=7<)h*|;XXV5*FN?#vXP*N!FDauMS7A%3NQ2ipve;6p!>aVrO2v9|kO;-6=5ukl zwPC+FwAURKe9wQV!SEUv)^-nEu>A|2a%*F@V9DLI3b5f|8THKytUe<2cO#{_`iPq5 zgOH=#Xxb~Oq_Y2oazMwmWz<+9czjD1I@bt+884AT&NafJH~-Qih_sy}@ZDw&%bf#m zDCg=F0*a+W2HtMzs8|&VF zpA$;j&MV^fD_-ceJqnxWOr-WN zN5>sw@j&~(vAwel+mc4$$U|B9#%Y7{{Gkaz2d(l|#}09*Kk|+^%sjSD9ITJ;x5kvN zD9mk)rm?0rwqPN>lU@9_-4(?d=9kK6gG(ov5^-e4Ns3 z`7EW`@Igwm<5NVGIzq&v&JR)QMoY8eONv<3b&_Vyzw2qh2Z`R)DN2+02+^epYtLsu zK6ak>gdF_od>FYD*ln!l6P8P?oWEX9w&I(Ke@^S=KMbN$2T{`pQS0o5oa$!1Y#u~y z7(~?#q+DcMjS%FH6e*XxBP1GN&x>Pxptv>827GLwwAJJc>%wi+eX^j@pY1ZjXl6

I(-@3 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 From 09ef96a82d4925ab729f98df5b9b421adb5a263e Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 18:32:45 +0000 Subject: [PATCH 070/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 9627ce7c00df2706663d9285fc8a925324199e6c..143ccb404b8accff4f6d980090bd0c16b8fce134 100644 GIT binary patch delta 7451 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 delta 7420 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 Date: Sun, 14 Mar 2021 18:41:41 +0000 Subject: [PATCH 071/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 143ccb404b8accff4f6d980090bd0c16b8fce134..4c0bdf030f4d3659a39b5d0b0fd3962a40afd3fc 100644 GIT binary patch delta 7188 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 Date: Sun, 14 Mar 2021 19:41:45 +0100 Subject: [PATCH 072/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index bc23a91..3cc50f5 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -3,7 +3,7 @@ on: push: # Sequence of patterns matched against refs/tags tags: - - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10 + - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10 name: Upload Release Asset @@ -53,8 +53,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.PYCTBN_TOK }} with: - tag_name: ver.${{ github.ref }} - release_name: Release ver. ${{ github.ref }} + tag_name: ${{ github.ref }} + release_name: Release ${{ github.ref }} draft: false prerelease: false - name: Upload Release Asset From eb3cb170d804c25fdf3101954f2e6083ee3c4b50 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 18:44:11 +0000 Subject: [PATCH 073/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 4c0bdf030f4d3659a39b5d0b0fd3962a40afd3fc..f3b18a654f50fd524e59ff60275f88bdcbad35ce 100644 GIT binary patch delta 7443 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 s6bu+Ad0_rjD;@vNfW6!gH1DY|ayZ`_I delta 7457 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

  • GMY8BZx0`$(7&rhmW2y_#{J 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 z%0D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 W(ccpPzl)^+U|`SoM@M2rMfxuob^I~_ From 1665c3ee06edf21301cf4fccbafbc704010b96c5 Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sun, 14 Mar 2021 21:07:26 +0100 Subject: [PATCH 085/139] Delete build/lib/PyCTBN directory --- build/lib/PyCTBN/PyCTBN/__init__.py | 8 - .../lib/PyCTBN/PyCTBN/estimators/__init__.py | 5 - .../PyCTBN/estimators/fam_score_calculator.py | 265 ---------------- .../PyCTBN/estimators/parameters_estimator.py | 117 ------- .../structure_constraint_based_estimator.py | 246 --------------- .../PyCTBN/estimators/structure_estimator.py | 183 ----------- .../structure_score_based_estimator.py | 236 -------------- .../lib/PyCTBN/PyCTBN/optimizers/__init__.py | 4 - .../optimizers/constraint_based_optimizer.py | 84 ----- .../PyCTBN/optimizers/hill_climbing_search.py | 135 -------- .../lib/PyCTBN/PyCTBN/optimizers/optimizer.py | 39 --- .../PyCTBN/PyCTBN/optimizers/tabu_search.py | 188 ----------- .../PyCTBN/PyCTBN/structure_graph/__init__.py | 6 - .../conditional_intensity_matrix.py | 42 --- .../PyCTBN/structure_graph/network_graph.py | 293 ------------------ .../PyCTBN/structure_graph/sample_path.py | 93 ------ .../PyCTBN/structure_graph/set_of_cims.py | 97 ------ .../PyCTBN/structure_graph/structure.py | 124 -------- .../PyCTBN/structure_graph/trajectory.py | 45 --- build/lib/PyCTBN/PyCTBN/utility/__init__.py | 4 - .../PyCTBN/utility/abstract_importer.py | 163 ---------- build/lib/PyCTBN/PyCTBN/utility/cache.py | 54 ---- .../PyCTBN/PyCTBN/utility/json_importer.py | 181 ----------- .../PyCTBN/PyCTBN/utility/sample_importer.py | 62 ---- build/lib/PyCTBN/__init__.py | 2 - build/lib/PyCTBN/basic_main.py | 39 --- build/lib/PyCTBN/setup.py | 20 -- 27 files changed, 2735 deletions(-) delete mode 100644 build/lib/PyCTBN/PyCTBN/__init__.py delete mode 100644 build/lib/PyCTBN/PyCTBN/estimators/__init__.py delete mode 100644 build/lib/PyCTBN/PyCTBN/estimators/fam_score_calculator.py delete mode 100644 build/lib/PyCTBN/PyCTBN/estimators/parameters_estimator.py delete mode 100644 build/lib/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py delete mode 100644 build/lib/PyCTBN/PyCTBN/estimators/structure_estimator.py delete mode 100644 build/lib/PyCTBN/PyCTBN/estimators/structure_score_based_estimator.py delete mode 100644 build/lib/PyCTBN/PyCTBN/optimizers/__init__.py delete mode 100644 build/lib/PyCTBN/PyCTBN/optimizers/constraint_based_optimizer.py delete mode 100644 build/lib/PyCTBN/PyCTBN/optimizers/hill_climbing_search.py delete mode 100644 build/lib/PyCTBN/PyCTBN/optimizers/optimizer.py delete mode 100644 build/lib/PyCTBN/PyCTBN/optimizers/tabu_search.py delete mode 100644 build/lib/PyCTBN/PyCTBN/structure_graph/__init__.py delete mode 100644 build/lib/PyCTBN/PyCTBN/structure_graph/conditional_intensity_matrix.py delete mode 100644 build/lib/PyCTBN/PyCTBN/structure_graph/network_graph.py delete mode 100644 build/lib/PyCTBN/PyCTBN/structure_graph/sample_path.py delete mode 100644 build/lib/PyCTBN/PyCTBN/structure_graph/set_of_cims.py delete mode 100644 build/lib/PyCTBN/PyCTBN/structure_graph/structure.py delete mode 100644 build/lib/PyCTBN/PyCTBN/structure_graph/trajectory.py delete mode 100644 build/lib/PyCTBN/PyCTBN/utility/__init__.py delete mode 100644 build/lib/PyCTBN/PyCTBN/utility/abstract_importer.py delete mode 100644 build/lib/PyCTBN/PyCTBN/utility/cache.py delete mode 100644 build/lib/PyCTBN/PyCTBN/utility/json_importer.py delete mode 100644 build/lib/PyCTBN/PyCTBN/utility/sample_importer.py delete mode 100644 build/lib/PyCTBN/__init__.py delete mode 100644 build/lib/PyCTBN/basic_main.py delete mode 100644 build/lib/PyCTBN/setup.py diff --git a/build/lib/PyCTBN/PyCTBN/__init__.py b/build/lib/PyCTBN/PyCTBN/__init__.py deleted file mode 100644 index faff79c..0000000 --- a/build/lib/PyCTBN/PyCTBN/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -import PyCTBN.PyCTBN.estimators -from PyCTBN.PyCTBN.estimators import * -import PyCTBN.PyCTBN.optimizers -from PyCTBN.PyCTBN.optimizers import * -import PyCTBN.PyCTBN.structure_graph -from PyCTBN.PyCTBN.structure_graph import * -import PyCTBN.PyCTBN.utility -from PyCTBN.PyCTBN.utility import * \ No newline at end of file diff --git a/build/lib/PyCTBN/PyCTBN/estimators/__init__.py b/build/lib/PyCTBN/PyCTBN/estimators/__init__.py deleted file mode 100644 index 112086f..0000000 --- a/build/lib/PyCTBN/PyCTBN/estimators/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from .fam_score_calculator import FamScoreCalculator -from .parameters_estimator import ParametersEstimator -from .structure_estimator import StructureEstimator -from .structure_constraint_based_estimator import StructureConstraintBasedEstimator -from .structure_score_based_estimator import StructureScoreBasedEstimator diff --git a/build/lib/PyCTBN/PyCTBN/estimators/fam_score_calculator.py b/build/lib/PyCTBN/PyCTBN/estimators/fam_score_calculator.py deleted file mode 100644 index d8ec3a0..0000000 --- a/build/lib/PyCTBN/PyCTBN/estimators/fam_score_calculator.py +++ /dev/null @@ -1,265 +0,0 @@ - -import itertools -import json -import typing - -import networkx as nx -import numpy as np -from networkx.readwrite import json_graph - -from math import log - -from scipy.special import loggamma -from random import choice - -from ..structure_graph.set_of_cims import SetOfCims -from ..structure_graph.network_graph import NetworkGraph -from ..structure_graph.conditional_intensity_matrix import ConditionalIntensityMatrix - - -''' - -''' - - -class FamScoreCalculator: - """ - Has the task of calculating the FamScore of a node by using a Bayesian score function - """ - - def __init__(self): - #np.seterr('raise') - pass - - # region theta - - def marginal_likelihood_theta(self, - cims: ConditionalIntensityMatrix, - alpha_xu: float, - alpha_xxu: float): - """ - Calculate the FamScore value of the node identified by the label node_id - - :param cims: np.array with all the node's cims - :type cims: np.array - :param alpha_xu: hyperparameter over the CTBN’s q parameters, default to 0.1 - :type alpha_xu: float - :param alpha_xxu: distribuited hyperparameter over the CTBN’s theta parameters - :type alpha_xxu: float - - :return: the value of the marginal likelihood over theta - :rtype: float - """ - return np.sum( - [self.variable_cim_xu_marginal_likelihood_theta(cim, - alpha_xu, - alpha_xxu) - for cim in cims]) - - def variable_cim_xu_marginal_likelihood_theta(self, - cim: ConditionalIntensityMatrix, - alpha_xu: float, - alpha_xxu: float): - """ - Calculate the value of the marginal likelihood over theta given a cim - - :param cim: A conditional_intensity_matrix object with the sufficient statistics - :type cim: class:'ConditionalIntensityMatrix' - :param alpha_xu: hyperparameter over the CTBN’s q parameters, default to 0.1 - :type alpha_xu: float - :param alpha_xxu: distribuited hyperparameter over the CTBN’s theta parameters - :type alpha_xxu: float - - :return: the value of the marginal likelihood over theta - :rtype: float - """ - - 'get cim length' - values = len(cim._state_residence_times) - - 'compute the marginal likelihood for the current cim' - return np.sum([ - self.single_cim_xu_marginal_likelihood_theta( - index, - cim, - alpha_xu, - alpha_xxu) - for index in range(values)]) - - def single_cim_xu_marginal_likelihood_theta(self, - index: int, - cim: ConditionalIntensityMatrix, - alpha_xu: float, - alpha_xxu: float): - """ - Calculate the marginal likelihood on q of the node when assumes a specif value - and a specif parents's assignment - - :param cim: A conditional_intensity_matrix object with the sufficient statistics - :type cim: class:'ConditionalIntensityMatrix' - :param alpha_xu: hyperparameter over the CTBN’s q parameters - :type alpha_xu: float - :param alpha_xxu: distribuited hyperparameter over the CTBN’s theta parameters - :type alpha_xxu: float - - :return: the value of the marginal likelihood over theta when the node assumes a specif value - :rtype: float - """ - - values = list(range(len(cim._state_residence_times))) - - 'remove the index because of the x != x^ condition in the summation ' - values.remove(index) - - 'uncomment for alpha xx not uniform' - #alpha_xxu = alpha_xu * cim.state_transition_matrix[index,index_x_first] / cim.state_transition_matrix[index, index]) - - return (loggamma(alpha_xu) - loggamma(alpha_xu + cim.state_transition_matrix[index, index])) \ - + \ - np.sum([self.single_internal_cim_xxu_marginal_likelihood_theta( - cim.state_transition_matrix[index,index_x_first], - alpha_xxu) - for index_x_first in values]) - - - def single_internal_cim_xxu_marginal_likelihood_theta(self, - M_xxu_suff_stats: float, - alpha_xxu: float=1): - """Calculate the second part of the marginal likelihood over theta formula - - :param M_xxu_suff_stats: value of the suffucient statistic M[xx'|u] - :type M_xxu_suff_stats: float - :param alpha_xxu: distribuited hyperparameter over the CTBN’s theta parameters - :type alpha_xxu: float - - :return: the value of the marginal likelihood over theta when the node assumes a specif value - :rtype: float - """ - return loggamma(alpha_xxu+M_xxu_suff_stats) - loggamma(alpha_xxu) - - # endregion - - # region q - - def marginal_likelihood_q(self, - cims: np.array, - tau_xu: float=0.1, - alpha_xu: float=1): - """ - Calculate the value of the marginal likelihood over q of the node identified by the label node_id - - :param cims: np.array with all the node's cims - :type cims: np.array - :param tau_xu: hyperparameter over the CTBN’s q parameters - :type tau_xu: float - :param alpha_xu: hyperparameter over the CTBN’s q parameters - :type alpha_xu: float - - - :return: the value of the marginal likelihood over q - :rtype: float - """ - - return np.sum([self.variable_cim_xu_marginal_likelihood_q(cim, tau_xu, alpha_xu) for cim in cims]) - - def variable_cim_xu_marginal_likelihood_q(self, - cim: ConditionalIntensityMatrix, - tau_xu: float=0.1, - alpha_xu: float=1): - """ - Calculate the value of the marginal likelihood over q given a cim - - :param cim: A conditional_intensity_matrix object with the sufficient statistics - :type cim: class:'ConditionalIntensityMatrix' - :param tau_xu: hyperparameter over the CTBN’s q parameters - :type tau_xu: float - :param alpha_xu: hyperparameter over the CTBN’s q parameters - :type alpha_xu: float - - - :return: the value of the marginal likelihood over q - :rtype: float - """ - - 'get cim length' - values=len(cim._state_residence_times) - - 'compute the marginal likelihood for the current cim' - return np.sum([ - self.single_cim_xu_marginal_likelihood_q( - cim.state_transition_matrix[index, index], - cim._state_residence_times[index], - tau_xu, - alpha_xu) - for index in range(values)]) - - - def single_cim_xu_marginal_likelihood_q(self, - M_xu_suff_stats: float, - T_xu_suff_stats: float, - tau_xu: float=0.1, - alpha_xu: float=1): - """ - Calculate the marginal likelihood on q of the node when assumes a specif value - and a specif parents's assignment - - :param M_xu_suff_stats: value of the suffucient statistic M[x|u] - :type M_xxu_suff_stats: float - :param T_xu_suff_stats: value of the suffucient statistic T[x|u] - :type T_xu_suff_stats: float - :param cim: A conditional_intensity_matrix object with the sufficient statistics - :type cim: class:'ConditionalIntensityMatrix' - :param tau_xu: hyperparameter over the CTBN’s q parameters - :type tau_xu: float - :param alpha_xu: hyperparameter over the CTBN’s q parameters - :type alpha_xu: float - - - :return: the value of the marginal likelihood of the node when assumes a specif value - :rtype: float - """ - return ( - loggamma(alpha_xu + M_xu_suff_stats + 1) + - (log(tau_xu) - * - (alpha_xu+1)) - ) \ - - \ - (loggamma(alpha_xu + 1)+( - log(tau_xu + T_xu_suff_stats) - * - (alpha_xu + M_xu_suff_stats + 1)) - ) - - # end region - - def get_fam_score(self, - cims: np.array, - tau_xu: float=0.1, - alpha_xu: float=1): - """ - Calculate the FamScore value of the node - - - :param cims: np.array with all the node's cims - :type cims: np.array - :param tau_xu: hyperparameter over the CTBN’s q parameters, default to 0.1 - :type tau_xu: float, optional - :param alpha_xu: hyperparameter over the CTBN’s q parameters, default to 1 - :type alpha_xu: float, optional - - - :return: the FamScore value of the node - :rtype: float - """ - - 'calculate alpha_xxu as a uniform distribution' - alpha_xxu = alpha_xu /(len(cims[0]._state_residence_times) - 1) - - return self.marginal_likelihood_q(cims, - tau_xu, - alpha_xu) \ - + \ - self.marginal_likelihood_theta(cims, - alpha_xu, - alpha_xxu) diff --git a/build/lib/PyCTBN/PyCTBN/estimators/parameters_estimator.py b/build/lib/PyCTBN/PyCTBN/estimators/parameters_estimator.py deleted file mode 100644 index 6b6883b..0000000 --- a/build/lib/PyCTBN/PyCTBN/estimators/parameters_estimator.py +++ /dev/null @@ -1,117 +0,0 @@ -import sys -sys.path.append('../') -import numpy as np - -from ..structure_graph.network_graph import NetworkGraph -from ..structure_graph.set_of_cims import SetOfCims -from ..structure_graph.trajectory import Trajectory - - -class ParametersEstimator(object): - """Has the task of computing the cims of particular node given the trajectories and the net structure - in the graph ``_net_graph``. - - :param trajectories: the trajectories - :type trajectories: Trajectory - :param net_graph: the net structure - :type net_graph: NetworkGraph - :_single_set_of_cims: the set of cims object that will hold the cims of the node - """ - - def __init__(self, trajectories: Trajectory, net_graph: NetworkGraph): - """Constructor Method - """ - self._trajectories = trajectories - self._net_graph = net_graph - self._single_set_of_cims = None - - def fast_init(self, node_id: str) -> None: - """Initializes all the necessary structures for the parameters estimation for the node ``node_id``. - - :param node_id: the node label - :type node_id: string - """ - p_vals = self._net_graph._aggregated_info_about_nodes_parents[2] - node_states_number = self._net_graph.get_states_number(node_id) - self._single_set_of_cims = SetOfCims(node_id, p_vals, node_states_number, self._net_graph.p_combs) - - def compute_parameters_for_node(self, node_id: str) -> SetOfCims: - """Compute the CIMS of the node identified by the label ``node_id``. - - :param node_id: the node label - :type node_id: string - :return: A SetOfCims object filled with the computed CIMS - :rtype: SetOfCims - """ - node_indx = self._net_graph.get_node_indx(node_id) - state_res_times = self._single_set_of_cims._state_residence_times - transition_matrices = self._single_set_of_cims._transition_matrices - ParametersEstimator.compute_state_res_time_for_node(self._trajectories.times, - self._trajectories.trajectory, - self._net_graph.time_filtering, - self._net_graph.time_scalar_indexing_strucure, - state_res_times) - ParametersEstimator.compute_state_transitions_for_a_node(node_indx, self._trajectories.complete_trajectory, - self._net_graph.transition_filtering, - self._net_graph.transition_scalar_indexing_structure, - transition_matrices) - self._single_set_of_cims.build_cims(state_res_times, transition_matrices) - return self._single_set_of_cims - - @staticmethod - def compute_state_res_time_for_node(times: np.ndarray, trajectory: np.ndarray, - cols_filter: np.ndarray, scalar_indexes_struct: np.ndarray, - T: np.ndarray) -> None: - """Compute the state residence times for a node and fill the matrix ``T`` with the results - - :param node_indx: the index of the node - :type node_indx: int - :param times: the times deltas vector - :type times: numpy.array - :param trajectory: the trajectory - :type trajectory: numpy.ndArray - :param cols_filter: the columns filtering structure - :type cols_filter: numpy.array - :param scalar_indexes_struct: the indexing structure - :type scalar_indexes_struct: numpy.array - :param T: the state residence times vectors - :type T: numpy.ndArray - """ - T[:] = np.bincount(np.sum(trajectory[:, cols_filter] * scalar_indexes_struct / scalar_indexes_struct[0], axis=1) - .astype(np.int), \ - times, - minlength=scalar_indexes_struct[-1]).reshape(-1, T.shape[1]) - - @staticmethod - def compute_state_transitions_for_a_node(node_indx: int, trajectory: np.ndarray, cols_filter: np.ndarray, - scalar_indexing: np.ndarray, M: np.ndarray) -> None: - """Compute the state residence times for a node and fill the matrices ``M`` with the results. - - :param node_indx: the index of the node - :type node_indx: int - :param trajectory: the trajectory - :type trajectory: numpy.ndArray - :param cols_filter: the columns filtering structure - :type cols_filter: numpy.array - :param scalar_indexing: the indexing structure - :type scalar_indexing: numpy.array - :param M: the state transitions matrices - :type M: numpy.ndArray - """ - diag_indices = np.array([x * M.shape[1] + x % M.shape[1] for x in range(M.shape[0] * M.shape[1])], - dtype=np.int64) - trj_tmp = trajectory[trajectory[:, int(trajectory.shape[1] / 2) + node_indx].astype(np.int) >= 0] - M[:] = np.bincount(np.sum(trj_tmp[:, cols_filter] * scalar_indexing / scalar_indexing[0], axis=1).astype(np.int) - , minlength=scalar_indexing[-1]).reshape(-1, M.shape[1], M.shape[2]) - M_raveled = M.ravel() - M_raveled[diag_indices] = 0 - M_raveled[diag_indices] = np.sum(M, axis=2).ravel() - - - - - - - - - diff --git a/build/lib/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py b/build/lib/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py deleted file mode 100644 index 0013d80..0000000 --- a/build/lib/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py +++ /dev/null @@ -1,246 +0,0 @@ - -import itertools -import json -import typing - -import networkx as nx -import numpy as np -from networkx.readwrite import json_graph -import os -from scipy.stats import chi2 as chi2_dist -from scipy.stats import f as f_dist -from tqdm import tqdm - -from ..utility.cache import Cache -from ..structure_graph.conditional_intensity_matrix import ConditionalIntensityMatrix -from ..structure_graph.network_graph import NetworkGraph -from .parameters_estimator import ParametersEstimator -from .structure_estimator import StructureEstimator -from ..structure_graph.sample_path import SamplePath -from ..structure_graph.structure import Structure -from ..optimizers.constraint_based_optimizer import ConstraintBasedOptimizer - -import concurrent.futures - - - -import multiprocessing -from multiprocessing import Pool - - -class StructureConstraintBasedEstimator(StructureEstimator): - """ - Has the task of estimating the network structure given the trajectories in samplepath by using a constraint-based approach. - - :param sample_path: the _sample_path object containing the trajectories and the real structure - :type sample_path: SamplePath - :param exp_test_alfa: the significance level for the exponential Hp test - :type exp_test_alfa: float - :param chi_test_alfa: the significance level for the chi Hp test - :type chi_test_alfa: float - :param known_edges: the prior known edges in the net structure if present - :type known_edges: List - :param thumb_threshold: the threshold value to consider a valid independence test - :type thumb_threshold: int - :_nodes: the nodes labels - :_nodes_vals: the nodes cardinalities - :_nodes_indxs: the nodes indexes - :_complete_graph: the complete directed graph built using the nodes labels in ``_nodes`` - :_cache: the Cache object - """ - - def __init__(self, sample_path: SamplePath, exp_test_alfa: float, chi_test_alfa: float,known_edges: typing.List= [], - thumb_threshold:int = 25): - super().__init__(sample_path,known_edges) - self._exp_test_sign = exp_test_alfa - self._chi_test_alfa = chi_test_alfa - self._thumb_threshold = thumb_threshold - self._cache = Cache() - - def complete_test(self, test_parent: str, test_child: str, parent_set: typing.List, child_states_numb: int, - tot_vars_count: int, parent_indx, child_indx) -> bool: - """Performs a complete independence test on the directed graphs G1 = {test_child U parent_set} - G2 = {G1 U test_parent} (added as an additional parent of the test_child). - Generates all the necessary structures and datas to perform the tests. - - :param test_parent: the node label of the test parent - :type test_parent: string - :param test_child: the node label of the child - :type test_child: string - :param parent_set: the common parent set - :type parent_set: List - :param child_states_numb: the cardinality of the ``test_child`` - :type child_states_numb: int - :param tot_vars_count: the total number of variables in the net - :type tot_vars_count: int - :return: True iff test_child and test_parent are independent given the sep_set parent_set. False otherwise - :rtype: bool - """ - p_set = parent_set[:] - complete_info = parent_set[:] - complete_info.append(test_child) - - parents = np.array(parent_set) - parents = np.append(parents, test_parent) - sorted_parents = self._nodes[np.isin(self._nodes, parents)] - cims_filter = sorted_parents != test_parent - - p_set.insert(0, test_parent) - sofc2 = self._cache.find(set(p_set)) - - if not sofc2: - complete_info.append(test_parent) - bool_mask2 = np.isin(self._nodes, complete_info) - l2 = list(self._nodes[bool_mask2]) - indxs2 = self._nodes_indxs[bool_mask2] - vals2 = self._nodes_vals[bool_mask2] - eds2 = list(itertools.product(p_set, test_child)) - s2 = Structure(l2, indxs2, vals2, eds2, tot_vars_count) - g2 = NetworkGraph(s2) - g2.fast_init(test_child) - p2 = ParametersEstimator(self._sample_path.trajectories, g2) - p2.fast_init(test_child) - sofc2 = p2.compute_parameters_for_node(test_child) - self._cache.put(set(p_set), sofc2) - - del p_set[0] - sofc1 = self._cache.find(set(p_set)) - if not sofc1: - g2.remove_node(test_parent) - g2.fast_init(test_child) - p2 = ParametersEstimator(self._sample_path.trajectories, g2) - p2.fast_init(test_child) - sofc1 = p2.compute_parameters_for_node(test_child) - self._cache.put(set(p_set), sofc1) - thumb_value = 0.0 - if child_states_numb > 2: - parent_val = self._sample_path.structure.get_states_number(test_parent) - bool_mask_vals = np.isin(self._nodes, parent_set) - parents_vals = self._nodes_vals[bool_mask_vals] - thumb_value = self.compute_thumb_value(parent_val, child_states_numb, parents_vals) - for cim1, p_comb in zip(sofc1.actual_cims, sofc1.p_combs): - cond_cims = sofc2.filter_cims_with_mask(cims_filter, p_comb) - for cim2 in cond_cims: - if not self.independence_test(child_states_numb, cim1, cim2, thumb_value, parent_indx, child_indx): - return False - return True - - def independence_test(self, child_states_numb: int, cim1: ConditionalIntensityMatrix, - cim2: ConditionalIntensityMatrix, thumb_value: float, parent_indx, child_indx) -> bool: - """Compute the actual independence test using two cims. - It is performed first the exponential test and if the null hypothesis is not rejected, - it is performed also the chi_test. - - :param child_states_numb: the cardinality of the test child - :type child_states_numb: int - :param cim1: a cim belonging to the graph without test parent - :type cim1: ConditionalIntensityMatrix - :param cim2: a cim belonging to the graph with test parent - :type cim2: ConditionalIntensityMatrix - :return: True iff both tests do NOT reject the null hypothesis of independence. False otherwise. - :rtype: bool - """ - M1 = cim1.state_transition_matrix - M2 = cim2.state_transition_matrix - r1s = M1.diagonal() - r2s = M2.diagonal() - C1 = cim1.cim - C2 = cim2.cim - if child_states_numb > 2 and (np.sum(np.diagonal(M1)) / thumb_value) < self._thumb_threshold: - self._removable_edges_matrix[parent_indx][child_indx] = False - return False - F_stats = C2.diagonal() / C1.diagonal() - exp_alfa = self._exp_test_sign - for val in range(0, child_states_numb): - if F_stats[val] < f_dist.ppf(exp_alfa / 2, r1s[val], r2s[val]) or \ - F_stats[val] > f_dist.ppf(1 - exp_alfa / 2, r1s[val], r2s[val]): - return False - M1_no_diag = M1[~np.eye(M1.shape[0], dtype=bool)].reshape(M1.shape[0], -1) - M2_no_diag = M2[~np.eye(M2.shape[0], dtype=bool)].reshape( - M2.shape[0], -1) - chi_2_quantile = chi2_dist.ppf(1 - self._chi_test_alfa, child_states_numb - 1) - Ks = np.sqrt(r1s / r2s) - Ls = np.sqrt(r2s / r1s) - for val in range(0, child_states_numb): - Chi = np.sum(np.power(Ks[val] * M2_no_diag[val] - Ls[val] *M1_no_diag[val], 2) / - (M1_no_diag[val] + M2_no_diag[val])) - if Chi > chi_2_quantile: - return False - return True - - def compute_thumb_value(self, parent_val, child_val, parent_set_vals): - """Compute the value to test against the thumb_threshold. - - :param parent_val: test parent's variable cardinality - :type parent_val: int - :param child_val: test child's variable cardinality - :type child_val: int - :param parent_set_vals: the cardinalities of the nodes in the current sep-set - :type parent_set_vals: List - :return: the thumb value for the current independence test - :rtype: int - """ - df = (child_val - 1) ** 2 - df = df * parent_val - for v in parent_set_vals: - df = df * v - return df - - def one_iteration_of_CTPC_algorithm(self, var_id: str, tot_vars_count: int)-> typing.List: - """Performs an iteration of the CTPC algorithm using the node ``var_id`` as ``test_child``. - - :param var_id: the node label of the test child - :type var_id: string - """ - optimizer_obj = ConstraintBasedOptimizer( - node_id = var_id, - structure_estimator = self, - tot_vars_count = tot_vars_count) - return optimizer_obj.optimize_structure() - - - def ctpc_algorithm(self,disable_multiprocessing:bool= False ): - """Compute the CTPC algorithm over the entire net. - """ - ctpc_algo = self.one_iteration_of_CTPC_algorithm - total_vars_numb = self._sample_path.total_variables_count - - n_nodes= len(self._nodes) - - total_vars_numb_array = [total_vars_numb] * n_nodes - - 'get the number of CPU' - cpu_count = multiprocessing.cpu_count() - - - - 'Remove all the edges from the structure' - self._sample_path.structure.clean_structure_edges() - - 'Estimate the best parents for each node' - #with multiprocessing.Pool(processes=cpu_count) as pool: - #with get_context("spawn").Pool(processes=cpu_count) as pool: - if disable_multiprocessing: - print("DISABILITATO") - cpu_count = 1 - list_edges_partial = [ctpc_algo(n,total_vars_numb) for n in self._nodes] - else: - with concurrent.futures.ProcessPoolExecutor(max_workers=cpu_count) as executor: - list_edges_partial = executor.map(ctpc_algo, - self._nodes, - total_vars_numb_array) - - 'Update the graph' - edges = set(itertools.chain.from_iterable(list_edges_partial)) - self._complete_graph = nx.DiGraph() - self._complete_graph.add_edges_from(edges) - - return edges - - - def estimate_structure(self,disable_multiprocessing:bool=False): - return self.ctpc_algorithm(disable_multiprocessing=disable_multiprocessing) - - - - diff --git a/build/lib/PyCTBN/PyCTBN/estimators/structure_estimator.py b/build/lib/PyCTBN/PyCTBN/estimators/structure_estimator.py deleted file mode 100644 index b77e21f..0000000 --- a/build/lib/PyCTBN/PyCTBN/estimators/structure_estimator.py +++ /dev/null @@ -1,183 +0,0 @@ - -import itertools -import json -import typing - -import matplotlib.pyplot as plt -import networkx as nx -import numpy as np -from networkx.readwrite import json_graph - -from abc import ABC -import os -import abc - -from ..utility.cache import Cache -from ..structure_graph.conditional_intensity_matrix import ConditionalIntensityMatrix -from ..structure_graph.network_graph import NetworkGraph -from .parameters_estimator import ParametersEstimator -from ..structure_graph.sample_path import SamplePath -from ..structure_graph.structure import Structure - - -class StructureEstimator(object): - """Has the task of estimating the network structure given the trajectories in ``samplepath``. - - :param sample_path: the _sample_path object containing the trajectories and the real structure - :type sample_path: SamplePath - :param known_edges: the prior known edges in the net structure if present - :type known_edges: List - :_nodes: the nodes labels - :_nodes_vals: the nodes cardinalities - :_nodes_indxs: the nodes indexes - :_complete_graph: the complete directed graph built using the nodes labels in ``_nodes`` - """ - - def __init__(self, sample_path: SamplePath, known_edges: typing.List = None): - self._sample_path = sample_path - self._nodes = np.array(self._sample_path.structure.nodes_labels) - self._nodes_vals = self._sample_path.structure.nodes_values - self._nodes_indxs = self._sample_path.structure.nodes_indexes - self._removable_edges_matrix = self.build_removable_edges_matrix(known_edges) - self._complete_graph = StructureEstimator.build_complete_graph(self._sample_path.structure.nodes_labels) - - - def build_removable_edges_matrix(self, known_edges: typing.List): - """Builds a boolean matrix who shows if a edge could be removed or not, based on prior knowledge given: - - :param known_edges: the list of nodes labels - :type known_edges: List - :return: a boolean matrix - :rtype: np.ndarray - """ - tot_vars_count = self._sample_path.total_variables_count - complete_adj_matrix = np.full((tot_vars_count, tot_vars_count), True) - if known_edges: - for edge in known_edges: - i = self._sample_path.structure.get_node_indx(edge[0]) - j = self._sample_path.structure.get_node_indx(edge[1]) - complete_adj_matrix[i][j] = False - return complete_adj_matrix - - @staticmethod - def build_complete_graph(node_ids: typing.List) -> nx.DiGraph: - """Builds a complete directed graph (no self loops) given the nodes labels in the list ``node_ids``: - - :param node_ids: the list of nodes labels - :type node_ids: List - :return: a complete Digraph Object - :rtype: networkx.DiGraph - """ - complete_graph = nx.DiGraph() - complete_graph.add_nodes_from(node_ids) - complete_graph.add_edges_from(itertools.permutations(node_ids, 2)) - return complete_graph - - - @staticmethod - def generate_possible_sub_sets_of_size( u: typing.List, size: int, parent_label: str): - """Creates a list containing all possible subsets of the list ``u`` of size ``size``, - that do not contains a the node identified by ``parent_label``. - - :param u: the list of nodes - :type u: List - :param size: the size of the subsets - :type size: int - :param parent_label: the node to exclude in the subsets generation - :type parent_label: string - :return: an Iterator Object containing a list of lists - :rtype: Iterator - """ - list_without_test_parent = u[:] - list_without_test_parent.remove(parent_label) - return map(list, itertools.combinations(list_without_test_parent, size)) - - def save_results(self, file_path: str) -> None: - """Save the estimated Structure to a .json file in file_path. - - :param file_path: the path including the file name with .json extension - :type file_path: string - """ - res = json_graph.node_link_data(self._complete_graph) - with open(file_path, 'w') as f: - json.dump(res, f) - - - #def remove_diagonal_elements(self, matrix): - # m = matrix.shape[0] - # strided = np.lib.stride_tricks.as_strided - # s0, s1 = matrix.strides - # return strided(matrix.ravel()[1:], shape=(m - 1, m), strides=(s0 + s1, s1)).reshape(m, -1) - - - @abc.abstractmethod - def estimate_structure(self) -> typing.List: - """Abstract method to estimate the structure - - :return: List of estimated edges - :rtype: Typing.List - """ - pass - - def adjacency_matrix(self) -> np.ndarray: - """Converts the estimated structure ``_complete_graph`` to a boolean adjacency matrix representation. - - :return: The adjacency matrix of the graph ``_complete_graph`` - :rtype: numpy.ndArray - """ - return nx.adj_matrix(self._complete_graph, self._nodes).toarray().astype(bool) - - def spurious_edges(self) -> typing.List: - """Return the spurious edges present in the estimated structure, if a prior net structure is present in - ``_sample_path.structure``. - - :return: A list containing the spurious edges - :rtype: List - """ - if not self._sample_path.has_prior_net_structure: - return [] - real_graph = nx.DiGraph() - real_graph.add_nodes_from(self._sample_path.structure.nodes_labels) - real_graph.add_edges_from(self._sample_path.structure.edges) - return nx.difference(real_graph, self._complete_graph).edges - - def save_plot_estimated_structure_graph(self, file_path: str) -> None: - """Plot the estimated structure in a graphical model style, use .png extension. - Spurious edges are colored in red if a prior structure is present. - - :param file_path: path to save the file to - :type: string - """ - graph_to_draw = nx.DiGraph() - spurious_edges = self.spurious_edges() - non_spurious_edges = list(set(self._complete_graph.edges) - set(spurious_edges)) - edges_colors = ['red' if edge in spurious_edges else 'black' for edge in self._complete_graph.edges] - graph_to_draw.add_edges_from(spurious_edges) - graph_to_draw.add_edges_from(non_spurious_edges) - pos = nx.spring_layout(graph_to_draw, k=0.5*1/np.sqrt(len(graph_to_draw.nodes())), iterations=50,scale=10) - options = { - "node_size": 2000, - "node_color": "white", - "edgecolors": "black", - 'linewidths':2, - "with_labels":True, - "font_size":13, - 'connectionstyle': 'arc3, rad = 0.1', - "arrowsize": 15, - "arrowstyle": '<|-', - "width": 1, - "edge_color":edges_colors, - } - - nx.draw(graph_to_draw, pos, **options) - ax = plt.gca() - ax.margins(0.20) - plt.axis("off") - plt.savefig(file_path) - plt.clf() - print("Estimated Structure Plot Saved At: ", os.path.abspath(file_path)) - - - - - diff --git a/build/lib/PyCTBN/PyCTBN/estimators/structure_score_based_estimator.py b/build/lib/PyCTBN/PyCTBN/estimators/structure_score_based_estimator.py deleted file mode 100644 index 12222f9..0000000 --- a/build/lib/PyCTBN/PyCTBN/estimators/structure_score_based_estimator.py +++ /dev/null @@ -1,236 +0,0 @@ - -import itertools -import json -import typing - -import networkx as nx -import numpy as np -from networkx.readwrite import json_graph - -from random import choice - -import concurrent.futures - -import copy - -from ..structure_graph.conditional_intensity_matrix import ConditionalIntensityMatrix -from ..structure_graph.network_graph import NetworkGraph -from .parameters_estimator import ParametersEstimator -from .structure_estimator import StructureEstimator -from ..structure_graph.sample_path import SamplePath -from ..structure_graph.structure import Structure -from .fam_score_calculator import FamScoreCalculator -from ..optimizers.hill_climbing_search import HillClimbing -from ..optimizers.tabu_search import TabuSearch - - -import multiprocessing -from multiprocessing import Pool - - - - -class StructureScoreBasedEstimator(StructureEstimator): - """ - Has the task of estimating the network structure given the trajectories in samplepath by - using a score based approach and differt kinds of optimization algorithms. - - :param sample_path: the _sample_path object containing the trajectories and the real structure - :type sample_path: SamplePath - :param tau_xu: hyperparameter over the CTBN’s q parameters, default to 0.1 - :type tau_xu: float, optional - :param alpha_xu: hyperparameter over the CTBN’s q parameters, default to 1 - :type alpha_xu: float, optional - :param known_edges: List of known edges, default to [] - :type known_edges: List, optional - - """ - - def __init__(self, sample_path: SamplePath, tau_xu:int=0.1, alpha_xu:int = 1,known_edges: typing.List= []): - super().__init__(sample_path,known_edges) - self.tau_xu=tau_xu - self.alpha_xu=alpha_xu - - - def estimate_structure(self, max_parents:int = None, iterations_number:int= 40, - patience:int = None, tabu_length:int = None, tabu_rules_duration:int = None, - optimizer: str = 'tabu',disable_multiprocessing:bool= False ): - """ - Compute the score-based algorithm to find the optimal structure - - :param max_parents: maximum number of parents for each variable. If None, disabled, default to None - :type max_parents: int, optional - :param iterations_number: maximum number of optimization algorithm's iteration, default to 40 - :type iterations_number: int, optional - :param patience: number of iteration without any improvement before to stop the search.If None, disabled, default to None - :type patience: int, optional - :param tabu_length: maximum lenght of the data structures used in the optimization process, default to None - :type tabu_length: int, optional - :param tabu_rules_duration: number of iterations in which each rule keeps its value, default to None - :type tabu_rules_duration: int, optional - :param optimizer: name of the optimizer algorithm. Possible values: 'hill' (Hill climbing),'tabu' (tabu search), defualt to 'tabu' - :type optimizer: string, optional - :param disable_multiprocessing: true if you desire to disable the multiprocessing operations, default to False - :type disable_multiprocessing: Boolean, optional - """ - 'Save the true edges structure in tuples' - true_edges = copy.deepcopy(self._sample_path.structure.edges) - true_edges = set(map(tuple, true_edges)) - - 'Remove all the edges from the structure' - self._sample_path.structure.clean_structure_edges() - - estimate_parents = self.estimate_parents - - n_nodes= len(self._nodes) - - l_max_parents= [max_parents] * n_nodes - l_iterations_number = [iterations_number] * n_nodes - l_patience = [patience] * n_nodes - l_tabu_length = [tabu_length] * n_nodes - l_tabu_rules_duration = [tabu_rules_duration] * n_nodes - l_optimizer = [optimizer] * n_nodes - - - 'get the number of CPU' - cpu_count = multiprocessing.cpu_count() - print(f"CPU COUNT: {cpu_count}") - - if disable_multiprocessing: - cpu_count = 1 - - - - - - #with get_context("spawn").Pool(processes=cpu_count) as pool: - #with multiprocessing.Pool(processes=cpu_count) as pool: - - 'Estimate the best parents for each node' - if disable_multiprocessing: - list_edges_partial = [estimate_parents(n,max_parents,iterations_number,patience,tabu_length,tabu_rules_duration,optimizer) for n in self._nodes] - else: - with concurrent.futures.ProcessPoolExecutor(max_workers=cpu_count) as executor: - list_edges_partial = executor.map(estimate_parents, - self._nodes, - l_max_parents, - l_iterations_number, - l_patience, - l_tabu_length, - l_tabu_rules_duration, - l_optimizer) - - - 'Concatenate all the edges list' - set_list_edges = set(itertools.chain.from_iterable(list_edges_partial)) - - - 'calculate precision and recall' - n_missing_edges = 0 - n_added_fake_edges = 0 - - try: - n_added_fake_edges = len(set_list_edges.difference(true_edges)) - - n_missing_edges = len(true_edges.difference(set_list_edges)) - - n_true_positive = len(true_edges) - n_missing_edges - - precision = n_true_positive / (n_true_positive + n_added_fake_edges) - - recall = n_true_positive / (n_true_positive + n_missing_edges) - - print(true_edges) - print(set_list_edges) - print(f"precision: {precision} ") - print(f"recall: {recall} ") - except Exception as e: - print(f"errore: {e}") - - - 'Update the graph' - self._complete_graph = nx.DiGraph() - self._complete_graph.add_edges_from(set_list_edges) - - return set_list_edges - - - def estimate_parents(self,node_id:str, max_parents:int = None, iterations_number:int= 40, - patience:int = 10, tabu_length:int = None, tabu_rules_duration:int=5, - optimizer:str = 'hill' ): - """ - Use the FamScore of a node in order to find the best parent nodes - - :param node_id: current node's id - :type node_id: string - :param max_parents: maximum number of parents for each variable. If None, disabled, default to None - :type max_parents: int, optional - :param iterations_number: maximum number of optimization algorithm's iteration, default to 40 - :type iterations_number: int, optional - :param patience: number of iteration without any improvement before to stop the search.If None, disabled, default to None - :type patience: int, optional - :param tabu_length: maximum lenght of the data structures used in the optimization process, default to None - :type tabu_length: int, optional - :param tabu_rules_duration: number of iterations in which each rule keeps its value, default to None - :type tabu_rules_duration: int, optional - :param optimizer: name of the optimizer algorithm. Possible values: 'hill' (Hill climbing),'tabu' (tabu search), defualt to 'tabu' - :type optimizer: string, optional - - :return: A list of the best edges for the currente node - :rtype: List - """ - - "choose the optimizer algotithm" - if optimizer == 'tabu': - optimizer = TabuSearch( - node_id = node_id, - structure_estimator = self, - max_parents = max_parents, - iterations_number = iterations_number, - patience = patience, - tabu_length = tabu_length, - tabu_rules_duration = tabu_rules_duration) - else: #if optimizer == 'hill': - optimizer = HillClimbing( - node_id = node_id, - structure_estimator = self, - max_parents = max_parents, - iterations_number = iterations_number, - patience = patience) - - "call the optmizer's function that calculates the current node's parents" - return optimizer.optimize_structure() - - - def get_score_from_graph(self, - graph: NetworkGraph, - node_id:str): - """ - Get the FamScore of a node - - :param node_id: current node's id - :type node_id: string - :param graph: current graph to be computed - :type graph: class:'NetworkGraph' - - - :return: The FamSCore for this graph structure - :rtype: float - """ - - 'inizialize the graph for a single node' - graph.fast_init(node_id) - - params_estimation = ParametersEstimator(self._sample_path.trajectories, graph) - - 'Inizialize and compute parameters for node' - params_estimation.fast_init(node_id) - SoCims = params_estimation.compute_parameters_for_node(node_id) - - 'calculate the FamScore for the node' - fam_score_obj = FamScoreCalculator() - - score = fam_score_obj.get_fam_score(SoCims.actual_cims,tau_xu = self.tau_xu,alpha_xu=self.alpha_xu) - - #print(f" lo score per {node_id} risulta: {score} ") - return score diff --git a/build/lib/PyCTBN/PyCTBN/optimizers/__init__.py b/build/lib/PyCTBN/PyCTBN/optimizers/__init__.py deleted file mode 100644 index 4162bf1..0000000 --- a/build/lib/PyCTBN/PyCTBN/optimizers/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .optimizer import Optimizer -from .tabu_search import TabuSearch -from .hill_climbing_search import HillClimbing -from .constraint_based_optimizer import ConstraintBasedOptimizer \ No newline at end of file diff --git a/build/lib/PyCTBN/PyCTBN/optimizers/constraint_based_optimizer.py b/build/lib/PyCTBN/PyCTBN/optimizers/constraint_based_optimizer.py deleted file mode 100644 index 9ad05fc..0000000 --- a/build/lib/PyCTBN/PyCTBN/optimizers/constraint_based_optimizer.py +++ /dev/null @@ -1,84 +0,0 @@ - -import itertools -import json -import typing - -import networkx as nx -import numpy as np - -from random import choice - -from abc import ABC - -import copy - - -from .optimizer import Optimizer -from ..estimators.structure_estimator import StructureEstimator -from ..structure_graph.network_graph import NetworkGraph - - -class ConstraintBasedOptimizer(Optimizer): - """ - Optimizer class that implement a CTPC Algorithm - - :param node_id: current node's id - :type node_id: string - :param structure_estimator: a structure estimator object with the information about the net - :type structure_estimator: class:'StructureEstimator' - :param tot_vars_count: number of variables in the dataset - :type tot_vars_count: int - """ - def __init__(self, - node_id:str, - structure_estimator: StructureEstimator, - tot_vars_count:int - ): - """ - Constructor - """ - super().__init__(node_id, structure_estimator) - self.tot_vars_count = tot_vars_count - - - - def optimize_structure(self): - """ - Compute Optimization process for a structure_estimator by using a CTPC Algorithm - - :return: the estimated structure for the node - :rtype: List - """ - print("##################TESTING VAR################", self.node_id) - - graph = NetworkGraph(self.structure_estimator._sample_path.structure) - - other_nodes = [node for node in self.structure_estimator._sample_path.structure.nodes_labels if node != self.node_id] - - for possible_parent in other_nodes: - graph.add_edges([(possible_parent,self.node_id)]) - - - u = other_nodes - child_states_numb = self.structure_estimator._sample_path.structure.get_states_number(self.node_id) - b = 0 - while b < len(u): - parent_indx = 0 - while parent_indx < len(u): - removed = False - test_parent = u[parent_indx] - i = self.structure_estimator._sample_path.structure.get_node_indx(test_parent) - j = self.structure_estimator._sample_path.structure.get_node_indx(self.node_id) - if self.structure_estimator._removable_edges_matrix[i][j]: - S = StructureEstimator.generate_possible_sub_sets_of_size(u, b, test_parent) - for parents_set in S: - if self.structure_estimator.complete_test(test_parent, self.node_id, parents_set, child_states_numb, self.tot_vars_count,i,j): - graph.remove_edges([(test_parent, self.node_id)]) - u.remove(test_parent) - removed = True - break - if not removed: - parent_indx += 1 - b += 1 - self.structure_estimator._cache.clear() - return graph.edges \ No newline at end of file diff --git a/build/lib/PyCTBN/PyCTBN/optimizers/hill_climbing_search.py b/build/lib/PyCTBN/PyCTBN/optimizers/hill_climbing_search.py deleted file mode 100644 index 6783be0..0000000 --- a/build/lib/PyCTBN/PyCTBN/optimizers/hill_climbing_search.py +++ /dev/null @@ -1,135 +0,0 @@ - -import itertools -import json -import typing - -import networkx as nx -import numpy as np - -from random import choice - -from abc import ABC - - -from .optimizer import Optimizer -from ..estimators.structure_estimator import StructureEstimator -from ..structure_graph.network_graph import NetworkGraph - - -class HillClimbing(Optimizer): - """ - Optimizer class that implement Hill Climbing Search - - - :param node_id: current node's id - :type node_id: string - :param structure_estimator: a structure estimator object with the information about the net - :type structure_estimator: class:'StructureEstimator' - :param max_parents: maximum number of parents for each variable. If None, disabled, default to None - :type max_parents: int, optional - :param iterations_number: maximum number of optimization algorithm's iteration, default to 40 - :type iterations_number: int, optional - :param patience: number of iteration without any improvement before to stop the search.If None, disabled, default to None - :type patience: int, optional - - - - """ - def __init__(self, - node_id:str, - structure_estimator: StructureEstimator, - max_parents:int = None, - iterations_number:int= 40, - patience:int = None - ): - """ - Constructor - """ - super().__init__(node_id, structure_estimator) - self.max_parents = max_parents - self.iterations_number = iterations_number - self.patience = patience - - - - def optimize_structure(self) -> typing.List: - """ - Compute Optimization process for a structure_estimator by using a Hill Climbing Algorithm - - :return: the estimated structure for the node - :rtype: List - """ - - #'Create the graph for the single node' - graph = NetworkGraph(self.structure_estimator._sample_path.structure) - - 'get the index for the current node' - node_index = self.structure_estimator._sample_path._structure.get_node_indx(self.node_id) - - 'list of prior edges' - prior_parents = set() - - 'Add the edges from prior knowledge' - for i in range(len(self.structure_estimator._removable_edges_matrix)): - if not self.structure_estimator._removable_edges_matrix[i][node_index]: - parent_id= self.structure_estimator._sample_path._structure.get_node_id(i) - prior_parents.add(parent_id) - - 'Add the node to the starting structure' - graph.add_edges([(parent_id, self.node_id)]) - - - - 'get all the possible parents' - other_nodes = [node for node in - self.structure_estimator._sample_path.structure.nodes_labels if - node != self.node_id and - not prior_parents.__contains__(node)] - - actual_best_score = self.structure_estimator.get_score_from_graph(graph,self.node_id) - - patince_count = 0 - for i in range(self.iterations_number): - 'choose a new random edge' - current_new_parent = choice(other_nodes) - current_edge = (current_new_parent,self.node_id) - added = False - parent_removed = None - - - if graph.has_edge(current_edge): - graph.remove_edges([current_edge]) - else: - 'check the max_parents constraint' - if self.max_parents is not None: - parents_list = graph.get_parents_by_id(self.node_id) - if len(parents_list) >= self.max_parents : - parent_removed = (choice(parents_list), self.node_id) - graph.remove_edges([parent_removed]) - graph.add_edges([current_edge]) - added = True - #print('**************************') - current_score = self.structure_estimator.get_score_from_graph(graph,self.node_id) - - - if current_score > actual_best_score: - 'update current best score' - actual_best_score = current_score - patince_count = 0 - else: - 'undo the last update' - if added: - graph.remove_edges([current_edge]) - 'If a parent was removed, add it again to the graph' - if parent_removed is not None: - graph.add_edges([parent_removed]) - else: - graph.add_edges([current_edge]) - 'update patience count' - patince_count += 1 - - if self.patience is not None and patince_count > self.patience: - break - - print(f"finito variabile: {self.node_id}") - return graph.edges \ No newline at end of file diff --git a/build/lib/PyCTBN/PyCTBN/optimizers/optimizer.py b/build/lib/PyCTBN/PyCTBN/optimizers/optimizer.py deleted file mode 100644 index 1984f06..0000000 --- a/build/lib/PyCTBN/PyCTBN/optimizers/optimizer.py +++ /dev/null @@ -1,39 +0,0 @@ - -import itertools -import json -import typing - -import networkx as nx -import numpy as np - -import abc - -from ..estimators.structure_estimator import StructureEstimator - - - -class Optimizer(abc.ABC): - """ - Interface class for all the optimizer's child PyCTBN - - :param node_id: the node label - :type node_id: string - :param structure_estimator: A structureEstimator Object to predict the structure - :type structure_estimator: class:'StructureEstimator' - - """ - - def __init__(self, node_id:str, structure_estimator: StructureEstimator): - self.node_id = node_id - self.structure_estimator = structure_estimator - - - @abc.abstractmethod - def optimize_structure(self) -> typing.List: - """ - Compute Optimization process for a structure_estimator - - :return: the estimated structure for the node - :rtype: List - """ - pass diff --git a/build/lib/PyCTBN/PyCTBN/optimizers/tabu_search.py b/build/lib/PyCTBN/PyCTBN/optimizers/tabu_search.py deleted file mode 100644 index b7b2bc9..0000000 --- a/build/lib/PyCTBN/PyCTBN/optimizers/tabu_search.py +++ /dev/null @@ -1,188 +0,0 @@ - -import itertools -import json -import typing - -import networkx as nx -import numpy as np - -from random import choice,sample - -from abc import ABC - - -from .optimizer import Optimizer -from ..estimators.structure_estimator import StructureEstimator -from ..structure_graph.network_graph import NetworkGraph - -import queue - - -class TabuSearch(Optimizer): - """ - Optimizer class that implement Tabu Search - - - :param node_id: current node's id - :type node_id: string - :param structure_estimator: a structure estimator object with the information about the net - :type structure_estimator: class:'StructureEstimator' - :param max_parents: maximum number of parents for each variable. If None, disabled, default to None - :type max_parents: int, optional - :param iterations_number: maximum number of optimization algorithm's iteration, default to 40 - :type iterations_number: int, optional - :param patience: number of iteration without any improvement before to stop the search.If None, disabled, default to None - :type patience: int, optional - :param tabu_length: maximum lenght of the data structures used in the optimization process, default to None - :type tabu_length: int, optional - :param tabu_rules_duration: number of iterations in which each rule keeps its value, default to None - :type tabu_rules_duration: int, optional - - - """ - def __init__(self, - node_id:str, - structure_estimator: StructureEstimator, - max_parents:int = None, - iterations_number:int= 40, - patience:int = None, - tabu_length:int = None, - tabu_rules_duration = None - ): - """ - Constructor - """ - super().__init__(node_id, structure_estimator) - self.max_parents = max_parents - self.iterations_number = iterations_number - self.patience = patience - self.tabu_length = tabu_length - self.tabu_rules_duration = tabu_rules_duration - - - def optimize_structure(self) -> typing.List: - """ - Compute Optimization process for a structure_estimator by using a Hill Climbing Algorithm - - :return: the estimated structure for the node - :rtype: List - """ - print(f"tabu search is processing the structure of {self.node_id}") - - 'Create the graph for the single node' - graph = NetworkGraph(self.structure_estimator._sample_path.structure) - - 'get the index for the current node' - node_index = self.structure_estimator._sample_path._structure.get_node_indx(self.node_id) - - 'list of prior edges' - prior_parents = set() - - 'Add the edges from prior knowledge' - for i in range(len(self.structure_estimator._removable_edges_matrix)): - if not self.structure_estimator._removable_edges_matrix[i][node_index]: - parent_id= self.structure_estimator._sample_path._structure.get_node_id(i) - prior_parents.add(parent_id) - - 'Add the node to the starting structure' - graph.add_edges([(parent_id, self.node_id)]) - - - - 'get all the possible parents' - other_nodes = set([node for node in - self.structure_estimator._sample_path.structure.nodes_labels if - node != self.node_id and - not prior_parents.__contains__(node)]) - - 'calculate the score for the node without parents' - actual_best_score = self.structure_estimator.get_score_from_graph(graph,self.node_id) - - - 'initialize tabu_length and tabu_rules_duration if None' - if self.tabu_length is None: - self.tabu_length = len(other_nodes) - - if self.tabu_rules_duration is None: - self.tabu_rules_duration = len(other_nodes) - - 'inizialize the data structures' - tabu_set = set() - tabu_queue = queue.Queue() - - patince_count = 0 - tabu_count = 0 - for i in range(self.iterations_number): - - current_possible_nodes = other_nodes.difference(tabu_set) - - 'choose a new random edge according to tabu restiction' - if(len(current_possible_nodes) > 0): - current_new_parent = sample(current_possible_nodes,k=1)[0] - else: - current_new_parent = tabu_queue.get() - tabu_set.remove(current_new_parent) - - - - current_edge = (current_new_parent,self.node_id) - added = False - parent_removed = None - - if graph.has_edge(current_edge): - graph.remove_edges([current_edge]) - else: - 'check the max_parents constraint' - if self.max_parents is not None: - parents_list = graph.get_parents_by_id(self.node_id) - if len(parents_list) >= self.max_parents : - parent_removed = (choice(parents_list), self.node_id) - graph.remove_edges([parent_removed]) - graph.add_edges([current_edge]) - added = True - - current_score = self.structure_estimator.get_score_from_graph(graph,self.node_id) - - if current_score > actual_best_score: - 'update current best score' - actual_best_score = current_score - patince_count = 0 - 'update tabu list' - - - else: - 'undo the last update' - if added: - graph.remove_edges([current_edge]) - 'If a parent was removed, add it again to the graph' - if parent_removed is not None: - graph.add_edges([parent_removed]) - else: - graph.add_edges([current_edge]) - 'update patience count' - patince_count += 1 - - - if tabu_queue.qsize() >= self.tabu_length: - current_removed = tabu_queue.get() - tabu_set.remove(current_removed) - 'Add the node on the tabu list' - tabu_queue.put(current_new_parent) - tabu_set.add(current_new_parent) - - tabu_count += 1 - - 'Every tabu_rules_duration step remove an item from the tabu list ' - if tabu_count % self.tabu_rules_duration == 0: - if tabu_queue.qsize() > 0: - current_removed = tabu_queue.get() - tabu_set.remove(current_removed) - tabu_count = 0 - else: - tabu_count = 0 - - if self.patience is not None and patince_count > self.patience: - break - - print(f"finito variabile: {self.node_id}") - return graph.edges \ No newline at end of file diff --git a/build/lib/PyCTBN/PyCTBN/structure_graph/__init__.py b/build/lib/PyCTBN/PyCTBN/structure_graph/__init__.py deleted file mode 100644 index 85f18a2..0000000 --- a/build/lib/PyCTBN/PyCTBN/structure_graph/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -from .conditional_intensity_matrix import ConditionalIntensityMatrix -from .network_graph import NetworkGraph -from .sample_path import SamplePath -from .set_of_cims import SetOfCims -from .structure import Structure -from .trajectory import Trajectory \ No newline at end of file diff --git a/build/lib/PyCTBN/PyCTBN/structure_graph/conditional_intensity_matrix.py b/build/lib/PyCTBN/PyCTBN/structure_graph/conditional_intensity_matrix.py deleted file mode 100644 index 4abfdd0..0000000 --- a/build/lib/PyCTBN/PyCTBN/structure_graph/conditional_intensity_matrix.py +++ /dev/null @@ -1,42 +0,0 @@ -import numpy as np - - -class ConditionalIntensityMatrix(object): - """Abstracts the Conditional Intesity matrix of a node as aggregation of the state residence times vector - and state transition matrix and the actual CIM matrix. - - :param state_residence_times: state residence times vector - :type state_residence_times: numpy.array - :param state_transition_matrix: the transitions count matrix - :type state_transition_matrix: numpy.ndArray - :_cim: the actual cim of the node - """ - def __init__(self, state_residence_times: np.array, state_transition_matrix: np.array): - """Constructor Method - """ - self._state_residence_times = state_residence_times - self._state_transition_matrix = state_transition_matrix - self._cim = self.state_transition_matrix.astype(np.float64) - - def compute_cim_coefficients(self) -> None: - """Compute the coefficients of the matrix _cim by using the following equality q_xx' = M[x, x'] / T[x]. - The class member ``_cim`` will contain the computed cim - """ - np.fill_diagonal(self._cim, self._cim.diagonal() * -1) - self._cim = ((self._cim.T + 1) / (self._state_residence_times + 1)).T - - @property - def state_residence_times(self) -> np.ndarray: - return self._state_residence_times - - @property - def state_transition_matrix(self) -> np.ndarray: - return self._state_transition_matrix - - @property - def cim(self) -> np.ndarray: - return self._cim - - def __repr__(self): - return 'CIM:\n' + str(self.cim) - diff --git a/build/lib/PyCTBN/PyCTBN/structure_graph/network_graph.py b/build/lib/PyCTBN/PyCTBN/structure_graph/network_graph.py deleted file mode 100644 index 6fb3639..0000000 --- a/build/lib/PyCTBN/PyCTBN/structure_graph/network_graph.py +++ /dev/null @@ -1,293 +0,0 @@ - -import typing - -import networkx as nx -import numpy as np - -from .structure import Structure - - -class NetworkGraph(object): - """Abstracts the infos contained in the Structure class in the form of a directed graph. - Has the task of creating all the necessary filtering and indexing structures for parameters estimation - - :param graph_struct: the ``Structure`` object from which infos about the net will be extracted - :type graph_struct: Structure - :_graph: directed graph - :_aggregated_info_about_nodes_parents: a structure that contains all the necessary infos - about every parents of the node of which all the indexing and filtering structures will be constructed. - :_time_scalar_indexing_structure: the indexing structure for state res time estimation - :_transition_scalar_indexing_structure: the indexing structure for transition computation - :_time_filtering: the columns filtering structure used in the computation of the state res times - :_transition_filtering: the columns filtering structure used in the computation of the transition - from one state to another - :_p_combs_structure: all the possible parents states combination for the node of interest - """ - - def __init__(self, graph_struct: Structure): - """Constructor Method - """ - self._graph_struct = graph_struct - self._graph = nx.DiGraph() - self._aggregated_info_about_nodes_parents = None - self._time_scalar_indexing_structure = None - self._transition_scalar_indexing_structure = None - self._time_filtering = None - self._transition_filtering = None - self._p_combs_structure = None - - #def init_graph(self): - # self.add_nodes(self._nodes_labels) - # self.add_edges(self.graph_struct.edges) - # self.aggregated_info_about_nodes_parents = self.get_ord_set_of_par_of_all_nodes() - # self._fancy_indexing = self.build_fancy_indexing_structure(0) - # self.build_scalar_indexing_structures() - # self.build_time_columns_filtering_structure() - # self.build_transition_columns_filtering_structure() - # self._p_combs_structure = self.build_p_combs_structure() - - def fast_init(self, node_id: str) -> None: - """Initializes all the necessary structures for parameters estimation of the node identified by the label - node_id - - :param node_id: the label of the node - :type node_id: string - """ - self.add_nodes(self._graph_struct.nodes_labels) - self.add_edges(self._graph_struct.edges) - self._aggregated_info_about_nodes_parents = self.get_ordered_by_indx_set_of_parents(node_id) - p_indxs = self._aggregated_info_about_nodes_parents[1] - p_vals = self._aggregated_info_about_nodes_parents[2] - node_states = self.get_states_number(node_id) - node_indx = self.get_node_indx(node_id) - cols_number = self._graph_struct.total_variables_number - self._time_scalar_indexing_structure = NetworkGraph.\ - build_time_scalar_indexing_structure_for_a_node(node_states, p_vals) - self._transition_scalar_indexing_structure = NetworkGraph.\ - build_transition_scalar_indexing_structure_for_a_node(node_states, p_vals) - self._time_filtering = NetworkGraph.build_time_columns_filtering_for_a_node(node_indx, p_indxs) - self._transition_filtering = NetworkGraph.build_transition_filtering_for_a_node(node_indx, p_indxs, cols_number) - self._p_combs_structure = NetworkGraph.build_p_comb_structure_for_a_node(p_vals) - - def add_nodes(self, list_of_nodes: typing.List) -> None: - """Adds the nodes to the ``_graph`` contained in the list of nodes ``list_of_nodes``. - Sets all the properties that identify a nodes (index, positional index, cardinality) - - :param list_of_nodes: the nodes to add to ``_graph`` - :type list_of_nodes: List - """ - nodes_indxs = self._graph_struct.nodes_indexes - nodes_vals = self._graph_struct.nodes_values - pos = 0 - for id, node_indx, node_val in zip(list_of_nodes, nodes_indxs, nodes_vals): - self._graph.add_node(id, indx=node_indx, val=node_val, pos_indx=pos) - pos += 1 - - def has_edge(self,edge:tuple)-> bool: - """ - Check if the graph contains a specific edge - - Parameters: - edge: a tuple that rappresents the edge - Returns: - bool - """ - return self._graph.has_edge(edge[0],edge[1]) - - def add_edges(self, list_of_edges: typing.List) -> None: - """Add the edges to the ``_graph`` contained in the list ``list_of_edges``. - - :param list_of_edges: the list containing of tuples containing the edges - :type list_of_edges: List - """ - self._graph.add_edges_from(list_of_edges) - - def remove_node(self, node_id: str) -> None: - """Remove the node ``node_id`` from all the class members. - Initialize all the filtering/indexing structures. - """ - self._graph.remove_node(node_id) - self._graph_struct.remove_node(node_id) - self.clear_indexing_filtering_structures() - - def clear_indexing_filtering_structures(self) -> None: - """Initialize all the filtering/indexing structures. - """ - self._aggregated_info_about_nodes_parents = None - self._time_scalar_indexing_structure = None - self._transition_scalar_indexing_structure = None - self._time_filtering = None - self._transition_filtering = None - self._p_combs_structure = None - - def get_ordered_by_indx_set_of_parents(self, node: str) -> typing.Tuple: - """Builds the aggregated structure that holds all the infos relative to the parent set of the node, namely - (parents_labels, parents_indexes, parents_cardinalities). - - :param node: the label of the node - :type node: string - :return: a tuple containing all the parent set infos - :rtype: Tuple - """ - parents = self.get_parents_by_id(node) - nodes = self._graph_struct.nodes_labels - d = {v: i for i, v in enumerate(nodes)} - sorted_parents = sorted(parents, key=lambda v: d[v]) - get_node_indx = self.get_node_indx - p_indxes = [get_node_indx(node) for node in sorted_parents] - p_values = [self.get_states_number(node) for node in sorted_parents] - return sorted_parents, p_indxes, p_values - - def remove_edges(self, list_of_edges: typing.List) -> None: - """Remove the edges to the graph contained in the list list_of_edges. - - :param list_of_edges: The edges to remove from the graph - :type list_of_edges: List - """ - self._graph.remove_edges_from(list_of_edges) - - @staticmethod - def build_time_scalar_indexing_structure_for_a_node(node_states: int, - parents_vals: typing.List) -> np.ndarray: - """Builds an indexing structure for the computation of state residence times values. - - :param node_states: the node cardinality - :type node_states: int - :param parents_vals: the caridinalites of the node's parents - :type parents_vals: List - :return: The time indexing structure - :rtype: numpy.ndArray - """ - T_vector = np.array([node_states]) - T_vector = np.append(T_vector, parents_vals) - T_vector = T_vector.cumprod().astype(np.int) - return T_vector - - @staticmethod - def build_transition_scalar_indexing_structure_for_a_node(node_states_number: int, parents_vals: typing.List) \ - -> np.ndarray: - """Builds an indexing structure for the computation of state transitions values. - - :param node_states_number: the node cardinality - :type node_states_number: int - :param parents_vals: the caridinalites of the node's parents - :type parents_vals: List - :return: The transition indexing structure - :rtype: numpy.ndArray - """ - M_vector = np.array([node_states_number, - node_states_number]) - M_vector = np.append(M_vector, parents_vals) - M_vector = M_vector.cumprod().astype(np.int) - return M_vector - - @staticmethod - def build_time_columns_filtering_for_a_node(node_indx: int, p_indxs: typing.List) -> np.ndarray: - """ - Builds the necessary structure to filter the desired columns indicated by ``node_indx`` and ``p_indxs`` - in the dataset. - This structute will be used in the computation of the state res times. - :param node_indx: the index of the node - :type node_indx: int - :param p_indxs: the indexes of the node's parents - :type p_indxs: List - :return: The filtering structure for times estimation - :rtype: numpy.ndArray - """ - return np.append(np.array([node_indx], dtype=np.int), p_indxs).astype(np.int) - - @staticmethod - def build_transition_filtering_for_a_node(node_indx: int, p_indxs: typing.List, nodes_number: int) \ - -> np.ndarray: - """Builds the necessary structure to filter the desired columns indicated by ``node_indx`` and ``p_indxs`` - in the dataset. - This structure will be used in the computation of the state transitions values. - :param node_indx: the index of the node - :type node_indx: int - :param p_indxs: the indexes of the node's parents - :type p_indxs: List - :param nodes_number: the total number of nodes in the dataset - :type nodes_number: int - :return: The filtering structure for transitions estimation - :rtype: numpy.ndArray - """ - return np.array([node_indx + nodes_number, node_indx, *p_indxs], dtype=np.int) - - @staticmethod - def build_p_comb_structure_for_a_node(parents_values: typing.List) -> np.ndarray: - """ - Builds the combinatorial structure that contains the combinations of all the values contained in - ``parents_values``. - - :param parents_values: the cardinalities of the nodes - :type parents_values: List - :return: A numpy matrix containing a grid of the combinations - :rtype: numpy.ndArray - """ - tmp = [] - for val in parents_values: - tmp.append([x for x in range(val)]) - if len(parents_values) > 0: - parents_comb = np.array(np.meshgrid(*tmp)).T.reshape(-1, len(parents_values)) - if len(parents_values) > 1: - tmp_comb = parents_comb[:, 1].copy() - parents_comb[:, 1] = parents_comb[:, 0].copy() - parents_comb[:, 0] = tmp_comb - else: - parents_comb = np.array([[]], dtype=np.int) - return parents_comb - - def get_parents_by_id(self, node_id) -> typing.List: - """Returns a list of labels of the parents of the node ``node_id`` - - :param node_id: the node label - :type node_id: string - :return: a List of labels of the parents - :rtype: List - """ - return list(self._graph.predecessors(node_id)) - - def get_states_number(self, node_id) -> int: - return self._graph.nodes[node_id]['val'] - - def get_node_indx(self, node_id) -> int: - return nx.get_node_attributes(self._graph, 'indx')[node_id] - - def get_positional_node_indx(self, node_id) -> int: - return self._graph.nodes[node_id]['pos_indx'] - - @property - def nodes(self) -> typing.List: - return self._graph_struct.nodes_labels - - @property - def edges(self) -> typing.List: - return list(self._graph.edges) - - @property - def nodes_indexes(self) -> np.ndarray: - return self._graph_struct.nodes_indexes - - @property - def nodes_values(self) -> np.ndarray: - return self._graph_struct.nodes_values - - @property - def time_scalar_indexing_strucure(self) -> np.ndarray: - return self._time_scalar_indexing_structure - - @property - def time_filtering(self) -> np.ndarray: - return self._time_filtering - - @property - def transition_scalar_indexing_structure(self) -> np.ndarray: - return self._transition_scalar_indexing_structure - - @property - def transition_filtering(self) -> np.ndarray: - return self._transition_filtering - - @property - def p_combs(self) -> np.ndarray: - return self._p_combs_structure diff --git a/build/lib/PyCTBN/PyCTBN/structure_graph/sample_path.py b/build/lib/PyCTBN/PyCTBN/structure_graph/sample_path.py deleted file mode 100644 index 88e9649..0000000 --- a/build/lib/PyCTBN/PyCTBN/structure_graph/sample_path.py +++ /dev/null @@ -1,93 +0,0 @@ - - -import numpy as np -import pandas as pd - -from .structure import Structure -from .trajectory import Trajectory -from ..utility.abstract_importer import AbstractImporter - - -MESSAGE_HAS_TO_CONTAIN_EXCEPTION = 'The importer object has to contain the all processed data!' - - -class SamplePath(object): - """Aggregates all the informations about the trajectories, the real structure of the sampled net and variables - cardinalites. Has the task of creating the objects ``Trajectory`` and ``Structure`` that will - contain the mentioned data. - - :param importer: the Importer object which contains the imported and processed data - :type importer: AbstractImporter - :_trajectories: the ``Trajectory`` object that will contain all the concatenated trajectories - :_structure: the ``Structure`` Object that will contain all the structural infos about the net - :_total_variables_count: the number of variables in the net - """ - def __init__(self, importer: AbstractImporter): - """Constructor Method - """ - self._importer = importer - if self._importer._df_variables is None or self._importer._concatenated_samples is None: - raise RuntimeError() - if self._importer._df_variables.empty: - raise RuntimeError(MESSAGE_HAS_TO_CONTAIN_EXCEPTION) - if isinstance(self._importer._concatenated_samples, pd.DataFrame) and\ - self._importer._concatenated_samples.empty: - raise RuntimeError(MESSAGE_HAS_TO_CONTAIN_EXCEPTION) - if isinstance(self._importer._concatenated_samples, np.ndarray) and\ - self._importer._concatenated_samples.size == 0: - raise RuntimeError(MESSAGE_HAS_TO_CONTAIN_EXCEPTION) - self._trajectories = None - self._structure = None - self._total_variables_count = None - - def build_trajectories(self) -> None: - """Builds the Trajectory object that will contain all the trajectories. - Clears all the unused dataframes in ``_importer`` Object - """ - self._trajectories = \ - Trajectory(self._importer.build_list_of_samples_array(self._importer.concatenated_samples), - len(self._importer.sorter) + 1) - self._importer.clear_concatenated_frame() - - def build_structure(self) -> None: - """ - Builds the ``Structure`` object that aggregates all the infos about the net. - """ - if self._importer.sorter != self._importer.variables.iloc[:, 0].to_list(): - raise RuntimeError("The Dataset columns order have to match the order of labels in the variables Frame!") - - self._total_variables_count = len(self._importer.sorter) - labels = self._importer.variables.iloc[:, 0].to_list() - indxs = self._importer.variables.index.to_numpy() - vals = self._importer.variables.iloc[:, 1].to_numpy() - if self._importer.structure is None or self._importer.structure.empty: - edges = [] - else: - edges = list(self._importer.structure.to_records(index=False)) - self._structure = Structure(labels, indxs, vals, edges, - self._total_variables_count) - - def clear_memory(self): - self._importer._raw_data = [] - - @property - def trajectories(self) -> Trajectory: - return self._trajectories - - @property - def structure(self) -> Structure: - return self._structure - - @property - def total_variables_count(self) -> int: - return self._total_variables_count - - @property - def has_prior_net_structure(self) -> bool: - return bool(self._structure.edges) - - - - - - diff --git a/build/lib/PyCTBN/PyCTBN/structure_graph/set_of_cims.py b/build/lib/PyCTBN/PyCTBN/structure_graph/set_of_cims.py deleted file mode 100644 index 81caff5..0000000 --- a/build/lib/PyCTBN/PyCTBN/structure_graph/set_of_cims.py +++ /dev/null @@ -1,97 +0,0 @@ - - -import typing - -import numpy as np - -from .conditional_intensity_matrix import ConditionalIntensityMatrix - - -class SetOfCims(object): - """Aggregates all the CIMS of the node identified by the label _node_id. - - :param node_id: the node label - :type node_ind: string - :param parents_states_number: the cardinalities of the parents - :type parents_states_number: List - :param node_states_number: the caridinality of the node - :type node_states_number: int - :param p_combs: the p_comb structure bound to this node - :type p_combs: numpy.ndArray - :_state_residence_time: matrix containing all the state residence time vectors for the node - :_transition_matrices: matrix containing all the transition matrices for the node - :_actual_cims: the cims of the node - """ - - def __init__(self, node_id: str, parents_states_number: typing.List, node_states_number: int, p_combs: np.ndarray): - """Constructor Method - """ - self._node_id = node_id - self._parents_states_number = parents_states_number - self._node_states_number = node_states_number - self._actual_cims = [] - self._state_residence_times = None - self._transition_matrices = None - self._p_combs = p_combs - self.build_times_and_transitions_structures() - - def build_times_and_transitions_structures(self) -> None: - """Initializes at the correct dimensions the state residence times matrix and the state transition matrices. - """ - if not self._parents_states_number: - self._state_residence_times = np.zeros((1, self._node_states_number), dtype=np.float) - self._transition_matrices = np.zeros((1, self._node_states_number, self._node_states_number), dtype=np.int) - else: - self._state_residence_times = \ - np.zeros((np.prod(self._parents_states_number), self._node_states_number), dtype=np.float) - self._transition_matrices = np.zeros([np.prod(self._parents_states_number), self._node_states_number, - self._node_states_number], dtype=np.int) - - def build_cims(self, state_res_times: np.ndarray, transition_matrices: np.ndarray) -> None: - """Build the ``ConditionalIntensityMatrix`` objects given the state residence times and transitions matrices. - Compute the cim coefficients.The class member ``_actual_cims`` will contain the computed cims. - - :param state_res_times: the state residence times matrix - :type state_res_times: numpy.ndArray - :param transition_matrices: the transition matrices - :type transition_matrices: numpy.ndArray - """ - for state_res_time_vector, transition_matrix in zip(state_res_times, transition_matrices): - cim_to_add = ConditionalIntensityMatrix(state_res_time_vector, transition_matrix) - cim_to_add.compute_cim_coefficients() - self._actual_cims.append(cim_to_add) - self._actual_cims = np.array(self._actual_cims) - self._transition_matrices = None - self._state_residence_times = None - - def filter_cims_with_mask(self, mask_arr: np.ndarray, comb: typing.List) -> np.ndarray: - """Filter the cims contained in the array ``_actual_cims`` given the boolean mask ``mask_arr`` and the index - ``comb``. - - :param mask_arr: the boolean mask that indicates which parent to consider - :type mask_arr: numpy.array - :param comb: the state/s of the filtered parents - :type comb: numpy.array - :return: Array of ``ConditionalIntensityMatrix`` objects - :rtype: numpy.array - """ - if mask_arr.size <= 1: - return self._actual_cims - else: - flat_indxs = np.argwhere(np.all(self._p_combs[:, mask_arr] == comb, axis=1)).ravel() - return self._actual_cims[flat_indxs] - - @property - def actual_cims(self) -> np.ndarray: - return self._actual_cims - - @property - def p_combs(self) -> np.ndarray: - return self._p_combs - - def get_cims_number(self): - return len(self._actual_cims) - - - - diff --git a/build/lib/PyCTBN/PyCTBN/structure_graph/structure.py b/build/lib/PyCTBN/PyCTBN/structure_graph/structure.py deleted file mode 100644 index f79c875..0000000 --- a/build/lib/PyCTBN/PyCTBN/structure_graph/structure.py +++ /dev/null @@ -1,124 +0,0 @@ - -import typing as ty - -import numpy as np - - -class Structure(object): - """Contains all the infos about the network structure(nodes labels, nodes caridinalites, edges, indexes) - - :param nodes_labels_list: the symbolic names of the variables - :type nodes_labels_list: List - :param nodes_indexes_arr: the indexes of the nodes - :type nodes_indexes_arr: numpy.ndArray - :param nodes_vals_arr: the cardinalites of the nodes - :type nodes_vals_arr: numpy.ndArray - :param edges_list: the edges of the network - :type edges_list: List - :param total_variables_number: the total number of variables in the dataset - :type total_variables_number: int - """ - - def __init__(self, nodes_labels_list: ty.List, nodes_indexes_arr: np.ndarray, nodes_vals_arr: np.ndarray, - edges_list: ty.List, total_variables_number: int): - """Constructor Method - """ - self._nodes_labels_list = nodes_labels_list - self._nodes_indexes_arr = nodes_indexes_arr - self._nodes_vals_arr = nodes_vals_arr - self._edges_list = edges_list - self._total_variables_number = total_variables_number - - def remove_node(self, node_id: str) -> None: - """Remove the node ``node_id`` from all the class members. - The class member ``_total_variables_number`` since it refers to the total number of variables in the dataset. - """ - node_positional_indx = self._nodes_labels_list.index(node_id) - del self._nodes_labels_list[node_positional_indx] - self._nodes_indexes_arr = np.delete(self._nodes_indexes_arr, node_positional_indx) - self._nodes_vals_arr = np.delete(self._nodes_vals_arr, node_positional_indx) - self._edges_list = [(from_node, to_node) for (from_node, to_node) in self._edges_list if (from_node != node_id - and to_node != node_id)] - - @property - def edges(self) -> ty.List: - return self._edges_list - - @property - def nodes_labels(self) -> ty.List: - return self._nodes_labels_list - - @property - def nodes_indexes(self) -> np.ndarray: - return self._nodes_indexes_arr - - @property - def nodes_values(self) -> np.ndarray: - return self._nodes_vals_arr - - @property - def total_variables_number(self) -> int: - return self._total_variables_number - - def get_node_id(self, node_indx: int) -> str: - """Given the ``node_index`` returns the node label. - - :param node_indx: the node index - :type node_indx: int - :return: the node label - :rtype: string - """ - return self._nodes_labels_list[node_indx] - - def clean_structure_edges(self): - self._edges_list = list() - - def add_edge(self,edge: tuple): - self._edges_list.append(edge) - - - def remove_edge(self,edge: tuple): - self._edges_list.remove(edge) - - def contains_edge(self,edge:tuple) -> bool: - return edge in self._edges_list - - def get_node_indx(self, node_id: str) -> int: - """Given the ``node_index`` returns the node label. - - :param node_id: the node label - :type node_id: string - :return: the node index - :rtype: int - """ - pos_indx = self._nodes_labels_list.index(node_id) - return self._nodes_indexes_arr[pos_indx] - - def get_positional_node_indx(self, node_id: str) -> int: - return self._nodes_labels_list.index(node_id) - - def get_states_number(self, node: str) -> int: - """Given the node label ``node`` returns the cardinality of the node. - - :param node: the node label - :type node: string - :return: the node cardinality - :rtype: int - """ - pos_indx = self._nodes_labels_list.index(node) - return self._nodes_vals_arr[pos_indx] - - def __repr__(self): - return "Variables:\n" + str(self._nodes_labels_list) +"\nValues:\n"+ str(self._nodes_vals_arr) +\ - "\nEdges: \n" + str(self._edges_list) - - def __eq__(self, other): - """Overrides the default implementation""" - if isinstance(other, Structure): - return set(self._nodes_labels_list) == set(other._nodes_labels_list) and \ - np.array_equal(self._nodes_vals_arr, other._nodes_vals_arr) and \ - np.array_equal(self._nodes_indexes_arr, other._nodes_indexes_arr) and \ - self._edges_list == other._edges_list - - return False - diff --git a/build/lib/PyCTBN/PyCTBN/structure_graph/trajectory.py b/build/lib/PyCTBN/PyCTBN/structure_graph/trajectory.py deleted file mode 100644 index 36899b3..0000000 --- a/build/lib/PyCTBN/PyCTBN/structure_graph/trajectory.py +++ /dev/null @@ -1,45 +0,0 @@ - -import typing - -import numpy as np - - -class Trajectory(object): - """ Abstracts the infos about a complete set of trajectories, represented as a numpy array of doubles - (the time deltas) and a numpy matrix of ints (the changes of states). - - :param list_of_columns: the list containing the times array and values matrix - :type list_of_columns: List - :param original_cols_number: total number of cols in the data - :type original_cols_number: int - :_actual_trajectory: the trajectory containing also the duplicated/shifted values - :_times: the array containing the time deltas - """ - - def __init__(self, list_of_columns: typing.List, original_cols_number: int): - """Constructor Method - """ - self._times = list_of_columns[0] - self._actual_trajectory = list_of_columns[1] - self._original_cols_number = original_cols_number - - @property - def trajectory(self) -> np.ndarray: - return self._actual_trajectory[:, :self._original_cols_number - 1] - - @property - def complete_trajectory(self) -> np.ndarray: - return self._actual_trajectory - - @property - def times(self): - return self._times - - def size(self): - return self._actual_trajectory.shape[0] - - def __repr__(self): - return "Complete Trajectory Rows: " + str(self.size()) + "\n" + self.complete_trajectory.__repr__() + \ - "\nTimes Rows:" + str(self.times.size) + "\n" + self.times.__repr__() - - diff --git a/build/lib/PyCTBN/PyCTBN/utility/__init__.py b/build/lib/PyCTBN/PyCTBN/utility/__init__.py deleted file mode 100644 index f79749c..0000000 --- a/build/lib/PyCTBN/PyCTBN/utility/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .abstract_importer import AbstractImporter -from .cache import Cache -from .json_importer import JsonImporter -from .sample_importer import SampleImporter \ No newline at end of file diff --git a/build/lib/PyCTBN/PyCTBN/utility/abstract_importer.py b/build/lib/PyCTBN/PyCTBN/utility/abstract_importer.py deleted file mode 100644 index 8984b4d..0000000 --- a/build/lib/PyCTBN/PyCTBN/utility/abstract_importer.py +++ /dev/null @@ -1,163 +0,0 @@ - -import typing -from abc import ABC, abstractmethod - -import numpy as np -import pandas as pd - -import copy - - - -class AbstractImporter(ABC): - """Abstract class that exposes all the necessary methods to process the trajectories and the net structure. - - :param file_path: the file path, or dataset name if you import already processed data - :type file_path: str - :param trajectory_list: Dataframe or numpy array containing the concatenation of all the processed trajectories - :type trajectory_list: typing.Union[pandas.DataFrame, numpy.ndarray] - :param variables: Dataframe containing the nodes labels and cardinalities - :type variables: pandas.DataFrame - :prior_net_structure: Dataframe containing the structure of the network (edges) - :type prior_net_structure: pandas.DataFrame - :_sorter: A list containing the variables labels in the SAME order as the columns in ``concatenated_samples`` - - .. warning:: - The parameters ``variables`` and ``prior_net_structure`` HAVE to be properly constructed - as Pandas Dataframes with the following structure: - Header of _df_structure = [From_Node | To_Node] - Header of _df_variables = [Variable_Label | Variable_Cardinality] - See the tutorial on how to construct a correct ``concatenated_samples`` Dataframe/ndarray. - - .. note:: - See :class:``JsonImporter`` for an example implementation - - """ - - def __init__(self, file_path: str = None, trajectory_list: typing.Union[pd.DataFrame, np.ndarray] = None, - variables: pd.DataFrame = None, prior_net_structure: pd.DataFrame = None): - """Constructor - """ - self._file_path = file_path - self._df_samples_list = trajectory_list - self._concatenated_samples = [] - self._df_variables = variables - self._df_structure = prior_net_structure - self._sorter = None - super().__init__() - - @abstractmethod - def build_sorter(self, trajecory_header: object) -> typing.List: - """Initializes the ``_sorter`` class member from a trajectory dataframe, exctracting the header of the frame - and keeping ONLY the variables symbolic labels, cutting out the time label in the header. - - :param trajecory_header: an object that will be used to define the header - :type trajecory_header: object - :return: A list containing the processed header. - :rtype: List - """ - pass - - def compute_row_delta_sigle_samples_frame(self, sample_frame: pd.DataFrame, - columns_header: typing.List, shifted_cols_header: typing.List) \ - -> pd.DataFrame: - """Computes the difference between each value present in th time column. - Copies and shift by one position up all the values present in the remaining columns. - - :param sample_frame: the traj to be processed - :type sample_frame: pandas.Dataframe - :param columns_header: the original header of sample_frame - :type columns_header: List - :param shifted_cols_header: a copy of columns_header with changed names of the contents - :type shifted_cols_header: List - :return: The processed dataframe - :rtype: pandas.Dataframe - - .. warning:: - the Dataframe ``sample_frame`` has to follow the column structure of this header: - Header of sample_frame = [Time | Variable values] - """ - sample_frame = copy.deepcopy(sample_frame) - sample_frame.iloc[:, 0] = sample_frame.iloc[:, 0].diff().shift(-1) - shifted_cols = sample_frame[columns_header].shift(-1).fillna(0).astype('int32') - shifted_cols.columns = shifted_cols_header - sample_frame = sample_frame.assign(**shifted_cols) - sample_frame.drop(sample_frame.tail(1).index, inplace=True) - return sample_frame - - def compute_row_delta_in_all_samples_frames(self, df_samples_list: typing.List) -> None: - """Calls the method ``compute_row_delta_sigle_samples_frame`` on every dataframe present in the list - ``df_samples_list``. - Concatenates the result in the dataframe ``concatanated_samples`` - - :param df_samples_list: the datframe's list to be processed and concatenated - :type df_samples_list: List - - .. warning:: - The Dataframe sample_frame has to follow the column structure of this header: - Header of sample_frame = [Time | Variable values] - The class member self._sorter HAS to be properly INITIALIZED (See class members definition doc) - .. note:: - After the call of this method the class member ``concatanated_samples`` will contain all processed - and merged trajectories - """ - if not self._sorter: - raise RuntimeError("The class member self._sorter has to be INITIALIZED!") - shifted_cols_header = [s + "S" for s in self._sorter] - compute_row_delta = self.compute_row_delta_sigle_samples_frame - proc_samples_list = [compute_row_delta(sample, self._sorter, shifted_cols_header) - for sample in df_samples_list] - self._concatenated_samples = pd.concat(proc_samples_list) - - complete_header = self._sorter[:] - complete_header.insert(0,'Time') - complete_header.extend(shifted_cols_header) - self._concatenated_samples = self._concatenated_samples[complete_header] - - def build_list_of_samples_array(self, concatenated_sample: pd.DataFrame) -> typing.List: - """Builds a List containing the the delta times numpy array, and the complete transitions matrix - - :param concatenated_sample: the dataframe/array from which the time, and transitions matrix have to be extracted - and converted - :type concatenated_sample: pandas.Dataframe - :return: the resulting list of numpy arrays - :rtype: List - """ - - concatenated_array = concatenated_sample.to_numpy() - columns_list = [concatenated_array[:, 0], concatenated_array[:, 1:].astype(int)] - - return columns_list - - def clear_concatenated_frame(self) -> None: - """Removes all values in the dataframe concatenated_samples. - """ - if isinstance(self._concatenated_samples, pd.DataFrame): - self._concatenated_samples = self._concatenated_samples.iloc[0:0] - - @abstractmethod - def dataset_id(self) -> object: - """If the original dataset contains multiple dataset, this method returns a unique id to identify the current - dataset - """ - pass - - @property - def concatenated_samples(self) -> pd.DataFrame: - return self._concatenated_samples - - @property - def variables(self) -> pd.DataFrame: - return self._df_variables - - @property - def structure(self) -> pd.DataFrame: - return self._df_structure - - @property - def sorter(self) -> typing.List: - return self._sorter - - @property - def file_path(self) -> str: - return self._file_path diff --git a/build/lib/PyCTBN/PyCTBN/utility/cache.py b/build/lib/PyCTBN/PyCTBN/utility/cache.py deleted file mode 100644 index 5191af3..0000000 --- a/build/lib/PyCTBN/PyCTBN/utility/cache.py +++ /dev/null @@ -1,54 +0,0 @@ - -import typing - -from ..structure_graph.set_of_cims import SetOfCims - - -class Cache: - """This class acts as a cache of ``SetOfCims`` objects for a node. - - :__list_of_sets_of_parents: a list of ``Sets`` objects of the parents to which the cim in cache at SAME - index is related - :__actual_cache: a list of setOfCims objects - """ - - def __init__(self): - """Constructor Method - """ - self._list_of_sets_of_parents = [] - self._actual_cache = [] - - def find(self, parents_comb: typing.Set): #typing.Union[typing.Set, str] - """ - Tries to find in cache given the symbolic parents combination ``parents_comb`` the ``SetOfCims`` - related to that ``parents_comb``. - - :param parents_comb: the parents related to that ``SetOfCims`` - :type parents_comb: Set - :return: A ``SetOfCims`` object if the ``parents_comb`` index is found in ``__list_of_sets_of_parents``. - None otherwise. - :rtype: SetOfCims - """ - try: - result = self._actual_cache[self._list_of_sets_of_parents.index(parents_comb)] - return result - except ValueError: - return None - - def put(self, parents_comb: typing.Set, socim: SetOfCims): - """Place in cache the ``SetOfCims`` object, and the related symbolic index ``parents_comb`` in - ``__list_of_sets_of_parents``. - - :param parents_comb: the symbolic set index - :type parents_comb: Set - :param socim: the related SetOfCims object - :type socim: SetOfCims - """ - self._list_of_sets_of_parents.append(parents_comb) - self._actual_cache.append(socim) - - def clear(self): - """Clear the contents both of ``__actual_cache`` and ``__list_of_sets_of_parents``. - """ - del self._list_of_sets_of_parents[:] - del self._actual_cache[:] \ No newline at end of file diff --git a/build/lib/PyCTBN/PyCTBN/utility/json_importer.py b/build/lib/PyCTBN/PyCTBN/utility/json_importer.py deleted file mode 100644 index 2cadff4..0000000 --- a/build/lib/PyCTBN/PyCTBN/utility/json_importer.py +++ /dev/null @@ -1,181 +0,0 @@ -import json -import typing - -import pandas as pd - - -from .abstract_importer import AbstractImporter - - -class JsonImporter(AbstractImporter): - """Implements the abstracts methods of AbstractImporter and adds all the necessary methods to process and prepare - the data in json extension. - - :param file_path: the path of the file that contains tha data to be imported - :type file_path: string - :param samples_label: the reference key for the samples in the trajectories - :type samples_label: string - :param structure_label: the reference key for the structure of the network data - :type structure_label: string - :param variables_label: the reference key for the cardinalites of the nodes data - :type variables_label: string - :param time_key: the key used to identify the timestamps in each trajectory - :type time_key: string - :param variables_key: the key used to identify the names of the variables in the net - :type variables_key: string - :_array_indx: the index of the outer JsonArray to extract the data from - :type _array_indx: int - :_df_samples_list: a Dataframe list in which every dataframe contains a trajectory - :_raw_data: The raw contents of the json file to import - :type _raw_data: List - """ - - def __init__(self, file_path: str, samples_label: str, structure_label: str, variables_label: str, time_key: str, - variables_key: str): - """Constructor method - - .. note:: - This constructor calls also the method ``read_json_file()``, so after the construction of the object - the class member ``_raw_data`` will contain the raw imported json data. - - """ - self._samples_label = samples_label - self._structure_label = structure_label - self._variables_label = variables_label - self._time_key = time_key - self._variables_key = variables_key - self._df_samples_list = None - self._array_indx = None - super(JsonImporter, self).__init__(file_path) - self._raw_data = self.read_json_file() - - def import_data(self, indx: int = 0) -> None: - """Implements the abstract method of :class:`AbstractImporter`. - - :param indx: the index of the outer JsonArray to extract the data from, default to 0 - :type indx: int - """ - self._array_indx = indx - self._df_samples_list = self.import_trajectories(self._raw_data) - self._sorter = self.build_sorter(self._df_samples_list[0]) - self.compute_row_delta_in_all_samples_frames(self._df_samples_list) - self.clear_data_frame_list() - self._df_structure = self.import_structure(self._raw_data) - self._df_variables = self.import_variables(self._raw_data) - - def import_trajectories(self, raw_data: typing.List) -> typing.List: - """Imports the trajectories from the list of dicts ``raw_data``. - - :param raw_data: List of Dicts - :type raw_data: List - :return: List of dataframes containing all the trajectories - :rtype: List - """ - return self.normalize_trajectories(raw_data, self._array_indx, self._samples_label) - - def import_structure(self, raw_data: typing.List) -> pd.DataFrame: - """Imports in a dataframe the data in the list raw_data at the key ``_structure_label`` - - :param raw_data: List of Dicts - :type raw_data: List - :return: Dataframe containg the starting node a ending node of every arc of the network - :rtype: pandas.Dataframe - """ - return self.one_level_normalizing(raw_data, self._array_indx, self._structure_label) - - def import_variables(self, raw_data: typing.List) -> pd.DataFrame: - """Imports the data in ``raw_data`` at the key ``_variables_label``. - - :param raw_data: List of Dicts - :type raw_data: List - :return: Datframe containg the variables simbolic labels and their cardinalities - :rtype: pandas.Dataframe - """ - return self.one_level_normalizing(raw_data, self._array_indx, self._variables_label) - - def read_json_file(self) -> typing.List: - """Reads the JSON file in the path self.filePath. - - :return: The contents of the json file - :rtype: List - """ - with open(self._file_path) as f: - data = json.load(f) - - if (isinstance(data,list)): - return data - else: - return [data] - - - def one_level_normalizing(self, raw_data: typing.List, indx: int, key: str) -> pd.DataFrame: - """Extracts the one-level nested data in the list ``raw_data`` at the index ``indx`` at the key ``key``. - - :param raw_data: List of Dicts - :type raw_data: List - :param indx: The index of the array from which the data have to be extracted - :type indx: int - :param key: the key for the Dicts from which exctract data - :type key: string - :return: A normalized dataframe - :rtype: pandas.Datframe - """ - return pd.DataFrame(raw_data[indx][key]) - - def normalize_trajectories(self, raw_data: typing.List, indx: int, trajectories_key: str) -> typing.List: - """ - Extracts the trajectories in ``raw_data`` at the index ``index`` at the key ``trajectories key``. - - :param raw_data: List of Dicts - :type raw_data: List - :param indx: The index of the array from which the data have to be extracted - :type indx: int - :param trajectories_key: the key of the trajectories objects - :type trajectories_key: string - :return: A list of daframes containg the trajectories - :rtype: List - """ - dataframe = pd.DataFrame - smps = raw_data[indx][trajectories_key] - df_samples_list = [dataframe(sample) for sample in smps] - return df_samples_list - - def build_sorter(self, sample_frame: pd.DataFrame) -> typing.List: - """Implements the abstract method build_sorter of the :class:`AbstractImporter` for this dataset. - """ - columns_header = list(sample_frame.columns.values) - columns_header.remove(self._time_key) - return columns_header - - def clear_data_frame_list(self) -> None: - """Removes all values present in the dataframes in the list ``_df_samples_list``. - """ - for indx in range(len(self._df_samples_list)): - self._df_samples_list[indx] = self._df_samples_list[indx].iloc[0:0] - - def dataset_id(self) -> object: - return self._array_indx - - def import_sampled_cims(self, raw_data: typing.List, indx: int, cims_key: str) -> typing.Dict: - """Imports the synthetic CIMS in the dataset in a dictionary, using variables labels - as keys for the set of CIMS of a particular node. - - :param raw_data: List of Dicts - :type raw_data: List - :param indx: The index of the array from which the data have to be extracted - :type indx: int - :param cims_key: the key where the json object cims are placed - :type cims_key: string - :return: a dictionary containing the sampled CIMS for all the variables in the net - :rtype: Dictionary - """ - cims_for_all_vars = {} - for var in raw_data[indx][cims_key]: - sampled_cims_list = [] - cims_for_all_vars[var] = sampled_cims_list - for p_comb in raw_data[indx][cims_key][var]: - cims_for_all_vars[var].append(pd.DataFrame(raw_data[indx][cims_key][var][p_comb]).to_numpy()) - return cims_for_all_vars - - - diff --git a/build/lib/PyCTBN/PyCTBN/utility/sample_importer.py b/build/lib/PyCTBN/PyCTBN/utility/sample_importer.py deleted file mode 100644 index b0b6e8f..0000000 --- a/build/lib/PyCTBN/PyCTBN/utility/sample_importer.py +++ /dev/null @@ -1,62 +0,0 @@ -import json -import typing - -import pandas as pd -import numpy as np - -from .abstract_importer import AbstractImporter - - - -class SampleImporter(AbstractImporter): - """Implements the abstracts methods of AbstractImporter and adds all the necessary methods to process and prepare - the data loaded directly by using DataFrame - - :param trajectory_list: the data that describes the trajectories - :type trajectory_list: typing.Union[pd.DataFrame, np.ndarray, typing.List] - :param variables: the data that describes the variables with name and cardinality - :type variables: typing.Union[pd.DataFrame, np.ndarray, typing.List] - :param prior_net_structure: the data of the real structure, if it exists - :type prior_net_structure: typing.Union[pd.DataFrame, np.ndarray, typing.List] - - :_df_samples_list: a Dataframe list in which every dataframe contains a trajectory - :_raw_data: The raw contents of the json file to import - :type _raw_data: List - """ - - def __init__(self, - trajectory_list: typing.Union[pd.DataFrame, np.ndarray, typing.List] = None, - variables: typing.Union[pd.DataFrame, np.ndarray, typing.List] = None, - prior_net_structure: typing.Union[pd.DataFrame, np.ndarray,typing.List] = None): - - 'If the data are not DataFrame, it will be converted' - if isinstance(variables,list) or isinstance(variables,np.ndarray): - variables = pd.DataFrame(variables) - if isinstance(prior_net_structure,list) or isinstance(prior_net_structure,np.ndarray): - prior_net_structure=pd.DataFrame(prior_net_structure) - - super(SampleImporter, self).__init__(trajectory_list =trajectory_list, - variables= variables, - prior_net_structure=prior_net_structure) - - def import_data(self, header_column = None): - - if header_column is not None: - self._sorter = header_column - else: - self._sorter = self.build_sorter(self._df_samples_list[0]) - - samples_list= self._df_samples_list - - self.compute_row_delta_in_all_samples_frames(samples_list) - - def build_sorter(self, sample_frame: pd.DataFrame) -> typing.List: - """Implements the abstract method build_sorter of the :class:`AbstractImporter` in order to get the ordered variables list. - """ - columns_header = list(sample_frame.columns.values) - del columns_header[0] - return columns_header - - - def dataset_id(self) -> str: - return str("") \ No newline at end of file diff --git a/build/lib/PyCTBN/__init__.py b/build/lib/PyCTBN/__init__.py deleted file mode 100644 index 7adf0d7..0000000 --- a/build/lib/PyCTBN/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -import PyCTBN.PyCTBN -from PyCTBN.PyCTBN import * diff --git a/build/lib/PyCTBN/basic_main.py b/build/lib/PyCTBN/basic_main.py deleted file mode 100644 index b1288db..0000000 --- a/build/lib/PyCTBN/basic_main.py +++ /dev/null @@ -1,39 +0,0 @@ -import glob -import os - -import sys -sys.path.append("./PyCTBN/") - -import structure_graph.network_graph as ng -import structure_graph.sample_path as sp -import structure_graph.set_of_cims as sofc -import estimators.parameters_estimator as pe -import utility.json_importer as ji - - -def main(): - read_files = glob.glob(os.path.join('./data', "*.json")) #Take all json files in this dir - #import data - importer = ji.JsonImporter(read_files[0], 'samples', 'dyn.str', 'variables', 'Time', 'Name') - #Create a SamplePath Obj - s1 = sp.SamplePath(importer) - #Build The trajectries and the structural infos - s1.build_trajectories() - s1.build_structure() - #From The Structure Object build the Graph - g = ng.NetworkGraph(s1.structure) - #Select a node you want to estimate the parameters - node = g.nodes[1] - #Init the graph specifically for THIS node - g.fast_init(node) - #Use SamplePath and Grpah to create a ParametersEstimator Object - p1 = pe.ParametersEstimator(s1, g) - #Init the peEst specifically for THIS node - p1.fast_init(node) - #Compute the parameters - sofc1 = p1.compute_parameters_for_node(node) - #The est CIMS are inside the resultant SetOfCIms Obj - print(sofc1.actual_cims) - -if __name__ == "__main__": - main() diff --git a/build/lib/PyCTBN/setup.py b/build/lib/PyCTBN/setup.py deleted file mode 100644 index 56dd72f..0000000 --- a/build/lib/PyCTBN/setup.py +++ /dev/null @@ -1,20 +0,0 @@ -from setuptools import setup, find_packages - - -setup(name='PyCTBN', - version='1.0', - url='https://github.com/philipMartini/PyCTBN', - license='MIT', - author=['Alessandro Bregoli', 'Filippo Martini','Luca Moretti'], - author_email=['a.bregoli1@campus.unimib.it', 'f.martini@campus.unimib.it','lucamoretti96@gmail.com'], - description='A Continuous Time Bayesian Networks Library', - packages=find_packages('.', exclude=['tests']), - #packages=['PyCTBN.PyCTBN'], - install_requires=[ - 'numpy', 'pandas', 'networkx', 'scipy', 'matplotlib', 'tqdm'], - dependency_links=['https://github.com/numpy/numpy', 'https://github.com/pandas-dev/pandas', - 'https://github.com/networkx/networkx', 'https://github.com/scipy/scipy', - 'https://github.com/tqdm/tqdm'], - #long_description=open('../README.md').read(), - zip_safe=False, - python_requires='>=3.6') From cdb8ec6291cba4abce2aae5b25cb103bc0b8b259 Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sun, 14 Mar 2021 21:11:02 +0100 Subject: [PATCH 086/139] Update python-PyCTBN-package.yml --- .github/workflows/python-PyCTBN-package.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/python-PyCTBN-package.yml b/.github/workflows/python-PyCTBN-package.yml index 6dc0e4d..08fb056 100644 --- a/.github/workflows/python-PyCTBN-package.yml +++ b/.github/workflows/python-PyCTBN-package.yml @@ -5,11 +5,8 @@ name: Python package on: push: - paths-ignore: - -'docs/**' - -'docs-out/**' - -'dist/**' - -'build/**' + paths: + - 'PyCTBN/**' branches: [ master ] tags-ignore: - 'v*' From db4dc33d7d595bd48f172d906ee5cc9742ede24d Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 20:17:01 +0000 Subject: [PATCH 087/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 8ec1ce8daa4569bdec5862fc428cf0f237a7fa20..3dd7f1c59768c6bee3569a552cee904f81605d17 100644 GIT binary patch delta 6938 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 delta 6871 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 U9^8^{T)tk@WUhZRmF;8y1BdkfE&u=k From 294a80cf94fc6caea7a7c2f96f8a091e2e0b1f19 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 20:18:37 +0000 Subject: [PATCH 088/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 3dd7f1c59768c6bee3569a552cee904f81605d17..3f17084507786e0a1c3524c850a9d63f2e8093bd 100644 GIT binary patch delta 7430 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 Date: Sun, 14 Mar 2021 21:22:48 +0100 Subject: [PATCH 089/139] Update README --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 27773ca..13b939c 100644 --- a/README.rst +++ b/README.rst @@ -92,7 +92,7 @@ Parameters Estimation Example #The est CIMS are inside the resultant SetOfCIms Obj print(sofc1.actual_cims) -Structure Estimation Example +Structure Estimation Examples **************************** .. code-block:: python From c8257394901529564ab5f3aac4e1e30d5c6ca9af Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 20:34:48 +0000 Subject: [PATCH 090/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 3f17084507786e0a1c3524c850a9d63f2e8093bd..cbb732589d3014dd0ea31cdaf7433151f96352f7 100644 GIT binary patch delta 7191 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 K=f|?=*na>A3vy!s delta 7265 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 Date: Mon, 15 Mar 2021 00:00:07 +0100 Subject: [PATCH 091/139] Modify plot graph method --- .gitignore | 1 + .../PyCTBN/estimators/structure_estimator.py | 62 +++++++++---------- PyCTBN/setup.py | 20 ------ setup.py | 2 +- 4 files changed, 30 insertions(+), 55 deletions(-) delete mode 100644 PyCTBN/setup.py diff --git a/.gitignore b/.gitignore index 9c3a923..34f5167 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ __pycache__ **/PyCTBN.egg-info **/results_data **/.scannerwork +.idea diff --git a/PyCTBN/PyCTBN/estimators/structure_estimator.py b/PyCTBN/PyCTBN/estimators/structure_estimator.py index b77e21f..e6da5a7 100644 --- a/PyCTBN/PyCTBN/estimators/structure_estimator.py +++ b/PyCTBN/PyCTBN/estimators/structure_estimator.py @@ -142,40 +142,34 @@ class StructureEstimator(object): return nx.difference(real_graph, self._complete_graph).edges def save_plot_estimated_structure_graph(self, file_path: str) -> None: - """Plot the estimated structure in a graphical model style, use .png extension. - Spurious edges are colored in red if a prior structure is present. - - :param file_path: path to save the file to - :type: string - """ - graph_to_draw = nx.DiGraph() - spurious_edges = self.spurious_edges() - non_spurious_edges = list(set(self._complete_graph.edges) - set(spurious_edges)) - edges_colors = ['red' if edge in spurious_edges else 'black' for edge in self._complete_graph.edges] - graph_to_draw.add_edges_from(spurious_edges) - graph_to_draw.add_edges_from(non_spurious_edges) - pos = nx.spring_layout(graph_to_draw, k=0.5*1/np.sqrt(len(graph_to_draw.nodes())), iterations=50,scale=10) - options = { - "node_size": 2000, - "node_color": "white", - "edgecolors": "black", - 'linewidths':2, - "with_labels":True, - "font_size":13, - 'connectionstyle': 'arc3, rad = 0.1', - "arrowsize": 15, - "arrowstyle": '<|-', - "width": 1, - "edge_color":edges_colors, - } - - nx.draw(graph_to_draw, pos, **options) - ax = plt.gca() - ax.margins(0.20) - plt.axis("off") - plt.savefig(file_path) - plt.clf() - print("Estimated Structure Plot Saved At: ", os.path.abspath(file_path)) + """Plot the estimated structure in a graphical model style, use .png extension. + + :param file_path: path to save the file to + :type: string + """ + pos = nx.spring_layout(self._complete_graph, k=0.5*1/np.sqrt(len(self._complete_graph.nodes)), + iterations=50,scale=10) + options = { + "node_size": 2000, + "node_color": "white", + "edgecolors": "black", + 'linewidths':2, + "with_labels":True, + "font_size":13, + 'connectionstyle': 'arc3, rad = 0.1', + "arrowsize": 15, + #"arrowstyle": '<|-', + "width": 1, + #"edge_color":edges_colors, + } + + nx.draw(self._complete_graph, pos, **options) + ax = plt.gca() + ax.margins(0.20) + plt.axis("off") + plt.savefig(file_path) + plt.clf() + print("Estimated Structure Plot Saved At: ", os.path.abspath(file_path)) diff --git a/PyCTBN/setup.py b/PyCTBN/setup.py deleted file mode 100644 index 56dd72f..0000000 --- a/PyCTBN/setup.py +++ /dev/null @@ -1,20 +0,0 @@ -from setuptools import setup, find_packages - - -setup(name='PyCTBN', - version='1.0', - url='https://github.com/philipMartini/PyCTBN', - license='MIT', - author=['Alessandro Bregoli', 'Filippo Martini','Luca Moretti'], - author_email=['a.bregoli1@campus.unimib.it', 'f.martini@campus.unimib.it','lucamoretti96@gmail.com'], - description='A Continuous Time Bayesian Networks Library', - packages=find_packages('.', exclude=['tests']), - #packages=['PyCTBN.PyCTBN'], - install_requires=[ - 'numpy', 'pandas', 'networkx', 'scipy', 'matplotlib', 'tqdm'], - dependency_links=['https://github.com/numpy/numpy', 'https://github.com/pandas-dev/pandas', - 'https://github.com/networkx/networkx', 'https://github.com/scipy/scipy', - 'https://github.com/tqdm/tqdm'], - #long_description=open('../README.md').read(), - zip_safe=False, - python_requires='>=3.6') diff --git a/setup.py b/setup.py index 7cad4ea..58f0226 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup(name='PyCTBN', - version='1.0', + version='2.1', url='https://github.com/philipMartini/PyCTBN', license='MIT', author=['Alessandro Bregoli', 'Filippo Martini','Luca Moretti'], From 528a4436b126f15ea26199874e15614711b1e163 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 23:11:08 +0000 Subject: [PATCH 092/139] Update documentation --- .../doctrees/PyCTBN.PyCTBN.estimators.doctree | Bin 253064 -> 252930 bytes docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes .../_build/html/PyCTBN.PyCTBN.estimators.html | 3 +-- docs-out/_build/html/searchindex.js | 2 +- docs/PyCTBN.PyCTBN.estimators.html | 3 +-- docs/searchindex.js | 2 +- 6 files changed, 4 insertions(+), 6 deletions(-) diff --git a/docs-out/_build/doctrees/PyCTBN.PyCTBN.estimators.doctree b/docs-out/_build/doctrees/PyCTBN.PyCTBN.estimators.doctree index 94d843830b612e391b8ce9eb5f75f9dcd94a542b..7524a26f25624b179527a2c99cacee51d8ce0e81 100644 GIT binary patch delta 106 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 delta 7464 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 -

    Plot the estimated structure in a graphical model style, use .png extension. -Spurious edges are colored in red if a prior structure is present.

    +

    Plot the estimated structure in a graphical model style, use .png extension.

    Parameters

    file_path – path to save the file to

    diff --git a/docs-out/_build/html/searchindex.js b/docs-out/_build/html/searchindex.js index 8061880..051c818 100644 --- a/docs-out/_build/html/searchindex.js +++ b/docs-out/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["PyCTBN","PyCTBN.PyCTBN","PyCTBN.PyCTBN.estimators","PyCTBN.PyCTBN.optimizers","PyCTBN.PyCTBN.structure_graph","PyCTBN.PyCTBN.utility","PyCTBN.tests","PyCTBN.tests.estimators","PyCTBN.tests.optimizers","PyCTBN.tests.structure_graph","PyCTBN.tests.utility","basic_main","examples","index","modules","setup"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["PyCTBN.rst","PyCTBN.PyCTBN.rst","PyCTBN.PyCTBN.estimators.rst","PyCTBN.PyCTBN.optimizers.rst","PyCTBN.PyCTBN.structure_graph.rst","PyCTBN.PyCTBN.utility.rst","PyCTBN.tests.rst","PyCTBN.tests.estimators.rst","PyCTBN.tests.optimizers.rst","PyCTBN.tests.structure_graph.rst","PyCTBN.tests.utility.rst","basic_main.rst","examples.rst","index.rst","modules.rst","setup.rst"],objects:{"":{PyCTBN:[0,0,0,"-"]},"PyCTBN.PyCTBN":{estimators:[2,0,0,"-"],optimizers:[3,0,0,"-"],structure_graph:[4,0,0,"-"],utility:[5,0,0,"-"]},"PyCTBN.PyCTBN.estimators":{fam_score_calculator:[2,0,0,"-"],parameters_estimator:[2,0,0,"-"],structure_constraint_based_estimator:[2,0,0,"-"],structure_estimator:[2,0,0,"-"],structure_score_based_estimator:[2,0,0,"-"]},"PyCTBN.PyCTBN.estimators.fam_score_calculator":{FamScoreCalculator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator":{get_fam_score:[2,2,1,""],marginal_likelihood_q:[2,2,1,""],marginal_likelihood_theta:[2,2,1,""],single_cim_xu_marginal_likelihood_q:[2,2,1,""],single_cim_xu_marginal_likelihood_theta:[2,2,1,""],single_internal_cim_xxu_marginal_likelihood_theta:[2,2,1,""],variable_cim_xu_marginal_likelihood_q:[2,2,1,""],variable_cim_xu_marginal_likelihood_theta:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator":{ParametersEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator":{compute_parameters_for_node:[2,2,1,""],compute_state_res_time_for_node:[2,2,1,""],compute_state_transitions_for_a_node:[2,2,1,""],fast_init:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator":{StructureConstraintBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator":{complete_test:[2,2,1,""],compute_thumb_value:[2,2,1,""],ctpc_algorithm:[2,2,1,""],estimate_structure:[2,2,1,""],independence_test:[2,2,1,""],one_iteration_of_CTPC_algorithm:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator":{StructureEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator":{adjacency_matrix:[2,2,1,""],build_complete_graph:[2,2,1,""],build_removable_edges_matrix:[2,2,1,""],estimate_structure:[2,2,1,""],generate_possible_sub_sets_of_size:[2,2,1,""],save_plot_estimated_structure_graph:[2,2,1,""],save_results:[2,2,1,""],spurious_edges:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator":{StructureScoreBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator":{estimate_parents:[2,2,1,""],estimate_structure:[2,2,1,""],get_score_from_graph:[2,2,1,""]},"PyCTBN.PyCTBN.optimizers":{constraint_based_optimizer:[3,0,0,"-"],hill_climbing_search:[3,0,0,"-"],optimizer:[3,0,0,"-"],tabu_search:[3,0,0,"-"]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer":{ConstraintBasedOptimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search":{HillClimbing:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search.HillClimbing":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer":{Optimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer.Optimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search":{TabuSearch:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search.TabuSearch":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.structure_graph":{conditional_intensity_matrix:[4,0,0,"-"],network_graph:[4,0,0,"-"],sample_path:[4,0,0,"-"],set_of_cims:[4,0,0,"-"],structure:[4,0,0,"-"],trajectory:[4,0,0,"-"]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix":{ConditionalIntensityMatrix:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix":{cim:[4,2,1,""],compute_cim_coefficients:[4,2,1,""],state_residence_times:[4,2,1,""],state_transition_matrix:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph":{NetworkGraph:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph":{add_edges:[4,2,1,""],add_nodes:[4,2,1,""],build_p_comb_structure_for_a_node:[4,2,1,""],build_time_columns_filtering_for_a_node:[4,2,1,""],build_time_scalar_indexing_structure_for_a_node:[4,2,1,""],build_transition_filtering_for_a_node:[4,2,1,""],build_transition_scalar_indexing_structure_for_a_node:[4,2,1,""],clear_indexing_filtering_structures:[4,2,1,""],edges:[4,2,1,""],fast_init:[4,2,1,""],get_node_indx:[4,2,1,""],get_ordered_by_indx_set_of_parents:[4,2,1,""],get_parents_by_id:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],has_edge:[4,2,1,""],nodes:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_values:[4,2,1,""],p_combs:[4,2,1,""],remove_edges:[4,2,1,""],remove_node:[4,2,1,""],time_filtering:[4,2,1,""],time_scalar_indexing_strucure:[4,2,1,""],transition_filtering:[4,2,1,""],transition_scalar_indexing_structure:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path":{SamplePath:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath":{build_structure:[4,2,1,""],build_trajectories:[4,2,1,""],clear_memory:[4,2,1,""],has_prior_net_structure:[4,2,1,""],structure:[4,2,1,""],total_variables_count:[4,2,1,""],trajectories:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims":{SetOfCims:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims":{actual_cims:[4,2,1,""],build_cims:[4,2,1,""],build_times_and_transitions_structures:[4,2,1,""],filter_cims_with_mask:[4,2,1,""],get_cims_number:[4,2,1,""],p_combs:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.structure":{Structure:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.structure.Structure":{add_edge:[4,2,1,""],clean_structure_edges:[4,2,1,""],contains_edge:[4,2,1,""],edges:[4,2,1,""],get_node_id:[4,2,1,""],get_node_indx:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_labels:[4,2,1,""],nodes_values:[4,2,1,""],remove_edge:[4,2,1,""],remove_node:[4,2,1,""],total_variables_number:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory":{Trajectory:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory":{complete_trajectory:[4,2,1,""],size:[4,2,1,""],times:[4,2,1,""],trajectory:[4,2,1,""]},"PyCTBN.PyCTBN.utility":{abstract_importer:[5,0,0,"-"],cache:[5,0,0,"-"],json_importer:[5,0,0,"-"],sample_importer:[5,0,0,"-"]},"PyCTBN.PyCTBN.utility.abstract_importer":{AbstractImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter":{build_list_of_samples_array:[5,2,1,""],build_sorter:[5,2,1,""],clear_concatenated_frame:[5,2,1,""],compute_row_delta_in_all_samples_frames:[5,2,1,""],compute_row_delta_sigle_samples_frame:[5,2,1,""],concatenated_samples:[5,2,1,""],dataset_id:[5,2,1,""],file_path:[5,2,1,""],sorter:[5,2,1,""],structure:[5,2,1,""],variables:[5,2,1,""]},"PyCTBN.PyCTBN.utility.cache":{Cache:[5,1,1,""]},"PyCTBN.PyCTBN.utility.cache.Cache":{clear:[5,2,1,""],find:[5,2,1,""],put:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_importer":{JsonImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_importer.JsonImporter":{build_sorter:[5,2,1,""],clear_data_frame_list:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""],import_sampled_cims:[5,2,1,""],import_structure:[5,2,1,""],import_trajectories:[5,2,1,""],import_variables:[5,2,1,""],normalize_trajectories:[5,2,1,""],one_level_normalizing:[5,2,1,""],read_json_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.sample_importer":{SampleImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.sample_importer.SampleImporter":{build_sorter:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""]},"PyCTBN.tests":{estimators:[7,0,0,"-"],optimizers:[8,0,0,"-"],structure_graph:[9,0,0,"-"],utility:[10,0,0,"-"]},"PyCTBN.tests.estimators":{test_parameters_estimator:[7,0,0,"-"],test_structure_constraint_based_estimator:[7,0,0,"-"],test_structure_estimator:[7,0,0,"-"],test_structure_score_based_estimator:[7,0,0,"-"]},"PyCTBN.tests.estimators.test_parameters_estimator":{TestParametersEstimatior:[7,1,1,""]},"PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior":{aux_import_sampled_cims:[7,2,1,""],cim_equality_test:[7,2,1,""],equality_of_cims_of_node:[7,2,1,""],setUpClass:[7,2,1,""],test_compute_parameters_for_node:[7,2,1,""],test_fast_init:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator":{TestStructureConstraintBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_estimator":{TestStructureEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator":{setUpClass:[7,2,1,""],test_adjacency_matrix:[7,2,1,""],test_build_complete_graph:[7,2,1,""],test_build_removable_edges_matrix:[7,2,1,""],test_generate_possible_sub_sets_of_size:[7,2,1,""],test_init:[7,2,1,""],test_save_plot_estimated_graph:[7,2,1,""],test_save_results:[7,2,1,""],test_time:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator":{TestStructureScoreBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""],test_structure_monoprocesso:[7,2,1,""]},"PyCTBN.tests.optimizers":{test_hill_climbing_search:[8,0,0,"-"],test_tabu_search:[8,0,0,"-"]},"PyCTBN.tests.optimizers.test_hill_climbing_search":{TestHillClimbingSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_hill_climbing_search.TestHillClimbingSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.optimizers.test_tabu_search":{TestTabuSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_tabu_search.TestTabuSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.structure_graph":{test_cim:[9,0,0,"-"],test_networkgraph:[9,0,0,"-"],test_sample_path:[9,0,0,"-"],test_setofcims:[9,0,0,"-"],test_structure:[9,0,0,"-"],test_trajectory:[9,0,0,"-"]},"PyCTBN.tests.structure_graph.test_cim":{TestConditionalIntensityMatrix:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix":{setUpClass:[9,2,1,""],test_compute_cim_coefficients:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph":{TestNetworkGraph:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph":{aux_build_p_combs_structure:[9,2,1,""],aux_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],aux_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],aux_build_transition_columns_filtering_structure:[9,2,1,""],aux_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_add_edges:[9,2,1,""],test_add_nodes:[9,2,1,""],test_build_p_combs_structure:[9,2,1,""],test_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],test_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],test_build_transition_columns_filtering_structure:[9,2,1,""],test_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],test_fast_init:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_ordered_by_indx_set_of_parents:[9,2,1,""],test_get_parents_by_id:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_sample_path":{TestSamplePath:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath":{setUpClass:[9,2,1,""],test_buid_samplepath_no_concatenated_samples:[9,2,1,""],test_buid_samplepath_no_variables:[9,2,1,""],test_build_saplepath_no_prior_net_structure:[9,2,1,""],test_build_structure:[9,2,1,""],test_build_structure_bad_sorter:[9,2,1,""],test_build_trajectories:[9,2,1,""],test_init:[9,2,1,""],test_init_not_filled_dataframse:[9,2,1,""],test_init_not_initialized_importer:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_setofcims":{TestSetOfCims:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims":{another_filtering_method:[9,2,1,""],aux_test_build_cims:[9,2,1,""],aux_test_init:[9,2,1,""],build_p_comb_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_build_cims:[9,2,1,""],test_filter_cims_with_mask:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_structure":{TestStructure:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_structure.TestStructure":{setUpClass:[9,2,1,""],test_edges_operations:[9,2,1,""],test_equality:[9,2,1,""],test_get_node_id:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_positional_node_indx:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectory":{TestTrajectory:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory":{setUpClass:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.utility":{test_cache:[10,0,0,"-"],test_json_importer:[10,0,0,"-"],test_sample_importer:[10,0,0,"-"]},"PyCTBN.tests.utility.test_cache":{TestCache:[10,1,1,""]},"PyCTBN.tests.utility.test_cache.TestCache":{test_clear:[10,2,1,""],test_find:[10,2,1,""],test_init:[10,2,1,""],test_put:[10,2,1,""]},"PyCTBN.tests.utility.test_json_importer":{TestJsonImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_json_importer.TestJsonImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_build_sorter:[10,2,1,""],test_clear_concatenated_frame:[10,2,1,""],test_clear_data_frame_list:[10,2,1,""],test_compute_row_delta_in_all_frames:[10,2,1,""],test_compute_row_delta_in_all_frames_not_init_sorter:[10,2,1,""],test_compute_row_delta_single_samples_frame:[10,2,1,""],test_dataset_id:[10,2,1,""],test_file_path:[10,2,1,""],test_import_data:[10,2,1,""],test_import_sampled_cims:[10,2,1,""],test_import_structure:[10,2,1,""],test_import_variables:[10,2,1,""],test_init:[10,2,1,""],test_normalize_trajectories:[10,2,1,""],test_normalize_trajectories_wrong_indx:[10,2,1,""],test_normalize_trajectories_wrong_key:[10,2,1,""],test_read_json_file_found:[10,2,1,""],test_read_json_file_not_found:[10,2,1,""]},"PyCTBN.tests.utility.test_sample_importer":{TestSampleImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_sample_importer.TestSampleImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_init:[10,2,1,""],test_order:[10,2,1,""]},PyCTBN:{PyCTBN:[1,0,0,"-"],tests:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"abstract":[2,3,4,5,12],"boolean":[2,4],"case":[7,8,9,10],"class":[2,3,4,5,7,8,9,10,12],"default":[2,3,5],"float":2,"function":2,"import":[4,5,13,14],"int":[2,3,4,5],"null":2,"return":[2,3,4,5,9,12],"static":[2,4],"super":12,"true":[2,12],"var":12,HAS:5,Has:[2,4],NOT:2,The:[2,4,5,12],Use:[2,12],__actual_cach:5,__init__:12,__list_of_sets_of_par:5,_actual_cim:4,_actual_trajectori:4,_aggregated_info_about_nodes_par:4,_array_indx:5,_cach:2,_cim:4,_complete_graph:2,_df_samples_list:[5,12],_df_structur:5,_df_variabl:[5,12],_file_path:12,_graph:[4,12],_import:4,_net_graph:2,_node:2,_node_id:4,_nodes_indx:2,_nodes_v:2,_p_combs_structur:4,_raw_data:5,_sample_path:2,_single_set_of_cim:2,_sorter:[5,12],_state_residence_tim:4,_structur:4,_structure_label:5,_time:4,_time_filt:4,_time_scalar_indexing_structur:4,_total_variables_count:4,_total_variables_numb:4,_trajectori:4,_transition_filt:4,_transition_matric:4,_transition_scalar_indexing_structur:4,_variables_label:5,abc:[3,5],about:[3,4],abstract_import:[0,1,4,13,14],abstractimport:[4,5,12],act:5,actual:[2,4],actual_cim:[4,12],add:[4,5],add_edg:4,add_nod:4,added:2,addit:2,adjac:[2,12],adjacency_matrix:[2,12],after:5,against:2,aggreg:4,algorithm:[2,3,12],all:[2,3,4,5,9,12],alpha_xu:2,alpha_xxu:2,alreadi:[5,12],also:[2,4],ani:[2,3],anoth:4,another_filtering_method:9,approach:2,arc:5,arrai:[2,4,5,12],assign:2,assum:2,aux_build_p_combs_structur:9,aux_build_time_columns_filtering_structure_for_a_nod:9,aux_build_time_scalar_indexing_structure_for_a_nod:9,aux_build_transition_columns_filtering_structur:9,aux_build_transition_scalar_indexing_structure_for_a_nod:9,aux_import_sampled_cim:7,aux_test_build_cim:9,aux_test_init:9,axi:12,base:[2,3,4,5,7,8,9,10],bayesian:2,befor:[2,3,7,8,9,10],belong:2,best:2,between:5,bool:[2,4],both:[2,5],bound:4,build:[2,4,5,9,12],build_cim:4,build_complete_graph:2,build_list_of_samples_arrai:5,build_p_comb_structure_for_a_nod:[4,9],build_removable_edges_matrix:2,build_sort:[5,12],build_structur:[4,12],build_time_columns_filtering_for_a_nod:4,build_time_scalar_indexing_structure_for_a_nod:4,build_times_and_transitions_structur:4,build_trajectori:[4,12],build_transition_filtering_for_a_nod:4,build_transition_scalar_indexing_structure_for_a_nod:4,built:2,cach:[0,1,2,13,14],calcul:2,call:[5,12],cardin:[2,4,5,9],cardinalit:[4,5],caridin:4,caridinalit:4,chang:[4,5],check:4,chi:2,chi_test:2,chi_test_alfa:2,child:[2,3],child_indx:2,child_states_numb:2,child_val:2,cim1:[2,7],cim2:[2,7],cim:[2,4,5,12],cim_equality_test:7,cims_kei:5,cims_label:7,classmethod:[7,8,9,10],clean_structure_edg:4,clear:[4,5],clear_concatenated_fram:5,clear_data_frame_list:5,clear_indexing_filtering_structur:4,clear_memori:4,climb:[2,3],coeffici:4,col:4,color:2,cols_filt:2,column:[2,4,5,12],columns_head:5,comb:4,combin:[4,5,9],combinatori:[4,9],common:2,complet:[2,4,5],complete_test:2,complete_trajectori:4,comput:[2,3,4,5,12],compute_cim_coeffici:4,compute_parameters_for_nod:[2,12],compute_row_delta_in_all_samples_fram:[5,12],compute_row_delta_sigle_samples_fram:5,compute_state_res_time_for_nod:2,compute_state_transitions_for_a_nod:2,compute_thumb_valu:2,concatanated_sampl:5,concaten:[4,5],concatenated_sampl:5,condit:4,conditional_intensity_matrix:[0,1,2,13,14],conditionalintensitymatrix:[2,4],consid:[2,4],constraint:2,constraint_based_optim:[0,1,13,14],constraintbasedoptim:3,construct:[4,5,12],conta:5,contain:[2,4,5,9],contains_edg:4,content:[13,14],convert:[2,5],copi:5,core:5,correct:[4,5],could:2,count:4,creat:[2,4,12],csv:12,csvimport:12,ctbn:2,ctpc:[2,3,12],ctpc_algorithm:[2,12],current:[2,3,5],cut:5,dafram:5,data:[2,3,4,5,13,14],datafram:[4,5,12],dataset:[3,4,5],dataset_id:[5,12],datfram:5,def:12,defin:5,definit:5,defualt:2,delta:[2,4,5],demonstr:12,describ:5,desir:[2,4],df_samples_list:5,dict:[5,12],dictionari:5,differ:5,differt:2,digraph:2,dimens:4,dir:12,direct:[2,4],directli:5,disabl:[2,3],disable_multiprocess:2,distribuit:2,doc:5,doubl:4,download:12,drop:12,duplic:4,dyn:12,each:[2,3,5],edg:[2,4,5,12],edges_list:4,end:5,entir:2,equal:4,equality_of_cims_of_nod:7,est:12,estim:[0,1,3,4,6,13,14],estimate_par:2,estimate_structur:2,estimated_cim:7,everi:[4,5],exam:12,exampl:[5,13,14],exclud:2,exctract:5,exist:5,exp_test_alfa:2,exponenti:2,expos:5,extend:12,extens:[2,5],extract:[4,5],fals:2,fam_score_calcul:[0,1,13,14],famscor:2,famscorecalcul:2,fast_init:[2,4,12],file:[2,5,12],file_path:[2,5,12],filepath:5,fill:[2,12],filter:[2,4],filter_cims_with_mask:4,find:[2,5],first:[2,12],fixtur:[7,8,9,10],follow:[4,5],form:4,format:12,formula:2,found:5,frame:5,from:[4,5,12],from_nod:5,gener:2,generate_possible_sub_sets_of_s:2,get:[2,5],get_cims_numb:4,get_fam_scor:2,get_node_id:4,get_node_indx:4,get_ordered_by_indx_set_of_par:4,get_parents_by_id:4,get_positional_node_indx:4,get_score_from_graph:2,get_states_numb:4,given:[2,4,5],glob:12,graph:[2,4,9,12],graph_struct:4,graphic:2,grid:[4,9],grpah:12,has:[5,12],has_edg:4,has_prior_net_structur:4,have:5,header:5,header_column:5,hill:[2,3],hill_climbing_search:[0,1,13,14],hillclimb:3,hold:[2,4],hook:[7,8,9,10],how:5,hyperparamet:2,hypothesi:2,identifi:[2,4,5],iff:2,implement:[3,5,13,14],import_data:[5,12],import_sampled_cim:5,import_structur:5,import_trajectori:5,import_vari:[5,12],improv:[2,3],includ:2,independ:2,independence_test:2,index:[2,4,5,12,13],indic:4,indx:5,info:[4,12],inform:[3,4],init:12,initi:[2,4,5,12],inplac:12,insid:12,instal:[13,14],interest:4,interfac:3,intes:4,iter:[2,3],iterations_numb:[2,3],its:[2,3],join:12,json:[2,5,12],json_import:[0,1,13,14],jsonarrai:5,jsonimport:[5,12],keep:[2,3,5],kei:5,kind:2,knowledg:2,known:2,known_edg:2,label:[2,3,4,5],lenght:[2,3],level:[2,5],likelihood:2,list:[2,3,4,5,12],list_of_column:4,list_of_edg:4,list_of_nod:4,load:5,loop:2,m_xu_suff_stat:2,m_xxu_suff_stat:2,main:12,margin:2,marginal_likelihood_q:2,marginal_likelihood_theta:2,mask:[4,9],mask_arr:4,matric:[2,4],matrix:[2,4,5,9,12],max_par:[2,3],maximum:[2,3],member:[4,5],mention:4,merg:5,method:[2,5,7,8,9,10],methodnam:[7,8,9,10],model:2,modul:[13,14],multipl:5,multiprocess:2,name:[2,4,5,12],ndarrai:[2,4,5],necessari:[2,4,5],nest:5,net:[2,3,4,5,12],net_graph:2,network:[2,4,5],network_graph:[0,1,2,13,14],networkgraph:[2,4,12],networkx:2,node:[2,3,4,5,9,12],node_id:[2,3,4,9],node_index:4,node_indx:[2,4],node_st:[4,9],node_states_numb:[4,9],nodes_index:4,nodes_indexes_arr:4,nodes_label:4,nodes_labels_list:4,nodes_numb:4,nodes_vals_arr:4,nodes_valu:[4,12],none:[2,3,4,5,7,9,10,12],normal:5,normalize_trajectori:5,number:[2,3,4],numpi:[2,4,5,9],obj:[10,12],object:[2,3,4,5,12],one:[4,5],one_iteration_of_ctpc_algorithm:2,one_level_norm:5,onli:5,oper:2,optim:[0,1,2,6,13,14],optimize_structur:3,option:[2,3],order:[2,5,10],origin:5,original_cols_numb:4,otherwis:[2,5],out:5,outer:[5,12],over:2,own:[13,14],p_comb:[4,9],p_indx:[4,9],p_val:9,p_valu:9,packag:[13,14],page:13,panda:[5,12],param:4,paramet:[2,3,4,5,9,13,14],parameters_estim:[0,1,13,14],parametersestim:[2,12],parent:[2,3,4,5],parent_indx:2,parent_label:2,parent_set:2,parent_set_v:2,parent_v:2,parent_valu:9,parents_cardin:4,parents_comb:5,parents_index:4,parents_indx:9,parents_label:[4,9],parents_states_numb:[4,9],parents_v:[4,9],parents_valu:[4,9],part:2,particular:[2,5],pass:12,path:[2,5,12],patienc:[2,3],peest:12,perform:2,pip:12,place:5,plot:2,png:2,posit:[4,5],possibl:[2,4],predict:3,prepar:5,present:[2,5],print:12,prior:[2,12],prior_net_structur:5,process:[2,3,4,5],properli:5,properti:[4,5],put:5,pyctbn:12,q_xx:4,rappres:4,raw:5,raw_data:5,read:[5,12],read_csv:12,read_csv_fil:12,read_fil:12,read_json_fil:5,real:[2,4,5,12],red:2,refer:[4,5],reject:2,rel:4,relat:5,releas:12,remain:5,remov:[2,4,5],remove_edg:4,remove_nod:4,repres:4,represent:2,res:4,resid:[2,4],result:[2,5,12],rtype:4,rule:[2,3],run:[7,8,9,10],runtest:[7,8,9,10],same:5,sampl:[4,5,12],sample_fram:[5,12],sample_import:[0,1,13,14],sample_path:[0,1,2,13,14],sampled_cim:7,sampleimport:5,samplepath:[2,4,12],samples_label:5,save:[2,12],save_plot_estimated_structure_graph:2,save_result:[2,12],scalar_index:2,scalar_indexes_struct:2,score:2,se1:12,search:[2,3,13],second:2,see:5,select:12,self:[2,5,12],sep:2,sep_set:2,set:[2,4,5,7,8,9,10],set_of_cim:[0,1,2,5,13,14],setofcim:[2,4,5,12],setupclass:[7,8,9,10],shift:[4,5],shifted_cols_head:5,show:2,signific:2,simbol:5,simpl:12,simpli:12,sinc:4,single_cim_xu_marginal_likelihood_q:2,single_cim_xu_marginal_likelihood_theta:2,single_internal_cim_xxu_marginal_likelihood_theta:2,size:[2,4],socim:5,sofc1:12,sorter:5,specif:[2,4,12],spuriou:2,spurious_edg:2,start:5,state:[2,4],state_res_tim:4,state_residence_tim:4,state_transition_matrix:4,statist:2,stop:[2,3],str:[2,3,4,5,12],string:[2,3,4,5],structur:[0,1,2,3,5,9,13,14],structure_constraint_based_estim:[0,1,13,14],structure_estim:[0,1,3,13,14],structure_estimation_exampl:12,structure_graph:[0,1,2,5,6,13,14],structure_label:5,structure_score_based_estim:[0,1,13,14],structureconstraintbasedestim:2,structureestim:[2,3,12],structurescorebasedestim:2,structut:4,style:2,submodul:[1,6,13,14],subpackag:[13,14],subset:2,suffici:2,suffuci:2,symbol:[4,5],synthet:5,t_xu_suff_stat:2,tabu:[2,3],tabu_length:[2,3],tabu_rules_dur:[2,3],tabu_search:[0,1,13,14],tabusearch:3,take:12,tar:12,task:[2,4],tau_xu:2,ternari:12,test:2,test_add_edg:9,test_add_nod:9,test_adjacency_matrix:7,test_buid_samplepath_no_concatenated_sampl:9,test_buid_samplepath_no_vari:9,test_build_cim:9,test_build_complete_graph:7,test_build_p_combs_structur:9,test_build_removable_edges_matrix:7,test_build_saplepath_no_prior_net_structur:9,test_build_sort:10,test_build_structur:9,test_build_structure_bad_sort:9,test_build_time_columns_filtering_structure_for_a_nod:9,test_build_time_scalar_indexing_structure_for_a_nod:9,test_build_trajectori:9,test_build_transition_columns_filtering_structur:9,test_build_transition_scalar_indexing_structure_for_a_nod:9,test_cach:6,test_child:2,test_cim:6,test_clear:10,test_clear_concatenated_fram:10,test_clear_data_frame_list:10,test_compute_cim_coeffici:9,test_compute_parameters_for_nod:7,test_compute_row_delta_in_all_fram:10,test_compute_row_delta_in_all_frames_not_init_sort:10,test_compute_row_delta_single_samples_fram:10,test_dataset_id:10,test_edges_oper:9,test_equ:9,test_fast_init:[7,9],test_file_path:10,test_filter_cims_with_mask:9,test_find:10,test_generate_possible_sub_sets_of_s:7,test_get_node_id:9,test_get_node_indx:9,test_get_ordered_by_indx_set_of_par:9,test_get_parents_by_id:9,test_get_positional_node_indx:9,test_get_states_numb:9,test_hill_climbing_search:6,test_import_data:10,test_import_sampled_cim:10,test_import_structur:10,test_import_vari:10,test_init:[7,9,10],test_init_not_filled_dataframs:9,test_init_not_initialized_import:9,test_json_import:6,test_networkgraph:6,test_normalize_trajectori:10,test_normalize_trajectories_wrong_indx:10,test_normalize_trajectories_wrong_kei:10,test_ord:10,test_par:2,test_parameters_estim:6,test_put:10,test_read_json_file_found:10,test_read_json_file_not_found:10,test_repr:9,test_sample_import:6,test_sample_path:6,test_save_plot_estimated_graph:7,test_save_result:7,test_setofcim:6,test_structur:[6,8],test_structure_1:7,test_structure_2:7,test_structure_3:[7,8],test_structure_constraint_based_estim:6,test_structure_estim:6,test_structure_monoprocesso:7,test_structure_score_based_estim:6,test_tabu_search:6,test_tim:7,test_trajectori:6,testcach:10,testcas:[7,8,9,10],testconditionalintensitymatrix:9,testhillclimbingsearch:8,testjsonimport:10,testnetworkgraph:9,testparametersestimatior:7,testsampleimport:10,testsamplepath:9,testsetofcim:9,teststructur:9,teststructureconstraintbasedestim:7,teststructureestim:7,teststructurescorebasedestim:7,testtabusearch:8,testtrajectori:9,tha:5,theta:2,thi:[2,4,5,12],three:12,threshold:2,thumb:2,thumb_threshold:2,thumb_valu:2,time:[2,4,5,12],time_filt:4,time_kei:5,time_scalar_indexing_strucur:4,timestamp:5,to_nod:5,tot_vars_count:[2,3],total:[2,4],total_variables_count:4,total_variables_numb:4,traj:5,trajecory_head:5,trajectori:[0,1,2,5,12,13,14],trajectories_kei:5,trajectory_list:5,trajectri:12,transit:[2,4,5],transition_filt:4,transition_matric:4,transition_scalar_indexing_structur:4,tri:5,tupl:4,tutori:5,two:2,type:[2,3,4,5,12],union:5,uniqu:5,unittest:[7,8,9,10],unus:4,usag:[13,14],use:[2,12],used:[2,3,4,5],using:[2,3,4,5],util:[0,1,4,6,13,14],valid:2,valu:[2,3,4,5,9,12],values_list:12,var_id:2,variabl:[2,3,4,5,12],variable_cardin:5,variable_cim_xu_marginal_likelihood_q:2,variable_cim_xu_marginal_likelihood_theta:2,variable_label:5,variables_kei:5,variables_label:5,vector:[2,4],want:12,when:2,where:5,which:[2,3,4,5],whl:12,who:2,without:[2,3],you:[2,5,12],your:[13,14]},titles:["PyCTBN package","PyCTBN.PyCTBN package","PyCTBN.PyCTBN.estimators package","PyCTBN.PyCTBN.optimizers package","PyCTBN.PyCTBN.structure_graph package","PyCTBN.PyCTBN.utility package","PyCTBN.tests package","PyCTBN.tests.estimators package","PyCTBN.tests.optimizers package","PyCTBN.tests.structure_graph package","PyCTBN.tests.utility package","basic_main module","Examples","Welcome to PyCTBN\u2019s documentation!","PyCTBN","setup module"],titleterms:{"import":12,abstract_import:5,basic_main:11,cach:5,conditional_intensity_matrix:4,constraint_based_optim:3,content:[0,1,2,3,4,5,6,7,8,9,10],data:12,document:13,estim:[2,7,12],exampl:12,fam_score_calcul:2,hill_climbing_search:3,implement:12,indic:13,instal:12,json_import:5,modul:[0,1,2,3,4,5,6,7,8,9,10,11,15],network_graph:4,optim:[3,8],own:12,packag:[0,1,2,3,4,5,6,7,8,9,10],paramet:12,parameters_estim:2,pyctbn:[0,1,2,3,4,5,6,7,8,9,10,13,14],sample_import:5,sample_path:4,set_of_cim:4,setup:15,structur:[4,12],structure_constraint_based_estim:2,structure_estim:2,structure_graph:[4,9],structure_score_based_estim:2,submodul:[0,2,3,4,5,7,8,9,10],subpackag:[0,1,6],tabl:13,tabu_search:3,test:[6,7,8,9,10],test_cach:10,test_cim:9,test_hill_climbing_search:8,test_json_import:10,test_networkgraph:9,test_parameters_estim:7,test_sample_import:10,test_sample_path:9,test_setofcim:9,test_structur:9,test_structure_constraint_based_estim:7,test_structure_estim:7,test_structure_score_based_estim:7,test_tabu_search:8,test_trajectori:9,trajectori:4,usag:12,util:[5,10],welcom:13,your:12}}) \ No newline at end of file +Search.setIndex({docnames:["PyCTBN","PyCTBN.PyCTBN","PyCTBN.PyCTBN.estimators","PyCTBN.PyCTBN.optimizers","PyCTBN.PyCTBN.structure_graph","PyCTBN.PyCTBN.utility","PyCTBN.tests","PyCTBN.tests.estimators","PyCTBN.tests.optimizers","PyCTBN.tests.structure_graph","PyCTBN.tests.utility","basic_main","examples","index","modules","setup"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["PyCTBN.rst","PyCTBN.PyCTBN.rst","PyCTBN.PyCTBN.estimators.rst","PyCTBN.PyCTBN.optimizers.rst","PyCTBN.PyCTBN.structure_graph.rst","PyCTBN.PyCTBN.utility.rst","PyCTBN.tests.rst","PyCTBN.tests.estimators.rst","PyCTBN.tests.optimizers.rst","PyCTBN.tests.structure_graph.rst","PyCTBN.tests.utility.rst","basic_main.rst","examples.rst","index.rst","modules.rst","setup.rst"],objects:{"":{PyCTBN:[0,0,0,"-"]},"PyCTBN.PyCTBN":{estimators:[2,0,0,"-"],optimizers:[3,0,0,"-"],structure_graph:[4,0,0,"-"],utility:[5,0,0,"-"]},"PyCTBN.PyCTBN.estimators":{fam_score_calculator:[2,0,0,"-"],parameters_estimator:[2,0,0,"-"],structure_constraint_based_estimator:[2,0,0,"-"],structure_estimator:[2,0,0,"-"],structure_score_based_estimator:[2,0,0,"-"]},"PyCTBN.PyCTBN.estimators.fam_score_calculator":{FamScoreCalculator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator":{get_fam_score:[2,2,1,""],marginal_likelihood_q:[2,2,1,""],marginal_likelihood_theta:[2,2,1,""],single_cim_xu_marginal_likelihood_q:[2,2,1,""],single_cim_xu_marginal_likelihood_theta:[2,2,1,""],single_internal_cim_xxu_marginal_likelihood_theta:[2,2,1,""],variable_cim_xu_marginal_likelihood_q:[2,2,1,""],variable_cim_xu_marginal_likelihood_theta:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator":{ParametersEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator":{compute_parameters_for_node:[2,2,1,""],compute_state_res_time_for_node:[2,2,1,""],compute_state_transitions_for_a_node:[2,2,1,""],fast_init:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator":{StructureConstraintBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator":{complete_test:[2,2,1,""],compute_thumb_value:[2,2,1,""],ctpc_algorithm:[2,2,1,""],estimate_structure:[2,2,1,""],independence_test:[2,2,1,""],one_iteration_of_CTPC_algorithm:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator":{StructureEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator":{adjacency_matrix:[2,2,1,""],build_complete_graph:[2,2,1,""],build_removable_edges_matrix:[2,2,1,""],estimate_structure:[2,2,1,""],generate_possible_sub_sets_of_size:[2,2,1,""],save_plot_estimated_structure_graph:[2,2,1,""],save_results:[2,2,1,""],spurious_edges:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator":{StructureScoreBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator":{estimate_parents:[2,2,1,""],estimate_structure:[2,2,1,""],get_score_from_graph:[2,2,1,""]},"PyCTBN.PyCTBN.optimizers":{constraint_based_optimizer:[3,0,0,"-"],hill_climbing_search:[3,0,0,"-"],optimizer:[3,0,0,"-"],tabu_search:[3,0,0,"-"]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer":{ConstraintBasedOptimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search":{HillClimbing:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search.HillClimbing":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer":{Optimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer.Optimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search":{TabuSearch:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search.TabuSearch":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.structure_graph":{conditional_intensity_matrix:[4,0,0,"-"],network_graph:[4,0,0,"-"],sample_path:[4,0,0,"-"],set_of_cims:[4,0,0,"-"],structure:[4,0,0,"-"],trajectory:[4,0,0,"-"]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix":{ConditionalIntensityMatrix:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix":{cim:[4,2,1,""],compute_cim_coefficients:[4,2,1,""],state_residence_times:[4,2,1,""],state_transition_matrix:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph":{NetworkGraph:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph":{add_edges:[4,2,1,""],add_nodes:[4,2,1,""],build_p_comb_structure_for_a_node:[4,2,1,""],build_time_columns_filtering_for_a_node:[4,2,1,""],build_time_scalar_indexing_structure_for_a_node:[4,2,1,""],build_transition_filtering_for_a_node:[4,2,1,""],build_transition_scalar_indexing_structure_for_a_node:[4,2,1,""],clear_indexing_filtering_structures:[4,2,1,""],edges:[4,2,1,""],fast_init:[4,2,1,""],get_node_indx:[4,2,1,""],get_ordered_by_indx_set_of_parents:[4,2,1,""],get_parents_by_id:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],has_edge:[4,2,1,""],nodes:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_values:[4,2,1,""],p_combs:[4,2,1,""],remove_edges:[4,2,1,""],remove_node:[4,2,1,""],time_filtering:[4,2,1,""],time_scalar_indexing_strucure:[4,2,1,""],transition_filtering:[4,2,1,""],transition_scalar_indexing_structure:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path":{SamplePath:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath":{build_structure:[4,2,1,""],build_trajectories:[4,2,1,""],clear_memory:[4,2,1,""],has_prior_net_structure:[4,2,1,""],structure:[4,2,1,""],total_variables_count:[4,2,1,""],trajectories:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims":{SetOfCims:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims":{actual_cims:[4,2,1,""],build_cims:[4,2,1,""],build_times_and_transitions_structures:[4,2,1,""],filter_cims_with_mask:[4,2,1,""],get_cims_number:[4,2,1,""],p_combs:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.structure":{Structure:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.structure.Structure":{add_edge:[4,2,1,""],clean_structure_edges:[4,2,1,""],contains_edge:[4,2,1,""],edges:[4,2,1,""],get_node_id:[4,2,1,""],get_node_indx:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_labels:[4,2,1,""],nodes_values:[4,2,1,""],remove_edge:[4,2,1,""],remove_node:[4,2,1,""],total_variables_number:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory":{Trajectory:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory":{complete_trajectory:[4,2,1,""],size:[4,2,1,""],times:[4,2,1,""],trajectory:[4,2,1,""]},"PyCTBN.PyCTBN.utility":{abstract_importer:[5,0,0,"-"],cache:[5,0,0,"-"],json_importer:[5,0,0,"-"],sample_importer:[5,0,0,"-"]},"PyCTBN.PyCTBN.utility.abstract_importer":{AbstractImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter":{build_list_of_samples_array:[5,2,1,""],build_sorter:[5,2,1,""],clear_concatenated_frame:[5,2,1,""],compute_row_delta_in_all_samples_frames:[5,2,1,""],compute_row_delta_sigle_samples_frame:[5,2,1,""],concatenated_samples:[5,2,1,""],dataset_id:[5,2,1,""],file_path:[5,2,1,""],sorter:[5,2,1,""],structure:[5,2,1,""],variables:[5,2,1,""]},"PyCTBN.PyCTBN.utility.cache":{Cache:[5,1,1,""]},"PyCTBN.PyCTBN.utility.cache.Cache":{clear:[5,2,1,""],find:[5,2,1,""],put:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_importer":{JsonImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_importer.JsonImporter":{build_sorter:[5,2,1,""],clear_data_frame_list:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""],import_sampled_cims:[5,2,1,""],import_structure:[5,2,1,""],import_trajectories:[5,2,1,""],import_variables:[5,2,1,""],normalize_trajectories:[5,2,1,""],one_level_normalizing:[5,2,1,""],read_json_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.sample_importer":{SampleImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.sample_importer.SampleImporter":{build_sorter:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""]},"PyCTBN.tests":{estimators:[7,0,0,"-"],optimizers:[8,0,0,"-"],structure_graph:[9,0,0,"-"],utility:[10,0,0,"-"]},"PyCTBN.tests.estimators":{test_parameters_estimator:[7,0,0,"-"],test_structure_constraint_based_estimator:[7,0,0,"-"],test_structure_estimator:[7,0,0,"-"],test_structure_score_based_estimator:[7,0,0,"-"]},"PyCTBN.tests.estimators.test_parameters_estimator":{TestParametersEstimatior:[7,1,1,""]},"PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior":{aux_import_sampled_cims:[7,2,1,""],cim_equality_test:[7,2,1,""],equality_of_cims_of_node:[7,2,1,""],setUpClass:[7,2,1,""],test_compute_parameters_for_node:[7,2,1,""],test_fast_init:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator":{TestStructureConstraintBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_estimator":{TestStructureEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator":{setUpClass:[7,2,1,""],test_adjacency_matrix:[7,2,1,""],test_build_complete_graph:[7,2,1,""],test_build_removable_edges_matrix:[7,2,1,""],test_generate_possible_sub_sets_of_size:[7,2,1,""],test_init:[7,2,1,""],test_save_plot_estimated_graph:[7,2,1,""],test_save_results:[7,2,1,""],test_time:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator":{TestStructureScoreBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""],test_structure_monoprocesso:[7,2,1,""]},"PyCTBN.tests.optimizers":{test_hill_climbing_search:[8,0,0,"-"],test_tabu_search:[8,0,0,"-"]},"PyCTBN.tests.optimizers.test_hill_climbing_search":{TestHillClimbingSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_hill_climbing_search.TestHillClimbingSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.optimizers.test_tabu_search":{TestTabuSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_tabu_search.TestTabuSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.structure_graph":{test_cim:[9,0,0,"-"],test_networkgraph:[9,0,0,"-"],test_sample_path:[9,0,0,"-"],test_setofcims:[9,0,0,"-"],test_structure:[9,0,0,"-"],test_trajectory:[9,0,0,"-"]},"PyCTBN.tests.structure_graph.test_cim":{TestConditionalIntensityMatrix:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix":{setUpClass:[9,2,1,""],test_compute_cim_coefficients:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph":{TestNetworkGraph:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph":{aux_build_p_combs_structure:[9,2,1,""],aux_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],aux_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],aux_build_transition_columns_filtering_structure:[9,2,1,""],aux_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_add_edges:[9,2,1,""],test_add_nodes:[9,2,1,""],test_build_p_combs_structure:[9,2,1,""],test_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],test_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],test_build_transition_columns_filtering_structure:[9,2,1,""],test_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],test_fast_init:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_ordered_by_indx_set_of_parents:[9,2,1,""],test_get_parents_by_id:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_sample_path":{TestSamplePath:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath":{setUpClass:[9,2,1,""],test_buid_samplepath_no_concatenated_samples:[9,2,1,""],test_buid_samplepath_no_variables:[9,2,1,""],test_build_saplepath_no_prior_net_structure:[9,2,1,""],test_build_structure:[9,2,1,""],test_build_structure_bad_sorter:[9,2,1,""],test_build_trajectories:[9,2,1,""],test_init:[9,2,1,""],test_init_not_filled_dataframse:[9,2,1,""],test_init_not_initialized_importer:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_setofcims":{TestSetOfCims:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims":{another_filtering_method:[9,2,1,""],aux_test_build_cims:[9,2,1,""],aux_test_init:[9,2,1,""],build_p_comb_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_build_cims:[9,2,1,""],test_filter_cims_with_mask:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_structure":{TestStructure:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_structure.TestStructure":{setUpClass:[9,2,1,""],test_edges_operations:[9,2,1,""],test_equality:[9,2,1,""],test_get_node_id:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_positional_node_indx:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectory":{TestTrajectory:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory":{setUpClass:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.utility":{test_cache:[10,0,0,"-"],test_json_importer:[10,0,0,"-"],test_sample_importer:[10,0,0,"-"]},"PyCTBN.tests.utility.test_cache":{TestCache:[10,1,1,""]},"PyCTBN.tests.utility.test_cache.TestCache":{test_clear:[10,2,1,""],test_find:[10,2,1,""],test_init:[10,2,1,""],test_put:[10,2,1,""]},"PyCTBN.tests.utility.test_json_importer":{TestJsonImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_json_importer.TestJsonImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_build_sorter:[10,2,1,""],test_clear_concatenated_frame:[10,2,1,""],test_clear_data_frame_list:[10,2,1,""],test_compute_row_delta_in_all_frames:[10,2,1,""],test_compute_row_delta_in_all_frames_not_init_sorter:[10,2,1,""],test_compute_row_delta_single_samples_frame:[10,2,1,""],test_dataset_id:[10,2,1,""],test_file_path:[10,2,1,""],test_import_data:[10,2,1,""],test_import_sampled_cims:[10,2,1,""],test_import_structure:[10,2,1,""],test_import_variables:[10,2,1,""],test_init:[10,2,1,""],test_normalize_trajectories:[10,2,1,""],test_normalize_trajectories_wrong_indx:[10,2,1,""],test_normalize_trajectories_wrong_key:[10,2,1,""],test_read_json_file_found:[10,2,1,""],test_read_json_file_not_found:[10,2,1,""]},"PyCTBN.tests.utility.test_sample_importer":{TestSampleImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_sample_importer.TestSampleImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_init:[10,2,1,""],test_order:[10,2,1,""]},PyCTBN:{PyCTBN:[1,0,0,"-"],tests:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"abstract":[2,3,4,5,12],"boolean":[2,4],"case":[7,8,9,10],"class":[2,3,4,5,7,8,9,10,12],"default":[2,3,5],"float":2,"function":2,"import":[4,5,13,14],"int":[2,3,4,5],"null":2,"return":[2,3,4,5,9,12],"static":[2,4],"super":12,"true":[2,12],"var":12,HAS:5,Has:[2,4],NOT:2,The:[2,4,5,12],Use:[2,12],__actual_cach:5,__init__:12,__list_of_sets_of_par:5,_actual_cim:4,_actual_trajectori:4,_aggregated_info_about_nodes_par:4,_array_indx:5,_cach:2,_cim:4,_complete_graph:2,_df_samples_list:[5,12],_df_structur:5,_df_variabl:[5,12],_file_path:12,_graph:[4,12],_import:4,_net_graph:2,_node:2,_node_id:4,_nodes_indx:2,_nodes_v:2,_p_combs_structur:4,_raw_data:5,_sample_path:2,_single_set_of_cim:2,_sorter:[5,12],_state_residence_tim:4,_structur:4,_structure_label:5,_time:4,_time_filt:4,_time_scalar_indexing_structur:4,_total_variables_count:4,_total_variables_numb:4,_trajectori:4,_transition_filt:4,_transition_matric:4,_transition_scalar_indexing_structur:4,_variables_label:5,abc:[3,5],about:[3,4],abstract_import:[0,1,4,13,14],abstractimport:[4,5,12],act:5,actual:[2,4],actual_cim:[4,12],add:[4,5],add_edg:4,add_nod:4,added:2,addit:2,adjac:[2,12],adjacency_matrix:[2,12],after:5,against:2,aggreg:4,algorithm:[2,3,12],all:[2,3,4,5,9,12],alpha_xu:2,alpha_xxu:2,alreadi:[5,12],also:[2,4],ani:[2,3],anoth:4,another_filtering_method:9,approach:2,arc:5,arrai:[2,4,5,12],assign:2,assum:2,aux_build_p_combs_structur:9,aux_build_time_columns_filtering_structure_for_a_nod:9,aux_build_time_scalar_indexing_structure_for_a_nod:9,aux_build_transition_columns_filtering_structur:9,aux_build_transition_scalar_indexing_structure_for_a_nod:9,aux_import_sampled_cim:7,aux_test_build_cim:9,aux_test_init:9,axi:12,base:[2,3,4,5,7,8,9,10],bayesian:2,befor:[2,3,7,8,9,10],belong:2,best:2,between:5,bool:[2,4],both:[2,5],bound:4,build:[2,4,5,9,12],build_cim:4,build_complete_graph:2,build_list_of_samples_arrai:5,build_p_comb_structure_for_a_nod:[4,9],build_removable_edges_matrix:2,build_sort:[5,12],build_structur:[4,12],build_time_columns_filtering_for_a_nod:4,build_time_scalar_indexing_structure_for_a_nod:4,build_times_and_transitions_structur:4,build_trajectori:[4,12],build_transition_filtering_for_a_nod:4,build_transition_scalar_indexing_structure_for_a_nod:4,built:2,cach:[0,1,2,13,14],calcul:2,call:[5,12],cardin:[2,4,5,9],cardinalit:[4,5],caridin:4,caridinalit:4,chang:[4,5],check:4,chi:2,chi_test:2,chi_test_alfa:2,child:[2,3],child_indx:2,child_states_numb:2,child_val:2,cim1:[2,7],cim2:[2,7],cim:[2,4,5,12],cim_equality_test:7,cims_kei:5,cims_label:7,classmethod:[7,8,9,10],clean_structure_edg:4,clear:[4,5],clear_concatenated_fram:5,clear_data_frame_list:5,clear_indexing_filtering_structur:4,clear_memori:4,climb:[2,3],coeffici:4,col:4,cols_filt:2,column:[2,4,5,12],columns_head:5,comb:4,combin:[4,5,9],combinatori:[4,9],common:2,complet:[2,4,5],complete_test:2,complete_trajectori:4,comput:[2,3,4,5,12],compute_cim_coeffici:4,compute_parameters_for_nod:[2,12],compute_row_delta_in_all_samples_fram:[5,12],compute_row_delta_sigle_samples_fram:5,compute_state_res_time_for_nod:2,compute_state_transitions_for_a_nod:2,compute_thumb_valu:2,concatanated_sampl:5,concaten:[4,5],concatenated_sampl:5,condit:4,conditional_intensity_matrix:[0,1,2,13,14],conditionalintensitymatrix:[2,4],consid:[2,4],constraint:2,constraint_based_optim:[0,1,13,14],constraintbasedoptim:3,construct:[4,5,12],conta:5,contain:[2,4,5,9],contains_edg:4,content:[13,14],convert:[2,5],copi:5,core:5,correct:[4,5],could:2,count:4,creat:[2,4,12],csv:12,csvimport:12,ctbn:2,ctpc:[2,3,12],ctpc_algorithm:[2,12],current:[2,3,5],cut:5,dafram:5,data:[2,3,4,5,13,14],datafram:[4,5,12],dataset:[3,4,5],dataset_id:[5,12],datfram:5,def:12,defin:5,definit:5,defualt:2,delta:[2,4,5],demonstr:12,describ:5,desir:[2,4],df_samples_list:5,dict:[5,12],dictionari:5,differ:5,differt:2,digraph:2,dimens:4,dir:12,direct:[2,4],directli:5,disabl:[2,3],disable_multiprocess:2,distribuit:2,doc:5,doubl:4,download:12,drop:12,duplic:4,dyn:12,each:[2,3,5],edg:[2,4,5,12],edges_list:4,end:5,entir:2,equal:4,equality_of_cims_of_nod:7,est:12,estim:[0,1,3,4,6,13,14],estimate_par:2,estimate_structur:2,estimated_cim:7,everi:[4,5],exam:12,exampl:[5,13,14],exclud:2,exctract:5,exist:5,exp_test_alfa:2,exponenti:2,expos:5,extend:12,extens:[2,5],extract:[4,5],fals:2,fam_score_calcul:[0,1,13,14],famscor:2,famscorecalcul:2,fast_init:[2,4,12],file:[2,5,12],file_path:[2,5,12],filepath:5,fill:[2,12],filter:[2,4],filter_cims_with_mask:4,find:[2,5],first:[2,12],fixtur:[7,8,9,10],follow:[4,5],form:4,format:12,formula:2,found:5,frame:5,from:[4,5,12],from_nod:5,gener:2,generate_possible_sub_sets_of_s:2,get:[2,5],get_cims_numb:4,get_fam_scor:2,get_node_id:4,get_node_indx:4,get_ordered_by_indx_set_of_par:4,get_parents_by_id:4,get_positional_node_indx:4,get_score_from_graph:2,get_states_numb:4,given:[2,4,5],glob:12,graph:[2,4,9,12],graph_struct:4,graphic:2,grid:[4,9],grpah:12,has:[5,12],has_edg:4,has_prior_net_structur:4,have:5,header:5,header_column:5,hill:[2,3],hill_climbing_search:[0,1,13,14],hillclimb:3,hold:[2,4],hook:[7,8,9,10],how:5,hyperparamet:2,hypothesi:2,identifi:[2,4,5],iff:2,implement:[3,5,13,14],import_data:[5,12],import_sampled_cim:5,import_structur:5,import_trajectori:5,import_vari:[5,12],improv:[2,3],includ:2,independ:2,independence_test:2,index:[2,4,5,12,13],indic:4,indx:5,info:[4,12],inform:[3,4],init:12,initi:[2,4,5,12],inplac:12,insid:12,instal:[13,14],interest:4,interfac:3,intes:4,iter:[2,3],iterations_numb:[2,3],its:[2,3],join:12,json:[2,5,12],json_import:[0,1,13,14],jsonarrai:5,jsonimport:[5,12],keep:[2,3,5],kei:5,kind:2,knowledg:2,known:2,known_edg:2,label:[2,3,4,5],lenght:[2,3],level:[2,5],likelihood:2,list:[2,3,4,5,12],list_of_column:4,list_of_edg:4,list_of_nod:4,load:5,loop:2,m_xu_suff_stat:2,m_xxu_suff_stat:2,main:12,margin:2,marginal_likelihood_q:2,marginal_likelihood_theta:2,mask:[4,9],mask_arr:4,matric:[2,4],matrix:[2,4,5,9,12],max_par:[2,3],maximum:[2,3],member:[4,5],mention:4,merg:5,method:[2,5,7,8,9,10],methodnam:[7,8,9,10],model:2,modul:[13,14],multipl:5,multiprocess:2,name:[2,4,5,12],ndarrai:[2,4,5],necessari:[2,4,5],nest:5,net:[2,3,4,5,12],net_graph:2,network:[2,4,5],network_graph:[0,1,2,13,14],networkgraph:[2,4,12],networkx:2,node:[2,3,4,5,9,12],node_id:[2,3,4,9],node_index:4,node_indx:[2,4],node_st:[4,9],node_states_numb:[4,9],nodes_index:4,nodes_indexes_arr:4,nodes_label:4,nodes_labels_list:4,nodes_numb:4,nodes_vals_arr:4,nodes_valu:[4,12],none:[2,3,4,5,7,9,10,12],normal:5,normalize_trajectori:5,number:[2,3,4],numpi:[2,4,5,9],obj:[10,12],object:[2,3,4,5,12],one:[4,5],one_iteration_of_ctpc_algorithm:2,one_level_norm:5,onli:5,oper:2,optim:[0,1,2,6,13,14],optimize_structur:3,option:[2,3],order:[2,5,10],origin:5,original_cols_numb:4,otherwis:[2,5],out:5,outer:[5,12],over:2,own:[13,14],p_comb:[4,9],p_indx:[4,9],p_val:9,p_valu:9,packag:[13,14],page:13,panda:[5,12],param:4,paramet:[2,3,4,5,9,13,14],parameters_estim:[0,1,13,14],parametersestim:[2,12],parent:[2,3,4,5],parent_indx:2,parent_label:2,parent_set:2,parent_set_v:2,parent_v:2,parent_valu:9,parents_cardin:4,parents_comb:5,parents_index:4,parents_indx:9,parents_label:[4,9],parents_states_numb:[4,9],parents_v:[4,9],parents_valu:[4,9],part:2,particular:[2,5],pass:12,path:[2,5,12],patienc:[2,3],peest:12,perform:2,pip:12,place:5,plot:2,png:2,posit:[4,5],possibl:[2,4],predict:3,prepar:5,present:[2,5],print:12,prior:[2,12],prior_net_structur:5,process:[2,3,4,5],properli:5,properti:[4,5],put:5,pyctbn:12,q_xx:4,rappres:4,raw:5,raw_data:5,read:[5,12],read_csv:12,read_csv_fil:12,read_fil:12,read_json_fil:5,real:[2,4,5,12],refer:[4,5],reject:2,rel:4,relat:5,releas:12,remain:5,remov:[2,4,5],remove_edg:4,remove_nod:4,repres:4,represent:2,res:4,resid:[2,4],result:[2,5,12],rtype:4,rule:[2,3],run:[7,8,9,10],runtest:[7,8,9,10],same:5,sampl:[4,5,12],sample_fram:[5,12],sample_import:[0,1,13,14],sample_path:[0,1,2,13,14],sampled_cim:7,sampleimport:5,samplepath:[2,4,12],samples_label:5,save:[2,12],save_plot_estimated_structure_graph:2,save_result:[2,12],scalar_index:2,scalar_indexes_struct:2,score:2,se1:12,search:[2,3,13],second:2,see:5,select:12,self:[2,5,12],sep:2,sep_set:2,set:[2,4,5,7,8,9,10],set_of_cim:[0,1,2,5,13,14],setofcim:[2,4,5,12],setupclass:[7,8,9,10],shift:[4,5],shifted_cols_head:5,show:2,signific:2,simbol:5,simpl:12,simpli:12,sinc:4,single_cim_xu_marginal_likelihood_q:2,single_cim_xu_marginal_likelihood_theta:2,single_internal_cim_xxu_marginal_likelihood_theta:2,size:[2,4],socim:5,sofc1:12,sorter:5,specif:[2,4,12],spuriou:2,spurious_edg:2,start:5,state:[2,4],state_res_tim:4,state_residence_tim:4,state_transition_matrix:4,statist:2,stop:[2,3],str:[2,3,4,5,12],string:[2,3,4,5],structur:[0,1,2,3,5,9,13,14],structure_constraint_based_estim:[0,1,13,14],structure_estim:[0,1,3,13,14],structure_estimation_exampl:12,structure_graph:[0,1,2,5,6,13,14],structure_label:5,structure_score_based_estim:[0,1,13,14],structureconstraintbasedestim:2,structureestim:[2,3,12],structurescorebasedestim:2,structut:4,style:2,submodul:[1,6,13,14],subpackag:[13,14],subset:2,suffici:2,suffuci:2,symbol:[4,5],synthet:5,t_xu_suff_stat:2,tabu:[2,3],tabu_length:[2,3],tabu_rules_dur:[2,3],tabu_search:[0,1,13,14],tabusearch:3,take:12,tar:12,task:[2,4],tau_xu:2,ternari:12,test:2,test_add_edg:9,test_add_nod:9,test_adjacency_matrix:7,test_buid_samplepath_no_concatenated_sampl:9,test_buid_samplepath_no_vari:9,test_build_cim:9,test_build_complete_graph:7,test_build_p_combs_structur:9,test_build_removable_edges_matrix:7,test_build_saplepath_no_prior_net_structur:9,test_build_sort:10,test_build_structur:9,test_build_structure_bad_sort:9,test_build_time_columns_filtering_structure_for_a_nod:9,test_build_time_scalar_indexing_structure_for_a_nod:9,test_build_trajectori:9,test_build_transition_columns_filtering_structur:9,test_build_transition_scalar_indexing_structure_for_a_nod:9,test_cach:6,test_child:2,test_cim:6,test_clear:10,test_clear_concatenated_fram:10,test_clear_data_frame_list:10,test_compute_cim_coeffici:9,test_compute_parameters_for_nod:7,test_compute_row_delta_in_all_fram:10,test_compute_row_delta_in_all_frames_not_init_sort:10,test_compute_row_delta_single_samples_fram:10,test_dataset_id:10,test_edges_oper:9,test_equ:9,test_fast_init:[7,9],test_file_path:10,test_filter_cims_with_mask:9,test_find:10,test_generate_possible_sub_sets_of_s:7,test_get_node_id:9,test_get_node_indx:9,test_get_ordered_by_indx_set_of_par:9,test_get_parents_by_id:9,test_get_positional_node_indx:9,test_get_states_numb:9,test_hill_climbing_search:6,test_import_data:10,test_import_sampled_cim:10,test_import_structur:10,test_import_vari:10,test_init:[7,9,10],test_init_not_filled_dataframs:9,test_init_not_initialized_import:9,test_json_import:6,test_networkgraph:6,test_normalize_trajectori:10,test_normalize_trajectories_wrong_indx:10,test_normalize_trajectories_wrong_kei:10,test_ord:10,test_par:2,test_parameters_estim:6,test_put:10,test_read_json_file_found:10,test_read_json_file_not_found:10,test_repr:9,test_sample_import:6,test_sample_path:6,test_save_plot_estimated_graph:7,test_save_result:7,test_setofcim:6,test_structur:[6,8],test_structure_1:7,test_structure_2:7,test_structure_3:[7,8],test_structure_constraint_based_estim:6,test_structure_estim:6,test_structure_monoprocesso:7,test_structure_score_based_estim:6,test_tabu_search:6,test_tim:7,test_trajectori:6,testcach:10,testcas:[7,8,9,10],testconditionalintensitymatrix:9,testhillclimbingsearch:8,testjsonimport:10,testnetworkgraph:9,testparametersestimatior:7,testsampleimport:10,testsamplepath:9,testsetofcim:9,teststructur:9,teststructureconstraintbasedestim:7,teststructureestim:7,teststructurescorebasedestim:7,testtabusearch:8,testtrajectori:9,tha:5,theta:2,thi:[2,4,5,12],three:12,threshold:2,thumb:2,thumb_threshold:2,thumb_valu:2,time:[2,4,5,12],time_filt:4,time_kei:5,time_scalar_indexing_strucur:4,timestamp:5,to_nod:5,tot_vars_count:[2,3],total:[2,4],total_variables_count:4,total_variables_numb:4,traj:5,trajecory_head:5,trajectori:[0,1,2,5,12,13,14],trajectories_kei:5,trajectory_list:5,trajectri:12,transit:[2,4,5],transition_filt:4,transition_matric:4,transition_scalar_indexing_structur:4,tri:5,tupl:4,tutori:5,two:2,type:[2,3,4,5,12],union:5,uniqu:5,unittest:[7,8,9,10],unus:4,usag:[13,14],use:[2,12],used:[2,3,4,5],using:[2,3,4,5],util:[0,1,4,6,13,14],valid:2,valu:[2,3,4,5,9,12],values_list:12,var_id:2,variabl:[2,3,4,5,12],variable_cardin:5,variable_cim_xu_marginal_likelihood_q:2,variable_cim_xu_marginal_likelihood_theta:2,variable_label:5,variables_kei:5,variables_label:5,vector:[2,4],want:12,when:2,where:5,which:[2,3,4,5],whl:12,who:2,without:[2,3],you:[2,5,12],your:[13,14]},titles:["PyCTBN package","PyCTBN.PyCTBN package","PyCTBN.PyCTBN.estimators package","PyCTBN.PyCTBN.optimizers package","PyCTBN.PyCTBN.structure_graph package","PyCTBN.PyCTBN.utility package","PyCTBN.tests package","PyCTBN.tests.estimators package","PyCTBN.tests.optimizers package","PyCTBN.tests.structure_graph package","PyCTBN.tests.utility package","basic_main module","Examples","Welcome to PyCTBN\u2019s documentation!","PyCTBN","setup module"],titleterms:{"import":12,abstract_import:5,basic_main:11,cach:5,conditional_intensity_matrix:4,constraint_based_optim:3,content:[0,1,2,3,4,5,6,7,8,9,10],data:12,document:13,estim:[2,7,12],exampl:12,fam_score_calcul:2,hill_climbing_search:3,implement:12,indic:13,instal:12,json_import:5,modul:[0,1,2,3,4,5,6,7,8,9,10,11,15],network_graph:4,optim:[3,8],own:12,packag:[0,1,2,3,4,5,6,7,8,9,10],paramet:12,parameters_estim:2,pyctbn:[0,1,2,3,4,5,6,7,8,9,10,13,14],sample_import:5,sample_path:4,set_of_cim:4,setup:15,structur:[4,12],structure_constraint_based_estim:2,structure_estim:2,structure_graph:[4,9],structure_score_based_estim:2,submodul:[0,2,3,4,5,7,8,9,10],subpackag:[0,1,6],tabl:13,tabu_search:3,test:[6,7,8,9,10],test_cach:10,test_cim:9,test_hill_climbing_search:8,test_json_import:10,test_networkgraph:9,test_parameters_estim:7,test_sample_import:10,test_sample_path:9,test_setofcim:9,test_structur:9,test_structure_constraint_based_estim:7,test_structure_estim:7,test_structure_score_based_estim:7,test_tabu_search:8,test_trajectori:9,trajectori:4,usag:12,util:[5,10],welcom:13,your:12}}) \ No newline at end of file diff --git a/docs/PyCTBN.PyCTBN.estimators.html b/docs/PyCTBN.PyCTBN.estimators.html index b76ff0c..cc28d0c 100644 --- a/docs/PyCTBN.PyCTBN.estimators.html +++ b/docs/PyCTBN.PyCTBN.estimators.html @@ -636,8 +636,7 @@ that do not contains a the node identified by
    save_plot_estimated_structure_graph(file_path: str) → None
    -

    Plot the estimated structure in a graphical model style, use .png extension. -Spurious edges are colored in red if a prior structure is present.

    +

    Plot the estimated structure in a graphical model style, use .png extension.

    Parameters

    file_path – path to save the file to

    diff --git a/docs/searchindex.js b/docs/searchindex.js index 8061880..051c818 100644 --- a/docs/searchindex.js +++ b/docs/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["PyCTBN","PyCTBN.PyCTBN","PyCTBN.PyCTBN.estimators","PyCTBN.PyCTBN.optimizers","PyCTBN.PyCTBN.structure_graph","PyCTBN.PyCTBN.utility","PyCTBN.tests","PyCTBN.tests.estimators","PyCTBN.tests.optimizers","PyCTBN.tests.structure_graph","PyCTBN.tests.utility","basic_main","examples","index","modules","setup"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["PyCTBN.rst","PyCTBN.PyCTBN.rst","PyCTBN.PyCTBN.estimators.rst","PyCTBN.PyCTBN.optimizers.rst","PyCTBN.PyCTBN.structure_graph.rst","PyCTBN.PyCTBN.utility.rst","PyCTBN.tests.rst","PyCTBN.tests.estimators.rst","PyCTBN.tests.optimizers.rst","PyCTBN.tests.structure_graph.rst","PyCTBN.tests.utility.rst","basic_main.rst","examples.rst","index.rst","modules.rst","setup.rst"],objects:{"":{PyCTBN:[0,0,0,"-"]},"PyCTBN.PyCTBN":{estimators:[2,0,0,"-"],optimizers:[3,0,0,"-"],structure_graph:[4,0,0,"-"],utility:[5,0,0,"-"]},"PyCTBN.PyCTBN.estimators":{fam_score_calculator:[2,0,0,"-"],parameters_estimator:[2,0,0,"-"],structure_constraint_based_estimator:[2,0,0,"-"],structure_estimator:[2,0,0,"-"],structure_score_based_estimator:[2,0,0,"-"]},"PyCTBN.PyCTBN.estimators.fam_score_calculator":{FamScoreCalculator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator":{get_fam_score:[2,2,1,""],marginal_likelihood_q:[2,2,1,""],marginal_likelihood_theta:[2,2,1,""],single_cim_xu_marginal_likelihood_q:[2,2,1,""],single_cim_xu_marginal_likelihood_theta:[2,2,1,""],single_internal_cim_xxu_marginal_likelihood_theta:[2,2,1,""],variable_cim_xu_marginal_likelihood_q:[2,2,1,""],variable_cim_xu_marginal_likelihood_theta:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator":{ParametersEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator":{compute_parameters_for_node:[2,2,1,""],compute_state_res_time_for_node:[2,2,1,""],compute_state_transitions_for_a_node:[2,2,1,""],fast_init:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator":{StructureConstraintBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator":{complete_test:[2,2,1,""],compute_thumb_value:[2,2,1,""],ctpc_algorithm:[2,2,1,""],estimate_structure:[2,2,1,""],independence_test:[2,2,1,""],one_iteration_of_CTPC_algorithm:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator":{StructureEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator":{adjacency_matrix:[2,2,1,""],build_complete_graph:[2,2,1,""],build_removable_edges_matrix:[2,2,1,""],estimate_structure:[2,2,1,""],generate_possible_sub_sets_of_size:[2,2,1,""],save_plot_estimated_structure_graph:[2,2,1,""],save_results:[2,2,1,""],spurious_edges:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator":{StructureScoreBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator":{estimate_parents:[2,2,1,""],estimate_structure:[2,2,1,""],get_score_from_graph:[2,2,1,""]},"PyCTBN.PyCTBN.optimizers":{constraint_based_optimizer:[3,0,0,"-"],hill_climbing_search:[3,0,0,"-"],optimizer:[3,0,0,"-"],tabu_search:[3,0,0,"-"]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer":{ConstraintBasedOptimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search":{HillClimbing:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search.HillClimbing":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer":{Optimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer.Optimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search":{TabuSearch:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search.TabuSearch":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.structure_graph":{conditional_intensity_matrix:[4,0,0,"-"],network_graph:[4,0,0,"-"],sample_path:[4,0,0,"-"],set_of_cims:[4,0,0,"-"],structure:[4,0,0,"-"],trajectory:[4,0,0,"-"]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix":{ConditionalIntensityMatrix:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix":{cim:[4,2,1,""],compute_cim_coefficients:[4,2,1,""],state_residence_times:[4,2,1,""],state_transition_matrix:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph":{NetworkGraph:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph":{add_edges:[4,2,1,""],add_nodes:[4,2,1,""],build_p_comb_structure_for_a_node:[4,2,1,""],build_time_columns_filtering_for_a_node:[4,2,1,""],build_time_scalar_indexing_structure_for_a_node:[4,2,1,""],build_transition_filtering_for_a_node:[4,2,1,""],build_transition_scalar_indexing_structure_for_a_node:[4,2,1,""],clear_indexing_filtering_structures:[4,2,1,""],edges:[4,2,1,""],fast_init:[4,2,1,""],get_node_indx:[4,2,1,""],get_ordered_by_indx_set_of_parents:[4,2,1,""],get_parents_by_id:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],has_edge:[4,2,1,""],nodes:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_values:[4,2,1,""],p_combs:[4,2,1,""],remove_edges:[4,2,1,""],remove_node:[4,2,1,""],time_filtering:[4,2,1,""],time_scalar_indexing_strucure:[4,2,1,""],transition_filtering:[4,2,1,""],transition_scalar_indexing_structure:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path":{SamplePath:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath":{build_structure:[4,2,1,""],build_trajectories:[4,2,1,""],clear_memory:[4,2,1,""],has_prior_net_structure:[4,2,1,""],structure:[4,2,1,""],total_variables_count:[4,2,1,""],trajectories:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims":{SetOfCims:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims":{actual_cims:[4,2,1,""],build_cims:[4,2,1,""],build_times_and_transitions_structures:[4,2,1,""],filter_cims_with_mask:[4,2,1,""],get_cims_number:[4,2,1,""],p_combs:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.structure":{Structure:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.structure.Structure":{add_edge:[4,2,1,""],clean_structure_edges:[4,2,1,""],contains_edge:[4,2,1,""],edges:[4,2,1,""],get_node_id:[4,2,1,""],get_node_indx:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_labels:[4,2,1,""],nodes_values:[4,2,1,""],remove_edge:[4,2,1,""],remove_node:[4,2,1,""],total_variables_number:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory":{Trajectory:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory":{complete_trajectory:[4,2,1,""],size:[4,2,1,""],times:[4,2,1,""],trajectory:[4,2,1,""]},"PyCTBN.PyCTBN.utility":{abstract_importer:[5,0,0,"-"],cache:[5,0,0,"-"],json_importer:[5,0,0,"-"],sample_importer:[5,0,0,"-"]},"PyCTBN.PyCTBN.utility.abstract_importer":{AbstractImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter":{build_list_of_samples_array:[5,2,1,""],build_sorter:[5,2,1,""],clear_concatenated_frame:[5,2,1,""],compute_row_delta_in_all_samples_frames:[5,2,1,""],compute_row_delta_sigle_samples_frame:[5,2,1,""],concatenated_samples:[5,2,1,""],dataset_id:[5,2,1,""],file_path:[5,2,1,""],sorter:[5,2,1,""],structure:[5,2,1,""],variables:[5,2,1,""]},"PyCTBN.PyCTBN.utility.cache":{Cache:[5,1,1,""]},"PyCTBN.PyCTBN.utility.cache.Cache":{clear:[5,2,1,""],find:[5,2,1,""],put:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_importer":{JsonImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_importer.JsonImporter":{build_sorter:[5,2,1,""],clear_data_frame_list:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""],import_sampled_cims:[5,2,1,""],import_structure:[5,2,1,""],import_trajectories:[5,2,1,""],import_variables:[5,2,1,""],normalize_trajectories:[5,2,1,""],one_level_normalizing:[5,2,1,""],read_json_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.sample_importer":{SampleImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.sample_importer.SampleImporter":{build_sorter:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""]},"PyCTBN.tests":{estimators:[7,0,0,"-"],optimizers:[8,0,0,"-"],structure_graph:[9,0,0,"-"],utility:[10,0,0,"-"]},"PyCTBN.tests.estimators":{test_parameters_estimator:[7,0,0,"-"],test_structure_constraint_based_estimator:[7,0,0,"-"],test_structure_estimator:[7,0,0,"-"],test_structure_score_based_estimator:[7,0,0,"-"]},"PyCTBN.tests.estimators.test_parameters_estimator":{TestParametersEstimatior:[7,1,1,""]},"PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior":{aux_import_sampled_cims:[7,2,1,""],cim_equality_test:[7,2,1,""],equality_of_cims_of_node:[7,2,1,""],setUpClass:[7,2,1,""],test_compute_parameters_for_node:[7,2,1,""],test_fast_init:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator":{TestStructureConstraintBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_estimator":{TestStructureEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator":{setUpClass:[7,2,1,""],test_adjacency_matrix:[7,2,1,""],test_build_complete_graph:[7,2,1,""],test_build_removable_edges_matrix:[7,2,1,""],test_generate_possible_sub_sets_of_size:[7,2,1,""],test_init:[7,2,1,""],test_save_plot_estimated_graph:[7,2,1,""],test_save_results:[7,2,1,""],test_time:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator":{TestStructureScoreBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""],test_structure_monoprocesso:[7,2,1,""]},"PyCTBN.tests.optimizers":{test_hill_climbing_search:[8,0,0,"-"],test_tabu_search:[8,0,0,"-"]},"PyCTBN.tests.optimizers.test_hill_climbing_search":{TestHillClimbingSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_hill_climbing_search.TestHillClimbingSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.optimizers.test_tabu_search":{TestTabuSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_tabu_search.TestTabuSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.structure_graph":{test_cim:[9,0,0,"-"],test_networkgraph:[9,0,0,"-"],test_sample_path:[9,0,0,"-"],test_setofcims:[9,0,0,"-"],test_structure:[9,0,0,"-"],test_trajectory:[9,0,0,"-"]},"PyCTBN.tests.structure_graph.test_cim":{TestConditionalIntensityMatrix:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix":{setUpClass:[9,2,1,""],test_compute_cim_coefficients:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph":{TestNetworkGraph:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph":{aux_build_p_combs_structure:[9,2,1,""],aux_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],aux_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],aux_build_transition_columns_filtering_structure:[9,2,1,""],aux_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_add_edges:[9,2,1,""],test_add_nodes:[9,2,1,""],test_build_p_combs_structure:[9,2,1,""],test_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],test_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],test_build_transition_columns_filtering_structure:[9,2,1,""],test_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],test_fast_init:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_ordered_by_indx_set_of_parents:[9,2,1,""],test_get_parents_by_id:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_sample_path":{TestSamplePath:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath":{setUpClass:[9,2,1,""],test_buid_samplepath_no_concatenated_samples:[9,2,1,""],test_buid_samplepath_no_variables:[9,2,1,""],test_build_saplepath_no_prior_net_structure:[9,2,1,""],test_build_structure:[9,2,1,""],test_build_structure_bad_sorter:[9,2,1,""],test_build_trajectories:[9,2,1,""],test_init:[9,2,1,""],test_init_not_filled_dataframse:[9,2,1,""],test_init_not_initialized_importer:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_setofcims":{TestSetOfCims:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims":{another_filtering_method:[9,2,1,""],aux_test_build_cims:[9,2,1,""],aux_test_init:[9,2,1,""],build_p_comb_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_build_cims:[9,2,1,""],test_filter_cims_with_mask:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_structure":{TestStructure:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_structure.TestStructure":{setUpClass:[9,2,1,""],test_edges_operations:[9,2,1,""],test_equality:[9,2,1,""],test_get_node_id:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_positional_node_indx:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectory":{TestTrajectory:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory":{setUpClass:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.utility":{test_cache:[10,0,0,"-"],test_json_importer:[10,0,0,"-"],test_sample_importer:[10,0,0,"-"]},"PyCTBN.tests.utility.test_cache":{TestCache:[10,1,1,""]},"PyCTBN.tests.utility.test_cache.TestCache":{test_clear:[10,2,1,""],test_find:[10,2,1,""],test_init:[10,2,1,""],test_put:[10,2,1,""]},"PyCTBN.tests.utility.test_json_importer":{TestJsonImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_json_importer.TestJsonImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_build_sorter:[10,2,1,""],test_clear_concatenated_frame:[10,2,1,""],test_clear_data_frame_list:[10,2,1,""],test_compute_row_delta_in_all_frames:[10,2,1,""],test_compute_row_delta_in_all_frames_not_init_sorter:[10,2,1,""],test_compute_row_delta_single_samples_frame:[10,2,1,""],test_dataset_id:[10,2,1,""],test_file_path:[10,2,1,""],test_import_data:[10,2,1,""],test_import_sampled_cims:[10,2,1,""],test_import_structure:[10,2,1,""],test_import_variables:[10,2,1,""],test_init:[10,2,1,""],test_normalize_trajectories:[10,2,1,""],test_normalize_trajectories_wrong_indx:[10,2,1,""],test_normalize_trajectories_wrong_key:[10,2,1,""],test_read_json_file_found:[10,2,1,""],test_read_json_file_not_found:[10,2,1,""]},"PyCTBN.tests.utility.test_sample_importer":{TestSampleImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_sample_importer.TestSampleImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_init:[10,2,1,""],test_order:[10,2,1,""]},PyCTBN:{PyCTBN:[1,0,0,"-"],tests:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"abstract":[2,3,4,5,12],"boolean":[2,4],"case":[7,8,9,10],"class":[2,3,4,5,7,8,9,10,12],"default":[2,3,5],"float":2,"function":2,"import":[4,5,13,14],"int":[2,3,4,5],"null":2,"return":[2,3,4,5,9,12],"static":[2,4],"super":12,"true":[2,12],"var":12,HAS:5,Has:[2,4],NOT:2,The:[2,4,5,12],Use:[2,12],__actual_cach:5,__init__:12,__list_of_sets_of_par:5,_actual_cim:4,_actual_trajectori:4,_aggregated_info_about_nodes_par:4,_array_indx:5,_cach:2,_cim:4,_complete_graph:2,_df_samples_list:[5,12],_df_structur:5,_df_variabl:[5,12],_file_path:12,_graph:[4,12],_import:4,_net_graph:2,_node:2,_node_id:4,_nodes_indx:2,_nodes_v:2,_p_combs_structur:4,_raw_data:5,_sample_path:2,_single_set_of_cim:2,_sorter:[5,12],_state_residence_tim:4,_structur:4,_structure_label:5,_time:4,_time_filt:4,_time_scalar_indexing_structur:4,_total_variables_count:4,_total_variables_numb:4,_trajectori:4,_transition_filt:4,_transition_matric:4,_transition_scalar_indexing_structur:4,_variables_label:5,abc:[3,5],about:[3,4],abstract_import:[0,1,4,13,14],abstractimport:[4,5,12],act:5,actual:[2,4],actual_cim:[4,12],add:[4,5],add_edg:4,add_nod:4,added:2,addit:2,adjac:[2,12],adjacency_matrix:[2,12],after:5,against:2,aggreg:4,algorithm:[2,3,12],all:[2,3,4,5,9,12],alpha_xu:2,alpha_xxu:2,alreadi:[5,12],also:[2,4],ani:[2,3],anoth:4,another_filtering_method:9,approach:2,arc:5,arrai:[2,4,5,12],assign:2,assum:2,aux_build_p_combs_structur:9,aux_build_time_columns_filtering_structure_for_a_nod:9,aux_build_time_scalar_indexing_structure_for_a_nod:9,aux_build_transition_columns_filtering_structur:9,aux_build_transition_scalar_indexing_structure_for_a_nod:9,aux_import_sampled_cim:7,aux_test_build_cim:9,aux_test_init:9,axi:12,base:[2,3,4,5,7,8,9,10],bayesian:2,befor:[2,3,7,8,9,10],belong:2,best:2,between:5,bool:[2,4],both:[2,5],bound:4,build:[2,4,5,9,12],build_cim:4,build_complete_graph:2,build_list_of_samples_arrai:5,build_p_comb_structure_for_a_nod:[4,9],build_removable_edges_matrix:2,build_sort:[5,12],build_structur:[4,12],build_time_columns_filtering_for_a_nod:4,build_time_scalar_indexing_structure_for_a_nod:4,build_times_and_transitions_structur:4,build_trajectori:[4,12],build_transition_filtering_for_a_nod:4,build_transition_scalar_indexing_structure_for_a_nod:4,built:2,cach:[0,1,2,13,14],calcul:2,call:[5,12],cardin:[2,4,5,9],cardinalit:[4,5],caridin:4,caridinalit:4,chang:[4,5],check:4,chi:2,chi_test:2,chi_test_alfa:2,child:[2,3],child_indx:2,child_states_numb:2,child_val:2,cim1:[2,7],cim2:[2,7],cim:[2,4,5,12],cim_equality_test:7,cims_kei:5,cims_label:7,classmethod:[7,8,9,10],clean_structure_edg:4,clear:[4,5],clear_concatenated_fram:5,clear_data_frame_list:5,clear_indexing_filtering_structur:4,clear_memori:4,climb:[2,3],coeffici:4,col:4,color:2,cols_filt:2,column:[2,4,5,12],columns_head:5,comb:4,combin:[4,5,9],combinatori:[4,9],common:2,complet:[2,4,5],complete_test:2,complete_trajectori:4,comput:[2,3,4,5,12],compute_cim_coeffici:4,compute_parameters_for_nod:[2,12],compute_row_delta_in_all_samples_fram:[5,12],compute_row_delta_sigle_samples_fram:5,compute_state_res_time_for_nod:2,compute_state_transitions_for_a_nod:2,compute_thumb_valu:2,concatanated_sampl:5,concaten:[4,5],concatenated_sampl:5,condit:4,conditional_intensity_matrix:[0,1,2,13,14],conditionalintensitymatrix:[2,4],consid:[2,4],constraint:2,constraint_based_optim:[0,1,13,14],constraintbasedoptim:3,construct:[4,5,12],conta:5,contain:[2,4,5,9],contains_edg:4,content:[13,14],convert:[2,5],copi:5,core:5,correct:[4,5],could:2,count:4,creat:[2,4,12],csv:12,csvimport:12,ctbn:2,ctpc:[2,3,12],ctpc_algorithm:[2,12],current:[2,3,5],cut:5,dafram:5,data:[2,3,4,5,13,14],datafram:[4,5,12],dataset:[3,4,5],dataset_id:[5,12],datfram:5,def:12,defin:5,definit:5,defualt:2,delta:[2,4,5],demonstr:12,describ:5,desir:[2,4],df_samples_list:5,dict:[5,12],dictionari:5,differ:5,differt:2,digraph:2,dimens:4,dir:12,direct:[2,4],directli:5,disabl:[2,3],disable_multiprocess:2,distribuit:2,doc:5,doubl:4,download:12,drop:12,duplic:4,dyn:12,each:[2,3,5],edg:[2,4,5,12],edges_list:4,end:5,entir:2,equal:4,equality_of_cims_of_nod:7,est:12,estim:[0,1,3,4,6,13,14],estimate_par:2,estimate_structur:2,estimated_cim:7,everi:[4,5],exam:12,exampl:[5,13,14],exclud:2,exctract:5,exist:5,exp_test_alfa:2,exponenti:2,expos:5,extend:12,extens:[2,5],extract:[4,5],fals:2,fam_score_calcul:[0,1,13,14],famscor:2,famscorecalcul:2,fast_init:[2,4,12],file:[2,5,12],file_path:[2,5,12],filepath:5,fill:[2,12],filter:[2,4],filter_cims_with_mask:4,find:[2,5],first:[2,12],fixtur:[7,8,9,10],follow:[4,5],form:4,format:12,formula:2,found:5,frame:5,from:[4,5,12],from_nod:5,gener:2,generate_possible_sub_sets_of_s:2,get:[2,5],get_cims_numb:4,get_fam_scor:2,get_node_id:4,get_node_indx:4,get_ordered_by_indx_set_of_par:4,get_parents_by_id:4,get_positional_node_indx:4,get_score_from_graph:2,get_states_numb:4,given:[2,4,5],glob:12,graph:[2,4,9,12],graph_struct:4,graphic:2,grid:[4,9],grpah:12,has:[5,12],has_edg:4,has_prior_net_structur:4,have:5,header:5,header_column:5,hill:[2,3],hill_climbing_search:[0,1,13,14],hillclimb:3,hold:[2,4],hook:[7,8,9,10],how:5,hyperparamet:2,hypothesi:2,identifi:[2,4,5],iff:2,implement:[3,5,13,14],import_data:[5,12],import_sampled_cim:5,import_structur:5,import_trajectori:5,import_vari:[5,12],improv:[2,3],includ:2,independ:2,independence_test:2,index:[2,4,5,12,13],indic:4,indx:5,info:[4,12],inform:[3,4],init:12,initi:[2,4,5,12],inplac:12,insid:12,instal:[13,14],interest:4,interfac:3,intes:4,iter:[2,3],iterations_numb:[2,3],its:[2,3],join:12,json:[2,5,12],json_import:[0,1,13,14],jsonarrai:5,jsonimport:[5,12],keep:[2,3,5],kei:5,kind:2,knowledg:2,known:2,known_edg:2,label:[2,3,4,5],lenght:[2,3],level:[2,5],likelihood:2,list:[2,3,4,5,12],list_of_column:4,list_of_edg:4,list_of_nod:4,load:5,loop:2,m_xu_suff_stat:2,m_xxu_suff_stat:2,main:12,margin:2,marginal_likelihood_q:2,marginal_likelihood_theta:2,mask:[4,9],mask_arr:4,matric:[2,4],matrix:[2,4,5,9,12],max_par:[2,3],maximum:[2,3],member:[4,5],mention:4,merg:5,method:[2,5,7,8,9,10],methodnam:[7,8,9,10],model:2,modul:[13,14],multipl:5,multiprocess:2,name:[2,4,5,12],ndarrai:[2,4,5],necessari:[2,4,5],nest:5,net:[2,3,4,5,12],net_graph:2,network:[2,4,5],network_graph:[0,1,2,13,14],networkgraph:[2,4,12],networkx:2,node:[2,3,4,5,9,12],node_id:[2,3,4,9],node_index:4,node_indx:[2,4],node_st:[4,9],node_states_numb:[4,9],nodes_index:4,nodes_indexes_arr:4,nodes_label:4,nodes_labels_list:4,nodes_numb:4,nodes_vals_arr:4,nodes_valu:[4,12],none:[2,3,4,5,7,9,10,12],normal:5,normalize_trajectori:5,number:[2,3,4],numpi:[2,4,5,9],obj:[10,12],object:[2,3,4,5,12],one:[4,5],one_iteration_of_ctpc_algorithm:2,one_level_norm:5,onli:5,oper:2,optim:[0,1,2,6,13,14],optimize_structur:3,option:[2,3],order:[2,5,10],origin:5,original_cols_numb:4,otherwis:[2,5],out:5,outer:[5,12],over:2,own:[13,14],p_comb:[4,9],p_indx:[4,9],p_val:9,p_valu:9,packag:[13,14],page:13,panda:[5,12],param:4,paramet:[2,3,4,5,9,13,14],parameters_estim:[0,1,13,14],parametersestim:[2,12],parent:[2,3,4,5],parent_indx:2,parent_label:2,parent_set:2,parent_set_v:2,parent_v:2,parent_valu:9,parents_cardin:4,parents_comb:5,parents_index:4,parents_indx:9,parents_label:[4,9],parents_states_numb:[4,9],parents_v:[4,9],parents_valu:[4,9],part:2,particular:[2,5],pass:12,path:[2,5,12],patienc:[2,3],peest:12,perform:2,pip:12,place:5,plot:2,png:2,posit:[4,5],possibl:[2,4],predict:3,prepar:5,present:[2,5],print:12,prior:[2,12],prior_net_structur:5,process:[2,3,4,5],properli:5,properti:[4,5],put:5,pyctbn:12,q_xx:4,rappres:4,raw:5,raw_data:5,read:[5,12],read_csv:12,read_csv_fil:12,read_fil:12,read_json_fil:5,real:[2,4,5,12],red:2,refer:[4,5],reject:2,rel:4,relat:5,releas:12,remain:5,remov:[2,4,5],remove_edg:4,remove_nod:4,repres:4,represent:2,res:4,resid:[2,4],result:[2,5,12],rtype:4,rule:[2,3],run:[7,8,9,10],runtest:[7,8,9,10],same:5,sampl:[4,5,12],sample_fram:[5,12],sample_import:[0,1,13,14],sample_path:[0,1,2,13,14],sampled_cim:7,sampleimport:5,samplepath:[2,4,12],samples_label:5,save:[2,12],save_plot_estimated_structure_graph:2,save_result:[2,12],scalar_index:2,scalar_indexes_struct:2,score:2,se1:12,search:[2,3,13],second:2,see:5,select:12,self:[2,5,12],sep:2,sep_set:2,set:[2,4,5,7,8,9,10],set_of_cim:[0,1,2,5,13,14],setofcim:[2,4,5,12],setupclass:[7,8,9,10],shift:[4,5],shifted_cols_head:5,show:2,signific:2,simbol:5,simpl:12,simpli:12,sinc:4,single_cim_xu_marginal_likelihood_q:2,single_cim_xu_marginal_likelihood_theta:2,single_internal_cim_xxu_marginal_likelihood_theta:2,size:[2,4],socim:5,sofc1:12,sorter:5,specif:[2,4,12],spuriou:2,spurious_edg:2,start:5,state:[2,4],state_res_tim:4,state_residence_tim:4,state_transition_matrix:4,statist:2,stop:[2,3],str:[2,3,4,5,12],string:[2,3,4,5],structur:[0,1,2,3,5,9,13,14],structure_constraint_based_estim:[0,1,13,14],structure_estim:[0,1,3,13,14],structure_estimation_exampl:12,structure_graph:[0,1,2,5,6,13,14],structure_label:5,structure_score_based_estim:[0,1,13,14],structureconstraintbasedestim:2,structureestim:[2,3,12],structurescorebasedestim:2,structut:4,style:2,submodul:[1,6,13,14],subpackag:[13,14],subset:2,suffici:2,suffuci:2,symbol:[4,5],synthet:5,t_xu_suff_stat:2,tabu:[2,3],tabu_length:[2,3],tabu_rules_dur:[2,3],tabu_search:[0,1,13,14],tabusearch:3,take:12,tar:12,task:[2,4],tau_xu:2,ternari:12,test:2,test_add_edg:9,test_add_nod:9,test_adjacency_matrix:7,test_buid_samplepath_no_concatenated_sampl:9,test_buid_samplepath_no_vari:9,test_build_cim:9,test_build_complete_graph:7,test_build_p_combs_structur:9,test_build_removable_edges_matrix:7,test_build_saplepath_no_prior_net_structur:9,test_build_sort:10,test_build_structur:9,test_build_structure_bad_sort:9,test_build_time_columns_filtering_structure_for_a_nod:9,test_build_time_scalar_indexing_structure_for_a_nod:9,test_build_trajectori:9,test_build_transition_columns_filtering_structur:9,test_build_transition_scalar_indexing_structure_for_a_nod:9,test_cach:6,test_child:2,test_cim:6,test_clear:10,test_clear_concatenated_fram:10,test_clear_data_frame_list:10,test_compute_cim_coeffici:9,test_compute_parameters_for_nod:7,test_compute_row_delta_in_all_fram:10,test_compute_row_delta_in_all_frames_not_init_sort:10,test_compute_row_delta_single_samples_fram:10,test_dataset_id:10,test_edges_oper:9,test_equ:9,test_fast_init:[7,9],test_file_path:10,test_filter_cims_with_mask:9,test_find:10,test_generate_possible_sub_sets_of_s:7,test_get_node_id:9,test_get_node_indx:9,test_get_ordered_by_indx_set_of_par:9,test_get_parents_by_id:9,test_get_positional_node_indx:9,test_get_states_numb:9,test_hill_climbing_search:6,test_import_data:10,test_import_sampled_cim:10,test_import_structur:10,test_import_vari:10,test_init:[7,9,10],test_init_not_filled_dataframs:9,test_init_not_initialized_import:9,test_json_import:6,test_networkgraph:6,test_normalize_trajectori:10,test_normalize_trajectories_wrong_indx:10,test_normalize_trajectories_wrong_kei:10,test_ord:10,test_par:2,test_parameters_estim:6,test_put:10,test_read_json_file_found:10,test_read_json_file_not_found:10,test_repr:9,test_sample_import:6,test_sample_path:6,test_save_plot_estimated_graph:7,test_save_result:7,test_setofcim:6,test_structur:[6,8],test_structure_1:7,test_structure_2:7,test_structure_3:[7,8],test_structure_constraint_based_estim:6,test_structure_estim:6,test_structure_monoprocesso:7,test_structure_score_based_estim:6,test_tabu_search:6,test_tim:7,test_trajectori:6,testcach:10,testcas:[7,8,9,10],testconditionalintensitymatrix:9,testhillclimbingsearch:8,testjsonimport:10,testnetworkgraph:9,testparametersestimatior:7,testsampleimport:10,testsamplepath:9,testsetofcim:9,teststructur:9,teststructureconstraintbasedestim:7,teststructureestim:7,teststructurescorebasedestim:7,testtabusearch:8,testtrajectori:9,tha:5,theta:2,thi:[2,4,5,12],three:12,threshold:2,thumb:2,thumb_threshold:2,thumb_valu:2,time:[2,4,5,12],time_filt:4,time_kei:5,time_scalar_indexing_strucur:4,timestamp:5,to_nod:5,tot_vars_count:[2,3],total:[2,4],total_variables_count:4,total_variables_numb:4,traj:5,trajecory_head:5,trajectori:[0,1,2,5,12,13,14],trajectories_kei:5,trajectory_list:5,trajectri:12,transit:[2,4,5],transition_filt:4,transition_matric:4,transition_scalar_indexing_structur:4,tri:5,tupl:4,tutori:5,two:2,type:[2,3,4,5,12],union:5,uniqu:5,unittest:[7,8,9,10],unus:4,usag:[13,14],use:[2,12],used:[2,3,4,5],using:[2,3,4,5],util:[0,1,4,6,13,14],valid:2,valu:[2,3,4,5,9,12],values_list:12,var_id:2,variabl:[2,3,4,5,12],variable_cardin:5,variable_cim_xu_marginal_likelihood_q:2,variable_cim_xu_marginal_likelihood_theta:2,variable_label:5,variables_kei:5,variables_label:5,vector:[2,4],want:12,when:2,where:5,which:[2,3,4,5],whl:12,who:2,without:[2,3],you:[2,5,12],your:[13,14]},titles:["PyCTBN package","PyCTBN.PyCTBN package","PyCTBN.PyCTBN.estimators package","PyCTBN.PyCTBN.optimizers package","PyCTBN.PyCTBN.structure_graph package","PyCTBN.PyCTBN.utility package","PyCTBN.tests package","PyCTBN.tests.estimators package","PyCTBN.tests.optimizers package","PyCTBN.tests.structure_graph package","PyCTBN.tests.utility package","basic_main module","Examples","Welcome to PyCTBN\u2019s documentation!","PyCTBN","setup module"],titleterms:{"import":12,abstract_import:5,basic_main:11,cach:5,conditional_intensity_matrix:4,constraint_based_optim:3,content:[0,1,2,3,4,5,6,7,8,9,10],data:12,document:13,estim:[2,7,12],exampl:12,fam_score_calcul:2,hill_climbing_search:3,implement:12,indic:13,instal:12,json_import:5,modul:[0,1,2,3,4,5,6,7,8,9,10,11,15],network_graph:4,optim:[3,8],own:12,packag:[0,1,2,3,4,5,6,7,8,9,10],paramet:12,parameters_estim:2,pyctbn:[0,1,2,3,4,5,6,7,8,9,10,13,14],sample_import:5,sample_path:4,set_of_cim:4,setup:15,structur:[4,12],structure_constraint_based_estim:2,structure_estim:2,structure_graph:[4,9],structure_score_based_estim:2,submodul:[0,2,3,4,5,7,8,9,10],subpackag:[0,1,6],tabl:13,tabu_search:3,test:[6,7,8,9,10],test_cach:10,test_cim:9,test_hill_climbing_search:8,test_json_import:10,test_networkgraph:9,test_parameters_estim:7,test_sample_import:10,test_sample_path:9,test_setofcim:9,test_structur:9,test_structure_constraint_based_estim:7,test_structure_estim:7,test_structure_score_based_estim:7,test_tabu_search:8,test_trajectori:9,trajectori:4,usag:12,util:[5,10],welcom:13,your:12}}) \ No newline at end of file +Search.setIndex({docnames:["PyCTBN","PyCTBN.PyCTBN","PyCTBN.PyCTBN.estimators","PyCTBN.PyCTBN.optimizers","PyCTBN.PyCTBN.structure_graph","PyCTBN.PyCTBN.utility","PyCTBN.tests","PyCTBN.tests.estimators","PyCTBN.tests.optimizers","PyCTBN.tests.structure_graph","PyCTBN.tests.utility","basic_main","examples","index","modules","setup"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["PyCTBN.rst","PyCTBN.PyCTBN.rst","PyCTBN.PyCTBN.estimators.rst","PyCTBN.PyCTBN.optimizers.rst","PyCTBN.PyCTBN.structure_graph.rst","PyCTBN.PyCTBN.utility.rst","PyCTBN.tests.rst","PyCTBN.tests.estimators.rst","PyCTBN.tests.optimizers.rst","PyCTBN.tests.structure_graph.rst","PyCTBN.tests.utility.rst","basic_main.rst","examples.rst","index.rst","modules.rst","setup.rst"],objects:{"":{PyCTBN:[0,0,0,"-"]},"PyCTBN.PyCTBN":{estimators:[2,0,0,"-"],optimizers:[3,0,0,"-"],structure_graph:[4,0,0,"-"],utility:[5,0,0,"-"]},"PyCTBN.PyCTBN.estimators":{fam_score_calculator:[2,0,0,"-"],parameters_estimator:[2,0,0,"-"],structure_constraint_based_estimator:[2,0,0,"-"],structure_estimator:[2,0,0,"-"],structure_score_based_estimator:[2,0,0,"-"]},"PyCTBN.PyCTBN.estimators.fam_score_calculator":{FamScoreCalculator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator":{get_fam_score:[2,2,1,""],marginal_likelihood_q:[2,2,1,""],marginal_likelihood_theta:[2,2,1,""],single_cim_xu_marginal_likelihood_q:[2,2,1,""],single_cim_xu_marginal_likelihood_theta:[2,2,1,""],single_internal_cim_xxu_marginal_likelihood_theta:[2,2,1,""],variable_cim_xu_marginal_likelihood_q:[2,2,1,""],variable_cim_xu_marginal_likelihood_theta:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator":{ParametersEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator":{compute_parameters_for_node:[2,2,1,""],compute_state_res_time_for_node:[2,2,1,""],compute_state_transitions_for_a_node:[2,2,1,""],fast_init:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator":{StructureConstraintBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator":{complete_test:[2,2,1,""],compute_thumb_value:[2,2,1,""],ctpc_algorithm:[2,2,1,""],estimate_structure:[2,2,1,""],independence_test:[2,2,1,""],one_iteration_of_CTPC_algorithm:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator":{StructureEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator":{adjacency_matrix:[2,2,1,""],build_complete_graph:[2,2,1,""],build_removable_edges_matrix:[2,2,1,""],estimate_structure:[2,2,1,""],generate_possible_sub_sets_of_size:[2,2,1,""],save_plot_estimated_structure_graph:[2,2,1,""],save_results:[2,2,1,""],spurious_edges:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator":{StructureScoreBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator":{estimate_parents:[2,2,1,""],estimate_structure:[2,2,1,""],get_score_from_graph:[2,2,1,""]},"PyCTBN.PyCTBN.optimizers":{constraint_based_optimizer:[3,0,0,"-"],hill_climbing_search:[3,0,0,"-"],optimizer:[3,0,0,"-"],tabu_search:[3,0,0,"-"]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer":{ConstraintBasedOptimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search":{HillClimbing:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search.HillClimbing":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer":{Optimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer.Optimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search":{TabuSearch:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search.TabuSearch":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.structure_graph":{conditional_intensity_matrix:[4,0,0,"-"],network_graph:[4,0,0,"-"],sample_path:[4,0,0,"-"],set_of_cims:[4,0,0,"-"],structure:[4,0,0,"-"],trajectory:[4,0,0,"-"]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix":{ConditionalIntensityMatrix:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix":{cim:[4,2,1,""],compute_cim_coefficients:[4,2,1,""],state_residence_times:[4,2,1,""],state_transition_matrix:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph":{NetworkGraph:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph":{add_edges:[4,2,1,""],add_nodes:[4,2,1,""],build_p_comb_structure_for_a_node:[4,2,1,""],build_time_columns_filtering_for_a_node:[4,2,1,""],build_time_scalar_indexing_structure_for_a_node:[4,2,1,""],build_transition_filtering_for_a_node:[4,2,1,""],build_transition_scalar_indexing_structure_for_a_node:[4,2,1,""],clear_indexing_filtering_structures:[4,2,1,""],edges:[4,2,1,""],fast_init:[4,2,1,""],get_node_indx:[4,2,1,""],get_ordered_by_indx_set_of_parents:[4,2,1,""],get_parents_by_id:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],has_edge:[4,2,1,""],nodes:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_values:[4,2,1,""],p_combs:[4,2,1,""],remove_edges:[4,2,1,""],remove_node:[4,2,1,""],time_filtering:[4,2,1,""],time_scalar_indexing_strucure:[4,2,1,""],transition_filtering:[4,2,1,""],transition_scalar_indexing_structure:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path":{SamplePath:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath":{build_structure:[4,2,1,""],build_trajectories:[4,2,1,""],clear_memory:[4,2,1,""],has_prior_net_structure:[4,2,1,""],structure:[4,2,1,""],total_variables_count:[4,2,1,""],trajectories:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims":{SetOfCims:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims":{actual_cims:[4,2,1,""],build_cims:[4,2,1,""],build_times_and_transitions_structures:[4,2,1,""],filter_cims_with_mask:[4,2,1,""],get_cims_number:[4,2,1,""],p_combs:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.structure":{Structure:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.structure.Structure":{add_edge:[4,2,1,""],clean_structure_edges:[4,2,1,""],contains_edge:[4,2,1,""],edges:[4,2,1,""],get_node_id:[4,2,1,""],get_node_indx:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_labels:[4,2,1,""],nodes_values:[4,2,1,""],remove_edge:[4,2,1,""],remove_node:[4,2,1,""],total_variables_number:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory":{Trajectory:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory":{complete_trajectory:[4,2,1,""],size:[4,2,1,""],times:[4,2,1,""],trajectory:[4,2,1,""]},"PyCTBN.PyCTBN.utility":{abstract_importer:[5,0,0,"-"],cache:[5,0,0,"-"],json_importer:[5,0,0,"-"],sample_importer:[5,0,0,"-"]},"PyCTBN.PyCTBN.utility.abstract_importer":{AbstractImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter":{build_list_of_samples_array:[5,2,1,""],build_sorter:[5,2,1,""],clear_concatenated_frame:[5,2,1,""],compute_row_delta_in_all_samples_frames:[5,2,1,""],compute_row_delta_sigle_samples_frame:[5,2,1,""],concatenated_samples:[5,2,1,""],dataset_id:[5,2,1,""],file_path:[5,2,1,""],sorter:[5,2,1,""],structure:[5,2,1,""],variables:[5,2,1,""]},"PyCTBN.PyCTBN.utility.cache":{Cache:[5,1,1,""]},"PyCTBN.PyCTBN.utility.cache.Cache":{clear:[5,2,1,""],find:[5,2,1,""],put:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_importer":{JsonImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_importer.JsonImporter":{build_sorter:[5,2,1,""],clear_data_frame_list:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""],import_sampled_cims:[5,2,1,""],import_structure:[5,2,1,""],import_trajectories:[5,2,1,""],import_variables:[5,2,1,""],normalize_trajectories:[5,2,1,""],one_level_normalizing:[5,2,1,""],read_json_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.sample_importer":{SampleImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.sample_importer.SampleImporter":{build_sorter:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""]},"PyCTBN.tests":{estimators:[7,0,0,"-"],optimizers:[8,0,0,"-"],structure_graph:[9,0,0,"-"],utility:[10,0,0,"-"]},"PyCTBN.tests.estimators":{test_parameters_estimator:[7,0,0,"-"],test_structure_constraint_based_estimator:[7,0,0,"-"],test_structure_estimator:[7,0,0,"-"],test_structure_score_based_estimator:[7,0,0,"-"]},"PyCTBN.tests.estimators.test_parameters_estimator":{TestParametersEstimatior:[7,1,1,""]},"PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior":{aux_import_sampled_cims:[7,2,1,""],cim_equality_test:[7,2,1,""],equality_of_cims_of_node:[7,2,1,""],setUpClass:[7,2,1,""],test_compute_parameters_for_node:[7,2,1,""],test_fast_init:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator":{TestStructureConstraintBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_estimator":{TestStructureEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator":{setUpClass:[7,2,1,""],test_adjacency_matrix:[7,2,1,""],test_build_complete_graph:[7,2,1,""],test_build_removable_edges_matrix:[7,2,1,""],test_generate_possible_sub_sets_of_size:[7,2,1,""],test_init:[7,2,1,""],test_save_plot_estimated_graph:[7,2,1,""],test_save_results:[7,2,1,""],test_time:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator":{TestStructureScoreBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""],test_structure_monoprocesso:[7,2,1,""]},"PyCTBN.tests.optimizers":{test_hill_climbing_search:[8,0,0,"-"],test_tabu_search:[8,0,0,"-"]},"PyCTBN.tests.optimizers.test_hill_climbing_search":{TestHillClimbingSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_hill_climbing_search.TestHillClimbingSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.optimizers.test_tabu_search":{TestTabuSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_tabu_search.TestTabuSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.structure_graph":{test_cim:[9,0,0,"-"],test_networkgraph:[9,0,0,"-"],test_sample_path:[9,0,0,"-"],test_setofcims:[9,0,0,"-"],test_structure:[9,0,0,"-"],test_trajectory:[9,0,0,"-"]},"PyCTBN.tests.structure_graph.test_cim":{TestConditionalIntensityMatrix:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix":{setUpClass:[9,2,1,""],test_compute_cim_coefficients:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph":{TestNetworkGraph:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph":{aux_build_p_combs_structure:[9,2,1,""],aux_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],aux_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],aux_build_transition_columns_filtering_structure:[9,2,1,""],aux_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_add_edges:[9,2,1,""],test_add_nodes:[9,2,1,""],test_build_p_combs_structure:[9,2,1,""],test_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],test_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],test_build_transition_columns_filtering_structure:[9,2,1,""],test_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],test_fast_init:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_ordered_by_indx_set_of_parents:[9,2,1,""],test_get_parents_by_id:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_sample_path":{TestSamplePath:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath":{setUpClass:[9,2,1,""],test_buid_samplepath_no_concatenated_samples:[9,2,1,""],test_buid_samplepath_no_variables:[9,2,1,""],test_build_saplepath_no_prior_net_structure:[9,2,1,""],test_build_structure:[9,2,1,""],test_build_structure_bad_sorter:[9,2,1,""],test_build_trajectories:[9,2,1,""],test_init:[9,2,1,""],test_init_not_filled_dataframse:[9,2,1,""],test_init_not_initialized_importer:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_setofcims":{TestSetOfCims:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims":{another_filtering_method:[9,2,1,""],aux_test_build_cims:[9,2,1,""],aux_test_init:[9,2,1,""],build_p_comb_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_build_cims:[9,2,1,""],test_filter_cims_with_mask:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_structure":{TestStructure:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_structure.TestStructure":{setUpClass:[9,2,1,""],test_edges_operations:[9,2,1,""],test_equality:[9,2,1,""],test_get_node_id:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_positional_node_indx:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectory":{TestTrajectory:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory":{setUpClass:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.utility":{test_cache:[10,0,0,"-"],test_json_importer:[10,0,0,"-"],test_sample_importer:[10,0,0,"-"]},"PyCTBN.tests.utility.test_cache":{TestCache:[10,1,1,""]},"PyCTBN.tests.utility.test_cache.TestCache":{test_clear:[10,2,1,""],test_find:[10,2,1,""],test_init:[10,2,1,""],test_put:[10,2,1,""]},"PyCTBN.tests.utility.test_json_importer":{TestJsonImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_json_importer.TestJsonImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_build_sorter:[10,2,1,""],test_clear_concatenated_frame:[10,2,1,""],test_clear_data_frame_list:[10,2,1,""],test_compute_row_delta_in_all_frames:[10,2,1,""],test_compute_row_delta_in_all_frames_not_init_sorter:[10,2,1,""],test_compute_row_delta_single_samples_frame:[10,2,1,""],test_dataset_id:[10,2,1,""],test_file_path:[10,2,1,""],test_import_data:[10,2,1,""],test_import_sampled_cims:[10,2,1,""],test_import_structure:[10,2,1,""],test_import_variables:[10,2,1,""],test_init:[10,2,1,""],test_normalize_trajectories:[10,2,1,""],test_normalize_trajectories_wrong_indx:[10,2,1,""],test_normalize_trajectories_wrong_key:[10,2,1,""],test_read_json_file_found:[10,2,1,""],test_read_json_file_not_found:[10,2,1,""]},"PyCTBN.tests.utility.test_sample_importer":{TestSampleImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_sample_importer.TestSampleImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_init:[10,2,1,""],test_order:[10,2,1,""]},PyCTBN:{PyCTBN:[1,0,0,"-"],tests:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"abstract":[2,3,4,5,12],"boolean":[2,4],"case":[7,8,9,10],"class":[2,3,4,5,7,8,9,10,12],"default":[2,3,5],"float":2,"function":2,"import":[4,5,13,14],"int":[2,3,4,5],"null":2,"return":[2,3,4,5,9,12],"static":[2,4],"super":12,"true":[2,12],"var":12,HAS:5,Has:[2,4],NOT:2,The:[2,4,5,12],Use:[2,12],__actual_cach:5,__init__:12,__list_of_sets_of_par:5,_actual_cim:4,_actual_trajectori:4,_aggregated_info_about_nodes_par:4,_array_indx:5,_cach:2,_cim:4,_complete_graph:2,_df_samples_list:[5,12],_df_structur:5,_df_variabl:[5,12],_file_path:12,_graph:[4,12],_import:4,_net_graph:2,_node:2,_node_id:4,_nodes_indx:2,_nodes_v:2,_p_combs_structur:4,_raw_data:5,_sample_path:2,_single_set_of_cim:2,_sorter:[5,12],_state_residence_tim:4,_structur:4,_structure_label:5,_time:4,_time_filt:4,_time_scalar_indexing_structur:4,_total_variables_count:4,_total_variables_numb:4,_trajectori:4,_transition_filt:4,_transition_matric:4,_transition_scalar_indexing_structur:4,_variables_label:5,abc:[3,5],about:[3,4],abstract_import:[0,1,4,13,14],abstractimport:[4,5,12],act:5,actual:[2,4],actual_cim:[4,12],add:[4,5],add_edg:4,add_nod:4,added:2,addit:2,adjac:[2,12],adjacency_matrix:[2,12],after:5,against:2,aggreg:4,algorithm:[2,3,12],all:[2,3,4,5,9,12],alpha_xu:2,alpha_xxu:2,alreadi:[5,12],also:[2,4],ani:[2,3],anoth:4,another_filtering_method:9,approach:2,arc:5,arrai:[2,4,5,12],assign:2,assum:2,aux_build_p_combs_structur:9,aux_build_time_columns_filtering_structure_for_a_nod:9,aux_build_time_scalar_indexing_structure_for_a_nod:9,aux_build_transition_columns_filtering_structur:9,aux_build_transition_scalar_indexing_structure_for_a_nod:9,aux_import_sampled_cim:7,aux_test_build_cim:9,aux_test_init:9,axi:12,base:[2,3,4,5,7,8,9,10],bayesian:2,befor:[2,3,7,8,9,10],belong:2,best:2,between:5,bool:[2,4],both:[2,5],bound:4,build:[2,4,5,9,12],build_cim:4,build_complete_graph:2,build_list_of_samples_arrai:5,build_p_comb_structure_for_a_nod:[4,9],build_removable_edges_matrix:2,build_sort:[5,12],build_structur:[4,12],build_time_columns_filtering_for_a_nod:4,build_time_scalar_indexing_structure_for_a_nod:4,build_times_and_transitions_structur:4,build_trajectori:[4,12],build_transition_filtering_for_a_nod:4,build_transition_scalar_indexing_structure_for_a_nod:4,built:2,cach:[0,1,2,13,14],calcul:2,call:[5,12],cardin:[2,4,5,9],cardinalit:[4,5],caridin:4,caridinalit:4,chang:[4,5],check:4,chi:2,chi_test:2,chi_test_alfa:2,child:[2,3],child_indx:2,child_states_numb:2,child_val:2,cim1:[2,7],cim2:[2,7],cim:[2,4,5,12],cim_equality_test:7,cims_kei:5,cims_label:7,classmethod:[7,8,9,10],clean_structure_edg:4,clear:[4,5],clear_concatenated_fram:5,clear_data_frame_list:5,clear_indexing_filtering_structur:4,clear_memori:4,climb:[2,3],coeffici:4,col:4,cols_filt:2,column:[2,4,5,12],columns_head:5,comb:4,combin:[4,5,9],combinatori:[4,9],common:2,complet:[2,4,5],complete_test:2,complete_trajectori:4,comput:[2,3,4,5,12],compute_cim_coeffici:4,compute_parameters_for_nod:[2,12],compute_row_delta_in_all_samples_fram:[5,12],compute_row_delta_sigle_samples_fram:5,compute_state_res_time_for_nod:2,compute_state_transitions_for_a_nod:2,compute_thumb_valu:2,concatanated_sampl:5,concaten:[4,5],concatenated_sampl:5,condit:4,conditional_intensity_matrix:[0,1,2,13,14],conditionalintensitymatrix:[2,4],consid:[2,4],constraint:2,constraint_based_optim:[0,1,13,14],constraintbasedoptim:3,construct:[4,5,12],conta:5,contain:[2,4,5,9],contains_edg:4,content:[13,14],convert:[2,5],copi:5,core:5,correct:[4,5],could:2,count:4,creat:[2,4,12],csv:12,csvimport:12,ctbn:2,ctpc:[2,3,12],ctpc_algorithm:[2,12],current:[2,3,5],cut:5,dafram:5,data:[2,3,4,5,13,14],datafram:[4,5,12],dataset:[3,4,5],dataset_id:[5,12],datfram:5,def:12,defin:5,definit:5,defualt:2,delta:[2,4,5],demonstr:12,describ:5,desir:[2,4],df_samples_list:5,dict:[5,12],dictionari:5,differ:5,differt:2,digraph:2,dimens:4,dir:12,direct:[2,4],directli:5,disabl:[2,3],disable_multiprocess:2,distribuit:2,doc:5,doubl:4,download:12,drop:12,duplic:4,dyn:12,each:[2,3,5],edg:[2,4,5,12],edges_list:4,end:5,entir:2,equal:4,equality_of_cims_of_nod:7,est:12,estim:[0,1,3,4,6,13,14],estimate_par:2,estimate_structur:2,estimated_cim:7,everi:[4,5],exam:12,exampl:[5,13,14],exclud:2,exctract:5,exist:5,exp_test_alfa:2,exponenti:2,expos:5,extend:12,extens:[2,5],extract:[4,5],fals:2,fam_score_calcul:[0,1,13,14],famscor:2,famscorecalcul:2,fast_init:[2,4,12],file:[2,5,12],file_path:[2,5,12],filepath:5,fill:[2,12],filter:[2,4],filter_cims_with_mask:4,find:[2,5],first:[2,12],fixtur:[7,8,9,10],follow:[4,5],form:4,format:12,formula:2,found:5,frame:5,from:[4,5,12],from_nod:5,gener:2,generate_possible_sub_sets_of_s:2,get:[2,5],get_cims_numb:4,get_fam_scor:2,get_node_id:4,get_node_indx:4,get_ordered_by_indx_set_of_par:4,get_parents_by_id:4,get_positional_node_indx:4,get_score_from_graph:2,get_states_numb:4,given:[2,4,5],glob:12,graph:[2,4,9,12],graph_struct:4,graphic:2,grid:[4,9],grpah:12,has:[5,12],has_edg:4,has_prior_net_structur:4,have:5,header:5,header_column:5,hill:[2,3],hill_climbing_search:[0,1,13,14],hillclimb:3,hold:[2,4],hook:[7,8,9,10],how:5,hyperparamet:2,hypothesi:2,identifi:[2,4,5],iff:2,implement:[3,5,13,14],import_data:[5,12],import_sampled_cim:5,import_structur:5,import_trajectori:5,import_vari:[5,12],improv:[2,3],includ:2,independ:2,independence_test:2,index:[2,4,5,12,13],indic:4,indx:5,info:[4,12],inform:[3,4],init:12,initi:[2,4,5,12],inplac:12,insid:12,instal:[13,14],interest:4,interfac:3,intes:4,iter:[2,3],iterations_numb:[2,3],its:[2,3],join:12,json:[2,5,12],json_import:[0,1,13,14],jsonarrai:5,jsonimport:[5,12],keep:[2,3,5],kei:5,kind:2,knowledg:2,known:2,known_edg:2,label:[2,3,4,5],lenght:[2,3],level:[2,5],likelihood:2,list:[2,3,4,5,12],list_of_column:4,list_of_edg:4,list_of_nod:4,load:5,loop:2,m_xu_suff_stat:2,m_xxu_suff_stat:2,main:12,margin:2,marginal_likelihood_q:2,marginal_likelihood_theta:2,mask:[4,9],mask_arr:4,matric:[2,4],matrix:[2,4,5,9,12],max_par:[2,3],maximum:[2,3],member:[4,5],mention:4,merg:5,method:[2,5,7,8,9,10],methodnam:[7,8,9,10],model:2,modul:[13,14],multipl:5,multiprocess:2,name:[2,4,5,12],ndarrai:[2,4,5],necessari:[2,4,5],nest:5,net:[2,3,4,5,12],net_graph:2,network:[2,4,5],network_graph:[0,1,2,13,14],networkgraph:[2,4,12],networkx:2,node:[2,3,4,5,9,12],node_id:[2,3,4,9],node_index:4,node_indx:[2,4],node_st:[4,9],node_states_numb:[4,9],nodes_index:4,nodes_indexes_arr:4,nodes_label:4,nodes_labels_list:4,nodes_numb:4,nodes_vals_arr:4,nodes_valu:[4,12],none:[2,3,4,5,7,9,10,12],normal:5,normalize_trajectori:5,number:[2,3,4],numpi:[2,4,5,9],obj:[10,12],object:[2,3,4,5,12],one:[4,5],one_iteration_of_ctpc_algorithm:2,one_level_norm:5,onli:5,oper:2,optim:[0,1,2,6,13,14],optimize_structur:3,option:[2,3],order:[2,5,10],origin:5,original_cols_numb:4,otherwis:[2,5],out:5,outer:[5,12],over:2,own:[13,14],p_comb:[4,9],p_indx:[4,9],p_val:9,p_valu:9,packag:[13,14],page:13,panda:[5,12],param:4,paramet:[2,3,4,5,9,13,14],parameters_estim:[0,1,13,14],parametersestim:[2,12],parent:[2,3,4,5],parent_indx:2,parent_label:2,parent_set:2,parent_set_v:2,parent_v:2,parent_valu:9,parents_cardin:4,parents_comb:5,parents_index:4,parents_indx:9,parents_label:[4,9],parents_states_numb:[4,9],parents_v:[4,9],parents_valu:[4,9],part:2,particular:[2,5],pass:12,path:[2,5,12],patienc:[2,3],peest:12,perform:2,pip:12,place:5,plot:2,png:2,posit:[4,5],possibl:[2,4],predict:3,prepar:5,present:[2,5],print:12,prior:[2,12],prior_net_structur:5,process:[2,3,4,5],properli:5,properti:[4,5],put:5,pyctbn:12,q_xx:4,rappres:4,raw:5,raw_data:5,read:[5,12],read_csv:12,read_csv_fil:12,read_fil:12,read_json_fil:5,real:[2,4,5,12],refer:[4,5],reject:2,rel:4,relat:5,releas:12,remain:5,remov:[2,4,5],remove_edg:4,remove_nod:4,repres:4,represent:2,res:4,resid:[2,4],result:[2,5,12],rtype:4,rule:[2,3],run:[7,8,9,10],runtest:[7,8,9,10],same:5,sampl:[4,5,12],sample_fram:[5,12],sample_import:[0,1,13,14],sample_path:[0,1,2,13,14],sampled_cim:7,sampleimport:5,samplepath:[2,4,12],samples_label:5,save:[2,12],save_plot_estimated_structure_graph:2,save_result:[2,12],scalar_index:2,scalar_indexes_struct:2,score:2,se1:12,search:[2,3,13],second:2,see:5,select:12,self:[2,5,12],sep:2,sep_set:2,set:[2,4,5,7,8,9,10],set_of_cim:[0,1,2,5,13,14],setofcim:[2,4,5,12],setupclass:[7,8,9,10],shift:[4,5],shifted_cols_head:5,show:2,signific:2,simbol:5,simpl:12,simpli:12,sinc:4,single_cim_xu_marginal_likelihood_q:2,single_cim_xu_marginal_likelihood_theta:2,single_internal_cim_xxu_marginal_likelihood_theta:2,size:[2,4],socim:5,sofc1:12,sorter:5,specif:[2,4,12],spuriou:2,spurious_edg:2,start:5,state:[2,4],state_res_tim:4,state_residence_tim:4,state_transition_matrix:4,statist:2,stop:[2,3],str:[2,3,4,5,12],string:[2,3,4,5],structur:[0,1,2,3,5,9,13,14],structure_constraint_based_estim:[0,1,13,14],structure_estim:[0,1,3,13,14],structure_estimation_exampl:12,structure_graph:[0,1,2,5,6,13,14],structure_label:5,structure_score_based_estim:[0,1,13,14],structureconstraintbasedestim:2,structureestim:[2,3,12],structurescorebasedestim:2,structut:4,style:2,submodul:[1,6,13,14],subpackag:[13,14],subset:2,suffici:2,suffuci:2,symbol:[4,5],synthet:5,t_xu_suff_stat:2,tabu:[2,3],tabu_length:[2,3],tabu_rules_dur:[2,3],tabu_search:[0,1,13,14],tabusearch:3,take:12,tar:12,task:[2,4],tau_xu:2,ternari:12,test:2,test_add_edg:9,test_add_nod:9,test_adjacency_matrix:7,test_buid_samplepath_no_concatenated_sampl:9,test_buid_samplepath_no_vari:9,test_build_cim:9,test_build_complete_graph:7,test_build_p_combs_structur:9,test_build_removable_edges_matrix:7,test_build_saplepath_no_prior_net_structur:9,test_build_sort:10,test_build_structur:9,test_build_structure_bad_sort:9,test_build_time_columns_filtering_structure_for_a_nod:9,test_build_time_scalar_indexing_structure_for_a_nod:9,test_build_trajectori:9,test_build_transition_columns_filtering_structur:9,test_build_transition_scalar_indexing_structure_for_a_nod:9,test_cach:6,test_child:2,test_cim:6,test_clear:10,test_clear_concatenated_fram:10,test_clear_data_frame_list:10,test_compute_cim_coeffici:9,test_compute_parameters_for_nod:7,test_compute_row_delta_in_all_fram:10,test_compute_row_delta_in_all_frames_not_init_sort:10,test_compute_row_delta_single_samples_fram:10,test_dataset_id:10,test_edges_oper:9,test_equ:9,test_fast_init:[7,9],test_file_path:10,test_filter_cims_with_mask:9,test_find:10,test_generate_possible_sub_sets_of_s:7,test_get_node_id:9,test_get_node_indx:9,test_get_ordered_by_indx_set_of_par:9,test_get_parents_by_id:9,test_get_positional_node_indx:9,test_get_states_numb:9,test_hill_climbing_search:6,test_import_data:10,test_import_sampled_cim:10,test_import_structur:10,test_import_vari:10,test_init:[7,9,10],test_init_not_filled_dataframs:9,test_init_not_initialized_import:9,test_json_import:6,test_networkgraph:6,test_normalize_trajectori:10,test_normalize_trajectories_wrong_indx:10,test_normalize_trajectories_wrong_kei:10,test_ord:10,test_par:2,test_parameters_estim:6,test_put:10,test_read_json_file_found:10,test_read_json_file_not_found:10,test_repr:9,test_sample_import:6,test_sample_path:6,test_save_plot_estimated_graph:7,test_save_result:7,test_setofcim:6,test_structur:[6,8],test_structure_1:7,test_structure_2:7,test_structure_3:[7,8],test_structure_constraint_based_estim:6,test_structure_estim:6,test_structure_monoprocesso:7,test_structure_score_based_estim:6,test_tabu_search:6,test_tim:7,test_trajectori:6,testcach:10,testcas:[7,8,9,10],testconditionalintensitymatrix:9,testhillclimbingsearch:8,testjsonimport:10,testnetworkgraph:9,testparametersestimatior:7,testsampleimport:10,testsamplepath:9,testsetofcim:9,teststructur:9,teststructureconstraintbasedestim:7,teststructureestim:7,teststructurescorebasedestim:7,testtabusearch:8,testtrajectori:9,tha:5,theta:2,thi:[2,4,5,12],three:12,threshold:2,thumb:2,thumb_threshold:2,thumb_valu:2,time:[2,4,5,12],time_filt:4,time_kei:5,time_scalar_indexing_strucur:4,timestamp:5,to_nod:5,tot_vars_count:[2,3],total:[2,4],total_variables_count:4,total_variables_numb:4,traj:5,trajecory_head:5,trajectori:[0,1,2,5,12,13,14],trajectories_kei:5,trajectory_list:5,trajectri:12,transit:[2,4,5],transition_filt:4,transition_matric:4,transition_scalar_indexing_structur:4,tri:5,tupl:4,tutori:5,two:2,type:[2,3,4,5,12],union:5,uniqu:5,unittest:[7,8,9,10],unus:4,usag:[13,14],use:[2,12],used:[2,3,4,5],using:[2,3,4,5],util:[0,1,4,6,13,14],valid:2,valu:[2,3,4,5,9,12],values_list:12,var_id:2,variabl:[2,3,4,5,12],variable_cardin:5,variable_cim_xu_marginal_likelihood_q:2,variable_cim_xu_marginal_likelihood_theta:2,variable_label:5,variables_kei:5,variables_label:5,vector:[2,4],want:12,when:2,where:5,which:[2,3,4,5],whl:12,who:2,without:[2,3],you:[2,5,12],your:[13,14]},titles:["PyCTBN package","PyCTBN.PyCTBN package","PyCTBN.PyCTBN.estimators package","PyCTBN.PyCTBN.optimizers package","PyCTBN.PyCTBN.structure_graph package","PyCTBN.PyCTBN.utility package","PyCTBN.tests package","PyCTBN.tests.estimators package","PyCTBN.tests.optimizers package","PyCTBN.tests.structure_graph package","PyCTBN.tests.utility package","basic_main module","Examples","Welcome to PyCTBN\u2019s documentation!","PyCTBN","setup module"],titleterms:{"import":12,abstract_import:5,basic_main:11,cach:5,conditional_intensity_matrix:4,constraint_based_optim:3,content:[0,1,2,3,4,5,6,7,8,9,10],data:12,document:13,estim:[2,7,12],exampl:12,fam_score_calcul:2,hill_climbing_search:3,implement:12,indic:13,instal:12,json_import:5,modul:[0,1,2,3,4,5,6,7,8,9,10,11,15],network_graph:4,optim:[3,8],own:12,packag:[0,1,2,3,4,5,6,7,8,9,10],paramet:12,parameters_estim:2,pyctbn:[0,1,2,3,4,5,6,7,8,9,10,13,14],sample_import:5,sample_path:4,set_of_cim:4,setup:15,structur:[4,12],structure_constraint_based_estim:2,structure_estim:2,structure_graph:[4,9],structure_score_based_estim:2,submodul:[0,2,3,4,5,7,8,9,10],subpackag:[0,1,6],tabl:13,tabu_search:3,test:[6,7,8,9,10],test_cach:10,test_cim:9,test_hill_climbing_search:8,test_json_import:10,test_networkgraph:9,test_parameters_estim:7,test_sample_import:10,test_sample_path:9,test_setofcim:9,test_structur:9,test_structure_constraint_based_estim:7,test_structure_estim:7,test_structure_score_based_estim:7,test_tabu_search:8,test_trajectori:9,trajectori:4,usag:12,util:[5,10],welcom:13,your:12}}) \ No newline at end of file From 02611b4545458d4424cdc537e1b8b9c319b6478e Mon Sep 17 00:00:00 2001 From: Filippo Martini Date: Mon, 15 Mar 2021 00:12:24 +0100 Subject: [PATCH 093/139] Modify README --- README.rst | 61 +++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/README.rst b/README.rst index 13b939c..5655d54 100644 --- a/README.rst +++ b/README.rst @@ -94,32 +94,59 @@ Parameters Estimation Example Structure Estimation Examples **************************** +This example shows how to estimate the structure given a series of trajectories using a constraint based approach. +The first three instructions import all the necessary data (trajectories, nodes cardinalities, nodes labels), +and are contextual to the dataset that is been used, in the code comments are marked as optional <>. +If your data has a different structure or format you should implement your own importer (see Implementing your own importer example). +The other instructions are not optional and should follow the same order. +A SamplePath object is been created, passing an AbstractImporter object that contains the correct class members filled +with the data that are necessary to estimate the structure. +Next the build_trajectories and build_structure methods are called to instantiate the objects that will contain +the processed trajectories and all the net infos. +Then an estimator object is created, in this case a constraint based estimator, it necessary to pass a SamplePath object +where build_trajectories and build_structure methods have already been called. +If you have prior knowledge about the net structure pass it to the constructor with the known_edges parameter. +The other three parameters are contextual to the StructureConstraintBasedEstimator, see the documentation for more details. +To estimate the structure simply call the estimate_structure method. +You can obtain the estimated structure as a boolean adjacency matrix with the method adjacency_matrix, or save it as a json file +that contains all the nodes labels, and obviously the estimated edges. +You can also save a graphical model representation of the estimated structure with the save_plot_estimated_structure_graph. .. code-block:: python + import glob + import os + from PyCTBN import JsonImporter from PyCTBN import SamplePath - from PyCTBN import StructureEstimator - - def structure_estimation_example(): + from PyCTBN import StructureConstraintBasedEstimator + - # read the json files in ./data path + def structure_constraint_based_estimation_example(): + # read_files = glob.glob(os.path.join('./data', "*.json")) - # initialize a JsonImporter object for the first file - importer = JsonImporter(read_files[0], 'samples', 'dyn.str', 'variables', 'Time', 'Name') - # import the data at index 0 of the outer json array + # + importer = JsonImporter(file_path=read_files[0], samples_label='samples', + structure_label='dyn.str', variables_label='variables', + time_key='Time', variables_key='Name') + # importer.import_data(0) - # construct a SamplePath Object passing a filled AbstractImporter - s1 = SamplePath(importer) + # construct a SamplePath Object passing a filled AbstractImporter object + s1 = SamplePath(importer=importer) # build the trajectories s1.build_trajectories() - # build the real structure + # build the information about the net s1.build_structure() - # construct a StructureEstimator object - se1 = StructureEstimator(s1, 0.1, 0.1) - # call the ctpc algorithm - se1.ctpc_algorithm() - # the adjacency matrix of the estimated structure + # construct a StructureEstimator object passing a correctly build SamplePath object and the + # independence tests significance, if you have prior knowledge about the net structure create a list of tuples + # that contains them and pass it as known_edges parameter + se1 = StructureConstraintBasedEstimator(sample_path=s1, exp_test_alfa=0.1, chi_test_alfa=0.1, + known_edges=[], thumb_threshold=25) + # call the algorithm to estimate the structure + se1.estimate_structure() + # obtain the adjacency matrix of the estimated structure print(se1.adjacency_matrix()) - # save results to a json file - se1.save_results() + # save the estimated structure to a json file (remember to specify the path AND the .json extension).... + se1.save_results('./results0.json') + # ...or save it also in a graphical model fashion (remember to specify the path AND the .png extension) + se1.save_plot_estimated_structure_graph('./result0.png') \ No newline at end of file From aa93f1d405ffbaf0b235fa60ceb3cff0489b3b9e Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 23:23:28 +0000 Subject: [PATCH 094/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 3dc100e9ca4905909a8344a30c8824b166260fa1..8cc4c1348c3171a88300839aa7cbb05c6a7aeb98 100644 GIT binary patch delta 6260 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 delta 6090 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 VRu9lt-=pQLHBU;%vzcr=`xh{o;*S6T From 0da3dc20c6d255c816cf87e999721989b0fb838d Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sun, 21 Mar 2021 12:08:59 +0100 Subject: [PATCH 095/139] Update README.rst --- README.rst | 49 +++++++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/README.rst b/README.rst index 5655d54..9ddc4d2 100644 --- a/README.rst +++ b/README.rst @@ -94,23 +94,25 @@ Parameters Estimation Example Structure Estimation Examples **************************** -This example shows how to estimate the structure given a series of trajectories using a constraint based approach. -The first three instructions import all the necessary data (trajectories, nodes cardinalities, nodes labels), -and are contextual to the dataset that is been used, in the code comments are marked as optional <>. -If your data has a different structure or format you should implement your own importer (see Implementing your own importer example). -The other instructions are not optional and should follow the same order. -A SamplePath object is been created, passing an AbstractImporter object that contains the correct class members filled -with the data that are necessary to estimate the structure. -Next the build_trajectories and build_structure methods are called to instantiate the objects that will contain -the processed trajectories and all the net infos. -Then an estimator object is created, in this case a constraint based estimator, it necessary to pass a SamplePath object -where build_trajectories and build_structure methods have already been called. -If you have prior knowledge about the net structure pass it to the constructor with the known_edges parameter. -The other three parameters are contextual to the StructureConstraintBasedEstimator, see the documentation for more details. -To estimate the structure simply call the estimate_structure method. -You can obtain the estimated structure as a boolean adjacency matrix with the method adjacency_matrix, or save it as a json file -that contains all the nodes labels, and obviously the estimated edges. -You can also save a graphical model representation of the estimated structure with the save_plot_estimated_structure_graph. +| This example shows how to estimate the structure given a series of trajectories using a constraint based approach. +| The first three instructions import all the necessary data (trajectories, nodes cardinalities, nodes labels), +| and are contextual to the dataset that is been used, in the code comments are marked as optional <>. +| If your data has a different structure or format you should implement your own importer +| (see Implementing your own importer example). +| The other instructions are not optional and should follow the same order. +| A SamplePath object is been created, passing an AbstractImporter object that contains the correct class members +| filled with the data that are necessary to estimate the structure. +| Next the build_trajectories and build_structure methods are called to instantiate the objects that will contain +| the processed trajectories and all the net information. +| Then an estimator object is created, in this case a constraint based estimator, +| it necessary to pass a SamplePath object where build_trajectories and build_structure methods have already been called. +| If you have prior knowledge about the net structure pass it to the constructor with the known_edges parameter. +| The other three parameters are contextual to the StructureConstraintBasedEstimator, see the documentation for more details. +| To estimate the structure simply call the estimate_structure method. +| You can obtain the estimated structure as a boolean adjacency matrix with the method adjacency_matrix, +| or save it as a json file that contains all the nodes labels, and obviously the estimated edges. +| You can also save a graphical model representation of the estimated structure +| with the save_plot_estimated_structure_graph. .. code-block:: python @@ -137,8 +139,9 @@ You can also save a graphical model representation of the estimated structure wi s1.build_trajectories() # build the information about the net s1.build_structure() - # construct a StructureEstimator object passing a correctly build SamplePath object and the - # independence tests significance, if you have prior knowledge about the net structure create a list of tuples + # construct a StructureEstimator object passing a correctly build SamplePath object + # and the independence tests significance, if you have prior knowledge about + # the net structure create a list of tuples # that contains them and pass it as known_edges parameter se1 = StructureConstraintBasedEstimator(sample_path=s1, exp_test_alfa=0.1, chi_test_alfa=0.1, known_edges=[], thumb_threshold=25) @@ -146,7 +149,9 @@ You can also save a graphical model representation of the estimated structure wi se1.estimate_structure() # obtain the adjacency matrix of the estimated structure print(se1.adjacency_matrix()) - # save the estimated structure to a json file (remember to specify the path AND the .json extension).... + # save the estimated structure to a json file + # (remember to specify the path AND the .json extension).... se1.save_results('./results0.json') - # ...or save it also in a graphical model fashion (remember to specify the path AND the .png extension) - se1.save_plot_estimated_structure_graph('./result0.png') \ No newline at end of file + # ...or save it also in a graphical model fashion + # (remember to specify the path AND the .png extension) + se1.save_plot_estimated_structure_graph('./result0.png') From 3fbbc80881da8c1301165975143925f5a21abead Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sun, 21 Mar 2021 12:57:36 +0100 Subject: [PATCH 096/139] Add files via upload --- docs-out/esempio_dataset.png | Bin 0 -> 15144 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs-out/esempio_dataset.png diff --git a/docs-out/esempio_dataset.png b/docs-out/esempio_dataset.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4d336249b7cad0116d1b562b1287eec2120c50 GIT binary patch literal 15144 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 O6-iM!k=maILH{3>VQ7~C literal 0 HcmV?d00001 From 79dfd5d6ff8811697936f26eb2ca30a9ffa1ae93 Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sun, 21 Mar 2021 12:58:53 +0100 Subject: [PATCH 097/139] Update README.rst --- README.rst | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index 9ddc4d2..959cef0 100644 --- a/README.rst +++ b/README.rst @@ -15,11 +15,24 @@ Please refer to https://philipmartini.github.io/PyCTBN/ for the full project doc Implementing your own data importer *********************************** -.. code-block:: python +| This example demonstrates the implementation of a simple data importer the extends the class AbstractImporter +| to import data in csv format. The net in exam has three ternary nodes and no prior net structure. +| Suppose the trajectories that have to be inported have this structure: +.. image:: docs-out/esempio_dataset.png + :width: 400 + :alt: An example trajectory to be imported. +| In the read_csv_file method the data are imported in memory, put in a list and assigned to the _df_samples_list class +| member, so that it contains all the trajectories to be processed. +| In the import_variables method the dataframe containing the nodes labels and the cardinalities of the nodes +|is assigned to the _df_variables class member. +| The class member _sorter has to contain the nodes labels in the same order of the trajectory columns, +| just override the build_sorter method to do that. +| If your datasets names have particular id, you can keep it using the dataset_id method to assign the id to a new class member. +| Finally the import_data method call all the previously implemented methods and calls the compute_row_delta_in_all_samples_frames +| to process all the trajectories in _df_samples_list. +| For more information about the class memebers and methods of AbstractImporter please refer to the documentation. - """This example demonstrates the implementation of a simple data importer the extends the class abstract importer to import data in csv format. - The net in exam has three ternary nodes and no prior net structure. - """ +.. code-block:: python from PyCTBN import AbstractImporter @@ -53,6 +66,18 @@ Implementing your own data importer def dataset_id(self) -> object: pass + def main(): + # create the importer object + csvimp = CSVImporter('/dataset_example.csv') + # call the wrapping method that wil import and process the data + csvimp.import_data() + # pass the AbstractImporter object to the SamplePath constructor + s1 = SamplePath(csvimp) + # SamplePath will contain the Trajecotry object... + s1.build_trajectories() + #...and the Structure object with all the process data + s1.build_structure() + Parameters Estimation Example ***************************** From da3e943dfb7e9f676e276e2af5297b2bbabca868 Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sun, 21 Mar 2021 13:02:37 +0100 Subject: [PATCH 098/139] Update README.rst --- README.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 959cef0..02ccd6e 100644 --- a/README.rst +++ b/README.rst @@ -19,7 +19,7 @@ Implementing your own data importer | to import data in csv format. The net in exam has three ternary nodes and no prior net structure. | Suppose the trajectories that have to be inported have this structure: .. image:: docs-out/esempio_dataset.png - :width: 400 + :width: 600 :alt: An example trajectory to be imported. | In the read_csv_file method the data are imported in memory, put in a list and assigned to the _df_samples_list class | member, so that it contains all the trajectories to be processed. @@ -34,7 +34,11 @@ Implementing your own data importer .. code-block:: python + import pandas as pd + import typing + from PyCTBN import AbstractImporter + from PyCTBN import SamplePath class CSVImporter(AbstractImporter): From a179dd3498b53a24804fb09d961466dd5303a89d Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sun, 21 Mar 2021 13:03:57 +0100 Subject: [PATCH 099/139] Update README.rst --- README.rst | 41 ++--------------------------------------- 1 file changed, 2 insertions(+), 39 deletions(-) diff --git a/README.rst b/README.rst index 02ccd6e..df54db8 100644 --- a/README.rst +++ b/README.rst @@ -18,9 +18,11 @@ Implementing your own data importer | This example demonstrates the implementation of a simple data importer the extends the class AbstractImporter | to import data in csv format. The net in exam has three ternary nodes and no prior net structure. | Suppose the trajectories that have to be inported have this structure: + .. image:: docs-out/esempio_dataset.png :width: 600 :alt: An example trajectory to be imported. + | In the read_csv_file method the data are imported in memory, put in a list and assigned to the _df_samples_list class | member, so that it contains all the trajectories to be processed. | In the import_variables method the dataframe containing the nodes labels and the cardinalities of the nodes @@ -82,45 +84,6 @@ Implementing your own data importer #...and the Structure object with all the process data s1.build_structure() -Parameters Estimation Example -***************************** - -.. code-block:: python - - from PyCTBN import JsonImporter - from PyCTBN import SamplePath - from PyCTBN import NetworkGraph - from PyCTBN import ParametersEstimator - - - def main(): - read_files = glob.glob(os.path.join('./data', "*.json")) #Take all json files in this dir - #import data - importer = JsonImporter(read_files[0], 'samples', 'dyn.str', 'variables', 'Time', 'Name') - importer.import_data(0) - #Create a SamplePath Obj passing an already filled AbstractImporter object - s1 = SamplePath(importer) - #Build The trajectries and the structural infos - s1.build_trajectories() - s1.build_structure() - print(s1.structure.edges) - print(s1.structure.nodes_values) - #From The Structure Object build the Graph - g = NetworkGraph(s1.structure) - #Select a node you want to estimate the parameters - node = g.nodes[2] - print("Node", node) - #Init the _graph specifically for THIS node - g.fast_init(node) - #Use SamplePath and Grpah to create a ParametersEstimator Object - p1 = ParametersEstimator(s1.trajectories, g) - #Init the peEst specifically for THIS node - p1.fast_init(node) - #Compute the parameters - sofc1 = p1.compute_parameters_for_node(node) - #The est CIMS are inside the resultant SetOfCIms Obj - print(sofc1.actual_cims) - Structure Estimation Examples **************************** | This example shows how to estimate the structure given a series of trajectories using a constraint based approach. From e173978bf42707c90cd23709b934a98aef8d4f44 Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sun, 21 Mar 2021 13:05:59 +0100 Subject: [PATCH 100/139] Update README.rst --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index df54db8..a7c5573 100644 --- a/README.rst +++ b/README.rst @@ -26,7 +26,7 @@ Implementing your own data importer | In the read_csv_file method the data are imported in memory, put in a list and assigned to the _df_samples_list class | member, so that it contains all the trajectories to be processed. | In the import_variables method the dataframe containing the nodes labels and the cardinalities of the nodes -|is assigned to the _df_variables class member. +| is assigned to the _df_variables class member. | The class member _sorter has to contain the nodes labels in the same order of the trajectory columns, | just override the build_sorter method to do that. | If your datasets names have particular id, you can keep it using the dataset_id method to assign the id to a new class member. From 02dc6abd275381e2bd0029b63f68c552b07cd4c2 Mon Sep 17 00:00:00 2001 From: Luca Moretti Date: Sun, 28 Mar 2021 17:37:38 +0200 Subject: [PATCH 101/139] Updated examples file --- README.rst | 178 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) diff --git a/README.rst b/README.rst index a7c5573..f9fcb54 100644 --- a/README.rst +++ b/README.rst @@ -84,7 +84,14 @@ Implementing your own data importer #...and the Structure object with all the process data s1.build_structure() + Structure Estimation Examples +############################## + +| In this section some examples will be shown in order to provide some useful information about the usage of the library + + +Constraint based estimation **************************** | This example shows how to estimate the structure given a series of trajectories using a constraint based approach. | The first three instructions import all the necessary data (trajectories, nodes cardinalities, nodes labels), @@ -147,3 +154,174 @@ Structure Estimation Examples # ...or save it also in a graphical model fashion # (remember to specify the path AND the .png extension) se1.save_plot_estimated_structure_graph('./result0.png') + + + +Score based estimation with Hill Climbing +***************************************** + +| This example shows how to estimate the structure given a series of trajectories using a score based approach +| and the Hill Climbing algorithm as optimization strategy. +| The structure of the code is the same as the previus example, but an explanation of the Structure score based estimator +| will be provided. +| Then an estimator object is created, in this case a score based estimator, +| it necessary to pass a SamplePath object where build_trajectories and build_structure methods have already been called. +| If you have prior knowledge about the net structure pass it to the constructor with the known_edges parameter. +| The other parameters are contextual to the StructureScoreBasedEstimator, see the documentation for more details. +| To estimate the structure simply call the estimate_structure method passing the desidered parameters, such as the +| optimization strategy, or simply use the default configuration. +| In this case an Hill Climbing approch is choosen. + +.. code-block:: python + + import glob + import os + + from PyCTBN import JsonImporter + from PyCTBN import SamplePath + from PyCTBN import StructureScoreBasedEstimator + + + def structure_constraint_based_estimation_example(): + # + read_files = glob.glob(os.path.join('./data', "*.json")) + # + importer = JsonImporter(file_path=read_files[0], samples_label='samples', + structure_label='dyn.str', variables_label='variables', + time_key='Time', variables_key='Name') + # + importer.import_data(0) + # construct a SamplePath Object passing a filled AbstractImporter object + s1 = SamplePath(importer=importer) + # build the trajectories + s1.build_trajectories() + # build the information about the net + s1.build_structure() + # construct a StructureEstimator object passing a correctly build SamplePath object + # and hyperparameters tau and alpha, if you have prior knowledge about + # the net structure create a list of tuples + # that contains them and pass it as known_edges parameter + se1 = StructureScoreBasedEstimator(sample_path=s1, tau_xu = 0.1, alpha_xu = 1, + known_edges=[]) + # call the algorithm to estimate the structure + # and pass all the desidered parameters, in this case an Hill Climbing approach + # will be selected as optimization strategy. + se1.estimate_structure( + max_parents = None, + iterations_number = 40, + patience = None, + optimizer = 'hill' + ) + # obtain the adjacency matrix of the estimated structure + print(se1.adjacency_matrix()) + # save the estimated structure to a json file + # (remember to specify the path AND the .json extension).... + se1.save_results('./results0.json') + # ...or save it also in a graphical model fashion + # (remember to specify the path AND the .png extension) + se1.save_plot_estimated_structure_graph('./result0.png') + + +Score based estimation with Tabu Search and Data Augmentation +************************************************************** + +| This example shows how to estimate the structure given a series of trajectories using a score based approach +| and the Tabu Search algorithm as optimization strategy and how to use a data augmentation strategy to increase the +| number of data available. +| The structure of the code is the same as the previus example, but an explanation of the data augmentation technique +| will be provided. +| In this case a SampleImporter is used to import the data instead of a JsonImporter. +| Using a SampleImporter requires the user to read the data and put it into different lists or DataFrames before to +| inizialize the SampleImporter instance. +| Then it is possible to increase the amount of data by using one of the external libraries who provide data augmentation +| approaches, in this example sklearn is used. +| Then all the information can be passed to the SampleImporter constructor and the import_data method can be used to provide +| the preprossing operations of the PyCTBN library. +| Then an estimator object is created, in this case a score based estimator, +| it necessary to pass a SamplePath object where build_trajectories and build_structure methods have already been called. +| If you have prior knowledge about the net structure pass it to the constructor with the known_edges parameter. +| The other parameters are contextual to the StructureScoreBasedEstimator, see the documentation for more details. +| To estimate the structure simply call the estimate_structure method passing the desidered parameters, such as the +| optimization strategy, or simply use the default configuration. +| In this case an Hill Climbing approch is choosen. + + +.. code-block:: python + + import glob + import os + + from sklearn.utils import resample + + from PyCTBN import SampleImporter + from PyCTBN import SamplePath + from PyCTBN import StructureScoreBasedEstimator + + + def structure_constraint_based_estimation_example(): + # + read_files = glob.glob(os.path.join('./data', "*.json")) + + # read the first file in the directory (or pass the file path) + with open(file_path=read_files[0]) as f: + raw_data = json.load(f) + + # read the variables information + variables= pd.DataFrame(raw_data[0]["variables"]) + + # read the prior information if they are given + prior_net_structure = pd.DataFrame(raw_data[0]["dyn.str"]) + + #read the samples + trajectory_list_raw= raw_data[0]["samples"] + + #convert them in DataFrame + trajectory_list = [pd.DataFrame(sample) for sample in trajectory_list_raw] + + # use an external library in order to provide the data augmentation operations, in this case + # sklearn.utils is used + augmented_trajectory_list = resample (trajectory_list, replace = True, n_samples = 300 ) + + + # + importer = SampleImporter( + trajectory_list = augmented_trajectory_list, + variables=variables, + prior_net_structure=prior_net_structure + ) + + # + importer.import_data() + # construct a SamplePath Object passing a filled AbstractImporter object + + s1 = SamplePath(importer=importer) + # build the trajectories + s1.build_trajectories() + # build the information about the net + s1.build_structure() + # construct a StructureEstimator object passing a correctly build SamplePath object + # and hyperparameters tau and alpha, if you have prior knowledge about + # the net structure create a list of tuples + # that contains them and pass it as known_edges parameter + se1 = StructureScoreBasedEstimator(sample_path=s1, tau_xu = 0.1, alpha_xu = 1, + known_edges=[]) + # call the algorithm to estimate the structure + # and pass all the desidered parameters, in this case a Tabu Search approach + # will be selected as optimization strategy. It is possible to select the tabu list length and + # the tabu rules duration, and the other parameters as in the previus example. + se1.estimate_structure( + max_parents = None, + iterations_number = 100, + patience = 20, + optimizer = 'tabu', + tabu_length = 10, + tabu_rules_duration = 10 + ) + # obtain the adjacency matrix of the estimated structure + print(se1.adjacency_matrix()) + # save the estimated structure to a json file + # (remember to specify the path AND the .json extension).... + se1.save_results('./results0.json') + # ...or save it also in a graphical model fashion + # (remember to specify the path AND the .png extension) + se1.save_plot_estimated_structure_graph('./result0.png') \ No newline at end of file From c0b45e4631de816e979fa8709cbfd7c948ff7330 Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sun, 28 Mar 2021 18:07:09 +0200 Subject: [PATCH 102/139] Create codecov.yml --- codecov.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 codecov.yml diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/codecov.yml @@ -0,0 +1 @@ + From fa0c33642155103c9955795053ec479bc8da380e Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 28 Mar 2021 18:07:42 +0200 Subject: [PATCH 103/139] Update python-PyCTBN-package.yml --- .github/workflows/python-PyCTBN-package.yml | 23 +++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/.github/workflows/python-PyCTBN-package.yml b/.github/workflows/python-PyCTBN-package.yml index 08fb056..857ddea 100644 --- a/.github/workflows/python-PyCTBN-package.yml +++ b/.github/workflows/python-PyCTBN-package.yml @@ -41,3 +41,26 @@ jobs: - name: Test with pytest run: | pytest PyCTBN/tests/ + - name: Generate coverage report + run: | + pip install pytest + pip install pytest-cov + pytest --cov=./PyCTBN/tests/ --cov-report=xml + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + files: ./coverage1.xml,./coverage2.xml + directory: ./coverage/reports/ + flags: unittests + env_vars: OS,PYTHON + name: codecov-umbrella + fail_ci_if_error: true + path_to_write_report: ./coverage/codecov_report.txt + verbose: true + + + + + + From 24844be838e752b1f09452e1ae0025d99e47aff0 Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 28 Mar 2021 18:08:55 +0200 Subject: [PATCH 104/139] Update test_tabu_search.py --- PyCTBN/tests/optimizers/test_tabu_search.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PyCTBN/tests/optimizers/test_tabu_search.py b/PyCTBN/tests/optimizers/test_tabu_search.py index 54f6a2f..301a52c 100644 --- a/PyCTBN/tests/optimizers/test_tabu_search.py +++ b/PyCTBN/tests/optimizers/test_tabu_search.py @@ -75,7 +75,8 @@ class TestTabuSearch(unittest.TestCase): def test_structure_3(self): with open("./PyCTBN/test_data/networks_and_trajectories_ternary_data_01_6_1.json") as f: raw_data = json.load(f) - + + # read the samples trajectory_list_raw= raw_data["samples"] trajectory_list = [pd.DataFrame(sample) for sample in trajectory_list_raw] From 6d3412460fa59bd6a5f90809992fae16a0dd726c Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 28 Mar 2021 16:28:03 +0000 Subject: [PATCH 105/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 8cc4c1348c3171a88300839aa7cbb05c6a7aeb98..95f49796d8b93838ef415e4e9e16d0854b848e5b 100644 GIT binary patch delta 7403 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 R#>M5Drh?tCjb^X1{{`fTvReQE From 3fa1a546ccf30a9bf16820a9928eb1daf2e5174a Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 28 Mar 2021 19:02:18 +0200 Subject: [PATCH 106/139] Update python-PyCTBN-package.yml --- .github/workflows/python-PyCTBN-package.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/python-PyCTBN-package.yml b/.github/workflows/python-PyCTBN-package.yml index 857ddea..cdecbc9 100644 --- a/.github/workflows/python-PyCTBN-package.yml +++ b/.github/workflows/python-PyCTBN-package.yml @@ -45,18 +45,15 @@ jobs: run: | pip install pytest pip install pytest-cov - pytest --cov=./PyCTBN/tests/ --cov-report=xml + pytest PyCTBN/tests/ --cov='./' --cov-report=xml - name: Upload coverage to Codecov uses: codecov/codecov-action@v1 with: - token: ${{ secrets.GITHUB_TOKEN }} - files: ./coverage1.xml,./coverage2.xml - directory: ./coverage/reports/ + files: ./coverage.xml flags: unittests env_vars: OS,PYTHON name: codecov-umbrella fail_ci_if_error: true - path_to_write_report: ./coverage/codecov_report.txt verbose: true From 1f7c0d5e594222ad0dbf6c31e74d4e368e272840 Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 28 Mar 2021 19:02:45 +0200 Subject: [PATCH 107/139] Update python-PyCTBN-package.yml --- .github/workflows/python-PyCTBN-package.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/python-PyCTBN-package.yml b/.github/workflows/python-PyCTBN-package.yml index cdecbc9..4d624d0 100644 --- a/.github/workflows/python-PyCTBN-package.yml +++ b/.github/workflows/python-PyCTBN-package.yml @@ -38,9 +38,6 @@ jobs: flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - - name: Test with pytest - run: | - pytest PyCTBN/tests/ - name: Generate coverage report run: | pip install pytest From 8ed694fb280cce12daf3df5e4a79bc367f25b3d1 Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 28 Mar 2021 19:04:18 +0200 Subject: [PATCH 108/139] Update test_sample_importer.py --- PyCTBN/tests/utility/test_sample_importer.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PyCTBN/tests/utility/test_sample_importer.py b/PyCTBN/tests/utility/test_sample_importer.py index aa9a5a7..8e96778 100644 --- a/PyCTBN/tests/utility/test_sample_importer.py +++ b/PyCTBN/tests/utility/test_sample_importer.py @@ -17,9 +17,10 @@ class TestSampleImporter(unittest.TestCase): def setUpClass(cls) -> None: with open("./PyCTBN/test_data/networks_and_trajectories_binary_data_01_3.json") as f: raw_data = json.load(f) - + + #read the samples trajectory_list_raw= raw_data[0]["samples"] - + cls.trajectory_list = [pd.DataFrame(sample) for sample in trajectory_list_raw] cls.variables= pd.DataFrame(raw_data[0]["variables"]) From f8938e1aaee11e231b1fe0eed50630a0e8ac1246 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 28 Mar 2021 17:15:05 +0000 Subject: [PATCH 109/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 95f49796d8b93838ef415e4e9e16d0854b848e5b..6b5ebe3d9c8cf98b6f64fd58350d1513406081bf 100644 GIT binary patch delta 7426 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 delta 7438 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 a`2Ok(X~hs}#ULrJ*DRH^JeSO#V*dl+JHi?O From 36f135b35a69eec2fc7a98f737d6f337b9068c14 Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sun, 28 Mar 2021 19:36:36 +0200 Subject: [PATCH 110/139] Update README.rst --- README.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index f9fcb54..422aed7 100644 --- a/README.rst +++ b/README.rst @@ -8,6 +8,10 @@ Installation/Usage Download the release in .tar.gz or .whl format and simply use pip install to install it:: $ pip install PyCTBN-1.0.tar.gz + +Coverage +******** +Please refer to https://app.codecov.io/gh/philipMartini/PyCTBN for a detailed report of test coverage. Documentation ************* @@ -324,4 +328,4 @@ Score based estimation with Tabu Search and Data Augmentation se1.save_results('./results0.json') # ...or save it also in a graphical model fashion # (remember to specify the path AND the .png extension) - se1.save_plot_estimated_structure_graph('./result0.png') \ No newline at end of file + se1.save_plot_estimated_structure_graph('./result0.png') From 0088b449ce6c3db7262fbd0c70be91eba607c37e Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 28 Mar 2021 19:39:34 +0200 Subject: [PATCH 111/139] Update test_hill_climbing_search.py --- PyCTBN/tests/optimizers/test_hill_climbing_search.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PyCTBN/tests/optimizers/test_hill_climbing_search.py b/PyCTBN/tests/optimizers/test_hill_climbing_search.py index 1ca8f8c..84fa023 100644 --- a/PyCTBN/tests/optimizers/test_hill_climbing_search.py +++ b/PyCTBN/tests/optimizers/test_hill_climbing_search.py @@ -54,9 +54,9 @@ class TestHillClimbingSearch(unittest.TestCase): def test_structure_3(self): with open("./PyCTBN/test_data/networks_and_trajectories_ternary_data_01_6_1.json") as f: raw_data = json.load(f) - + trajectory_list_raw= raw_data["samples"] - + # Convert to DataFrame trajectory_list = [pd.DataFrame(sample) for sample in trajectory_list_raw] variables= raw_data["variables"] From 63f403a03cd84d0a5cb2379af7cabfdc03e3e7c3 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 28 Mar 2021 17:50:55 +0000 Subject: [PATCH 112/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 6b5ebe3d9c8cf98b6f64fd58350d1513406081bf..2e9ad9eb2634c25ad905628966f6b0487488da18 100644 GIT binary patch delta 7302 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 Date: Tue, 27 Apr 2021 21:13:49 +0200 Subject: [PATCH 113/139] Added Processes number parameter --- .../structure_constraint_based_estimator.py | 27 +++++++++++++++---- .../structure_score_based_estimator.py | 7 ++++- ...st_structure_constraint_based_estimator.py | 2 +- .../test_structure_score_based_estimator.py | 4 ++- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py b/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py index 0013d80..2fa255e 100644 --- a/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py +++ b/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py @@ -199,8 +199,14 @@ class StructureConstraintBasedEstimator(StructureEstimator): return optimizer_obj.optimize_structure() - def ctpc_algorithm(self,disable_multiprocessing:bool= False ): + def ctpc_algorithm(self, disable_multiprocessing:bool= False, processes_number:int= None): """Compute the CTPC algorithm over the entire net. + + :param disable_multiprocessing: true if you desire to disable the multiprocessing operations, default to False + :type disable_multiprocessing: Boolean, optional + :param processes_number: if disable_multiprocessing is false indicates + the maximum number of process; if None it will be automatically set, default to None + :type processes_number: int, optional """ ctpc_algo = self.one_iteration_of_CTPC_algorithm total_vars_numb = self._sample_path.total_variables_count @@ -212,8 +218,6 @@ class StructureConstraintBasedEstimator(StructureEstimator): 'get the number of CPU' cpu_count = multiprocessing.cpu_count() - - 'Remove all the edges from the structure' self._sample_path.structure.clean_structure_edges() @@ -225,6 +229,9 @@ class StructureConstraintBasedEstimator(StructureEstimator): cpu_count = 1 list_edges_partial = [ctpc_algo(n,total_vars_numb) for n in self._nodes] else: + if processes_number is not None and cpu_count < processes_number: + cpu_count = processes_number + with concurrent.futures.ProcessPoolExecutor(max_workers=cpu_count) as executor: list_edges_partial = executor.map(ctpc_algo, self._nodes, @@ -238,8 +245,18 @@ class StructureConstraintBasedEstimator(StructureEstimator): return edges - def estimate_structure(self,disable_multiprocessing:bool=False): - return self.ctpc_algorithm(disable_multiprocessing=disable_multiprocessing) + def estimate_structure(self, disable_multiprocessing:bool=False, processes_number:int= None): + """ + Compute the constraint-based algorithm to find the optimal structure + + :param disable_multiprocessing: true if you desire to disable the multiprocessing operations, default to False + :type disable_multiprocessing: Boolean, optional + :param processes_number: if disable_multiprocessing is false indicates + the maximum number of process; if None it will be automatically set, default to None + :type processes_number: int, optional + """ + return self.ctpc_algorithm(disable_multiprocessing=disable_multiprocessing, + processes_number=processes_number) diff --git a/PyCTBN/PyCTBN/estimators/structure_score_based_estimator.py b/PyCTBN/PyCTBN/estimators/structure_score_based_estimator.py index 12222f9..5763739 100644 --- a/PyCTBN/PyCTBN/estimators/structure_score_based_estimator.py +++ b/PyCTBN/PyCTBN/estimators/structure_score_based_estimator.py @@ -54,7 +54,7 @@ class StructureScoreBasedEstimator(StructureEstimator): def estimate_structure(self, max_parents:int = None, iterations_number:int= 40, patience:int = None, tabu_length:int = None, tabu_rules_duration:int = None, - optimizer: str = 'tabu',disable_multiprocessing:bool= False ): + optimizer: str = 'tabu', disable_multiprocessing:bool= False, processes_number:int= None): """ Compute the score-based algorithm to find the optimal structure @@ -72,6 +72,9 @@ class StructureScoreBasedEstimator(StructureEstimator): :type optimizer: string, optional :param disable_multiprocessing: true if you desire to disable the multiprocessing operations, default to False :type disable_multiprocessing: Boolean, optional + :param processes_number: if disable_multiprocessing is false indicates + the maximum number of process; if None it will be automatically set, default to None + :type processes_number: int, optional """ 'Save the true edges structure in tuples' true_edges = copy.deepcopy(self._sample_path.structure.edges) @@ -98,6 +101,8 @@ class StructureScoreBasedEstimator(StructureEstimator): if disable_multiprocessing: cpu_count = 1 + elif processes_number is not None and cpu_count < processes_number: + cpu_count = processes_number diff --git a/PyCTBN/tests/estimators/test_structure_constraint_based_estimator.py b/PyCTBN/tests/estimators/test_structure_constraint_based_estimator.py index b69d445..3e9d2b0 100644 --- a/PyCTBN/tests/estimators/test_structure_constraint_based_estimator.py +++ b/PyCTBN/tests/estimators/test_structure_constraint_based_estimator.py @@ -54,7 +54,7 @@ class TestStructureConstraintBasedEstimator(unittest.TestCase): true_edges = set(map(tuple, true_edges)) se1 = StructureConstraintBasedEstimator(self.s1,0.1,0.1) - edges = se1.estimate_structure(True) + edges = se1.estimate_structure(processes_number=2) self.assertFalse(se1.spurious_edges()) self.assertEqual(edges, true_edges) diff --git a/PyCTBN/tests/estimators/test_structure_score_based_estimator.py b/PyCTBN/tests/estimators/test_structure_score_based_estimator.py index 8cbbcb5..407201e 100644 --- a/PyCTBN/tests/estimators/test_structure_score_based_estimator.py +++ b/PyCTBN/tests/estimators/test_structure_score_based_estimator.py @@ -111,7 +111,8 @@ class TestStructureScoreBasedEstimator(unittest.TestCase): tabu_length = 15, tabu_rules_duration = 15, optimizer = 'hill', - disable_multiprocessing=False + disable_multiprocessing=False, + processes_number=2 ) @@ -240,6 +241,7 @@ class TestStructureScoreBasedEstimator(unittest.TestCase): self.assertGreaterEqual(recall,0.75) + if __name__ == '__main__': unittest.main() From 0a94eb19451ba60153d775d224578fa85a5cbb98 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Tue, 27 Apr 2021 19:24:39 +0000 Subject: [PATCH 114/139] Update documentation --- .../_build/doctrees/PyCTBN.PyCTBN.doctree | Bin 3658 -> 3707 bytes .../doctrees/PyCTBN.PyCTBN.estimators.doctree | Bin 252930 -> 272060 bytes .../doctrees/PyCTBN.PyCTBN.optimizers.doctree | Bin 58866 -> 60965 bytes .../PyCTBN.PyCTBN.structure_graph.doctree | Bin 196000 -> 201462 bytes .../doctrees/PyCTBN.PyCTBN.utility.doctree | Bin 151908 -> 157217 bytes docs-out/_build/doctrees/PyCTBN.doctree | Bin 3685 -> 3734 bytes docs-out/_build/doctrees/PyCTBN.tests.doctree | Bin 3642 -> 3691 bytes .../doctrees/PyCTBN.tests.estimators.doctree | Bin 51696 -> 51965 bytes .../doctrees/PyCTBN.tests.optimizers.doctree | Bin 18388 -> 18517 bytes .../PyCTBN.tests.structure_graph.doctree | Bin 95711 -> 96380 bytes .../doctrees/PyCTBN.tests.utility.doctree | Bin 45421 -> 45630 bytes docs-out/_build/doctrees/basic_main.doctree | Bin 2324 -> 2373 bytes docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes docs-out/_build/doctrees/examples.doctree | Bin 11353 -> 11402 bytes docs-out/_build/doctrees/index.doctree | Bin 4864 -> 4946 bytes docs-out/_build/doctrees/modules.doctree | Bin 2608 -> 2657 bytes docs-out/_build/doctrees/setup.doctree | Bin 2278 -> 2327 bytes docs-out/_build/html/.buildinfo | 2 +- .../_build/html/PyCTBN.PyCTBN.estimators.html | 67 +++++++++++------- docs-out/_build/html/PyCTBN.PyCTBN.html | 14 ++-- .../_build/html/PyCTBN.PyCTBN.optimizers.html | 30 ++++---- .../html/PyCTBN.PyCTBN.structure_graph.html | 38 +++++----- .../_build/html/PyCTBN.PyCTBN.utility.html | 30 ++++---- docs-out/_build/html/PyCTBN.html | 18 ++--- .../_build/html/PyCTBN.tests.estimators.html | 30 ++++---- docs-out/_build/html/PyCTBN.tests.html | 14 ++-- .../_build/html/PyCTBN.tests.optimizers.html | 22 +++--- .../html/PyCTBN.tests.structure_graph.html | 38 +++++----- .../_build/html/PyCTBN.tests.utility.html | 26 +++---- docs-out/_build/html/basic_main.html | 6 +- docs-out/_build/html/examples.html | 22 +++--- docs-out/_build/html/genindex.html | 2 +- docs-out/_build/html/index.html | 12 ++-- docs-out/_build/html/modules.html | 6 +- docs-out/_build/html/py-modindex.html | 2 +- docs-out/_build/html/search.html | 2 +- docs-out/_build/html/searchindex.js | 2 +- docs-out/_build/html/setup.html | 6 +- docs/PyCTBN.PyCTBN.estimators.html | 67 +++++++++++------- docs/PyCTBN.PyCTBN.html | 14 ++-- docs/PyCTBN.PyCTBN.optimizers.html | 30 ++++---- docs/PyCTBN.PyCTBN.structure_graph.html | 38 +++++----- docs/PyCTBN.PyCTBN.utility.html | 30 ++++---- docs/PyCTBN.html | 18 ++--- docs/PyCTBN.tests.estimators.html | 30 ++++---- docs/PyCTBN.tests.html | 14 ++-- docs/PyCTBN.tests.optimizers.html | 22 +++--- docs/PyCTBN.tests.structure_graph.html | 38 +++++----- docs/PyCTBN.tests.utility.html | 26 +++---- docs/basic_main.html | 6 +- docs/examples.html | 22 +++--- docs/genindex.html | 2 +- docs/index.html | 12 ++-- docs/modules.html | 6 +- docs/py-modindex.html | 2 +- docs/search.html | 2 +- docs/searchindex.js | 2 +- docs/setup.html | 6 +- 58 files changed, 403 insertions(+), 373 deletions(-) diff --git a/docs-out/_build/doctrees/PyCTBN.PyCTBN.doctree b/docs-out/_build/doctrees/PyCTBN.PyCTBN.doctree index 02326e41491a48bf71cfa46bb26db278d1de3332..6ba6774aa70997147fde2dd43a18d0553b2717d1 100644 GIT binary patch delta 936 zcmb7?O=}ZT6ozw?OkzH2+J)ITi3wHOnzWP_#8prPH^BkFP>~QOlS|I%e3_Xm?Lwl^ zg^Rl>_X>e-3SBB#$im;Cf1oJ1@@Kg5jLD=)aO2`K%$+mudC&8nZ|ZL~`BwSh9VUO~ zd8XZU4Q5j(kcYosDJmqOB%YB5DT^U#Hg@1LY{TDM4ayqp=y2tYT!(5)!YZC?c-HW2 zv?PNX6tH}ATn=?8i)y@4{CB-z@z3e|@DLuu6H&vaHMj$%@TX=PMQ+V^5~qpcV4+uI zz889ytxF`~YS(}<*UyHJAzbTN_TkHm9Q5rJ}} zS8kG74(lLz!FIdMqML^61gPOl8fizLD$`GT)GiEj5eXWP2#b}JI+*0oFM0b$&~diL zkIDo)QeVKEn1K+V&v$;4c*=KK-=Grep%20@8m!+(@9oLG#`6XneM+4X@^y4@VTX{q z_>x%_r`hYp70YyJ+oDb{fVO4YW+3k^uZi!Ov(b<2U2^jTj==*Pj$p`m#?fsW?0bkc z4EjU^PlF?kK{b3m#*MIXpN9xqh^KjVd%DYFx>M1Vn5d7W<$JXJB2Qv5D4pk$!Cc09 kjS@?{d123>d5C8xG delta 780 zcmew@b4rG#fpx0=M3%cu8H^L(7P2#DFlWg0SWS*&RhZn$D8nr4%{1ALMQ-vTMr}L8 z4CxI046q8n3|YU@q{Ixl+9?_t3b9i%lz>||{w zJ2C9)C)YErXAj5-$_U8_n{3LQQLmNZlpzDsiP+_62}#idCFiOJcC>8Zs)tx&fkgcTs-NPgi08png=7aNvfyK==BJeAr0OQ;=ar=9 zl@w1&g?MK2eO56w+|KtFKo~SxnoWik90HSV*ks($G%+I_?9GH84ai~M!&aPMT9lkR zB|{q+_nYUjy=P=RvAK`Kh>=ly@FgL648Z(M;rKBe37bTWt=I2fE1NpEtNe=); CuLR!! diff --git a/docs-out/_build/doctrees/PyCTBN.PyCTBN.estimators.doctree b/docs-out/_build/doctrees/PyCTBN.PyCTBN.estimators.doctree index 7524a26f25624b179527a2c99cacee51d8ce0e81..3d2f9915cec65a4f8baaef5172f7bcad9bac1b79 100644 GIT binary patch literal 272060 zcmeEv37p+kb$cl^L}?f z=X>rw_ndR@y?N;?7cE-62>+KI*qW`?XLgQOCMISY6V=vywql|&-kGk>wCC@bU;D@N zH_i`dE1Q)atwyIgUY*YtL5}fSeQKgvoteLOK05%jx9d}_QC@y|t2*AUH)dq<+S1yx z+VX4XhifadrR{oqs;VSq$)$4}H=nabw0wd>QBcB9!!W-H^@Rkl^m26DoP%FH1RD`Ps<2b9st%Jem3 zt?@>)dd=8)Woo=Lg#bzz0mS%&#TT*SiyXxzt+HSZp$-hzo?ec`=P4v!0gPUhEv?T? zRCg+J!$iusXjha~OyB`rOJLp~x3Dz~DFf7K3aVBZLr4@ly&KkbJQA;y8)PR_>gh z+R%cf0;s-Xwpndeo7<~2SG^EwxtZ0n2cQn7ULf0kjBKzL^ZeQnQslzL(3R(6?-gc`H)h(Z zvL#k?)RtC)?o!#-tjyL_EUY=F0-DH%WCOLgVM}9c3L4iIE_-XTO9$$g3|D&pI2n8c&9P}R+gZb<*-+Va_nk?p-uGDAdYv0V4!>{(- zEKD7ociAfVQr$T_RUfan=WnG9J1Wf?_;V#JHA18K5O$PNXTEkXRobpJw^iHonIHhN z{R^P+?Fs80f}*okkqU?A_X&XTuQ`N2$|3wou}Egmcv_{Ev}@I*U1?p1>#$J6a9PIh zLf$d0lHg7u**ceWaJ_`z=TzpZt$Jl9Atf%E?98wo1P9du)h@*&-4`}PwZU{T{zHm- zj4lim*;BYH7}k|mQ|n~U2565>3f*vcZ8GeWF!ypKxS#7;$#k_{YfON0v#HmrMzzkt z^sB0!H1gUIS9NX>fMr_UaP21XA-mS@qh9gwczqfs-I>nx?A&Oj*{sa11GIO>c6K%- zlT(dKJ2@jcVf4gxNo8ubR?$A6DDVyQqtkj|3tusXnk(B->p#e&ClA+U#2y`CR>~sbz;ZV$um70K1jT;Qsjnp>x&|d$s(X%%cFNVH7eJ22$fXo z3eR*3xyaWZ&{k@#xxn(yR`S7g68d23AL+&LG0ZCevdYCY-GGA|Oi!iy)6?J|L7MCk z#|*>pr;~RX%O@Bve(FTL9oz9PZ^5D5#`<=-+P46{UKeiZIgo4-jRTCe1Zc1ThAC?I zbqXw{IoJm+o~qO1okoRmph|Z_v0QUBK*bx1fYUpmno@8IQ-

    RrnYX?1328_o7uYr4{GU*BnL*EcsAw>qFGKS5 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 literal 252930 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

    e+qt|pHNwQXQhsh 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 literal 58866 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 ULw#nG-1ZhaZoaK59b$$ET^y23u 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 diff --git a/docs-out/_build/doctrees/PyCTBN.PyCTBN.utility.doctree b/docs-out/_build/doctrees/PyCTBN.PyCTBN.utility.doctree index a895732eb322969feb1f1757cdde2aedb703347b..164c20f82f74c24f9edb6da4a7d5ac0a8e140569 100644 GIT binary patch literal 157217 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 a@&T1!XMJ9yJ~OjCT0vJ+cx7BKP5pl$y;(*8 diff --git a/docs-out/_build/doctrees/PyCTBN.doctree b/docs-out/_build/doctrees/PyCTBN.doctree index e2888030d6b8466c91c3183b83350d85fae31cd2..dc97e78ef3ffd9fcc69cd1f6f81fac222ca4717c 100644 GIT binary patch delta 1012 zcmb7@&ubGw6vsQ8Y-*B?sRwg0*`!2iHA#{7o)!usE-r}Y5I374Z)5g{n_Z-$BvKHi zgHUGFt0=@np$8ZGXXvST@#@*59-Ww&?1p;iVJ>gpkI(zQ_kQHx7UDzk&B0;(t3;B` zwypanwmf!t`e->1F({BN`dTbe6J3tUia?*nW%?0S>YH!{Zo*#=6=cPj{?_=r-e5jdAj{or6L+YBOeLY7JKLW=5Vp}h`d)xR1$Ln@c2|~p_|9StlJ#ue zb1|+xb~VSrF4Gpv)}v)PCZ1uEbl-0|n*LDh;64wXQqRq$i9OUsil>u8U3`k&9=P1* zoKFaIo!BIS@^Y#s5uaN8HX-;2qCD z4WLB4Q;`)EmUSIQBs=M$rrVasm#NS2L|uv!xj~dajIXSO6OoI~p6<1*+H^*t5lw$e z^Ph#Jv3Wy^5LOt<`RHpAsoYzPm-2qVsFpkV;mpFi3(j6_Ek7m zeOMh^0^WCrU&IhhIO1}S=yNH*F}sM-Y#sj{5fP0(SCzfwl-(j)T7tq@{Uld^GLJyc iY@w@Z!_s?xo5R{2)?g&n#=7llo?%-|9gE_(HvRxv`(E7u delta 970 zcmb7@zi-n}5XbwR*dcC`GLT4!xJ0EwA)!=|nM4AqLbYTuBXxLj++Ipzr?D;60U0VG zRmccc@6o@2ED;@O)Q$gvjfJ5T8-jnK=lpQ(2!;-Cxp(jGbKm>EW93&d`9}Qo;wbrD z0CIG`mm-jWqF-ZwG9~tksH zYLrT^Ln{IBhI004}mGT>LanPq@KaL$EM3tVA z%-Z^rZMl8j;7~<#j=o8M3Hdqta_tczRd$}f!=B1Nm>^e1Hy1aEcLt}>hHW?i4^Cj{ z`e~DP4QIcHYYQxYra@bS0}W0z7fM0o6xXzke)pgQLlkZRXk)w4$b1RaDq}q0-ob6}Swi6&fg7*w$h7Dc^v# zCWkV{MT~WfOHCd^1@c&48&)aS%v`EQt z9g1$o#Lgz5&L>AjOJ2{QZKp;_K!e&)nuIdLeEl?En&ff8_Q>v7qV$BHnwoYkX;CyA zxS?+l4plsr{)^e4g7B%ocWz4%s_ad+%wFdc*O=!v zq*o-F0gB0ABD4pxFf#+i*nlh=FtDWmTfQP(m@^&23Ok6Hq;6wiST#U-Lc)D9SmNK_#Rpf*dFP^klpB`bND6~B&Vr*eN!zi^q4rRz-`Szk5Dv%SU zSmW{S_2PZ(dvXu<(ZPUO9*r*Fy}2BZ zWx=uTLz{O7)HtSx%*NK`?csNE@xOva!ExyjizbV2BrjUhPU93a{C=cZ;UIA-J-v&R zzmm3IhEF(u*&u$T4-Ru0S;bOL5i*_6h-wYoGdbl ztUM=1)Dziego=2GK#N7yS(U;~*e16O=0OE5;eSc|A>_(Gd+>sgittmL;)ya9(^T32 ztu)EY35>yn9*p3EyQw}sVa~e&N;EUsL&yHTGTl*`<^~S$UC)vV%ZC^ diff --git a/docs-out/_build/doctrees/PyCTBN.tests.estimators.doctree b/docs-out/_build/doctrees/PyCTBN.tests.estimators.doctree index f9d7e6ca20c5d7a5edbbe5feec11183ae21d3182..0616973dfb38868deb33f7b38092a26be979dd05 100644 GIT binary patch literal 51965 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 JKyt$}_kSq@W2pcD literal 51696 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 diff --git a/docs-out/_build/doctrees/PyCTBN.tests.structure_graph.doctree b/docs-out/_build/doctrees/PyCTBN.tests.structure_graph.doctree index 645d24f548ac710952857b1e0f2c6cd4cd8a7605..07fd39e249acfa54b4a3f302d20ddcfe9dadc65d 100644 GIT binary patch literal 96380 zcmdUY3z#HTl_t>L)m{CjfdZkryFeZVbXS9bU}KLf%}bC%rBQjAL{&yr(lKy zzZQ0G>zw?~&P|>1Xt?R^ZPnY&X}=R41Yb-Cm1?=^*E-jAqP6&WSgE!qc>d)re>$wx zYchMVEEo!wU)LEAhNER+C9L||tLTK+?c2HQyvd2sZ-uRiR@iJ$hwY|+ZE3dYHG;8* zH@(}N^*dMqa|*s2!AiDd2{Tq73FqA{g?vQn*I!a z(~g#h-YmZA1nYv)V0ExDSQ2cCUb8Kz&-vS$?OM%mZrfXL?%u}4CH?^dTU+bxkpGTL zkx65s*#dqxUwTM;Dp<)YaR(z8j~L$mRTws4KB$h%8N8nu7CzTC|Xvj zmHm0mrkJ@UHcGS{^t)N1Dmfl4ZFrStC)&y+aPF90VqB5XNRjbQw1s`Y)$Q|OXfo`0 zs0~*^19BFkJ9=q1*L4aF+axqFTDA#VCK~&;qZt58wb`-yj2j0NyMUFQ^;)@tSmjk; zQw#lCs}k0T|&Ba=*rT0jcGTy%MQEo0*pCdMi?H=g3bhpcz;u^Bjl-L@_@>mV08}AJYu`j?rn5Re=Z8VPJP8oD<0QZ{{Q9Jmslj2v z>uAAVtyT}cnDdB+n2>~Vil5TxplL>fce`0pG(107-QEJP0bB|AP>Q*S_ zovf4vu9*P2AhOj=WZ<{aZ3tftp6*096%q1u{oIuI9d7atJ{a7NX8$22+~7Y@rvV%c zQx4+fZ%S7rL3XdtOmaV+joiC!Ju{2lT7{}P3Av3xYqIFPWzi6fUiC z3`?y!uNl6zT@S%U?nmwY86(Y4bg4qkzYHHftj9MZq7ea+`0ye4kb@1k2d(gV83>7N z(GU+%lET<7|GbQXW+xbmR?M`kRjNF}eaOr^f=yWEr3V8EZ$nvWXfj<#H>j(%3f+fM zdudRvE5M28c@XAqAKOmr+kSn!RtZ6F;lwngGdBc(Tu)nVJQ#_V^Y4|isH9+&90A=D zz5Nj98a{aG+H7eaf@Qtx%`SC9pJ92m0_N&fwY=mwtOvUkBhiSRWJMtQ7jj~ZFf-&tIgD~cF2aAPjga;DCo_{=(O|GAy1wOyS2lKH zmvH>#vGKGfrCkIJv3rDYV^qP$m=A!s@bZ2XI-%$Ue=#;$hfY5m$9R`4WHoID)(T_7HJOQqcOqr3O~IyKeP`h+ zATA}>%Up{~{P##ft<+VE0k5893aKU8brli>Y?_cr6APdU@I^_%A>*vO(bI{8Z?=~u zV(z97ou67u^C!_#sU2i9)GaFIy~Yv#-sJKF&Rps+&s>ax`6cx!!u)^$Yeq{tx=Y|5 zCGQ6^(tHuuL-IZ(*De_aspM+-sw;dUDV(T%v9#FTRt}B!)t#GhYj&P z#$zoUWC#PFeK{eZs;^~A^(GG^SEJ-1&RlP>Lw)3~_gc)vT<_<2{xtQ(oNHNiLYBcM z1prDlF%+l9V{~?+ArU@(7Yd1%gEg`6X^4S3j)%jT2Tdc7(@$!3HsD6P1~<@Xb(A^C zO@tATo+odtFo&&Gny$|^U{DzY0r=aWnStmH0`vZb4>E9=>Pz5|N_1i@!AG1@ob+Gx zu>aJ0IpB{6$_;Hy%^<9z$5&F%Y0uzSTuFN?x$x-dte%y*qK6i6K-EKBMO>_s0C@q0 zfn_OcB~L?IA05dnizt%tEu2sa+&|+D*q*WgcVdj8p_M2A(8|KU9j(asp;mJAA@Fz% z{(@lvI;z?sKfv@&nEns&mj#))spUnbtEeJWpmX214va*g$^Ib_5?BCjPH|BZCIsFS zP{=YYB_vQpOED4SOlT*4ki#5H(1#3k#5hgniaxQ>5refu5p+=8lJk)97&@E^X?;Y8 zao2{INWh4qNU)VROl~9)1ppFQcuhkB5305yfsg5fM1rQ@Xf9|ZKmrGi1WX7CNWchS zJza(bG{r=M8@cLaiyijLTnirwm>7y6f#R0zN5*4F(1f%X8wn^=;L33QTcL}@7cX>t!GXv}M^m*`MX_lTvFyVW z^DNk=@g*j>$Rf6CMqgrbwmo_=SA5j`5Et*TB~5(Dolid`^Z4&v0%t2S+tk2!oorzw~MB%dNM3+D(I*Vm=SbbvTGsmV2(`Yla}U`-Mr(NM>qq^hUM1MvaCF7SG4hFc4$C~qIAj97_<^i4c})k|o?gLEx+;K0 z9ioC~WChyN4bGC5VsdnGdWF9=DokI&!Rb)(g$Nde^B3v{i#W*fR4BbW<~UbmQwCKF zc@7XFAwW%7Et&+S9X2&GM5ji`QAi?>L77R=81y$BkgPH2xH+TH=fxXyvBol{!Xl^T z8sr2Rz7mQ;=CQymt2AziQD8RUI5`am%^cTg>_PdatZkNSG{_DtRbPp53uMi*5`*l7 z5=aGdk@N8{Y+7;wmYTFU1sYx~yjTpe3s?y%hd#g?w?5>E&j8&HpYj16Rnk#QI$2XOBsxk(p}hHzvG4z?)a_VcM(S7Zu=)-uHf)D|&cg2kvR2hM*qf zF%>neF=Wq&l~la2jJ{@ZjfxNS)RBn)GKKuNQe4)+)*cmn3o@mlpJ)$smS3aa28z@n zrap06jpPy7X+xDPw$SdWJk&m!nOfzb<3J=hL)We}jeHg9ij6(p18Mzq?F{(o!iOzc ztX7UnGa_jma4(mmH4bo@pArSYSd@i#lv?*}I-8$bw-nr$Wq#@~Oz#?tqFBZUe{#>7 z->h&ctjxi@dA-`6tF=lql`5?L#MPq`^GmQcqU4ouw_0D}zuiCh&%imO!ns|nC;(inMJj17 z_M=d>&Bfk@>4R~xZ;zpOYuc-NO~iVC{zY-Htv)+g7X}Kr*LU_(JeT^roh#j)-eN8m zd@cW3^``u4OZ~R@-p1n_4Xc=xuXBExSX#`19!RJbGuxxdyDta zJ%3jUJ%fAx4rFq5&)=rs_Rl>(lZW7+79n_zuss^>#+|h7?MM_$HO=GCd02R%2n%Zk z3k*KuJXl|kMDb*kizAn%M%ebzhQlCJZp~ROxIoa0^I&;70$U2XP0<`C{oC@;e`;p> z-NGh?edJNpj#$`q0MZ5&Hl5!O?q0OiA5PVl5 zg2jjeoqSc34RWM`Ps+;Qrj~y>55W&-CfLn|D&rxyB3&^TT7$F!xzJY^Ml|U^8RgV} zHn?ze`%h5-_)m*K(){Nyp=z7|d=AqG<3De)BDG7$s;`c8-#{Fx3mXMI>V7xRe0h8C756}G?dz3NpQ)B$XwAAi_s;!Gfz z^{H#+WAxO73GIzi_!&I-OCXc02S0*-tC1?_1mX@+%oPZSD1Mtdc2*vOPcK4nY@i`V zw(V_?!HLWAu<)89EX0QyVmw%1_Zpn=^Kjwyg$o#J5JsRa@048VuQe`svZ+ot<>6vq zW-i>~D}{vQaHK01U;Sxt@m1HVc5SsysCpkxP$w2rG8Sl{_2;62mM8!MEsJE*0`DRw&1B}L;WMO|V*6y3AH9kI>>T1ncXy^US5o60SZHBcKI z%oB&WGcprR2zeAu71mX{PsQM7hp)?Ai%-~U4WoYU5Eqr6WD4qW$+9)pNC*#=pvYrb z0Bvry(l66dM7FXNG?Pc5`~h`fk4aHN(KTIMia>$=E4)dqJ!o@*d|!{p;kwq>GNrPT z7m%w_@(0dbZ^PCWTz?reu_Je$m%>S2i;Fq=kvl?`;NzsCE9Fe{aqE}ceca)gp5WsM zBNVZ-*g+O>+I`6{&-#w%={PO`cR0u*wIp`-pQJ6((=jAUb05ccS#F5ixn$AOg(y^9 zYknd6+3{qlaCFbyDbQHi+z2kGJ5lC}KC{4mc3db$fLyUn&Or&pBIRQtZ9qW2xraIk zFz0kplzb^~Br8g~tREHy05n+GO@oFvLDjbK_Zm!3fCg?8#bE(^@Cy|dC~bp*1 z05Y0R7=x4ak4$iRh-+XraCuPXivDIX#2g6%?i!QN)Rk01AdjLvVo-Ac(gp-ITQjMV zj7J!i6nH+%8!$KUhynn3EX=0?&p$%dHsE;{(+2}Q@6@a&!$yvN4Bg3d`S$b?k}~j6 z0IXhhRndTzKB1pr)H#F7S=TR@67xI7Kh2LqSyh+C)2q)%VLGVC{4 zx^PecDtqgm3jr3OJTp&I2$;;5*#yZ8(TFomZQz*Hc`{e@{Y3_nE)7)-B9(B+E|gO& zZrlNB1A@p4dP1ZV_o5@qsHXt=D&F9^0a6qI0BI3Q8bG$7Y8ycA#q_}d)&&+a(kT|ci#K&{EEEL*7Fr~dhJ_D9)ix~rGNum( z3vabsqKhNxD=6MD7*KTKqX0Ty=BR=$WLUz-?fDx=;AN2_OyGQs+eJ3u{GQAe{cuqN zr%Tfn3n-O{$WKsOF$Db%qzwo`FYTlH%6>QFfkNru@y5>$rJ?|UQj2KPp!DEjJCrWN z^ua(WyB1`|gS7?jcY~y^fl$Zk^=CDOq^$ttC9I~9MO$Eu&5z121T@8yO}IG*8Y+9w z^+=g(aZHdV^YuDJ$%A|WMH2(8J0WdA zfOSq@m6IsO2&O1@7jM?wC?*O36tl=74aI%{RohVPN0>es6!WBoi4%qp#mapJtvB`! zvO2{3&y zaI%X!+rAIfzNRk$3A-}bxEe0YEhnRPr^1-+3Olr`nfb0vEyYBGw{sQA7F^sQb47PA zhTwupzeqfxI3^J?9|M3kqzwoFj!tfR*&|^jQJde(nzAx_(Hk4PZ)+t_!OdgQS-mf8 z)dQ36n_GDSv^ zjoTHjRuV?Z-$E<7#VhCm@e0>RWe$3U>ruJ)Q_qN-SY57gW#m%~|DUg0%+WJSS$*#w9;5jD0m$??W;+Pk$Y@e?8l^^3Yh>&oUUr!kzRrQs#ab>uB%!vO|LN1RjrH;Gj`E~9-(S@``k%XD9NXl zh;Q*eH=8o3TF7q!7ZQS0hpWal+cR%!Jq9V{H?=Zrpn>S`I0{(<(ZSx-+K9DP;hS1- z!~(P2)Ou5l0<-^HSmAs4%;6`R)irq+cXq=12-VmRK?`d9EN zKQw3#|15S(>znoS&Bn%yL@Hyk!{;t4QrLu|D;5C>rh`q2!eF90um@3bO`st?Aq*6@+7=Y za~eEsAn${!5+tid4);N6eT*C^vGkhv=p|-Mtl6X(+*&;LK*OE`Tm!6O&!RnkZ^de= zCPVm-)8OmWuWfAPxk6fQ07jtyC;wd9pTAwU+I z6N7}_!z4RmmY$_r%UtM|EcrzbJXwm>Z1tN+qzdp9V(vLQWeP z9l-R#fKf}BP!)qIn70&RR-;*|H%l;qT55&O_H@{8`fiI;U0^Bb3oJR1TmYb6nV?J# zwOXL+)C_VKpp_|)318omI+z8%z9w_^V`aUr2++AM*QY^~;QsHi`pnpi*ZxHUEF}-} zeH2X$$R2^T!2lWE%W;LA7-p-a*+GxJj8sAzqnJY4mwCJ9hBQ$C^d2pONQ1QBK-D%# zdmhsV18LXlrq+M#dVSw?SI|}fr09;q1Vs_WThQomn}`JL*k79XvU&}egVX4R-h*2q zb43RhL3o5nFN9buB2tW#qfrJiAXx%wg8`EGIK8#q#f&2(jUvV}-cq>{LlgjrVc|Fp zFx+Yn<1rVj=&^uwEFifEPpuX3!>FY2^IG11x#33?0PtgBJ`H|uhN^Awa|@;q27XGK>A-b##Gel9 z%}PIqfp+yPX3@zj05{_%KI$r>*IgMpJ1-E>9vdl+>TMsDNnl^aGx0RSTwrqf{L+fcO)M!tjTgMpFP zQ`2zYw38fYsCebV;=p0quA>&j^q%XYdp6=doZ_2xp5m&J4FH~$xuQ=jbO0#6QAcr0 zevORBO#TT-8;r>xWixrokBAi*J=Dm5#M>mdk&6Pr$SrK98Ts0^b|c?_>4PzH)>T1S zz+8A(nyFN)Fb!VzLT{$&&9(YCM%#z3N-~)RVh3wiCAlU`48gh}$yr1!(epbqrWl7- z&psw{yv()myDDiSE7Da_G9WKUam0XTGo%d$Xslh86fOn)Fe)kh9Lw7;H~feK0DdgY zr@_yaP_-?_xC+w;13yH@7!-a`R28pUxdAY!GS}$yU`eSz!AByc1wiPGBoCEXnFWWA z>n%(HMJ}J3XjJEVnJvKCEptU*S_}bBqPUB7c9a;%O(>BVAk9G9U;yd#%z7pJJ&aI_ zNda%g+?XT^08Fy*pN2^vhN^9tbSI{#Vv<_9gyrjdcmQ?9#$~Y+1_+b8#mtOJ8<#&V z2{Se>-*2Uh?pd^KTz(oh;zVcm-nh)VR$Fl{y?fs>&rb(E680@?T{E$R*bBx%DyLjW z+k0g&8mwlqhTNB%vTgZHJCI&mnr(WGfD&>oo}O2qnXb&WM2&pqc|zvcp5=IE2}V&u z{$7=jl82#b+~O&8%eY(l3o-|l%2@8bv@_8eY;m~LZe_uHCwiItUS*ld+^MWsh(6c{ z02a06*{3Y?QcUv0%V&0ib^x#z+N4bH%(z07mTix+pa^y-zrwE4nno*yW>KD~GUoM_ zzv|2`>GG`1wQ!Zi+?c#2OS6gKCtD_oJakj?AEk&~1&f=K zm0-yWSOD$ZsQo!>Viv)+GsaR)I##Z81v7oZ+)Bs4{FdagbY|>Zl1Cwv>z3q+^a|`- zl6eKWwj{qYy~0dek{KOlRHBD7qJeQs@=;VM=9X65x40$QrVOeU@-!%FLQr~Y2CFkS zB(FyL_=aR=2{gd`8Mi8HfH~L=$zH6bj16VcX10fG`}J+;nPT^9V%lr@)B)^-Kdz^c zLQc^3rjaTZm}Nt9Ek=Radf7H46O?bh4axJ6Rc&;OcvKs$g1v73e4|>Ku7sWa^n<-# zv)0*9b^_PrI>^N~BxBP$Z%AIiu?ScO>V&@a!PbG`JE-0ZpYk14Z^1u{?M1%MgF)E9 zZ{j#CtP_F7jU{#|uH#Z!5zv?sikg0LIKEzn?PeJhNtDIHA0Y%WOc11O`rT=`y~G;E z8?Z-fZmP9qY|d-#-ZI9H>MZT?s%`&dYJmE=u16&k%8WAk1JlEPiZ`d=#57AAsNzbI zyJW8D{skFtCyKdigyWbLxpT39MefL5&Oc@`*0&PUM0!Whp9CoLVgrHWAY=OgbOWL+9TYp>wsa?s0l8FGnIX(WL)ZdFX#OGyN)z zh(o7n6AVClLSy)aR2s>syxYx&!{vqZPI^+lFfHz}$*FYGBVLsp#Xvbr?>Wg)=v18J8muqp8RJN4rh^|6-WP4?D^wK;WZ7#x5LFapJ9)i!#Ot72tRj@&Rj#?jc zzTbzmK{(%IQUF*k-e3e#xBEEKMu#QII_NNpkr{qg+SpBS4&QOG5+HevgeU;qu7%Gu zw_5?p+uZIPrVqyL&ahq0tWT!4Tb5?v@Bt52_mo{%wA$UM8cMw;e-E}Ni3QyAt4!_a zS=G2ePdc31>h8oI+p`GanH|0~;pbncTl0yam3)ng-obr`%oTlMVR~x^iN!qlTC)|H zMAhJ`^|k7`SYMAs@nlo@cStd2aMZU$CRcCv?;XFzkwDd^vewJX(fYYe7%#&FE20*B7koBPJ(9$|Rnh488tdX<{_U8N2Q zaMFcWts(h57bbxcP*4j&yJ`=|sbd(CNIM%!QK!KMr!W(Hf^SDKKq zohg;qEQ3;2p(3AZ3u+oVJy>Q%Puv}jmO^f$&{bNYLSu|H)tpbV=KOJ{=KLXky@~uC z{wirVpmCa3!pDxU#Xc>a_|^ zYsHRzKR3323{&FjFa~5w0FNT$WB0xe7C}1K#hK!by)a*1{kmR3~H!o?P0w(#AAT{$HRXnXT zyIPH{RAURLDFBrAR^WyQT*TR@*>{&yuhJCIN?QR`IK`q7);cTzaWn-8>(>G+(mpX^ z<78-6x1PQZ8z;zI(SKf;U79o*6^VNl=j3b@LJUF1AZ-u`!cIw(kzNXS0!$cn6ikle zt(6;0L;(OM7N*kziZ?>lwt(VlOdkxGOj6;{H7zGQ-3e#6do^9SGyj-?B&7gUu)Cbh zrf1x-QNBR+A&0g4*p3M;#kBhd*NJT5LRIF9KDL1E-n!H#Q=p(2C2vQbV`e@JX@fBH zBX{9pvE6Mg`g5EZYSk6q7P+lj6aZFj;W5psKLSlwgG1xI|01>& z0%3B?t(h??cDYv)W}NJBz)Bb0?rk~Q;c?i}7`@ElWCsBp-RC;++^Od}h}`0gh163W z#$dZ_;Zq&NIl-bvKFpMGDnsm4hj?ZQCyu8&#PdVv<8Po@++q)OYIv%{Lox?F)nWWa zI@LkYp6OHvnaMoWL9x)6jryXNJf}LyycBiBul}6sAWF-2s)NYoc&dZ=oORyCub8h@ z0`J{fXQw)dg8F%?!#_#Qbse$A5$&JLTnkrOvY+Z8wiVyvQYxD= zs9MNBf}$1(I;A#~)i_K%L~utXS%dWP@h4^pG`M_*Ta`7qj4h2i@jN(Ap|yR?<-CP) zn7CigzgK&qR1!#GD%MhkPj#5X0<)azP>)eywqCYV9d@I9^PTFj53*)I)!{9Wi=FC# zP5Yvr>L4_%&#?&C3CB|%-UnRsX_FHEN!Rz~-bb5#oq-gB5md#mmv>obU@u9(%h`-9 z1-o#!d_UG1$m(;9<;%Q=5De0($4yyhzz+MC1*y4BIU-u%Hu<}`X1I@jU^Mm#nQPGq zScNqDVuGIQ3%(#Zbq%U;GD*pYd>#v+O{{{MOam~svNT`#Q7FG}zK}XW>JB3|qi)eU zF#@wFTAsS_kMlOPy6{Ciqy8jvHA;TWnd@!9IIhH3?cIr)*o^uUQaGk_*TXn%L`ujK zMx>->D{V|0D*FvoWE(1b9@D#q$|!_yB8<=?GwN4|IHT^DXJH3tz2P@KT)ynOR8FeD zf!=CB{Bnl@aeEnbK&*?bSchHtvEChacIln0EP?B;f$}4)ABuin!dtVyxB3VcT=dpJ z5#l36u8_H+d;2heE*bBik4}(G5iD0slcSM;EK6ArSpsQ;z;bgiCqeZ@--i)KfpZye zBP(#a%)N^O04*&1rlG|vplTah?7;K{wBSaPckcZStij*f#;phY9H-l*-tEHq3h_%J zgv(}kk;@#s0(L*PONS%|CtAs}_o#YC>*Mke*5CcY1b{oZ z+GGQO+hwlkQwul*&}3F@&7INZqFyI4_HV6#Zl&%M&KgVgJFmM}hncOfS3IG_e zu$l$~--fDfFz_8r9}En+d@_e6w;I(}N0-&h?6tJx-rW;UdP5JGL12%L^MZkgW zl?ez>aRtf-2v5pf(cOyz5NN9u2@4d*U|}{56xNQ|L16=?4+a#br204NExPB~tMV{`+KbbII%#nR1gqY`oBDtcHu4HU z#a4q<6*btZv4jvCQ^h6#q{mk#mW)FqyDg5<#}|&5xuU;b;8R{>06hZRdOOyavM1R1e^DNrQowFw_}u2k7Vk=-&^bl(Dpk60@e2}cyyt-9$qntk&8MXef1Dd6mFR?WCeuxeJHzDtLum{$EKt`pg; z`VTVKg0^ZVfg+AuF-le)*=^PT7v%6_Sv6%w_-aNBwd&`2TjaKCQ2EyBA-B0rr#rU^pZp4Vheb?mUuSfqmx=uOQdXo&TC%VWyos zj1DtO(Zd@tl#V-hK1GF+ygXEVi#vC0%Ajf?O(-fM5Ovu4reM~*ko68EkZ;{##y}&^ zkju*&aSnFt&aZjZqPtRf>(2kf0<&!0`D2U%v-z@Z-T6I~m2>OP&{27|?)(BOWLtNz zX`Q$3EbQ0>tOM0TU-4<{RPZI*M}gq@6763?u7bOF-lXpuahbYQrWT7(;`?_lED-G& z+hB~qN3aY#c=~XgjmAv&@i;BB=~E5rsryaY#6y?h?vlZ(mKR2S`gU6AS*SElrxgp# z#z5_KnQJi#Tg5t=HuRh?nRSh}Fvd|LB0H&JV$`T&oJ<>fY-JTcF!Xw7zKR|gir}mt z7|Ok`I56~DASBIMaLp43hT5c|1q`P`Y5fZr2z4j)0#!OpX*EbOB)wRSfyO!$y!oxM z&Z6Dp^ls#8l-$ah6Va3z%jjV%M1f+D(^kyH_Bj2e6i#|he(H{pC5-1uV^=DfHqiKC zsK_?ZcqgWJ4Kz|Gw}~)9i|lcFU5I;}+$RPTU7DI2yr76%m*m8z5tLW&J)A*zy=wL; z%d{*y(&hqt&JJ=_=&ee^Ln8b?Aag}`E!6QZeM+{-RD$A_d=uHmvXu6d&p_Hh0GVz$ zwKcfFV@?j6BIFHXg*%s>Ne5($+PF-!@t;CYn~gt%=?ON@)Llu@7WZ@T5uH{5A33gL zW=xt)_&<^`V>01)R=ViOqGd8+8lC$Yy^s7-5Yj!Hz_U|@Y)!~}f$SsAPSXiEYMwHk zuRArPf1CnlF`oa=AWoKpj_03KU_AeLm+|~g z^iuX&>KJ1TXcduBvk+dDs8=bKG7Z%8k$9!GwI zqvKPxwc$T|MFYDe*nOwhbG8WiT2n(OUhGv;a36YSr7#X}=R}#k>bc zYp2^yyh*mi(YhtEJ)w$e>hTiB^+i?An zyl-jUWHdbM*Kjv;y$Sh;%XmX==*>0Y$0}A0T+vk94L?`%pY3K9eys`X)1@ik5#K^} z%Yd%tzD~4Zrd|(g_0ZQ|UV3n}rUf%_aO+NK9?p-S>p;p{u;&WBnQ)Gp+GKPLOYy5d zO<^Y%)7wOVWT=s6z*FXF!fKcyt~bL{)!*Y+JC`03tqi=X{JAVT)Ss__tl-k!c1wJ; zELv9fr`oen-rBuh6A!V+dl7wa4pN2zjHZ2Ls`H*`ZKc*|!-ntLbRBMyn(aix?Qmx6 zIa^y5_%vVV(ORz^)=MfWI-~+hwWbW0DV3z+fnaGu1t7Euw{KyA z>u3r{x7NbuS4oYQ-!9in^K+-~9H!R!N4sGL+wro+;n3ap){D!Q&zuC%U zTrLbE*cz<{W?EnZbbCG&x`uyNg43OWx$8R72>u0?wEQN$fy}RAX=P~gRZVX%G&uVS zDtahd6=+Uv7LLxYR_5TU=*!lh1Xl_AjS>jO2V0zGnusY=aAs2pjUyTh!m!cWzHQsy zy?X)h!k}K8s5fV~mHj>2;LFyw4&1Q|IVd5J0}kt+gJue$Syn*$))P)U6Xd$KIWrxr z22)fuqoSIyUI#O;_~8t#CJ5)MP{nZQO@R%S!=Q8NifAKfSTJp-}rcZIbrjMF-cewK_Kegc+$dxMPkcLuoVe#}FDtnWittME3VMITg&7jAJlx ze(-AY)kEOdm+2GZw=D@dbdl@>VR&U>(*+(C9XMK=}-5NNjyZmP%>AW+wf z$J^6L0etI4=vyI@nh)MduExXIuE)pI_;?l{r(#>2hL0vb_Tq!K$~W+@r||JX;6~gT z7ZU{iz)2SGFD{FkAMUL;ch5GxMvy}&dUh@yf=n_2k>`-r-{Iq)CGfZ(A7e}5aRNRL z;NwAj)Rw`cg^xes;~9MX5+4(2K4;*gjgK4fK@I6q{Of6aq%|IX z;M92UE8ci5h@b%G8eW*E?X=vY>5xU9)|d`zr{#~Ju&73vty!4`8 zdJ`4BCyn4;C-nLkf_D}Wyw`x>vE~GiK4IBS?`~2vQsj z45KM{v?e`%liHgxnsfILi$W&z(LKSPbK&ZItfv$`o zIGsT!ljt}a9ap5m0>K_T?Iov*1G~{q;`o>9^}|@H7<*_>wWBq9;7X&eHPaR7*kRZP zkr+$C-ii2*g?D-i`wrrN2z2MB>QxyF(@zhNCCaadjS`1Ntu)gHqkQOSHbd;$9uY5# zzd0yc34N#OdK>#UooLl`y;_BU6nKFC^YWcM{Wb_eZ|%GR;(xf@7kU&BeYT+6#wwIu lC?k25Os1jks!DCT+Ac%Sr9O)t9=J~!dU?D<#GJ^){|8_uVqE|L literal 95711 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 N1H&{C(QtH}`+u}@7fApB literal 45421 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 diff --git a/docs-out/_build/doctrees/basic_main.doctree b/docs-out/_build/doctrees/basic_main.doctree index 20d38876e839a06b41079a2d4f39524c68d3751a..bf49862c0e4ed141ae4757196b35fcb4aa2862fd 100644 GIT binary patch delta 281 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 diff --git a/docs-out/_build/doctrees/examples.doctree b/docs-out/_build/doctrees/examples.doctree index b6048067d57a4559b5010904309433682452dc30..07c7eded18fa66d0749883fdf29734776cb360f0 100644 GIT binary patch delta 1211 zcmbu9O=}ZT6o#2*64Mw-?4lr(L_$*X*;Yywv`~u_U8J4bu3Ae-CzEN;z+@(E=892D z6DK3H~s+cOcFB`5?fr{&6#`N`#$GmzRzzg zuuq*k>s#!Bx89p8Xd)^}s!p~(uQ&tXfFQoj++;$y$}EhJ00-B=it-TRQC@(nYa|Zg zEP)6;1N6k`Nn{Cv6!_@%!Nzq+L&)&=Ofa`5&YnLGK{GGoYUtn%$3t$m^P`w!xv>jYqQ=bs})^P6hW6Ybr4mAqC|v-dA!123E1p=sDQU^KjXwtXdOPXi&HB7 zqMV(>tb=S5@}fN4Pdp=L>72%_=O=4qJipoSeRy*~T->MVmbHT(ld{sKxW1o1Q$NG9S*zvv1>Bw0Q0XK3$mm@_#&8YQ$2u@d(jK zlcyGqtaq6>b!9@Cx*rfZhOM8C^`$m6in2BDL bRZ&3&`lwbU)TO5&iQ1~Qw1hX|P=4qShh3rC delta 1179 zcmeB*ycxmLz&h1$BFkZ>491C<3t1U6m@{N1doo%w%X%|S-oPR^c`>7-MQ)B&aY15o>XaUif}+&o)S|Lfuv`3~W^usWRGO3u zb^PR57D-mH^CwrcNJ=4jfD5RY2jPLq>sYE?a)Dym#QOmh1{nw=ym?BKGW<8^vfklT zti^#@i4ilPL%=2@dCO8- z1sWqs(kl33WPx<9%ORiv2T1eDUL>DHgMAVxbAmnS9A!R<1v&(5GLlcSRg{Hb5hPPw zQdF8;Qd*QcxjKHukgmlB^6+!D8b z;lOL|X-}Um{V{i_VG%+iX!ZWznJ0;C@wVdGeM4D)jI<28Le&yrhlhz~|L*7%|V={dm=e-GO z-WICrb;Ya{G{b=xC<$qN<&6gLm!X5Cat&A6k-$ou@{lTn_et)a3nUXa5AdWfo>^`E z{$qp8#c9SHZXTC?@k2WeTs5Zyza6pxBRFS&&k2!Hdy4!Xo@>tLiWvT1g;kKA!Qn)8xVY2nPz72-C zR{s*1W{4J(j$k;L4u|M7%Im7JScAN-RkWHj7fj-e^tpaIc%Jc_pqHl!czF`nLW2=g zZbY&L5qdfu#>pUOiUS!lQ%Kl;5W(;%P`1b%wWz?^UKiio5ZcauLl&;h6rV- zXJ|}5!Mun$Fe7+!E=#>oWNC(KhI57*NWz;FsL)~ZKNe$tJ2Wj0tT}3$Krv>7G2ZN@ zNf}z2jZvW*@DU-NmCfBob@%!~~7Nw@8Y2HatM~ea# z_XEAj+lwU72^0`%2grAw_~z5hrD(l+|@@xuFjZ@#-D-UPoBylFLJgtDKSGF zM{y9{}<0IG}^`v3p{ diff --git a/docs-out/_build/doctrees/modules.doctree b/docs-out/_build/doctrees/modules.doctree index 03986fe65351d79b7fb5cdc9ea2f270f323016a1..13381711ccd6113d7808cbc018d557f1a6b67f03 100644 GIT binary patch delta 382 zcmdlW@=%1Ofpu!wM3((LJ)H3=`N^fZsd*(+CLS$hmC0bvkezJJXu&8qxrEV9OulxC zMuuYSlniAcRs~{pAl96Gf-!*EA;W31G*gDGc7{=gY=%yToHt8`bcTLuQep-|*W?9E zV)bx+u~SMjv@>*p%6KxsHi5MHl_sUab@Z?mR3?`sKIh{>;ass=Sm|#w3UTSItMtn|YZf408Ujg;Woov@Pcd@%N%0y>G6!&oECFZ7XgI`<=811s*@Ko3cINTS(>p^N;9-GxH6=H27nF8 z(8)kE0-^<|7^aXh7M5g=3k8O85tuszhX9GWYn1~%c?wCj7>{SFefuF zH9jXbFTErqJ|{Cbvt){|fcj*6*6W)c*jyQ9j573#dpPqFb5lzy3sQ@x)K1AT@+;0z u1k(DO7qS~Ns&HrKCFhi;01e4cp91sRz$bf3- zVJprrElN(ElA#UKyP1{g9V27-<}b`fjEvfo)mfD%ce7rb?8U0JIg!nkQN}PsuegUZ xFEKZ@q_QBjcuMV*3`4)-3Contents:

    +

    Contents:

    • PyCTBN.PyCTBN package
      • Subpackages
      • @@ -115,12 +115,12 @@
        -
        +

        PyCTBN.PyCTBN.estimators package

        -
        +

        Submodules

        -
        -
        +
        +

        PyCTBN.PyCTBN.estimators.fam_score_calculator module

        @@ -300,8 +300,8 @@ and a specif parents’s assignment

    - -
    + +

    PyCTBN.PyCTBN.estimators.parameters_estimator module

    @@ -385,8 +385,8 @@ in the graph _net_g
    - -
    + +

    PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator module

    @@ -467,22 +467,34 @@ Generates all the necessary structures and datas to perform the tests.

    -ctpc_algorithm(disable_multiprocessing: bool = False)
    +ctpc_algorithm(disable_multiprocessing: bool = False, processes_number: int = None)

    Compute the CTPC algorithm over the entire net.

    +
    +
    Parameters
    +
      +
    • disable_multiprocessing (Boolean, optional) – true if you desire to disable the multiprocessing operations, default to False

    • +
    • processes_number – if disable_multiprocessing is false indicates

    • +
    +
    +
    +

    the maximum number of process; if None it will be automatically set, default to None +:type processes_number: int, optional

    -estimate_structure(disable_multiprocessing: bool = False)
    -

    Abstract method to estimate the structure

    +estimate_structure(disable_multiprocessing: bool = False, processes_number: int = None) +

    Compute the constraint-based algorithm to find the optimal structure

    -
    Returns
    -

    List of estimated edges

    -
    -
    Return type
    -

    Typing.List

    +
    Parameters
    +
      +
    • disable_multiprocessing (Boolean, optional) – true if you desire to disable the multiprocessing operations, default to False

    • +
    • processes_number – if disable_multiprocessing is false indicates

    • +
    +

    the maximum number of process; if None it will be automatically set, default to None +:type processes_number: int, optional

    @@ -521,8 +533,8 @@ it is performed also the chi_test.

    - -
    + +

    PyCTBN.PyCTBN.estimators.structure_estimator module

    @@ -677,8 +689,8 @@ that do not contains a the node identified by +
    +

    PyCTBN.PyCTBN.estimators.structure_score_based_estimator module

    @@ -723,7 +735,7 @@ using a score based approach and differt kinds of optimization algorithms.

    -estimate_structure(max_parents: int = None, iterations_number: int = 40, patience: int = None, tabu_length: int = None, tabu_rules_duration: int = None, optimizer: str = 'tabu', disable_multiprocessing: bool = False)
    +estimate_structure(max_parents: int = None, iterations_number: int = 40, patience: int = None, tabu_length: int = None, tabu_rules_duration: int = None, optimizer: str = 'tabu', disable_multiprocessing: bool = False, processes_number: int = None)

    Compute the score-based algorithm to find the optimal structure

    Parameters
    @@ -735,9 +747,12 @@ using a score based approach and differt kinds of optimization algorithms.

  • tabu_rules_duration (int, optional) – number of iterations in which each rule keeps its value, default to None

  • optimizer (string, optional) – name of the optimizer algorithm. Possible values: ‘hill’ (Hill climbing),’tabu’ (tabu search), defualt to ‘tabu’

  • disable_multiprocessing (Boolean, optional) – true if you desire to disable the multiprocessing operations, default to False

  • +
  • processes_number – if disable_multiprocessing is false indicates

  • +

    the maximum number of process; if None it will be automatically set, default to None +:type processes_number: int, optional

    @@ -762,11 +777,11 @@ using a score based approach and differt kinds of optimization algorithms.

    -
    -
    + +

    Module contents

    -
    - + + diff --git a/docs-out/_build/html/PyCTBN.PyCTBN.html b/docs-out/_build/html/PyCTBN.PyCTBN.html index 6e4fde1..bd6313d 100644 --- a/docs-out/_build/html/PyCTBN.PyCTBN.html +++ b/docs-out/_build/html/PyCTBN.PyCTBN.html @@ -60,7 +60,7 @@ -

    Contents:

    +

    Contents:

    • PyCTBN.PyCTBN package
      • Subpackages
      • @@ -114,9 +114,9 @@
        -
        +

        PyCTBN.PyCTBN package

        -
        +

        Subpackages

          @@ -161,11 +161,11 @@
        -
        -
        +
        +

        Module contents

        -
        -
        + +
        diff --git a/docs-out/_build/html/PyCTBN.PyCTBN.optimizers.html b/docs-out/_build/html/PyCTBN.PyCTBN.optimizers.html index be9cd55..58423f2 100644 --- a/docs-out/_build/html/PyCTBN.PyCTBN.optimizers.html +++ b/docs-out/_build/html/PyCTBN.PyCTBN.optimizers.html @@ -61,7 +61,7 @@ -

        Contents:

        +

        Contents:

        • PyCTBN.PyCTBN package
          • Subpackages
          • @@ -115,12 +115,12 @@
            -
            +

            PyCTBN.PyCTBN.optimizers package

            -
            +

            Submodules

            -
            -
            +
            +

            PyCTBN.PyCTBN.optimizers.constraint_based_optimizer module

            @@ -152,8 +152,8 @@
            -
            - -
            + +

            PyCTBN.PyCTBN.optimizers.optimizer module

            @@ -219,8 +219,8 @@
            -
            - -
            + +

            Module contents

            -
            -
            + +
            diff --git a/docs-out/_build/html/PyCTBN.PyCTBN.structure_graph.html b/docs-out/_build/html/PyCTBN.PyCTBN.structure_graph.html index 6080755..9ff99e7 100644 --- a/docs-out/_build/html/PyCTBN.PyCTBN.structure_graph.html +++ b/docs-out/_build/html/PyCTBN.PyCTBN.structure_graph.html @@ -61,7 +61,7 @@ -

            Contents:

            +

            Contents:

            • PyCTBN.PyCTBN package
              • Subpackages
              • @@ -115,12 +115,12 @@
                -
                +

                PyCTBN.PyCTBN.structure_graph package

                -
                +

                Submodules

                -
                -
                +
                +

                PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix module

                @@ -163,8 +163,8 @@ The class member _c
                -
                -
                + +

                PyCTBN.PyCTBN.structure_graph.network_graph module

                @@ -456,8 +456,8 @@ Initialize all the filtering/indexing structures.

                -
                -
                + +

                PyCTBN.PyCTBN.structure_graph.sample_path module

                @@ -520,8 +520,8 @@ Clears all the unused dataframes in <
                -
                -
                + +

                PyCTBN.PyCTBN.structure_graph.set_of_cims module

                @@ -606,8 +606,8 @@ Compute the cim coefficients.The class member +
                +

                PyCTBN.PyCTBN.structure_graph.structure module

                @@ -735,8 +735,8 @@ The class member _t
                -
                -
                + +

                PyCTBN.PyCTBN.structure_graph.trajectory module

                @@ -780,11 +780,11 @@ The class member _t
                -
                -
                + +

                Module contents

                -
                -
                + +
                diff --git a/docs-out/_build/html/PyCTBN.PyCTBN.utility.html b/docs-out/_build/html/PyCTBN.PyCTBN.utility.html index 5f834ce..50c6ce2 100644 --- a/docs-out/_build/html/PyCTBN.PyCTBN.utility.html +++ b/docs-out/_build/html/PyCTBN.PyCTBN.utility.html @@ -61,7 +61,7 @@ -

                Contents:

                +

                Contents:

                • PyCTBN.PyCTBN package
                  • Subpackages
                  • @@ -115,12 +115,12 @@
                    -
                    +

                    PyCTBN.PyCTBN.utility package

                    -
                    +

                    Submodules

                    -
                    -
                    +
                    +

                    PyCTBN.PyCTBN.utility.abstract_importer module

                    @@ -281,8 +281,8 @@ dataset

                    -
                    -
                    + +

                    PyCTBN.PyCTBN.utility.cache module

                    @@ -340,8 +340,8 @@ None otherwise.

                    -
                    -
                    + +

                    PyCTBN.PyCTBN.utility.json_importer module

                    @@ -531,8 +531,8 @@ as keys for the set of CIMS of a particular node.

                    -
                    -
                    + +

                    PyCTBN.PyCTBN.utility.sample_importer module

                    @@ -575,11 +575,11 @@ dataset

                    -
                    -
                    + +

                    Module contents

                    -
                    -
                    + +
                    diff --git a/docs-out/_build/html/PyCTBN.html b/docs-out/_build/html/PyCTBN.html index 1faa738..8f6f17f 100644 --- a/docs-out/_build/html/PyCTBN.html +++ b/docs-out/_build/html/PyCTBN.html @@ -58,7 +58,7 @@ -

                    Contents:

                    +

                    Contents:

                    • PyCTBN.PyCTBN package
                      • Subpackages
                      • @@ -112,9 +112,9 @@
                        -
                        +

                        PyCTBN package

                        -
                        +

                        Subpackages

                          @@ -166,14 +166,14 @@
                        -
                        -
                        +
                        +

                        Submodules

                        -
                        -
                        + +

                        Module contents

                        -
                        -
                        + +
                        diff --git a/docs-out/_build/html/PyCTBN.tests.estimators.html b/docs-out/_build/html/PyCTBN.tests.estimators.html index ab1bfc8..8a63d1f 100644 --- a/docs-out/_build/html/PyCTBN.tests.estimators.html +++ b/docs-out/_build/html/PyCTBN.tests.estimators.html @@ -58,7 +58,7 @@ -

                        Contents:

                        +

                        Contents:

                        • PyCTBN.PyCTBN package
                          • Subpackages
                          • @@ -112,12 +112,12 @@
                            -
                            +

                            PyCTBN.tests.estimators package

                            -
                            +

                            Submodules

                            -
                            -
                            +
                            +

                            PyCTBN.tests.estimators.test_parameters_estimator module

                            @@ -156,8 +156,8 @@
                            -
                            -
                            + +

                            PyCTBN.tests.estimators.test_structure_constraint_based_estimator module

                            @@ -186,8 +186,8 @@
                            -
                            -
                            + +

                            PyCTBN.tests.estimators.test_structure_estimator module

                            @@ -241,8 +241,8 @@
                            -
                            -
                            + +

                            PyCTBN.tests.estimators.test_structure_score_based_estimator module

                            @@ -276,11 +276,11 @@
                            -
                            -
                            + +

                            Module contents

                            -
                            -
                            + +
                            diff --git a/docs-out/_build/html/PyCTBN.tests.html b/docs-out/_build/html/PyCTBN.tests.html index dc6280d..83be260 100644 --- a/docs-out/_build/html/PyCTBN.tests.html +++ b/docs-out/_build/html/PyCTBN.tests.html @@ -58,7 +58,7 @@ -

                            Contents:

                            +

                            Contents:

                            • PyCTBN.PyCTBN package
                              • Subpackages
                              • @@ -112,9 +112,9 @@
                                -
                                +

                                PyCTBN.tests package

                                -
                                +

                                Subpackages

                                  @@ -155,11 +155,11 @@
                                -
                                -
                                +
                                +

                                Module contents

                                -
                                -
                                + +
                                diff --git a/docs-out/_build/html/PyCTBN.tests.optimizers.html b/docs-out/_build/html/PyCTBN.tests.optimizers.html index 20e937a..96038cc 100644 --- a/docs-out/_build/html/PyCTBN.tests.optimizers.html +++ b/docs-out/_build/html/PyCTBN.tests.optimizers.html @@ -58,7 +58,7 @@ -

                                Contents:

                                +

                                Contents:

                                • PyCTBN.PyCTBN package
                                  • Subpackages
                                  • @@ -112,12 +112,12 @@
                                    -
                                    +

                                    PyCTBN.tests.optimizers package

                                    -
                                    +

                                    Submodules

                                    -
                                    -
                                    +
                                    - -
                                    + +

                                    Module contents

                                    -
                                    -
                                    + +
                                    diff --git a/docs-out/_build/html/PyCTBN.tests.structure_graph.html b/docs-out/_build/html/PyCTBN.tests.structure_graph.html index f87e7db..f3dae53 100644 --- a/docs-out/_build/html/PyCTBN.tests.structure_graph.html +++ b/docs-out/_build/html/PyCTBN.tests.structure_graph.html @@ -58,7 +58,7 @@ -

                                    Contents:

                                    +

                                    Contents:

                                    • PyCTBN.PyCTBN package
                                      • Subpackages
                                      • @@ -112,12 +112,12 @@
                                        -
                                        +

                                        PyCTBN.tests.structure_graph package

                                        -
                                        +

                                        Submodules

                                        -
                                        -
                                        +
                                        +

                                        PyCTBN.tests.structure_graph.test_cim module

                                        @@ -146,8 +146,8 @@
                                        -
                                        -
                                        + +

                                        PyCTBN.tests.structure_graph.test_networkgraph module

                                        @@ -251,8 +251,8 @@
                                        -
                                        -
                                        + +

                                        PyCTBN.tests.structure_graph.test_sample_path module

                                        @@ -311,8 +311,8 @@
                                        -
                                        -
                                        + +

                                        PyCTBN.tests.structure_graph.test_setofcims module

                                        @@ -368,8 +368,8 @@
                                        -
                                        -
                                        + +

                                        PyCTBN.tests.structure_graph.test_structure module

                                        @@ -423,8 +423,8 @@
                                        -
                                        -
                                        + +

                                        PyCTBN.tests.structure_graph.test_trajectory module

                                        @@ -443,11 +443,11 @@
                                        -
                                        -
                                        + +

                                        Module contents

                                        -
                                        -
                                        + +
                                        diff --git a/docs-out/_build/html/PyCTBN.tests.utility.html b/docs-out/_build/html/PyCTBN.tests.utility.html index 0cd5380..606ce71 100644 --- a/docs-out/_build/html/PyCTBN.tests.utility.html +++ b/docs-out/_build/html/PyCTBN.tests.utility.html @@ -58,7 +58,7 @@ -

                                        Contents:

                                        +

                                        Contents:

                                        • PyCTBN.PyCTBN package
                                          • Subpackages
                                          • @@ -112,12 +112,12 @@
                                            -
                                            +

                                            PyCTBN.tests.utility package

                                            -
                                            +

                                            Submodules

                                            -
                                            -
                                            +
                                            +

                                            PyCTBN.tests.utility.test_cache module

                                            @@ -145,8 +145,8 @@
                                            -
                                            -
                                            + +

                                            PyCTBN.tests.utility.test_json_importer module

                                            @@ -255,8 +255,8 @@
                                            -
                                            -
                                            + +

                                            PyCTBN.tests.utility.test_sample_importer module

                                            @@ -285,11 +285,11 @@
                                            -
                                            -
                                            + +

                                            Module contents

                                            -
                                            -
                                            + +
                                            diff --git a/docs-out/_build/html/basic_main.html b/docs-out/_build/html/basic_main.html index 1ba75f4..a74fa74 100644 --- a/docs-out/_build/html/basic_main.html +++ b/docs-out/_build/html/basic_main.html @@ -58,7 +58,7 @@ -

                                            Contents:

                                            +

                                            Contents:

                                            • PyCTBN.PyCTBN package
                                              • Subpackages
                                              • @@ -112,9 +112,9 @@
                                                -
                                                +

                                                basic_main module

                                                -
                                                +
                                                diff --git a/docs-out/_build/html/examples.html b/docs-out/_build/html/examples.html index 8bf8f53..94a79a7 100644 --- a/docs-out/_build/html/examples.html +++ b/docs-out/_build/html/examples.html @@ -59,7 +59,7 @@ -

                                                Contents:

                                                +

                                                Contents:

                                                • PyCTBN.PyCTBN package
                                                  • Subpackages
                                                  • @@ -113,16 +113,16 @@
                                                    -
                                                    +

                                                    Examples

                                                    -
                                                    +

                                                    Installation/Usage

                                                    Download the release in .tar.gz or .whl format and simply use pip install to install it:

                                                    $pip install PyCTBN-1.0.tar.gz
                                                     
                                                    -
                                                    -
                                                    +
                                                    +

                                                    Implementing your own data importer

                                                    """This example demonstrates the implementation of a simple data importer the extends the class abstract importer to import data in csv format.
                                                     The net in exam has three ternary nodes and no prior net structure.
                                                    @@ -161,8 +161,8 @@
                                                             pass
                                                     
                                                    -
                                                    -
                                                    + +

                                                    Parameters Estimation Example

                                                    from PyCTBN import JsonImporter
                                                     from PyCTBN import SamplePath
                                                    @@ -199,8 +199,8 @@
                                                         print(sofc1.actual_cims)
                                                     
                                                    -
                                                    -
                                                    + +

                                                    Structure Estimation Example

                                                    from PyCTBN import JsonImporter
                                                     from PyCTBN import SamplePath
                                                    @@ -230,8 +230,8 @@
                                                         se1.save_results()
                                                     
                                                    -
                                                    -
                                                    + +
                                                    diff --git a/docs-out/_build/html/genindex.html b/docs-out/_build/html/genindex.html index 0dea95f..bd2996c 100644 --- a/docs-out/_build/html/genindex.html +++ b/docs-out/_build/html/genindex.html @@ -58,7 +58,7 @@ -

                                                    Contents:

                                                    +

                                                    Contents:

                                                    • PyCTBN.PyCTBN package
                                                      • Subpackages
                                                      • diff --git a/docs-out/_build/html/index.html b/docs-out/_build/html/index.html index f262fe7..996979e 100644 --- a/docs-out/_build/html/index.html +++ b/docs-out/_build/html/index.html @@ -59,7 +59,7 @@ -

                                                        Contents:

                                                        +

                                                        Contents:

                                                        • PyCTBN.PyCTBN package
                                                          • Subpackages
                                                          • @@ -113,10 +113,10 @@
                                                            -
                                                            +

                                                            Welcome to PyCTBN’s documentation!

                                                            -

                                                            Contents:

                                                            +

                                                            Contents:

                                                            -
                                                            -
                                                            + +

                                                            Indices and tables

                                                            -
                                                            +
                                                            diff --git a/docs-out/_build/html/modules.html b/docs-out/_build/html/modules.html index 28d3d3b..2540d43 100644 --- a/docs-out/_build/html/modules.html +++ b/docs-out/_build/html/modules.html @@ -58,7 +58,7 @@ -

                                                            Contents:

                                                            +

                                                            Contents:

                                                            • PyCTBN.PyCTBN package
                                                              • Subpackages
                                                              • @@ -112,7 +112,7 @@
                                                                -
                                                                +

                                                                PyCTBN

                                                                  @@ -171,7 +171,7 @@
                                                                -
                                                                +
                                                                diff --git a/docs-out/_build/html/py-modindex.html b/docs-out/_build/html/py-modindex.html index 809febd..d729367 100644 --- a/docs-out/_build/html/py-modindex.html +++ b/docs-out/_build/html/py-modindex.html @@ -61,7 +61,7 @@ -

                                                                Contents:

                                                                +

                                                                Contents:

                                                                • PyCTBN.PyCTBN package
                                                                  • Subpackages
                                                                  • diff --git a/docs-out/_build/html/search.html b/docs-out/_build/html/search.html index b9884b3..21fd6c9 100644 --- a/docs-out/_build/html/search.html +++ b/docs-out/_build/html/search.html @@ -58,7 +58,7 @@ -

                                                                    Contents:

                                                                    +

                                                                    Contents:

                                                                    • PyCTBN.PyCTBN package
                                                                      • Subpackages
                                                                      • diff --git a/docs-out/_build/html/searchindex.js b/docs-out/_build/html/searchindex.js index 051c818..7d0597c 100644 --- a/docs-out/_build/html/searchindex.js +++ b/docs-out/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["PyCTBN","PyCTBN.PyCTBN","PyCTBN.PyCTBN.estimators","PyCTBN.PyCTBN.optimizers","PyCTBN.PyCTBN.structure_graph","PyCTBN.PyCTBN.utility","PyCTBN.tests","PyCTBN.tests.estimators","PyCTBN.tests.optimizers","PyCTBN.tests.structure_graph","PyCTBN.tests.utility","basic_main","examples","index","modules","setup"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["PyCTBN.rst","PyCTBN.PyCTBN.rst","PyCTBN.PyCTBN.estimators.rst","PyCTBN.PyCTBN.optimizers.rst","PyCTBN.PyCTBN.structure_graph.rst","PyCTBN.PyCTBN.utility.rst","PyCTBN.tests.rst","PyCTBN.tests.estimators.rst","PyCTBN.tests.optimizers.rst","PyCTBN.tests.structure_graph.rst","PyCTBN.tests.utility.rst","basic_main.rst","examples.rst","index.rst","modules.rst","setup.rst"],objects:{"":{PyCTBN:[0,0,0,"-"]},"PyCTBN.PyCTBN":{estimators:[2,0,0,"-"],optimizers:[3,0,0,"-"],structure_graph:[4,0,0,"-"],utility:[5,0,0,"-"]},"PyCTBN.PyCTBN.estimators":{fam_score_calculator:[2,0,0,"-"],parameters_estimator:[2,0,0,"-"],structure_constraint_based_estimator:[2,0,0,"-"],structure_estimator:[2,0,0,"-"],structure_score_based_estimator:[2,0,0,"-"]},"PyCTBN.PyCTBN.estimators.fam_score_calculator":{FamScoreCalculator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator":{get_fam_score:[2,2,1,""],marginal_likelihood_q:[2,2,1,""],marginal_likelihood_theta:[2,2,1,""],single_cim_xu_marginal_likelihood_q:[2,2,1,""],single_cim_xu_marginal_likelihood_theta:[2,2,1,""],single_internal_cim_xxu_marginal_likelihood_theta:[2,2,1,""],variable_cim_xu_marginal_likelihood_q:[2,2,1,""],variable_cim_xu_marginal_likelihood_theta:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator":{ParametersEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator":{compute_parameters_for_node:[2,2,1,""],compute_state_res_time_for_node:[2,2,1,""],compute_state_transitions_for_a_node:[2,2,1,""],fast_init:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator":{StructureConstraintBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator":{complete_test:[2,2,1,""],compute_thumb_value:[2,2,1,""],ctpc_algorithm:[2,2,1,""],estimate_structure:[2,2,1,""],independence_test:[2,2,1,""],one_iteration_of_CTPC_algorithm:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator":{StructureEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator":{adjacency_matrix:[2,2,1,""],build_complete_graph:[2,2,1,""],build_removable_edges_matrix:[2,2,1,""],estimate_structure:[2,2,1,""],generate_possible_sub_sets_of_size:[2,2,1,""],save_plot_estimated_structure_graph:[2,2,1,""],save_results:[2,2,1,""],spurious_edges:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator":{StructureScoreBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator":{estimate_parents:[2,2,1,""],estimate_structure:[2,2,1,""],get_score_from_graph:[2,2,1,""]},"PyCTBN.PyCTBN.optimizers":{constraint_based_optimizer:[3,0,0,"-"],hill_climbing_search:[3,0,0,"-"],optimizer:[3,0,0,"-"],tabu_search:[3,0,0,"-"]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer":{ConstraintBasedOptimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search":{HillClimbing:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search.HillClimbing":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer":{Optimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer.Optimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search":{TabuSearch:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search.TabuSearch":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.structure_graph":{conditional_intensity_matrix:[4,0,0,"-"],network_graph:[4,0,0,"-"],sample_path:[4,0,0,"-"],set_of_cims:[4,0,0,"-"],structure:[4,0,0,"-"],trajectory:[4,0,0,"-"]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix":{ConditionalIntensityMatrix:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix":{cim:[4,2,1,""],compute_cim_coefficients:[4,2,1,""],state_residence_times:[4,2,1,""],state_transition_matrix:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph":{NetworkGraph:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph":{add_edges:[4,2,1,""],add_nodes:[4,2,1,""],build_p_comb_structure_for_a_node:[4,2,1,""],build_time_columns_filtering_for_a_node:[4,2,1,""],build_time_scalar_indexing_structure_for_a_node:[4,2,1,""],build_transition_filtering_for_a_node:[4,2,1,""],build_transition_scalar_indexing_structure_for_a_node:[4,2,1,""],clear_indexing_filtering_structures:[4,2,1,""],edges:[4,2,1,""],fast_init:[4,2,1,""],get_node_indx:[4,2,1,""],get_ordered_by_indx_set_of_parents:[4,2,1,""],get_parents_by_id:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],has_edge:[4,2,1,""],nodes:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_values:[4,2,1,""],p_combs:[4,2,1,""],remove_edges:[4,2,1,""],remove_node:[4,2,1,""],time_filtering:[4,2,1,""],time_scalar_indexing_strucure:[4,2,1,""],transition_filtering:[4,2,1,""],transition_scalar_indexing_structure:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path":{SamplePath:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath":{build_structure:[4,2,1,""],build_trajectories:[4,2,1,""],clear_memory:[4,2,1,""],has_prior_net_structure:[4,2,1,""],structure:[4,2,1,""],total_variables_count:[4,2,1,""],trajectories:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims":{SetOfCims:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims":{actual_cims:[4,2,1,""],build_cims:[4,2,1,""],build_times_and_transitions_structures:[4,2,1,""],filter_cims_with_mask:[4,2,1,""],get_cims_number:[4,2,1,""],p_combs:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.structure":{Structure:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.structure.Structure":{add_edge:[4,2,1,""],clean_structure_edges:[4,2,1,""],contains_edge:[4,2,1,""],edges:[4,2,1,""],get_node_id:[4,2,1,""],get_node_indx:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_labels:[4,2,1,""],nodes_values:[4,2,1,""],remove_edge:[4,2,1,""],remove_node:[4,2,1,""],total_variables_number:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory":{Trajectory:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory":{complete_trajectory:[4,2,1,""],size:[4,2,1,""],times:[4,2,1,""],trajectory:[4,2,1,""]},"PyCTBN.PyCTBN.utility":{abstract_importer:[5,0,0,"-"],cache:[5,0,0,"-"],json_importer:[5,0,0,"-"],sample_importer:[5,0,0,"-"]},"PyCTBN.PyCTBN.utility.abstract_importer":{AbstractImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter":{build_list_of_samples_array:[5,2,1,""],build_sorter:[5,2,1,""],clear_concatenated_frame:[5,2,1,""],compute_row_delta_in_all_samples_frames:[5,2,1,""],compute_row_delta_sigle_samples_frame:[5,2,1,""],concatenated_samples:[5,2,1,""],dataset_id:[5,2,1,""],file_path:[5,2,1,""],sorter:[5,2,1,""],structure:[5,2,1,""],variables:[5,2,1,""]},"PyCTBN.PyCTBN.utility.cache":{Cache:[5,1,1,""]},"PyCTBN.PyCTBN.utility.cache.Cache":{clear:[5,2,1,""],find:[5,2,1,""],put:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_importer":{JsonImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_importer.JsonImporter":{build_sorter:[5,2,1,""],clear_data_frame_list:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""],import_sampled_cims:[5,2,1,""],import_structure:[5,2,1,""],import_trajectories:[5,2,1,""],import_variables:[5,2,1,""],normalize_trajectories:[5,2,1,""],one_level_normalizing:[5,2,1,""],read_json_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.sample_importer":{SampleImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.sample_importer.SampleImporter":{build_sorter:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""]},"PyCTBN.tests":{estimators:[7,0,0,"-"],optimizers:[8,0,0,"-"],structure_graph:[9,0,0,"-"],utility:[10,0,0,"-"]},"PyCTBN.tests.estimators":{test_parameters_estimator:[7,0,0,"-"],test_structure_constraint_based_estimator:[7,0,0,"-"],test_structure_estimator:[7,0,0,"-"],test_structure_score_based_estimator:[7,0,0,"-"]},"PyCTBN.tests.estimators.test_parameters_estimator":{TestParametersEstimatior:[7,1,1,""]},"PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior":{aux_import_sampled_cims:[7,2,1,""],cim_equality_test:[7,2,1,""],equality_of_cims_of_node:[7,2,1,""],setUpClass:[7,2,1,""],test_compute_parameters_for_node:[7,2,1,""],test_fast_init:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator":{TestStructureConstraintBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_estimator":{TestStructureEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator":{setUpClass:[7,2,1,""],test_adjacency_matrix:[7,2,1,""],test_build_complete_graph:[7,2,1,""],test_build_removable_edges_matrix:[7,2,1,""],test_generate_possible_sub_sets_of_size:[7,2,1,""],test_init:[7,2,1,""],test_save_plot_estimated_graph:[7,2,1,""],test_save_results:[7,2,1,""],test_time:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator":{TestStructureScoreBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""],test_structure_monoprocesso:[7,2,1,""]},"PyCTBN.tests.optimizers":{test_hill_climbing_search:[8,0,0,"-"],test_tabu_search:[8,0,0,"-"]},"PyCTBN.tests.optimizers.test_hill_climbing_search":{TestHillClimbingSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_hill_climbing_search.TestHillClimbingSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.optimizers.test_tabu_search":{TestTabuSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_tabu_search.TestTabuSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.structure_graph":{test_cim:[9,0,0,"-"],test_networkgraph:[9,0,0,"-"],test_sample_path:[9,0,0,"-"],test_setofcims:[9,0,0,"-"],test_structure:[9,0,0,"-"],test_trajectory:[9,0,0,"-"]},"PyCTBN.tests.structure_graph.test_cim":{TestConditionalIntensityMatrix:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix":{setUpClass:[9,2,1,""],test_compute_cim_coefficients:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph":{TestNetworkGraph:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph":{aux_build_p_combs_structure:[9,2,1,""],aux_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],aux_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],aux_build_transition_columns_filtering_structure:[9,2,1,""],aux_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_add_edges:[9,2,1,""],test_add_nodes:[9,2,1,""],test_build_p_combs_structure:[9,2,1,""],test_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],test_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],test_build_transition_columns_filtering_structure:[9,2,1,""],test_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],test_fast_init:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_ordered_by_indx_set_of_parents:[9,2,1,""],test_get_parents_by_id:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_sample_path":{TestSamplePath:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath":{setUpClass:[9,2,1,""],test_buid_samplepath_no_concatenated_samples:[9,2,1,""],test_buid_samplepath_no_variables:[9,2,1,""],test_build_saplepath_no_prior_net_structure:[9,2,1,""],test_build_structure:[9,2,1,""],test_build_structure_bad_sorter:[9,2,1,""],test_build_trajectories:[9,2,1,""],test_init:[9,2,1,""],test_init_not_filled_dataframse:[9,2,1,""],test_init_not_initialized_importer:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_setofcims":{TestSetOfCims:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims":{another_filtering_method:[9,2,1,""],aux_test_build_cims:[9,2,1,""],aux_test_init:[9,2,1,""],build_p_comb_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_build_cims:[9,2,1,""],test_filter_cims_with_mask:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_structure":{TestStructure:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_structure.TestStructure":{setUpClass:[9,2,1,""],test_edges_operations:[9,2,1,""],test_equality:[9,2,1,""],test_get_node_id:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_positional_node_indx:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectory":{TestTrajectory:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory":{setUpClass:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.utility":{test_cache:[10,0,0,"-"],test_json_importer:[10,0,0,"-"],test_sample_importer:[10,0,0,"-"]},"PyCTBN.tests.utility.test_cache":{TestCache:[10,1,1,""]},"PyCTBN.tests.utility.test_cache.TestCache":{test_clear:[10,2,1,""],test_find:[10,2,1,""],test_init:[10,2,1,""],test_put:[10,2,1,""]},"PyCTBN.tests.utility.test_json_importer":{TestJsonImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_json_importer.TestJsonImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_build_sorter:[10,2,1,""],test_clear_concatenated_frame:[10,2,1,""],test_clear_data_frame_list:[10,2,1,""],test_compute_row_delta_in_all_frames:[10,2,1,""],test_compute_row_delta_in_all_frames_not_init_sorter:[10,2,1,""],test_compute_row_delta_single_samples_frame:[10,2,1,""],test_dataset_id:[10,2,1,""],test_file_path:[10,2,1,""],test_import_data:[10,2,1,""],test_import_sampled_cims:[10,2,1,""],test_import_structure:[10,2,1,""],test_import_variables:[10,2,1,""],test_init:[10,2,1,""],test_normalize_trajectories:[10,2,1,""],test_normalize_trajectories_wrong_indx:[10,2,1,""],test_normalize_trajectories_wrong_key:[10,2,1,""],test_read_json_file_found:[10,2,1,""],test_read_json_file_not_found:[10,2,1,""]},"PyCTBN.tests.utility.test_sample_importer":{TestSampleImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_sample_importer.TestSampleImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_init:[10,2,1,""],test_order:[10,2,1,""]},PyCTBN:{PyCTBN:[1,0,0,"-"],tests:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"abstract":[2,3,4,5,12],"boolean":[2,4],"case":[7,8,9,10],"class":[2,3,4,5,7,8,9,10,12],"default":[2,3,5],"float":2,"function":2,"import":[4,5,13,14],"int":[2,3,4,5],"null":2,"return":[2,3,4,5,9,12],"static":[2,4],"super":12,"true":[2,12],"var":12,HAS:5,Has:[2,4],NOT:2,The:[2,4,5,12],Use:[2,12],__actual_cach:5,__init__:12,__list_of_sets_of_par:5,_actual_cim:4,_actual_trajectori:4,_aggregated_info_about_nodes_par:4,_array_indx:5,_cach:2,_cim:4,_complete_graph:2,_df_samples_list:[5,12],_df_structur:5,_df_variabl:[5,12],_file_path:12,_graph:[4,12],_import:4,_net_graph:2,_node:2,_node_id:4,_nodes_indx:2,_nodes_v:2,_p_combs_structur:4,_raw_data:5,_sample_path:2,_single_set_of_cim:2,_sorter:[5,12],_state_residence_tim:4,_structur:4,_structure_label:5,_time:4,_time_filt:4,_time_scalar_indexing_structur:4,_total_variables_count:4,_total_variables_numb:4,_trajectori:4,_transition_filt:4,_transition_matric:4,_transition_scalar_indexing_structur:4,_variables_label:5,abc:[3,5],about:[3,4],abstract_import:[0,1,4,13,14],abstractimport:[4,5,12],act:5,actual:[2,4],actual_cim:[4,12],add:[4,5],add_edg:4,add_nod:4,added:2,addit:2,adjac:[2,12],adjacency_matrix:[2,12],after:5,against:2,aggreg:4,algorithm:[2,3,12],all:[2,3,4,5,9,12],alpha_xu:2,alpha_xxu:2,alreadi:[5,12],also:[2,4],ani:[2,3],anoth:4,another_filtering_method:9,approach:2,arc:5,arrai:[2,4,5,12],assign:2,assum:2,aux_build_p_combs_structur:9,aux_build_time_columns_filtering_structure_for_a_nod:9,aux_build_time_scalar_indexing_structure_for_a_nod:9,aux_build_transition_columns_filtering_structur:9,aux_build_transition_scalar_indexing_structure_for_a_nod:9,aux_import_sampled_cim:7,aux_test_build_cim:9,aux_test_init:9,axi:12,base:[2,3,4,5,7,8,9,10],bayesian:2,befor:[2,3,7,8,9,10],belong:2,best:2,between:5,bool:[2,4],both:[2,5],bound:4,build:[2,4,5,9,12],build_cim:4,build_complete_graph:2,build_list_of_samples_arrai:5,build_p_comb_structure_for_a_nod:[4,9],build_removable_edges_matrix:2,build_sort:[5,12],build_structur:[4,12],build_time_columns_filtering_for_a_nod:4,build_time_scalar_indexing_structure_for_a_nod:4,build_times_and_transitions_structur:4,build_trajectori:[4,12],build_transition_filtering_for_a_nod:4,build_transition_scalar_indexing_structure_for_a_nod:4,built:2,cach:[0,1,2,13,14],calcul:2,call:[5,12],cardin:[2,4,5,9],cardinalit:[4,5],caridin:4,caridinalit:4,chang:[4,5],check:4,chi:2,chi_test:2,chi_test_alfa:2,child:[2,3],child_indx:2,child_states_numb:2,child_val:2,cim1:[2,7],cim2:[2,7],cim:[2,4,5,12],cim_equality_test:7,cims_kei:5,cims_label:7,classmethod:[7,8,9,10],clean_structure_edg:4,clear:[4,5],clear_concatenated_fram:5,clear_data_frame_list:5,clear_indexing_filtering_structur:4,clear_memori:4,climb:[2,3],coeffici:4,col:4,cols_filt:2,column:[2,4,5,12],columns_head:5,comb:4,combin:[4,5,9],combinatori:[4,9],common:2,complet:[2,4,5],complete_test:2,complete_trajectori:4,comput:[2,3,4,5,12],compute_cim_coeffici:4,compute_parameters_for_nod:[2,12],compute_row_delta_in_all_samples_fram:[5,12],compute_row_delta_sigle_samples_fram:5,compute_state_res_time_for_nod:2,compute_state_transitions_for_a_nod:2,compute_thumb_valu:2,concatanated_sampl:5,concaten:[4,5],concatenated_sampl:5,condit:4,conditional_intensity_matrix:[0,1,2,13,14],conditionalintensitymatrix:[2,4],consid:[2,4],constraint:2,constraint_based_optim:[0,1,13,14],constraintbasedoptim:3,construct:[4,5,12],conta:5,contain:[2,4,5,9],contains_edg:4,content:[13,14],convert:[2,5],copi:5,core:5,correct:[4,5],could:2,count:4,creat:[2,4,12],csv:12,csvimport:12,ctbn:2,ctpc:[2,3,12],ctpc_algorithm:[2,12],current:[2,3,5],cut:5,dafram:5,data:[2,3,4,5,13,14],datafram:[4,5,12],dataset:[3,4,5],dataset_id:[5,12],datfram:5,def:12,defin:5,definit:5,defualt:2,delta:[2,4,5],demonstr:12,describ:5,desir:[2,4],df_samples_list:5,dict:[5,12],dictionari:5,differ:5,differt:2,digraph:2,dimens:4,dir:12,direct:[2,4],directli:5,disabl:[2,3],disable_multiprocess:2,distribuit:2,doc:5,doubl:4,download:12,drop:12,duplic:4,dyn:12,each:[2,3,5],edg:[2,4,5,12],edges_list:4,end:5,entir:2,equal:4,equality_of_cims_of_nod:7,est:12,estim:[0,1,3,4,6,13,14],estimate_par:2,estimate_structur:2,estimated_cim:7,everi:[4,5],exam:12,exampl:[5,13,14],exclud:2,exctract:5,exist:5,exp_test_alfa:2,exponenti:2,expos:5,extend:12,extens:[2,5],extract:[4,5],fals:2,fam_score_calcul:[0,1,13,14],famscor:2,famscorecalcul:2,fast_init:[2,4,12],file:[2,5,12],file_path:[2,5,12],filepath:5,fill:[2,12],filter:[2,4],filter_cims_with_mask:4,find:[2,5],first:[2,12],fixtur:[7,8,9,10],follow:[4,5],form:4,format:12,formula:2,found:5,frame:5,from:[4,5,12],from_nod:5,gener:2,generate_possible_sub_sets_of_s:2,get:[2,5],get_cims_numb:4,get_fam_scor:2,get_node_id:4,get_node_indx:4,get_ordered_by_indx_set_of_par:4,get_parents_by_id:4,get_positional_node_indx:4,get_score_from_graph:2,get_states_numb:4,given:[2,4,5],glob:12,graph:[2,4,9,12],graph_struct:4,graphic:2,grid:[4,9],grpah:12,has:[5,12],has_edg:4,has_prior_net_structur:4,have:5,header:5,header_column:5,hill:[2,3],hill_climbing_search:[0,1,13,14],hillclimb:3,hold:[2,4],hook:[7,8,9,10],how:5,hyperparamet:2,hypothesi:2,identifi:[2,4,5],iff:2,implement:[3,5,13,14],import_data:[5,12],import_sampled_cim:5,import_structur:5,import_trajectori:5,import_vari:[5,12],improv:[2,3],includ:2,independ:2,independence_test:2,index:[2,4,5,12,13],indic:4,indx:5,info:[4,12],inform:[3,4],init:12,initi:[2,4,5,12],inplac:12,insid:12,instal:[13,14],interest:4,interfac:3,intes:4,iter:[2,3],iterations_numb:[2,3],its:[2,3],join:12,json:[2,5,12],json_import:[0,1,13,14],jsonarrai:5,jsonimport:[5,12],keep:[2,3,5],kei:5,kind:2,knowledg:2,known:2,known_edg:2,label:[2,3,4,5],lenght:[2,3],level:[2,5],likelihood:2,list:[2,3,4,5,12],list_of_column:4,list_of_edg:4,list_of_nod:4,load:5,loop:2,m_xu_suff_stat:2,m_xxu_suff_stat:2,main:12,margin:2,marginal_likelihood_q:2,marginal_likelihood_theta:2,mask:[4,9],mask_arr:4,matric:[2,4],matrix:[2,4,5,9,12],max_par:[2,3],maximum:[2,3],member:[4,5],mention:4,merg:5,method:[2,5,7,8,9,10],methodnam:[7,8,9,10],model:2,modul:[13,14],multipl:5,multiprocess:2,name:[2,4,5,12],ndarrai:[2,4,5],necessari:[2,4,5],nest:5,net:[2,3,4,5,12],net_graph:2,network:[2,4,5],network_graph:[0,1,2,13,14],networkgraph:[2,4,12],networkx:2,node:[2,3,4,5,9,12],node_id:[2,3,4,9],node_index:4,node_indx:[2,4],node_st:[4,9],node_states_numb:[4,9],nodes_index:4,nodes_indexes_arr:4,nodes_label:4,nodes_labels_list:4,nodes_numb:4,nodes_vals_arr:4,nodes_valu:[4,12],none:[2,3,4,5,7,9,10,12],normal:5,normalize_trajectori:5,number:[2,3,4],numpi:[2,4,5,9],obj:[10,12],object:[2,3,4,5,12],one:[4,5],one_iteration_of_ctpc_algorithm:2,one_level_norm:5,onli:5,oper:2,optim:[0,1,2,6,13,14],optimize_structur:3,option:[2,3],order:[2,5,10],origin:5,original_cols_numb:4,otherwis:[2,5],out:5,outer:[5,12],over:2,own:[13,14],p_comb:[4,9],p_indx:[4,9],p_val:9,p_valu:9,packag:[13,14],page:13,panda:[5,12],param:4,paramet:[2,3,4,5,9,13,14],parameters_estim:[0,1,13,14],parametersestim:[2,12],parent:[2,3,4,5],parent_indx:2,parent_label:2,parent_set:2,parent_set_v:2,parent_v:2,parent_valu:9,parents_cardin:4,parents_comb:5,parents_index:4,parents_indx:9,parents_label:[4,9],parents_states_numb:[4,9],parents_v:[4,9],parents_valu:[4,9],part:2,particular:[2,5],pass:12,path:[2,5,12],patienc:[2,3],peest:12,perform:2,pip:12,place:5,plot:2,png:2,posit:[4,5],possibl:[2,4],predict:3,prepar:5,present:[2,5],print:12,prior:[2,12],prior_net_structur:5,process:[2,3,4,5],properli:5,properti:[4,5],put:5,pyctbn:12,q_xx:4,rappres:4,raw:5,raw_data:5,read:[5,12],read_csv:12,read_csv_fil:12,read_fil:12,read_json_fil:5,real:[2,4,5,12],refer:[4,5],reject:2,rel:4,relat:5,releas:12,remain:5,remov:[2,4,5],remove_edg:4,remove_nod:4,repres:4,represent:2,res:4,resid:[2,4],result:[2,5,12],rtype:4,rule:[2,3],run:[7,8,9,10],runtest:[7,8,9,10],same:5,sampl:[4,5,12],sample_fram:[5,12],sample_import:[0,1,13,14],sample_path:[0,1,2,13,14],sampled_cim:7,sampleimport:5,samplepath:[2,4,12],samples_label:5,save:[2,12],save_plot_estimated_structure_graph:2,save_result:[2,12],scalar_index:2,scalar_indexes_struct:2,score:2,se1:12,search:[2,3,13],second:2,see:5,select:12,self:[2,5,12],sep:2,sep_set:2,set:[2,4,5,7,8,9,10],set_of_cim:[0,1,2,5,13,14],setofcim:[2,4,5,12],setupclass:[7,8,9,10],shift:[4,5],shifted_cols_head:5,show:2,signific:2,simbol:5,simpl:12,simpli:12,sinc:4,single_cim_xu_marginal_likelihood_q:2,single_cim_xu_marginal_likelihood_theta:2,single_internal_cim_xxu_marginal_likelihood_theta:2,size:[2,4],socim:5,sofc1:12,sorter:5,specif:[2,4,12],spuriou:2,spurious_edg:2,start:5,state:[2,4],state_res_tim:4,state_residence_tim:4,state_transition_matrix:4,statist:2,stop:[2,3],str:[2,3,4,5,12],string:[2,3,4,5],structur:[0,1,2,3,5,9,13,14],structure_constraint_based_estim:[0,1,13,14],structure_estim:[0,1,3,13,14],structure_estimation_exampl:12,structure_graph:[0,1,2,5,6,13,14],structure_label:5,structure_score_based_estim:[0,1,13,14],structureconstraintbasedestim:2,structureestim:[2,3,12],structurescorebasedestim:2,structut:4,style:2,submodul:[1,6,13,14],subpackag:[13,14],subset:2,suffici:2,suffuci:2,symbol:[4,5],synthet:5,t_xu_suff_stat:2,tabu:[2,3],tabu_length:[2,3],tabu_rules_dur:[2,3],tabu_search:[0,1,13,14],tabusearch:3,take:12,tar:12,task:[2,4],tau_xu:2,ternari:12,test:2,test_add_edg:9,test_add_nod:9,test_adjacency_matrix:7,test_buid_samplepath_no_concatenated_sampl:9,test_buid_samplepath_no_vari:9,test_build_cim:9,test_build_complete_graph:7,test_build_p_combs_structur:9,test_build_removable_edges_matrix:7,test_build_saplepath_no_prior_net_structur:9,test_build_sort:10,test_build_structur:9,test_build_structure_bad_sort:9,test_build_time_columns_filtering_structure_for_a_nod:9,test_build_time_scalar_indexing_structure_for_a_nod:9,test_build_trajectori:9,test_build_transition_columns_filtering_structur:9,test_build_transition_scalar_indexing_structure_for_a_nod:9,test_cach:6,test_child:2,test_cim:6,test_clear:10,test_clear_concatenated_fram:10,test_clear_data_frame_list:10,test_compute_cim_coeffici:9,test_compute_parameters_for_nod:7,test_compute_row_delta_in_all_fram:10,test_compute_row_delta_in_all_frames_not_init_sort:10,test_compute_row_delta_single_samples_fram:10,test_dataset_id:10,test_edges_oper:9,test_equ:9,test_fast_init:[7,9],test_file_path:10,test_filter_cims_with_mask:9,test_find:10,test_generate_possible_sub_sets_of_s:7,test_get_node_id:9,test_get_node_indx:9,test_get_ordered_by_indx_set_of_par:9,test_get_parents_by_id:9,test_get_positional_node_indx:9,test_get_states_numb:9,test_hill_climbing_search:6,test_import_data:10,test_import_sampled_cim:10,test_import_structur:10,test_import_vari:10,test_init:[7,9,10],test_init_not_filled_dataframs:9,test_init_not_initialized_import:9,test_json_import:6,test_networkgraph:6,test_normalize_trajectori:10,test_normalize_trajectories_wrong_indx:10,test_normalize_trajectories_wrong_kei:10,test_ord:10,test_par:2,test_parameters_estim:6,test_put:10,test_read_json_file_found:10,test_read_json_file_not_found:10,test_repr:9,test_sample_import:6,test_sample_path:6,test_save_plot_estimated_graph:7,test_save_result:7,test_setofcim:6,test_structur:[6,8],test_structure_1:7,test_structure_2:7,test_structure_3:[7,8],test_structure_constraint_based_estim:6,test_structure_estim:6,test_structure_monoprocesso:7,test_structure_score_based_estim:6,test_tabu_search:6,test_tim:7,test_trajectori:6,testcach:10,testcas:[7,8,9,10],testconditionalintensitymatrix:9,testhillclimbingsearch:8,testjsonimport:10,testnetworkgraph:9,testparametersestimatior:7,testsampleimport:10,testsamplepath:9,testsetofcim:9,teststructur:9,teststructureconstraintbasedestim:7,teststructureestim:7,teststructurescorebasedestim:7,testtabusearch:8,testtrajectori:9,tha:5,theta:2,thi:[2,4,5,12],three:12,threshold:2,thumb:2,thumb_threshold:2,thumb_valu:2,time:[2,4,5,12],time_filt:4,time_kei:5,time_scalar_indexing_strucur:4,timestamp:5,to_nod:5,tot_vars_count:[2,3],total:[2,4],total_variables_count:4,total_variables_numb:4,traj:5,trajecory_head:5,trajectori:[0,1,2,5,12,13,14],trajectories_kei:5,trajectory_list:5,trajectri:12,transit:[2,4,5],transition_filt:4,transition_matric:4,transition_scalar_indexing_structur:4,tri:5,tupl:4,tutori:5,two:2,type:[2,3,4,5,12],union:5,uniqu:5,unittest:[7,8,9,10],unus:4,usag:[13,14],use:[2,12],used:[2,3,4,5],using:[2,3,4,5],util:[0,1,4,6,13,14],valid:2,valu:[2,3,4,5,9,12],values_list:12,var_id:2,variabl:[2,3,4,5,12],variable_cardin:5,variable_cim_xu_marginal_likelihood_q:2,variable_cim_xu_marginal_likelihood_theta:2,variable_label:5,variables_kei:5,variables_label:5,vector:[2,4],want:12,when:2,where:5,which:[2,3,4,5],whl:12,who:2,without:[2,3],you:[2,5,12],your:[13,14]},titles:["PyCTBN package","PyCTBN.PyCTBN package","PyCTBN.PyCTBN.estimators package","PyCTBN.PyCTBN.optimizers package","PyCTBN.PyCTBN.structure_graph package","PyCTBN.PyCTBN.utility package","PyCTBN.tests package","PyCTBN.tests.estimators package","PyCTBN.tests.optimizers package","PyCTBN.tests.structure_graph package","PyCTBN.tests.utility package","basic_main module","Examples","Welcome to PyCTBN\u2019s documentation!","PyCTBN","setup module"],titleterms:{"import":12,abstract_import:5,basic_main:11,cach:5,conditional_intensity_matrix:4,constraint_based_optim:3,content:[0,1,2,3,4,5,6,7,8,9,10],data:12,document:13,estim:[2,7,12],exampl:12,fam_score_calcul:2,hill_climbing_search:3,implement:12,indic:13,instal:12,json_import:5,modul:[0,1,2,3,4,5,6,7,8,9,10,11,15],network_graph:4,optim:[3,8],own:12,packag:[0,1,2,3,4,5,6,7,8,9,10],paramet:12,parameters_estim:2,pyctbn:[0,1,2,3,4,5,6,7,8,9,10,13,14],sample_import:5,sample_path:4,set_of_cim:4,setup:15,structur:[4,12],structure_constraint_based_estim:2,structure_estim:2,structure_graph:[4,9],structure_score_based_estim:2,submodul:[0,2,3,4,5,7,8,9,10],subpackag:[0,1,6],tabl:13,tabu_search:3,test:[6,7,8,9,10],test_cach:10,test_cim:9,test_hill_climbing_search:8,test_json_import:10,test_networkgraph:9,test_parameters_estim:7,test_sample_import:10,test_sample_path:9,test_setofcim:9,test_structur:9,test_structure_constraint_based_estim:7,test_structure_estim:7,test_structure_score_based_estim:7,test_tabu_search:8,test_trajectori:9,trajectori:4,usag:12,util:[5,10],welcom:13,your:12}}) \ No newline at end of file +Search.setIndex({docnames:["PyCTBN","PyCTBN.PyCTBN","PyCTBN.PyCTBN.estimators","PyCTBN.PyCTBN.optimizers","PyCTBN.PyCTBN.structure_graph","PyCTBN.PyCTBN.utility","PyCTBN.tests","PyCTBN.tests.estimators","PyCTBN.tests.optimizers","PyCTBN.tests.structure_graph","PyCTBN.tests.utility","basic_main","examples","index","modules","setup"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["PyCTBN.rst","PyCTBN.PyCTBN.rst","PyCTBN.PyCTBN.estimators.rst","PyCTBN.PyCTBN.optimizers.rst","PyCTBN.PyCTBN.structure_graph.rst","PyCTBN.PyCTBN.utility.rst","PyCTBN.tests.rst","PyCTBN.tests.estimators.rst","PyCTBN.tests.optimizers.rst","PyCTBN.tests.structure_graph.rst","PyCTBN.tests.utility.rst","basic_main.rst","examples.rst","index.rst","modules.rst","setup.rst"],objects:{"":{PyCTBN:[0,0,0,"-"]},"PyCTBN.PyCTBN":{estimators:[2,0,0,"-"],optimizers:[3,0,0,"-"],structure_graph:[4,0,0,"-"],utility:[5,0,0,"-"]},"PyCTBN.PyCTBN.estimators":{fam_score_calculator:[2,0,0,"-"],parameters_estimator:[2,0,0,"-"],structure_constraint_based_estimator:[2,0,0,"-"],structure_estimator:[2,0,0,"-"],structure_score_based_estimator:[2,0,0,"-"]},"PyCTBN.PyCTBN.estimators.fam_score_calculator":{FamScoreCalculator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator":{get_fam_score:[2,2,1,""],marginal_likelihood_q:[2,2,1,""],marginal_likelihood_theta:[2,2,1,""],single_cim_xu_marginal_likelihood_q:[2,2,1,""],single_cim_xu_marginal_likelihood_theta:[2,2,1,""],single_internal_cim_xxu_marginal_likelihood_theta:[2,2,1,""],variable_cim_xu_marginal_likelihood_q:[2,2,1,""],variable_cim_xu_marginal_likelihood_theta:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator":{ParametersEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator":{compute_parameters_for_node:[2,2,1,""],compute_state_res_time_for_node:[2,2,1,""],compute_state_transitions_for_a_node:[2,2,1,""],fast_init:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator":{StructureConstraintBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator":{complete_test:[2,2,1,""],compute_thumb_value:[2,2,1,""],ctpc_algorithm:[2,2,1,""],estimate_structure:[2,2,1,""],independence_test:[2,2,1,""],one_iteration_of_CTPC_algorithm:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator":{StructureEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator":{adjacency_matrix:[2,2,1,""],build_complete_graph:[2,2,1,""],build_removable_edges_matrix:[2,2,1,""],estimate_structure:[2,2,1,""],generate_possible_sub_sets_of_size:[2,2,1,""],save_plot_estimated_structure_graph:[2,2,1,""],save_results:[2,2,1,""],spurious_edges:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator":{StructureScoreBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator":{estimate_parents:[2,2,1,""],estimate_structure:[2,2,1,""],get_score_from_graph:[2,2,1,""]},"PyCTBN.PyCTBN.optimizers":{constraint_based_optimizer:[3,0,0,"-"],hill_climbing_search:[3,0,0,"-"],optimizer:[3,0,0,"-"],tabu_search:[3,0,0,"-"]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer":{ConstraintBasedOptimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search":{HillClimbing:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search.HillClimbing":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer":{Optimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer.Optimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search":{TabuSearch:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search.TabuSearch":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.structure_graph":{conditional_intensity_matrix:[4,0,0,"-"],network_graph:[4,0,0,"-"],sample_path:[4,0,0,"-"],set_of_cims:[4,0,0,"-"],structure:[4,0,0,"-"],trajectory:[4,0,0,"-"]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix":{ConditionalIntensityMatrix:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix":{cim:[4,2,1,""],compute_cim_coefficients:[4,2,1,""],state_residence_times:[4,2,1,""],state_transition_matrix:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph":{NetworkGraph:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph":{add_edges:[4,2,1,""],add_nodes:[4,2,1,""],build_p_comb_structure_for_a_node:[4,2,1,""],build_time_columns_filtering_for_a_node:[4,2,1,""],build_time_scalar_indexing_structure_for_a_node:[4,2,1,""],build_transition_filtering_for_a_node:[4,2,1,""],build_transition_scalar_indexing_structure_for_a_node:[4,2,1,""],clear_indexing_filtering_structures:[4,2,1,""],edges:[4,2,1,""],fast_init:[4,2,1,""],get_node_indx:[4,2,1,""],get_ordered_by_indx_set_of_parents:[4,2,1,""],get_parents_by_id:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],has_edge:[4,2,1,""],nodes:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_values:[4,2,1,""],p_combs:[4,2,1,""],remove_edges:[4,2,1,""],remove_node:[4,2,1,""],time_filtering:[4,2,1,""],time_scalar_indexing_strucure:[4,2,1,""],transition_filtering:[4,2,1,""],transition_scalar_indexing_structure:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path":{SamplePath:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath":{build_structure:[4,2,1,""],build_trajectories:[4,2,1,""],clear_memory:[4,2,1,""],has_prior_net_structure:[4,2,1,""],structure:[4,2,1,""],total_variables_count:[4,2,1,""],trajectories:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims":{SetOfCims:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims":{actual_cims:[4,2,1,""],build_cims:[4,2,1,""],build_times_and_transitions_structures:[4,2,1,""],filter_cims_with_mask:[4,2,1,""],get_cims_number:[4,2,1,""],p_combs:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.structure":{Structure:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.structure.Structure":{add_edge:[4,2,1,""],clean_structure_edges:[4,2,1,""],contains_edge:[4,2,1,""],edges:[4,2,1,""],get_node_id:[4,2,1,""],get_node_indx:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_labels:[4,2,1,""],nodes_values:[4,2,1,""],remove_edge:[4,2,1,""],remove_node:[4,2,1,""],total_variables_number:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory":{Trajectory:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory":{complete_trajectory:[4,2,1,""],size:[4,2,1,""],times:[4,2,1,""],trajectory:[4,2,1,""]},"PyCTBN.PyCTBN.utility":{abstract_importer:[5,0,0,"-"],cache:[5,0,0,"-"],json_importer:[5,0,0,"-"],sample_importer:[5,0,0,"-"]},"PyCTBN.PyCTBN.utility.abstract_importer":{AbstractImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter":{build_list_of_samples_array:[5,2,1,""],build_sorter:[5,2,1,""],clear_concatenated_frame:[5,2,1,""],compute_row_delta_in_all_samples_frames:[5,2,1,""],compute_row_delta_sigle_samples_frame:[5,2,1,""],concatenated_samples:[5,2,1,""],dataset_id:[5,2,1,""],file_path:[5,2,1,""],sorter:[5,2,1,""],structure:[5,2,1,""],variables:[5,2,1,""]},"PyCTBN.PyCTBN.utility.cache":{Cache:[5,1,1,""]},"PyCTBN.PyCTBN.utility.cache.Cache":{clear:[5,2,1,""],find:[5,2,1,""],put:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_importer":{JsonImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_importer.JsonImporter":{build_sorter:[5,2,1,""],clear_data_frame_list:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""],import_sampled_cims:[5,2,1,""],import_structure:[5,2,1,""],import_trajectories:[5,2,1,""],import_variables:[5,2,1,""],normalize_trajectories:[5,2,1,""],one_level_normalizing:[5,2,1,""],read_json_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.sample_importer":{SampleImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.sample_importer.SampleImporter":{build_sorter:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""]},"PyCTBN.tests":{estimators:[7,0,0,"-"],optimizers:[8,0,0,"-"],structure_graph:[9,0,0,"-"],utility:[10,0,0,"-"]},"PyCTBN.tests.estimators":{test_parameters_estimator:[7,0,0,"-"],test_structure_constraint_based_estimator:[7,0,0,"-"],test_structure_estimator:[7,0,0,"-"],test_structure_score_based_estimator:[7,0,0,"-"]},"PyCTBN.tests.estimators.test_parameters_estimator":{TestParametersEstimatior:[7,1,1,""]},"PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior":{aux_import_sampled_cims:[7,2,1,""],cim_equality_test:[7,2,1,""],equality_of_cims_of_node:[7,2,1,""],setUpClass:[7,2,1,""],test_compute_parameters_for_node:[7,2,1,""],test_fast_init:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator":{TestStructureConstraintBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_estimator":{TestStructureEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator":{setUpClass:[7,2,1,""],test_adjacency_matrix:[7,2,1,""],test_build_complete_graph:[7,2,1,""],test_build_removable_edges_matrix:[7,2,1,""],test_generate_possible_sub_sets_of_size:[7,2,1,""],test_init:[7,2,1,""],test_save_plot_estimated_graph:[7,2,1,""],test_save_results:[7,2,1,""],test_time:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator":{TestStructureScoreBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""],test_structure_monoprocesso:[7,2,1,""]},"PyCTBN.tests.optimizers":{test_hill_climbing_search:[8,0,0,"-"],test_tabu_search:[8,0,0,"-"]},"PyCTBN.tests.optimizers.test_hill_climbing_search":{TestHillClimbingSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_hill_climbing_search.TestHillClimbingSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.optimizers.test_tabu_search":{TestTabuSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_tabu_search.TestTabuSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.structure_graph":{test_cim:[9,0,0,"-"],test_networkgraph:[9,0,0,"-"],test_sample_path:[9,0,0,"-"],test_setofcims:[9,0,0,"-"],test_structure:[9,0,0,"-"],test_trajectory:[9,0,0,"-"]},"PyCTBN.tests.structure_graph.test_cim":{TestConditionalIntensityMatrix:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix":{setUpClass:[9,2,1,""],test_compute_cim_coefficients:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph":{TestNetworkGraph:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph":{aux_build_p_combs_structure:[9,2,1,""],aux_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],aux_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],aux_build_transition_columns_filtering_structure:[9,2,1,""],aux_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_add_edges:[9,2,1,""],test_add_nodes:[9,2,1,""],test_build_p_combs_structure:[9,2,1,""],test_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],test_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],test_build_transition_columns_filtering_structure:[9,2,1,""],test_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],test_fast_init:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_ordered_by_indx_set_of_parents:[9,2,1,""],test_get_parents_by_id:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_sample_path":{TestSamplePath:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath":{setUpClass:[9,2,1,""],test_buid_samplepath_no_concatenated_samples:[9,2,1,""],test_buid_samplepath_no_variables:[9,2,1,""],test_build_saplepath_no_prior_net_structure:[9,2,1,""],test_build_structure:[9,2,1,""],test_build_structure_bad_sorter:[9,2,1,""],test_build_trajectories:[9,2,1,""],test_init:[9,2,1,""],test_init_not_filled_dataframse:[9,2,1,""],test_init_not_initialized_importer:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_setofcims":{TestSetOfCims:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims":{another_filtering_method:[9,2,1,""],aux_test_build_cims:[9,2,1,""],aux_test_init:[9,2,1,""],build_p_comb_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_build_cims:[9,2,1,""],test_filter_cims_with_mask:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_structure":{TestStructure:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_structure.TestStructure":{setUpClass:[9,2,1,""],test_edges_operations:[9,2,1,""],test_equality:[9,2,1,""],test_get_node_id:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_positional_node_indx:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectory":{TestTrajectory:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory":{setUpClass:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.utility":{test_cache:[10,0,0,"-"],test_json_importer:[10,0,0,"-"],test_sample_importer:[10,0,0,"-"]},"PyCTBN.tests.utility.test_cache":{TestCache:[10,1,1,""]},"PyCTBN.tests.utility.test_cache.TestCache":{test_clear:[10,2,1,""],test_find:[10,2,1,""],test_init:[10,2,1,""],test_put:[10,2,1,""]},"PyCTBN.tests.utility.test_json_importer":{TestJsonImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_json_importer.TestJsonImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_build_sorter:[10,2,1,""],test_clear_concatenated_frame:[10,2,1,""],test_clear_data_frame_list:[10,2,1,""],test_compute_row_delta_in_all_frames:[10,2,1,""],test_compute_row_delta_in_all_frames_not_init_sorter:[10,2,1,""],test_compute_row_delta_single_samples_frame:[10,2,1,""],test_dataset_id:[10,2,1,""],test_file_path:[10,2,1,""],test_import_data:[10,2,1,""],test_import_sampled_cims:[10,2,1,""],test_import_structure:[10,2,1,""],test_import_variables:[10,2,1,""],test_init:[10,2,1,""],test_normalize_trajectories:[10,2,1,""],test_normalize_trajectories_wrong_indx:[10,2,1,""],test_normalize_trajectories_wrong_key:[10,2,1,""],test_read_json_file_found:[10,2,1,""],test_read_json_file_not_found:[10,2,1,""]},"PyCTBN.tests.utility.test_sample_importer":{TestSampleImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_sample_importer.TestSampleImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_init:[10,2,1,""],test_order:[10,2,1,""]},PyCTBN:{PyCTBN:[1,0,0,"-"],tests:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"abstract":[2,3,4,5,12],"boolean":[2,4],"case":[7,8,9,10],"class":[2,3,4,5,7,8,9,10,12],"default":[2,3,5],"float":2,"function":2,"import":[4,5,13,14],"int":[2,3,4,5],"null":2,"return":[2,3,4,5,9,12],"static":[2,4],"super":12,"true":[2,12],"var":12,HAS:5,Has:[2,4],NOT:2,The:[2,4,5,12],Use:[2,12],__actual_cach:5,__init__:12,__list_of_sets_of_par:5,_actual_cim:4,_actual_trajectori:4,_aggregated_info_about_nodes_par:4,_array_indx:5,_cach:2,_cim:4,_complete_graph:2,_df_samples_list:[5,12],_df_structur:5,_df_variabl:[5,12],_file_path:12,_graph:[4,12],_import:4,_net_graph:2,_node:2,_node_id:4,_nodes_indx:2,_nodes_v:2,_p_combs_structur:4,_raw_data:5,_sample_path:2,_single_set_of_cim:2,_sorter:[5,12],_state_residence_tim:4,_structur:4,_structure_label:5,_time:4,_time_filt:4,_time_scalar_indexing_structur:4,_total_variables_count:4,_total_variables_numb:4,_trajectori:4,_transition_filt:4,_transition_matric:4,_transition_scalar_indexing_structur:4,_variables_label:5,abc:[3,5],about:[3,4],abstract_import:[0,1,4,13,14],abstractimport:[4,5,12],act:5,actual:[2,4],actual_cim:[4,12],add:[4,5],add_edg:4,add_nod:4,added:2,addit:2,adjac:[2,12],adjacency_matrix:[2,12],after:5,against:2,aggreg:4,algorithm:[2,3,12],all:[2,3,4,5,9,12],alpha_xu:2,alpha_xxu:2,alreadi:[5,12],also:[2,4],ani:[2,3],anoth:4,another_filtering_method:9,approach:2,arc:5,arrai:[2,4,5,12],assign:2,assum:2,automat:2,aux_build_p_combs_structur:9,aux_build_time_columns_filtering_structure_for_a_nod:9,aux_build_time_scalar_indexing_structure_for_a_nod:9,aux_build_transition_columns_filtering_structur:9,aux_build_transition_scalar_indexing_structure_for_a_nod:9,aux_import_sampled_cim:7,aux_test_build_cim:9,aux_test_init:9,axi:12,base:[2,3,4,5,7,8,9,10],bayesian:2,befor:[2,3,7,8,9,10],belong:2,best:2,between:5,bool:[2,4],both:[2,5],bound:4,build:[2,4,5,9,12],build_cim:4,build_complete_graph:2,build_list_of_samples_arrai:5,build_p_comb_structure_for_a_nod:[4,9],build_removable_edges_matrix:2,build_sort:[5,12],build_structur:[4,12],build_time_columns_filtering_for_a_nod:4,build_time_scalar_indexing_structure_for_a_nod:4,build_times_and_transitions_structur:4,build_trajectori:[4,12],build_transition_filtering_for_a_nod:4,build_transition_scalar_indexing_structure_for_a_nod:4,built:2,cach:[0,1,2,13,14],calcul:2,call:[5,12],cardin:[2,4,5,9],cardinalit:[4,5],caridin:4,caridinalit:4,chang:[4,5],check:4,chi:2,chi_test:2,chi_test_alfa:2,child:[2,3],child_indx:2,child_states_numb:2,child_val:2,cim1:[2,7],cim2:[2,7],cim:[2,4,5,12],cim_equality_test:7,cims_kei:5,cims_label:7,classmethod:[7,8,9,10],clean_structure_edg:4,clear:[4,5],clear_concatenated_fram:5,clear_data_frame_list:5,clear_indexing_filtering_structur:4,clear_memori:4,climb:[2,3],coeffici:4,col:4,cols_filt:2,column:[2,4,5,12],columns_head:5,comb:4,combin:[4,5,9],combinatori:[4,9],common:2,complet:[2,4,5],complete_test:2,complete_trajectori:4,comput:[2,3,4,5,12],compute_cim_coeffici:4,compute_parameters_for_nod:[2,12],compute_row_delta_in_all_samples_fram:[5,12],compute_row_delta_sigle_samples_fram:5,compute_state_res_time_for_nod:2,compute_state_transitions_for_a_nod:2,compute_thumb_valu:2,concatanated_sampl:5,concaten:[4,5],concatenated_sampl:5,condit:4,conditional_intensity_matrix:[0,1,2,13,14],conditionalintensitymatrix:[2,4],consid:[2,4],constraint:2,constraint_based_optim:[0,1,13,14],constraintbasedoptim:3,construct:[4,5,12],conta:5,contain:[2,4,5,9],contains_edg:4,content:[13,14],convert:[2,5],copi:5,core:5,correct:[4,5],could:2,count:4,creat:[2,4,12],csv:12,csvimport:12,ctbn:2,ctpc:[2,3,12],ctpc_algorithm:[2,12],current:[2,3,5],cut:5,dafram:5,data:[2,3,4,5,13,14],datafram:[4,5,12],dataset:[3,4,5],dataset_id:[5,12],datfram:5,def:12,defin:5,definit:5,defualt:2,delta:[2,4,5],demonstr:12,describ:5,desir:[2,4],df_samples_list:5,dict:[5,12],dictionari:5,differ:5,differt:2,digraph:2,dimens:4,dir:12,direct:[2,4],directli:5,disabl:[2,3],disable_multiprocess:2,distribuit:2,doc:5,doubl:4,download:12,drop:12,duplic:4,dyn:12,each:[2,3,5],edg:[2,4,5,12],edges_list:4,end:5,entir:2,equal:4,equality_of_cims_of_nod:7,est:12,estim:[0,1,3,4,6,13,14],estimate_par:2,estimate_structur:2,estimated_cim:7,everi:[4,5],exam:12,exampl:[5,13,14],exclud:2,exctract:5,exist:5,exp_test_alfa:2,exponenti:2,expos:5,extend:12,extens:[2,5],extract:[4,5],fals:2,fam_score_calcul:[0,1,13,14],famscor:2,famscorecalcul:2,fast_init:[2,4,12],file:[2,5,12],file_path:[2,5,12],filepath:5,fill:[2,12],filter:[2,4],filter_cims_with_mask:4,find:[2,5],first:[2,12],fixtur:[7,8,9,10],follow:[4,5],form:4,format:12,formula:2,found:5,frame:5,from:[4,5,12],from_nod:5,gener:2,generate_possible_sub_sets_of_s:2,get:[2,5],get_cims_numb:4,get_fam_scor:2,get_node_id:4,get_node_indx:4,get_ordered_by_indx_set_of_par:4,get_parents_by_id:4,get_positional_node_indx:4,get_score_from_graph:2,get_states_numb:4,given:[2,4,5],glob:12,graph:[2,4,9,12],graph_struct:4,graphic:2,grid:[4,9],grpah:12,has:[5,12],has_edg:4,has_prior_net_structur:4,have:5,header:5,header_column:5,hill:[2,3],hill_climbing_search:[0,1,13,14],hillclimb:3,hold:[2,4],hook:[7,8,9,10],how:5,hyperparamet:2,hypothesi:2,identifi:[2,4,5],iff:2,implement:[3,5,13,14],import_data:[5,12],import_sampled_cim:5,import_structur:5,import_trajectori:5,import_vari:[5,12],improv:[2,3],includ:2,independ:2,independence_test:2,index:[2,4,5,12,13],indic:[2,4],indx:5,info:[4,12],inform:[3,4],init:12,initi:[2,4,5,12],inplac:12,insid:12,instal:[13,14],interest:4,interfac:3,intes:4,iter:[2,3],iterations_numb:[2,3],its:[2,3],join:12,json:[2,5,12],json_import:[0,1,13,14],jsonarrai:5,jsonimport:[5,12],keep:[2,3,5],kei:5,kind:2,knowledg:2,known:2,known_edg:2,label:[2,3,4,5],lenght:[2,3],level:[2,5],likelihood:2,list:[2,3,4,5,12],list_of_column:4,list_of_edg:4,list_of_nod:4,load:5,loop:2,m_xu_suff_stat:2,m_xxu_suff_stat:2,main:12,margin:2,marginal_likelihood_q:2,marginal_likelihood_theta:2,mask:[4,9],mask_arr:4,matric:[2,4],matrix:[2,4,5,9,12],max_par:[2,3],maximum:[2,3],member:[4,5],mention:4,merg:5,method:[2,5,7,8,9,10],methodnam:[7,8,9,10],model:2,modul:[13,14],multipl:5,multiprocess:2,name:[2,4,5,12],ndarrai:[2,4,5],necessari:[2,4,5],nest:5,net:[2,3,4,5,12],net_graph:2,network:[2,4,5],network_graph:[0,1,2,13,14],networkgraph:[2,4,12],networkx:2,node:[2,3,4,5,9,12],node_id:[2,3,4,9],node_index:4,node_indx:[2,4],node_st:[4,9],node_states_numb:[4,9],nodes_index:4,nodes_indexes_arr:4,nodes_label:4,nodes_labels_list:4,nodes_numb:4,nodes_vals_arr:4,nodes_valu:[4,12],none:[2,3,4,5,7,9,10,12],normal:5,normalize_trajectori:5,number:[2,3,4],numpi:[2,4,5,9],obj:[10,12],object:[2,3,4,5,12],one:[4,5],one_iteration_of_ctpc_algorithm:2,one_level_norm:5,onli:5,oper:2,optim:[0,1,2,6,13,14],optimize_structur:3,option:[2,3],order:[2,5,10],origin:5,original_cols_numb:4,otherwis:[2,5],out:5,outer:[5,12],over:2,own:[13,14],p_comb:[4,9],p_indx:[4,9],p_val:9,p_valu:9,packag:[13,14],page:13,panda:[5,12],param:4,paramet:[2,3,4,5,9,13,14],parameters_estim:[0,1,13,14],parametersestim:[2,12],parent:[2,3,4,5],parent_indx:2,parent_label:2,parent_set:2,parent_set_v:2,parent_v:2,parent_valu:9,parents_cardin:4,parents_comb:5,parents_index:4,parents_indx:9,parents_label:[4,9],parents_states_numb:[4,9],parents_v:[4,9],parents_valu:[4,9],part:2,particular:[2,5],pass:12,path:[2,5,12],patienc:[2,3],peest:12,perform:2,pip:12,place:5,plot:2,png:2,posit:[4,5],possibl:[2,4],predict:3,prepar:5,present:[2,5],print:12,prior:[2,12],prior_net_structur:5,process:[2,3,4,5],processes_numb:2,properli:5,properti:[4,5],put:5,pyctbn:12,q_xx:4,rappres:4,raw:5,raw_data:5,read:[5,12],read_csv:12,read_csv_fil:12,read_fil:12,read_json_fil:5,real:[2,4,5,12],refer:[4,5],reject:2,rel:4,relat:5,releas:12,remain:5,remov:[2,4,5],remove_edg:4,remove_nod:4,repres:4,represent:2,res:4,resid:[2,4],result:[2,5,12],rtype:4,rule:[2,3],run:[7,8,9,10],runtest:[7,8,9,10],same:5,sampl:[4,5,12],sample_fram:[5,12],sample_import:[0,1,13,14],sample_path:[0,1,2,13,14],sampled_cim:7,sampleimport:5,samplepath:[2,4,12],samples_label:5,save:[2,12],save_plot_estimated_structure_graph:2,save_result:[2,12],scalar_index:2,scalar_indexes_struct:2,score:2,se1:12,search:[2,3,13],second:2,see:5,select:12,self:[2,5,12],sep:2,sep_set:2,set:[2,4,5,7,8,9,10],set_of_cim:[0,1,2,5,13,14],setofcim:[2,4,5,12],setupclass:[7,8,9,10],shift:[4,5],shifted_cols_head:5,show:2,signific:2,simbol:5,simpl:12,simpli:12,sinc:4,single_cim_xu_marginal_likelihood_q:2,single_cim_xu_marginal_likelihood_theta:2,single_internal_cim_xxu_marginal_likelihood_theta:2,size:[2,4],socim:5,sofc1:12,sorter:5,specif:[2,4,12],spuriou:2,spurious_edg:2,start:5,state:[2,4],state_res_tim:4,state_residence_tim:4,state_transition_matrix:4,statist:2,stop:[2,3],str:[2,3,4,5,12],string:[2,3,4,5],structur:[0,1,2,3,5,9,13,14],structure_constraint_based_estim:[0,1,13,14],structure_estim:[0,1,3,13,14],structure_estimation_exampl:12,structure_graph:[0,1,2,5,6,13,14],structure_label:5,structure_score_based_estim:[0,1,13,14],structureconstraintbasedestim:2,structureestim:[2,3,12],structurescorebasedestim:2,structut:4,style:2,submodul:[1,6,13,14],subpackag:[13,14],subset:2,suffici:2,suffuci:2,symbol:[4,5],synthet:5,t_xu_suff_stat:2,tabu:[2,3],tabu_length:[2,3],tabu_rules_dur:[2,3],tabu_search:[0,1,13,14],tabusearch:3,take:12,tar:12,task:[2,4],tau_xu:2,ternari:12,test:2,test_add_edg:9,test_add_nod:9,test_adjacency_matrix:7,test_buid_samplepath_no_concatenated_sampl:9,test_buid_samplepath_no_vari:9,test_build_cim:9,test_build_complete_graph:7,test_build_p_combs_structur:9,test_build_removable_edges_matrix:7,test_build_saplepath_no_prior_net_structur:9,test_build_sort:10,test_build_structur:9,test_build_structure_bad_sort:9,test_build_time_columns_filtering_structure_for_a_nod:9,test_build_time_scalar_indexing_structure_for_a_nod:9,test_build_trajectori:9,test_build_transition_columns_filtering_structur:9,test_build_transition_scalar_indexing_structure_for_a_nod:9,test_cach:6,test_child:2,test_cim:6,test_clear:10,test_clear_concatenated_fram:10,test_clear_data_frame_list:10,test_compute_cim_coeffici:9,test_compute_parameters_for_nod:7,test_compute_row_delta_in_all_fram:10,test_compute_row_delta_in_all_frames_not_init_sort:10,test_compute_row_delta_single_samples_fram:10,test_dataset_id:10,test_edges_oper:9,test_equ:9,test_fast_init:[7,9],test_file_path:10,test_filter_cims_with_mask:9,test_find:10,test_generate_possible_sub_sets_of_s:7,test_get_node_id:9,test_get_node_indx:9,test_get_ordered_by_indx_set_of_par:9,test_get_parents_by_id:9,test_get_positional_node_indx:9,test_get_states_numb:9,test_hill_climbing_search:6,test_import_data:10,test_import_sampled_cim:10,test_import_structur:10,test_import_vari:10,test_init:[7,9,10],test_init_not_filled_dataframs:9,test_init_not_initialized_import:9,test_json_import:6,test_networkgraph:6,test_normalize_trajectori:10,test_normalize_trajectories_wrong_indx:10,test_normalize_trajectories_wrong_kei:10,test_ord:10,test_par:2,test_parameters_estim:6,test_put:10,test_read_json_file_found:10,test_read_json_file_not_found:10,test_repr:9,test_sample_import:6,test_sample_path:6,test_save_plot_estimated_graph:7,test_save_result:7,test_setofcim:6,test_structur:[6,8],test_structure_1:7,test_structure_2:7,test_structure_3:[7,8],test_structure_constraint_based_estim:6,test_structure_estim:6,test_structure_monoprocesso:7,test_structure_score_based_estim:6,test_tabu_search:6,test_tim:7,test_trajectori:6,testcach:10,testcas:[7,8,9,10],testconditionalintensitymatrix:9,testhillclimbingsearch:8,testjsonimport:10,testnetworkgraph:9,testparametersestimatior:7,testsampleimport:10,testsamplepath:9,testsetofcim:9,teststructur:9,teststructureconstraintbasedestim:7,teststructureestim:7,teststructurescorebasedestim:7,testtabusearch:8,testtrajectori:9,tha:5,theta:2,thi:[2,4,5,12],three:12,threshold:2,thumb:2,thumb_threshold:2,thumb_valu:2,time:[2,4,5,12],time_filt:4,time_kei:5,time_scalar_indexing_strucur:4,timestamp:5,to_nod:5,tot_vars_count:[2,3],total:[2,4],total_variables_count:4,total_variables_numb:4,traj:5,trajecory_head:5,trajectori:[0,1,2,5,12,13,14],trajectories_kei:5,trajectory_list:5,trajectri:12,transit:[2,4,5],transition_filt:4,transition_matric:4,transition_scalar_indexing_structur:4,tri:5,tupl:4,tutori:5,two:2,type:[2,3,4,5,12],union:5,uniqu:5,unittest:[7,8,9,10],unus:4,usag:[13,14],use:[2,12],used:[2,3,4,5],using:[2,3,4,5],util:[0,1,4,6,13,14],valid:2,valu:[2,3,4,5,9,12],values_list:12,var_id:2,variabl:[2,3,4,5,12],variable_cardin:5,variable_cim_xu_marginal_likelihood_q:2,variable_cim_xu_marginal_likelihood_theta:2,variable_label:5,variables_kei:5,variables_label:5,vector:[2,4],want:12,when:2,where:5,which:[2,3,4,5],whl:12,who:2,without:[2,3],you:[2,5,12],your:[13,14]},titles:["PyCTBN package","PyCTBN.PyCTBN package","PyCTBN.PyCTBN.estimators package","PyCTBN.PyCTBN.optimizers package","PyCTBN.PyCTBN.structure_graph package","PyCTBN.PyCTBN.utility package","PyCTBN.tests package","PyCTBN.tests.estimators package","PyCTBN.tests.optimizers package","PyCTBN.tests.structure_graph package","PyCTBN.tests.utility package","basic_main module","Examples","Welcome to PyCTBN\u2019s documentation!","PyCTBN","setup module"],titleterms:{"import":12,abstract_import:5,basic_main:11,cach:5,conditional_intensity_matrix:4,constraint_based_optim:3,content:[0,1,2,3,4,5,6,7,8,9,10],data:12,document:13,estim:[2,7,12],exampl:12,fam_score_calcul:2,hill_climbing_search:3,implement:12,indic:13,instal:12,json_import:5,modul:[0,1,2,3,4,5,6,7,8,9,10,11,15],network_graph:4,optim:[3,8],own:12,packag:[0,1,2,3,4,5,6,7,8,9,10],paramet:12,parameters_estim:2,pyctbn:[0,1,2,3,4,5,6,7,8,9,10,13,14],sample_import:5,sample_path:4,set_of_cim:4,setup:15,structur:[4,12],structure_constraint_based_estim:2,structure_estim:2,structure_graph:[4,9],structure_score_based_estim:2,submodul:[0,2,3,4,5,7,8,9,10],subpackag:[0,1,6],tabl:13,tabu_search:3,test:[6,7,8,9,10],test_cach:10,test_cim:9,test_hill_climbing_search:8,test_json_import:10,test_networkgraph:9,test_parameters_estim:7,test_sample_import:10,test_sample_path:9,test_setofcim:9,test_structur:9,test_structure_constraint_based_estim:7,test_structure_estim:7,test_structure_score_based_estim:7,test_tabu_search:8,test_trajectori:9,trajectori:4,usag:12,util:[5,10],welcom:13,your:12}}) \ No newline at end of file diff --git a/docs-out/_build/html/setup.html b/docs-out/_build/html/setup.html index d942353..8f74cf7 100644 --- a/docs-out/_build/html/setup.html +++ b/docs-out/_build/html/setup.html @@ -58,7 +58,7 @@ -

                                                                        Contents:

                                                                        +

                                                                        Contents:

                                                                        • PyCTBN.PyCTBN package
                                                                          • Subpackages
                                                                          • @@ -112,9 +112,9 @@
                                                                            -
                                                                            +

                                                                            setup module

                                                                            -
                                                                            +
                                                                            diff --git a/docs/PyCTBN.PyCTBN.estimators.html b/docs/PyCTBN.PyCTBN.estimators.html index cc28d0c..744c567 100644 --- a/docs/PyCTBN.PyCTBN.estimators.html +++ b/docs/PyCTBN.PyCTBN.estimators.html @@ -61,7 +61,7 @@ -

                                                                            Contents:

                                                                            +

                                                                            Contents:

                                                                            • PyCTBN.PyCTBN package
                                                                              • Subpackages
                                                                              • @@ -115,12 +115,12 @@
                                                                                -
                                                                                +

                                                                                PyCTBN.PyCTBN.estimators package

                                                                                -
                                                                                +

                                                                                Submodules

                                                                                -
                                                                                -
                                                                                +
                                                                                +

                                                                                PyCTBN.PyCTBN.estimators.fam_score_calculator module

                                                                                @@ -300,8 +300,8 @@ and a specif parents’s assignment

                                                                                -
                                                                                -
                                                                                + +

                                                                                PyCTBN.PyCTBN.estimators.parameters_estimator module

                                                                                @@ -385,8 +385,8 @@ in the graph _net_g
                                                                                -
                                                                                -
                                                                                + +

                                                                                PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator module

                                                                                @@ -467,22 +467,34 @@ Generates all the necessary structures and datas to perform the tests.

                                                                                -ctpc_algorithm(disable_multiprocessing: bool = False)
                                                                                +ctpc_algorithm(disable_multiprocessing: bool = False, processes_number: int = None)

                                                                                Compute the CTPC algorithm over the entire net.

                                                                                +
                                                                                +
                                                                                Parameters
                                                                                +
                                                                                  +
                                                                                • disable_multiprocessing (Boolean, optional) – true if you desire to disable the multiprocessing operations, default to False

                                                                                • +
                                                                                • processes_number – if disable_multiprocessing is false indicates

                                                                                • +
                                                                                +
                                                                                +
                                                                                +

                                                                                the maximum number of process; if None it will be automatically set, default to None +:type processes_number: int, optional

                                                                                -estimate_structure(disable_multiprocessing: bool = False)
                                                                                -

                                                                                Abstract method to estimate the structure

                                                                                +estimate_structure(disable_multiprocessing: bool = False, processes_number: int = None) +

                                                                                Compute the constraint-based algorithm to find the optimal structure

                                                                                -
                                                                                Returns
                                                                                -

                                                                                List of estimated edges

                                                                                -
                                                                                -
                                                                                Return type
                                                                                -

                                                                                Typing.List

                                                                                +
                                                                                Parameters
                                                                                +
                                                                                  +
                                                                                • disable_multiprocessing (Boolean, optional) – true if you desire to disable the multiprocessing operations, default to False

                                                                                • +
                                                                                • processes_number – if disable_multiprocessing is false indicates

                                                                                • +
                                                                                +

                                                                                the maximum number of process; if None it will be automatically set, default to None +:type processes_number: int, optional

                                                                                @@ -521,8 +533,8 @@ it is performed also the chi_test.

                                                                                -
                                                                                -
                                                                                + +

                                                                                PyCTBN.PyCTBN.estimators.structure_estimator module

                                                                                @@ -677,8 +689,8 @@ that do not contains a the node identified by +
                                                                                +

                                                                                PyCTBN.PyCTBN.estimators.structure_score_based_estimator module

                                                                                @@ -723,7 +735,7 @@ using a score based approach and differt kinds of optimization algorithms.

                                                                                -estimate_structure(max_parents: int = None, iterations_number: int = 40, patience: int = None, tabu_length: int = None, tabu_rules_duration: int = None, optimizer: str = 'tabu', disable_multiprocessing: bool = False)
                                                                                +estimate_structure(max_parents: int = None, iterations_number: int = 40, patience: int = None, tabu_length: int = None, tabu_rules_duration: int = None, optimizer: str = 'tabu', disable_multiprocessing: bool = False, processes_number: int = None)

                                                                                Compute the score-based algorithm to find the optimal structure

                                                                                Parameters
                                                                                @@ -735,9 +747,12 @@ using a score based approach and differt kinds of optimization algorithms.

                                                                              • tabu_rules_duration (int, optional) – number of iterations in which each rule keeps its value, default to None

                                                                              • optimizer (string, optional) – name of the optimizer algorithm. Possible values: ‘hill’ (Hill climbing),’tabu’ (tabu search), defualt to ‘tabu’

                                                                              • disable_multiprocessing (Boolean, optional) – true if you desire to disable the multiprocessing operations, default to False

                                                                              • +
                                                                              • processes_number – if disable_multiprocessing is false indicates

                                                                              +

                                                                              the maximum number of process; if None it will be automatically set, default to None +:type processes_number: int, optional

                                                                              @@ -762,11 +777,11 @@ using a score based approach and differt kinds of optimization algorithms.

                                                                              -
                                                                            -
                                                                            + +

                                                                            Module contents

                                                                            -
                                                                            -
                                                                + +
                                                            diff --git a/docs/PyCTBN.PyCTBN.html b/docs/PyCTBN.PyCTBN.html index 6e4fde1..bd6313d 100644 --- a/docs/PyCTBN.PyCTBN.html +++ b/docs/PyCTBN.PyCTBN.html @@ -60,7 +60,7 @@ -

                                                            Contents:

                                                            +

                                                            Contents:

                                                            • PyCTBN.PyCTBN package
                                                              • Subpackages
                                                              • @@ -114,9 +114,9 @@
                                                                -
                                                                +

                                                                PyCTBN.PyCTBN package

                                                                -
                                                                +

                                                                Subpackages

                                                                  @@ -161,11 +161,11 @@
                                                                -
                                                                -
                                                                +
                                                                +

                                                                Module contents

                                                                -
                                                                -
                                                                + +
                                                                diff --git a/docs/PyCTBN.PyCTBN.optimizers.html b/docs/PyCTBN.PyCTBN.optimizers.html index be9cd55..58423f2 100644 --- a/docs/PyCTBN.PyCTBN.optimizers.html +++ b/docs/PyCTBN.PyCTBN.optimizers.html @@ -61,7 +61,7 @@ -

                                                                Contents:

                                                                +

                                                                Contents:

                                                                • PyCTBN.PyCTBN package
                                                                  • Subpackages
                                                                  • @@ -115,12 +115,12 @@
                                                                    -
                                                                    +

                                                                    PyCTBN.PyCTBN.optimizers package

                                                                    -
                                                                    +

                                                                    Submodules

                                                                    -
                                                                    -
                                                                    +
                                                                    +

                                                                    PyCTBN.PyCTBN.optimizers.constraint_based_optimizer module

                                                                    @@ -152,8 +152,8 @@
                                                                    -
                                                                    - -
                                                                    + +

                                                                    PyCTBN.PyCTBN.optimizers.optimizer module

                                                                    @@ -219,8 +219,8 @@
                                                                    -
                                                                    - -
                                                                    + +

                                                                    Module contents

                                                                    -
                                                                    -
                                                                    + +
                                                                    diff --git a/docs/PyCTBN.PyCTBN.structure_graph.html b/docs/PyCTBN.PyCTBN.structure_graph.html index 6080755..9ff99e7 100644 --- a/docs/PyCTBN.PyCTBN.structure_graph.html +++ b/docs/PyCTBN.PyCTBN.structure_graph.html @@ -61,7 +61,7 @@ -

                                                                    Contents:

                                                                    +

                                                                    Contents:

                                                                    • PyCTBN.PyCTBN package
                                                                      • Subpackages
                                                                      • @@ -115,12 +115,12 @@
                                                                        -
                                                                        +

                                                                        PyCTBN.PyCTBN.structure_graph package

                                                                        -
                                                                        +

                                                                        Submodules

                                                                        -
                                                                        -
                                                                        +
                                                                        +

                                                                        PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix module

                                                                        @@ -163,8 +163,8 @@ The class member _c
                                                                        -
                                                                        -
                                                                        + +

                                                                        PyCTBN.PyCTBN.structure_graph.network_graph module

                                                                        @@ -456,8 +456,8 @@ Initialize all the filtering/indexing structures.

                                                                        -
                                                                        -
                                                                        + +

                                                                        PyCTBN.PyCTBN.structure_graph.sample_path module

                                                                        @@ -520,8 +520,8 @@ Clears all the unused dataframes in <
                                                                        -
                                                                        -
                                                                        + +

                                                                        PyCTBN.PyCTBN.structure_graph.set_of_cims module

                                                                        @@ -606,8 +606,8 @@ Compute the cim coefficients.The class member +
                                                                        +

                                                                        PyCTBN.PyCTBN.structure_graph.structure module

                                                                        @@ -735,8 +735,8 @@ The class member _t
                                                                        -
                                                                        -
                                                                        + +

                                                                        PyCTBN.PyCTBN.structure_graph.trajectory module

                                                                        @@ -780,11 +780,11 @@ The class member _t
                                                                        -
                                                                        -
                                                                        + +

                                                                        Module contents

                                                                        -
                                                                        -
                                                                        + +
                                                                        diff --git a/docs/PyCTBN.PyCTBN.utility.html b/docs/PyCTBN.PyCTBN.utility.html index 5f834ce..50c6ce2 100644 --- a/docs/PyCTBN.PyCTBN.utility.html +++ b/docs/PyCTBN.PyCTBN.utility.html @@ -61,7 +61,7 @@ -

                                                                        Contents:

                                                                        +

                                                                        Contents:

                                                                        • PyCTBN.PyCTBN package
                                                                          • Subpackages
                                                                          • @@ -115,12 +115,12 @@
                                                                            -
                                                                            +

                                                                            PyCTBN.PyCTBN.utility package

                                                                            -
                                                                            +

                                                                            Submodules

                                                                            -
                                                                            -
                                                                            +
                                                                            +

                                                                            PyCTBN.PyCTBN.utility.abstract_importer module

                                                                            @@ -281,8 +281,8 @@ dataset

                                                                            -
                                                                            -
                                                                            + +

                                                                            PyCTBN.PyCTBN.utility.cache module

                                                                            @@ -340,8 +340,8 @@ None otherwise.

                                                                            -
                                                                            -
                                                                            + +

                                                                            PyCTBN.PyCTBN.utility.json_importer module

                                                                            @@ -531,8 +531,8 @@ as keys for the set of CIMS of a particular node.

                                                                            -
                                                                            -
                                                                            + +

                                                                            PyCTBN.PyCTBN.utility.sample_importer module

                                                                            @@ -575,11 +575,11 @@ dataset

                                                                            -
                                                                            -
                                                                            + +

                                                                            Module contents

                                                                            -
                                                                            -
                                                                            + +
                                                                            diff --git a/docs/PyCTBN.html b/docs/PyCTBN.html index 1faa738..8f6f17f 100644 --- a/docs/PyCTBN.html +++ b/docs/PyCTBN.html @@ -58,7 +58,7 @@ -

                                                                            Contents:

                                                                            +

                                                                            Contents:

                                                                            • PyCTBN.PyCTBN package
                                                                              • Subpackages
                                                                              • @@ -112,9 +112,9 @@
                                                                                -
                                                                                +

                                                                                PyCTBN package

                                                                                -
                                                                                +

                                                                                Subpackages

                                                                                  @@ -166,14 +166,14 @@
                                                                                -
                                                                                -
                                                                                +
                                                                                +

                                                                                Submodules

                                                                                -
                                                                                -
                                                                                + +

                                                                                Module contents

                                                                                -
                                                                                -
                                                                                + +
                                                                                diff --git a/docs/PyCTBN.tests.estimators.html b/docs/PyCTBN.tests.estimators.html index ab1bfc8..8a63d1f 100644 --- a/docs/PyCTBN.tests.estimators.html +++ b/docs/PyCTBN.tests.estimators.html @@ -58,7 +58,7 @@ -

                                                                                Contents:

                                                                                +

                                                                                Contents:

                                                                                • PyCTBN.PyCTBN package
                                                                                  • Subpackages
                                                                                  • @@ -112,12 +112,12 @@
                                                                                    -
                                                                                    +

                                                                                    PyCTBN.tests.estimators package

                                                                                    -
                                                                                    +

                                                                                    Submodules

                                                                                    -
                                                                                    -
                                                                                    +
                                                                                    +

                                                                                    PyCTBN.tests.estimators.test_parameters_estimator module

                                                                                    @@ -156,8 +156,8 @@
                                                                                    -
                                                                                    -
                                                                                    + +

                                                                                    PyCTBN.tests.estimators.test_structure_constraint_based_estimator module

                                                                                    @@ -186,8 +186,8 @@
                                                                                    -
                                                                                    -
                                                                                    + +

                                                                                    PyCTBN.tests.estimators.test_structure_estimator module

                                                                                    @@ -241,8 +241,8 @@
                                                                                    -
                                                                                    -
                                                                                    + +

                                                                                    PyCTBN.tests.estimators.test_structure_score_based_estimator module

                                                                                    @@ -276,11 +276,11 @@
                                                                                    -
                                                                                    -
                                                                                    + +

                                                                                    Module contents

                                                                                    -
                                                                                    -
                                                                                    + +
                                                                                    diff --git a/docs/PyCTBN.tests.html b/docs/PyCTBN.tests.html index dc6280d..83be260 100644 --- a/docs/PyCTBN.tests.html +++ b/docs/PyCTBN.tests.html @@ -58,7 +58,7 @@ -

                                                                                    Contents:

                                                                                    +

                                                                                    Contents:

                                                                                    • PyCTBN.PyCTBN package
                                                                                      • Subpackages
                                                                                      • @@ -112,9 +112,9 @@
                                                                                        -
                                                                                        +

                                                                                        PyCTBN.tests package

                                                                                        -
                                                                                        +

                                                                                        Subpackages

                                                                                          @@ -155,11 +155,11 @@
                                                                                        -
                                                                                        -
                                                                                        +
                                                                                        +

                                                                                        Module contents

                                                                                        -
                                                                                        -
                                                                                        + +
                                                                                        diff --git a/docs/PyCTBN.tests.optimizers.html b/docs/PyCTBN.tests.optimizers.html index 20e937a..96038cc 100644 --- a/docs/PyCTBN.tests.optimizers.html +++ b/docs/PyCTBN.tests.optimizers.html @@ -58,7 +58,7 @@ -

                                                                                        Contents:

                                                                                        +

                                                                                        Contents:

                                                                                        • PyCTBN.PyCTBN package
                                                                                          • Subpackages
                                                                                          • @@ -112,12 +112,12 @@
                                                                                            -
                                                                                            +

                                                                                            PyCTBN.tests.optimizers package

                                                                                            -
                                                                                            +

                                                                                            Submodules

                                                                                            -
                                                                                            -
                                                                                            +
                                                                                            - -
                                                                                            + +

                                                                                            Module contents

                                                                                            -
                                                                                            -
                                                                                            + +
                                                                                            diff --git a/docs/PyCTBN.tests.structure_graph.html b/docs/PyCTBN.tests.structure_graph.html index f87e7db..f3dae53 100644 --- a/docs/PyCTBN.tests.structure_graph.html +++ b/docs/PyCTBN.tests.structure_graph.html @@ -58,7 +58,7 @@ -

                                                                                            Contents:

                                                                                            +

                                                                                            Contents:

                                                                                            • PyCTBN.PyCTBN package
                                                                                              • Subpackages
                                                                                              • @@ -112,12 +112,12 @@
                                                                                                -
                                                                                                +

                                                                                                PyCTBN.tests.structure_graph package

                                                                                                -
                                                                                                +

                                                                                                Submodules

                                                                                                -
                                                                                                -
                                                                                                +
                                                                                                +

                                                                                                PyCTBN.tests.structure_graph.test_cim module

                                                                                                @@ -146,8 +146,8 @@
                                                                                                -
                                                                                                -
                                                                                                + +

                                                                                                PyCTBN.tests.structure_graph.test_networkgraph module

                                                                                                @@ -251,8 +251,8 @@
                                                                                                -
                                                                                                -
                                                                                                + +

                                                                                                PyCTBN.tests.structure_graph.test_sample_path module

                                                                                                @@ -311,8 +311,8 @@
                                                                                                -
                                                                                                -
                                                                                                + +

                                                                                                PyCTBN.tests.structure_graph.test_setofcims module

                                                                                                @@ -368,8 +368,8 @@
                                                                                                -
                                                                                                -
                                                                                                + +

                                                                                                PyCTBN.tests.structure_graph.test_structure module

                                                                                                @@ -423,8 +423,8 @@
                                                                                                -
                                                                                                -
                                                                                                + +

                                                                                                PyCTBN.tests.structure_graph.test_trajectory module

                                                                                                @@ -443,11 +443,11 @@
                                                                                                -
                                                                                                -
                                                                                                + +

                                                                                                Module contents

                                                                                                -
                                                                                                -
                                                                                                + +
                                                                                                diff --git a/docs/PyCTBN.tests.utility.html b/docs/PyCTBN.tests.utility.html index 0cd5380..606ce71 100644 --- a/docs/PyCTBN.tests.utility.html +++ b/docs/PyCTBN.tests.utility.html @@ -58,7 +58,7 @@ -

                                                                                                Contents:

                                                                                                +

                                                                                                Contents:

                                                                                                • PyCTBN.PyCTBN package
                                                                                                  • Subpackages
                                                                                                  • @@ -112,12 +112,12 @@
                                                                                                    -
                                                                                                    +

                                                                                                    PyCTBN.tests.utility package

                                                                                                    -
                                                                                                    +

                                                                                                    Submodules

                                                                                                    -
                                                                                                    -
                                                                                                    +
                                                                                                    +

                                                                                                    PyCTBN.tests.utility.test_cache module

                                                                                                    @@ -145,8 +145,8 @@
                                                                                                    -
                                                                                                    -
                                                                                                    + +

                                                                                                    PyCTBN.tests.utility.test_json_importer module

                                                                                                    @@ -255,8 +255,8 @@
                                                                                                    -
                                                                                                    -
                                                                                                    + +

                                                                                                    PyCTBN.tests.utility.test_sample_importer module

                                                                                                    @@ -285,11 +285,11 @@
                                                                                                    -
                                                                                                    -
                                                                                                    + +

                                                                                                    Module contents

                                                                                                    -
                                                                                                    -
                                                                                                    + +
                                                                                                    diff --git a/docs/basic_main.html b/docs/basic_main.html index 1ba75f4..a74fa74 100644 --- a/docs/basic_main.html +++ b/docs/basic_main.html @@ -58,7 +58,7 @@ -

                                                                                                    Contents:

                                                                                                    +

                                                                                                    Contents:

                                                                                                    • PyCTBN.PyCTBN package
                                                                                                      • Subpackages
                                                                                                      • @@ -112,9 +112,9 @@
                                                                                                        -
                                                                                                        +

                                                                                                        basic_main module

                                                                                                        -
                                                                                                        +
                                                                                                        diff --git a/docs/examples.html b/docs/examples.html index 8bf8f53..94a79a7 100644 --- a/docs/examples.html +++ b/docs/examples.html @@ -59,7 +59,7 @@ -

                                                                                                        Contents:

                                                                                                        +

                                                                                                        Contents:

                                                                                                        • PyCTBN.PyCTBN package
                                                                                                          • Subpackages
                                                                                                          • @@ -113,16 +113,16 @@
                                                                                                            -
                                                                                                            +

                                                                                                            Examples

                                                                                                            -
                                                                                                            +

                                                                                                            Installation/Usage

                                                                                                            Download the release in .tar.gz or .whl format and simply use pip install to install it:

                                                                                                            $pip install PyCTBN-1.0.tar.gz
                                                                                                             
                                                                                                            -
                                                                                                            -
                                                                                                            +
                                                                                                            +

                                                                                                            Implementing your own data importer

                                                                                                            """This example demonstrates the implementation of a simple data importer the extends the class abstract importer to import data in csv format.
                                                                                                             The net in exam has three ternary nodes and no prior net structure.
                                                                                                            @@ -161,8 +161,8 @@
                                                                                                                     pass
                                                                                                             
                                                                                                            -
                                                                                                            -
                                                                                                            + +

                                                                                                            Parameters Estimation Example

                                                                                                            from PyCTBN import JsonImporter
                                                                                                             from PyCTBN import SamplePath
                                                                                                            @@ -199,8 +199,8 @@
                                                                                                                 print(sofc1.actual_cims)
                                                                                                             
                                                                                                            -
                                                                                                            -
                                                                                                            + +

                                                                                                            Structure Estimation Example

                                                                                                            from PyCTBN import JsonImporter
                                                                                                             from PyCTBN import SamplePath
                                                                                                            @@ -230,8 +230,8 @@
                                                                                                                 se1.save_results()
                                                                                                             
                                                                                                            -
                                                                                                            -
                                                                                                            + +
                                                                                                            diff --git a/docs/genindex.html b/docs/genindex.html index 0dea95f..bd2996c 100644 --- a/docs/genindex.html +++ b/docs/genindex.html @@ -58,7 +58,7 @@ -

                                                                                                            Contents:

                                                                                                            +

                                                                                                            Contents:

                                                                                                            • PyCTBN.PyCTBN package
                                                                                                              • Subpackages
                                                                                                              • diff --git a/docs/index.html b/docs/index.html index f262fe7..996979e 100644 --- a/docs/index.html +++ b/docs/index.html @@ -59,7 +59,7 @@ -

                                                                                                                Contents:

                                                                                                                +

                                                                                                                Contents:

                                                                                                                • PyCTBN.PyCTBN package
                                                                                                                  • Subpackages
                                                                                                                  • @@ -113,10 +113,10 @@
                                                                                                                    -
                                                                                                                    +

                                                                                                                    Welcome to PyCTBN’s documentation!

                                                                                                                    -

                                                                                                                    Contents:

                                                                                                                    +

                                                                                                                    Contents:

                                                                                                                    -
                                                                                                                    -
                                                                                                                    + +

                                                                                                                    Indices and tables

                                                                                                                    -
                                                                                                                    +
                                                                                                                    diff --git a/docs/modules.html b/docs/modules.html index 28d3d3b..2540d43 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -58,7 +58,7 @@ -

                                                                                                                    Contents:

                                                                                                                    +

                                                                                                                    Contents:

                                                                                                                    • PyCTBN.PyCTBN package
                                                                                                                      • Subpackages
                                                                                                                      • @@ -112,7 +112,7 @@
                                                                                                                        -
                                                                                                                        +

                                                                                                                        PyCTBN

                                                                                                                          @@ -171,7 +171,7 @@
                                                                                                                        -
                                                                                                                        +
                                                                                                                        diff --git a/docs/py-modindex.html b/docs/py-modindex.html index 809febd..d729367 100644 --- a/docs/py-modindex.html +++ b/docs/py-modindex.html @@ -61,7 +61,7 @@ -

                                                                                                                        Contents:

                                                                                                                        +

                                                                                                                        Contents:

                                                                                                                        • PyCTBN.PyCTBN package
                                                                                                                          • Subpackages
                                                                                                                          • diff --git a/docs/search.html b/docs/search.html index b9884b3..21fd6c9 100644 --- a/docs/search.html +++ b/docs/search.html @@ -58,7 +58,7 @@ -

                                                                                                                            Contents:

                                                                                                                            +

                                                                                                                            Contents:

                                                                                                                            • PyCTBN.PyCTBN package
                                                                                                                              • Subpackages
                                                                                                                              • diff --git a/docs/searchindex.js b/docs/searchindex.js index 051c818..7d0597c 100644 --- a/docs/searchindex.js +++ b/docs/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["PyCTBN","PyCTBN.PyCTBN","PyCTBN.PyCTBN.estimators","PyCTBN.PyCTBN.optimizers","PyCTBN.PyCTBN.structure_graph","PyCTBN.PyCTBN.utility","PyCTBN.tests","PyCTBN.tests.estimators","PyCTBN.tests.optimizers","PyCTBN.tests.structure_graph","PyCTBN.tests.utility","basic_main","examples","index","modules","setup"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["PyCTBN.rst","PyCTBN.PyCTBN.rst","PyCTBN.PyCTBN.estimators.rst","PyCTBN.PyCTBN.optimizers.rst","PyCTBN.PyCTBN.structure_graph.rst","PyCTBN.PyCTBN.utility.rst","PyCTBN.tests.rst","PyCTBN.tests.estimators.rst","PyCTBN.tests.optimizers.rst","PyCTBN.tests.structure_graph.rst","PyCTBN.tests.utility.rst","basic_main.rst","examples.rst","index.rst","modules.rst","setup.rst"],objects:{"":{PyCTBN:[0,0,0,"-"]},"PyCTBN.PyCTBN":{estimators:[2,0,0,"-"],optimizers:[3,0,0,"-"],structure_graph:[4,0,0,"-"],utility:[5,0,0,"-"]},"PyCTBN.PyCTBN.estimators":{fam_score_calculator:[2,0,0,"-"],parameters_estimator:[2,0,0,"-"],structure_constraint_based_estimator:[2,0,0,"-"],structure_estimator:[2,0,0,"-"],structure_score_based_estimator:[2,0,0,"-"]},"PyCTBN.PyCTBN.estimators.fam_score_calculator":{FamScoreCalculator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator":{get_fam_score:[2,2,1,""],marginal_likelihood_q:[2,2,1,""],marginal_likelihood_theta:[2,2,1,""],single_cim_xu_marginal_likelihood_q:[2,2,1,""],single_cim_xu_marginal_likelihood_theta:[2,2,1,""],single_internal_cim_xxu_marginal_likelihood_theta:[2,2,1,""],variable_cim_xu_marginal_likelihood_q:[2,2,1,""],variable_cim_xu_marginal_likelihood_theta:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator":{ParametersEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator":{compute_parameters_for_node:[2,2,1,""],compute_state_res_time_for_node:[2,2,1,""],compute_state_transitions_for_a_node:[2,2,1,""],fast_init:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator":{StructureConstraintBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator":{complete_test:[2,2,1,""],compute_thumb_value:[2,2,1,""],ctpc_algorithm:[2,2,1,""],estimate_structure:[2,2,1,""],independence_test:[2,2,1,""],one_iteration_of_CTPC_algorithm:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator":{StructureEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator":{adjacency_matrix:[2,2,1,""],build_complete_graph:[2,2,1,""],build_removable_edges_matrix:[2,2,1,""],estimate_structure:[2,2,1,""],generate_possible_sub_sets_of_size:[2,2,1,""],save_plot_estimated_structure_graph:[2,2,1,""],save_results:[2,2,1,""],spurious_edges:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator":{StructureScoreBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator":{estimate_parents:[2,2,1,""],estimate_structure:[2,2,1,""],get_score_from_graph:[2,2,1,""]},"PyCTBN.PyCTBN.optimizers":{constraint_based_optimizer:[3,0,0,"-"],hill_climbing_search:[3,0,0,"-"],optimizer:[3,0,0,"-"],tabu_search:[3,0,0,"-"]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer":{ConstraintBasedOptimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search":{HillClimbing:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search.HillClimbing":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer":{Optimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer.Optimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search":{TabuSearch:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search.TabuSearch":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.structure_graph":{conditional_intensity_matrix:[4,0,0,"-"],network_graph:[4,0,0,"-"],sample_path:[4,0,0,"-"],set_of_cims:[4,0,0,"-"],structure:[4,0,0,"-"],trajectory:[4,0,0,"-"]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix":{ConditionalIntensityMatrix:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix":{cim:[4,2,1,""],compute_cim_coefficients:[4,2,1,""],state_residence_times:[4,2,1,""],state_transition_matrix:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph":{NetworkGraph:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph":{add_edges:[4,2,1,""],add_nodes:[4,2,1,""],build_p_comb_structure_for_a_node:[4,2,1,""],build_time_columns_filtering_for_a_node:[4,2,1,""],build_time_scalar_indexing_structure_for_a_node:[4,2,1,""],build_transition_filtering_for_a_node:[4,2,1,""],build_transition_scalar_indexing_structure_for_a_node:[4,2,1,""],clear_indexing_filtering_structures:[4,2,1,""],edges:[4,2,1,""],fast_init:[4,2,1,""],get_node_indx:[4,2,1,""],get_ordered_by_indx_set_of_parents:[4,2,1,""],get_parents_by_id:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],has_edge:[4,2,1,""],nodes:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_values:[4,2,1,""],p_combs:[4,2,1,""],remove_edges:[4,2,1,""],remove_node:[4,2,1,""],time_filtering:[4,2,1,""],time_scalar_indexing_strucure:[4,2,1,""],transition_filtering:[4,2,1,""],transition_scalar_indexing_structure:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path":{SamplePath:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath":{build_structure:[4,2,1,""],build_trajectories:[4,2,1,""],clear_memory:[4,2,1,""],has_prior_net_structure:[4,2,1,""],structure:[4,2,1,""],total_variables_count:[4,2,1,""],trajectories:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims":{SetOfCims:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims":{actual_cims:[4,2,1,""],build_cims:[4,2,1,""],build_times_and_transitions_structures:[4,2,1,""],filter_cims_with_mask:[4,2,1,""],get_cims_number:[4,2,1,""],p_combs:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.structure":{Structure:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.structure.Structure":{add_edge:[4,2,1,""],clean_structure_edges:[4,2,1,""],contains_edge:[4,2,1,""],edges:[4,2,1,""],get_node_id:[4,2,1,""],get_node_indx:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_labels:[4,2,1,""],nodes_values:[4,2,1,""],remove_edge:[4,2,1,""],remove_node:[4,2,1,""],total_variables_number:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory":{Trajectory:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory":{complete_trajectory:[4,2,1,""],size:[4,2,1,""],times:[4,2,1,""],trajectory:[4,2,1,""]},"PyCTBN.PyCTBN.utility":{abstract_importer:[5,0,0,"-"],cache:[5,0,0,"-"],json_importer:[5,0,0,"-"],sample_importer:[5,0,0,"-"]},"PyCTBN.PyCTBN.utility.abstract_importer":{AbstractImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter":{build_list_of_samples_array:[5,2,1,""],build_sorter:[5,2,1,""],clear_concatenated_frame:[5,2,1,""],compute_row_delta_in_all_samples_frames:[5,2,1,""],compute_row_delta_sigle_samples_frame:[5,2,1,""],concatenated_samples:[5,2,1,""],dataset_id:[5,2,1,""],file_path:[5,2,1,""],sorter:[5,2,1,""],structure:[5,2,1,""],variables:[5,2,1,""]},"PyCTBN.PyCTBN.utility.cache":{Cache:[5,1,1,""]},"PyCTBN.PyCTBN.utility.cache.Cache":{clear:[5,2,1,""],find:[5,2,1,""],put:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_importer":{JsonImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_importer.JsonImporter":{build_sorter:[5,2,1,""],clear_data_frame_list:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""],import_sampled_cims:[5,2,1,""],import_structure:[5,2,1,""],import_trajectories:[5,2,1,""],import_variables:[5,2,1,""],normalize_trajectories:[5,2,1,""],one_level_normalizing:[5,2,1,""],read_json_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.sample_importer":{SampleImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.sample_importer.SampleImporter":{build_sorter:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""]},"PyCTBN.tests":{estimators:[7,0,0,"-"],optimizers:[8,0,0,"-"],structure_graph:[9,0,0,"-"],utility:[10,0,0,"-"]},"PyCTBN.tests.estimators":{test_parameters_estimator:[7,0,0,"-"],test_structure_constraint_based_estimator:[7,0,0,"-"],test_structure_estimator:[7,0,0,"-"],test_structure_score_based_estimator:[7,0,0,"-"]},"PyCTBN.tests.estimators.test_parameters_estimator":{TestParametersEstimatior:[7,1,1,""]},"PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior":{aux_import_sampled_cims:[7,2,1,""],cim_equality_test:[7,2,1,""],equality_of_cims_of_node:[7,2,1,""],setUpClass:[7,2,1,""],test_compute_parameters_for_node:[7,2,1,""],test_fast_init:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator":{TestStructureConstraintBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_estimator":{TestStructureEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator":{setUpClass:[7,2,1,""],test_adjacency_matrix:[7,2,1,""],test_build_complete_graph:[7,2,1,""],test_build_removable_edges_matrix:[7,2,1,""],test_generate_possible_sub_sets_of_size:[7,2,1,""],test_init:[7,2,1,""],test_save_plot_estimated_graph:[7,2,1,""],test_save_results:[7,2,1,""],test_time:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator":{TestStructureScoreBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""],test_structure_monoprocesso:[7,2,1,""]},"PyCTBN.tests.optimizers":{test_hill_climbing_search:[8,0,0,"-"],test_tabu_search:[8,0,0,"-"]},"PyCTBN.tests.optimizers.test_hill_climbing_search":{TestHillClimbingSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_hill_climbing_search.TestHillClimbingSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.optimizers.test_tabu_search":{TestTabuSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_tabu_search.TestTabuSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.structure_graph":{test_cim:[9,0,0,"-"],test_networkgraph:[9,0,0,"-"],test_sample_path:[9,0,0,"-"],test_setofcims:[9,0,0,"-"],test_structure:[9,0,0,"-"],test_trajectory:[9,0,0,"-"]},"PyCTBN.tests.structure_graph.test_cim":{TestConditionalIntensityMatrix:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix":{setUpClass:[9,2,1,""],test_compute_cim_coefficients:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph":{TestNetworkGraph:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph":{aux_build_p_combs_structure:[9,2,1,""],aux_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],aux_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],aux_build_transition_columns_filtering_structure:[9,2,1,""],aux_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_add_edges:[9,2,1,""],test_add_nodes:[9,2,1,""],test_build_p_combs_structure:[9,2,1,""],test_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],test_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],test_build_transition_columns_filtering_structure:[9,2,1,""],test_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],test_fast_init:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_ordered_by_indx_set_of_parents:[9,2,1,""],test_get_parents_by_id:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_sample_path":{TestSamplePath:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath":{setUpClass:[9,2,1,""],test_buid_samplepath_no_concatenated_samples:[9,2,1,""],test_buid_samplepath_no_variables:[9,2,1,""],test_build_saplepath_no_prior_net_structure:[9,2,1,""],test_build_structure:[9,2,1,""],test_build_structure_bad_sorter:[9,2,1,""],test_build_trajectories:[9,2,1,""],test_init:[9,2,1,""],test_init_not_filled_dataframse:[9,2,1,""],test_init_not_initialized_importer:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_setofcims":{TestSetOfCims:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims":{another_filtering_method:[9,2,1,""],aux_test_build_cims:[9,2,1,""],aux_test_init:[9,2,1,""],build_p_comb_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_build_cims:[9,2,1,""],test_filter_cims_with_mask:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_structure":{TestStructure:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_structure.TestStructure":{setUpClass:[9,2,1,""],test_edges_operations:[9,2,1,""],test_equality:[9,2,1,""],test_get_node_id:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_positional_node_indx:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectory":{TestTrajectory:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory":{setUpClass:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.utility":{test_cache:[10,0,0,"-"],test_json_importer:[10,0,0,"-"],test_sample_importer:[10,0,0,"-"]},"PyCTBN.tests.utility.test_cache":{TestCache:[10,1,1,""]},"PyCTBN.tests.utility.test_cache.TestCache":{test_clear:[10,2,1,""],test_find:[10,2,1,""],test_init:[10,2,1,""],test_put:[10,2,1,""]},"PyCTBN.tests.utility.test_json_importer":{TestJsonImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_json_importer.TestJsonImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_build_sorter:[10,2,1,""],test_clear_concatenated_frame:[10,2,1,""],test_clear_data_frame_list:[10,2,1,""],test_compute_row_delta_in_all_frames:[10,2,1,""],test_compute_row_delta_in_all_frames_not_init_sorter:[10,2,1,""],test_compute_row_delta_single_samples_frame:[10,2,1,""],test_dataset_id:[10,2,1,""],test_file_path:[10,2,1,""],test_import_data:[10,2,1,""],test_import_sampled_cims:[10,2,1,""],test_import_structure:[10,2,1,""],test_import_variables:[10,2,1,""],test_init:[10,2,1,""],test_normalize_trajectories:[10,2,1,""],test_normalize_trajectories_wrong_indx:[10,2,1,""],test_normalize_trajectories_wrong_key:[10,2,1,""],test_read_json_file_found:[10,2,1,""],test_read_json_file_not_found:[10,2,1,""]},"PyCTBN.tests.utility.test_sample_importer":{TestSampleImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_sample_importer.TestSampleImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_init:[10,2,1,""],test_order:[10,2,1,""]},PyCTBN:{PyCTBN:[1,0,0,"-"],tests:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"abstract":[2,3,4,5,12],"boolean":[2,4],"case":[7,8,9,10],"class":[2,3,4,5,7,8,9,10,12],"default":[2,3,5],"float":2,"function":2,"import":[4,5,13,14],"int":[2,3,4,5],"null":2,"return":[2,3,4,5,9,12],"static":[2,4],"super":12,"true":[2,12],"var":12,HAS:5,Has:[2,4],NOT:2,The:[2,4,5,12],Use:[2,12],__actual_cach:5,__init__:12,__list_of_sets_of_par:5,_actual_cim:4,_actual_trajectori:4,_aggregated_info_about_nodes_par:4,_array_indx:5,_cach:2,_cim:4,_complete_graph:2,_df_samples_list:[5,12],_df_structur:5,_df_variabl:[5,12],_file_path:12,_graph:[4,12],_import:4,_net_graph:2,_node:2,_node_id:4,_nodes_indx:2,_nodes_v:2,_p_combs_structur:4,_raw_data:5,_sample_path:2,_single_set_of_cim:2,_sorter:[5,12],_state_residence_tim:4,_structur:4,_structure_label:5,_time:4,_time_filt:4,_time_scalar_indexing_structur:4,_total_variables_count:4,_total_variables_numb:4,_trajectori:4,_transition_filt:4,_transition_matric:4,_transition_scalar_indexing_structur:4,_variables_label:5,abc:[3,5],about:[3,4],abstract_import:[0,1,4,13,14],abstractimport:[4,5,12],act:5,actual:[2,4],actual_cim:[4,12],add:[4,5],add_edg:4,add_nod:4,added:2,addit:2,adjac:[2,12],adjacency_matrix:[2,12],after:5,against:2,aggreg:4,algorithm:[2,3,12],all:[2,3,4,5,9,12],alpha_xu:2,alpha_xxu:2,alreadi:[5,12],also:[2,4],ani:[2,3],anoth:4,another_filtering_method:9,approach:2,arc:5,arrai:[2,4,5,12],assign:2,assum:2,aux_build_p_combs_structur:9,aux_build_time_columns_filtering_structure_for_a_nod:9,aux_build_time_scalar_indexing_structure_for_a_nod:9,aux_build_transition_columns_filtering_structur:9,aux_build_transition_scalar_indexing_structure_for_a_nod:9,aux_import_sampled_cim:7,aux_test_build_cim:9,aux_test_init:9,axi:12,base:[2,3,4,5,7,8,9,10],bayesian:2,befor:[2,3,7,8,9,10],belong:2,best:2,between:5,bool:[2,4],both:[2,5],bound:4,build:[2,4,5,9,12],build_cim:4,build_complete_graph:2,build_list_of_samples_arrai:5,build_p_comb_structure_for_a_nod:[4,9],build_removable_edges_matrix:2,build_sort:[5,12],build_structur:[4,12],build_time_columns_filtering_for_a_nod:4,build_time_scalar_indexing_structure_for_a_nod:4,build_times_and_transitions_structur:4,build_trajectori:[4,12],build_transition_filtering_for_a_nod:4,build_transition_scalar_indexing_structure_for_a_nod:4,built:2,cach:[0,1,2,13,14],calcul:2,call:[5,12],cardin:[2,4,5,9],cardinalit:[4,5],caridin:4,caridinalit:4,chang:[4,5],check:4,chi:2,chi_test:2,chi_test_alfa:2,child:[2,3],child_indx:2,child_states_numb:2,child_val:2,cim1:[2,7],cim2:[2,7],cim:[2,4,5,12],cim_equality_test:7,cims_kei:5,cims_label:7,classmethod:[7,8,9,10],clean_structure_edg:4,clear:[4,5],clear_concatenated_fram:5,clear_data_frame_list:5,clear_indexing_filtering_structur:4,clear_memori:4,climb:[2,3],coeffici:4,col:4,cols_filt:2,column:[2,4,5,12],columns_head:5,comb:4,combin:[4,5,9],combinatori:[4,9],common:2,complet:[2,4,5],complete_test:2,complete_trajectori:4,comput:[2,3,4,5,12],compute_cim_coeffici:4,compute_parameters_for_nod:[2,12],compute_row_delta_in_all_samples_fram:[5,12],compute_row_delta_sigle_samples_fram:5,compute_state_res_time_for_nod:2,compute_state_transitions_for_a_nod:2,compute_thumb_valu:2,concatanated_sampl:5,concaten:[4,5],concatenated_sampl:5,condit:4,conditional_intensity_matrix:[0,1,2,13,14],conditionalintensitymatrix:[2,4],consid:[2,4],constraint:2,constraint_based_optim:[0,1,13,14],constraintbasedoptim:3,construct:[4,5,12],conta:5,contain:[2,4,5,9],contains_edg:4,content:[13,14],convert:[2,5],copi:5,core:5,correct:[4,5],could:2,count:4,creat:[2,4,12],csv:12,csvimport:12,ctbn:2,ctpc:[2,3,12],ctpc_algorithm:[2,12],current:[2,3,5],cut:5,dafram:5,data:[2,3,4,5,13,14],datafram:[4,5,12],dataset:[3,4,5],dataset_id:[5,12],datfram:5,def:12,defin:5,definit:5,defualt:2,delta:[2,4,5],demonstr:12,describ:5,desir:[2,4],df_samples_list:5,dict:[5,12],dictionari:5,differ:5,differt:2,digraph:2,dimens:4,dir:12,direct:[2,4],directli:5,disabl:[2,3],disable_multiprocess:2,distribuit:2,doc:5,doubl:4,download:12,drop:12,duplic:4,dyn:12,each:[2,3,5],edg:[2,4,5,12],edges_list:4,end:5,entir:2,equal:4,equality_of_cims_of_nod:7,est:12,estim:[0,1,3,4,6,13,14],estimate_par:2,estimate_structur:2,estimated_cim:7,everi:[4,5],exam:12,exampl:[5,13,14],exclud:2,exctract:5,exist:5,exp_test_alfa:2,exponenti:2,expos:5,extend:12,extens:[2,5],extract:[4,5],fals:2,fam_score_calcul:[0,1,13,14],famscor:2,famscorecalcul:2,fast_init:[2,4,12],file:[2,5,12],file_path:[2,5,12],filepath:5,fill:[2,12],filter:[2,4],filter_cims_with_mask:4,find:[2,5],first:[2,12],fixtur:[7,8,9,10],follow:[4,5],form:4,format:12,formula:2,found:5,frame:5,from:[4,5,12],from_nod:5,gener:2,generate_possible_sub_sets_of_s:2,get:[2,5],get_cims_numb:4,get_fam_scor:2,get_node_id:4,get_node_indx:4,get_ordered_by_indx_set_of_par:4,get_parents_by_id:4,get_positional_node_indx:4,get_score_from_graph:2,get_states_numb:4,given:[2,4,5],glob:12,graph:[2,4,9,12],graph_struct:4,graphic:2,grid:[4,9],grpah:12,has:[5,12],has_edg:4,has_prior_net_structur:4,have:5,header:5,header_column:5,hill:[2,3],hill_climbing_search:[0,1,13,14],hillclimb:3,hold:[2,4],hook:[7,8,9,10],how:5,hyperparamet:2,hypothesi:2,identifi:[2,4,5],iff:2,implement:[3,5,13,14],import_data:[5,12],import_sampled_cim:5,import_structur:5,import_trajectori:5,import_vari:[5,12],improv:[2,3],includ:2,independ:2,independence_test:2,index:[2,4,5,12,13],indic:4,indx:5,info:[4,12],inform:[3,4],init:12,initi:[2,4,5,12],inplac:12,insid:12,instal:[13,14],interest:4,interfac:3,intes:4,iter:[2,3],iterations_numb:[2,3],its:[2,3],join:12,json:[2,5,12],json_import:[0,1,13,14],jsonarrai:5,jsonimport:[5,12],keep:[2,3,5],kei:5,kind:2,knowledg:2,known:2,known_edg:2,label:[2,3,4,5],lenght:[2,3],level:[2,5],likelihood:2,list:[2,3,4,5,12],list_of_column:4,list_of_edg:4,list_of_nod:4,load:5,loop:2,m_xu_suff_stat:2,m_xxu_suff_stat:2,main:12,margin:2,marginal_likelihood_q:2,marginal_likelihood_theta:2,mask:[4,9],mask_arr:4,matric:[2,4],matrix:[2,4,5,9,12],max_par:[2,3],maximum:[2,3],member:[4,5],mention:4,merg:5,method:[2,5,7,8,9,10],methodnam:[7,8,9,10],model:2,modul:[13,14],multipl:5,multiprocess:2,name:[2,4,5,12],ndarrai:[2,4,5],necessari:[2,4,5],nest:5,net:[2,3,4,5,12],net_graph:2,network:[2,4,5],network_graph:[0,1,2,13,14],networkgraph:[2,4,12],networkx:2,node:[2,3,4,5,9,12],node_id:[2,3,4,9],node_index:4,node_indx:[2,4],node_st:[4,9],node_states_numb:[4,9],nodes_index:4,nodes_indexes_arr:4,nodes_label:4,nodes_labels_list:4,nodes_numb:4,nodes_vals_arr:4,nodes_valu:[4,12],none:[2,3,4,5,7,9,10,12],normal:5,normalize_trajectori:5,number:[2,3,4],numpi:[2,4,5,9],obj:[10,12],object:[2,3,4,5,12],one:[4,5],one_iteration_of_ctpc_algorithm:2,one_level_norm:5,onli:5,oper:2,optim:[0,1,2,6,13,14],optimize_structur:3,option:[2,3],order:[2,5,10],origin:5,original_cols_numb:4,otherwis:[2,5],out:5,outer:[5,12],over:2,own:[13,14],p_comb:[4,9],p_indx:[4,9],p_val:9,p_valu:9,packag:[13,14],page:13,panda:[5,12],param:4,paramet:[2,3,4,5,9,13,14],parameters_estim:[0,1,13,14],parametersestim:[2,12],parent:[2,3,4,5],parent_indx:2,parent_label:2,parent_set:2,parent_set_v:2,parent_v:2,parent_valu:9,parents_cardin:4,parents_comb:5,parents_index:4,parents_indx:9,parents_label:[4,9],parents_states_numb:[4,9],parents_v:[4,9],parents_valu:[4,9],part:2,particular:[2,5],pass:12,path:[2,5,12],patienc:[2,3],peest:12,perform:2,pip:12,place:5,plot:2,png:2,posit:[4,5],possibl:[2,4],predict:3,prepar:5,present:[2,5],print:12,prior:[2,12],prior_net_structur:5,process:[2,3,4,5],properli:5,properti:[4,5],put:5,pyctbn:12,q_xx:4,rappres:4,raw:5,raw_data:5,read:[5,12],read_csv:12,read_csv_fil:12,read_fil:12,read_json_fil:5,real:[2,4,5,12],refer:[4,5],reject:2,rel:4,relat:5,releas:12,remain:5,remov:[2,4,5],remove_edg:4,remove_nod:4,repres:4,represent:2,res:4,resid:[2,4],result:[2,5,12],rtype:4,rule:[2,3],run:[7,8,9,10],runtest:[7,8,9,10],same:5,sampl:[4,5,12],sample_fram:[5,12],sample_import:[0,1,13,14],sample_path:[0,1,2,13,14],sampled_cim:7,sampleimport:5,samplepath:[2,4,12],samples_label:5,save:[2,12],save_plot_estimated_structure_graph:2,save_result:[2,12],scalar_index:2,scalar_indexes_struct:2,score:2,se1:12,search:[2,3,13],second:2,see:5,select:12,self:[2,5,12],sep:2,sep_set:2,set:[2,4,5,7,8,9,10],set_of_cim:[0,1,2,5,13,14],setofcim:[2,4,5,12],setupclass:[7,8,9,10],shift:[4,5],shifted_cols_head:5,show:2,signific:2,simbol:5,simpl:12,simpli:12,sinc:4,single_cim_xu_marginal_likelihood_q:2,single_cim_xu_marginal_likelihood_theta:2,single_internal_cim_xxu_marginal_likelihood_theta:2,size:[2,4],socim:5,sofc1:12,sorter:5,specif:[2,4,12],spuriou:2,spurious_edg:2,start:5,state:[2,4],state_res_tim:4,state_residence_tim:4,state_transition_matrix:4,statist:2,stop:[2,3],str:[2,3,4,5,12],string:[2,3,4,5],structur:[0,1,2,3,5,9,13,14],structure_constraint_based_estim:[0,1,13,14],structure_estim:[0,1,3,13,14],structure_estimation_exampl:12,structure_graph:[0,1,2,5,6,13,14],structure_label:5,structure_score_based_estim:[0,1,13,14],structureconstraintbasedestim:2,structureestim:[2,3,12],structurescorebasedestim:2,structut:4,style:2,submodul:[1,6,13,14],subpackag:[13,14],subset:2,suffici:2,suffuci:2,symbol:[4,5],synthet:5,t_xu_suff_stat:2,tabu:[2,3],tabu_length:[2,3],tabu_rules_dur:[2,3],tabu_search:[0,1,13,14],tabusearch:3,take:12,tar:12,task:[2,4],tau_xu:2,ternari:12,test:2,test_add_edg:9,test_add_nod:9,test_adjacency_matrix:7,test_buid_samplepath_no_concatenated_sampl:9,test_buid_samplepath_no_vari:9,test_build_cim:9,test_build_complete_graph:7,test_build_p_combs_structur:9,test_build_removable_edges_matrix:7,test_build_saplepath_no_prior_net_structur:9,test_build_sort:10,test_build_structur:9,test_build_structure_bad_sort:9,test_build_time_columns_filtering_structure_for_a_nod:9,test_build_time_scalar_indexing_structure_for_a_nod:9,test_build_trajectori:9,test_build_transition_columns_filtering_structur:9,test_build_transition_scalar_indexing_structure_for_a_nod:9,test_cach:6,test_child:2,test_cim:6,test_clear:10,test_clear_concatenated_fram:10,test_clear_data_frame_list:10,test_compute_cim_coeffici:9,test_compute_parameters_for_nod:7,test_compute_row_delta_in_all_fram:10,test_compute_row_delta_in_all_frames_not_init_sort:10,test_compute_row_delta_single_samples_fram:10,test_dataset_id:10,test_edges_oper:9,test_equ:9,test_fast_init:[7,9],test_file_path:10,test_filter_cims_with_mask:9,test_find:10,test_generate_possible_sub_sets_of_s:7,test_get_node_id:9,test_get_node_indx:9,test_get_ordered_by_indx_set_of_par:9,test_get_parents_by_id:9,test_get_positional_node_indx:9,test_get_states_numb:9,test_hill_climbing_search:6,test_import_data:10,test_import_sampled_cim:10,test_import_structur:10,test_import_vari:10,test_init:[7,9,10],test_init_not_filled_dataframs:9,test_init_not_initialized_import:9,test_json_import:6,test_networkgraph:6,test_normalize_trajectori:10,test_normalize_trajectories_wrong_indx:10,test_normalize_trajectories_wrong_kei:10,test_ord:10,test_par:2,test_parameters_estim:6,test_put:10,test_read_json_file_found:10,test_read_json_file_not_found:10,test_repr:9,test_sample_import:6,test_sample_path:6,test_save_plot_estimated_graph:7,test_save_result:7,test_setofcim:6,test_structur:[6,8],test_structure_1:7,test_structure_2:7,test_structure_3:[7,8],test_structure_constraint_based_estim:6,test_structure_estim:6,test_structure_monoprocesso:7,test_structure_score_based_estim:6,test_tabu_search:6,test_tim:7,test_trajectori:6,testcach:10,testcas:[7,8,9,10],testconditionalintensitymatrix:9,testhillclimbingsearch:8,testjsonimport:10,testnetworkgraph:9,testparametersestimatior:7,testsampleimport:10,testsamplepath:9,testsetofcim:9,teststructur:9,teststructureconstraintbasedestim:7,teststructureestim:7,teststructurescorebasedestim:7,testtabusearch:8,testtrajectori:9,tha:5,theta:2,thi:[2,4,5,12],three:12,threshold:2,thumb:2,thumb_threshold:2,thumb_valu:2,time:[2,4,5,12],time_filt:4,time_kei:5,time_scalar_indexing_strucur:4,timestamp:5,to_nod:5,tot_vars_count:[2,3],total:[2,4],total_variables_count:4,total_variables_numb:4,traj:5,trajecory_head:5,trajectori:[0,1,2,5,12,13,14],trajectories_kei:5,trajectory_list:5,trajectri:12,transit:[2,4,5],transition_filt:4,transition_matric:4,transition_scalar_indexing_structur:4,tri:5,tupl:4,tutori:5,two:2,type:[2,3,4,5,12],union:5,uniqu:5,unittest:[7,8,9,10],unus:4,usag:[13,14],use:[2,12],used:[2,3,4,5],using:[2,3,4,5],util:[0,1,4,6,13,14],valid:2,valu:[2,3,4,5,9,12],values_list:12,var_id:2,variabl:[2,3,4,5,12],variable_cardin:5,variable_cim_xu_marginal_likelihood_q:2,variable_cim_xu_marginal_likelihood_theta:2,variable_label:5,variables_kei:5,variables_label:5,vector:[2,4],want:12,when:2,where:5,which:[2,3,4,5],whl:12,who:2,without:[2,3],you:[2,5,12],your:[13,14]},titles:["PyCTBN package","PyCTBN.PyCTBN package","PyCTBN.PyCTBN.estimators package","PyCTBN.PyCTBN.optimizers package","PyCTBN.PyCTBN.structure_graph package","PyCTBN.PyCTBN.utility package","PyCTBN.tests package","PyCTBN.tests.estimators package","PyCTBN.tests.optimizers package","PyCTBN.tests.structure_graph package","PyCTBN.tests.utility package","basic_main module","Examples","Welcome to PyCTBN\u2019s documentation!","PyCTBN","setup module"],titleterms:{"import":12,abstract_import:5,basic_main:11,cach:5,conditional_intensity_matrix:4,constraint_based_optim:3,content:[0,1,2,3,4,5,6,7,8,9,10],data:12,document:13,estim:[2,7,12],exampl:12,fam_score_calcul:2,hill_climbing_search:3,implement:12,indic:13,instal:12,json_import:5,modul:[0,1,2,3,4,5,6,7,8,9,10,11,15],network_graph:4,optim:[3,8],own:12,packag:[0,1,2,3,4,5,6,7,8,9,10],paramet:12,parameters_estim:2,pyctbn:[0,1,2,3,4,5,6,7,8,9,10,13,14],sample_import:5,sample_path:4,set_of_cim:4,setup:15,structur:[4,12],structure_constraint_based_estim:2,structure_estim:2,structure_graph:[4,9],structure_score_based_estim:2,submodul:[0,2,3,4,5,7,8,9,10],subpackag:[0,1,6],tabl:13,tabu_search:3,test:[6,7,8,9,10],test_cach:10,test_cim:9,test_hill_climbing_search:8,test_json_import:10,test_networkgraph:9,test_parameters_estim:7,test_sample_import:10,test_sample_path:9,test_setofcim:9,test_structur:9,test_structure_constraint_based_estim:7,test_structure_estim:7,test_structure_score_based_estim:7,test_tabu_search:8,test_trajectori:9,trajectori:4,usag:12,util:[5,10],welcom:13,your:12}}) \ No newline at end of file +Search.setIndex({docnames:["PyCTBN","PyCTBN.PyCTBN","PyCTBN.PyCTBN.estimators","PyCTBN.PyCTBN.optimizers","PyCTBN.PyCTBN.structure_graph","PyCTBN.PyCTBN.utility","PyCTBN.tests","PyCTBN.tests.estimators","PyCTBN.tests.optimizers","PyCTBN.tests.structure_graph","PyCTBN.tests.utility","basic_main","examples","index","modules","setup"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["PyCTBN.rst","PyCTBN.PyCTBN.rst","PyCTBN.PyCTBN.estimators.rst","PyCTBN.PyCTBN.optimizers.rst","PyCTBN.PyCTBN.structure_graph.rst","PyCTBN.PyCTBN.utility.rst","PyCTBN.tests.rst","PyCTBN.tests.estimators.rst","PyCTBN.tests.optimizers.rst","PyCTBN.tests.structure_graph.rst","PyCTBN.tests.utility.rst","basic_main.rst","examples.rst","index.rst","modules.rst","setup.rst"],objects:{"":{PyCTBN:[0,0,0,"-"]},"PyCTBN.PyCTBN":{estimators:[2,0,0,"-"],optimizers:[3,0,0,"-"],structure_graph:[4,0,0,"-"],utility:[5,0,0,"-"]},"PyCTBN.PyCTBN.estimators":{fam_score_calculator:[2,0,0,"-"],parameters_estimator:[2,0,0,"-"],structure_constraint_based_estimator:[2,0,0,"-"],structure_estimator:[2,0,0,"-"],structure_score_based_estimator:[2,0,0,"-"]},"PyCTBN.PyCTBN.estimators.fam_score_calculator":{FamScoreCalculator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator":{get_fam_score:[2,2,1,""],marginal_likelihood_q:[2,2,1,""],marginal_likelihood_theta:[2,2,1,""],single_cim_xu_marginal_likelihood_q:[2,2,1,""],single_cim_xu_marginal_likelihood_theta:[2,2,1,""],single_internal_cim_xxu_marginal_likelihood_theta:[2,2,1,""],variable_cim_xu_marginal_likelihood_q:[2,2,1,""],variable_cim_xu_marginal_likelihood_theta:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator":{ParametersEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator":{compute_parameters_for_node:[2,2,1,""],compute_state_res_time_for_node:[2,2,1,""],compute_state_transitions_for_a_node:[2,2,1,""],fast_init:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator":{StructureConstraintBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator":{complete_test:[2,2,1,""],compute_thumb_value:[2,2,1,""],ctpc_algorithm:[2,2,1,""],estimate_structure:[2,2,1,""],independence_test:[2,2,1,""],one_iteration_of_CTPC_algorithm:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator":{StructureEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator":{adjacency_matrix:[2,2,1,""],build_complete_graph:[2,2,1,""],build_removable_edges_matrix:[2,2,1,""],estimate_structure:[2,2,1,""],generate_possible_sub_sets_of_size:[2,2,1,""],save_plot_estimated_structure_graph:[2,2,1,""],save_results:[2,2,1,""],spurious_edges:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator":{StructureScoreBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator":{estimate_parents:[2,2,1,""],estimate_structure:[2,2,1,""],get_score_from_graph:[2,2,1,""]},"PyCTBN.PyCTBN.optimizers":{constraint_based_optimizer:[3,0,0,"-"],hill_climbing_search:[3,0,0,"-"],optimizer:[3,0,0,"-"],tabu_search:[3,0,0,"-"]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer":{ConstraintBasedOptimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search":{HillClimbing:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search.HillClimbing":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer":{Optimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer.Optimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search":{TabuSearch:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search.TabuSearch":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.structure_graph":{conditional_intensity_matrix:[4,0,0,"-"],network_graph:[4,0,0,"-"],sample_path:[4,0,0,"-"],set_of_cims:[4,0,0,"-"],structure:[4,0,0,"-"],trajectory:[4,0,0,"-"]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix":{ConditionalIntensityMatrix:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix":{cim:[4,2,1,""],compute_cim_coefficients:[4,2,1,""],state_residence_times:[4,2,1,""],state_transition_matrix:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph":{NetworkGraph:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph":{add_edges:[4,2,1,""],add_nodes:[4,2,1,""],build_p_comb_structure_for_a_node:[4,2,1,""],build_time_columns_filtering_for_a_node:[4,2,1,""],build_time_scalar_indexing_structure_for_a_node:[4,2,1,""],build_transition_filtering_for_a_node:[4,2,1,""],build_transition_scalar_indexing_structure_for_a_node:[4,2,1,""],clear_indexing_filtering_structures:[4,2,1,""],edges:[4,2,1,""],fast_init:[4,2,1,""],get_node_indx:[4,2,1,""],get_ordered_by_indx_set_of_parents:[4,2,1,""],get_parents_by_id:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],has_edge:[4,2,1,""],nodes:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_values:[4,2,1,""],p_combs:[4,2,1,""],remove_edges:[4,2,1,""],remove_node:[4,2,1,""],time_filtering:[4,2,1,""],time_scalar_indexing_strucure:[4,2,1,""],transition_filtering:[4,2,1,""],transition_scalar_indexing_structure:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path":{SamplePath:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath":{build_structure:[4,2,1,""],build_trajectories:[4,2,1,""],clear_memory:[4,2,1,""],has_prior_net_structure:[4,2,1,""],structure:[4,2,1,""],total_variables_count:[4,2,1,""],trajectories:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims":{SetOfCims:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims":{actual_cims:[4,2,1,""],build_cims:[4,2,1,""],build_times_and_transitions_structures:[4,2,1,""],filter_cims_with_mask:[4,2,1,""],get_cims_number:[4,2,1,""],p_combs:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.structure":{Structure:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.structure.Structure":{add_edge:[4,2,1,""],clean_structure_edges:[4,2,1,""],contains_edge:[4,2,1,""],edges:[4,2,1,""],get_node_id:[4,2,1,""],get_node_indx:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_labels:[4,2,1,""],nodes_values:[4,2,1,""],remove_edge:[4,2,1,""],remove_node:[4,2,1,""],total_variables_number:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory":{Trajectory:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory":{complete_trajectory:[4,2,1,""],size:[4,2,1,""],times:[4,2,1,""],trajectory:[4,2,1,""]},"PyCTBN.PyCTBN.utility":{abstract_importer:[5,0,0,"-"],cache:[5,0,0,"-"],json_importer:[5,0,0,"-"],sample_importer:[5,0,0,"-"]},"PyCTBN.PyCTBN.utility.abstract_importer":{AbstractImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter":{build_list_of_samples_array:[5,2,1,""],build_sorter:[5,2,1,""],clear_concatenated_frame:[5,2,1,""],compute_row_delta_in_all_samples_frames:[5,2,1,""],compute_row_delta_sigle_samples_frame:[5,2,1,""],concatenated_samples:[5,2,1,""],dataset_id:[5,2,1,""],file_path:[5,2,1,""],sorter:[5,2,1,""],structure:[5,2,1,""],variables:[5,2,1,""]},"PyCTBN.PyCTBN.utility.cache":{Cache:[5,1,1,""]},"PyCTBN.PyCTBN.utility.cache.Cache":{clear:[5,2,1,""],find:[5,2,1,""],put:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_importer":{JsonImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_importer.JsonImporter":{build_sorter:[5,2,1,""],clear_data_frame_list:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""],import_sampled_cims:[5,2,1,""],import_structure:[5,2,1,""],import_trajectories:[5,2,1,""],import_variables:[5,2,1,""],normalize_trajectories:[5,2,1,""],one_level_normalizing:[5,2,1,""],read_json_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.sample_importer":{SampleImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.sample_importer.SampleImporter":{build_sorter:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""]},"PyCTBN.tests":{estimators:[7,0,0,"-"],optimizers:[8,0,0,"-"],structure_graph:[9,0,0,"-"],utility:[10,0,0,"-"]},"PyCTBN.tests.estimators":{test_parameters_estimator:[7,0,0,"-"],test_structure_constraint_based_estimator:[7,0,0,"-"],test_structure_estimator:[7,0,0,"-"],test_structure_score_based_estimator:[7,0,0,"-"]},"PyCTBN.tests.estimators.test_parameters_estimator":{TestParametersEstimatior:[7,1,1,""]},"PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior":{aux_import_sampled_cims:[7,2,1,""],cim_equality_test:[7,2,1,""],equality_of_cims_of_node:[7,2,1,""],setUpClass:[7,2,1,""],test_compute_parameters_for_node:[7,2,1,""],test_fast_init:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator":{TestStructureConstraintBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_estimator":{TestStructureEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator":{setUpClass:[7,2,1,""],test_adjacency_matrix:[7,2,1,""],test_build_complete_graph:[7,2,1,""],test_build_removable_edges_matrix:[7,2,1,""],test_generate_possible_sub_sets_of_size:[7,2,1,""],test_init:[7,2,1,""],test_save_plot_estimated_graph:[7,2,1,""],test_save_results:[7,2,1,""],test_time:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator":{TestStructureScoreBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""],test_structure_monoprocesso:[7,2,1,""]},"PyCTBN.tests.optimizers":{test_hill_climbing_search:[8,0,0,"-"],test_tabu_search:[8,0,0,"-"]},"PyCTBN.tests.optimizers.test_hill_climbing_search":{TestHillClimbingSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_hill_climbing_search.TestHillClimbingSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.optimizers.test_tabu_search":{TestTabuSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_tabu_search.TestTabuSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.structure_graph":{test_cim:[9,0,0,"-"],test_networkgraph:[9,0,0,"-"],test_sample_path:[9,0,0,"-"],test_setofcims:[9,0,0,"-"],test_structure:[9,0,0,"-"],test_trajectory:[9,0,0,"-"]},"PyCTBN.tests.structure_graph.test_cim":{TestConditionalIntensityMatrix:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix":{setUpClass:[9,2,1,""],test_compute_cim_coefficients:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph":{TestNetworkGraph:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph":{aux_build_p_combs_structure:[9,2,1,""],aux_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],aux_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],aux_build_transition_columns_filtering_structure:[9,2,1,""],aux_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_add_edges:[9,2,1,""],test_add_nodes:[9,2,1,""],test_build_p_combs_structure:[9,2,1,""],test_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],test_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],test_build_transition_columns_filtering_structure:[9,2,1,""],test_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],test_fast_init:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_ordered_by_indx_set_of_parents:[9,2,1,""],test_get_parents_by_id:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_sample_path":{TestSamplePath:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath":{setUpClass:[9,2,1,""],test_buid_samplepath_no_concatenated_samples:[9,2,1,""],test_buid_samplepath_no_variables:[9,2,1,""],test_build_saplepath_no_prior_net_structure:[9,2,1,""],test_build_structure:[9,2,1,""],test_build_structure_bad_sorter:[9,2,1,""],test_build_trajectories:[9,2,1,""],test_init:[9,2,1,""],test_init_not_filled_dataframse:[9,2,1,""],test_init_not_initialized_importer:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_setofcims":{TestSetOfCims:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims":{another_filtering_method:[9,2,1,""],aux_test_build_cims:[9,2,1,""],aux_test_init:[9,2,1,""],build_p_comb_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_build_cims:[9,2,1,""],test_filter_cims_with_mask:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_structure":{TestStructure:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_structure.TestStructure":{setUpClass:[9,2,1,""],test_edges_operations:[9,2,1,""],test_equality:[9,2,1,""],test_get_node_id:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_positional_node_indx:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectory":{TestTrajectory:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory":{setUpClass:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.utility":{test_cache:[10,0,0,"-"],test_json_importer:[10,0,0,"-"],test_sample_importer:[10,0,0,"-"]},"PyCTBN.tests.utility.test_cache":{TestCache:[10,1,1,""]},"PyCTBN.tests.utility.test_cache.TestCache":{test_clear:[10,2,1,""],test_find:[10,2,1,""],test_init:[10,2,1,""],test_put:[10,2,1,""]},"PyCTBN.tests.utility.test_json_importer":{TestJsonImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_json_importer.TestJsonImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_build_sorter:[10,2,1,""],test_clear_concatenated_frame:[10,2,1,""],test_clear_data_frame_list:[10,2,1,""],test_compute_row_delta_in_all_frames:[10,2,1,""],test_compute_row_delta_in_all_frames_not_init_sorter:[10,2,1,""],test_compute_row_delta_single_samples_frame:[10,2,1,""],test_dataset_id:[10,2,1,""],test_file_path:[10,2,1,""],test_import_data:[10,2,1,""],test_import_sampled_cims:[10,2,1,""],test_import_structure:[10,2,1,""],test_import_variables:[10,2,1,""],test_init:[10,2,1,""],test_normalize_trajectories:[10,2,1,""],test_normalize_trajectories_wrong_indx:[10,2,1,""],test_normalize_trajectories_wrong_key:[10,2,1,""],test_read_json_file_found:[10,2,1,""],test_read_json_file_not_found:[10,2,1,""]},"PyCTBN.tests.utility.test_sample_importer":{TestSampleImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_sample_importer.TestSampleImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_init:[10,2,1,""],test_order:[10,2,1,""]},PyCTBN:{PyCTBN:[1,0,0,"-"],tests:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"abstract":[2,3,4,5,12],"boolean":[2,4],"case":[7,8,9,10],"class":[2,3,4,5,7,8,9,10,12],"default":[2,3,5],"float":2,"function":2,"import":[4,5,13,14],"int":[2,3,4,5],"null":2,"return":[2,3,4,5,9,12],"static":[2,4],"super":12,"true":[2,12],"var":12,HAS:5,Has:[2,4],NOT:2,The:[2,4,5,12],Use:[2,12],__actual_cach:5,__init__:12,__list_of_sets_of_par:5,_actual_cim:4,_actual_trajectori:4,_aggregated_info_about_nodes_par:4,_array_indx:5,_cach:2,_cim:4,_complete_graph:2,_df_samples_list:[5,12],_df_structur:5,_df_variabl:[5,12],_file_path:12,_graph:[4,12],_import:4,_net_graph:2,_node:2,_node_id:4,_nodes_indx:2,_nodes_v:2,_p_combs_structur:4,_raw_data:5,_sample_path:2,_single_set_of_cim:2,_sorter:[5,12],_state_residence_tim:4,_structur:4,_structure_label:5,_time:4,_time_filt:4,_time_scalar_indexing_structur:4,_total_variables_count:4,_total_variables_numb:4,_trajectori:4,_transition_filt:4,_transition_matric:4,_transition_scalar_indexing_structur:4,_variables_label:5,abc:[3,5],about:[3,4],abstract_import:[0,1,4,13,14],abstractimport:[4,5,12],act:5,actual:[2,4],actual_cim:[4,12],add:[4,5],add_edg:4,add_nod:4,added:2,addit:2,adjac:[2,12],adjacency_matrix:[2,12],after:5,against:2,aggreg:4,algorithm:[2,3,12],all:[2,3,4,5,9,12],alpha_xu:2,alpha_xxu:2,alreadi:[5,12],also:[2,4],ani:[2,3],anoth:4,another_filtering_method:9,approach:2,arc:5,arrai:[2,4,5,12],assign:2,assum:2,automat:2,aux_build_p_combs_structur:9,aux_build_time_columns_filtering_structure_for_a_nod:9,aux_build_time_scalar_indexing_structure_for_a_nod:9,aux_build_transition_columns_filtering_structur:9,aux_build_transition_scalar_indexing_structure_for_a_nod:9,aux_import_sampled_cim:7,aux_test_build_cim:9,aux_test_init:9,axi:12,base:[2,3,4,5,7,8,9,10],bayesian:2,befor:[2,3,7,8,9,10],belong:2,best:2,between:5,bool:[2,4],both:[2,5],bound:4,build:[2,4,5,9,12],build_cim:4,build_complete_graph:2,build_list_of_samples_arrai:5,build_p_comb_structure_for_a_nod:[4,9],build_removable_edges_matrix:2,build_sort:[5,12],build_structur:[4,12],build_time_columns_filtering_for_a_nod:4,build_time_scalar_indexing_structure_for_a_nod:4,build_times_and_transitions_structur:4,build_trajectori:[4,12],build_transition_filtering_for_a_nod:4,build_transition_scalar_indexing_structure_for_a_nod:4,built:2,cach:[0,1,2,13,14],calcul:2,call:[5,12],cardin:[2,4,5,9],cardinalit:[4,5],caridin:4,caridinalit:4,chang:[4,5],check:4,chi:2,chi_test:2,chi_test_alfa:2,child:[2,3],child_indx:2,child_states_numb:2,child_val:2,cim1:[2,7],cim2:[2,7],cim:[2,4,5,12],cim_equality_test:7,cims_kei:5,cims_label:7,classmethod:[7,8,9,10],clean_structure_edg:4,clear:[4,5],clear_concatenated_fram:5,clear_data_frame_list:5,clear_indexing_filtering_structur:4,clear_memori:4,climb:[2,3],coeffici:4,col:4,cols_filt:2,column:[2,4,5,12],columns_head:5,comb:4,combin:[4,5,9],combinatori:[4,9],common:2,complet:[2,4,5],complete_test:2,complete_trajectori:4,comput:[2,3,4,5,12],compute_cim_coeffici:4,compute_parameters_for_nod:[2,12],compute_row_delta_in_all_samples_fram:[5,12],compute_row_delta_sigle_samples_fram:5,compute_state_res_time_for_nod:2,compute_state_transitions_for_a_nod:2,compute_thumb_valu:2,concatanated_sampl:5,concaten:[4,5],concatenated_sampl:5,condit:4,conditional_intensity_matrix:[0,1,2,13,14],conditionalintensitymatrix:[2,4],consid:[2,4],constraint:2,constraint_based_optim:[0,1,13,14],constraintbasedoptim:3,construct:[4,5,12],conta:5,contain:[2,4,5,9],contains_edg:4,content:[13,14],convert:[2,5],copi:5,core:5,correct:[4,5],could:2,count:4,creat:[2,4,12],csv:12,csvimport:12,ctbn:2,ctpc:[2,3,12],ctpc_algorithm:[2,12],current:[2,3,5],cut:5,dafram:5,data:[2,3,4,5,13,14],datafram:[4,5,12],dataset:[3,4,5],dataset_id:[5,12],datfram:5,def:12,defin:5,definit:5,defualt:2,delta:[2,4,5],demonstr:12,describ:5,desir:[2,4],df_samples_list:5,dict:[5,12],dictionari:5,differ:5,differt:2,digraph:2,dimens:4,dir:12,direct:[2,4],directli:5,disabl:[2,3],disable_multiprocess:2,distribuit:2,doc:5,doubl:4,download:12,drop:12,duplic:4,dyn:12,each:[2,3,5],edg:[2,4,5,12],edges_list:4,end:5,entir:2,equal:4,equality_of_cims_of_nod:7,est:12,estim:[0,1,3,4,6,13,14],estimate_par:2,estimate_structur:2,estimated_cim:7,everi:[4,5],exam:12,exampl:[5,13,14],exclud:2,exctract:5,exist:5,exp_test_alfa:2,exponenti:2,expos:5,extend:12,extens:[2,5],extract:[4,5],fals:2,fam_score_calcul:[0,1,13,14],famscor:2,famscorecalcul:2,fast_init:[2,4,12],file:[2,5,12],file_path:[2,5,12],filepath:5,fill:[2,12],filter:[2,4],filter_cims_with_mask:4,find:[2,5],first:[2,12],fixtur:[7,8,9,10],follow:[4,5],form:4,format:12,formula:2,found:5,frame:5,from:[4,5,12],from_nod:5,gener:2,generate_possible_sub_sets_of_s:2,get:[2,5],get_cims_numb:4,get_fam_scor:2,get_node_id:4,get_node_indx:4,get_ordered_by_indx_set_of_par:4,get_parents_by_id:4,get_positional_node_indx:4,get_score_from_graph:2,get_states_numb:4,given:[2,4,5],glob:12,graph:[2,4,9,12],graph_struct:4,graphic:2,grid:[4,9],grpah:12,has:[5,12],has_edg:4,has_prior_net_structur:4,have:5,header:5,header_column:5,hill:[2,3],hill_climbing_search:[0,1,13,14],hillclimb:3,hold:[2,4],hook:[7,8,9,10],how:5,hyperparamet:2,hypothesi:2,identifi:[2,4,5],iff:2,implement:[3,5,13,14],import_data:[5,12],import_sampled_cim:5,import_structur:5,import_trajectori:5,import_vari:[5,12],improv:[2,3],includ:2,independ:2,independence_test:2,index:[2,4,5,12,13],indic:[2,4],indx:5,info:[4,12],inform:[3,4],init:12,initi:[2,4,5,12],inplac:12,insid:12,instal:[13,14],interest:4,interfac:3,intes:4,iter:[2,3],iterations_numb:[2,3],its:[2,3],join:12,json:[2,5,12],json_import:[0,1,13,14],jsonarrai:5,jsonimport:[5,12],keep:[2,3,5],kei:5,kind:2,knowledg:2,known:2,known_edg:2,label:[2,3,4,5],lenght:[2,3],level:[2,5],likelihood:2,list:[2,3,4,5,12],list_of_column:4,list_of_edg:4,list_of_nod:4,load:5,loop:2,m_xu_suff_stat:2,m_xxu_suff_stat:2,main:12,margin:2,marginal_likelihood_q:2,marginal_likelihood_theta:2,mask:[4,9],mask_arr:4,matric:[2,4],matrix:[2,4,5,9,12],max_par:[2,3],maximum:[2,3],member:[4,5],mention:4,merg:5,method:[2,5,7,8,9,10],methodnam:[7,8,9,10],model:2,modul:[13,14],multipl:5,multiprocess:2,name:[2,4,5,12],ndarrai:[2,4,5],necessari:[2,4,5],nest:5,net:[2,3,4,5,12],net_graph:2,network:[2,4,5],network_graph:[0,1,2,13,14],networkgraph:[2,4,12],networkx:2,node:[2,3,4,5,9,12],node_id:[2,3,4,9],node_index:4,node_indx:[2,4],node_st:[4,9],node_states_numb:[4,9],nodes_index:4,nodes_indexes_arr:4,nodes_label:4,nodes_labels_list:4,nodes_numb:4,nodes_vals_arr:4,nodes_valu:[4,12],none:[2,3,4,5,7,9,10,12],normal:5,normalize_trajectori:5,number:[2,3,4],numpi:[2,4,5,9],obj:[10,12],object:[2,3,4,5,12],one:[4,5],one_iteration_of_ctpc_algorithm:2,one_level_norm:5,onli:5,oper:2,optim:[0,1,2,6,13,14],optimize_structur:3,option:[2,3],order:[2,5,10],origin:5,original_cols_numb:4,otherwis:[2,5],out:5,outer:[5,12],over:2,own:[13,14],p_comb:[4,9],p_indx:[4,9],p_val:9,p_valu:9,packag:[13,14],page:13,panda:[5,12],param:4,paramet:[2,3,4,5,9,13,14],parameters_estim:[0,1,13,14],parametersestim:[2,12],parent:[2,3,4,5],parent_indx:2,parent_label:2,parent_set:2,parent_set_v:2,parent_v:2,parent_valu:9,parents_cardin:4,parents_comb:5,parents_index:4,parents_indx:9,parents_label:[4,9],parents_states_numb:[4,9],parents_v:[4,9],parents_valu:[4,9],part:2,particular:[2,5],pass:12,path:[2,5,12],patienc:[2,3],peest:12,perform:2,pip:12,place:5,plot:2,png:2,posit:[4,5],possibl:[2,4],predict:3,prepar:5,present:[2,5],print:12,prior:[2,12],prior_net_structur:5,process:[2,3,4,5],processes_numb:2,properli:5,properti:[4,5],put:5,pyctbn:12,q_xx:4,rappres:4,raw:5,raw_data:5,read:[5,12],read_csv:12,read_csv_fil:12,read_fil:12,read_json_fil:5,real:[2,4,5,12],refer:[4,5],reject:2,rel:4,relat:5,releas:12,remain:5,remov:[2,4,5],remove_edg:4,remove_nod:4,repres:4,represent:2,res:4,resid:[2,4],result:[2,5,12],rtype:4,rule:[2,3],run:[7,8,9,10],runtest:[7,8,9,10],same:5,sampl:[4,5,12],sample_fram:[5,12],sample_import:[0,1,13,14],sample_path:[0,1,2,13,14],sampled_cim:7,sampleimport:5,samplepath:[2,4,12],samples_label:5,save:[2,12],save_plot_estimated_structure_graph:2,save_result:[2,12],scalar_index:2,scalar_indexes_struct:2,score:2,se1:12,search:[2,3,13],second:2,see:5,select:12,self:[2,5,12],sep:2,sep_set:2,set:[2,4,5,7,8,9,10],set_of_cim:[0,1,2,5,13,14],setofcim:[2,4,5,12],setupclass:[7,8,9,10],shift:[4,5],shifted_cols_head:5,show:2,signific:2,simbol:5,simpl:12,simpli:12,sinc:4,single_cim_xu_marginal_likelihood_q:2,single_cim_xu_marginal_likelihood_theta:2,single_internal_cim_xxu_marginal_likelihood_theta:2,size:[2,4],socim:5,sofc1:12,sorter:5,specif:[2,4,12],spuriou:2,spurious_edg:2,start:5,state:[2,4],state_res_tim:4,state_residence_tim:4,state_transition_matrix:4,statist:2,stop:[2,3],str:[2,3,4,5,12],string:[2,3,4,5],structur:[0,1,2,3,5,9,13,14],structure_constraint_based_estim:[0,1,13,14],structure_estim:[0,1,3,13,14],structure_estimation_exampl:12,structure_graph:[0,1,2,5,6,13,14],structure_label:5,structure_score_based_estim:[0,1,13,14],structureconstraintbasedestim:2,structureestim:[2,3,12],structurescorebasedestim:2,structut:4,style:2,submodul:[1,6,13,14],subpackag:[13,14],subset:2,suffici:2,suffuci:2,symbol:[4,5],synthet:5,t_xu_suff_stat:2,tabu:[2,3],tabu_length:[2,3],tabu_rules_dur:[2,3],tabu_search:[0,1,13,14],tabusearch:3,take:12,tar:12,task:[2,4],tau_xu:2,ternari:12,test:2,test_add_edg:9,test_add_nod:9,test_adjacency_matrix:7,test_buid_samplepath_no_concatenated_sampl:9,test_buid_samplepath_no_vari:9,test_build_cim:9,test_build_complete_graph:7,test_build_p_combs_structur:9,test_build_removable_edges_matrix:7,test_build_saplepath_no_prior_net_structur:9,test_build_sort:10,test_build_structur:9,test_build_structure_bad_sort:9,test_build_time_columns_filtering_structure_for_a_nod:9,test_build_time_scalar_indexing_structure_for_a_nod:9,test_build_trajectori:9,test_build_transition_columns_filtering_structur:9,test_build_transition_scalar_indexing_structure_for_a_nod:9,test_cach:6,test_child:2,test_cim:6,test_clear:10,test_clear_concatenated_fram:10,test_clear_data_frame_list:10,test_compute_cim_coeffici:9,test_compute_parameters_for_nod:7,test_compute_row_delta_in_all_fram:10,test_compute_row_delta_in_all_frames_not_init_sort:10,test_compute_row_delta_single_samples_fram:10,test_dataset_id:10,test_edges_oper:9,test_equ:9,test_fast_init:[7,9],test_file_path:10,test_filter_cims_with_mask:9,test_find:10,test_generate_possible_sub_sets_of_s:7,test_get_node_id:9,test_get_node_indx:9,test_get_ordered_by_indx_set_of_par:9,test_get_parents_by_id:9,test_get_positional_node_indx:9,test_get_states_numb:9,test_hill_climbing_search:6,test_import_data:10,test_import_sampled_cim:10,test_import_structur:10,test_import_vari:10,test_init:[7,9,10],test_init_not_filled_dataframs:9,test_init_not_initialized_import:9,test_json_import:6,test_networkgraph:6,test_normalize_trajectori:10,test_normalize_trajectories_wrong_indx:10,test_normalize_trajectories_wrong_kei:10,test_ord:10,test_par:2,test_parameters_estim:6,test_put:10,test_read_json_file_found:10,test_read_json_file_not_found:10,test_repr:9,test_sample_import:6,test_sample_path:6,test_save_plot_estimated_graph:7,test_save_result:7,test_setofcim:6,test_structur:[6,8],test_structure_1:7,test_structure_2:7,test_structure_3:[7,8],test_structure_constraint_based_estim:6,test_structure_estim:6,test_structure_monoprocesso:7,test_structure_score_based_estim:6,test_tabu_search:6,test_tim:7,test_trajectori:6,testcach:10,testcas:[7,8,9,10],testconditionalintensitymatrix:9,testhillclimbingsearch:8,testjsonimport:10,testnetworkgraph:9,testparametersestimatior:7,testsampleimport:10,testsamplepath:9,testsetofcim:9,teststructur:9,teststructureconstraintbasedestim:7,teststructureestim:7,teststructurescorebasedestim:7,testtabusearch:8,testtrajectori:9,tha:5,theta:2,thi:[2,4,5,12],three:12,threshold:2,thumb:2,thumb_threshold:2,thumb_valu:2,time:[2,4,5,12],time_filt:4,time_kei:5,time_scalar_indexing_strucur:4,timestamp:5,to_nod:5,tot_vars_count:[2,3],total:[2,4],total_variables_count:4,total_variables_numb:4,traj:5,trajecory_head:5,trajectori:[0,1,2,5,12,13,14],trajectories_kei:5,trajectory_list:5,trajectri:12,transit:[2,4,5],transition_filt:4,transition_matric:4,transition_scalar_indexing_structur:4,tri:5,tupl:4,tutori:5,two:2,type:[2,3,4,5,12],union:5,uniqu:5,unittest:[7,8,9,10],unus:4,usag:[13,14],use:[2,12],used:[2,3,4,5],using:[2,3,4,5],util:[0,1,4,6,13,14],valid:2,valu:[2,3,4,5,9,12],values_list:12,var_id:2,variabl:[2,3,4,5,12],variable_cardin:5,variable_cim_xu_marginal_likelihood_q:2,variable_cim_xu_marginal_likelihood_theta:2,variable_label:5,variables_kei:5,variables_label:5,vector:[2,4],want:12,when:2,where:5,which:[2,3,4,5],whl:12,who:2,without:[2,3],you:[2,5,12],your:[13,14]},titles:["PyCTBN package","PyCTBN.PyCTBN package","PyCTBN.PyCTBN.estimators package","PyCTBN.PyCTBN.optimizers package","PyCTBN.PyCTBN.structure_graph package","PyCTBN.PyCTBN.utility package","PyCTBN.tests package","PyCTBN.tests.estimators package","PyCTBN.tests.optimizers package","PyCTBN.tests.structure_graph package","PyCTBN.tests.utility package","basic_main module","Examples","Welcome to PyCTBN\u2019s documentation!","PyCTBN","setup module"],titleterms:{"import":12,abstract_import:5,basic_main:11,cach:5,conditional_intensity_matrix:4,constraint_based_optim:3,content:[0,1,2,3,4,5,6,7,8,9,10],data:12,document:13,estim:[2,7,12],exampl:12,fam_score_calcul:2,hill_climbing_search:3,implement:12,indic:13,instal:12,json_import:5,modul:[0,1,2,3,4,5,6,7,8,9,10,11,15],network_graph:4,optim:[3,8],own:12,packag:[0,1,2,3,4,5,6,7,8,9,10],paramet:12,parameters_estim:2,pyctbn:[0,1,2,3,4,5,6,7,8,9,10,13,14],sample_import:5,sample_path:4,set_of_cim:4,setup:15,structur:[4,12],structure_constraint_based_estim:2,structure_estim:2,structure_graph:[4,9],structure_score_based_estim:2,submodul:[0,2,3,4,5,7,8,9,10],subpackag:[0,1,6],tabl:13,tabu_search:3,test:[6,7,8,9,10],test_cach:10,test_cim:9,test_hill_climbing_search:8,test_json_import:10,test_networkgraph:9,test_parameters_estim:7,test_sample_import:10,test_sample_path:9,test_setofcim:9,test_structur:9,test_structure_constraint_based_estim:7,test_structure_estim:7,test_structure_score_based_estim:7,test_tabu_search:8,test_trajectori:9,trajectori:4,usag:12,util:[5,10],welcom:13,your:12}}) \ No newline at end of file diff --git a/docs/setup.html b/docs/setup.html index d942353..8f74cf7 100644 --- a/docs/setup.html +++ b/docs/setup.html @@ -58,7 +58,7 @@ -

                                                                                                                                Contents:

                                                                                                                                +

                                                                                                                                Contents:

                                                                                                                                • PyCTBN.PyCTBN package
                                                                                                                                  • Subpackages
                                                                                                                                  • @@ -112,9 +112,9 @@
                                                                                                                                    -
                                                                                                                                    +

                                                                                                                                    setup module

                                                                                                                                    -
                                                                                                                                    +
                                                                                                                                    From b76994d66b6f28079ee4625f388b1ea878222a84 Mon Sep 17 00:00:00 2001 From: Luca Moretti Date: Tue, 27 Apr 2021 21:38:51 +0200 Subject: [PATCH 115/139] Updated output messages --- .../estimators/structure_constraint_based_estimator.py | 5 +++-- .../PyCTBN/estimators/structure_score_based_estimator.py | 7 ++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py b/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py index 2fa255e..fdf4c16 100644 --- a/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py +++ b/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py @@ -225,13 +225,14 @@ class StructureConstraintBasedEstimator(StructureEstimator): #with multiprocessing.Pool(processes=cpu_count) as pool: #with get_context("spawn").Pool(processes=cpu_count) as pool: if disable_multiprocessing: - print("DISABILITATO") + print("DISABLED") cpu_count = 1 list_edges_partial = [ctpc_algo(n,total_vars_numb) for n in self._nodes] else: - if processes_number is not None and cpu_count < processes_number: + if processes_number is not None and cpu_count > processes_number: cpu_count = processes_number + print(f"CPU COUNT: {cpu_count}") with concurrent.futures.ProcessPoolExecutor(max_workers=cpu_count) as executor: list_edges_partial = executor.map(ctpc_algo, self._nodes, diff --git a/PyCTBN/PyCTBN/estimators/structure_score_based_estimator.py b/PyCTBN/PyCTBN/estimators/structure_score_based_estimator.py index 5763739..41300c1 100644 --- a/PyCTBN/PyCTBN/estimators/structure_score_based_estimator.py +++ b/PyCTBN/PyCTBN/estimators/structure_score_based_estimator.py @@ -96,12 +96,11 @@ class StructureScoreBasedEstimator(StructureEstimator): 'get the number of CPU' - cpu_count = multiprocessing.cpu_count() - print(f"CPU COUNT: {cpu_count}") + cpu_count = multiprocessing.cpu_count() if disable_multiprocessing: cpu_count = 1 - elif processes_number is not None and cpu_count < processes_number: + elif processes_number is not None and cpu_count > processes_number: cpu_count = processes_number @@ -111,6 +110,8 @@ class StructureScoreBasedEstimator(StructureEstimator): #with get_context("spawn").Pool(processes=cpu_count) as pool: #with multiprocessing.Pool(processes=cpu_count) as pool: + print(f"CPU COUNT: {cpu_count}") + 'Estimate the best parents for each node' if disable_multiprocessing: list_edges_partial = [estimate_parents(n,max_parents,iterations_number,patience,tabu_length,tabu_rules_duration,optimizer) for n in self._nodes] From 2d0efb297e23b251dfb7809346ea3bc699f59a70 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Tue, 27 Apr 2021 19:49:44 +0000 Subject: [PATCH 116/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 9b766b2abb8786a1ac554518b28c8bfa96e36f51..13ea300726ad5d29f87159ce5cca56ba4afa09f3 100644 GIT binary patch delta 7353 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 KUYWpNWd8!nc)@T0 From 9d50a20f23f7f4288560f59a98f02124469538cf Mon Sep 17 00:00:00 2001 From: Luca Moretti Date: Tue, 27 Apr 2021 21:51:34 +0200 Subject: [PATCH 117/139] Updated test cim --- PyCTBN/tests/structure_graph/test_cim.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PyCTBN/tests/structure_graph/test_cim.py b/PyCTBN/tests/structure_graph/test_cim.py index 7731a6c..f26d9b8 100644 --- a/PyCTBN/tests/structure_graph/test_cim.py +++ b/PyCTBN/tests/structure_graph/test_cim.py @@ -32,10 +32,10 @@ class TestConditionalIntensityMatrix(unittest.TestCase): c2[i, j] = (c2[i, j] + 1) / (self.state_res_times[i] + 1) c1.compute_cim_coefficients() for i in range(0, len(c1.state_residence_times)): - self.assertTrue(np.isclose(np.sum(c1.cim[i]), 0.0, 1e01, 1e-01)) + self.assertTrue(np.isclose(np.sum(c1.cim[i]), 0.0, 1e01)) for i in range(0, len(self.state_res_times)): for j in range(0, len(self.state_res_times)): - self.assertTrue(np.isclose(c1.cim[i, j], c2[i, j], 1e01, 1e-01)) + self.assertTrue(np.isclose(c1.cim[i, j], c2[i, j], 1e01)) def test_repr(self): c1 = ConditionalIntensityMatrix(self.state_res_times, self.state_transition_matrix) From 40d2831e5bc21f8c0e44ae556a5ce286cc720d01 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Tue, 27 Apr 2021 20:03:01 +0000 Subject: [PATCH 118/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 13ea300726ad5d29f87159ce5cca56ba4afa09f3..a064af0529c2890890f010c04eee164a03b449b0 100644 GIT binary patch delta 6559 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 JmdajY{{_ekji&$r delta 6535 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 UgtVla6qjh4vYXx*!8Wn~01KIacmMzZ From 7b2d44822fe479ac0908d95b9c84062ca22943f8 Mon Sep 17 00:00:00 2001 From: Luca Moretti Date: Tue, 27 Apr 2021 22:12:05 +0200 Subject: [PATCH 119/139] Updated test cim --- PyCTBN/tests/structure_graph/test_cim.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PyCTBN/tests/structure_graph/test_cim.py b/PyCTBN/tests/structure_graph/test_cim.py index f26d9b8..7106974 100644 --- a/PyCTBN/tests/structure_graph/test_cim.py +++ b/PyCTBN/tests/structure_graph/test_cim.py @@ -32,7 +32,7 @@ class TestConditionalIntensityMatrix(unittest.TestCase): c2[i, j] = (c2[i, j] + 1) / (self.state_res_times[i] + 1) c1.compute_cim_coefficients() for i in range(0, len(c1.state_residence_times)): - self.assertTrue(np.isclose(np.sum(c1.cim[i]), 0.0, 1e01)) + self.assertTrue(np.isclose(np.sum(c1.cim[i]), 0.0, 1e01,1e01)) for i in range(0, len(self.state_res_times)): for j in range(0, len(self.state_res_times)): self.assertTrue(np.isclose(c1.cim[i, j], c2[i, j], 1e01)) From 78cfd9b081f54be67d26ea0440ad4cf849e58800 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Tue, 27 Apr 2021 20:23:49 +0000 Subject: [PATCH 120/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index a064af0529c2890890f010c04eee164a03b449b0..16a64eeeb6543b83e334149812429a49be783edf 100644 GIT binary patch delta 7363 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 delta 7387 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 a@$K1{+|n-G(oS4lCN$;md}TO$k^L`xMxZMI From c59287fdc2ac6b47c2a3b07c8702b2d1a26d61a4 Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Wed, 28 Apr 2021 21:21:28 +0200 Subject: [PATCH 121/139] Fixed edges generation problem in constraint --- .../PyCTBN/estimators/structure_constraint_based_estimator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py b/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py index fdf4c16..e34753e 100644 --- a/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py +++ b/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py @@ -94,7 +94,7 @@ class StructureConstraintBasedEstimator(StructureEstimator): l2 = list(self._nodes[bool_mask2]) indxs2 = self._nodes_indxs[bool_mask2] vals2 = self._nodes_vals[bool_mask2] - eds2 = list(itertools.product(p_set, test_child)) + eds2 = list(itertools.product(p_set, [test_child])) s2 = Structure(l2, indxs2, vals2, eds2, tot_vars_count) g2 = NetworkGraph(s2) g2.fast_init(test_child) From bc5cea7e20eb027f8cc910c06b02407f0b5f692d Mon Sep 17 00:00:00 2001 From: philipMartini Date: Wed, 28 Apr 2021 19:31:29 +0000 Subject: [PATCH 122/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 16a64eeeb6543b83e334149812429a49be783edf..b34e387ef30219e63e1d4d8f14a8a12526997cd4 100644 GIT binary patch delta 7457 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 ZNA`ubu$#89ix$^tma^+!8N*&={{`=swGRLQ delta 7405 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 k Date: Sun, 30 May 2021 18:37:02 +0200 Subject: [PATCH 123/139] Update README.rst --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 422aed7..1926a6e 100644 --- a/README.rst +++ b/README.rst @@ -15,7 +15,7 @@ Please refer to https://app.codecov.io/gh/philipMartini/PyCTBN for a detailed re Documentation ************* -Please refer to https://philipmartini.github.io/PyCTBN/ for the full project documentation. +Please refer to https://github.com/madlabunimib/PyCTBN/ for the full project documentation. Implementing your own data importer *********************************** From 42911a04a0259a451a515348a6cf467166c07ab4 Mon Sep 17 00:00:00 2001 From: lmoretti96 <51789626+lmoretti96@users.noreply.github.com> Date: Sun, 30 May 2021 18:40:22 +0200 Subject: [PATCH 124/139] Update tabu_search.py --- PyCTBN/PyCTBN/optimizers/tabu_search.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PyCTBN/PyCTBN/optimizers/tabu_search.py b/PyCTBN/PyCTBN/optimizers/tabu_search.py index b7b2bc9..244ccde 100644 --- a/PyCTBN/PyCTBN/optimizers/tabu_search.py +++ b/PyCTBN/PyCTBN/optimizers/tabu_search.py @@ -184,5 +184,5 @@ class TabuSearch(Optimizer): if self.patience is not None and patince_count > self.patience: break - print(f"finito variabile: {self.node_id}") - return graph.edges \ No newline at end of file + print(f"Finished variable: {self.node_id}") + return graph.edges From 909bbdaa4b3ce77e062138d3f5ecf5c81b038550 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 30 May 2021 16:50:10 +0000 Subject: [PATCH 125/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148546 bytes docs-out/_build/html/.buildinfo | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index b34e387ef30219e63e1d4d8f14a8a12526997cd4..bc51c3f6757ebd0aeba23bdc4c380cb6194234d4 100644 GIT binary patch delta 6239 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 delta 6156 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 j>_tdJ`$>O%NXiYV!f%8Id3?HrG70qpI{uu>USa Date: Sun, 30 May 2021 19:10:39 +0200 Subject: [PATCH 126/139] Update main.yml --- .github/workflows/main.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2c1aa31..0545efc 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -38,8 +38,8 @@ jobs: rm -rf ../docs/* cp -r _build/html/* ../docs/ cd .. - git config --local user.email "f.martini@campus.unimib.it" - git config --local user.name "philipMartini" + git config --local user.email "madlab@unimib.it" + git config --local user.name "madlabunimib" git add . git commit -m "Update documentation" -a || true # The above command will fail if no changes were present, so we ignore @@ -48,7 +48,7 @@ jobs: uses: ad-m/github-push-action@master with: branch: master - github_token: ${{ secrets.PYCTBN_TOK }} + github_token: ${{ secrets.GITHUB_TOKEN }} # =============================== From 0f92c0fae3b5c398407a4a03dca22b39a190f918 Mon Sep 17 00:00:00 2001 From: Luca Moretti Date: Sun, 30 May 2021 19:16:32 +0200 Subject: [PATCH 127/139] Updated print in tabu search --- PyCTBN/PyCTBN/optimizers/tabu_search.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PyCTBN/PyCTBN/optimizers/tabu_search.py b/PyCTBN/PyCTBN/optimizers/tabu_search.py index 244ccde..9dd9dab 100644 --- a/PyCTBN/PyCTBN/optimizers/tabu_search.py +++ b/PyCTBN/PyCTBN/optimizers/tabu_search.py @@ -184,5 +184,5 @@ class TabuSearch(Optimizer): if self.patience is not None and patince_count > self.patience: break - print(f"Finished variable: {self.node_id}") + print(f"Finished variable : {self.node_id}") return graph.edges From e45adfb5ea8e94544898716ad88794419d3fa858 Mon Sep 17 00:00:00 2001 From: madlabunimib Date: Sun, 30 May 2021 17:28:45 +0000 Subject: [PATCH 128/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148546 -> 148546 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index bc51c3f6757ebd0aeba23bdc4c380cb6194234d4..7125c9b51423c2d83c7fab3d90bdd434ed7ec0c4 100644 GIT binary patch delta 7268 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 delta 7363 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 hq(RR~?>r+#ZIZAXszL!yl#nl>N Date: Sun, 30 May 2021 19:30:03 +0200 Subject: [PATCH 129/139] Update README.rst --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 1926a6e..57838dc 100644 --- a/README.rst +++ b/README.rst @@ -11,7 +11,7 @@ Download the release in .tar.gz or .whl format and simply use pip install to ins Coverage ******** -Please refer to https://app.codecov.io/gh/philipMartini/PyCTBN for a detailed report of test coverage. +Please refer to https://app.codecov.io/gh/madlabunimib/PyCTBN/ for a detailed report of test coverage. Documentation ************* From 0b1cb5ba701fe8d471483249c9ef8cf38d3d75db Mon Sep 17 00:00:00 2001 From: MADLabUnimib <65596355+madlabunimib@users.noreply.github.com> Date: Tue, 1 Jun 2021 10:12:21 +0200 Subject: [PATCH 130/139] Create LICENSE --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7195df7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 MADLabUnimib developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From ad7bbd0d15e49014a2d9b82e16d2b88fdff3f7d2 Mon Sep 17 00:00:00 2001 From: MADLabUnimib Date: Tue, 1 Jun 2021 14:16:36 +0200 Subject: [PATCH 131/139] Added Licence header --- PyCTBN/PyCTBN/__init__.py | 3 +++ PyCTBN/PyCTBN/estimators/__init__.py | 3 +++ PyCTBN/PyCTBN/estimators/fam_score_calculator.py | 3 +++ PyCTBN/PyCTBN/estimators/parameters_estimator.py | 3 +++ .../PyCTBN/estimators/structure_constraint_based_estimator.py | 3 +++ PyCTBN/PyCTBN/estimators/structure_estimator.py | 3 +++ PyCTBN/PyCTBN/estimators/structure_score_based_estimator.py | 3 +++ PyCTBN/PyCTBN/optimizers/__init__.py | 3 +++ PyCTBN/PyCTBN/optimizers/constraint_based_optimizer.py | 3 +++ PyCTBN/PyCTBN/optimizers/hill_climbing_search.py | 3 +++ PyCTBN/PyCTBN/optimizers/optimizer.py | 3 +++ PyCTBN/PyCTBN/optimizers/tabu_search.py | 3 +++ PyCTBN/PyCTBN/structure_graph/__init__.py | 3 +++ PyCTBN/PyCTBN/structure_graph/conditional_intensity_matrix.py | 3 +++ PyCTBN/PyCTBN/structure_graph/network_graph.py | 3 +++ PyCTBN/PyCTBN/structure_graph/sample_path.py | 3 +++ PyCTBN/PyCTBN/structure_graph/set_of_cims.py | 3 +++ PyCTBN/PyCTBN/structure_graph/structure.py | 3 +++ PyCTBN/PyCTBN/structure_graph/trajectory.py | 3 +++ PyCTBN/PyCTBN/utility/__init__.py | 3 +++ PyCTBN/PyCTBN/utility/abstract_importer.py | 3 +++ PyCTBN/PyCTBN/utility/cache.py | 3 +++ PyCTBN/PyCTBN/utility/json_importer.py | 3 +++ PyCTBN/PyCTBN/utility/sample_importer.py | 3 +++ PyCTBN/__init__.py | 3 +++ PyCTBN/tests/__init__.py | 3 +++ PyCTBN/tests/estimators/test_parameters_estimator.py | 3 +++ .../estimators/test_structure_constraint_based_estimator.py | 3 +++ PyCTBN/tests/estimators/test_structure_estimator.py | 3 +++ .../tests/estimators/test_structure_score_based_estimator.py | 3 +++ PyCTBN/tests/optimizers/test_hill_climbing_search.py | 3 +++ PyCTBN/tests/optimizers/test_tabu_search.py | 3 +++ PyCTBN/tests/structure_graph/test_cim.py | 3 +++ PyCTBN/tests/structure_graph/test_networkgraph.py | 3 +++ PyCTBN/tests/structure_graph/test_sample_path.py | 3 +++ PyCTBN/tests/structure_graph/test_setofcims.py | 3 +++ PyCTBN/tests/structure_graph/test_structure.py | 3 +++ PyCTBN/tests/structure_graph/test_trajectory.py | 3 +++ PyCTBN/tests/utility/test_cache.py | 3 +++ PyCTBN/tests/utility/test_json_importer.py | 3 +++ PyCTBN/tests/utility/test_sample_importer.py | 3 +++ 41 files changed, 123 insertions(+) diff --git a/PyCTBN/PyCTBN/__init__.py b/PyCTBN/PyCTBN/__init__.py index faff79c..35b0094 100644 --- a/PyCTBN/PyCTBN/__init__.py +++ b/PyCTBN/PyCTBN/__init__.py @@ -1,3 +1,6 @@ + +# License: MIT License + import PyCTBN.PyCTBN.estimators from PyCTBN.PyCTBN.estimators import * import PyCTBN.PyCTBN.optimizers diff --git a/PyCTBN/PyCTBN/estimators/__init__.py b/PyCTBN/PyCTBN/estimators/__init__.py index 112086f..01fd7c6 100644 --- a/PyCTBN/PyCTBN/estimators/__init__.py +++ b/PyCTBN/PyCTBN/estimators/__init__.py @@ -1,3 +1,6 @@ + +# License: MIT License + from .fam_score_calculator import FamScoreCalculator from .parameters_estimator import ParametersEstimator from .structure_estimator import StructureEstimator diff --git a/PyCTBN/PyCTBN/estimators/fam_score_calculator.py b/PyCTBN/PyCTBN/estimators/fam_score_calculator.py index d8ec3a0..e3123fe 100644 --- a/PyCTBN/PyCTBN/estimators/fam_score_calculator.py +++ b/PyCTBN/PyCTBN/estimators/fam_score_calculator.py @@ -1,4 +1,7 @@ +# License: MIT License + + import itertools import json import typing diff --git a/PyCTBN/PyCTBN/estimators/parameters_estimator.py b/PyCTBN/PyCTBN/estimators/parameters_estimator.py index 6b6883b..2430522 100644 --- a/PyCTBN/PyCTBN/estimators/parameters_estimator.py +++ b/PyCTBN/PyCTBN/estimators/parameters_estimator.py @@ -1,3 +1,6 @@ + +# License: MIT License + import sys sys.path.append('../') import numpy as np diff --git a/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py b/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py index e34753e..c0fef70 100644 --- a/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py +++ b/PyCTBN/PyCTBN/estimators/structure_constraint_based_estimator.py @@ -1,4 +1,7 @@ +# License: MIT License + + import itertools import json import typing diff --git a/PyCTBN/PyCTBN/estimators/structure_estimator.py b/PyCTBN/PyCTBN/estimators/structure_estimator.py index e6da5a7..8840c85 100644 --- a/PyCTBN/PyCTBN/estimators/structure_estimator.py +++ b/PyCTBN/PyCTBN/estimators/structure_estimator.py @@ -1,4 +1,7 @@ +# License: MIT License + + import itertools import json import typing diff --git a/PyCTBN/PyCTBN/estimators/structure_score_based_estimator.py b/PyCTBN/PyCTBN/estimators/structure_score_based_estimator.py index 41300c1..70523ee 100644 --- a/PyCTBN/PyCTBN/estimators/structure_score_based_estimator.py +++ b/PyCTBN/PyCTBN/estimators/structure_score_based_estimator.py @@ -1,4 +1,7 @@ +# License: MIT License + + import itertools import json import typing diff --git a/PyCTBN/PyCTBN/optimizers/__init__.py b/PyCTBN/PyCTBN/optimizers/__init__.py index 4162bf1..ffa10d4 100644 --- a/PyCTBN/PyCTBN/optimizers/__init__.py +++ b/PyCTBN/PyCTBN/optimizers/__init__.py @@ -1,3 +1,6 @@ + +# License: MIT License + from .optimizer import Optimizer from .tabu_search import TabuSearch from .hill_climbing_search import HillClimbing diff --git a/PyCTBN/PyCTBN/optimizers/constraint_based_optimizer.py b/PyCTBN/PyCTBN/optimizers/constraint_based_optimizer.py index 9ad05fc..aeb67fc 100644 --- a/PyCTBN/PyCTBN/optimizers/constraint_based_optimizer.py +++ b/PyCTBN/PyCTBN/optimizers/constraint_based_optimizer.py @@ -1,4 +1,7 @@ +# License: MIT License + + import itertools import json import typing diff --git a/PyCTBN/PyCTBN/optimizers/hill_climbing_search.py b/PyCTBN/PyCTBN/optimizers/hill_climbing_search.py index 6783be0..ede3db7 100644 --- a/PyCTBN/PyCTBN/optimizers/hill_climbing_search.py +++ b/PyCTBN/PyCTBN/optimizers/hill_climbing_search.py @@ -1,4 +1,7 @@ +# License: MIT License + + import itertools import json import typing diff --git a/PyCTBN/PyCTBN/optimizers/optimizer.py b/PyCTBN/PyCTBN/optimizers/optimizer.py index 1984f06..e62aced 100644 --- a/PyCTBN/PyCTBN/optimizers/optimizer.py +++ b/PyCTBN/PyCTBN/optimizers/optimizer.py @@ -1,4 +1,7 @@ +# License: MIT License + + import itertools import json import typing diff --git a/PyCTBN/PyCTBN/optimizers/tabu_search.py b/PyCTBN/PyCTBN/optimizers/tabu_search.py index 9dd9dab..7650732 100644 --- a/PyCTBN/PyCTBN/optimizers/tabu_search.py +++ b/PyCTBN/PyCTBN/optimizers/tabu_search.py @@ -1,4 +1,7 @@ +# License: MIT License + + import itertools import json import typing diff --git a/PyCTBN/PyCTBN/structure_graph/__init__.py b/PyCTBN/PyCTBN/structure_graph/__init__.py index 85f18a2..b9c24e5 100644 --- a/PyCTBN/PyCTBN/structure_graph/__init__.py +++ b/PyCTBN/PyCTBN/structure_graph/__init__.py @@ -1,3 +1,6 @@ + +# License: MIT License + from .conditional_intensity_matrix import ConditionalIntensityMatrix from .network_graph import NetworkGraph from .sample_path import SamplePath diff --git a/PyCTBN/PyCTBN/structure_graph/conditional_intensity_matrix.py b/PyCTBN/PyCTBN/structure_graph/conditional_intensity_matrix.py index 4abfdd0..e1ac09a 100644 --- a/PyCTBN/PyCTBN/structure_graph/conditional_intensity_matrix.py +++ b/PyCTBN/PyCTBN/structure_graph/conditional_intensity_matrix.py @@ -1,3 +1,6 @@ + +# License: MIT License + import numpy as np diff --git a/PyCTBN/PyCTBN/structure_graph/network_graph.py b/PyCTBN/PyCTBN/structure_graph/network_graph.py index 6fb3639..254555d 100644 --- a/PyCTBN/PyCTBN/structure_graph/network_graph.py +++ b/PyCTBN/PyCTBN/structure_graph/network_graph.py @@ -1,4 +1,7 @@ +# License: MIT License + + import typing import networkx as nx diff --git a/PyCTBN/PyCTBN/structure_graph/sample_path.py b/PyCTBN/PyCTBN/structure_graph/sample_path.py index 88e9649..a924fe4 100644 --- a/PyCTBN/PyCTBN/structure_graph/sample_path.py +++ b/PyCTBN/PyCTBN/structure_graph/sample_path.py @@ -1,4 +1,7 @@ +# License: MIT License + + import numpy as np import pandas as pd diff --git a/PyCTBN/PyCTBN/structure_graph/set_of_cims.py b/PyCTBN/PyCTBN/structure_graph/set_of_cims.py index 81caff5..5b2c32a 100644 --- a/PyCTBN/PyCTBN/structure_graph/set_of_cims.py +++ b/PyCTBN/PyCTBN/structure_graph/set_of_cims.py @@ -1,4 +1,7 @@ +# License: MIT License + + import typing diff --git a/PyCTBN/PyCTBN/structure_graph/structure.py b/PyCTBN/PyCTBN/structure_graph/structure.py index f79c875..eb3edda 100644 --- a/PyCTBN/PyCTBN/structure_graph/structure.py +++ b/PyCTBN/PyCTBN/structure_graph/structure.py @@ -1,4 +1,7 @@ +# License: MIT License + + import typing as ty import numpy as np diff --git a/PyCTBN/PyCTBN/structure_graph/trajectory.py b/PyCTBN/PyCTBN/structure_graph/trajectory.py index 36899b3..5e86316 100644 --- a/PyCTBN/PyCTBN/structure_graph/trajectory.py +++ b/PyCTBN/PyCTBN/structure_graph/trajectory.py @@ -1,4 +1,7 @@ +# License: MIT License + + import typing import numpy as np diff --git a/PyCTBN/PyCTBN/utility/__init__.py b/PyCTBN/PyCTBN/utility/__init__.py index f79749c..eefdb59 100644 --- a/PyCTBN/PyCTBN/utility/__init__.py +++ b/PyCTBN/PyCTBN/utility/__init__.py @@ -1,3 +1,6 @@ + +# License: MIT License + from .abstract_importer import AbstractImporter from .cache import Cache from .json_importer import JsonImporter diff --git a/PyCTBN/PyCTBN/utility/abstract_importer.py b/PyCTBN/PyCTBN/utility/abstract_importer.py index 8984b4d..9328a65 100644 --- a/PyCTBN/PyCTBN/utility/abstract_importer.py +++ b/PyCTBN/PyCTBN/utility/abstract_importer.py @@ -1,4 +1,7 @@ +# License: MIT License + + import typing from abc import ABC, abstractmethod diff --git a/PyCTBN/PyCTBN/utility/cache.py b/PyCTBN/PyCTBN/utility/cache.py index 5191af3..10caa22 100644 --- a/PyCTBN/PyCTBN/utility/cache.py +++ b/PyCTBN/PyCTBN/utility/cache.py @@ -1,4 +1,7 @@ +# License: MIT License + + import typing from ..structure_graph.set_of_cims import SetOfCims diff --git a/PyCTBN/PyCTBN/utility/json_importer.py b/PyCTBN/PyCTBN/utility/json_importer.py index 2cadff4..6353c01 100644 --- a/PyCTBN/PyCTBN/utility/json_importer.py +++ b/PyCTBN/PyCTBN/utility/json_importer.py @@ -1,3 +1,6 @@ + +# License: MIT License + import json import typing diff --git a/PyCTBN/PyCTBN/utility/sample_importer.py b/PyCTBN/PyCTBN/utility/sample_importer.py index b0b6e8f..4c3fdf0 100644 --- a/PyCTBN/PyCTBN/utility/sample_importer.py +++ b/PyCTBN/PyCTBN/utility/sample_importer.py @@ -1,3 +1,6 @@ + +# License: MIT License + import json import typing diff --git a/PyCTBN/__init__.py b/PyCTBN/__init__.py index 7adf0d7..6fd2d6c 100644 --- a/PyCTBN/__init__.py +++ b/PyCTBN/__init__.py @@ -1,2 +1,5 @@ + +# License: MIT License + import PyCTBN.PyCTBN from PyCTBN.PyCTBN import * diff --git a/PyCTBN/tests/__init__.py b/PyCTBN/tests/__init__.py index 8b13789..8f6a58e 100644 --- a/PyCTBN/tests/__init__.py +++ b/PyCTBN/tests/__init__.py @@ -1 +1,4 @@ +# License: MIT License + + diff --git a/PyCTBN/tests/estimators/test_parameters_estimator.py b/PyCTBN/tests/estimators/test_parameters_estimator.py index 5c438db..4dbb548 100644 --- a/PyCTBN/tests/estimators/test_parameters_estimator.py +++ b/PyCTBN/tests/estimators/test_parameters_estimator.py @@ -1,4 +1,7 @@ +# License: MIT License + + import unittest import numpy as np import glob diff --git a/PyCTBN/tests/estimators/test_structure_constraint_based_estimator.py b/PyCTBN/tests/estimators/test_structure_constraint_based_estimator.py index 3e9d2b0..baa1de1 100644 --- a/PyCTBN/tests/estimators/test_structure_constraint_based_estimator.py +++ b/PyCTBN/tests/estimators/test_structure_constraint_based_estimator.py @@ -1,4 +1,7 @@ +# License: MIT License + + import glob import math import os diff --git a/PyCTBN/tests/estimators/test_structure_estimator.py b/PyCTBN/tests/estimators/test_structure_estimator.py index e368b93..5decc84 100644 --- a/PyCTBN/tests/estimators/test_structure_estimator.py +++ b/PyCTBN/tests/estimators/test_structure_estimator.py @@ -1,4 +1,7 @@ +# License: MIT License + + import glob import math import os diff --git a/PyCTBN/tests/estimators/test_structure_score_based_estimator.py b/PyCTBN/tests/estimators/test_structure_score_based_estimator.py index 407201e..16f1645 100644 --- a/PyCTBN/tests/estimators/test_structure_score_based_estimator.py +++ b/PyCTBN/tests/estimators/test_structure_score_based_estimator.py @@ -1,4 +1,7 @@ +# License: MIT License + + import glob import math import os diff --git a/PyCTBN/tests/optimizers/test_hill_climbing_search.py b/PyCTBN/tests/optimizers/test_hill_climbing_search.py index 84fa023..b669478 100644 --- a/PyCTBN/tests/optimizers/test_hill_climbing_search.py +++ b/PyCTBN/tests/optimizers/test_hill_climbing_search.py @@ -1,4 +1,7 @@ +# License: MIT License + + import glob import math import os diff --git a/PyCTBN/tests/optimizers/test_tabu_search.py b/PyCTBN/tests/optimizers/test_tabu_search.py index 301a52c..0d52141 100644 --- a/PyCTBN/tests/optimizers/test_tabu_search.py +++ b/PyCTBN/tests/optimizers/test_tabu_search.py @@ -1,3 +1,6 @@ + +# License: MIT License + import sys sys.path.append("../../PyCTBN/") import glob diff --git a/PyCTBN/tests/structure_graph/test_cim.py b/PyCTBN/tests/structure_graph/test_cim.py index 7106974..b67cf42 100644 --- a/PyCTBN/tests/structure_graph/test_cim.py +++ b/PyCTBN/tests/structure_graph/test_cim.py @@ -1,4 +1,7 @@ +# License: MIT License + + import unittest import numpy as np diff --git a/PyCTBN/tests/structure_graph/test_networkgraph.py b/PyCTBN/tests/structure_graph/test_networkgraph.py index d9b9bcd..790cbed 100644 --- a/PyCTBN/tests/structure_graph/test_networkgraph.py +++ b/PyCTBN/tests/structure_graph/test_networkgraph.py @@ -1,4 +1,7 @@ +# License: MIT License + + import unittest import glob import os diff --git a/PyCTBN/tests/structure_graph/test_sample_path.py b/PyCTBN/tests/structure_graph/test_sample_path.py index f7b3a1a..ef63585 100644 --- a/PyCTBN/tests/structure_graph/test_sample_path.py +++ b/PyCTBN/tests/structure_graph/test_sample_path.py @@ -1,4 +1,7 @@ +# License: MIT License + + import unittest import glob import os diff --git a/PyCTBN/tests/structure_graph/test_setofcims.py b/PyCTBN/tests/structure_graph/test_setofcims.py index 9f5fbe9..1435111 100644 --- a/PyCTBN/tests/structure_graph/test_setofcims.py +++ b/PyCTBN/tests/structure_graph/test_setofcims.py @@ -1,4 +1,7 @@ +# License: MIT License + + import unittest import numpy as np import itertools diff --git a/PyCTBN/tests/structure_graph/test_structure.py b/PyCTBN/tests/structure_graph/test_structure.py index df4289e..e979318 100644 --- a/PyCTBN/tests/structure_graph/test_structure.py +++ b/PyCTBN/tests/structure_graph/test_structure.py @@ -1,4 +1,7 @@ +# License: MIT License + + import unittest import numpy as np from ...PyCTBN.structure_graph.structure import Structure diff --git a/PyCTBN/tests/structure_graph/test_trajectory.py b/PyCTBN/tests/structure_graph/test_trajectory.py index ae4777b..93c27a7 100644 --- a/PyCTBN/tests/structure_graph/test_trajectory.py +++ b/PyCTBN/tests/structure_graph/test_trajectory.py @@ -1,4 +1,7 @@ +# License: MIT License + + import unittest import numpy as np import glob diff --git a/PyCTBN/tests/utility/test_cache.py b/PyCTBN/tests/utility/test_cache.py index 5d9c766..e799728 100644 --- a/PyCTBN/tests/utility/test_cache.py +++ b/PyCTBN/tests/utility/test_cache.py @@ -1,4 +1,7 @@ +# License: MIT License + + import unittest import numpy as np diff --git a/PyCTBN/tests/utility/test_json_importer.py b/PyCTBN/tests/utility/test_json_importer.py index a4bb4c0..d57a258 100644 --- a/PyCTBN/tests/utility/test_json_importer.py +++ b/PyCTBN/tests/utility/test_json_importer.py @@ -1,4 +1,7 @@ +# License: MIT License + + import unittest import os import glob diff --git a/PyCTBN/tests/utility/test_sample_importer.py b/PyCTBN/tests/utility/test_sample_importer.py index 8e96778..ad2ddda 100644 --- a/PyCTBN/tests/utility/test_sample_importer.py +++ b/PyCTBN/tests/utility/test_sample_importer.py @@ -1,4 +1,7 @@ +# License: MIT License + + import unittest import os import glob From 598dc17ad8c5c7516ea0306bb8fda5ccd46bab07 Mon Sep 17 00:00:00 2001 From: madlabunimib Date: Tue, 1 Jun 2021 12:27:02 +0000 Subject: [PATCH 132/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148546 -> 148546 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 7125c9b51423c2d83c7fab3d90bdd434ed7ec0c4..26081d4950b0aa5957ff783ca49143331b0d8ffe 100644 GIT binary patch delta 7278 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 n_PQK!Yl}s213Pf Date: Tue, 1 Jun 2021 16:23:02 +0200 Subject: [PATCH 133/139] Update README.rst --- README.rst | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/README.rst b/README.rst index 57838dc..de6f10f 100644 --- a/README.rst +++ b/README.rst @@ -1,21 +1,35 @@ PyCTBN ====== +.. image:: https://codecov.io/gh/madlabunimib/PyCTBN/branch/master/graph/badge.svg + :target: https://codecov.io/gh/madlabunimib/PyCTBN + + + + A Continuous Time Bayesian Networks Library Installation/Usage ******************* -Download the release in .tar.gz or .whl format and simply use pip install to install it:: + +The library has been tested on Linux and Windows with Python 3.8 and it relies on the following Python modules: + +- numpy +- pandas +- networkx +- scipy +- matplotlib +- tqdm + +**Pip installation** + +Download the release in .tar.gz or .whl format and simply use pip install to install it: $ pip install PyCTBN-1.0.tar.gz -Coverage -******** -Please refer to https://app.codecov.io/gh/madlabunimib/PyCTBN/ for a detailed report of test coverage. - Documentation ************* -Please refer to https://github.com/madlabunimib/PyCTBN/ for the full project documentation. +Please refer to https://madlabunimib.github.io/PyCTBN/ for the full project documentation. Implementing your own data importer *********************************** From b81b4110dda286cc38aef019df329113aece3d41 Mon Sep 17 00:00:00 2001 From: madlabunimib Date: Fri, 2 Jul 2021 09:51:06 +0000 Subject: [PATCH 134/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148546 -> 148546 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 26081d4950b0aa5957ff783ca49143331b0d8ffe..2425ce09152466faec923f1e64041cdc7feb6053 100644 GIT binary patch delta 6808 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

                                                                                                                                    WRxEg6L1np)J;Xwbq1e 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 Nasl=Kie>*`{|Bt&5+?uv From 65f8c3f794ddd48cd72796dacff44478637c228d Mon Sep 17 00:00:00 2001 From: madlabunimib Date: Fri, 2 Jul 2021 10:39:14 +0000 Subject: [PATCH 135/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148546 -> 148546 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 2425ce09152466faec923f1e64041cdc7feb6053..cc31d3c46fea3f7853e4e5c99c53d0520b008687 100644 GIT binary patch delta 7349 zcmb_gc|cXw)^Ba)G9&kL8B`_#0RiDMh$N!mtSD+!n#1LyAaamFfwa`XGV>+|veD%; zQ}b2N`b??wdNipxo2H_rsn0pfR8)GsQgiy&*&8nMzW3+%55K+kn%CNU?R(g@)N$8R z$9khLznB@os=QG@1-!93ngw>LvMbFkD=(?5vdb^Z$(_fUUj+E@*^_-j>Z+WkWtZkp z&nnE$FRH83jeBYEvx73~svL6XWfzvr$}O#{GV){ljGgMp;3uWv&0q2D&b!QXa;vLy zk;2hsxus?5V82FIk;k5TYIxeIzF);xW(-lL+o(l)P!W*c>K zzyu}7M*Y0`p;Bn0uGYPvWVKNVko{Lhu~Bx{7b+Hujr19LNy)cSJysPdGi+2);W1@q zJ9WiZnP#Jc^Bk3ecB&y+$+l79zbxjL1Ct?-SH^VZ;0yjqY;a^7f<}bz? zcw?A5za8Xev+znnSMHJ!#j_Hf`8&a(+{+Zq-Fmt46;BT#nLeFrl8

                                                                                                                                    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 J^Ncije)R5-8I z%@}agW_7qL4(x4vj=UrCzw!=DlY1^RV&i_wc5(~^VCevG#=&<*wU4+76*<9fO}HVyDWwPRTE$-TA!tkL|9 zlnOODtoc#I_LCoBAlbk3BP2pDM*f?QYc9U?Z|?+xiojY5n1!;4OmDKhqHwLOb!;Rmzl5kTo1U*80&o%f+Z)Af15!0%=n2 zf3z^0@x){3jJtmUi(65_+~SP6t@{zG>T%sKkYp$-o?9}jxMXhIUUO0Xm6}T~n(jk? zf(iF&U%B}HeHcz~oIqMQj`}Cii&reS!+WDCZQ~x$Im*Q;55)f0KcGt>7r%Qz_g*e0 zJcQQ?wmhUOAs3%L6q8ebgPBCt|3+1vi{6g}RrW|w-#ntzD7^g1h!Y3Wp-X*8AzSqr zyrlJCZTpL(#STwk7{T}_bo6p@!xKm)c=UuSFc)8YDyUDNLLZ`9odclAZ0O8ZN`1-b>QA;OIItvp;ml+=^xFfT_^AV%O_IKjY@U>yVv|h3 zM~=*inD$O=D#1)AHjm(f6ML5+&6%wrxGmw$E^LKdPr5wG(#9?<4VUYg8_8_av%Ump z^ehQd(a(j=Bv|6Y3hl+e28-OVAcXngF74gpI)|>1U2|y^LT^eeaHSxo;HqK_L(C0OLfatUs_u`+@j6U)_!zbCd} zp@~gjy8!HPusfZGOdR3P#t~Gxv)2e(+}V7B3=hT$9(u6V1k1a!RRrBV8QKdi_4Isc zp%|Xd!9Q2q*mm)FO`>Wy(s zCuA{=g9Cb3Lig6{&BP^sY$+{r@~0Ba#0CCT{h9cyKbtF^WSBfqD+My7E!H_}e-O8} zlT2)~2=OriY!R(G7{JC57<#f4Y2RSN?KxPk~>X3nNA9rO!(zhnpsx? zUYbA@El&(&83ca~WN#4o1+kgZ6EiOEOP+kQ9^!4zw*;}dBxLPH$A|*mOW1en%~G_< z-g2@x%Offxm}N+taVA^Fd*H;);D>jEnVv+R1~Y{qJA{=GG>5Q!f(fBQOD%z1KGwAM z2zeYC#zKibBaFRFpoXzo1YN@gEC^=ksL8FPse{h>2j6bmHH%S$HXeC1Ubc zuxs5&I-Vmg2?a;8i3AHG*$9HhNH&?k6vbu`%#9)!go63)JD}RErE8;iG#%1(jE|=B zNyks3*&Hdk*ra{B_(&mT2l%!XOFGu{VarK2G={xRup@@emP=Mr&aTl0t$|cC4PQVP zOxsRZZcbn3N^%SPQe_G!xJkRVd@%p-5Qhn|%uPDcD3md z+%p}x!=B?})DWR5S%VDB(;yF*OZZ5_L4tU3FQvLYZ{=LO9>Fc@!2MS{m#&or(wmAy zB+Sr&T9Sl6N~j}<7oA&AFXQ&S?DMqkMQ}qqaPL0HMMI*{8=*luj+c-lp Date: Fri, 2 Jul 2021 12:40:19 +0200 Subject: [PATCH 136/139] Update README.rst --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index de6f10f..c6636bc 100644 --- a/README.rst +++ b/README.rst @@ -23,9 +23,9 @@ The library has been tested on Linux and Windows with Python 3.8 and it relies o **Pip installation** -Download the release in .tar.gz or .whl format and simply use pip install to install it: +Download the latest release in .tar.gz or .whl format and simply use pip install to install it: - $ pip install PyCTBN-1.0.tar.gz + $ pip install PyCTBN-2.2.tar.gz Documentation ************* From 3b0843aef676a6b6bd24dba7a5fc32c5e8a01a86 Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Fri, 2 Jul 2021 13:29:21 +0200 Subject: [PATCH 137/139] Update examples.rst --- docs-out/examples.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs-out/examples.rst b/docs-out/examples.rst index b1e07c5..5386451 100644 --- a/docs-out/examples.rst +++ b/docs-out/examples.rst @@ -3,9 +3,9 @@ Examples Installation/Usage ****************** -Download the release in .tar.gz or .whl format and simply use pip install to install it:: +Download the latest release in .tar.gz or .whl format and simply use pip install to install it:: - $pip install PyCTBN-1.0.tar.gz + $pip install PyCTBN-2.2.tar.gz Implementing your own data importer From 19862b894278addc38f34eed44f46efdcbef9ac8 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Fri, 2 Jul 2021 13:36:56 +0200 Subject: [PATCH 138/139] Modify imports order insample_importer_test file --- PyCTBN/tests/utility/test_sample_importer.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/PyCTBN/tests/utility/test_sample_importer.py b/PyCTBN/tests/utility/test_sample_importer.py index ad2ddda..f938c70 100644 --- a/PyCTBN/tests/utility/test_sample_importer.py +++ b/PyCTBN/tests/utility/test_sample_importer.py @@ -5,12 +5,15 @@ import unittest import os import glob +import json import numpy as np import pandas as pd + + from ...PyCTBN.utility.sample_importer import SampleImporter from ...PyCTBN.structure_graph.sample_path import SamplePath -import json + From d10e8b3e706d694e1b7519ffb1dc818fa387b1c5 Mon Sep 17 00:00:00 2001 From: madlabunimib Date: Fri, 2 Jul 2021 11:46:42 +0000 Subject: [PATCH 139/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148546 -> 148546 bytes docs-out/_build/doctrees/examples.doctree | Bin 11402 -> 11423 bytes .../_build/html/_sources/examples.rst.txt | 4 ++-- docs-out/_build/html/examples.html | 4 ++-- docs-out/_build/html/searchindex.js | 2 +- docs/_sources/examples.rst.txt | 4 ++-- docs/examples.html | 4 ++-- docs/searchindex.js | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index cc31d3c46fea3f7853e4e5c99c53d0520b008687..8c0b1628cb6dcbf57817ca27820b0847b0ca0284 100644 GIT binary patch delta 7476 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 YHbLkORUs26OURW_A)x**3G6NQZ@*vTLI3~& delta 7368 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

                                                                                                                                    kCT71mr&2Ar=63WzT%8gW7uHa&rhrMy=0gXuayHC(iZFNwSSN;77zOi@yP*f8Lj#>fK4XQ2eM3QUvI!II_9OV zcEv&3C&LmXcMbDAPtL7_ z1dH?C!K@r3FH_2LLfEq;-WeiXup7oQi82qPBSw?MSTR9lD9e*(M;R=;J_Mh52mJ7Q zD03i@d!bArC=6p&1ZTroiQJGG;X-?BILnqArWn>7B)^TrSvV&3kp1l8Y`Pq^4X4u1 zLbnK(L$D-*jUo6)1RD*7*b~7f5X45Z={oTrTMm8`$&xW+6IeY6st`{S7dt}elPkhV z6i$R`BVqokDDhVf7>%9?M=N*c!{`%Oxvl3olZn<{&De_D^6SW^JKcxM&1( zB)O#{SiY3w2JI&E#*)9mC`^iD&T@KrPXf}zcurcguf)~fo_J}~+ z{@}F{-`Y+mY*{d~!}R!GqiQ^rMOCHNEJQxhUVenT=pimnPawSuuvEed3I8kMfP_l~ z3F7Os;}Ja_eR>4<_#@m%SBnoOOddy8OlX#{Ov0NIKGq-?za~f!*X=&1hhuScv*;1r z6OV8wJjBJQM4>4|gJLY!z>M`0K9KM!L4vqFP0kNnIoYR2a4R0+{=1J$_e~P%RWMP) zvl`H`lJGwg+6WRvKX;&Ka^Jq}aks=GxZ#g*uRp{^eX`ISsX-x5lTaj~PC(mVlG&T= F{{VA}s8s*} diff --git a/docs-out/_build/doctrees/examples.doctree b/docs-out/_build/doctrees/examples.doctree index 07c7eded18fa66d0749883fdf29734776cb360f0..72a32a6d973d9bb22202bb10deaeaff1bd88a863 100644 GIT binary patch delta 119 zcmeB*oFB>3z&drxMiyfxkp!3g^1Ph<#1w^+j8ui3#FEtFlF3}mK9eUfaf-xam-Llu hozgg^c8W#@YYz@32bhiYj3%FDRsqqQzc5eJ0074qDUJXD delta 103 zcmbOq*%issz&f>lBa1N;Z=_3pd0tL_Vv0gZM(SjFW*;%DDH-gsQ!>PQBG9CK#apK| dPN|)uk->@~cYxVY&tUQ+W)%>Examples

    save_plot_estimated_structure_graph(file_path: str) → None
  • C#%x{ZdE@nzN%@;$2JKkCEU`09%iWm;t7()!)VI@Jwx0qR>ZJ= zVE}hjKQ3<4G?m~^35O(Hk}!0V-~|yRi_0*N>V3cZZdCZ*>I-h^0B&hNF0R%znOa_% I#9n0o3%`A|fB*mh From 24a20c93d7370f731441fb45eddd6c0de5305af6 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 18:52:40 +0000 Subject: [PATCH 074/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index f3b18a654f50fd524e59ff60275f88bdcbad35ce..b1e8c29df793d607e976258f16f4bdc94f3d5487 100644 GIT binary patch delta 6217 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 delta 6150 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 Date: Sun, 14 Mar 2021 19:03:25 +0000 Subject: [PATCH 075/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index b1e8c29df793d607e976258f16f4bdc94f3d5487..34bde1614048bc97d6b94070e67939db3c0af912 100644 GIT binary patch delta 6438 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 delta 6418 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 Date: Sun, 14 Mar 2021 20:04:24 +0100 Subject: [PATCH 076/139] Update python-PyCTBN-package.yml --- .github/workflows/python-PyCTBN-package.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-PyCTBN-package.yml b/.github/workflows/python-PyCTBN-package.yml index 5b78767..6dc0e4d 100644 --- a/.github/workflows/python-PyCTBN-package.yml +++ b/.github/workflows/python-PyCTBN-package.yml @@ -43,4 +43,4 @@ jobs: flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: Test with pytest run: | - pytest PyCTBN/tests/ + pytest PyCTBN/tests/ From dc83603961170124ec58897202c71d6cc162d86d Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 19:16:36 +0000 Subject: [PATCH 077/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 34bde1614048bc97d6b94070e67939db3c0af912..6c0c3fd4283a32d450a23b9015e00a0f2194a427 100644 GIT binary patch delta 6238 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 AqyPW_ delta 6236 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 From 757873dc7deef4a19247966b4cc84ced9596accd Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 19:33:07 +0000 Subject: [PATCH 078/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 6c0c3fd4283a32d450a23b9015e00a0f2194a427..8cd95b96a04e420cdae6ec0638b47556df2a5985 100644 GIT binary patch delta 7135 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 delta 7134 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 From c53865fa1f0cd42898fc21ce84b7e586862ab25d Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 19:34:44 +0000 Subject: [PATCH 079/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 8cd95b96a04e420cdae6ec0638b47556df2a5985..85a7e68eb1651b0be974774d981674e9922bd6ff 100644 GIT binary patch delta 7229 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 From 6a80818fb617c0e73e6178c27445a25b7d19ac74 Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sun, 14 Mar 2021 20:38:55 +0100 Subject: [PATCH 080/139] Update Build_Release.yml --- .github/workflows/Build_Release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index 3cc50f5..1c1f4ed 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -51,7 +51,7 @@ jobs: id: create_release uses: actions/create-release@v1 env: - GITHUB_TOKEN: ${{ secrets.PYCTBN_TOK }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: ${{ github.ref }} release_name: Release ${{ github.ref }} @@ -61,7 +61,7 @@ jobs: id: upload-release-asset uses: dwenegar/upload-release-assets@v1 env: - GITHUB_TOKEN: ${{ secrets.PYCTBN_TOK }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: release_id: ${{ steps.create_release.outputs.id }} assets_path: ./dist From 05fd7b777aa8e76634147572386a138f0ee8de82 Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 19:49:20 +0000 Subject: [PATCH 081/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 85a7e68eb1651b0be974774d981674e9922bd6ff..4df301de88ac2543600cbaa2a0ea2df231dcfade 100644 GIT binary patch delta 7422 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 delta 7346 zcmb_gdq9=dvTv5c=B2PVh@iaWE$=siBA|#Tk-#v^2XA@!!4?ZBe5ZNUjgaWVrYwy* z9j{i`sIPN4RwAaESt?ehX1u|GIzNfA(+9nprcmW@gP=-~M2| z^#|*%TOHk;EUHUtY8N#(*c263FDTA87A{!W%;AMmHVqaF7S1oJYi@Aoo7Q+(HCSdZ zo;-8XBRtQ|ork)OhLL!q21fF9H-ocPNnN3FQDsSWbA!%UHNRGjM(`&$jIeKRu#@Y; zYD%hWs&UK&=EC1~^HkH^+u6!u_RvF9Q%^g-l+(N8oKn_L%>=8}%6u~w@`STeVy0rc zt(77(HN9ZAqL``Nk_AeInaZn}qZF8_x(VBqQZu!D(bJ0Y0dw=~W0guXb6eLHCErYK zKl-^+Zl+$XdqycVQ!Q>8%7O>fGmj{FW@^W&8h*)ZytTH;jm?1#lX>A7f47e-j+bJ))!d zjldxOSY#-_FEj%Mc(em^pX zHwC-F|7~{{LsI!C@sqXPL8e%n5;EGn&;C7*3C-eFezrWz-xUHVYHqwTdKljoY2Xpj zdfqc`n6_K%CQ%gR1=qA{Yq$GR%)(-5&8vQHyew`Q9}}7+cHrfg)E8ktomM>Bs&|9Z zXh#O#;qM``aCBS*-w@)%w+Gmh{sJD9=)*f>hEr6v0@HRI%-`{M|ZXGD+YcVg_ZNdaemCTdE5Ilxpi zD`Fmu=A)wHAg*u9oo7cE^I4H0{O5>hYpt9ITPPSiNvP4sCGyWHf>&exc}Cn=e%o8D z&>08p{a`{IFA0mKDvINU@nd*vyag{9XGJl|p%{$fNeOONHBZ$R*VH~$!h6Csp)iQz zP4RvPmLVkIQhW0$G+J>*3 zxPqIKe7INgU->gBK78rgV6IOo<;HX$p25BOM=81d#|b`sLh2T7n&iV9c82l=srEc# z(rhqlir=2}8b6Ti!xv57$S0G5*kfLNQrcX8BGpIjNDBbIEzO4~op<6M=~>)0)rU8w zKP!5b5|+?NNYdJIc=o19_8wgQ2N#Sj&fU@)OwDh8%jSSbR%d~+c31Is<^s& zd2^srtbQ~#1o+NlzN+2BLE1piJ-2xAvS}YdvFe-g7p6_A%QF`Xo~p}Q2z>9yRTOd` zuA7m=cOTO8_F6}E#SB`#`;dWqZSmx19&Lp(wLa%_rcJ43vuc31)l^Yl!g$>iIsE!E zx#;>66vFGv417hVhnhZTry$;&cTHlRfoV+Dx8SanTDQ-EJIpiil>3hS+Uo{&aZ!h0 zs2TJBM-FUCR{}qFPP5cs0VBA7c@BT$ysx^goUFZZUeA|jda5@Uye|lKPsQ(Yws)=z z_F99d`iHSavUXK{DF+QtZk00Dr7mh#bvf{}k5^Gu#qc?`IozvAueR4F0uAI&0-rf3 z2=#v5Z8_Wcq2{?x^;&vdPP}qNOmK&ldh7@QTYhMdUY)Z1^+8dlRFq)7gz<-n(2isJ>%33OCyx%cIsLigTGZe~CZO!3xX85X)yiAVFnIRqd+bgY-nD+Ka{!WVn7CZ({Tq!W9>h`Y% zM}4uymTB_p`>#98!Pz(7ldSDKD5Ev+R?*pfmM`BU>n36s>0iD_Mtj|xBua#u@%Arr z_RMMr-g(Fp@7GXM{NPE0TECmNrOCg#!&#fP;j^m^YGCVh03$zsZXuoXXzu)84zJ9V z1{&WZ1C^N(YM1(=HZZ8q|DBX;gZj4L#9;G0VT8A|jldpHW~+X(=O0p{@k1%f8$S%e zrm@UQ-MjanlC^H%YjTjd|2g1xYpbZU1o2r1a`^CiY5C{@vOK(AZq4_TdO@fihrZDU z-n1=8Y;A>M{Le;%`paP|RFYL+IkH_2rhl;%xT!3Tw>&nEnpHJ#H43%-i(`kl`_3xf zk><=tcII%qUB2q`o$=(uF1`BAiCuEg^wn-T$U3=04lGX{w&a_SS5cEI<14?C$_}4z zg#|qG+bL@M1rzY`Tcy3G^illyr5xV4LyDz;|DB>eX)=b2Mwl@~bioWO(E>AcqW@)B zi{?j^*7-<8YkNd#JukyTG&~Z~x?P5)XmuGN`W*4J9+$yHgQLkj-tfcZ;hMSJW@Qz1 zxk9CkpZmd$>h;eb!pYsBuE>?5Eow4iRg;o#Aub`|UX${dLDaNC)bv5rIvcr8^SMbe z4Wc#-q8bNM_KKB*Tqqn_p#I!-7w8`Q>8DsI<8GHzVZNGo`GO~uv`y53mkx^B@`uB^ z2%UC6Yub6(vKr6I5XKOh|@;wx*d-Ga5>f z&_}Cz2Ykn#Ikin+1e+|u*mnMD*cy&MO@!fXYj?nh&hFYhLZQJT#L>f&ZizbmolgOb-q|hWXXc9I|!h}g!Fp&X^c6bSdp$wO{!&I1$2ijo{fyX|mAgJF5H3Yr;ppKxf16C8<>43GC;&zS1afcz8w_XY0 zi+;7@3%i5ulrv70Yr&1d&kjm1UjG>UaO1~dMay6O7}gVvIRF_1#se^y;Ijj;gdpu8 ztRy&i5Y}M!S+Ky&PoP96v`yFJwX5LCvu;M<#$#YfV)ln%F@fn2)Dt*;3Y(A7IggjtsL|?3{E5weHfas^G8y9_%LjsiJ70lHo0WJ9vwnyiNg^HAx6>>m`#93 zz$p1fJvPSE*HPX5WPbIYy{>PYSob+BkrLH<3~?6{34Cd(``gf%3z zwG-k9PIN*hl%VGcC?!~Xg3OiRkS{5;C7AUk%p`c@OHc^xzk(Ek?5`l50KbBH1UJ8e zNd)mU#n&rxFSqF4Udvo^J&PJVyE@E=@xk6%8L+;X=lJe zPM_6d<`oFX&QUNLJ-!7?eCrH&)5>FKU6LeAwiR;ka6+F$( z%{U7UwCMa<%9?l!cI)v(cfa~w-+`T+?iuJzvK!c-!#S{&yx;UV@piwXE$%QBE6#xf zX>7E6)adTezeS2}*BFLB|ykeha%%CHFY&x?p2KM&ojal-e) z!D-*qX)eNj-_zMH!r&iZDLQn51@kfBr36~AGXQ+dp}PJ9m1Yr6?1Dleg>TSEx)hE{ z7syeE5YitO1j8`@$Nu0%8PIr?g0n9e{PA=UwN0B&ItM3zgeRnysGnfI)H2?z#Ra>5 z0)upZVxKQpBEb7WwIpArGB3i$%P>zao~p$v61}c~Kh00QLj9=-JFY;PWM`uTv0sP; zKl6U-f2Jc{gk3+w6uIl!2GsY06E2COf~)$4DoYCnF8Kv=NbcA#P$G2|;f-4q!|+&Y z>dUUe2x4x&3Xc(7xe9ZoOvM11h+n~0zi@tCf2mUkR~8z~1u=~l+IB-Bfw3EM2|n-c z-_;UrSJN;%f$Da}HL#S*mt*%;NW){-z(CTMu2I7*!ldg^DkHX*BIZEZ`*{S6-29xa zdBaz)i>2ygYk;{=&E==c}mn>S!Q!B00J6%-8o7ad6jm;MW$By^B*vc zsB?eN9i`y7+q5$Ux80`1D){?tm?Lg&rOSYx0Thr$e?poxei@hFp}6jhV-8Z}mj@z| zIR6efl7hNB)QZHWdLA4g9d=|vBKCHPT}`}8#VbVqttC7VJMTgSErol+%PIHh$SBx+ z5AviU=7@=OXJJGRMD<5z#(g@q3bx*dXo9Z$RKOKz+e;n003YwA9Tnh5y|7*&lj&N(ggRLU5Nx-TJ{sGKHkiytA1pj0#pTK2^5ZO9}Z6qpa zD0_imKY^vt8;{{bnaMi3uSN^-x&?cLBqmz2LV^}cRz={TV@nAdbZjMoofTV0&}_vT zrIIYP@@AgcQVLW0Qd)qUt=Sq98fhb(*=Qs5^xCjFG&#psOnzz0{)?z5>{x@;Q--;A zY$aw{Fe^Esh=~E-^$uf5OK>=gB{({qWzZ|j)t(g*EVE~e2)gZAEqb~!3wRdYY{;$t z_g4sJI#j_49omP13*$jdjJIx%3%EaKo8xB6w~jd!E4HLK`>Yn=Y(es_xKKKaN$d%z@^g zbrt%$UD*<%%15zgf_tObW`d^ClzJn2xv>`s_P7a2e|HL&5z(DeU_^HhRwMp(QZ6}S z(>~gIs|TA!44o${BdGGEKpXKxPc}=6bvt5m4>kR8FE&;B(}Q{|3U=7@+Ql`7S>fC< z%mJT&9-R7{w-I~2*fLVHYz$jVFvOcxNo{xgiu>i~=xT5EVm^4>n|YAPHE;G5L7@+u zFC{IUTxHikq}ec5t?eZK5r0&72(Ly+r7RcFMbeyl<|IT9}=l9R13!gzBk zUiD{-Nys&T@=Cr1urev@gAMT{yYM9l#rBuUvFt!*DZTJ_LVY&{sr)5~#+`v81A7A5 z!*XE=4)Tb-}k<==s;=&ge4&3xioL!Kq-jPzt5>`DOJgb(z+`(na=42(y*EssD@D ze?1t{CX`JhHIId|#|YjEWyJ*cVFIedSRzro!&m}T;*~HqnII&b&Pye(kkBc?JA!4? zWOW3aLa---JxX8~$#Qk#@3PuH^XnspiZ3ErIcEPxPmZNd=7O`tV^J&~o1&O2b`TGD zM=>L5af@b4G5ID5uW`aBPf-+t-+{7W@&PHducNZ)pm~>8$itQx%9EI`cfw=?1^xb8 z^g_5B!}OSapVS&+S)rv6Xu?$il;hnhy2$xN@h`@*3NkxAj#WyrmvBZLowe=n z)AP?WzF+$*PTD(_9!uKlW%100)~t)Cf~~|qMINHjAwe195#VP5u{9DarD*q%mn71B>pTNrGMz5^6BN%O*PG{nw5*% z=i3I?haL))A8{UoxVjM!xOjq8&?m@s3B!^E6)fRl4N9<#AW8iF`r05pO%L=4?wfer%DnXL?v)JBopp|(e%~r(S>NtqIbO0A$(=-*}J_+X}+|hupvlIdG1WDpL+A>Jb zP#3cmamTzgh&y@!7dL5|jQEa(qY|!4uuc`c0D>fO7IG=y53=t Date: Sun, 14 Mar 2021 20:01:37 +0000 Subject: [PATCH 082/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 4df301de88ac2543600cbaa2a0ea2df231dcfade..ed925b9d96769f9c8ae553d3e191ff460135666b 100644 GIT binary patch delta 7334 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 WxTU?gr9HT~Qqxq>@MBE&t7}&wbr}# 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 From a797b9b5a3ad19fb1d97f28a7d8fcef0a4351bef Mon Sep 17 00:00:00 2001 From: philipMartini Date: Sun, 14 Mar 2021 20:02:57 +0000 Subject: [PATCH 083/139] Update documentation --- docs-out/_build/doctrees/environment.pickle | Bin 148538 -> 148538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index ed925b9d96769f9c8ae553d3e191ff460135666b..8ec1ce8daa4569bdec5862fc428cf0f237a7fa20 100644 GIT binary patch delta 7433 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 delta 7537 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 Zmwmx4AH*#mz{S;?rNX_xo4{UR{{cnV*Gd2Y From e298fcb4f44d22a7c6e22704d954fed19fa63c46 Mon Sep 17 00:00:00 2001 From: philipMartini <45294280+philipMartini@users.noreply.github.com> Date: Sun, 14 Mar 2021 21:07:05 +0100 Subject: [PATCH 084/139] Delete dist directory --- dist/PyCTBN-1.0-py3-none-any.whl | Bin 35618 -> 0 bytes dist/PyCTBN-1.0.tar.gz | Bin 24232 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 dist/PyCTBN-1.0-py3-none-any.whl delete mode 100644 dist/PyCTBN-1.0.tar.gz diff --git a/dist/PyCTBN-1.0-py3-none-any.whl b/dist/PyCTBN-1.0-py3-none-any.whl deleted file mode 100644 index 974a54d6a50e564d5ea1efd9cb460bb8ab7243d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35618 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

    Installation/Usage

    -

    Download the release in .tar.gz or .whl format and simply use pip install to install it:

    -
    $pip install PyCTBN-1.0.tar.gz
    +

    Download the latest release in .tar.gz or .whl format and simply use pip install to install it:

    +
    $pip install PyCTBN-2.2.tar.gz
     
    diff --git a/docs-out/_build/html/searchindex.js b/docs-out/_build/html/searchindex.js index 7d0597c..22a6a83 100644 --- a/docs-out/_build/html/searchindex.js +++ b/docs-out/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["PyCTBN","PyCTBN.PyCTBN","PyCTBN.PyCTBN.estimators","PyCTBN.PyCTBN.optimizers","PyCTBN.PyCTBN.structure_graph","PyCTBN.PyCTBN.utility","PyCTBN.tests","PyCTBN.tests.estimators","PyCTBN.tests.optimizers","PyCTBN.tests.structure_graph","PyCTBN.tests.utility","basic_main","examples","index","modules","setup"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["PyCTBN.rst","PyCTBN.PyCTBN.rst","PyCTBN.PyCTBN.estimators.rst","PyCTBN.PyCTBN.optimizers.rst","PyCTBN.PyCTBN.structure_graph.rst","PyCTBN.PyCTBN.utility.rst","PyCTBN.tests.rst","PyCTBN.tests.estimators.rst","PyCTBN.tests.optimizers.rst","PyCTBN.tests.structure_graph.rst","PyCTBN.tests.utility.rst","basic_main.rst","examples.rst","index.rst","modules.rst","setup.rst"],objects:{"":{PyCTBN:[0,0,0,"-"]},"PyCTBN.PyCTBN":{estimators:[2,0,0,"-"],optimizers:[3,0,0,"-"],structure_graph:[4,0,0,"-"],utility:[5,0,0,"-"]},"PyCTBN.PyCTBN.estimators":{fam_score_calculator:[2,0,0,"-"],parameters_estimator:[2,0,0,"-"],structure_constraint_based_estimator:[2,0,0,"-"],structure_estimator:[2,0,0,"-"],structure_score_based_estimator:[2,0,0,"-"]},"PyCTBN.PyCTBN.estimators.fam_score_calculator":{FamScoreCalculator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator":{get_fam_score:[2,2,1,""],marginal_likelihood_q:[2,2,1,""],marginal_likelihood_theta:[2,2,1,""],single_cim_xu_marginal_likelihood_q:[2,2,1,""],single_cim_xu_marginal_likelihood_theta:[2,2,1,""],single_internal_cim_xxu_marginal_likelihood_theta:[2,2,1,""],variable_cim_xu_marginal_likelihood_q:[2,2,1,""],variable_cim_xu_marginal_likelihood_theta:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator":{ParametersEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator":{compute_parameters_for_node:[2,2,1,""],compute_state_res_time_for_node:[2,2,1,""],compute_state_transitions_for_a_node:[2,2,1,""],fast_init:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator":{StructureConstraintBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator":{complete_test:[2,2,1,""],compute_thumb_value:[2,2,1,""],ctpc_algorithm:[2,2,1,""],estimate_structure:[2,2,1,""],independence_test:[2,2,1,""],one_iteration_of_CTPC_algorithm:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator":{StructureEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator":{adjacency_matrix:[2,2,1,""],build_complete_graph:[2,2,1,""],build_removable_edges_matrix:[2,2,1,""],estimate_structure:[2,2,1,""],generate_possible_sub_sets_of_size:[2,2,1,""],save_plot_estimated_structure_graph:[2,2,1,""],save_results:[2,2,1,""],spurious_edges:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator":{StructureScoreBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator":{estimate_parents:[2,2,1,""],estimate_structure:[2,2,1,""],get_score_from_graph:[2,2,1,""]},"PyCTBN.PyCTBN.optimizers":{constraint_based_optimizer:[3,0,0,"-"],hill_climbing_search:[3,0,0,"-"],optimizer:[3,0,0,"-"],tabu_search:[3,0,0,"-"]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer":{ConstraintBasedOptimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search":{HillClimbing:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search.HillClimbing":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer":{Optimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer.Optimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search":{TabuSearch:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search.TabuSearch":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.structure_graph":{conditional_intensity_matrix:[4,0,0,"-"],network_graph:[4,0,0,"-"],sample_path:[4,0,0,"-"],set_of_cims:[4,0,0,"-"],structure:[4,0,0,"-"],trajectory:[4,0,0,"-"]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix":{ConditionalIntensityMatrix:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix":{cim:[4,2,1,""],compute_cim_coefficients:[4,2,1,""],state_residence_times:[4,2,1,""],state_transition_matrix:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph":{NetworkGraph:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph":{add_edges:[4,2,1,""],add_nodes:[4,2,1,""],build_p_comb_structure_for_a_node:[4,2,1,""],build_time_columns_filtering_for_a_node:[4,2,1,""],build_time_scalar_indexing_structure_for_a_node:[4,2,1,""],build_transition_filtering_for_a_node:[4,2,1,""],build_transition_scalar_indexing_structure_for_a_node:[4,2,1,""],clear_indexing_filtering_structures:[4,2,1,""],edges:[4,2,1,""],fast_init:[4,2,1,""],get_node_indx:[4,2,1,""],get_ordered_by_indx_set_of_parents:[4,2,1,""],get_parents_by_id:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],has_edge:[4,2,1,""],nodes:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_values:[4,2,1,""],p_combs:[4,2,1,""],remove_edges:[4,2,1,""],remove_node:[4,2,1,""],time_filtering:[4,2,1,""],time_scalar_indexing_strucure:[4,2,1,""],transition_filtering:[4,2,1,""],transition_scalar_indexing_structure:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path":{SamplePath:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath":{build_structure:[4,2,1,""],build_trajectories:[4,2,1,""],clear_memory:[4,2,1,""],has_prior_net_structure:[4,2,1,""],structure:[4,2,1,""],total_variables_count:[4,2,1,""],trajectories:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims":{SetOfCims:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims":{actual_cims:[4,2,1,""],build_cims:[4,2,1,""],build_times_and_transitions_structures:[4,2,1,""],filter_cims_with_mask:[4,2,1,""],get_cims_number:[4,2,1,""],p_combs:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.structure":{Structure:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.structure.Structure":{add_edge:[4,2,1,""],clean_structure_edges:[4,2,1,""],contains_edge:[4,2,1,""],edges:[4,2,1,""],get_node_id:[4,2,1,""],get_node_indx:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_labels:[4,2,1,""],nodes_values:[4,2,1,""],remove_edge:[4,2,1,""],remove_node:[4,2,1,""],total_variables_number:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory":{Trajectory:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory":{complete_trajectory:[4,2,1,""],size:[4,2,1,""],times:[4,2,1,""],trajectory:[4,2,1,""]},"PyCTBN.PyCTBN.utility":{abstract_importer:[5,0,0,"-"],cache:[5,0,0,"-"],json_importer:[5,0,0,"-"],sample_importer:[5,0,0,"-"]},"PyCTBN.PyCTBN.utility.abstract_importer":{AbstractImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter":{build_list_of_samples_array:[5,2,1,""],build_sorter:[5,2,1,""],clear_concatenated_frame:[5,2,1,""],compute_row_delta_in_all_samples_frames:[5,2,1,""],compute_row_delta_sigle_samples_frame:[5,2,1,""],concatenated_samples:[5,2,1,""],dataset_id:[5,2,1,""],file_path:[5,2,1,""],sorter:[5,2,1,""],structure:[5,2,1,""],variables:[5,2,1,""]},"PyCTBN.PyCTBN.utility.cache":{Cache:[5,1,1,""]},"PyCTBN.PyCTBN.utility.cache.Cache":{clear:[5,2,1,""],find:[5,2,1,""],put:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_importer":{JsonImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_importer.JsonImporter":{build_sorter:[5,2,1,""],clear_data_frame_list:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""],import_sampled_cims:[5,2,1,""],import_structure:[5,2,1,""],import_trajectories:[5,2,1,""],import_variables:[5,2,1,""],normalize_trajectories:[5,2,1,""],one_level_normalizing:[5,2,1,""],read_json_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.sample_importer":{SampleImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.sample_importer.SampleImporter":{build_sorter:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""]},"PyCTBN.tests":{estimators:[7,0,0,"-"],optimizers:[8,0,0,"-"],structure_graph:[9,0,0,"-"],utility:[10,0,0,"-"]},"PyCTBN.tests.estimators":{test_parameters_estimator:[7,0,0,"-"],test_structure_constraint_based_estimator:[7,0,0,"-"],test_structure_estimator:[7,0,0,"-"],test_structure_score_based_estimator:[7,0,0,"-"]},"PyCTBN.tests.estimators.test_parameters_estimator":{TestParametersEstimatior:[7,1,1,""]},"PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior":{aux_import_sampled_cims:[7,2,1,""],cim_equality_test:[7,2,1,""],equality_of_cims_of_node:[7,2,1,""],setUpClass:[7,2,1,""],test_compute_parameters_for_node:[7,2,1,""],test_fast_init:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator":{TestStructureConstraintBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_estimator":{TestStructureEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator":{setUpClass:[7,2,1,""],test_adjacency_matrix:[7,2,1,""],test_build_complete_graph:[7,2,1,""],test_build_removable_edges_matrix:[7,2,1,""],test_generate_possible_sub_sets_of_size:[7,2,1,""],test_init:[7,2,1,""],test_save_plot_estimated_graph:[7,2,1,""],test_save_results:[7,2,1,""],test_time:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator":{TestStructureScoreBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""],test_structure_monoprocesso:[7,2,1,""]},"PyCTBN.tests.optimizers":{test_hill_climbing_search:[8,0,0,"-"],test_tabu_search:[8,0,0,"-"]},"PyCTBN.tests.optimizers.test_hill_climbing_search":{TestHillClimbingSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_hill_climbing_search.TestHillClimbingSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.optimizers.test_tabu_search":{TestTabuSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_tabu_search.TestTabuSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.structure_graph":{test_cim:[9,0,0,"-"],test_networkgraph:[9,0,0,"-"],test_sample_path:[9,0,0,"-"],test_setofcims:[9,0,0,"-"],test_structure:[9,0,0,"-"],test_trajectory:[9,0,0,"-"]},"PyCTBN.tests.structure_graph.test_cim":{TestConditionalIntensityMatrix:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix":{setUpClass:[9,2,1,""],test_compute_cim_coefficients:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph":{TestNetworkGraph:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph":{aux_build_p_combs_structure:[9,2,1,""],aux_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],aux_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],aux_build_transition_columns_filtering_structure:[9,2,1,""],aux_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_add_edges:[9,2,1,""],test_add_nodes:[9,2,1,""],test_build_p_combs_structure:[9,2,1,""],test_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],test_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],test_build_transition_columns_filtering_structure:[9,2,1,""],test_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],test_fast_init:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_ordered_by_indx_set_of_parents:[9,2,1,""],test_get_parents_by_id:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_sample_path":{TestSamplePath:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath":{setUpClass:[9,2,1,""],test_buid_samplepath_no_concatenated_samples:[9,2,1,""],test_buid_samplepath_no_variables:[9,2,1,""],test_build_saplepath_no_prior_net_structure:[9,2,1,""],test_build_structure:[9,2,1,""],test_build_structure_bad_sorter:[9,2,1,""],test_build_trajectories:[9,2,1,""],test_init:[9,2,1,""],test_init_not_filled_dataframse:[9,2,1,""],test_init_not_initialized_importer:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_setofcims":{TestSetOfCims:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims":{another_filtering_method:[9,2,1,""],aux_test_build_cims:[9,2,1,""],aux_test_init:[9,2,1,""],build_p_comb_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_build_cims:[9,2,1,""],test_filter_cims_with_mask:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_structure":{TestStructure:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_structure.TestStructure":{setUpClass:[9,2,1,""],test_edges_operations:[9,2,1,""],test_equality:[9,2,1,""],test_get_node_id:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_positional_node_indx:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectory":{TestTrajectory:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory":{setUpClass:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.utility":{test_cache:[10,0,0,"-"],test_json_importer:[10,0,0,"-"],test_sample_importer:[10,0,0,"-"]},"PyCTBN.tests.utility.test_cache":{TestCache:[10,1,1,""]},"PyCTBN.tests.utility.test_cache.TestCache":{test_clear:[10,2,1,""],test_find:[10,2,1,""],test_init:[10,2,1,""],test_put:[10,2,1,""]},"PyCTBN.tests.utility.test_json_importer":{TestJsonImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_json_importer.TestJsonImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_build_sorter:[10,2,1,""],test_clear_concatenated_frame:[10,2,1,""],test_clear_data_frame_list:[10,2,1,""],test_compute_row_delta_in_all_frames:[10,2,1,""],test_compute_row_delta_in_all_frames_not_init_sorter:[10,2,1,""],test_compute_row_delta_single_samples_frame:[10,2,1,""],test_dataset_id:[10,2,1,""],test_file_path:[10,2,1,""],test_import_data:[10,2,1,""],test_import_sampled_cims:[10,2,1,""],test_import_structure:[10,2,1,""],test_import_variables:[10,2,1,""],test_init:[10,2,1,""],test_normalize_trajectories:[10,2,1,""],test_normalize_trajectories_wrong_indx:[10,2,1,""],test_normalize_trajectories_wrong_key:[10,2,1,""],test_read_json_file_found:[10,2,1,""],test_read_json_file_not_found:[10,2,1,""]},"PyCTBN.tests.utility.test_sample_importer":{TestSampleImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_sample_importer.TestSampleImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_init:[10,2,1,""],test_order:[10,2,1,""]},PyCTBN:{PyCTBN:[1,0,0,"-"],tests:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"abstract":[2,3,4,5,12],"boolean":[2,4],"case":[7,8,9,10],"class":[2,3,4,5,7,8,9,10,12],"default":[2,3,5],"float":2,"function":2,"import":[4,5,13,14],"int":[2,3,4,5],"null":2,"return":[2,3,4,5,9,12],"static":[2,4],"super":12,"true":[2,12],"var":12,HAS:5,Has:[2,4],NOT:2,The:[2,4,5,12],Use:[2,12],__actual_cach:5,__init__:12,__list_of_sets_of_par:5,_actual_cim:4,_actual_trajectori:4,_aggregated_info_about_nodes_par:4,_array_indx:5,_cach:2,_cim:4,_complete_graph:2,_df_samples_list:[5,12],_df_structur:5,_df_variabl:[5,12],_file_path:12,_graph:[4,12],_import:4,_net_graph:2,_node:2,_node_id:4,_nodes_indx:2,_nodes_v:2,_p_combs_structur:4,_raw_data:5,_sample_path:2,_single_set_of_cim:2,_sorter:[5,12],_state_residence_tim:4,_structur:4,_structure_label:5,_time:4,_time_filt:4,_time_scalar_indexing_structur:4,_total_variables_count:4,_total_variables_numb:4,_trajectori:4,_transition_filt:4,_transition_matric:4,_transition_scalar_indexing_structur:4,_variables_label:5,abc:[3,5],about:[3,4],abstract_import:[0,1,4,13,14],abstractimport:[4,5,12],act:5,actual:[2,4],actual_cim:[4,12],add:[4,5],add_edg:4,add_nod:4,added:2,addit:2,adjac:[2,12],adjacency_matrix:[2,12],after:5,against:2,aggreg:4,algorithm:[2,3,12],all:[2,3,4,5,9,12],alpha_xu:2,alpha_xxu:2,alreadi:[5,12],also:[2,4],ani:[2,3],anoth:4,another_filtering_method:9,approach:2,arc:5,arrai:[2,4,5,12],assign:2,assum:2,automat:2,aux_build_p_combs_structur:9,aux_build_time_columns_filtering_structure_for_a_nod:9,aux_build_time_scalar_indexing_structure_for_a_nod:9,aux_build_transition_columns_filtering_structur:9,aux_build_transition_scalar_indexing_structure_for_a_nod:9,aux_import_sampled_cim:7,aux_test_build_cim:9,aux_test_init:9,axi:12,base:[2,3,4,5,7,8,9,10],bayesian:2,befor:[2,3,7,8,9,10],belong:2,best:2,between:5,bool:[2,4],both:[2,5],bound:4,build:[2,4,5,9,12],build_cim:4,build_complete_graph:2,build_list_of_samples_arrai:5,build_p_comb_structure_for_a_nod:[4,9],build_removable_edges_matrix:2,build_sort:[5,12],build_structur:[4,12],build_time_columns_filtering_for_a_nod:4,build_time_scalar_indexing_structure_for_a_nod:4,build_times_and_transitions_structur:4,build_trajectori:[4,12],build_transition_filtering_for_a_nod:4,build_transition_scalar_indexing_structure_for_a_nod:4,built:2,cach:[0,1,2,13,14],calcul:2,call:[5,12],cardin:[2,4,5,9],cardinalit:[4,5],caridin:4,caridinalit:4,chang:[4,5],check:4,chi:2,chi_test:2,chi_test_alfa:2,child:[2,3],child_indx:2,child_states_numb:2,child_val:2,cim1:[2,7],cim2:[2,7],cim:[2,4,5,12],cim_equality_test:7,cims_kei:5,cims_label:7,classmethod:[7,8,9,10],clean_structure_edg:4,clear:[4,5],clear_concatenated_fram:5,clear_data_frame_list:5,clear_indexing_filtering_structur:4,clear_memori:4,climb:[2,3],coeffici:4,col:4,cols_filt:2,column:[2,4,5,12],columns_head:5,comb:4,combin:[4,5,9],combinatori:[4,9],common:2,complet:[2,4,5],complete_test:2,complete_trajectori:4,comput:[2,3,4,5,12],compute_cim_coeffici:4,compute_parameters_for_nod:[2,12],compute_row_delta_in_all_samples_fram:[5,12],compute_row_delta_sigle_samples_fram:5,compute_state_res_time_for_nod:2,compute_state_transitions_for_a_nod:2,compute_thumb_valu:2,concatanated_sampl:5,concaten:[4,5],concatenated_sampl:5,condit:4,conditional_intensity_matrix:[0,1,2,13,14],conditionalintensitymatrix:[2,4],consid:[2,4],constraint:2,constraint_based_optim:[0,1,13,14],constraintbasedoptim:3,construct:[4,5,12],conta:5,contain:[2,4,5,9],contains_edg:4,content:[13,14],convert:[2,5],copi:5,core:5,correct:[4,5],could:2,count:4,creat:[2,4,12],csv:12,csvimport:12,ctbn:2,ctpc:[2,3,12],ctpc_algorithm:[2,12],current:[2,3,5],cut:5,dafram:5,data:[2,3,4,5,13,14],datafram:[4,5,12],dataset:[3,4,5],dataset_id:[5,12],datfram:5,def:12,defin:5,definit:5,defualt:2,delta:[2,4,5],demonstr:12,describ:5,desir:[2,4],df_samples_list:5,dict:[5,12],dictionari:5,differ:5,differt:2,digraph:2,dimens:4,dir:12,direct:[2,4],directli:5,disabl:[2,3],disable_multiprocess:2,distribuit:2,doc:5,doubl:4,download:12,drop:12,duplic:4,dyn:12,each:[2,3,5],edg:[2,4,5,12],edges_list:4,end:5,entir:2,equal:4,equality_of_cims_of_nod:7,est:12,estim:[0,1,3,4,6,13,14],estimate_par:2,estimate_structur:2,estimated_cim:7,everi:[4,5],exam:12,exampl:[5,13,14],exclud:2,exctract:5,exist:5,exp_test_alfa:2,exponenti:2,expos:5,extend:12,extens:[2,5],extract:[4,5],fals:2,fam_score_calcul:[0,1,13,14],famscor:2,famscorecalcul:2,fast_init:[2,4,12],file:[2,5,12],file_path:[2,5,12],filepath:5,fill:[2,12],filter:[2,4],filter_cims_with_mask:4,find:[2,5],first:[2,12],fixtur:[7,8,9,10],follow:[4,5],form:4,format:12,formula:2,found:5,frame:5,from:[4,5,12],from_nod:5,gener:2,generate_possible_sub_sets_of_s:2,get:[2,5],get_cims_numb:4,get_fam_scor:2,get_node_id:4,get_node_indx:4,get_ordered_by_indx_set_of_par:4,get_parents_by_id:4,get_positional_node_indx:4,get_score_from_graph:2,get_states_numb:4,given:[2,4,5],glob:12,graph:[2,4,9,12],graph_struct:4,graphic:2,grid:[4,9],grpah:12,has:[5,12],has_edg:4,has_prior_net_structur:4,have:5,header:5,header_column:5,hill:[2,3],hill_climbing_search:[0,1,13,14],hillclimb:3,hold:[2,4],hook:[7,8,9,10],how:5,hyperparamet:2,hypothesi:2,identifi:[2,4,5],iff:2,implement:[3,5,13,14],import_data:[5,12],import_sampled_cim:5,import_structur:5,import_trajectori:5,import_vari:[5,12],improv:[2,3],includ:2,independ:2,independence_test:2,index:[2,4,5,12,13],indic:[2,4],indx:5,info:[4,12],inform:[3,4],init:12,initi:[2,4,5,12],inplac:12,insid:12,instal:[13,14],interest:4,interfac:3,intes:4,iter:[2,3],iterations_numb:[2,3],its:[2,3],join:12,json:[2,5,12],json_import:[0,1,13,14],jsonarrai:5,jsonimport:[5,12],keep:[2,3,5],kei:5,kind:2,knowledg:2,known:2,known_edg:2,label:[2,3,4,5],lenght:[2,3],level:[2,5],likelihood:2,list:[2,3,4,5,12],list_of_column:4,list_of_edg:4,list_of_nod:4,load:5,loop:2,m_xu_suff_stat:2,m_xxu_suff_stat:2,main:12,margin:2,marginal_likelihood_q:2,marginal_likelihood_theta:2,mask:[4,9],mask_arr:4,matric:[2,4],matrix:[2,4,5,9,12],max_par:[2,3],maximum:[2,3],member:[4,5],mention:4,merg:5,method:[2,5,7,8,9,10],methodnam:[7,8,9,10],model:2,modul:[13,14],multipl:5,multiprocess:2,name:[2,4,5,12],ndarrai:[2,4,5],necessari:[2,4,5],nest:5,net:[2,3,4,5,12],net_graph:2,network:[2,4,5],network_graph:[0,1,2,13,14],networkgraph:[2,4,12],networkx:2,node:[2,3,4,5,9,12],node_id:[2,3,4,9],node_index:4,node_indx:[2,4],node_st:[4,9],node_states_numb:[4,9],nodes_index:4,nodes_indexes_arr:4,nodes_label:4,nodes_labels_list:4,nodes_numb:4,nodes_vals_arr:4,nodes_valu:[4,12],none:[2,3,4,5,7,9,10,12],normal:5,normalize_trajectori:5,number:[2,3,4],numpi:[2,4,5,9],obj:[10,12],object:[2,3,4,5,12],one:[4,5],one_iteration_of_ctpc_algorithm:2,one_level_norm:5,onli:5,oper:2,optim:[0,1,2,6,13,14],optimize_structur:3,option:[2,3],order:[2,5,10],origin:5,original_cols_numb:4,otherwis:[2,5],out:5,outer:[5,12],over:2,own:[13,14],p_comb:[4,9],p_indx:[4,9],p_val:9,p_valu:9,packag:[13,14],page:13,panda:[5,12],param:4,paramet:[2,3,4,5,9,13,14],parameters_estim:[0,1,13,14],parametersestim:[2,12],parent:[2,3,4,5],parent_indx:2,parent_label:2,parent_set:2,parent_set_v:2,parent_v:2,parent_valu:9,parents_cardin:4,parents_comb:5,parents_index:4,parents_indx:9,parents_label:[4,9],parents_states_numb:[4,9],parents_v:[4,9],parents_valu:[4,9],part:2,particular:[2,5],pass:12,path:[2,5,12],patienc:[2,3],peest:12,perform:2,pip:12,place:5,plot:2,png:2,posit:[4,5],possibl:[2,4],predict:3,prepar:5,present:[2,5],print:12,prior:[2,12],prior_net_structur:5,process:[2,3,4,5],processes_numb:2,properli:5,properti:[4,5],put:5,pyctbn:12,q_xx:4,rappres:4,raw:5,raw_data:5,read:[5,12],read_csv:12,read_csv_fil:12,read_fil:12,read_json_fil:5,real:[2,4,5,12],refer:[4,5],reject:2,rel:4,relat:5,releas:12,remain:5,remov:[2,4,5],remove_edg:4,remove_nod:4,repres:4,represent:2,res:4,resid:[2,4],result:[2,5,12],rtype:4,rule:[2,3],run:[7,8,9,10],runtest:[7,8,9,10],same:5,sampl:[4,5,12],sample_fram:[5,12],sample_import:[0,1,13,14],sample_path:[0,1,2,13,14],sampled_cim:7,sampleimport:5,samplepath:[2,4,12],samples_label:5,save:[2,12],save_plot_estimated_structure_graph:2,save_result:[2,12],scalar_index:2,scalar_indexes_struct:2,score:2,se1:12,search:[2,3,13],second:2,see:5,select:12,self:[2,5,12],sep:2,sep_set:2,set:[2,4,5,7,8,9,10],set_of_cim:[0,1,2,5,13,14],setofcim:[2,4,5,12],setupclass:[7,8,9,10],shift:[4,5],shifted_cols_head:5,show:2,signific:2,simbol:5,simpl:12,simpli:12,sinc:4,single_cim_xu_marginal_likelihood_q:2,single_cim_xu_marginal_likelihood_theta:2,single_internal_cim_xxu_marginal_likelihood_theta:2,size:[2,4],socim:5,sofc1:12,sorter:5,specif:[2,4,12],spuriou:2,spurious_edg:2,start:5,state:[2,4],state_res_tim:4,state_residence_tim:4,state_transition_matrix:4,statist:2,stop:[2,3],str:[2,3,4,5,12],string:[2,3,4,5],structur:[0,1,2,3,5,9,13,14],structure_constraint_based_estim:[0,1,13,14],structure_estim:[0,1,3,13,14],structure_estimation_exampl:12,structure_graph:[0,1,2,5,6,13,14],structure_label:5,structure_score_based_estim:[0,1,13,14],structureconstraintbasedestim:2,structureestim:[2,3,12],structurescorebasedestim:2,structut:4,style:2,submodul:[1,6,13,14],subpackag:[13,14],subset:2,suffici:2,suffuci:2,symbol:[4,5],synthet:5,t_xu_suff_stat:2,tabu:[2,3],tabu_length:[2,3],tabu_rules_dur:[2,3],tabu_search:[0,1,13,14],tabusearch:3,take:12,tar:12,task:[2,4],tau_xu:2,ternari:12,test:2,test_add_edg:9,test_add_nod:9,test_adjacency_matrix:7,test_buid_samplepath_no_concatenated_sampl:9,test_buid_samplepath_no_vari:9,test_build_cim:9,test_build_complete_graph:7,test_build_p_combs_structur:9,test_build_removable_edges_matrix:7,test_build_saplepath_no_prior_net_structur:9,test_build_sort:10,test_build_structur:9,test_build_structure_bad_sort:9,test_build_time_columns_filtering_structure_for_a_nod:9,test_build_time_scalar_indexing_structure_for_a_nod:9,test_build_trajectori:9,test_build_transition_columns_filtering_structur:9,test_build_transition_scalar_indexing_structure_for_a_nod:9,test_cach:6,test_child:2,test_cim:6,test_clear:10,test_clear_concatenated_fram:10,test_clear_data_frame_list:10,test_compute_cim_coeffici:9,test_compute_parameters_for_nod:7,test_compute_row_delta_in_all_fram:10,test_compute_row_delta_in_all_frames_not_init_sort:10,test_compute_row_delta_single_samples_fram:10,test_dataset_id:10,test_edges_oper:9,test_equ:9,test_fast_init:[7,9],test_file_path:10,test_filter_cims_with_mask:9,test_find:10,test_generate_possible_sub_sets_of_s:7,test_get_node_id:9,test_get_node_indx:9,test_get_ordered_by_indx_set_of_par:9,test_get_parents_by_id:9,test_get_positional_node_indx:9,test_get_states_numb:9,test_hill_climbing_search:6,test_import_data:10,test_import_sampled_cim:10,test_import_structur:10,test_import_vari:10,test_init:[7,9,10],test_init_not_filled_dataframs:9,test_init_not_initialized_import:9,test_json_import:6,test_networkgraph:6,test_normalize_trajectori:10,test_normalize_trajectories_wrong_indx:10,test_normalize_trajectories_wrong_kei:10,test_ord:10,test_par:2,test_parameters_estim:6,test_put:10,test_read_json_file_found:10,test_read_json_file_not_found:10,test_repr:9,test_sample_import:6,test_sample_path:6,test_save_plot_estimated_graph:7,test_save_result:7,test_setofcim:6,test_structur:[6,8],test_structure_1:7,test_structure_2:7,test_structure_3:[7,8],test_structure_constraint_based_estim:6,test_structure_estim:6,test_structure_monoprocesso:7,test_structure_score_based_estim:6,test_tabu_search:6,test_tim:7,test_trajectori:6,testcach:10,testcas:[7,8,9,10],testconditionalintensitymatrix:9,testhillclimbingsearch:8,testjsonimport:10,testnetworkgraph:9,testparametersestimatior:7,testsampleimport:10,testsamplepath:9,testsetofcim:9,teststructur:9,teststructureconstraintbasedestim:7,teststructureestim:7,teststructurescorebasedestim:7,testtabusearch:8,testtrajectori:9,tha:5,theta:2,thi:[2,4,5,12],three:12,threshold:2,thumb:2,thumb_threshold:2,thumb_valu:2,time:[2,4,5,12],time_filt:4,time_kei:5,time_scalar_indexing_strucur:4,timestamp:5,to_nod:5,tot_vars_count:[2,3],total:[2,4],total_variables_count:4,total_variables_numb:4,traj:5,trajecory_head:5,trajectori:[0,1,2,5,12,13,14],trajectories_kei:5,trajectory_list:5,trajectri:12,transit:[2,4,5],transition_filt:4,transition_matric:4,transition_scalar_indexing_structur:4,tri:5,tupl:4,tutori:5,two:2,type:[2,3,4,5,12],union:5,uniqu:5,unittest:[7,8,9,10],unus:4,usag:[13,14],use:[2,12],used:[2,3,4,5],using:[2,3,4,5],util:[0,1,4,6,13,14],valid:2,valu:[2,3,4,5,9,12],values_list:12,var_id:2,variabl:[2,3,4,5,12],variable_cardin:5,variable_cim_xu_marginal_likelihood_q:2,variable_cim_xu_marginal_likelihood_theta:2,variable_label:5,variables_kei:5,variables_label:5,vector:[2,4],want:12,when:2,where:5,which:[2,3,4,5],whl:12,who:2,without:[2,3],you:[2,5,12],your:[13,14]},titles:["PyCTBN package","PyCTBN.PyCTBN package","PyCTBN.PyCTBN.estimators package","PyCTBN.PyCTBN.optimizers package","PyCTBN.PyCTBN.structure_graph package","PyCTBN.PyCTBN.utility package","PyCTBN.tests package","PyCTBN.tests.estimators package","PyCTBN.tests.optimizers package","PyCTBN.tests.structure_graph package","PyCTBN.tests.utility package","basic_main module","Examples","Welcome to PyCTBN\u2019s documentation!","PyCTBN","setup module"],titleterms:{"import":12,abstract_import:5,basic_main:11,cach:5,conditional_intensity_matrix:4,constraint_based_optim:3,content:[0,1,2,3,4,5,6,7,8,9,10],data:12,document:13,estim:[2,7,12],exampl:12,fam_score_calcul:2,hill_climbing_search:3,implement:12,indic:13,instal:12,json_import:5,modul:[0,1,2,3,4,5,6,7,8,9,10,11,15],network_graph:4,optim:[3,8],own:12,packag:[0,1,2,3,4,5,6,7,8,9,10],paramet:12,parameters_estim:2,pyctbn:[0,1,2,3,4,5,6,7,8,9,10,13,14],sample_import:5,sample_path:4,set_of_cim:4,setup:15,structur:[4,12],structure_constraint_based_estim:2,structure_estim:2,structure_graph:[4,9],structure_score_based_estim:2,submodul:[0,2,3,4,5,7,8,9,10],subpackag:[0,1,6],tabl:13,tabu_search:3,test:[6,7,8,9,10],test_cach:10,test_cim:9,test_hill_climbing_search:8,test_json_import:10,test_networkgraph:9,test_parameters_estim:7,test_sample_import:10,test_sample_path:9,test_setofcim:9,test_structur:9,test_structure_constraint_based_estim:7,test_structure_estim:7,test_structure_score_based_estim:7,test_tabu_search:8,test_trajectori:9,trajectori:4,usag:12,util:[5,10],welcom:13,your:12}}) \ No newline at end of file +Search.setIndex({docnames:["PyCTBN","PyCTBN.PyCTBN","PyCTBN.PyCTBN.estimators","PyCTBN.PyCTBN.optimizers","PyCTBN.PyCTBN.structure_graph","PyCTBN.PyCTBN.utility","PyCTBN.tests","PyCTBN.tests.estimators","PyCTBN.tests.optimizers","PyCTBN.tests.structure_graph","PyCTBN.tests.utility","basic_main","examples","index","modules","setup"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["PyCTBN.rst","PyCTBN.PyCTBN.rst","PyCTBN.PyCTBN.estimators.rst","PyCTBN.PyCTBN.optimizers.rst","PyCTBN.PyCTBN.structure_graph.rst","PyCTBN.PyCTBN.utility.rst","PyCTBN.tests.rst","PyCTBN.tests.estimators.rst","PyCTBN.tests.optimizers.rst","PyCTBN.tests.structure_graph.rst","PyCTBN.tests.utility.rst","basic_main.rst","examples.rst","index.rst","modules.rst","setup.rst"],objects:{"":{PyCTBN:[0,0,0,"-"]},"PyCTBN.PyCTBN":{estimators:[2,0,0,"-"],optimizers:[3,0,0,"-"],structure_graph:[4,0,0,"-"],utility:[5,0,0,"-"]},"PyCTBN.PyCTBN.estimators":{fam_score_calculator:[2,0,0,"-"],parameters_estimator:[2,0,0,"-"],structure_constraint_based_estimator:[2,0,0,"-"],structure_estimator:[2,0,0,"-"],structure_score_based_estimator:[2,0,0,"-"]},"PyCTBN.PyCTBN.estimators.fam_score_calculator":{FamScoreCalculator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator":{get_fam_score:[2,2,1,""],marginal_likelihood_q:[2,2,1,""],marginal_likelihood_theta:[2,2,1,""],single_cim_xu_marginal_likelihood_q:[2,2,1,""],single_cim_xu_marginal_likelihood_theta:[2,2,1,""],single_internal_cim_xxu_marginal_likelihood_theta:[2,2,1,""],variable_cim_xu_marginal_likelihood_q:[2,2,1,""],variable_cim_xu_marginal_likelihood_theta:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator":{ParametersEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator":{compute_parameters_for_node:[2,2,1,""],compute_state_res_time_for_node:[2,2,1,""],compute_state_transitions_for_a_node:[2,2,1,""],fast_init:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator":{StructureConstraintBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator":{complete_test:[2,2,1,""],compute_thumb_value:[2,2,1,""],ctpc_algorithm:[2,2,1,""],estimate_structure:[2,2,1,""],independence_test:[2,2,1,""],one_iteration_of_CTPC_algorithm:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator":{StructureEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator":{adjacency_matrix:[2,2,1,""],build_complete_graph:[2,2,1,""],build_removable_edges_matrix:[2,2,1,""],estimate_structure:[2,2,1,""],generate_possible_sub_sets_of_size:[2,2,1,""],save_plot_estimated_structure_graph:[2,2,1,""],save_results:[2,2,1,""],spurious_edges:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator":{StructureScoreBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator":{estimate_parents:[2,2,1,""],estimate_structure:[2,2,1,""],get_score_from_graph:[2,2,1,""]},"PyCTBN.PyCTBN.optimizers":{constraint_based_optimizer:[3,0,0,"-"],hill_climbing_search:[3,0,0,"-"],optimizer:[3,0,0,"-"],tabu_search:[3,0,0,"-"]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer":{ConstraintBasedOptimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search":{HillClimbing:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search.HillClimbing":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer":{Optimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer.Optimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search":{TabuSearch:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search.TabuSearch":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.structure_graph":{conditional_intensity_matrix:[4,0,0,"-"],network_graph:[4,0,0,"-"],sample_path:[4,0,0,"-"],set_of_cims:[4,0,0,"-"],structure:[4,0,0,"-"],trajectory:[4,0,0,"-"]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix":{ConditionalIntensityMatrix:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix":{cim:[4,2,1,""],compute_cim_coefficients:[4,2,1,""],state_residence_times:[4,2,1,""],state_transition_matrix:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph":{NetworkGraph:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph":{add_edges:[4,2,1,""],add_nodes:[4,2,1,""],build_p_comb_structure_for_a_node:[4,2,1,""],build_time_columns_filtering_for_a_node:[4,2,1,""],build_time_scalar_indexing_structure_for_a_node:[4,2,1,""],build_transition_filtering_for_a_node:[4,2,1,""],build_transition_scalar_indexing_structure_for_a_node:[4,2,1,""],clear_indexing_filtering_structures:[4,2,1,""],edges:[4,2,1,""],fast_init:[4,2,1,""],get_node_indx:[4,2,1,""],get_ordered_by_indx_set_of_parents:[4,2,1,""],get_parents_by_id:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],has_edge:[4,2,1,""],nodes:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_values:[4,2,1,""],p_combs:[4,2,1,""],remove_edges:[4,2,1,""],remove_node:[4,2,1,""],time_filtering:[4,2,1,""],time_scalar_indexing_strucure:[4,2,1,""],transition_filtering:[4,2,1,""],transition_scalar_indexing_structure:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path":{SamplePath:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath":{build_structure:[4,2,1,""],build_trajectories:[4,2,1,""],clear_memory:[4,2,1,""],has_prior_net_structure:[4,2,1,""],structure:[4,2,1,""],total_variables_count:[4,2,1,""],trajectories:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims":{SetOfCims:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims":{actual_cims:[4,2,1,""],build_cims:[4,2,1,""],build_times_and_transitions_structures:[4,2,1,""],filter_cims_with_mask:[4,2,1,""],get_cims_number:[4,2,1,""],p_combs:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.structure":{Structure:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.structure.Structure":{add_edge:[4,2,1,""],clean_structure_edges:[4,2,1,""],contains_edge:[4,2,1,""],edges:[4,2,1,""],get_node_id:[4,2,1,""],get_node_indx:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_labels:[4,2,1,""],nodes_values:[4,2,1,""],remove_edge:[4,2,1,""],remove_node:[4,2,1,""],total_variables_number:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory":{Trajectory:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory":{complete_trajectory:[4,2,1,""],size:[4,2,1,""],times:[4,2,1,""],trajectory:[4,2,1,""]},"PyCTBN.PyCTBN.utility":{abstract_importer:[5,0,0,"-"],cache:[5,0,0,"-"],json_importer:[5,0,0,"-"],sample_importer:[5,0,0,"-"]},"PyCTBN.PyCTBN.utility.abstract_importer":{AbstractImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter":{build_list_of_samples_array:[5,2,1,""],build_sorter:[5,2,1,""],clear_concatenated_frame:[5,2,1,""],compute_row_delta_in_all_samples_frames:[5,2,1,""],compute_row_delta_sigle_samples_frame:[5,2,1,""],concatenated_samples:[5,2,1,""],dataset_id:[5,2,1,""],file_path:[5,2,1,""],sorter:[5,2,1,""],structure:[5,2,1,""],variables:[5,2,1,""]},"PyCTBN.PyCTBN.utility.cache":{Cache:[5,1,1,""]},"PyCTBN.PyCTBN.utility.cache.Cache":{clear:[5,2,1,""],find:[5,2,1,""],put:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_importer":{JsonImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_importer.JsonImporter":{build_sorter:[5,2,1,""],clear_data_frame_list:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""],import_sampled_cims:[5,2,1,""],import_structure:[5,2,1,""],import_trajectories:[5,2,1,""],import_variables:[5,2,1,""],normalize_trajectories:[5,2,1,""],one_level_normalizing:[5,2,1,""],read_json_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.sample_importer":{SampleImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.sample_importer.SampleImporter":{build_sorter:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""]},"PyCTBN.tests":{estimators:[7,0,0,"-"],optimizers:[8,0,0,"-"],structure_graph:[9,0,0,"-"],utility:[10,0,0,"-"]},"PyCTBN.tests.estimators":{test_parameters_estimator:[7,0,0,"-"],test_structure_constraint_based_estimator:[7,0,0,"-"],test_structure_estimator:[7,0,0,"-"],test_structure_score_based_estimator:[7,0,0,"-"]},"PyCTBN.tests.estimators.test_parameters_estimator":{TestParametersEstimatior:[7,1,1,""]},"PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior":{aux_import_sampled_cims:[7,2,1,""],cim_equality_test:[7,2,1,""],equality_of_cims_of_node:[7,2,1,""],setUpClass:[7,2,1,""],test_compute_parameters_for_node:[7,2,1,""],test_fast_init:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator":{TestStructureConstraintBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_estimator":{TestStructureEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator":{setUpClass:[7,2,1,""],test_adjacency_matrix:[7,2,1,""],test_build_complete_graph:[7,2,1,""],test_build_removable_edges_matrix:[7,2,1,""],test_generate_possible_sub_sets_of_size:[7,2,1,""],test_init:[7,2,1,""],test_save_plot_estimated_graph:[7,2,1,""],test_save_results:[7,2,1,""],test_time:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator":{TestStructureScoreBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""],test_structure_monoprocesso:[7,2,1,""]},"PyCTBN.tests.optimizers":{test_hill_climbing_search:[8,0,0,"-"],test_tabu_search:[8,0,0,"-"]},"PyCTBN.tests.optimizers.test_hill_climbing_search":{TestHillClimbingSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_hill_climbing_search.TestHillClimbingSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.optimizers.test_tabu_search":{TestTabuSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_tabu_search.TestTabuSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.structure_graph":{test_cim:[9,0,0,"-"],test_networkgraph:[9,0,0,"-"],test_sample_path:[9,0,0,"-"],test_setofcims:[9,0,0,"-"],test_structure:[9,0,0,"-"],test_trajectory:[9,0,0,"-"]},"PyCTBN.tests.structure_graph.test_cim":{TestConditionalIntensityMatrix:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix":{setUpClass:[9,2,1,""],test_compute_cim_coefficients:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph":{TestNetworkGraph:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph":{aux_build_p_combs_structure:[9,2,1,""],aux_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],aux_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],aux_build_transition_columns_filtering_structure:[9,2,1,""],aux_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_add_edges:[9,2,1,""],test_add_nodes:[9,2,1,""],test_build_p_combs_structure:[9,2,1,""],test_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],test_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],test_build_transition_columns_filtering_structure:[9,2,1,""],test_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],test_fast_init:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_ordered_by_indx_set_of_parents:[9,2,1,""],test_get_parents_by_id:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_sample_path":{TestSamplePath:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath":{setUpClass:[9,2,1,""],test_buid_samplepath_no_concatenated_samples:[9,2,1,""],test_buid_samplepath_no_variables:[9,2,1,""],test_build_saplepath_no_prior_net_structure:[9,2,1,""],test_build_structure:[9,2,1,""],test_build_structure_bad_sorter:[9,2,1,""],test_build_trajectories:[9,2,1,""],test_init:[9,2,1,""],test_init_not_filled_dataframse:[9,2,1,""],test_init_not_initialized_importer:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_setofcims":{TestSetOfCims:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims":{another_filtering_method:[9,2,1,""],aux_test_build_cims:[9,2,1,""],aux_test_init:[9,2,1,""],build_p_comb_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_build_cims:[9,2,1,""],test_filter_cims_with_mask:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_structure":{TestStructure:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_structure.TestStructure":{setUpClass:[9,2,1,""],test_edges_operations:[9,2,1,""],test_equality:[9,2,1,""],test_get_node_id:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_positional_node_indx:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectory":{TestTrajectory:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory":{setUpClass:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.utility":{test_cache:[10,0,0,"-"],test_json_importer:[10,0,0,"-"],test_sample_importer:[10,0,0,"-"]},"PyCTBN.tests.utility.test_cache":{TestCache:[10,1,1,""]},"PyCTBN.tests.utility.test_cache.TestCache":{test_clear:[10,2,1,""],test_find:[10,2,1,""],test_init:[10,2,1,""],test_put:[10,2,1,""]},"PyCTBN.tests.utility.test_json_importer":{TestJsonImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_json_importer.TestJsonImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_build_sorter:[10,2,1,""],test_clear_concatenated_frame:[10,2,1,""],test_clear_data_frame_list:[10,2,1,""],test_compute_row_delta_in_all_frames:[10,2,1,""],test_compute_row_delta_in_all_frames_not_init_sorter:[10,2,1,""],test_compute_row_delta_single_samples_frame:[10,2,1,""],test_dataset_id:[10,2,1,""],test_file_path:[10,2,1,""],test_import_data:[10,2,1,""],test_import_sampled_cims:[10,2,1,""],test_import_structure:[10,2,1,""],test_import_variables:[10,2,1,""],test_init:[10,2,1,""],test_normalize_trajectories:[10,2,1,""],test_normalize_trajectories_wrong_indx:[10,2,1,""],test_normalize_trajectories_wrong_key:[10,2,1,""],test_read_json_file_found:[10,2,1,""],test_read_json_file_not_found:[10,2,1,""]},"PyCTBN.tests.utility.test_sample_importer":{TestSampleImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_sample_importer.TestSampleImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_init:[10,2,1,""],test_order:[10,2,1,""]},PyCTBN:{PyCTBN:[1,0,0,"-"],tests:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"abstract":[2,3,4,5,12],"boolean":[2,4],"case":[7,8,9,10],"class":[2,3,4,5,7,8,9,10,12],"default":[2,3,5],"float":2,"function":2,"import":[4,5,13,14],"int":[2,3,4,5],"null":2,"return":[2,3,4,5,9,12],"static":[2,4],"super":12,"true":[2,12],"var":12,HAS:5,Has:[2,4],NOT:2,The:[2,4,5,12],Use:[2,12],__actual_cach:5,__init__:12,__list_of_sets_of_par:5,_actual_cim:4,_actual_trajectori:4,_aggregated_info_about_nodes_par:4,_array_indx:5,_cach:2,_cim:4,_complete_graph:2,_df_samples_list:[5,12],_df_structur:5,_df_variabl:[5,12],_file_path:12,_graph:[4,12],_import:4,_net_graph:2,_node:2,_node_id:4,_nodes_indx:2,_nodes_v:2,_p_combs_structur:4,_raw_data:5,_sample_path:2,_single_set_of_cim:2,_sorter:[5,12],_state_residence_tim:4,_structur:4,_structure_label:5,_time:4,_time_filt:4,_time_scalar_indexing_structur:4,_total_variables_count:4,_total_variables_numb:4,_trajectori:4,_transition_filt:4,_transition_matric:4,_transition_scalar_indexing_structur:4,_variables_label:5,abc:[3,5],about:[3,4],abstract_import:[0,1,4,13,14],abstractimport:[4,5,12],act:5,actual:[2,4],actual_cim:[4,12],add:[4,5],add_edg:4,add_nod:4,added:2,addit:2,adjac:[2,12],adjacency_matrix:[2,12],after:5,against:2,aggreg:4,algorithm:[2,3,12],all:[2,3,4,5,9,12],alpha_xu:2,alpha_xxu:2,alreadi:[5,12],also:[2,4],ani:[2,3],anoth:4,another_filtering_method:9,approach:2,arc:5,arrai:[2,4,5,12],assign:2,assum:2,automat:2,aux_build_p_combs_structur:9,aux_build_time_columns_filtering_structure_for_a_nod:9,aux_build_time_scalar_indexing_structure_for_a_nod:9,aux_build_transition_columns_filtering_structur:9,aux_build_transition_scalar_indexing_structure_for_a_nod:9,aux_import_sampled_cim:7,aux_test_build_cim:9,aux_test_init:9,axi:12,base:[2,3,4,5,7,8,9,10],bayesian:2,befor:[2,3,7,8,9,10],belong:2,best:2,between:5,bool:[2,4],both:[2,5],bound:4,build:[2,4,5,9,12],build_cim:4,build_complete_graph:2,build_list_of_samples_arrai:5,build_p_comb_structure_for_a_nod:[4,9],build_removable_edges_matrix:2,build_sort:[5,12],build_structur:[4,12],build_time_columns_filtering_for_a_nod:4,build_time_scalar_indexing_structure_for_a_nod:4,build_times_and_transitions_structur:4,build_trajectori:[4,12],build_transition_filtering_for_a_nod:4,build_transition_scalar_indexing_structure_for_a_nod:4,built:2,cach:[0,1,2,13,14],calcul:2,call:[5,12],cardin:[2,4,5,9],cardinalit:[4,5],caridin:4,caridinalit:4,chang:[4,5],check:4,chi:2,chi_test:2,chi_test_alfa:2,child:[2,3],child_indx:2,child_states_numb:2,child_val:2,cim1:[2,7],cim2:[2,7],cim:[2,4,5,12],cim_equality_test:7,cims_kei:5,cims_label:7,classmethod:[7,8,9,10],clean_structure_edg:4,clear:[4,5],clear_concatenated_fram:5,clear_data_frame_list:5,clear_indexing_filtering_structur:4,clear_memori:4,climb:[2,3],coeffici:4,col:4,cols_filt:2,column:[2,4,5,12],columns_head:5,comb:4,combin:[4,5,9],combinatori:[4,9],common:2,complet:[2,4,5],complete_test:2,complete_trajectori:4,comput:[2,3,4,5,12],compute_cim_coeffici:4,compute_parameters_for_nod:[2,12],compute_row_delta_in_all_samples_fram:[5,12],compute_row_delta_sigle_samples_fram:5,compute_state_res_time_for_nod:2,compute_state_transitions_for_a_nod:2,compute_thumb_valu:2,concatanated_sampl:5,concaten:[4,5],concatenated_sampl:5,condit:4,conditional_intensity_matrix:[0,1,2,13,14],conditionalintensitymatrix:[2,4],consid:[2,4],constraint:2,constraint_based_optim:[0,1,13,14],constraintbasedoptim:3,construct:[4,5,12],conta:5,contain:[2,4,5,9],contains_edg:4,content:[13,14],convert:[2,5],copi:5,core:5,correct:[4,5],could:2,count:4,creat:[2,4,12],csv:12,csvimport:12,ctbn:2,ctpc:[2,3,12],ctpc_algorithm:[2,12],current:[2,3,5],cut:5,dafram:5,data:[2,3,4,5,13,14],datafram:[4,5,12],dataset:[3,4,5],dataset_id:[5,12],datfram:5,def:12,defin:5,definit:5,defualt:2,delta:[2,4,5],demonstr:12,describ:5,desir:[2,4],df_samples_list:5,dict:[5,12],dictionari:5,differ:5,differt:2,digraph:2,dimens:4,dir:12,direct:[2,4],directli:5,disabl:[2,3],disable_multiprocess:2,distribuit:2,doc:5,doubl:4,download:12,drop:12,duplic:4,dyn:12,each:[2,3,5],edg:[2,4,5,12],edges_list:4,end:5,entir:2,equal:4,equality_of_cims_of_nod:7,est:12,estim:[0,1,3,4,6,13,14],estimate_par:2,estimate_structur:2,estimated_cim:7,everi:[4,5],exam:12,exampl:[5,13,14],exclud:2,exctract:5,exist:5,exp_test_alfa:2,exponenti:2,expos:5,extend:12,extens:[2,5],extract:[4,5],fals:2,fam_score_calcul:[0,1,13,14],famscor:2,famscorecalcul:2,fast_init:[2,4,12],file:[2,5,12],file_path:[2,5,12],filepath:5,fill:[2,12],filter:[2,4],filter_cims_with_mask:4,find:[2,5],first:[2,12],fixtur:[7,8,9,10],follow:[4,5],form:4,format:12,formula:2,found:5,frame:5,from:[4,5,12],from_nod:5,gener:2,generate_possible_sub_sets_of_s:2,get:[2,5],get_cims_numb:4,get_fam_scor:2,get_node_id:4,get_node_indx:4,get_ordered_by_indx_set_of_par:4,get_parents_by_id:4,get_positional_node_indx:4,get_score_from_graph:2,get_states_numb:4,given:[2,4,5],glob:12,graph:[2,4,9,12],graph_struct:4,graphic:2,grid:[4,9],grpah:12,has:[5,12],has_edg:4,has_prior_net_structur:4,have:5,header:5,header_column:5,hill:[2,3],hill_climbing_search:[0,1,13,14],hillclimb:3,hold:[2,4],hook:[7,8,9,10],how:5,hyperparamet:2,hypothesi:2,identifi:[2,4,5],iff:2,implement:[3,5,13,14],import_data:[5,12],import_sampled_cim:5,import_structur:5,import_trajectori:5,import_vari:[5,12],improv:[2,3],includ:2,independ:2,independence_test:2,index:[2,4,5,12,13],indic:[2,4],indx:5,info:[4,12],inform:[3,4],init:12,initi:[2,4,5,12],inplac:12,insid:12,instal:[13,14],interest:4,interfac:3,intes:4,iter:[2,3],iterations_numb:[2,3],its:[2,3],join:12,json:[2,5,12],json_import:[0,1,13,14],jsonarrai:5,jsonimport:[5,12],keep:[2,3,5],kei:5,kind:2,knowledg:2,known:2,known_edg:2,label:[2,3,4,5],latest:12,lenght:[2,3],level:[2,5],likelihood:2,list:[2,3,4,5,12],list_of_column:4,list_of_edg:4,list_of_nod:4,load:5,loop:2,m_xu_suff_stat:2,m_xxu_suff_stat:2,main:12,margin:2,marginal_likelihood_q:2,marginal_likelihood_theta:2,mask:[4,9],mask_arr:4,matric:[2,4],matrix:[2,4,5,9,12],max_par:[2,3],maximum:[2,3],member:[4,5],mention:4,merg:5,method:[2,5,7,8,9,10],methodnam:[7,8,9,10],model:2,modul:[13,14],multipl:5,multiprocess:2,name:[2,4,5,12],ndarrai:[2,4,5],necessari:[2,4,5],nest:5,net:[2,3,4,5,12],net_graph:2,network:[2,4,5],network_graph:[0,1,2,13,14],networkgraph:[2,4,12],networkx:2,node:[2,3,4,5,9,12],node_id:[2,3,4,9],node_index:4,node_indx:[2,4],node_st:[4,9],node_states_numb:[4,9],nodes_index:4,nodes_indexes_arr:4,nodes_label:4,nodes_labels_list:4,nodes_numb:4,nodes_vals_arr:4,nodes_valu:[4,12],none:[2,3,4,5,7,9,10,12],normal:5,normalize_trajectori:5,number:[2,3,4],numpi:[2,4,5,9],obj:[10,12],object:[2,3,4,5,12],one:[4,5],one_iteration_of_ctpc_algorithm:2,one_level_norm:5,onli:5,oper:2,optim:[0,1,2,6,13,14],optimize_structur:3,option:[2,3],order:[2,5,10],origin:5,original_cols_numb:4,otherwis:[2,5],out:5,outer:[5,12],over:2,own:[13,14],p_comb:[4,9],p_indx:[4,9],p_val:9,p_valu:9,packag:[13,14],page:13,panda:[5,12],param:4,paramet:[2,3,4,5,9,13,14],parameters_estim:[0,1,13,14],parametersestim:[2,12],parent:[2,3,4,5],parent_indx:2,parent_label:2,parent_set:2,parent_set_v:2,parent_v:2,parent_valu:9,parents_cardin:4,parents_comb:5,parents_index:4,parents_indx:9,parents_label:[4,9],parents_states_numb:[4,9],parents_v:[4,9],parents_valu:[4,9],part:2,particular:[2,5],pass:12,path:[2,5,12],patienc:[2,3],peest:12,perform:2,pip:12,place:5,plot:2,png:2,posit:[4,5],possibl:[2,4],predict:3,prepar:5,present:[2,5],print:12,prior:[2,12],prior_net_structur:5,process:[2,3,4,5],processes_numb:2,properli:5,properti:[4,5],put:5,pyctbn:12,q_xx:4,rappres:4,raw:5,raw_data:5,read:[5,12],read_csv:12,read_csv_fil:12,read_fil:12,read_json_fil:5,real:[2,4,5,12],refer:[4,5],reject:2,rel:4,relat:5,releas:12,remain:5,remov:[2,4,5],remove_edg:4,remove_nod:4,repres:4,represent:2,res:4,resid:[2,4],result:[2,5,12],rtype:4,rule:[2,3],run:[7,8,9,10],runtest:[7,8,9,10],same:5,sampl:[4,5,12],sample_fram:[5,12],sample_import:[0,1,13,14],sample_path:[0,1,2,13,14],sampled_cim:7,sampleimport:5,samplepath:[2,4,12],samples_label:5,save:[2,12],save_plot_estimated_structure_graph:2,save_result:[2,12],scalar_index:2,scalar_indexes_struct:2,score:2,se1:12,search:[2,3,13],second:2,see:5,select:12,self:[2,5,12],sep:2,sep_set:2,set:[2,4,5,7,8,9,10],set_of_cim:[0,1,2,5,13,14],setofcim:[2,4,5,12],setupclass:[7,8,9,10],shift:[4,5],shifted_cols_head:5,show:2,signific:2,simbol:5,simpl:12,simpli:12,sinc:4,single_cim_xu_marginal_likelihood_q:2,single_cim_xu_marginal_likelihood_theta:2,single_internal_cim_xxu_marginal_likelihood_theta:2,size:[2,4],socim:5,sofc1:12,sorter:5,specif:[2,4,12],spuriou:2,spurious_edg:2,start:5,state:[2,4],state_res_tim:4,state_residence_tim:4,state_transition_matrix:4,statist:2,stop:[2,3],str:[2,3,4,5,12],string:[2,3,4,5],structur:[0,1,2,3,5,9,13,14],structure_constraint_based_estim:[0,1,13,14],structure_estim:[0,1,3,13,14],structure_estimation_exampl:12,structure_graph:[0,1,2,5,6,13,14],structure_label:5,structure_score_based_estim:[0,1,13,14],structureconstraintbasedestim:2,structureestim:[2,3,12],structurescorebasedestim:2,structut:4,style:2,submodul:[1,6,13,14],subpackag:[13,14],subset:2,suffici:2,suffuci:2,symbol:[4,5],synthet:5,t_xu_suff_stat:2,tabu:[2,3],tabu_length:[2,3],tabu_rules_dur:[2,3],tabu_search:[0,1,13,14],tabusearch:3,take:12,tar:12,task:[2,4],tau_xu:2,ternari:12,test:2,test_add_edg:9,test_add_nod:9,test_adjacency_matrix:7,test_buid_samplepath_no_concatenated_sampl:9,test_buid_samplepath_no_vari:9,test_build_cim:9,test_build_complete_graph:7,test_build_p_combs_structur:9,test_build_removable_edges_matrix:7,test_build_saplepath_no_prior_net_structur:9,test_build_sort:10,test_build_structur:9,test_build_structure_bad_sort:9,test_build_time_columns_filtering_structure_for_a_nod:9,test_build_time_scalar_indexing_structure_for_a_nod:9,test_build_trajectori:9,test_build_transition_columns_filtering_structur:9,test_build_transition_scalar_indexing_structure_for_a_nod:9,test_cach:6,test_child:2,test_cim:6,test_clear:10,test_clear_concatenated_fram:10,test_clear_data_frame_list:10,test_compute_cim_coeffici:9,test_compute_parameters_for_nod:7,test_compute_row_delta_in_all_fram:10,test_compute_row_delta_in_all_frames_not_init_sort:10,test_compute_row_delta_single_samples_fram:10,test_dataset_id:10,test_edges_oper:9,test_equ:9,test_fast_init:[7,9],test_file_path:10,test_filter_cims_with_mask:9,test_find:10,test_generate_possible_sub_sets_of_s:7,test_get_node_id:9,test_get_node_indx:9,test_get_ordered_by_indx_set_of_par:9,test_get_parents_by_id:9,test_get_positional_node_indx:9,test_get_states_numb:9,test_hill_climbing_search:6,test_import_data:10,test_import_sampled_cim:10,test_import_structur:10,test_import_vari:10,test_init:[7,9,10],test_init_not_filled_dataframs:9,test_init_not_initialized_import:9,test_json_import:6,test_networkgraph:6,test_normalize_trajectori:10,test_normalize_trajectories_wrong_indx:10,test_normalize_trajectories_wrong_kei:10,test_ord:10,test_par:2,test_parameters_estim:6,test_put:10,test_read_json_file_found:10,test_read_json_file_not_found:10,test_repr:9,test_sample_import:6,test_sample_path:6,test_save_plot_estimated_graph:7,test_save_result:7,test_setofcim:6,test_structur:[6,8],test_structure_1:7,test_structure_2:7,test_structure_3:[7,8],test_structure_constraint_based_estim:6,test_structure_estim:6,test_structure_monoprocesso:7,test_structure_score_based_estim:6,test_tabu_search:6,test_tim:7,test_trajectori:6,testcach:10,testcas:[7,8,9,10],testconditionalintensitymatrix:9,testhillclimbingsearch:8,testjsonimport:10,testnetworkgraph:9,testparametersestimatior:7,testsampleimport:10,testsamplepath:9,testsetofcim:9,teststructur:9,teststructureconstraintbasedestim:7,teststructureestim:7,teststructurescorebasedestim:7,testtabusearch:8,testtrajectori:9,tha:5,theta:2,thi:[2,4,5,12],three:12,threshold:2,thumb:2,thumb_threshold:2,thumb_valu:2,time:[2,4,5,12],time_filt:4,time_kei:5,time_scalar_indexing_strucur:4,timestamp:5,to_nod:5,tot_vars_count:[2,3],total:[2,4],total_variables_count:4,total_variables_numb:4,traj:5,trajecory_head:5,trajectori:[0,1,2,5,12,13,14],trajectories_kei:5,trajectory_list:5,trajectri:12,transit:[2,4,5],transition_filt:4,transition_matric:4,transition_scalar_indexing_structur:4,tri:5,tupl:4,tutori:5,two:2,type:[2,3,4,5,12],union:5,uniqu:5,unittest:[7,8,9,10],unus:4,usag:[13,14],use:[2,12],used:[2,3,4,5],using:[2,3,4,5],util:[0,1,4,6,13,14],valid:2,valu:[2,3,4,5,9,12],values_list:12,var_id:2,variabl:[2,3,4,5,12],variable_cardin:5,variable_cim_xu_marginal_likelihood_q:2,variable_cim_xu_marginal_likelihood_theta:2,variable_label:5,variables_kei:5,variables_label:5,vector:[2,4],want:12,when:2,where:5,which:[2,3,4,5],whl:12,who:2,without:[2,3],you:[2,5,12],your:[13,14]},titles:["PyCTBN package","PyCTBN.PyCTBN package","PyCTBN.PyCTBN.estimators package","PyCTBN.PyCTBN.optimizers package","PyCTBN.PyCTBN.structure_graph package","PyCTBN.PyCTBN.utility package","PyCTBN.tests package","PyCTBN.tests.estimators package","PyCTBN.tests.optimizers package","PyCTBN.tests.structure_graph package","PyCTBN.tests.utility package","basic_main module","Examples","Welcome to PyCTBN\u2019s documentation!","PyCTBN","setup module"],titleterms:{"import":12,abstract_import:5,basic_main:11,cach:5,conditional_intensity_matrix:4,constraint_based_optim:3,content:[0,1,2,3,4,5,6,7,8,9,10],data:12,document:13,estim:[2,7,12],exampl:12,fam_score_calcul:2,hill_climbing_search:3,implement:12,indic:13,instal:12,json_import:5,modul:[0,1,2,3,4,5,6,7,8,9,10,11,15],network_graph:4,optim:[3,8],own:12,packag:[0,1,2,3,4,5,6,7,8,9,10],paramet:12,parameters_estim:2,pyctbn:[0,1,2,3,4,5,6,7,8,9,10,13,14],sample_import:5,sample_path:4,set_of_cim:4,setup:15,structur:[4,12],structure_constraint_based_estim:2,structure_estim:2,structure_graph:[4,9],structure_score_based_estim:2,submodul:[0,2,3,4,5,7,8,9,10],subpackag:[0,1,6],tabl:13,tabu_search:3,test:[6,7,8,9,10],test_cach:10,test_cim:9,test_hill_climbing_search:8,test_json_import:10,test_networkgraph:9,test_parameters_estim:7,test_sample_import:10,test_sample_path:9,test_setofcim:9,test_structur:9,test_structure_constraint_based_estim:7,test_structure_estim:7,test_structure_score_based_estim:7,test_tabu_search:8,test_trajectori:9,trajectori:4,usag:12,util:[5,10],welcom:13,your:12}}) \ No newline at end of file diff --git a/docs/_sources/examples.rst.txt b/docs/_sources/examples.rst.txt index b1e07c5..5386451 100644 --- a/docs/_sources/examples.rst.txt +++ b/docs/_sources/examples.rst.txt @@ -3,9 +3,9 @@ Examples Installation/Usage ****************** -Download the release in .tar.gz or .whl format and simply use pip install to install it:: +Download the latest release in .tar.gz or .whl format and simply use pip install to install it:: - $pip install PyCTBN-1.0.tar.gz + $pip install PyCTBN-2.2.tar.gz Implementing your own data importer diff --git a/docs/examples.html b/docs/examples.html index 94a79a7..2755cf0 100644 --- a/docs/examples.html +++ b/docs/examples.html @@ -117,8 +117,8 @@

    Examples

    Installation/Usage

    -

    Download the release in .tar.gz or .whl format and simply use pip install to install it:

    -
    $pip install PyCTBN-1.0.tar.gz
    +

    Download the latest release in .tar.gz or .whl format and simply use pip install to install it:

    +
    $pip install PyCTBN-2.2.tar.gz
     
    diff --git a/docs/searchindex.js b/docs/searchindex.js index 7d0597c..22a6a83 100644 --- a/docs/searchindex.js +++ b/docs/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["PyCTBN","PyCTBN.PyCTBN","PyCTBN.PyCTBN.estimators","PyCTBN.PyCTBN.optimizers","PyCTBN.PyCTBN.structure_graph","PyCTBN.PyCTBN.utility","PyCTBN.tests","PyCTBN.tests.estimators","PyCTBN.tests.optimizers","PyCTBN.tests.structure_graph","PyCTBN.tests.utility","basic_main","examples","index","modules","setup"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["PyCTBN.rst","PyCTBN.PyCTBN.rst","PyCTBN.PyCTBN.estimators.rst","PyCTBN.PyCTBN.optimizers.rst","PyCTBN.PyCTBN.structure_graph.rst","PyCTBN.PyCTBN.utility.rst","PyCTBN.tests.rst","PyCTBN.tests.estimators.rst","PyCTBN.tests.optimizers.rst","PyCTBN.tests.structure_graph.rst","PyCTBN.tests.utility.rst","basic_main.rst","examples.rst","index.rst","modules.rst","setup.rst"],objects:{"":{PyCTBN:[0,0,0,"-"]},"PyCTBN.PyCTBN":{estimators:[2,0,0,"-"],optimizers:[3,0,0,"-"],structure_graph:[4,0,0,"-"],utility:[5,0,0,"-"]},"PyCTBN.PyCTBN.estimators":{fam_score_calculator:[2,0,0,"-"],parameters_estimator:[2,0,0,"-"],structure_constraint_based_estimator:[2,0,0,"-"],structure_estimator:[2,0,0,"-"],structure_score_based_estimator:[2,0,0,"-"]},"PyCTBN.PyCTBN.estimators.fam_score_calculator":{FamScoreCalculator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator":{get_fam_score:[2,2,1,""],marginal_likelihood_q:[2,2,1,""],marginal_likelihood_theta:[2,2,1,""],single_cim_xu_marginal_likelihood_q:[2,2,1,""],single_cim_xu_marginal_likelihood_theta:[2,2,1,""],single_internal_cim_xxu_marginal_likelihood_theta:[2,2,1,""],variable_cim_xu_marginal_likelihood_q:[2,2,1,""],variable_cim_xu_marginal_likelihood_theta:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator":{ParametersEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator":{compute_parameters_for_node:[2,2,1,""],compute_state_res_time_for_node:[2,2,1,""],compute_state_transitions_for_a_node:[2,2,1,""],fast_init:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator":{StructureConstraintBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator":{complete_test:[2,2,1,""],compute_thumb_value:[2,2,1,""],ctpc_algorithm:[2,2,1,""],estimate_structure:[2,2,1,""],independence_test:[2,2,1,""],one_iteration_of_CTPC_algorithm:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator":{StructureEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator":{adjacency_matrix:[2,2,1,""],build_complete_graph:[2,2,1,""],build_removable_edges_matrix:[2,2,1,""],estimate_structure:[2,2,1,""],generate_possible_sub_sets_of_size:[2,2,1,""],save_plot_estimated_structure_graph:[2,2,1,""],save_results:[2,2,1,""],spurious_edges:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator":{StructureScoreBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator":{estimate_parents:[2,2,1,""],estimate_structure:[2,2,1,""],get_score_from_graph:[2,2,1,""]},"PyCTBN.PyCTBN.optimizers":{constraint_based_optimizer:[3,0,0,"-"],hill_climbing_search:[3,0,0,"-"],optimizer:[3,0,0,"-"],tabu_search:[3,0,0,"-"]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer":{ConstraintBasedOptimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search":{HillClimbing:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search.HillClimbing":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer":{Optimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer.Optimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search":{TabuSearch:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search.TabuSearch":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.structure_graph":{conditional_intensity_matrix:[4,0,0,"-"],network_graph:[4,0,0,"-"],sample_path:[4,0,0,"-"],set_of_cims:[4,0,0,"-"],structure:[4,0,0,"-"],trajectory:[4,0,0,"-"]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix":{ConditionalIntensityMatrix:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix":{cim:[4,2,1,""],compute_cim_coefficients:[4,2,1,""],state_residence_times:[4,2,1,""],state_transition_matrix:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph":{NetworkGraph:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph":{add_edges:[4,2,1,""],add_nodes:[4,2,1,""],build_p_comb_structure_for_a_node:[4,2,1,""],build_time_columns_filtering_for_a_node:[4,2,1,""],build_time_scalar_indexing_structure_for_a_node:[4,2,1,""],build_transition_filtering_for_a_node:[4,2,1,""],build_transition_scalar_indexing_structure_for_a_node:[4,2,1,""],clear_indexing_filtering_structures:[4,2,1,""],edges:[4,2,1,""],fast_init:[4,2,1,""],get_node_indx:[4,2,1,""],get_ordered_by_indx_set_of_parents:[4,2,1,""],get_parents_by_id:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],has_edge:[4,2,1,""],nodes:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_values:[4,2,1,""],p_combs:[4,2,1,""],remove_edges:[4,2,1,""],remove_node:[4,2,1,""],time_filtering:[4,2,1,""],time_scalar_indexing_strucure:[4,2,1,""],transition_filtering:[4,2,1,""],transition_scalar_indexing_structure:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path":{SamplePath:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath":{build_structure:[4,2,1,""],build_trajectories:[4,2,1,""],clear_memory:[4,2,1,""],has_prior_net_structure:[4,2,1,""],structure:[4,2,1,""],total_variables_count:[4,2,1,""],trajectories:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims":{SetOfCims:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims":{actual_cims:[4,2,1,""],build_cims:[4,2,1,""],build_times_and_transitions_structures:[4,2,1,""],filter_cims_with_mask:[4,2,1,""],get_cims_number:[4,2,1,""],p_combs:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.structure":{Structure:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.structure.Structure":{add_edge:[4,2,1,""],clean_structure_edges:[4,2,1,""],contains_edge:[4,2,1,""],edges:[4,2,1,""],get_node_id:[4,2,1,""],get_node_indx:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_labels:[4,2,1,""],nodes_values:[4,2,1,""],remove_edge:[4,2,1,""],remove_node:[4,2,1,""],total_variables_number:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory":{Trajectory:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory":{complete_trajectory:[4,2,1,""],size:[4,2,1,""],times:[4,2,1,""],trajectory:[4,2,1,""]},"PyCTBN.PyCTBN.utility":{abstract_importer:[5,0,0,"-"],cache:[5,0,0,"-"],json_importer:[5,0,0,"-"],sample_importer:[5,0,0,"-"]},"PyCTBN.PyCTBN.utility.abstract_importer":{AbstractImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter":{build_list_of_samples_array:[5,2,1,""],build_sorter:[5,2,1,""],clear_concatenated_frame:[5,2,1,""],compute_row_delta_in_all_samples_frames:[5,2,1,""],compute_row_delta_sigle_samples_frame:[5,2,1,""],concatenated_samples:[5,2,1,""],dataset_id:[5,2,1,""],file_path:[5,2,1,""],sorter:[5,2,1,""],structure:[5,2,1,""],variables:[5,2,1,""]},"PyCTBN.PyCTBN.utility.cache":{Cache:[5,1,1,""]},"PyCTBN.PyCTBN.utility.cache.Cache":{clear:[5,2,1,""],find:[5,2,1,""],put:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_importer":{JsonImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_importer.JsonImporter":{build_sorter:[5,2,1,""],clear_data_frame_list:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""],import_sampled_cims:[5,2,1,""],import_structure:[5,2,1,""],import_trajectories:[5,2,1,""],import_variables:[5,2,1,""],normalize_trajectories:[5,2,1,""],one_level_normalizing:[5,2,1,""],read_json_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.sample_importer":{SampleImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.sample_importer.SampleImporter":{build_sorter:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""]},"PyCTBN.tests":{estimators:[7,0,0,"-"],optimizers:[8,0,0,"-"],structure_graph:[9,0,0,"-"],utility:[10,0,0,"-"]},"PyCTBN.tests.estimators":{test_parameters_estimator:[7,0,0,"-"],test_structure_constraint_based_estimator:[7,0,0,"-"],test_structure_estimator:[7,0,0,"-"],test_structure_score_based_estimator:[7,0,0,"-"]},"PyCTBN.tests.estimators.test_parameters_estimator":{TestParametersEstimatior:[7,1,1,""]},"PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior":{aux_import_sampled_cims:[7,2,1,""],cim_equality_test:[7,2,1,""],equality_of_cims_of_node:[7,2,1,""],setUpClass:[7,2,1,""],test_compute_parameters_for_node:[7,2,1,""],test_fast_init:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator":{TestStructureConstraintBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_estimator":{TestStructureEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator":{setUpClass:[7,2,1,""],test_adjacency_matrix:[7,2,1,""],test_build_complete_graph:[7,2,1,""],test_build_removable_edges_matrix:[7,2,1,""],test_generate_possible_sub_sets_of_size:[7,2,1,""],test_init:[7,2,1,""],test_save_plot_estimated_graph:[7,2,1,""],test_save_results:[7,2,1,""],test_time:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator":{TestStructureScoreBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""],test_structure_monoprocesso:[7,2,1,""]},"PyCTBN.tests.optimizers":{test_hill_climbing_search:[8,0,0,"-"],test_tabu_search:[8,0,0,"-"]},"PyCTBN.tests.optimizers.test_hill_climbing_search":{TestHillClimbingSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_hill_climbing_search.TestHillClimbingSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.optimizers.test_tabu_search":{TestTabuSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_tabu_search.TestTabuSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.structure_graph":{test_cim:[9,0,0,"-"],test_networkgraph:[9,0,0,"-"],test_sample_path:[9,0,0,"-"],test_setofcims:[9,0,0,"-"],test_structure:[9,0,0,"-"],test_trajectory:[9,0,0,"-"]},"PyCTBN.tests.structure_graph.test_cim":{TestConditionalIntensityMatrix:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix":{setUpClass:[9,2,1,""],test_compute_cim_coefficients:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph":{TestNetworkGraph:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph":{aux_build_p_combs_structure:[9,2,1,""],aux_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],aux_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],aux_build_transition_columns_filtering_structure:[9,2,1,""],aux_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_add_edges:[9,2,1,""],test_add_nodes:[9,2,1,""],test_build_p_combs_structure:[9,2,1,""],test_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],test_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],test_build_transition_columns_filtering_structure:[9,2,1,""],test_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],test_fast_init:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_ordered_by_indx_set_of_parents:[9,2,1,""],test_get_parents_by_id:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_sample_path":{TestSamplePath:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath":{setUpClass:[9,2,1,""],test_buid_samplepath_no_concatenated_samples:[9,2,1,""],test_buid_samplepath_no_variables:[9,2,1,""],test_build_saplepath_no_prior_net_structure:[9,2,1,""],test_build_structure:[9,2,1,""],test_build_structure_bad_sorter:[9,2,1,""],test_build_trajectories:[9,2,1,""],test_init:[9,2,1,""],test_init_not_filled_dataframse:[9,2,1,""],test_init_not_initialized_importer:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_setofcims":{TestSetOfCims:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims":{another_filtering_method:[9,2,1,""],aux_test_build_cims:[9,2,1,""],aux_test_init:[9,2,1,""],build_p_comb_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_build_cims:[9,2,1,""],test_filter_cims_with_mask:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_structure":{TestStructure:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_structure.TestStructure":{setUpClass:[9,2,1,""],test_edges_operations:[9,2,1,""],test_equality:[9,2,1,""],test_get_node_id:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_positional_node_indx:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectory":{TestTrajectory:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory":{setUpClass:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.utility":{test_cache:[10,0,0,"-"],test_json_importer:[10,0,0,"-"],test_sample_importer:[10,0,0,"-"]},"PyCTBN.tests.utility.test_cache":{TestCache:[10,1,1,""]},"PyCTBN.tests.utility.test_cache.TestCache":{test_clear:[10,2,1,""],test_find:[10,2,1,""],test_init:[10,2,1,""],test_put:[10,2,1,""]},"PyCTBN.tests.utility.test_json_importer":{TestJsonImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_json_importer.TestJsonImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_build_sorter:[10,2,1,""],test_clear_concatenated_frame:[10,2,1,""],test_clear_data_frame_list:[10,2,1,""],test_compute_row_delta_in_all_frames:[10,2,1,""],test_compute_row_delta_in_all_frames_not_init_sorter:[10,2,1,""],test_compute_row_delta_single_samples_frame:[10,2,1,""],test_dataset_id:[10,2,1,""],test_file_path:[10,2,1,""],test_import_data:[10,2,1,""],test_import_sampled_cims:[10,2,1,""],test_import_structure:[10,2,1,""],test_import_variables:[10,2,1,""],test_init:[10,2,1,""],test_normalize_trajectories:[10,2,1,""],test_normalize_trajectories_wrong_indx:[10,2,1,""],test_normalize_trajectories_wrong_key:[10,2,1,""],test_read_json_file_found:[10,2,1,""],test_read_json_file_not_found:[10,2,1,""]},"PyCTBN.tests.utility.test_sample_importer":{TestSampleImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_sample_importer.TestSampleImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_init:[10,2,1,""],test_order:[10,2,1,""]},PyCTBN:{PyCTBN:[1,0,0,"-"],tests:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"abstract":[2,3,4,5,12],"boolean":[2,4],"case":[7,8,9,10],"class":[2,3,4,5,7,8,9,10,12],"default":[2,3,5],"float":2,"function":2,"import":[4,5,13,14],"int":[2,3,4,5],"null":2,"return":[2,3,4,5,9,12],"static":[2,4],"super":12,"true":[2,12],"var":12,HAS:5,Has:[2,4],NOT:2,The:[2,4,5,12],Use:[2,12],__actual_cach:5,__init__:12,__list_of_sets_of_par:5,_actual_cim:4,_actual_trajectori:4,_aggregated_info_about_nodes_par:4,_array_indx:5,_cach:2,_cim:4,_complete_graph:2,_df_samples_list:[5,12],_df_structur:5,_df_variabl:[5,12],_file_path:12,_graph:[4,12],_import:4,_net_graph:2,_node:2,_node_id:4,_nodes_indx:2,_nodes_v:2,_p_combs_structur:4,_raw_data:5,_sample_path:2,_single_set_of_cim:2,_sorter:[5,12],_state_residence_tim:4,_structur:4,_structure_label:5,_time:4,_time_filt:4,_time_scalar_indexing_structur:4,_total_variables_count:4,_total_variables_numb:4,_trajectori:4,_transition_filt:4,_transition_matric:4,_transition_scalar_indexing_structur:4,_variables_label:5,abc:[3,5],about:[3,4],abstract_import:[0,1,4,13,14],abstractimport:[4,5,12],act:5,actual:[2,4],actual_cim:[4,12],add:[4,5],add_edg:4,add_nod:4,added:2,addit:2,adjac:[2,12],adjacency_matrix:[2,12],after:5,against:2,aggreg:4,algorithm:[2,3,12],all:[2,3,4,5,9,12],alpha_xu:2,alpha_xxu:2,alreadi:[5,12],also:[2,4],ani:[2,3],anoth:4,another_filtering_method:9,approach:2,arc:5,arrai:[2,4,5,12],assign:2,assum:2,automat:2,aux_build_p_combs_structur:9,aux_build_time_columns_filtering_structure_for_a_nod:9,aux_build_time_scalar_indexing_structure_for_a_nod:9,aux_build_transition_columns_filtering_structur:9,aux_build_transition_scalar_indexing_structure_for_a_nod:9,aux_import_sampled_cim:7,aux_test_build_cim:9,aux_test_init:9,axi:12,base:[2,3,4,5,7,8,9,10],bayesian:2,befor:[2,3,7,8,9,10],belong:2,best:2,between:5,bool:[2,4],both:[2,5],bound:4,build:[2,4,5,9,12],build_cim:4,build_complete_graph:2,build_list_of_samples_arrai:5,build_p_comb_structure_for_a_nod:[4,9],build_removable_edges_matrix:2,build_sort:[5,12],build_structur:[4,12],build_time_columns_filtering_for_a_nod:4,build_time_scalar_indexing_structure_for_a_nod:4,build_times_and_transitions_structur:4,build_trajectori:[4,12],build_transition_filtering_for_a_nod:4,build_transition_scalar_indexing_structure_for_a_nod:4,built:2,cach:[0,1,2,13,14],calcul:2,call:[5,12],cardin:[2,4,5,9],cardinalit:[4,5],caridin:4,caridinalit:4,chang:[4,5],check:4,chi:2,chi_test:2,chi_test_alfa:2,child:[2,3],child_indx:2,child_states_numb:2,child_val:2,cim1:[2,7],cim2:[2,7],cim:[2,4,5,12],cim_equality_test:7,cims_kei:5,cims_label:7,classmethod:[7,8,9,10],clean_structure_edg:4,clear:[4,5],clear_concatenated_fram:5,clear_data_frame_list:5,clear_indexing_filtering_structur:4,clear_memori:4,climb:[2,3],coeffici:4,col:4,cols_filt:2,column:[2,4,5,12],columns_head:5,comb:4,combin:[4,5,9],combinatori:[4,9],common:2,complet:[2,4,5],complete_test:2,complete_trajectori:4,comput:[2,3,4,5,12],compute_cim_coeffici:4,compute_parameters_for_nod:[2,12],compute_row_delta_in_all_samples_fram:[5,12],compute_row_delta_sigle_samples_fram:5,compute_state_res_time_for_nod:2,compute_state_transitions_for_a_nod:2,compute_thumb_valu:2,concatanated_sampl:5,concaten:[4,5],concatenated_sampl:5,condit:4,conditional_intensity_matrix:[0,1,2,13,14],conditionalintensitymatrix:[2,4],consid:[2,4],constraint:2,constraint_based_optim:[0,1,13,14],constraintbasedoptim:3,construct:[4,5,12],conta:5,contain:[2,4,5,9],contains_edg:4,content:[13,14],convert:[2,5],copi:5,core:5,correct:[4,5],could:2,count:4,creat:[2,4,12],csv:12,csvimport:12,ctbn:2,ctpc:[2,3,12],ctpc_algorithm:[2,12],current:[2,3,5],cut:5,dafram:5,data:[2,3,4,5,13,14],datafram:[4,5,12],dataset:[3,4,5],dataset_id:[5,12],datfram:5,def:12,defin:5,definit:5,defualt:2,delta:[2,4,5],demonstr:12,describ:5,desir:[2,4],df_samples_list:5,dict:[5,12],dictionari:5,differ:5,differt:2,digraph:2,dimens:4,dir:12,direct:[2,4],directli:5,disabl:[2,3],disable_multiprocess:2,distribuit:2,doc:5,doubl:4,download:12,drop:12,duplic:4,dyn:12,each:[2,3,5],edg:[2,4,5,12],edges_list:4,end:5,entir:2,equal:4,equality_of_cims_of_nod:7,est:12,estim:[0,1,3,4,6,13,14],estimate_par:2,estimate_structur:2,estimated_cim:7,everi:[4,5],exam:12,exampl:[5,13,14],exclud:2,exctract:5,exist:5,exp_test_alfa:2,exponenti:2,expos:5,extend:12,extens:[2,5],extract:[4,5],fals:2,fam_score_calcul:[0,1,13,14],famscor:2,famscorecalcul:2,fast_init:[2,4,12],file:[2,5,12],file_path:[2,5,12],filepath:5,fill:[2,12],filter:[2,4],filter_cims_with_mask:4,find:[2,5],first:[2,12],fixtur:[7,8,9,10],follow:[4,5],form:4,format:12,formula:2,found:5,frame:5,from:[4,5,12],from_nod:5,gener:2,generate_possible_sub_sets_of_s:2,get:[2,5],get_cims_numb:4,get_fam_scor:2,get_node_id:4,get_node_indx:4,get_ordered_by_indx_set_of_par:4,get_parents_by_id:4,get_positional_node_indx:4,get_score_from_graph:2,get_states_numb:4,given:[2,4,5],glob:12,graph:[2,4,9,12],graph_struct:4,graphic:2,grid:[4,9],grpah:12,has:[5,12],has_edg:4,has_prior_net_structur:4,have:5,header:5,header_column:5,hill:[2,3],hill_climbing_search:[0,1,13,14],hillclimb:3,hold:[2,4],hook:[7,8,9,10],how:5,hyperparamet:2,hypothesi:2,identifi:[2,4,5],iff:2,implement:[3,5,13,14],import_data:[5,12],import_sampled_cim:5,import_structur:5,import_trajectori:5,import_vari:[5,12],improv:[2,3],includ:2,independ:2,independence_test:2,index:[2,4,5,12,13],indic:[2,4],indx:5,info:[4,12],inform:[3,4],init:12,initi:[2,4,5,12],inplac:12,insid:12,instal:[13,14],interest:4,interfac:3,intes:4,iter:[2,3],iterations_numb:[2,3],its:[2,3],join:12,json:[2,5,12],json_import:[0,1,13,14],jsonarrai:5,jsonimport:[5,12],keep:[2,3,5],kei:5,kind:2,knowledg:2,known:2,known_edg:2,label:[2,3,4,5],lenght:[2,3],level:[2,5],likelihood:2,list:[2,3,4,5,12],list_of_column:4,list_of_edg:4,list_of_nod:4,load:5,loop:2,m_xu_suff_stat:2,m_xxu_suff_stat:2,main:12,margin:2,marginal_likelihood_q:2,marginal_likelihood_theta:2,mask:[4,9],mask_arr:4,matric:[2,4],matrix:[2,4,5,9,12],max_par:[2,3],maximum:[2,3],member:[4,5],mention:4,merg:5,method:[2,5,7,8,9,10],methodnam:[7,8,9,10],model:2,modul:[13,14],multipl:5,multiprocess:2,name:[2,4,5,12],ndarrai:[2,4,5],necessari:[2,4,5],nest:5,net:[2,3,4,5,12],net_graph:2,network:[2,4,5],network_graph:[0,1,2,13,14],networkgraph:[2,4,12],networkx:2,node:[2,3,4,5,9,12],node_id:[2,3,4,9],node_index:4,node_indx:[2,4],node_st:[4,9],node_states_numb:[4,9],nodes_index:4,nodes_indexes_arr:4,nodes_label:4,nodes_labels_list:4,nodes_numb:4,nodes_vals_arr:4,nodes_valu:[4,12],none:[2,3,4,5,7,9,10,12],normal:5,normalize_trajectori:5,number:[2,3,4],numpi:[2,4,5,9],obj:[10,12],object:[2,3,4,5,12],one:[4,5],one_iteration_of_ctpc_algorithm:2,one_level_norm:5,onli:5,oper:2,optim:[0,1,2,6,13,14],optimize_structur:3,option:[2,3],order:[2,5,10],origin:5,original_cols_numb:4,otherwis:[2,5],out:5,outer:[5,12],over:2,own:[13,14],p_comb:[4,9],p_indx:[4,9],p_val:9,p_valu:9,packag:[13,14],page:13,panda:[5,12],param:4,paramet:[2,3,4,5,9,13,14],parameters_estim:[0,1,13,14],parametersestim:[2,12],parent:[2,3,4,5],parent_indx:2,parent_label:2,parent_set:2,parent_set_v:2,parent_v:2,parent_valu:9,parents_cardin:4,parents_comb:5,parents_index:4,parents_indx:9,parents_label:[4,9],parents_states_numb:[4,9],parents_v:[4,9],parents_valu:[4,9],part:2,particular:[2,5],pass:12,path:[2,5,12],patienc:[2,3],peest:12,perform:2,pip:12,place:5,plot:2,png:2,posit:[4,5],possibl:[2,4],predict:3,prepar:5,present:[2,5],print:12,prior:[2,12],prior_net_structur:5,process:[2,3,4,5],processes_numb:2,properli:5,properti:[4,5],put:5,pyctbn:12,q_xx:4,rappres:4,raw:5,raw_data:5,read:[5,12],read_csv:12,read_csv_fil:12,read_fil:12,read_json_fil:5,real:[2,4,5,12],refer:[4,5],reject:2,rel:4,relat:5,releas:12,remain:5,remov:[2,4,5],remove_edg:4,remove_nod:4,repres:4,represent:2,res:4,resid:[2,4],result:[2,5,12],rtype:4,rule:[2,3],run:[7,8,9,10],runtest:[7,8,9,10],same:5,sampl:[4,5,12],sample_fram:[5,12],sample_import:[0,1,13,14],sample_path:[0,1,2,13,14],sampled_cim:7,sampleimport:5,samplepath:[2,4,12],samples_label:5,save:[2,12],save_plot_estimated_structure_graph:2,save_result:[2,12],scalar_index:2,scalar_indexes_struct:2,score:2,se1:12,search:[2,3,13],second:2,see:5,select:12,self:[2,5,12],sep:2,sep_set:2,set:[2,4,5,7,8,9,10],set_of_cim:[0,1,2,5,13,14],setofcim:[2,4,5,12],setupclass:[7,8,9,10],shift:[4,5],shifted_cols_head:5,show:2,signific:2,simbol:5,simpl:12,simpli:12,sinc:4,single_cim_xu_marginal_likelihood_q:2,single_cim_xu_marginal_likelihood_theta:2,single_internal_cim_xxu_marginal_likelihood_theta:2,size:[2,4],socim:5,sofc1:12,sorter:5,specif:[2,4,12],spuriou:2,spurious_edg:2,start:5,state:[2,4],state_res_tim:4,state_residence_tim:4,state_transition_matrix:4,statist:2,stop:[2,3],str:[2,3,4,5,12],string:[2,3,4,5],structur:[0,1,2,3,5,9,13,14],structure_constraint_based_estim:[0,1,13,14],structure_estim:[0,1,3,13,14],structure_estimation_exampl:12,structure_graph:[0,1,2,5,6,13,14],structure_label:5,structure_score_based_estim:[0,1,13,14],structureconstraintbasedestim:2,structureestim:[2,3,12],structurescorebasedestim:2,structut:4,style:2,submodul:[1,6,13,14],subpackag:[13,14],subset:2,suffici:2,suffuci:2,symbol:[4,5],synthet:5,t_xu_suff_stat:2,tabu:[2,3],tabu_length:[2,3],tabu_rules_dur:[2,3],tabu_search:[0,1,13,14],tabusearch:3,take:12,tar:12,task:[2,4],tau_xu:2,ternari:12,test:2,test_add_edg:9,test_add_nod:9,test_adjacency_matrix:7,test_buid_samplepath_no_concatenated_sampl:9,test_buid_samplepath_no_vari:9,test_build_cim:9,test_build_complete_graph:7,test_build_p_combs_structur:9,test_build_removable_edges_matrix:7,test_build_saplepath_no_prior_net_structur:9,test_build_sort:10,test_build_structur:9,test_build_structure_bad_sort:9,test_build_time_columns_filtering_structure_for_a_nod:9,test_build_time_scalar_indexing_structure_for_a_nod:9,test_build_trajectori:9,test_build_transition_columns_filtering_structur:9,test_build_transition_scalar_indexing_structure_for_a_nod:9,test_cach:6,test_child:2,test_cim:6,test_clear:10,test_clear_concatenated_fram:10,test_clear_data_frame_list:10,test_compute_cim_coeffici:9,test_compute_parameters_for_nod:7,test_compute_row_delta_in_all_fram:10,test_compute_row_delta_in_all_frames_not_init_sort:10,test_compute_row_delta_single_samples_fram:10,test_dataset_id:10,test_edges_oper:9,test_equ:9,test_fast_init:[7,9],test_file_path:10,test_filter_cims_with_mask:9,test_find:10,test_generate_possible_sub_sets_of_s:7,test_get_node_id:9,test_get_node_indx:9,test_get_ordered_by_indx_set_of_par:9,test_get_parents_by_id:9,test_get_positional_node_indx:9,test_get_states_numb:9,test_hill_climbing_search:6,test_import_data:10,test_import_sampled_cim:10,test_import_structur:10,test_import_vari:10,test_init:[7,9,10],test_init_not_filled_dataframs:9,test_init_not_initialized_import:9,test_json_import:6,test_networkgraph:6,test_normalize_trajectori:10,test_normalize_trajectories_wrong_indx:10,test_normalize_trajectories_wrong_kei:10,test_ord:10,test_par:2,test_parameters_estim:6,test_put:10,test_read_json_file_found:10,test_read_json_file_not_found:10,test_repr:9,test_sample_import:6,test_sample_path:6,test_save_plot_estimated_graph:7,test_save_result:7,test_setofcim:6,test_structur:[6,8],test_structure_1:7,test_structure_2:7,test_structure_3:[7,8],test_structure_constraint_based_estim:6,test_structure_estim:6,test_structure_monoprocesso:7,test_structure_score_based_estim:6,test_tabu_search:6,test_tim:7,test_trajectori:6,testcach:10,testcas:[7,8,9,10],testconditionalintensitymatrix:9,testhillclimbingsearch:8,testjsonimport:10,testnetworkgraph:9,testparametersestimatior:7,testsampleimport:10,testsamplepath:9,testsetofcim:9,teststructur:9,teststructureconstraintbasedestim:7,teststructureestim:7,teststructurescorebasedestim:7,testtabusearch:8,testtrajectori:9,tha:5,theta:2,thi:[2,4,5,12],three:12,threshold:2,thumb:2,thumb_threshold:2,thumb_valu:2,time:[2,4,5,12],time_filt:4,time_kei:5,time_scalar_indexing_strucur:4,timestamp:5,to_nod:5,tot_vars_count:[2,3],total:[2,4],total_variables_count:4,total_variables_numb:4,traj:5,trajecory_head:5,trajectori:[0,1,2,5,12,13,14],trajectories_kei:5,trajectory_list:5,trajectri:12,transit:[2,4,5],transition_filt:4,transition_matric:4,transition_scalar_indexing_structur:4,tri:5,tupl:4,tutori:5,two:2,type:[2,3,4,5,12],union:5,uniqu:5,unittest:[7,8,9,10],unus:4,usag:[13,14],use:[2,12],used:[2,3,4,5],using:[2,3,4,5],util:[0,1,4,6,13,14],valid:2,valu:[2,3,4,5,9,12],values_list:12,var_id:2,variabl:[2,3,4,5,12],variable_cardin:5,variable_cim_xu_marginal_likelihood_q:2,variable_cim_xu_marginal_likelihood_theta:2,variable_label:5,variables_kei:5,variables_label:5,vector:[2,4],want:12,when:2,where:5,which:[2,3,4,5],whl:12,who:2,without:[2,3],you:[2,5,12],your:[13,14]},titles:["PyCTBN package","PyCTBN.PyCTBN package","PyCTBN.PyCTBN.estimators package","PyCTBN.PyCTBN.optimizers package","PyCTBN.PyCTBN.structure_graph package","PyCTBN.PyCTBN.utility package","PyCTBN.tests package","PyCTBN.tests.estimators package","PyCTBN.tests.optimizers package","PyCTBN.tests.structure_graph package","PyCTBN.tests.utility package","basic_main module","Examples","Welcome to PyCTBN\u2019s documentation!","PyCTBN","setup module"],titleterms:{"import":12,abstract_import:5,basic_main:11,cach:5,conditional_intensity_matrix:4,constraint_based_optim:3,content:[0,1,2,3,4,5,6,7,8,9,10],data:12,document:13,estim:[2,7,12],exampl:12,fam_score_calcul:2,hill_climbing_search:3,implement:12,indic:13,instal:12,json_import:5,modul:[0,1,2,3,4,5,6,7,8,9,10,11,15],network_graph:4,optim:[3,8],own:12,packag:[0,1,2,3,4,5,6,7,8,9,10],paramet:12,parameters_estim:2,pyctbn:[0,1,2,3,4,5,6,7,8,9,10,13,14],sample_import:5,sample_path:4,set_of_cim:4,setup:15,structur:[4,12],structure_constraint_based_estim:2,structure_estim:2,structure_graph:[4,9],structure_score_based_estim:2,submodul:[0,2,3,4,5,7,8,9,10],subpackag:[0,1,6],tabl:13,tabu_search:3,test:[6,7,8,9,10],test_cach:10,test_cim:9,test_hill_climbing_search:8,test_json_import:10,test_networkgraph:9,test_parameters_estim:7,test_sample_import:10,test_sample_path:9,test_setofcim:9,test_structur:9,test_structure_constraint_based_estim:7,test_structure_estim:7,test_structure_score_based_estim:7,test_tabu_search:8,test_trajectori:9,trajectori:4,usag:12,util:[5,10],welcom:13,your:12}}) \ No newline at end of file +Search.setIndex({docnames:["PyCTBN","PyCTBN.PyCTBN","PyCTBN.PyCTBN.estimators","PyCTBN.PyCTBN.optimizers","PyCTBN.PyCTBN.structure_graph","PyCTBN.PyCTBN.utility","PyCTBN.tests","PyCTBN.tests.estimators","PyCTBN.tests.optimizers","PyCTBN.tests.structure_graph","PyCTBN.tests.utility","basic_main","examples","index","modules","setup"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["PyCTBN.rst","PyCTBN.PyCTBN.rst","PyCTBN.PyCTBN.estimators.rst","PyCTBN.PyCTBN.optimizers.rst","PyCTBN.PyCTBN.structure_graph.rst","PyCTBN.PyCTBN.utility.rst","PyCTBN.tests.rst","PyCTBN.tests.estimators.rst","PyCTBN.tests.optimizers.rst","PyCTBN.tests.structure_graph.rst","PyCTBN.tests.utility.rst","basic_main.rst","examples.rst","index.rst","modules.rst","setup.rst"],objects:{"":{PyCTBN:[0,0,0,"-"]},"PyCTBN.PyCTBN":{estimators:[2,0,0,"-"],optimizers:[3,0,0,"-"],structure_graph:[4,0,0,"-"],utility:[5,0,0,"-"]},"PyCTBN.PyCTBN.estimators":{fam_score_calculator:[2,0,0,"-"],parameters_estimator:[2,0,0,"-"],structure_constraint_based_estimator:[2,0,0,"-"],structure_estimator:[2,0,0,"-"],structure_score_based_estimator:[2,0,0,"-"]},"PyCTBN.PyCTBN.estimators.fam_score_calculator":{FamScoreCalculator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator":{get_fam_score:[2,2,1,""],marginal_likelihood_q:[2,2,1,""],marginal_likelihood_theta:[2,2,1,""],single_cim_xu_marginal_likelihood_q:[2,2,1,""],single_cim_xu_marginal_likelihood_theta:[2,2,1,""],single_internal_cim_xxu_marginal_likelihood_theta:[2,2,1,""],variable_cim_xu_marginal_likelihood_q:[2,2,1,""],variable_cim_xu_marginal_likelihood_theta:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator":{ParametersEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator":{compute_parameters_for_node:[2,2,1,""],compute_state_res_time_for_node:[2,2,1,""],compute_state_transitions_for_a_node:[2,2,1,""],fast_init:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator":{StructureConstraintBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator":{complete_test:[2,2,1,""],compute_thumb_value:[2,2,1,""],ctpc_algorithm:[2,2,1,""],estimate_structure:[2,2,1,""],independence_test:[2,2,1,""],one_iteration_of_CTPC_algorithm:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator":{StructureEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator":{adjacency_matrix:[2,2,1,""],build_complete_graph:[2,2,1,""],build_removable_edges_matrix:[2,2,1,""],estimate_structure:[2,2,1,""],generate_possible_sub_sets_of_size:[2,2,1,""],save_plot_estimated_structure_graph:[2,2,1,""],save_results:[2,2,1,""],spurious_edges:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator":{StructureScoreBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator":{estimate_parents:[2,2,1,""],estimate_structure:[2,2,1,""],get_score_from_graph:[2,2,1,""]},"PyCTBN.PyCTBN.optimizers":{constraint_based_optimizer:[3,0,0,"-"],hill_climbing_search:[3,0,0,"-"],optimizer:[3,0,0,"-"],tabu_search:[3,0,0,"-"]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer":{ConstraintBasedOptimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search":{HillClimbing:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search.HillClimbing":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer":{Optimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer.Optimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search":{TabuSearch:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search.TabuSearch":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.structure_graph":{conditional_intensity_matrix:[4,0,0,"-"],network_graph:[4,0,0,"-"],sample_path:[4,0,0,"-"],set_of_cims:[4,0,0,"-"],structure:[4,0,0,"-"],trajectory:[4,0,0,"-"]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix":{ConditionalIntensityMatrix:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix":{cim:[4,2,1,""],compute_cim_coefficients:[4,2,1,""],state_residence_times:[4,2,1,""],state_transition_matrix:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph":{NetworkGraph:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph":{add_edges:[4,2,1,""],add_nodes:[4,2,1,""],build_p_comb_structure_for_a_node:[4,2,1,""],build_time_columns_filtering_for_a_node:[4,2,1,""],build_time_scalar_indexing_structure_for_a_node:[4,2,1,""],build_transition_filtering_for_a_node:[4,2,1,""],build_transition_scalar_indexing_structure_for_a_node:[4,2,1,""],clear_indexing_filtering_structures:[4,2,1,""],edges:[4,2,1,""],fast_init:[4,2,1,""],get_node_indx:[4,2,1,""],get_ordered_by_indx_set_of_parents:[4,2,1,""],get_parents_by_id:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],has_edge:[4,2,1,""],nodes:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_values:[4,2,1,""],p_combs:[4,2,1,""],remove_edges:[4,2,1,""],remove_node:[4,2,1,""],time_filtering:[4,2,1,""],time_scalar_indexing_strucure:[4,2,1,""],transition_filtering:[4,2,1,""],transition_scalar_indexing_structure:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path":{SamplePath:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath":{build_structure:[4,2,1,""],build_trajectories:[4,2,1,""],clear_memory:[4,2,1,""],has_prior_net_structure:[4,2,1,""],structure:[4,2,1,""],total_variables_count:[4,2,1,""],trajectories:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims":{SetOfCims:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims":{actual_cims:[4,2,1,""],build_cims:[4,2,1,""],build_times_and_transitions_structures:[4,2,1,""],filter_cims_with_mask:[4,2,1,""],get_cims_number:[4,2,1,""],p_combs:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.structure":{Structure:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.structure.Structure":{add_edge:[4,2,1,""],clean_structure_edges:[4,2,1,""],contains_edge:[4,2,1,""],edges:[4,2,1,""],get_node_id:[4,2,1,""],get_node_indx:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_labels:[4,2,1,""],nodes_values:[4,2,1,""],remove_edge:[4,2,1,""],remove_node:[4,2,1,""],total_variables_number:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory":{Trajectory:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory":{complete_trajectory:[4,2,1,""],size:[4,2,1,""],times:[4,2,1,""],trajectory:[4,2,1,""]},"PyCTBN.PyCTBN.utility":{abstract_importer:[5,0,0,"-"],cache:[5,0,0,"-"],json_importer:[5,0,0,"-"],sample_importer:[5,0,0,"-"]},"PyCTBN.PyCTBN.utility.abstract_importer":{AbstractImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter":{build_list_of_samples_array:[5,2,1,""],build_sorter:[5,2,1,""],clear_concatenated_frame:[5,2,1,""],compute_row_delta_in_all_samples_frames:[5,2,1,""],compute_row_delta_sigle_samples_frame:[5,2,1,""],concatenated_samples:[5,2,1,""],dataset_id:[5,2,1,""],file_path:[5,2,1,""],sorter:[5,2,1,""],structure:[5,2,1,""],variables:[5,2,1,""]},"PyCTBN.PyCTBN.utility.cache":{Cache:[5,1,1,""]},"PyCTBN.PyCTBN.utility.cache.Cache":{clear:[5,2,1,""],find:[5,2,1,""],put:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_importer":{JsonImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_importer.JsonImporter":{build_sorter:[5,2,1,""],clear_data_frame_list:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""],import_sampled_cims:[5,2,1,""],import_structure:[5,2,1,""],import_trajectories:[5,2,1,""],import_variables:[5,2,1,""],normalize_trajectories:[5,2,1,""],one_level_normalizing:[5,2,1,""],read_json_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.sample_importer":{SampleImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.sample_importer.SampleImporter":{build_sorter:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""]},"PyCTBN.tests":{estimators:[7,0,0,"-"],optimizers:[8,0,0,"-"],structure_graph:[9,0,0,"-"],utility:[10,0,0,"-"]},"PyCTBN.tests.estimators":{test_parameters_estimator:[7,0,0,"-"],test_structure_constraint_based_estimator:[7,0,0,"-"],test_structure_estimator:[7,0,0,"-"],test_structure_score_based_estimator:[7,0,0,"-"]},"PyCTBN.tests.estimators.test_parameters_estimator":{TestParametersEstimatior:[7,1,1,""]},"PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior":{aux_import_sampled_cims:[7,2,1,""],cim_equality_test:[7,2,1,""],equality_of_cims_of_node:[7,2,1,""],setUpClass:[7,2,1,""],test_compute_parameters_for_node:[7,2,1,""],test_fast_init:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator":{TestStructureConstraintBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_estimator":{TestStructureEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator":{setUpClass:[7,2,1,""],test_adjacency_matrix:[7,2,1,""],test_build_complete_graph:[7,2,1,""],test_build_removable_edges_matrix:[7,2,1,""],test_generate_possible_sub_sets_of_size:[7,2,1,""],test_init:[7,2,1,""],test_save_plot_estimated_graph:[7,2,1,""],test_save_results:[7,2,1,""],test_time:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator":{TestStructureScoreBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""],test_structure_monoprocesso:[7,2,1,""]},"PyCTBN.tests.optimizers":{test_hill_climbing_search:[8,0,0,"-"],test_tabu_search:[8,0,0,"-"]},"PyCTBN.tests.optimizers.test_hill_climbing_search":{TestHillClimbingSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_hill_climbing_search.TestHillClimbingSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.optimizers.test_tabu_search":{TestTabuSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_tabu_search.TestTabuSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.structure_graph":{test_cim:[9,0,0,"-"],test_networkgraph:[9,0,0,"-"],test_sample_path:[9,0,0,"-"],test_setofcims:[9,0,0,"-"],test_structure:[9,0,0,"-"],test_trajectory:[9,0,0,"-"]},"PyCTBN.tests.structure_graph.test_cim":{TestConditionalIntensityMatrix:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix":{setUpClass:[9,2,1,""],test_compute_cim_coefficients:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph":{TestNetworkGraph:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph":{aux_build_p_combs_structure:[9,2,1,""],aux_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],aux_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],aux_build_transition_columns_filtering_structure:[9,2,1,""],aux_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_add_edges:[9,2,1,""],test_add_nodes:[9,2,1,""],test_build_p_combs_structure:[9,2,1,""],test_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],test_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],test_build_transition_columns_filtering_structure:[9,2,1,""],test_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],test_fast_init:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_ordered_by_indx_set_of_parents:[9,2,1,""],test_get_parents_by_id:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_sample_path":{TestSamplePath:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath":{setUpClass:[9,2,1,""],test_buid_samplepath_no_concatenated_samples:[9,2,1,""],test_buid_samplepath_no_variables:[9,2,1,""],test_build_saplepath_no_prior_net_structure:[9,2,1,""],test_build_structure:[9,2,1,""],test_build_structure_bad_sorter:[9,2,1,""],test_build_trajectories:[9,2,1,""],test_init:[9,2,1,""],test_init_not_filled_dataframse:[9,2,1,""],test_init_not_initialized_importer:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_setofcims":{TestSetOfCims:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims":{another_filtering_method:[9,2,1,""],aux_test_build_cims:[9,2,1,""],aux_test_init:[9,2,1,""],build_p_comb_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_build_cims:[9,2,1,""],test_filter_cims_with_mask:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_structure":{TestStructure:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_structure.TestStructure":{setUpClass:[9,2,1,""],test_edges_operations:[9,2,1,""],test_equality:[9,2,1,""],test_get_node_id:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_positional_node_indx:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectory":{TestTrajectory:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory":{setUpClass:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.utility":{test_cache:[10,0,0,"-"],test_json_importer:[10,0,0,"-"],test_sample_importer:[10,0,0,"-"]},"PyCTBN.tests.utility.test_cache":{TestCache:[10,1,1,""]},"PyCTBN.tests.utility.test_cache.TestCache":{test_clear:[10,2,1,""],test_find:[10,2,1,""],test_init:[10,2,1,""],test_put:[10,2,1,""]},"PyCTBN.tests.utility.test_json_importer":{TestJsonImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_json_importer.TestJsonImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_build_sorter:[10,2,1,""],test_clear_concatenated_frame:[10,2,1,""],test_clear_data_frame_list:[10,2,1,""],test_compute_row_delta_in_all_frames:[10,2,1,""],test_compute_row_delta_in_all_frames_not_init_sorter:[10,2,1,""],test_compute_row_delta_single_samples_frame:[10,2,1,""],test_dataset_id:[10,2,1,""],test_file_path:[10,2,1,""],test_import_data:[10,2,1,""],test_import_sampled_cims:[10,2,1,""],test_import_structure:[10,2,1,""],test_import_variables:[10,2,1,""],test_init:[10,2,1,""],test_normalize_trajectories:[10,2,1,""],test_normalize_trajectories_wrong_indx:[10,2,1,""],test_normalize_trajectories_wrong_key:[10,2,1,""],test_read_json_file_found:[10,2,1,""],test_read_json_file_not_found:[10,2,1,""]},"PyCTBN.tests.utility.test_sample_importer":{TestSampleImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_sample_importer.TestSampleImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_init:[10,2,1,""],test_order:[10,2,1,""]},PyCTBN:{PyCTBN:[1,0,0,"-"],tests:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"abstract":[2,3,4,5,12],"boolean":[2,4],"case":[7,8,9,10],"class":[2,3,4,5,7,8,9,10,12],"default":[2,3,5],"float":2,"function":2,"import":[4,5,13,14],"int":[2,3,4,5],"null":2,"return":[2,3,4,5,9,12],"static":[2,4],"super":12,"true":[2,12],"var":12,HAS:5,Has:[2,4],NOT:2,The:[2,4,5,12],Use:[2,12],__actual_cach:5,__init__:12,__list_of_sets_of_par:5,_actual_cim:4,_actual_trajectori:4,_aggregated_info_about_nodes_par:4,_array_indx:5,_cach:2,_cim:4,_complete_graph:2,_df_samples_list:[5,12],_df_structur:5,_df_variabl:[5,12],_file_path:12,_graph:[4,12],_import:4,_net_graph:2,_node:2,_node_id:4,_nodes_indx:2,_nodes_v:2,_p_combs_structur:4,_raw_data:5,_sample_path:2,_single_set_of_cim:2,_sorter:[5,12],_state_residence_tim:4,_structur:4,_structure_label:5,_time:4,_time_filt:4,_time_scalar_indexing_structur:4,_total_variables_count:4,_total_variables_numb:4,_trajectori:4,_transition_filt:4,_transition_matric:4,_transition_scalar_indexing_structur:4,_variables_label:5,abc:[3,5],about:[3,4],abstract_import:[0,1,4,13,14],abstractimport:[4,5,12],act:5,actual:[2,4],actual_cim:[4,12],add:[4,5],add_edg:4,add_nod:4,added:2,addit:2,adjac:[2,12],adjacency_matrix:[2,12],after:5,against:2,aggreg:4,algorithm:[2,3,12],all:[2,3,4,5,9,12],alpha_xu:2,alpha_xxu:2,alreadi:[5,12],also:[2,4],ani:[2,3],anoth:4,another_filtering_method:9,approach:2,arc:5,arrai:[2,4,5,12],assign:2,assum:2,automat:2,aux_build_p_combs_structur:9,aux_build_time_columns_filtering_structure_for_a_nod:9,aux_build_time_scalar_indexing_structure_for_a_nod:9,aux_build_transition_columns_filtering_structur:9,aux_build_transition_scalar_indexing_structure_for_a_nod:9,aux_import_sampled_cim:7,aux_test_build_cim:9,aux_test_init:9,axi:12,base:[2,3,4,5,7,8,9,10],bayesian:2,befor:[2,3,7,8,9,10],belong:2,best:2,between:5,bool:[2,4],both:[2,5],bound:4,build:[2,4,5,9,12],build_cim:4,build_complete_graph:2,build_list_of_samples_arrai:5,build_p_comb_structure_for_a_nod:[4,9],build_removable_edges_matrix:2,build_sort:[5,12],build_structur:[4,12],build_time_columns_filtering_for_a_nod:4,build_time_scalar_indexing_structure_for_a_nod:4,build_times_and_transitions_structur:4,build_trajectori:[4,12],build_transition_filtering_for_a_nod:4,build_transition_scalar_indexing_structure_for_a_nod:4,built:2,cach:[0,1,2,13,14],calcul:2,call:[5,12],cardin:[2,4,5,9],cardinalit:[4,5],caridin:4,caridinalit:4,chang:[4,5],check:4,chi:2,chi_test:2,chi_test_alfa:2,child:[2,3],child_indx:2,child_states_numb:2,child_val:2,cim1:[2,7],cim2:[2,7],cim:[2,4,5,12],cim_equality_test:7,cims_kei:5,cims_label:7,classmethod:[7,8,9,10],clean_structure_edg:4,clear:[4,5],clear_concatenated_fram:5,clear_data_frame_list:5,clear_indexing_filtering_structur:4,clear_memori:4,climb:[2,3],coeffici:4,col:4,cols_filt:2,column:[2,4,5,12],columns_head:5,comb:4,combin:[4,5,9],combinatori:[4,9],common:2,complet:[2,4,5],complete_test:2,complete_trajectori:4,comput:[2,3,4,5,12],compute_cim_coeffici:4,compute_parameters_for_nod:[2,12],compute_row_delta_in_all_samples_fram:[5,12],compute_row_delta_sigle_samples_fram:5,compute_state_res_time_for_nod:2,compute_state_transitions_for_a_nod:2,compute_thumb_valu:2,concatanated_sampl:5,concaten:[4,5],concatenated_sampl:5,condit:4,conditional_intensity_matrix:[0,1,2,13,14],conditionalintensitymatrix:[2,4],consid:[2,4],constraint:2,constraint_based_optim:[0,1,13,14],constraintbasedoptim:3,construct:[4,5,12],conta:5,contain:[2,4,5,9],contains_edg:4,content:[13,14],convert:[2,5],copi:5,core:5,correct:[4,5],could:2,count:4,creat:[2,4,12],csv:12,csvimport:12,ctbn:2,ctpc:[2,3,12],ctpc_algorithm:[2,12],current:[2,3,5],cut:5,dafram:5,data:[2,3,4,5,13,14],datafram:[4,5,12],dataset:[3,4,5],dataset_id:[5,12],datfram:5,def:12,defin:5,definit:5,defualt:2,delta:[2,4,5],demonstr:12,describ:5,desir:[2,4],df_samples_list:5,dict:[5,12],dictionari:5,differ:5,differt:2,digraph:2,dimens:4,dir:12,direct:[2,4],directli:5,disabl:[2,3],disable_multiprocess:2,distribuit:2,doc:5,doubl:4,download:12,drop:12,duplic:4,dyn:12,each:[2,3,5],edg:[2,4,5,12],edges_list:4,end:5,entir:2,equal:4,equality_of_cims_of_nod:7,est:12,estim:[0,1,3,4,6,13,14],estimate_par:2,estimate_structur:2,estimated_cim:7,everi:[4,5],exam:12,exampl:[5,13,14],exclud:2,exctract:5,exist:5,exp_test_alfa:2,exponenti:2,expos:5,extend:12,extens:[2,5],extract:[4,5],fals:2,fam_score_calcul:[0,1,13,14],famscor:2,famscorecalcul:2,fast_init:[2,4,12],file:[2,5,12],file_path:[2,5,12],filepath:5,fill:[2,12],filter:[2,4],filter_cims_with_mask:4,find:[2,5],first:[2,12],fixtur:[7,8,9,10],follow:[4,5],form:4,format:12,formula:2,found:5,frame:5,from:[4,5,12],from_nod:5,gener:2,generate_possible_sub_sets_of_s:2,get:[2,5],get_cims_numb:4,get_fam_scor:2,get_node_id:4,get_node_indx:4,get_ordered_by_indx_set_of_par:4,get_parents_by_id:4,get_positional_node_indx:4,get_score_from_graph:2,get_states_numb:4,given:[2,4,5],glob:12,graph:[2,4,9,12],graph_struct:4,graphic:2,grid:[4,9],grpah:12,has:[5,12],has_edg:4,has_prior_net_structur:4,have:5,header:5,header_column:5,hill:[2,3],hill_climbing_search:[0,1,13,14],hillclimb:3,hold:[2,4],hook:[7,8,9,10],how:5,hyperparamet:2,hypothesi:2,identifi:[2,4,5],iff:2,implement:[3,5,13,14],import_data:[5,12],import_sampled_cim:5,import_structur:5,import_trajectori:5,import_vari:[5,12],improv:[2,3],includ:2,independ:2,independence_test:2,index:[2,4,5,12,13],indic:[2,4],indx:5,info:[4,12],inform:[3,4],init:12,initi:[2,4,5,12],inplac:12,insid:12,instal:[13,14],interest:4,interfac:3,intes:4,iter:[2,3],iterations_numb:[2,3],its:[2,3],join:12,json:[2,5,12],json_import:[0,1,13,14],jsonarrai:5,jsonimport:[5,12],keep:[2,3,5],kei:5,kind:2,knowledg:2,known:2,known_edg:2,label:[2,3,4,5],latest:12,lenght:[2,3],level:[2,5],likelihood:2,list:[2,3,4,5,12],list_of_column:4,list_of_edg:4,list_of_nod:4,load:5,loop:2,m_xu_suff_stat:2,m_xxu_suff_stat:2,main:12,margin:2,marginal_likelihood_q:2,marginal_likelihood_theta:2,mask:[4,9],mask_arr:4,matric:[2,4],matrix:[2,4,5,9,12],max_par:[2,3],maximum:[2,3],member:[4,5],mention:4,merg:5,method:[2,5,7,8,9,10],methodnam:[7,8,9,10],model:2,modul:[13,14],multipl:5,multiprocess:2,name:[2,4,5,12],ndarrai:[2,4,5],necessari:[2,4,5],nest:5,net:[2,3,4,5,12],net_graph:2,network:[2,4,5],network_graph:[0,1,2,13,14],networkgraph:[2,4,12],networkx:2,node:[2,3,4,5,9,12],node_id:[2,3,4,9],node_index:4,node_indx:[2,4],node_st:[4,9],node_states_numb:[4,9],nodes_index:4,nodes_indexes_arr:4,nodes_label:4,nodes_labels_list:4,nodes_numb:4,nodes_vals_arr:4,nodes_valu:[4,12],none:[2,3,4,5,7,9,10,12],normal:5,normalize_trajectori:5,number:[2,3,4],numpi:[2,4,5,9],obj:[10,12],object:[2,3,4,5,12],one:[4,5],one_iteration_of_ctpc_algorithm:2,one_level_norm:5,onli:5,oper:2,optim:[0,1,2,6,13,14],optimize_structur:3,option:[2,3],order:[2,5,10],origin:5,original_cols_numb:4,otherwis:[2,5],out:5,outer:[5,12],over:2,own:[13,14],p_comb:[4,9],p_indx:[4,9],p_val:9,p_valu:9,packag:[13,14],page:13,panda:[5,12],param:4,paramet:[2,3,4,5,9,13,14],parameters_estim:[0,1,13,14],parametersestim:[2,12],parent:[2,3,4,5],parent_indx:2,parent_label:2,parent_set:2,parent_set_v:2,parent_v:2,parent_valu:9,parents_cardin:4,parents_comb:5,parents_index:4,parents_indx:9,parents_label:[4,9],parents_states_numb:[4,9],parents_v:[4,9],parents_valu:[4,9],part:2,particular:[2,5],pass:12,path:[2,5,12],patienc:[2,3],peest:12,perform:2,pip:12,place:5,plot:2,png:2,posit:[4,5],possibl:[2,4],predict:3,prepar:5,present:[2,5],print:12,prior:[2,12],prior_net_structur:5,process:[2,3,4,5],processes_numb:2,properli:5,properti:[4,5],put:5,pyctbn:12,q_xx:4,rappres:4,raw:5,raw_data:5,read:[5,12],read_csv:12,read_csv_fil:12,read_fil:12,read_json_fil:5,real:[2,4,5,12],refer:[4,5],reject:2,rel:4,relat:5,releas:12,remain:5,remov:[2,4,5],remove_edg:4,remove_nod:4,repres:4,represent:2,res:4,resid:[2,4],result:[2,5,12],rtype:4,rule:[2,3],run:[7,8,9,10],runtest:[7,8,9,10],same:5,sampl:[4,5,12],sample_fram:[5,12],sample_import:[0,1,13,14],sample_path:[0,1,2,13,14],sampled_cim:7,sampleimport:5,samplepath:[2,4,12],samples_label:5,save:[2,12],save_plot_estimated_structure_graph:2,save_result:[2,12],scalar_index:2,scalar_indexes_struct:2,score:2,se1:12,search:[2,3,13],second:2,see:5,select:12,self:[2,5,12],sep:2,sep_set:2,set:[2,4,5,7,8,9,10],set_of_cim:[0,1,2,5,13,14],setofcim:[2,4,5,12],setupclass:[7,8,9,10],shift:[4,5],shifted_cols_head:5,show:2,signific:2,simbol:5,simpl:12,simpli:12,sinc:4,single_cim_xu_marginal_likelihood_q:2,single_cim_xu_marginal_likelihood_theta:2,single_internal_cim_xxu_marginal_likelihood_theta:2,size:[2,4],socim:5,sofc1:12,sorter:5,specif:[2,4,12],spuriou:2,spurious_edg:2,start:5,state:[2,4],state_res_tim:4,state_residence_tim:4,state_transition_matrix:4,statist:2,stop:[2,3],str:[2,3,4,5,12],string:[2,3,4,5],structur:[0,1,2,3,5,9,13,14],structure_constraint_based_estim:[0,1,13,14],structure_estim:[0,1,3,13,14],structure_estimation_exampl:12,structure_graph:[0,1,2,5,6,13,14],structure_label:5,structure_score_based_estim:[0,1,13,14],structureconstraintbasedestim:2,structureestim:[2,3,12],structurescorebasedestim:2,structut:4,style:2,submodul:[1,6,13,14],subpackag:[13,14],subset:2,suffici:2,suffuci:2,symbol:[4,5],synthet:5,t_xu_suff_stat:2,tabu:[2,3],tabu_length:[2,3],tabu_rules_dur:[2,3],tabu_search:[0,1,13,14],tabusearch:3,take:12,tar:12,task:[2,4],tau_xu:2,ternari:12,test:2,test_add_edg:9,test_add_nod:9,test_adjacency_matrix:7,test_buid_samplepath_no_concatenated_sampl:9,test_buid_samplepath_no_vari:9,test_build_cim:9,test_build_complete_graph:7,test_build_p_combs_structur:9,test_build_removable_edges_matrix:7,test_build_saplepath_no_prior_net_structur:9,test_build_sort:10,test_build_structur:9,test_build_structure_bad_sort:9,test_build_time_columns_filtering_structure_for_a_nod:9,test_build_time_scalar_indexing_structure_for_a_nod:9,test_build_trajectori:9,test_build_transition_columns_filtering_structur:9,test_build_transition_scalar_indexing_structure_for_a_nod:9,test_cach:6,test_child:2,test_cim:6,test_clear:10,test_clear_concatenated_fram:10,test_clear_data_frame_list:10,test_compute_cim_coeffici:9,test_compute_parameters_for_nod:7,test_compute_row_delta_in_all_fram:10,test_compute_row_delta_in_all_frames_not_init_sort:10,test_compute_row_delta_single_samples_fram:10,test_dataset_id:10,test_edges_oper:9,test_equ:9,test_fast_init:[7,9],test_file_path:10,test_filter_cims_with_mask:9,test_find:10,test_generate_possible_sub_sets_of_s:7,test_get_node_id:9,test_get_node_indx:9,test_get_ordered_by_indx_set_of_par:9,test_get_parents_by_id:9,test_get_positional_node_indx:9,test_get_states_numb:9,test_hill_climbing_search:6,test_import_data:10,test_import_sampled_cim:10,test_import_structur:10,test_import_vari:10,test_init:[7,9,10],test_init_not_filled_dataframs:9,test_init_not_initialized_import:9,test_json_import:6,test_networkgraph:6,test_normalize_trajectori:10,test_normalize_trajectories_wrong_indx:10,test_normalize_trajectories_wrong_kei:10,test_ord:10,test_par:2,test_parameters_estim:6,test_put:10,test_read_json_file_found:10,test_read_json_file_not_found:10,test_repr:9,test_sample_import:6,test_sample_path:6,test_save_plot_estimated_graph:7,test_save_result:7,test_setofcim:6,test_structur:[6,8],test_structure_1:7,test_structure_2:7,test_structure_3:[7,8],test_structure_constraint_based_estim:6,test_structure_estim:6,test_structure_monoprocesso:7,test_structure_score_based_estim:6,test_tabu_search:6,test_tim:7,test_trajectori:6,testcach:10,testcas:[7,8,9,10],testconditionalintensitymatrix:9,testhillclimbingsearch:8,testjsonimport:10,testnetworkgraph:9,testparametersestimatior:7,testsampleimport:10,testsamplepath:9,testsetofcim:9,teststructur:9,teststructureconstraintbasedestim:7,teststructureestim:7,teststructurescorebasedestim:7,testtabusearch:8,testtrajectori:9,tha:5,theta:2,thi:[2,4,5,12],three:12,threshold:2,thumb:2,thumb_threshold:2,thumb_valu:2,time:[2,4,5,12],time_filt:4,time_kei:5,time_scalar_indexing_strucur:4,timestamp:5,to_nod:5,tot_vars_count:[2,3],total:[2,4],total_variables_count:4,total_variables_numb:4,traj:5,trajecory_head:5,trajectori:[0,1,2,5,12,13,14],trajectories_kei:5,trajectory_list:5,trajectri:12,transit:[2,4,5],transition_filt:4,transition_matric:4,transition_scalar_indexing_structur:4,tri:5,tupl:4,tutori:5,two:2,type:[2,3,4,5,12],union:5,uniqu:5,unittest:[7,8,9,10],unus:4,usag:[13,14],use:[2,12],used:[2,3,4,5],using:[2,3,4,5],util:[0,1,4,6,13,14],valid:2,valu:[2,3,4,5,9,12],values_list:12,var_id:2,variabl:[2,3,4,5,12],variable_cardin:5,variable_cim_xu_marginal_likelihood_q:2,variable_cim_xu_marginal_likelihood_theta:2,variable_label:5,variables_kei:5,variables_label:5,vector:[2,4],want:12,when:2,where:5,which:[2,3,4,5],whl:12,who:2,without:[2,3],you:[2,5,12],your:[13,14]},titles:["PyCTBN package","PyCTBN.PyCTBN package","PyCTBN.PyCTBN.estimators package","PyCTBN.PyCTBN.optimizers package","PyCTBN.PyCTBN.structure_graph package","PyCTBN.PyCTBN.utility package","PyCTBN.tests package","PyCTBN.tests.estimators package","PyCTBN.tests.optimizers package","PyCTBN.tests.structure_graph package","PyCTBN.tests.utility package","basic_main module","Examples","Welcome to PyCTBN\u2019s documentation!","PyCTBN","setup module"],titleterms:{"import":12,abstract_import:5,basic_main:11,cach:5,conditional_intensity_matrix:4,constraint_based_optim:3,content:[0,1,2,3,4,5,6,7,8,9,10],data:12,document:13,estim:[2,7,12],exampl:12,fam_score_calcul:2,hill_climbing_search:3,implement:12,indic:13,instal:12,json_import:5,modul:[0,1,2,3,4,5,6,7,8,9,10,11,15],network_graph:4,optim:[3,8],own:12,packag:[0,1,2,3,4,5,6,7,8,9,10],paramet:12,parameters_estim:2,pyctbn:[0,1,2,3,4,5,6,7,8,9,10,13,14],sample_import:5,sample_path:4,set_of_cim:4,setup:15,structur:[4,12],structure_constraint_based_estim:2,structure_estim:2,structure_graph:[4,9],structure_score_based_estim:2,submodul:[0,2,3,4,5,7,8,9,10],subpackag:[0,1,6],tabl:13,tabu_search:3,test:[6,7,8,9,10],test_cach:10,test_cim:9,test_hill_climbing_search:8,test_json_import:10,test_networkgraph:9,test_parameters_estim:7,test_sample_import:10,test_sample_path:9,test_setofcim:9,test_structur:9,test_structure_constraint_based_estim:7,test_structure_estim:7,test_structure_score_based_estim:7,test_tabu_search:8,test_trajectori:9,trajectori:4,usag:12,util:[5,10],welcom:13,your:12}}) \ No newline at end of file