Esempio n. 1
0
def test_physical_model_from_data(mock_physical_params, mock_exp, test_reflections):
    """Test that it passes the correct dict to physical model."""
    physicalmodel = PhysicalScalingModel.from_data(
        mock_physical_params, mock_exp, test_reflections
    )
    assert physicalmodel.configdict["lmax"] == (mock_physical_params.physical.lmax)
    assert physicalmodel.components["absorption"].n_params == 24
    assert list(physicalmodel.components["absorption"].parameters) == [0.0] * 24
Esempio n. 2
0
def test_model_creation_from_data(default_params, mock_exp, test_reflections):
    """Test the factory creation of the three standard scaling models with the
    default params."""

    _ = KBScalingModel.from_data(default_params, [], [])

    _ = PhysicalScalingModel.from_data(default_params, mock_exp, test_reflections)

    _ = ArrayScalingModel.from_data(default_params, mock_exp, test_reflections)
Esempio n. 3
0
def test_physical_model_from_data(mock_physical_params, mock_exp,
                                  test_reflections):
    """Test that it passes the correct dict to physical model."""
    physicalmodel = PhysicalScalingModel.from_data(mock_physical_params,
                                                   mock_exp, test_reflections)
    assert physicalmodel.configdict["lmax"] == (
        mock_physical_params.physical.lmax)
    assert physicalmodel.components["absorption"].n_params == 24
    assert list(
        physicalmodel.components["absorption"].parameters) == [0.0] * 24

    # test updating the absorption parameters
    mock_physical_params.physical.absorption_level = "high"
    physicalmodel.update(mock_physical_params)
    assert len(physicalmodel.components["absorption"].parameters) == 48
    assert physicalmodel.configdict["abs_surface_weight"] == 5e3

    mock_physical_params.physical.absorption_level = "medium"
    physicalmodel.update(mock_physical_params)
    assert len(physicalmodel.components["absorption"].parameters) == 48
    assert physicalmodel.configdict["abs_surface_weight"] == 5e4

    mock_physical_params.physical.absorption_level = None
    mock_physical_params.physical.lmax = 4
    physicalmodel.update(mock_physical_params)
    assert len(physicalmodel.components["absorption"].parameters) == 24
    assert physicalmodel.configdict["abs_surface_weight"] == 5e4

    mock_physical_params.physical.surface_weight = 1e5
    physicalmodel.update(mock_physical_params)
    assert len(physicalmodel.components["absorption"].parameters) == 24
    assert physicalmodel.configdict["abs_surface_weight"] == 1e5

    # try fixing a parameter
    mock_physical_params.physical.correction.fix = ["decay"]
    physicalmodel = PhysicalScalingModel.from_data(mock_physical_params,
                                                   mock_exp, test_reflections)
    assert physicalmodel.configdict["lmax"] == (
        mock_physical_params.physical.lmax)
    assert physicalmodel.components["absorption"].n_params == 24
    assert list(
        physicalmodel.components["absorption"].parameters) == [0.0] * 24
    assert physicalmodel.fixed_components == ["decay"]
def test_create_scaling_model():
    """Test the create scaling model function."""

    # Test that one can create the correct scaling model with the phil param.
    for m in ["physical", "array", "KB"]:
        params = generated_param()
        exp = generated_exp()
        rt = generated_refl()
        params.model = m
        new_exp = create_scaling_model(params, exp, [rt])
        assert new_exp[0].scaling_model.id_ == m

    # If a scaling model already exists, then nothing else should happen.
    params = generated_param()
    exp = generated_exp()
    rt = generated_refl()
    exp[0].scaling_model = PhysicalScalingModel.from_data(params, exp[0], rt)
    old_scaling_model = exp[0].scaling_model
    params.model = "KB"
    new_exp = create_scaling_model(params, exp, [rt])
    new_scaling_model = new_exp[0].scaling_model
    assert new_scaling_model is old_scaling_model  # Should not modify original.

    # Test multiple datasets, where one already has a scaling model.
    exp = generated_exp(3)
    params = generated_param()
    rt = generated_refl()
    rt_2 = generated_refl()
    rt_3 = generated_refl()
    exp[0].scaling_model = PhysicalScalingModel.from_data(params, exp[0], rt)
    params.model = "KB"
    new_exp = create_scaling_model(params, exp, [rt, rt_2, rt_3])
    assert new_exp[0].scaling_model is exp[0].scaling_model
    assert isinstance(new_exp[1].scaling_model, KBScalingModel)
    assert isinstance(new_exp[2].scaling_model, KBScalingModel)

    # Now test overwrite_existing_models option
    params.overwrite_existing_models = True
    params.model = "physical"
    newer_exp = create_scaling_model(params, new_exp, [rt, rt_2, rt_3])
    for exp in newer_exp:
        assert isinstance(exp.scaling_model, PhysicalScalingModel)
Esempio n. 5
0
def test_target_gradient_calculation_finite_difference(small_reflection_table,
                                                       single_exp,
                                                       physical_param):
    """Test the calculated gradients against a finite difference calculation."""
    model = PhysicalScalingModel.from_data(physical_param, single_exp,
                                           small_reflection_table)

    # need to 'add_data'
    model.configure_components(small_reflection_table, single_exp,
                               physical_param)
    model.components["scale"].update_reflection_data()
    model.components["decay"].update_reflection_data()
    apm = multi_active_parameter_manager(
        ScalingTarget(),
        [model.components],
        [["scale", "decay"]],
        scaling_active_parameter_manager,
    )
    model.components["scale"].inverse_scales = flex.double([2.0, 1.0, 2.0])
    model.components["decay"].inverse_scales = flex.double([1.0, 1.0, 0.4])

    Ih_table = IhTable([small_reflection_table],
                       single_exp.crystal.get_space_group())

    with patch.object(SingleScaler, "__init__", lambda x, y, z, k: None):
        scaler = SingleScaler(None, None, None)
        scaler._Ih_table = Ih_table

        # Now do finite difference check.
        target = ScalingTarget()

        scaler.update_for_minimisation(apm, 0)
        grad = target.calculate_gradients(scaler.Ih_table.blocked_data_list[0])
        res = target.calculate_residuals(scaler.Ih_table.blocked_data_list[0])

        assert (res >
                1e-8), """residual should not be zero, or the gradient test
        below will not really be working!"""

        # Now compare to finite difference
        f_d_grad = calculate_gradient_fd(target, scaler, apm)
        print(list(f_d_grad))
        print(list(grad))
        assert list(grad) == pytest.approx(list(f_d_grad))

        sel = f_d_grad > 1e-8
        assert sel, """assert sel has some elements, as finite difference grad should
Esempio n. 6
0
def test_target_jacobian_calculation_finite_difference(physical_param,
                                                       single_exp,
                                                       large_reflection_table):
    """Test the calculated jacobian against a finite difference calculation."""
    physical_param.physical.decay_correction = False
    model = PhysicalScalingModel.from_data(physical_param, single_exp,
                                           large_reflection_table)
    # need to 'add_data'
    model.configure_components(large_reflection_table, single_exp,
                               physical_param)
    model.components["scale"].update_reflection_data()
    apm = multi_active_parameter_manager(
        ScalingTarget(),
        [model.components],
        [["scale"]],
        scaling_active_parameter_manager,
    )
    Ih_table = IhTable([large_reflection_table],
                       single_exp.crystal.get_space_group())

    with patch.object(SingleScaler, "__init__", lambda x, y, z, k: None):
        scaler = SingleScaler(None, None, None)
        scaler._Ih_table = Ih_table

        target = ScalingTarget()
        scaler.update_for_minimisation(apm, 0)

        fd_jacobian = calculate_jacobian_fd(target, scaler, apm)
        r, jacobian, w = target.compute_residuals_and_gradients(
            scaler.Ih_table.blocked_data_list[0])
        assert r == pytest.approx(
            [-50.0 / 3.0, 70.0 / 3.0, -20.0 / 3.0, 12.5, -2.5] +
            [-25.0, 0.0, -75.0, 0.0, 200.0])
        assert w == pytest.approx(
            [0.1, 0.1, 0.1, 0.02, 0.1, 0.02, 0.01, 0.02, 0.01, 0.01])

        n_rows = jacobian.n_rows
        n_cols = jacobian.n_cols

        print(jacobian)
        print(fd_jacobian)

        for i in range(0, n_rows):
            for j in range(0, n_cols):
                assert jacobian[i, j] == pytest.approx(fd_jacobian[i, j],
                                                       abs=1e-4)