Пример #1
0
def test_baseline():
    model = KineticImageModel.from_dict({
        'initial_concentration': {
            'j1': {
                'compartments': ['s1'],
                'parameters': ['2']
            },
        },
        'megacomplex': {
            'mc1': {
                'k_matrix': ['k1']
            },
        },
        'k_matrix': {
            "k1": {
                'matrix': {
                    ("s1", "s1"): '1',
                }
            }
        },
        'dataset': {
            'dataset1': {
                'initial_concentration': 'j1',
                'megacomplex': ['mc1'],
                'baseline': True,
            },
        },
    })

    parameter = ParameterGroup.from_list([
        101e-4,
        [1, {
            'vary': False,
            'non-negative': False
        }],
        [42, {
            'vary': False,
            'non-negative': False
        }],
    ])

    time = np.asarray(np.arange(0, 50, 1.5))
    dataset = model.dataset['dataset1'].fill(model, parameter)
    compartments, matrix = kinetic_image_matrix(dataset, time, 0)

    assert len(compartments) == 2
    assert compartments[1] == 'dataset1_baseline'

    assert matrix.shape == (time.size, 2)
    assert np.all(matrix[:, 1] == 1)
Пример #2
0
def kinetic_spectrum_matrix(dataset_descriptor=None, axis=None, index=None, irf=None):

    clp_label, matrix = kinetic_image_matrix(
        dataset_descriptor, axis, index, dataset_descriptor.irf
    )

    if isinstance(dataset_descriptor.irf, IrfGaussianCoherentArtifact):
        irf_clp_label, irf_matrix = dataset_descriptor.irf.calculate_coherent_artifact(axis)
        if matrix is None:
            clp_label = irf_clp_label
            matrix = irf_matrix
        else:
            clp_label += irf_clp_label
            matrix = np.concatenate((matrix, irf_matrix), axis=1)

    return (clp_label, matrix)
Пример #3
0
def test_baseline():
    model = KineticImageModel.from_dict(
        {
            "initial_concentration": {
                "j1": {"compartments": ["s1"], "parameters": ["2"]},
            },
            "megacomplex": {
                "mc1": {"k_matrix": ["k1"]},
            },
            "k_matrix": {
                "k1": {
                    "matrix": {
                        ("s1", "s1"): "1",
                    }
                }
            },
            "dataset": {
                "dataset1": {
                    "initial_concentration": "j1",
                    "megacomplex": ["mc1"],
                    "baseline": True,
                },
            },
        }
    )

    parameter = ParameterGroup.from_list(
        [
            101e-4,
            [1, {"vary": False, "non-negative": False}],
            [42, {"vary": False, "non-negative": False}],
        ]
    )

    time = np.asarray(np.arange(0, 50, 1.5))
    dataset = model.dataset["dataset1"].fill(model, parameter)
    compartments, matrix = kinetic_image_matrix(dataset, time, 0)

    assert len(compartments) == 2
    assert compartments[1] == "dataset1_baseline"

    assert matrix.shape == (time.size, 2)
    assert np.all(matrix[:, 1] == 1)
Пример #4
0
def calculate_doas_matrix(dataset_descriptor=None,
                          axis=None,
                          index=None,
                          irf=None):

    oscillations = _collect_oscillations(dataset_descriptor)
    matrix = np.zeros((axis.size, len(2 * oscillations)), dtype=np.float64)
    labels = [o.label for o in oscillations]
    # TODO: improve code reasability further
    clp = [
        lbl for o in zip([f"{l_cos}_cos" for l_cos in labels],
                         [f"{l_sin}_sin" for l_sin in labels]) for lbl in o
    ]

    delta = np.abs(axis[1:] - axis[:-1])
    delta_min = delta[np.argmin(delta)]
    frequency_max = 1 / (2 * 0.03 * delta_min)
    frequencies = np.asarray(
        [o.frequency * 0.03 * 2 * np.pi for o in oscillations])
    frequencies[frequencies >= frequency_max] = np.mod(
        frequencies[frequencies >= frequency_max], frequency_max)
    rates = np.asarray([o.rate for o in oscillations])

    if dataset_descriptor.irf is None:
        calculate_doas_matrix_no_irf(matrix, frequencies, rates, axis)
    elif isinstance(dataset_descriptor.irf, IrfMultiGaussian):
        centers, widths, scales, _, _ = dataset_descriptor.irf.parameter(index)
        calculate_doas_matrix_gaussian_irf(matrix, frequencies, rates, axis,
                                           centers, widths, scales)

    kinetic_clp, kinetic_matrix = kinetic_image_matrix(dataset_descriptor,
                                                       axis, index, irf)
    if kinetic_matrix is not None:
        clp = clp + kinetic_clp
        matrix = np.concatenate((matrix, kinetic_matrix), axis=1)
    return (clp, matrix)
def test_spectral_relation():
    model = KineticSpectrumModel.from_dict({
        'initial_concentration': {
            'j1': {
                'compartments': ['s1', 's2', 's3', 's4'],
                'parameters': ['i.1', 'i.2', 'i.3', 'i.4']
            },
        },
        'megacomplex': {
            'mc1': {
                'k_matrix': ['k1']
            },
        },
        'k_matrix': {
            "k1": {
                'matrix': {
                    ("s1", "s1"): 'kinetic.1',
                    ("s2", "s2"): 'kinetic.1',
                    ("s3", "s3"): 'kinetic.1',
                    ("s4", "s4"): 'kinetic.1',
                }
            }
        },
        'spectral_relations': [
            {
                'compartment': 's1',
                'target': 's2',
                'parameter': 'rel.1',
                'interval': [(0, 2)],
            },
            {
                'compartment': 's1',
                'target': 's3',
                'parameter': 'rel.2',
                'interval': [(0, 2)],
            },
        ],
        'dataset': {
            'dataset1': {
                'initial_concentration': 'j1',
                'megacomplex': ['mc1'],
            },
        },
    })
    print(model)

    rel1, rel2 = 10, 20
    parameter = ParameterGroup.from_dict({
        'kinetic': [1e-4],
        'i': [1, 2, 3, 4],
        'rel': [rel1, rel2],
    })

    time = np.asarray(np.arange(0, 50, 1.5))
    dataset = model.dataset['dataset1'].fill(model, parameter)
    compartments, matrix = kinetic_image_matrix(dataset, time, 0)

    assert len(compartments) == 4
    assert matrix.shape == (time.size, 4)

    reduced_compartments, relation_matrix = \
        create_spectral_relation_matrix(model, parameter, compartments, matrix, 1)

    print(relation_matrix)
    assert len(reduced_compartments) == 2
    assert relation_matrix.shape == (4, 2)
    assert np.array_equal(relation_matrix, [
        [1., 0.],
        [10., 0.],
        [20., 0.],
        [0., 1.],
    ])

    reduced_compartments, reduced_matrix = \
        model.constrain_matrix_function(parameter, compartments, matrix, 1)

    assert reduced_matrix.shape == (time.size, 2)

    print(reduced_matrix[0, 0], matrix[0, 0], matrix[0, 1], matrix[0, 2])
    assert np.allclose(
        reduced_matrix[:, 0],
        matrix[:, 0] + rel1 * matrix[:, 1] + rel2 * matrix[:, 2])

    clp = xr.DataArray([[1., 10., 20., 1]],
                       coords=(('spectral', [1]), ('clp_label',
                                                   ['s1', 's2', 's3', 's4'])))

    data = model.simulate('dataset1',
                          parameter,
                          clp=clp,
                          axes={
                              'time': time,
                              'spectral': np.array([1])
                          })

    result = model.optimize(parameter, {'dataset1': data}, max_nfev=1)

    result_data = result.data['dataset1']
    print(result_data.species_associated_spectra)
    assert result_data.species_associated_spectra.shape == (1, 4)
    assert result_data.species_associated_spectra[0, 1] == \
        rel1 * result_data.species_associated_spectra[0, 0]
    assert result_data.species_associated_spectra[0, 2] == \
        rel2 * result_data.species_associated_spectra[0, 0]
Пример #6
0
def test_spectral_relation():
    model = KineticSpectrumModel.from_dict({
        "initial_concentration": {
            "j1": {
                "compartments": ["s1", "s2", "s3", "s4"],
                "parameters": ["i.1", "i.2", "i.3", "i.4"],
            },
        },
        "megacomplex": {
            "mc1": {
                "k_matrix": ["k1"]
            },
        },
        "k_matrix": {
            "k1": {
                "matrix": {
                    ("s1", "s1"): "kinetic.1",
                    ("s2", "s2"): "kinetic.1",
                    ("s3", "s3"): "kinetic.1",
                    ("s4", "s4"): "kinetic.1",
                }
            }
        },
        "spectral_relations": [
            {
                "compartment": "s1",
                "target": "s2",
                "parameter": "rel.1",
                "interval": [(0, 2)],
            },
            {
                "compartment": "s1",
                "target": "s3",
                "parameter": "rel.2",
                "interval": [(0, 2)],
            },
        ],
        "dataset": {
            "dataset1": {
                "initial_concentration": "j1",
                "megacomplex": ["mc1"],
            },
        },
    })
    print(model)

    rel1, rel2 = 10, 20
    parameter = ParameterGroup.from_dict({
        "kinetic": [1e-4],
        "i": [1, 2, 3, 4],
        "rel": [rel1, rel2],
    })

    time = np.asarray(np.arange(0, 50, 1.5))
    dataset = model.dataset["dataset1"].fill(model, parameter)
    compartments, matrix = kinetic_image_matrix(dataset, time, 0)

    assert len(compartments) == 4
    assert matrix.shape == (time.size, 4)

    reduced_compartments, relation_matrix = create_spectral_relation_matrix(
        model, parameter, compartments, matrix, 1)

    print(relation_matrix)
    assert len(reduced_compartments) == 2
    assert relation_matrix.shape == (4, 2)
    assert np.array_equal(
        relation_matrix,
        [
            [1.0, 0.0],
            [10.0, 0.0],
            [20.0, 0.0],
            [0.0, 1.0],
        ],
    )

    reduced_compartments, reduced_matrix = model.constrain_matrix_function(
        parameter, compartments, matrix, 1)

    assert reduced_matrix.shape == (time.size, 2)

    print(reduced_matrix[0, 0], matrix[0, 0], matrix[0, 1], matrix[0, 2])
    assert np.allclose(
        reduced_matrix[:, 0],
        matrix[:, 0] + rel1 * matrix[:, 1] + rel2 * matrix[:, 2])

    clp = xr.DataArray([[1.0, 10.0, 20.0, 1]],
                       coords=(("spectral", [1]), ("clp_label",
                                                   ["s1", "s2", "s3", "s4"])))

    data = model.simulate("dataset1",
                          parameter,
                          clp=clp,
                          axes={
                              "time": time,
                              "spectral": np.array([1])
                          })

    result = model.optimize(parameter, {"dataset1": data}, max_nfev=1)

    result_data = result.data["dataset1"]
    print(result_data.species_associated_spectra)
    assert result_data.species_associated_spectra.shape == (1, 4)
    assert (result_data.species_associated_spectra[0, 1] == rel1 *
            result_data.species_associated_spectra[0, 0])
    assert (result_data.species_associated_spectra[0, 2] == rel2 *
            result_data.species_associated_spectra[0, 0])
Пример #7
0
def test_spectral_constraint():
    model = KineticSpectrumModel.from_dict({
        "initial_concentration": {
            "j1": {
                "compartments": ["s1", "s2"],
                "parameters": ["i.1", "i.2"],
            },
        },
        "megacomplex": {
            "mc1": {
                "k_matrix": ["k1"]
            },
        },
        "k_matrix": {
            "k1": {
                "matrix": {
                    ("s2", "s1"): "kinetic.1",
                    ("s2", "s2"): "kinetic.2",
                }
            }
        },
        "spectral_constraints": [
            {
                "type": "zero",
                "compartment": "s2",
                "interval": (float("-inf"), float("inf"))
            },
        ],
        "dataset": {
            "dataset1": {
                "initial_concentration": "j1",
                "megacomplex": ["mc1"],
            },
        },
    })
    print(model)

    wanted_parameters = ParameterGroup.from_dict({
        "kinetic": [1e-4, 1e-5],
        "i": [1, 2],
    })
    initial_parameters = ParameterGroup.from_dict({
        "kinetic": [2e-4, 2e-5],
        "i": [1, 2, {
            "vary": False
        }],
    })

    time = np.asarray(np.arange(0, 50, 1.5))
    dataset = model.dataset["dataset1"].fill(model, wanted_parameters)
    compartments, matrix = kinetic_image_matrix(dataset, time, 0)

    assert len(compartments) == 2
    assert matrix.shape == (time.size, 2)

    reduced_compartments, reduced_matrix = apply_spectral_constraints(
        model, compartments, matrix, 1)

    print(reduced_matrix)
    assert len(reduced_compartments) == 1
    assert reduced_matrix.shape == (time.size, 1)

    reduced_compartments, reduced_matrix = model.constrain_matrix_function(
        "dataset1", wanted_parameters, compartments, matrix, 1)

    assert reduced_matrix.shape == (time.size, 1)

    clp = xr.DataArray([[1.0, 10.0, 20.0, 1]],
                       coords=(("spectral", [1]), ("clp_label",
                                                   ["s1", "s2", "s3", "s4"])))

    data = model.simulate("dataset1",
                          wanted_parameters,
                          clp=clp,
                          axes={
                              "time": time,
                              "spectral": np.array([1])
                          })

    dataset = {"dataset1": data}
    scheme = Scheme(model=model,
                    parameters=initial_parameters,
                    data=dataset,
                    nfev=20)

    # the resulting jacobian is singular
    with pytest.warns(UserWarning):
        result = optimize(scheme)

    result_data = result.data["dataset1"]
    print(result_data.clp_label)
    print(result_data.clp)
    #  TODO: save reduced clp
    #  assert result_data.clp.shape == (1, 1)

    print(result_data.species_associated_spectra)
    assert result_data.species_associated_spectra.shape == (1, 2)
    assert result_data.species_associated_spectra[0, 1] == 0