def test_parameter_learning_in_linear_case(self):
     is_f_linear = True
     is_g_linear = True
     for j, (state_dim, output_dim) in enumerate(zip([1], [1])):
         # tester différentes tailles
         for k, n_sample in enumerate([100]):
             ssm = StateSpaceModel(is_f_linear=is_f_linear,
                                   is_g_linear=is_g_linear,
                                   state_dim=state_dim,
                                   output_dim=output_dim)
             ssm.draw_sample(T=n_sample)
             is_extended = False
             ssm.kalman_smoothing(is_extended=is_extended)
             ssm.compute_f_optimal_parameters()
             ssm.compute_g_optimal_parameters()
    def test_linear_kalman_methods(self):
        for i, (state_dim, output_dim,
                input_dim) in enumerate(zip([1, 4, 3], [1, 3, 4], [0, 0, 0])):
            # tester différentes tailles
            for j, T in enumerate([1, 10]):
                default_message = 'Parameters : T = ' + str(
                    T) + '. state_dim = ' + str(
                        state_dim) + '.  output_dim = ' + str(
                            output_dim) + '. input_dim = ' + str(input_dim)
                ssm = StateSpaceModel(is_f_linear=True,
                                      is_g_linear=True,
                                      state_dim=state_dim,
                                      output_dim=output_dim,
                                      input_dim=input_dim)
                ssm.draw_sample(T=T)
                ssm.kalman_smoothing(is_extended=False)
                self.assertEqual(len(getattr(ssm, 'filtered_state_means')), T)
                self.assertEqual(
                    len(getattr(ssm, 'filtered_state_covariance')), T)
                self.assertEqual(len(getattr(ssm, 'smoothed_state_means')), T)
                self.assertEqual(
                    len(getattr(ssm, 'smoothed_state_covariance')), T)

                # verifier que les moyennes et covariances estimmées ont les bonnes dimensions
                for i in range(0, T):
                    xFilter0 = ssm.filtered_state_means[i][0]
                    xFilter1 = ssm.filtered_state_means[i][1]
                    PFilter0 = ssm.filtered_state_covariance[i][0]
                    PFilter1 = ssm.filtered_state_covariance[i][1]

                    xSmooth = ssm.smoothed_state_means[i]
                    PSmooth = ssm.smoothed_state_covariance[T - 1 - i]

                    self.assertEqual(
                        xFilter0.size, ssm.state_dim,
                        'mean vector must have state_dim dimension')
                    self.assertEqual(
                        xFilter1.size, ssm.state_dim,
                        'mean vector must have state_dim dimension')
                    self.assertEqual(
                        PFilter0.shape, (ssm.state_dim, ssm.state_dim),
                        'cov matrix must have state_dim dimension')
                    self.assertEqual(
                        PFilter1.shape, (ssm.state_dim, ssm.state_dim),
                        'cov matrix must have state_dim dimension')
                    # check that matrices are definite positive
                    self.assertTrue(
                        utils.is_pos_def(PFilter0),
                        'filtered covariance matrix must be positive definite')
                    self.assertTrue(
                        utils.is_pos_def(PFilter1),
                        'filtered covariance matrix must be positive definite')

                    self.assertEqual(
                        xSmooth.size, ssm.state_dim,
                        'mean vector must have state_dim dimension')
                    self.assertEqual(
                        PSmooth.shape, (ssm.state_dim, ssm.state_dim),
                        'cov matrix must have state_dim dimension')
                    self.assertTrue(
                        utils.is_pos_def(PSmooth),
                        default_message + '. Smoothed covariance P_{T-' +
                        str(i) + '} matrix must be positive definite')