def test_C2_watson_gamma_equals_gamma_watson(): scheme = wu_minn_hcp_acquisition_scheme() cylinder = cylinder_models.C2CylinderStejskalTannerApproximation() watsoncyl = distribute_models.SD1WatsonDistributed([cylinder]) gammawatsoncyl = distribute_models.DD1GammaDistributed( [watsoncyl], target_parameter='C2CylinderStejskalTannerApproximation_1_diameter') param_name = 'C2CylinderStejskalTannerApproximation_1_lambda_par' params1 = { 'SD1WatsonDistributed_1_' + param_name: 1.7e-9, 'DD1Gamma_1_alpha': 2., 'DD1Gamma_1_beta': 4e-6, 'SD1WatsonDistributed_1_SD1Watson_1_odi': 0.4, 'SD1WatsonDistributed_1_SD1Watson_1_mu': [0., 0.] } gammacyl = distribute_models.DD1GammaDistributed([cylinder]) watsongammacyl = distribute_models.SD1WatsonDistributed([gammacyl]) params2 = { 'DD1GammaDistributed_1_' + param_name: 1.7e-9, 'DD1GammaDistributed_1_DD1Gamma_1_alpha': 2., 'DD1GammaDistributed_1_DD1Gamma_1_beta': 4e-6, 'SD1Watson_1_odi': 0.4, 'SD1Watson_1_mu': [0., 0.] } assert_array_almost_equal(watsongammacyl(scheme, **params2), gammawatsoncyl(scheme, **params1), 5)
def test_multi_tissue_mc_model(): scheme = wu_minn_hcp_acquisition_scheme() ball = gaussian_models.G1Ball() cyl = cylinder_models.C1Stick() models = [ball, cyl] S0_responses = [1., 2.] mt_mc = modeling_framework.MultiCompartmentModel( models=models, S0_tissue_responses=S0_responses) mt_mc.set_fixed_parameter('C1Stick_1_lambda_par', 1.7e-9) mt_mc.set_fixed_parameter('G1Ball_1_lambda_iso', 3e-9) mt_mc.set_fixed_parameter('C1Stick_1_mu', [0., 0.]) param_dict = {'partial_volume_0': .5, 'partial_volume_1': .5} E = mt_mc.simulate_signal(scheme, param_dict) mt_mc_fit = mt_mc.fit(scheme, E) sig_fracts = mt_mc_fit.fitted_parameters vol_fracts = mt_mc_fit.fitted_multi_tissue_fractions vol_fracts_norm = mt_mc_fit.fitted_multi_tissue_fractions_normalized assert_almost_equal( sig_fracts['partial_volume_0'], vol_fracts['partial_volume_0'], 2) assert_almost_equal( sig_fracts['partial_volume_1'], vol_fracts['partial_volume_1'] * 2., 2) assert_almost_equal( vol_fracts_norm['partial_volume_0'], 2 / 3., 2) assert_almost_equal( vol_fracts_norm['partial_volume_1'], 1 / 3., 2)
def test_acq_scheme_without_deltas_model_catch(): scheme = wu_minn_hcp_acquisition_scheme() test_data = np.random.rand(len(scheme.bvalues)) scheme_clinical = acquisition_scheme_from_bvalues( scheme.bvalues, scheme.gradient_directions) mc_model = MultiCompartmentModel([C4CylinderGaussianPhaseApproximation()]) assert_raises(ValueError, mc_model.fit, scheme_clinical, test_data)
def test_all_models_dispersable(): scheme = wu_minn_hcp_acquisition_scheme() dispersable_models = [ [cylinder_models.C1Stick()], [cylinder_models.C2CylinderStejskalTannerApproximation()], [cylinder_models.C3CylinderCallaghanApproximation()], [cylinder_models.C4CylinderGaussianPhaseApproximation()], [gaussian_models.G1Ball(), gaussian_models.G2Zeppelin()], [gaussian_models.G3TemporalZeppelin()], [sphere_models.S1Dot(), gaussian_models.G2Zeppelin()], [ sphere_models.S2SphereStejskalTannerApproximation(), gaussian_models.G2Zeppelin() ] ] spherical_distributions = [ distribute_models.SD1WatsonDistributed, distribute_models.SD2BinghamDistributed ] for model in dispersable_models: for distribution in spherical_distributions: dist_mod = distribution(model) params = {} for param, card in dist_mod.parameter_cardinality.items(): params[param] = np.random.rand( card) * dist_mod.parameter_scales[param] assert_equal(isinstance(dist_mod(scheme, **params), np.ndarray), True)
def test_all_models_dispersable(): scheme = wu_minn_hcp_acquisition_scheme() dispersable_models = [ cylinder_models.C1Stick, cylinder_models.C2CylinderSodermanApproximation, cylinder_models.C3CylinderCallaghanApproximation, cylinder_models.C4CylinderGaussianPhaseApproximation, gaussian_models.G2Zeppelin, gaussian_models.G3RestrictedZeppelin ] spherical_distributions = [ distribute_models.SD1WatsonDistributed, distribute_models.SD2BinghamDistributed ] for model in dispersable_models: for distribution in spherical_distributions: mod = model() dist_mod = distribution([mod]) params = {} for param, card in dist_mod.parameter_cardinality.items(): params[param] = np.random.rand( card) * dist_mod.parameter_scales[param] assert_equal(isinstance(dist_mod(scheme, **params), np.ndarray), True)
def test_acquisition_scheme_pruning(): scheme = wu_minn_hcp_acquisition_scheme() test_data = np.random.rand(len(scheme.bvalues)) scheme_pr, data_pr = scheme.return_pruned_acquisition_scheme([2], test_data) assert_array_equal(scheme_pr.bvalues, scheme.bvalues[scheme.shell_indices == 2]) assert_array_equal(data_pr, test_data[scheme.shell_indices == 2])
def test_raise_mix_with_tortuosity_in_mcmodel(): scheme = wu_minn_hcp_acquisition_scheme() stick = cylinder_models.C1Stick() zeppelin = gaussian_models.G2Zeppelin() mc = modeling_framework.MultiCompartmentModel([stick, zeppelin]) mc.set_tortuous_parameter('G2Zeppelin_1_lambda_perp', 'C1Stick_1_lambda_par', 'partial_volume_0', 'partial_volume_1') data = stick(scheme, lambda_par=1.7e-9, mu=[0., 0.]) assert_raises(ValueError, mc.fit, scheme, data, solver='mix')
def test_amico(lambda_1=[0, 0.0001], lambda_2=[0, 0.0000001], Nt=12): """Tests amico optimizer.""" """ Arguments: lambda_1: list list of L1 regularization constants for each compartment lambda_2: list list of L2 regularization constants for each compartment Nt: int number of samples for tessellation of parameter range """ mc_model = create_noddi_watson_model() scheme_hcp = saved_acquisition_schemes.wu_minn_hcp_acquisition_scheme() grid_params = [ p for p in mc_model.parameter_names if not p.endswith('mu') and not p.startswith('partial_volume') ] x0_len = 0 for m_idx in range(len(mc_model.models)): m_atoms = 1 for p in mc_model.models[m_idx].parameter_names: if mc_model.model_names[m_idx] + p in grid_params: m_atoms *= Nt x0_len += m_atoms x0_vector = np.zeros(x0_len) amico_opt = amico_cvxpy.AmicoCvxpyOptimizer(mc_model, scheme_hcp, x0_vector=x0_vector, lambda_1=lambda_1, lambda_2=lambda_2) signals, gt, dirs = simulate_signals(mc_model, scheme_hcp) v_iso_estim = np.zeros(signals.shape[0]) v_ic_estim = np.zeros(signals.shape[0]) od_estim = np.zeros(signals.shape[0]) for i in range(signals.shape[0]): model_dirs = [dirs[i, :]] M, grid, idx = \ forward_model_matrix(mc_model, scheme_hcp, model_dirs, Nt) parameters = amico_opt(signals[i, :], M, grid, idx) v_iso_estim[i] = parameters[0] od_estim[i] = parameters[2] v_ic_estim[i] = parameters[3] assert_almost_equal(v_iso_estim, gt['partial_volume_0'], 2) assert_almost_equal(v_ic_estim, gt['SD1WatsonDistributed_1_partial_volume_0'], 2) assert_almost_equal(od_estim, gt['SD1WatsonDistributed_1_SD1Watson_1_odi'], 1)
def test_C4_watson_gamma_equals_gamma_watson(): scheme = wu_minn_hcp_acquisition_scheme() cylinder = cylinder_models.C4CylinderGaussianPhaseApproximation() watsoncyl = distribute_models.SD1WatsonDistributed([cylinder]) gammawatsoncyl = distribute_models.DD1GammaDistributed( [watsoncyl], target_parameter='C4CylinderGaussianPhaseApproximation_1_diameter') param = 'SD1WatsonDistributed_1_C4CylinderGaussianPhaseApproximation' param += '_1_lambda_par' params1 = { param: 1.7e-9, 'DD1Gamma_1_alpha': 2., 'DD1Gamma_1_beta': 4e-6, 'SD1WatsonDistributed_1_SD1Watson_1_odi': 0.4, 'SD1WatsonDistributed_1_SD1Watson_1_mu': [0., 0.] } gammacyl = distribute_models.DD1GammaDistributed([cylinder]) watsongammacyl = distribute_models.SD1WatsonDistributed( [gammacyl], target_parameter='C4CylinderGaussianPhaseApproximation_1_mu') param = 'DD1GammaDistributed_1_C4CylinderGaussianPhaseApproximation' param += '_1_lambda_par' params2 = { param: 1.7e-9, 'DD1GammaDistributed_1_DD1Gamma_1_alpha': 2., 'DD1GammaDistributed_1_DD1Gamma_1_beta': 4e-6, 'SD1Watson_1_odi': 0.4, 'SD1Watson_1_mu': [0., 0.] } assert_array_almost_equal(watsongammacyl(scheme, **params2), gammawatsoncyl(scheme, **params1), 5)
def test_all_models_distributable(): scheme = wu_minn_hcp_acquisition_scheme() distributable_models = [ plane_models.P3PlaneCallaghanApproximation, cylinder_models.C2CylinderStejskalTannerApproximation, cylinder_models.C3CylinderCallaghanApproximation, cylinder_models.C4CylinderGaussianPhaseApproximation, sphere_models.S2SphereStejskalTannerApproximation ] spatial_distributions = [distribute_models.DD1GammaDistributed] for model in distributable_models: for distribution in spatial_distributions: mod = model() dist_mod = distribution([mod]) params = {} for param, card in dist_mod.parameter_cardinality.items(): params[param] = np.random.rand( card) * dist_mod.parameter_scales[param] assert_equal(isinstance(dist_mod(scheme, **params), np.ndarray), True)
from dmipy.signal_models import cylinder_models, gaussian_models from dmipy.core import modeling_framework from dmipy.data.saved_acquisition_schemes import ( wu_minn_hcp_acquisition_scheme) from numpy.testing import assert_almost_equal scheme = wu_minn_hcp_acquisition_scheme() def test_multi_tissue_mc_model(): scheme = wu_minn_hcp_acquisition_scheme() ball = gaussian_models.G1Ball() cyl = cylinder_models.C1Stick() models = [ball, cyl] S0_responses = [1., 2.] mt_mc = modeling_framework.MultiCompartmentModel( models=models, S0_tissue_responses=S0_responses) mt_mc.set_fixed_parameter('C1Stick_1_lambda_par', 1.7e-9) mt_mc.set_fixed_parameter('G1Ball_1_lambda_iso', 3e-9) mt_mc.set_fixed_parameter('C1Stick_1_mu', [0., 0.]) param_dict = {'partial_volume_0': .5, 'partial_volume_1': .5} E = mt_mc.simulate_signal(scheme, param_dict) mt_mc_fit = mt_mc.fit(scheme, E) sig_fracts = mt_mc_fit.fitted_parameters vol_fracts = mt_mc_fit.fitted_multi_tissue_fractions vol_fracts_norm = mt_mc_fit.fitted_multi_tissue_fractions_normalized assert_almost_equal( sig_fracts['partial_volume_0'], vol_fracts['partial_volume_0'], 2)