def test_get_item(self):
        ip = IndividualParameters()

        p1 = {"xi": 0.1, "tau": 70, "sources": [0.1, -0.3]}
        p2 = {"xi": 0.2, "tau": 73, "sources": [-0.4, 0.1]}

        ip.add_individual_parameters("idx1", p1)
        ip.add_individual_parameters("idx2", p2)

        self.assertDictEqual(ip['idx1'], p1)
        self.assertDictEqual(ip['idx2'], p2)
    def test_constructor(self):

        ip = IndividualParameters()
        self.assertEqual(ip._indices, [])
        self.assertEqual(ip._individual_parameters, {})
        self.assertEqual(ip._parameters_shape, None)  # changed
        self.assertEqual(ip._default_saving_type, "csv")
    def test_from_dataframe(self):

        ip = IndividualParameters.from_dataframe(self.ip_df)

        self.assertEqual(ip._indices, self.indices)
        self.assertEqual(ip._individual_parameters, self.individual_parameters)
        self.assertEqual(ip._parameters_shape, self.parameters_shape)
    def test_load_individual_parameters(self):

        # Test json
        ip_json = IndividualParameters.load(self.path_json)

        self.assertEqual(ip_json._indices, self.indices)
        self.assertEqual(ip_json._individual_parameters,
                         self.individual_parameters)
        self.assertEqual(ip_json._parameters_shape, self.parameters_shape)

        # Test csv
        ip_csv = IndividualParameters.load(self.path_csv)

        self.assertEqual(ip_csv._indices, self.indices)
        self.assertEqual(ip_csv._individual_parameters,
                         self.individual_parameters)
        self.assertEqual(ip_csv._parameters_shape, self.parameters_shape)
    def test_check_and_get_extension(self):
        tests = [('file.csv', 'csv'), ('path/to/file.csv', 'csv'),
                 ('file.json', 'json'), ('path/to/file.json', 'json'),
                 ('nopath', False), ('bad_path.bad', 'bad')]

        for test in tests:
            ext = IndividualParameters._check_and_get_extension(test[0])
            self.assertEqual(ext, test[1])
    def test_from_to_pytorch(self):

        ip = IndividualParameters.from_pytorch(self.indices, self.ip_pytorch)
        ip_indices, ip_pytorch2 = ip.to_pytorch()
        ip2 = IndividualParameters.from_pytorch(ip_indices, ip_pytorch2)

        # Test Individual parameters
        self.assertEqual(ip._indices, ip2._indices)
        self.assertDictEqual(ip._individual_parameters,
                             ip2._individual_parameters)
        self.assertDictEqual(ip._parameters_shape, ip2._parameters_shape)

        # Test Pytorch dictionaries
        self.assertEqual(self.ip_pytorch.keys(), ip_pytorch2.keys())
        for k in self.ip_pytorch.keys():
            for v1, v2 in zip(self.ip_pytorch[k], ip_pytorch2[k]):
                self.assertTrue((v1.numpy() - v2.numpy() == 0).all())
    def test_to_from_dataframe(self):

        ip1 = IndividualParameters.from_dataframe(self.ip_df)
        df2 = ip1.to_dataframe()
        ip2 = IndividualParameters.from_dataframe(df2)

        # Test between individual parameters
        self.assertEqual(ip1._indices, ip2._indices)
        self.assertDictEqual(ip1._individual_parameters,
                             ip2._individual_parameters)
        self.assertDictEqual(ip1._parameters_shape, ip2._parameters_shape)

        # Test between dataframes
        self.assertTrue((self.ip_df.values == df2.values).all())
        self.assertTrue((self.ip_df.index == df2.index).all())
        for n1, n2 in zip(self.ip_df.columns, df2.columns):
            self.assertEqual(n1, n2)
    def test_from_pytorch(self):
        """

        """

        ip = IndividualParameters.from_pytorch(self.indices, self.ip_pytorch)

        self.assertEqual(ip._indices, self.indices)
        self.assertEqual(ip._individual_parameters.keys(),
                         self.individual_parameters.keys())
        self.assertDictEqual(ip._parameters_shape, self.parameters_shape)
        for k, v in self.individual_parameters.items():
            for kk, vv in self.individual_parameters[k].items():
                self.assertTrue(kk in ip._individual_parameters[k].keys())
                if np.ndim(vv) == 0:
                    self.assertAlmostEqual(ip._individual_parameters[k][kk],
                                           vv,
                                           delta=10e-8)
                else:
                    l2 = ip._individual_parameters[k][kk]
                    for s1, s2 in zip(vv, l2):
                        self.assertAlmostEqual(s1, s2, delta=10e-8)
    def setUp(self):
        self.indices = ['idx1', 'idx2', 'idx3']
        self.p1 = {"xi": 0.1, "tau": 70, "sources": [0.1, -0.3]}
        self.p2 = {"xi": 0.2, "tau": 73, "sources": [-0.4, 0.1]}
        self.p3 = {"xi": 0.3, "tau": 58, "sources": [-0.6, 0.2]}
        self.parameters_shape = {"xi": (), "tau": (), "sources": (2, )}
        self.individual_parameters = {
            "idx1": self.p1,
            "idx2": self.p2,
            "idx3": self.p3
        }

        ip = IndividualParameters()
        ip.add_individual_parameters("idx1", self.p1)
        ip.add_individual_parameters("idx2", self.p2)
        ip.add_individual_parameters("idx3", self.p3)

        self.ip = ip

        self.ip_df = pd.DataFrame(
            data=[[0.1, 70, 0.1, -0.3], [0.2, 73, -0.4, 0.1],
                  [0.3, 58, -0.6, 0.2]],
            index=["idx1", "idx2", "idx3"],
            columns=["xi", "tau", "sources_0", "sources_1"])

        self.ip_pytorch = {
            "xi":
            torch.tensor([[0.1], [0.2], [0.3]], dtype=torch.float32),
            "tau":
            torch.tensor([[70], [73], [58.]], dtype=torch.float32),
            "sources":
            torch.tensor([[0.1, -0.3], [-0.4, 0.1], [-0.6, 0.2]],
                         dtype=torch.float32)
        }
        self.path_json = os.path.join(test_data_dir, "io", "outputs",
                                      "ip_save.json")
        self.path_csv = os.path.join(test_data_dir, "io", "outputs",
                                     "ip_save.csv")
    def test_individual_parameters(self):

        ip = IndividualParameters()
        p1 = {"xi": 0.1, "tau": 70, "sources": [0.1, -0.3]}
        p2 = {"xi": 0.2, "tau": 73, "sources": [-0.4, 0.1]}
        p3 = {"xi": 0.3, "tau": 58, "sources": [-0.6, 0.2]}

        ip.add_individual_parameters("idx1", p1)
        ip.add_individual_parameters("idx2", p2)
        ip.add_individual_parameters("idx3", p3)

        ## test fail index exist
        with self.assertRaises(ValueError):
            ip.add_individual_parameters('idx1', p3)
        ## test fail index numeric
        with self.assertRaises(ValueError):
            ip.add_individual_parameters(1, p1)
        ## test fail expect scalar
        with self.assertRaises(ValueError):
            ip.add_individual_parameters('tau_list', {
                'tau': [0.2],
                'xi': .1,
                'sources': [0, 0]
            })
        ## test fail missing key
        with self.assertRaises(ValueError):
            ip.add_individual_parameters('no_xi', {
                'tau': 0.2,
                'sources': [0, 0]
            })

        self.assertEqual(ip._indices, ["idx1", "idx2", "idx3"])
        self.assertEqual(ip._indices, list(ip._individual_parameters.keys())
                         )  # TODO: delete indices? as they should be dict keys
        self.assertEqual(ip._individual_parameters, {
            "idx1": p1,
            "idx2": p2,
            "idx3": p3
        })
        self.assertEqual(ip._parameters_shape, {
            "xi": (),
            "tau": (),
            "sources": (2, )
        })
        self.assertEqual(ip._parameters_size, {
            "xi": 1,
            "tau": 1,
            "sources": 2
        })

        ### test with 1 source only (previous bug)
        ip1 = IndividualParameters()

        src1 = {'tau': 73, 'xi': .1, 'sources': [0.14]}

        ip1.add_individual_parameters('id1', src1)
        ip1.add_individual_parameters('id2', src1)

        self.assertEqual(ip1._parameters_shape, {
            "xi": (),
            "tau": (),
            "sources": (1, )
        })
        self.assertEqual(ip1._parameters_size, {
            "xi": 1,
            "tau": 1,
            "sources": 1
        })

        ## test fail compat nb sources 1 != 2
        with self.assertRaises(ValueError):
            ip1.add_individual_parameters('id_fail', p1)

        ## test columns of dataframe
        # previously would have been "sources" for 1 source which is not generic...
        self.assertEqual({'tau', 'xi', 'sources_0'},
                         set(ip1.to_dataframe().columns))
        # previously one would get a column named "sources", with a string encoded list of 1 element at each row...
        self.assertTrue(
            pd.api.types.is_numeric_dtype(ip1.to_dataframe().dtypes.all()))
    def test_load_json(self):
        ip = IndividualParameters._load_json(self.path_json)

        self.assertEqual(ip._indices, self.indices)
        self.assertEqual(ip._individual_parameters, self.individual_parameters)
        self.assertEqual(ip._parameters_shape, self.parameters_shape)
Пример #12
0
path_analysis = os.path.join(path_output, "analysis")
if not os.path.exists(path_analysis):
    os.makedirs(path_analysis)


# TODO save and load that info somewhere
n_folds = 3
n_rep = 2
n_resampling_iter = n_folds*n_rep

#%% Load results from folds

# Load individual_parameters objects
individual_parameters_iter = []
for cv_iter in range(n_resampling_iter):
    individual_parameters_iter.append(IndividualParameters.load(os.path.join(path_output_personalize, "individual_parameters_{}.json".format(cv_iter))))

# Get calibrated models paths
model_paths = [os.path.join(path_output_calibrate, "fold_{}".format(i), "model_parameters.json") for i in range(n_resampling_iter)]

# Load leaspy objects
leaspy_iter = []
for i in range(n_folds*n_rep):
    leaspy = Leaspy.load(model_paths[i])
    leaspy_iter.append(leaspy)

# Load indices
import json
with open(os.path.join(path_output, "resampling_indices.json"), "r") as json_file:
    indices_resampling = json.load(json_file)