def test_cmi_uncorrelated_gaussians_three_dims(): """Test CMI estimator on uncorrelated 3D Gaussian data.""" n_obs = 10000 dim = 3 np.random.seed(SEED) var1 = np.random.randn(n_obs, dim) var2 = np.random.randn(n_obs, dim) var3 = np.random.randn(n_obs, dim) # Run OpenCL estimator. settings = {'debug': True, 'return_counts': True} ocl_est = OpenCLKraskovCMI(settings=settings) mi_ocl, dist, n_range_var1, n_range_var2 = ocl_est.estimate(var1, var2) mi_ocl = mi_ocl[0] # Run JIDT estimator. jidt_est = JidtKraskovCMI(settings={}) mi_jidt = jidt_est.estimate(var1, var2) print('JIDT MI result: {0:.4f} nats; OpenCL MI result: {1:.4f} nats; ' 'expected to be close to 0 nats for uncorrelated ' 'Gaussians.'.format(mi_jidt, mi_ocl)) assert np.isclose( mi_jidt, 0, atol=0.05), ('MI estimation for uncorrelated Gaussians using the ' 'JIDT estimator failed (error larger 0.05).') assert np.isclose( mi_ocl, 0, atol=0.05), ('MI estimation for uncorrelated Gaussians using the ' 'OpenCL estimator failed (error larger 0.05).') assert np.isclose( mi_ocl, mi_jidt, atol=0.0001), ('MI estimation for uncorrelated Gaussians using the ' 'OpenCL estimator failed (error larger 0.05).') # Run with conditional (mi_ocl, dist, n_range_var1, n_range_var2, n_range_var3) = ocl_est.estimate(var1, var2, var3) mi_ocl = mi_ocl[0] mi_jidt = jidt_est.estimate(var1, var2, var3) print('JIDT MI result: {0:.4f} nats; OpenCL MI result: {1:.4f} nats; ' 'expected to be close to 0 nats for uncorrelated ' 'Gaussians.'.format(mi_jidt, mi_ocl)) assert np.isclose( mi_jidt, 0, atol=0.05), ('MI estimation for uncorrelated Gaussians using the ' 'JIDT estimator failed (error larger 0.05).') assert np.isclose( mi_ocl, 0, atol=0.05), ('MI estimation for uncorrelated Gaussians using the ' 'OpenCL estimator failed (error larger 0.05).') assert np.isclose( mi_ocl, mi_jidt, atol=0.0001), ('MI estimation for uncorrelated Gaussians using the ' 'OpenCL estimator failed (error larger 0.05).')
def test_cmi_uncorrelated_gaussians_three_dims(): """Test CMI estimator on uncorrelated 3D Gaussian data.""" n_obs = 10000 dim = 3 var1 = np.random.randn(n_obs, dim) var2 = np.random.randn(n_obs, dim) var3 = np.random.randn(n_obs, dim) # Run OpenCL estimator. settings = {'debug': True} ocl_est = OpenCLKraskovCMI(settings=settings) mi_ocl, dist, n_range_var1, n_range_var2 = ocl_est.estimate(var1, var2) mi_ocl = mi_ocl[0] # Run JIDT estimator. jidt_est = JidtKraskovCMI(settings={}) mi_jidt = jidt_est.estimate(var1, var2) print('JIDT MI result: {0:.4f} nats; OpenCL MI result: {1:.4f} nats; ' 'expected to be close to 0 nats for uncorrelated ' 'Gaussians.'.format(mi_jidt, mi_ocl)) assert np.isclose(mi_jidt, 0, atol=0.05), ( 'MI estimation for uncorrelated Gaussians using the ' 'JIDT estimator failed (error larger 0.05).') assert np.isclose(mi_ocl, 0, atol=0.05), ( 'MI estimation for uncorrelated Gaussians using the ' 'OpenCL estimator failed (error larger 0.05).') assert np.isclose(mi_ocl, mi_jidt, atol=0.0001), ( 'MI estimation for uncorrelated Gaussians using the ' 'OpenCL estimator failed (error larger 0.05).') # Run with conditional (mi_ocl, dist, n_range_var1, n_range_var2, n_range_var3) = ocl_est.estimate(var1, var2, var3) mi_ocl = mi_ocl[0] mi_jidt = jidt_est.estimate(var1, var2, var3) print('JIDT MI result: {0:.4f} nats; OpenCL MI result: {1:.4f} nats; ' 'expected to be close to 0 nats for uncorrelated ' 'Gaussians.'.format(mi_jidt, mi_ocl)) assert np.isclose(mi_jidt, 0, atol=0.05), ( 'MI estimation for uncorrelated Gaussians using the ' 'JIDT estimator failed (error larger 0.05).') assert np.isclose(mi_ocl, 0, atol=0.05), ( 'MI estimation for uncorrelated Gaussians using the ' 'OpenCL estimator failed (error larger 0.05).') assert np.isclose(mi_ocl, mi_jidt, atol=0.0001), ( 'MI estimation for uncorrelated Gaussians using the ' 'OpenCL estimator failed (error larger 0.05).')
def test_cmi_correlated_gaussians(): """Test estimators on correlated Gaussian data with conditional.""" expected_mi, source, source_uncorr, target = _get_gauss_data() # Run OpenCL estimator. settings = {'debug': True, 'return_counts': True} ocl_est = OpenCLKraskovCMI(settings=settings) (mi_ocl, dist, n_range_var1, n_range_var2, n_range_cond) = ocl_est.estimate(source, target, source_uncorr) mi_ocl = mi_ocl[0] # Run JIDT estimator. jidt_est = JidtKraskovCMI(settings={}) mi_jidt = jidt_est.estimate(source, target, source_uncorr) print('JIDT MI result: {0:.4f} nats; OpenCL MI result: {1:.4f} nats; ' 'expected to be close to {2:.4f} nats for correlated ' 'Gaussians.'.format(mi_jidt, mi_ocl, expected_mi)) assert np.isclose( mi_jidt, expected_mi, atol=0.05), ('MI estimation for uncorrelated Gaussians using the ' 'JIDT estimator failed (error larger 0.05).') assert np.isclose( mi_ocl, expected_mi, atol=0.05), ('MI estimation for uncorrelated Gaussians using the ' 'OpenCL estimator failed (error larger 0.05).') assert np.isclose( mi_ocl, mi_jidt, atol=0.0001), ('MI estimation for uncorrelated Gaussians using the ' 'OpenCL estimator failed (error larger 0.05).')
def test_cmi_no_cond_correlated_gaussians(): """Test estimators on correlated Gaussian data without conditional.""" expected_mi, source, source_uncorr, target = _get_gauss_data() # Run OpenCL estimator. settings = {'debug': True} ocl_est = OpenCLKraskovCMI(settings=settings) mi_ocl, dist, n_range_var1, n_range_var2 = ocl_est.estimate(source, target) mi_ocl = mi_ocl[0] # Run JIDT estimator. jidt_est = JidtKraskovCMI(settings={}) mi_jidt = jidt_est.estimate(source, target) cov_effective = np.cov(np.squeeze(source), np.squeeze(target))[1, 0] expected_mi = math.log(1 / (1 - math.pow(cov_effective, 2))) print('JIDT MI result: {0:.4f} nats; OpenCL MI result: {1:.4f} nats; ' 'expected to be close to {2:.4f} nats for correlated ' 'Gaussians.'.format(mi_jidt, mi_ocl, expected_mi)) assert np.isclose(mi_jidt, expected_mi, atol=0.05), ( 'MI estimation for uncorrelated Gaussians using the ' 'JIDT estimator failed (error larger 0.05).') assert np.isclose(mi_ocl, expected_mi, atol=0.05), ( 'MI estimation for uncorrelated Gaussians using the ' 'OpenCL estimator failed (error larger 0.05).') assert np.isclose(mi_ocl, mi_jidt, atol=0.0001), ( 'MI estimation for uncorrelated Gaussians using the ' 'OpenCL estimator failed (error larger 0.05).')
def test_cmi_correlated_gaussians(): """Test estimators on correlated Gaussian data with conditional.""" expected_mi, source, source_uncorr, target = _get_gauss_data() # Run OpenCL estimator. settings = {'debug': True} ocl_est = OpenCLKraskovCMI(settings=settings) (mi_ocl, dist, n_range_var1, n_range_var2, n_range_cond) = ocl_est.estimate(source, target, source_uncorr) mi_ocl = mi_ocl[0] # Run JIDT estimator. jidt_est = JidtKraskovCMI(settings={}) mi_jidt = jidt_est.estimate(source, target, source_uncorr) print('JIDT MI result: {0:.4f} nats; OpenCL MI result: {1:.4f} nats; ' 'expected to be close to {2:.4f} nats for correlated ' 'Gaussians.'.format(mi_jidt, mi_ocl, expected_mi)) assert np.isclose(mi_jidt, expected_mi, atol=0.05), ( 'MI estimation for uncorrelated Gaussians using the ' 'JIDT estimator failed (error larger 0.05).') assert np.isclose(mi_ocl, expected_mi, atol=0.05), ( 'MI estimation for uncorrelated Gaussians using the ' 'OpenCL estimator failed (error larger 0.05).') assert np.isclose(mi_ocl, mi_jidt, atol=0.0001), ( 'MI estimation for uncorrelated Gaussians using the ' 'OpenCL estimator failed (error larger 0.05).')
def test_cmi_gauss_data(): """Test CMI estimation on two sets of Gaussian random data. The first test is on correlated variables, the second on uncorrelated variables. Note that the calculation is based on a random variable (because the generated data is a set of random variables) - the result will be of the order of what we expect, but not exactly equal to it; in fact, there will be a large variance around it. """ expected_mi, source1, source2, target = _get_gauss_data() # Test Kraskov mi_estimator = JidtKraskovCMI(settings={}) mi_cor = mi_estimator.estimate(source1, target) mi_uncor = mi_estimator.estimate(source2, target) _assert_result(mi_cor, expected_mi, 'JidtKraskovCMI', 'CMI (corr.)') _assert_result(mi_uncor, 0, 'JidtKraskovCMI', 'CMI (uncorr.)') # Test Gaussian mi_estimator = JidtGaussianCMI(settings={}) mi_cor = mi_estimator.estimate(source1, target) mi_uncor = mi_estimator.estimate(source2, target) _assert_result(mi_cor, expected_mi, 'JidtGaussianCMI', 'CMI (corr.)') _assert_result(mi_uncor, 0, 'JidtGaussianCMI', 'CMI (uncorr.)') # Test Discrete settings = {'discretise_method': 'equal', 'num_discrete_bins': 5} mi_estimator = JidtDiscreteCMI(settings=settings) mi_cor = mi_estimator.estimate(source1, target) mi_uncor = mi_estimator.estimate(source2, target) _assert_result(mi_cor, expected_mi, 'JidtDiscreteCMI', 'CMI (corr.)') _assert_result(mi_uncor, 0, 'JidtDiscreteCMI', 'CMI (uncorr.)')
def test_cmi_gauss_data_no_cond(): """Test estimators on correlated Gauss data without a conditional. The estimators should return the MI if no conditional variable is provided. Note that the calculation is based on a random variable (because the generated data is a set of random variables) - the result will be of the order of what we expect, but not exactly equal to it; in fact, there will be a large variance around it. """ expected_mi, source1, source2, target = _get_gauss_data() # Test Kraskov mi_estimator = JidtKraskovCMI(settings={}) mi_cor = mi_estimator.estimate(source1, target) mi_uncor = mi_estimator.estimate(source2, target) _assert_result(mi_cor, expected_mi, 'JidtKraskovCMI', 'CMI (no cond.)') _assert_result(mi_uncor, 0, 'JidtKraskovCMI', 'CMI (uncorr., no cond.)') # Test Gaussian mi_estimator = JidtGaussianCMI(settings={}) mi_cor = mi_estimator.estimate(source1, target) mi_uncor = mi_estimator.estimate(source2, target) _assert_result(mi_cor, expected_mi, 'JidtGaussianCMI', 'CMI (no cond.)') _assert_result(mi_uncor, 0, 'JidtGaussianCMI', 'CMI (uncorr., no cond.)') # Test Discrete settings = {'discretise_method': 'equal', 'num_discrete_bins': 5} mi_estimator = JidtDiscreteCMI(settings=settings) mi_cor = mi_estimator.estimate(source1, target) mi_uncor = mi_estimator.estimate(source2, target) _assert_result(mi_cor, expected_mi, 'JidtDiscreteCMI', 'CMI (no cond.)') _assert_result(mi_uncor, 0, 'JidtDiscreteCMI', 'CMI (uncorr., no cond.)')
def test_cmi_gauss_data(): """Test CMI estimation on two sets of Gaussian random data. The first test is on correlated variables, the second on uncorrelated variables. Note that the calculation is based on a random variable (because the generated data is a set of random variables) - the result will be of the order of what we expect, but not exactly equal to it; in fact, there will be a large variance around it. """ expected_mi, source1, source2, target = _get_gauss_data() # Test Kraskov mi_estimator = JidtKraskovCMI(settings={}) mi_cor = mi_estimator.estimate(source1, target) mi_uncor = mi_estimator.estimate(source2, target) _assert_result(mi_cor, expected_mi, 'JidtKraskovCMI', 'CMI (corr.)') _assert_result(mi_uncor, 0, 'JidtKraskovCMI', 'CMI (uncorr.)') # Test Gaussian mi_estimator = JidtGaussianCMI(settings={}) mi_cor = mi_estimator.estimate(source1, target) mi_uncor = mi_estimator.estimate(source2, target) _assert_result(mi_cor, expected_mi, 'JidtGaussianCMI', 'CMI (corr.)') _assert_result(mi_uncor, 0, 'JidtGaussianCMI', 'CMI (uncorr.)') # Test Discrete settings = {'discretise_method': 'equal', 'n_discrete_bins': 5} mi_estimator = JidtDiscreteCMI(settings=settings) mi_cor = mi_estimator.estimate(source1, target) mi_uncor = mi_estimator.estimate(source2, target) _assert_result(mi_cor, expected_mi, 'JidtDiscreteCMI', 'CMI (corr.)') _assert_result(mi_uncor, 0, 'JidtDiscreteCMI', 'CMI (uncorr.)')
def test_cmi_gauss_data_no_cond(): """Test estimators on correlated Gauss data without a conditional. The estimators should return the MI if no conditional variable is provided. Note that the calculation is based on a random variable (because the generated data is a set of random variables) - the result will be of the order of what we expect, but not exactly equal to it; in fact, there will be a large variance around it. """ expected_mi, source1, source2, target = _get_gauss_data() # Test Kraskov mi_estimator = JidtKraskovCMI(settings={}) mi_cor = mi_estimator.estimate(source1, target) mi_uncor = mi_estimator.estimate(source2, target) _assert_result(mi_cor, expected_mi, 'JidtKraskovCMI', 'CMI (no cond.)') _assert_result(mi_uncor, 0, 'JidtKraskovCMI', 'CMI (uncorr., no cond.)') # Test Gaussian mi_estimator = JidtGaussianCMI(settings={}) mi_cor = mi_estimator.estimate(source1, target) mi_uncor = mi_estimator.estimate(source2, target) _assert_result(mi_cor, expected_mi, 'JidtGaussianCMI', 'CMI (no cond.)') _assert_result(mi_uncor, 0, 'JidtGaussianCMI', 'CMI (uncorr., no cond.)') # Test Discrete settings = {'discretise_method': 'equal', 'n_discrete_bins': 5} mi_estimator = JidtDiscreteCMI(settings=settings) mi_cor = mi_estimator.estimate(source1, target) mi_uncor = mi_estimator.estimate(source2, target) _assert_result(mi_cor, expected_mi, 'JidtDiscreteCMI', 'CMI (no cond.)') _assert_result(mi_uncor, 0, 'JidtDiscreteCMI', 'CMI (uncorr., no cond.)')
def test_one_two_dim_input_kraskov(): """Test one- and two-dimensional input for Kraskov estimators.""" expected_mi, src_one, s, target_one = _get_gauss_data(expand=False) src_two = np.expand_dims(src_one, axis=1) target_two = np.expand_dims(target_one, axis=1) ar_src_one, s = _get_ar_data(expand=False) ar_src_two = np.expand_dims(ar_src_one, axis=1) # MI mi_estimator = JidtKraskovMI(settings={}) mi_cor_one = mi_estimator.estimate(src_one, target_one) _assert_result(mi_cor_one, expected_mi, 'JidtKraskovMI', 'MI') mi_cor_two = mi_estimator.estimate(src_two, target_two) _assert_result(mi_cor_two, expected_mi, 'JidtKraskovMI', 'MI') _compare_result(mi_cor_one, mi_cor_two, 'JidtKraskovMI one dim', 'JidtKraskovMI two dim', 'MI') # CMI cmi_estimator = JidtKraskovCMI(settings={}) mi_cor_one = cmi_estimator.estimate(src_one, target_one) _assert_result(mi_cor_one, expected_mi, 'JidtKraskovCMI', 'CMI') mi_cor_two = cmi_estimator.estimate(src_two, target_two) _assert_result(mi_cor_two, expected_mi, 'JidtKraskovCMI', 'CMI') _compare_result(mi_cor_one, mi_cor_two, 'JidtKraskovMI one dim', 'JidtKraskovMI two dim', 'CMI') # TE te_estimator = JidtKraskovTE(settings={'history_target': 1}) mi_cor_one = te_estimator.estimate(src_one[1:], target_one[:-1]) _assert_result(mi_cor_one, expected_mi, 'JidtKraskovTE', 'TE') mi_cor_two = te_estimator.estimate(src_one[1:], target_one[:-1]) _assert_result(mi_cor_two, expected_mi, 'JidtKraskovTE', 'TE') _compare_result(mi_cor_one, mi_cor_two, 'JidtKraskovMI one dim', 'JidtKraskovMI two dim', 'TE') # AIS ais_estimator = JidtKraskovAIS(settings={'history': 2}) mi_cor_one = ais_estimator.estimate(ar_src_one) mi_cor_two = ais_estimator.estimate(ar_src_two) _compare_result(mi_cor_one, mi_cor_two, 'JidtKraskovAIS one dim', 'JidtKraskovAIS two dim', 'AIS (AR process)')
def test_one_two_dim_input_kraskov(): """Test one- and two-dimensional input for Kraskov estimators.""" expected_mi, src_one, s, target_one = _get_gauss_data(expand=False, seed=SEED) src_two = np.expand_dims(src_one, axis=1) target_two = np.expand_dims(target_one, axis=1) ar_src_one, s = _get_ar_data(expand=False, seed=SEED) ar_src_two = np.expand_dims(ar_src_one, axis=1) # MI mi_estimator = JidtKraskovMI(settings={}) mi_cor_one = mi_estimator.estimate(src_one, target_one) _assert_result(mi_cor_one, expected_mi, 'JidtKraskovMI', 'MI') mi_cor_two = mi_estimator.estimate(src_two, target_two) _assert_result(mi_cor_two, expected_mi, 'JidtKraskovMI', 'MI') _compare_result(mi_cor_one, mi_cor_two, 'JidtKraskovMI one dim', 'JidtKraskovMI two dim', 'MI') # CMI cmi_estimator = JidtKraskovCMI(settings={}) mi_cor_one = cmi_estimator.estimate(src_one, target_one) _assert_result(mi_cor_one, expected_mi, 'JidtKraskovCMI', 'CMI') mi_cor_two = cmi_estimator.estimate(src_two, target_two) _assert_result(mi_cor_two, expected_mi, 'JidtKraskovCMI', 'CMI') _compare_result(mi_cor_one, mi_cor_two, 'JidtKraskovMI one dim', 'JidtKraskovMI two dim', 'CMI') # TE te_estimator = JidtKraskovTE(settings={'history_target': 1}) mi_cor_one = te_estimator.estimate(src_one[1:], target_one[:-1]) _assert_result(mi_cor_one, expected_mi, 'JidtKraskovTE', 'TE') mi_cor_two = te_estimator.estimate(src_one[1:], target_one[:-1]) _assert_result(mi_cor_two, expected_mi, 'JidtKraskovTE', 'TE') _compare_result(mi_cor_one, mi_cor_two, 'JidtKraskovMI one dim', 'JidtKraskovMI two dim', 'TE') # AIS ais_estimator = JidtKraskovAIS(settings={'history': 2}) mi_cor_one = ais_estimator.estimate(ar_src_one) mi_cor_two = ais_estimator.estimate(ar_src_two) _compare_result(mi_cor_one, mi_cor_two, 'JidtKraskovAIS one dim', 'JidtKraskovAIS two dim', 'AIS (AR process)')
def test_gauss_data(): """Test bivariate TE estimation from correlated Gaussians.""" # Generate data and add a delay one one sample. expected_mi, source, source_uncorr, target = _get_gauss_data() source = source[1:] source_uncorr = source_uncorr[1:] target = target[:-1] data = Data(np.hstack((source, source_uncorr, target)), dim_order='sp') settings = { 'cmi_estimator': 'JidtKraskovCMI', 'n_perm_max_stat': 21, 'n_perm_min_stat': 21, 'n_perm_max_seq': 21, 'n_perm_omnibus': 21, 'max_lag_sources': 2, 'min_lag_sources': 1, 'max_lag_target': 1 } nw = BivariateTE() results = nw.analyse_single_target(settings, data, target=2, sources=[0, 1]) te = results.get_single_target(2, fdr=False)['te'][0] sources = results.get_target_sources(2, fdr=False) # Assert that only the correlated source was detected. assert len(sources) == 1, 'Wrong no. inferred sources: {0}.'.format( len(sources)) assert sources[0] == 0, 'Wrong inferred source: {0}.'.format(sources[0]) # Compare BivarateTE() estimate to JIDT estimate. current_value = (2, 2) source_vars = results.get_single_target(2, False)['selected_vars_sources'] target_vars = results.get_single_target(2, False)['selected_vars_target'] var1 = data.get_realisations(current_value, source_vars)[0] var2 = data.get_realisations(current_value, [current_value])[0] cond = data.get_realisations(current_value, target_vars)[0] est = JidtKraskovCMI({}) jidt_cmi = est.estimate(var1=var1, var2=var2, conditional=cond) print('Estimated TE: {0:0.6f}, estimated TE using JIDT core estimator: ' '{1:0.6f} (expected: {2:0.6f}).'.format(te, jidt_cmi, expected_mi)) assert np.isclose(te, jidt_cmi, atol=0.005), ( 'Estimated TE {0:0.6f} differs from JIDT estimate {1:0.6f} (expected: ' 'TE {2:0.6f}).'.format(te, jidt_cmi, expected_mi))
def test_gauss_data(): """Test bivariate TE estimation from correlated Gaussians.""" # Generate data and add a delay one one sample. expected_mi, source, source_uncorr, target = _get_gauss_data() source = source[1:] source_uncorr = source_uncorr[1:] target = target[:-1] data = Data(np.hstack((source, source_uncorr, target)), dim_order='sp') settings = { 'cmi_estimator': 'JidtKraskovCMI', 'n_perm_max_stat': 21, 'n_perm_min_stat': 21, 'n_perm_max_seq': 21, 'n_perm_omnibus': 21, 'max_lag_sources': 2, 'min_lag_sources': 1, 'max_lag_target': 1} nw = BivariateTE() results = nw.analyse_single_target( settings, data, target=2, sources=[0, 1]) te = results.get_single_target(2, fdr=False)['te'][0] sources = results.get_target_sources(2, fdr=False) # Assert that only the correlated source was detected. assert len(sources) == 1, 'Wrong no. inferred sources: {0}.'.format( len(sources)) assert sources[0] == 0, 'Wrong inferred source: {0}.'.format(sources[0]) # Compare BivarateTE() estimate to JIDT estimate. current_value = (2, 2) source_vars = results.get_single_target(2, False)['selected_vars_sources'] target_vars = results.get_single_target(2, False)['selected_vars_target'] var1 = data.get_realisations(current_value, source_vars)[0] var2 = data.get_realisations(current_value, [current_value])[0] cond = data.get_realisations(current_value, target_vars)[0] est = JidtKraskovCMI({}) jidt_cmi = est.estimate(var1=var1, var2=var2, conditional=cond) print('Estimated TE: {0:0.6f}, estimated TE using JIDT core estimator: ' '{1:0.6f} (expected: {2:0.6f}).'.format(te, jidt_cmi, expected_mi)) assert np.isclose(te, jidt_cmi, atol=0.005), ( 'Estimated TE {0:0.6f} differs from JIDT estimate {1:0.6f} (expected: ' 'TE {2:0.6f}).'.format(te, jidt_cmi, expected_mi))
from idtxl.multivariate_te import MultivariateTE from idtxl.data import Data ## Use IDTxl's core esitmator if lags/embeddings are known # Generate high-dimensional example processes n = 1000 source_dim = 3 cond_dim = 2 target = np.random.randn(n) source = np.random.randn(n, source_dim) conditional = np.random.randn(n, cond_dim) settings = {} est = JidtKraskovCMI(settings) cmi = est.estimate(source, target, conditional) print(f'CMI estimate: {cmi:.4f}') ## Use IDTxl's network inference algorithm to optimize lags/embeddings # Generate test data, we assume that the processes represent sources, a target, # and additional processes, we want to condition on. For the conditioning, we # have to provide tuples of past variables plus a lag. data = Data(np.random.randn(5, n), dim_order='ps') target = 0 sources = [1, 2] cond_1_ind = 3 cond_2_ind = 4 cond_1_lag = 1 cond_2_lag = 1