def test_lnprob_calculates_multi_phase_probability_for_success(datasets_db): """lnprob() successfully calculates the probability for equilibrium """ datasets_db.insert(zpf_json) from espei.utils import eq_callables_dict from pycalphad import Model import sympy comps = ['CU', 'MG', 'VA'] phases = ['LIQUID', 'FCC_A1', 'HCP_A3', 'LAVES_C15', 'CUMG2'] param = 'VV0001' eq_callables = eq_callables_dict( dbf, comps, phases, model=Model, param_symbols=sorted([sympy.Symbol(sym) for sym in [param]], key=str)) eq_callables['phase_models'] = eq_callables.pop('model') orig_val = dbf.symbols.pop(param) res = lnprob([10], comps=comps, dbf=dbf, phases=phases, datasets=datasets_db, symbols_to_fit=[param], scheduler=None, **eq_callables) # replace the value in the database # TODO: make a fixture for this dbf.symbols[param] = orig_val assert np.isreal(res) assert np.isclose(res, -5741.61962949)
def test_lnprob_does_not_raise_on_ValueError(datasets_db): """lnprob() should catch ValueError raised by equilibrium and return -np.inf""" datasets_db.insert(zpf_json) res = lnprob([10], comps=['CU','MG', 'VA'], dbf=dbf, phases=['LIQUID', 'FCC_A1', 'HCP_A3', 'LAVES_C15', 'CUMG2'], datasets=datasets_db, symbols_to_fit=['VV0001'], phase_models=None, scheduler=None) assert np.isneginf(res)
def test_lnprob_calculates_probability_for_success(datasets_db): """lnprob() successfully calculates the probability for equilibrium """ datasets_db.insert(zpf_json) res = lnprob([10], comps=['CU','MG', 'VA'], dbf=dbf, phases=['LIQUID', 'FCC_A1', 'HCP_A3', 'LAVES_C15', 'CUMG2'], datasets=datasets_db, symbols_to_fit=['VV0001'], phase_models=None, scheduler=None) assert np.isreal(res) assert np.isclose(res, -5740.542839073727)
def test_mixing_energies_are_fit(datasets_db): """Tests that given mixing energy data, the excess parameter is fit.""" phase_models = { "components": ["AL", "B"], "phases": { "LIQUID": { "sublattice_model": [["AL", "B"]], "sublattice_site_ratios": [1] }, "FCC_A1": { "sublattice_model": [["AL", "B"]], "sublattice_site_ratios": [1] } } } dataset_excess_mixing = { "components": ["AL", "B"], "phases": ["FCC_A1"], "solver": { "sublattice_site_ratios": [1], "sublattice_occupancies": [[[0.5, 0.5]]], "sublattice_configurations": [[["AL", "B"]]], "mode": "manual" }, "conditions": { "P": 101325, "T": 298.15 }, "output": "HM_MIX", "values": [[[-10000]]] } datasets_db.insert(dataset_excess_mixing) dbf = generate_parameters(phase_models, datasets_db, 'SGTE91', 'linear') assert dbf.elements == {'AL', 'B'} assert set(dbf.phases.keys()) == {'LIQUID', 'FCC_A1'} assert len(dbf._parameters.search(where('parameter_type') == 'L')) == 1 assert dbf.symbols['VV0000'] == -40000 # check that read/write is ok read_dbf = dbf.from_string(dbf.to_string(fmt='tdb'), fmt='tdb') assert read_dbf.elements == {'AL', 'B'} assert set(read_dbf.phases.keys()) == {'LIQUID', 'FCC_A1'} assert len( read_dbf._parameters.search(where('parameter_type') == 'L')) == 1 # the error should be exactly 0 because we are only fitting to one point from espei.error_functions import calculate_thermochemical_error assert calculate_thermochemical_error(read_dbf, sorted(dbf.elements), sorted(dbf.phases.keys()), datasets_db) == 0
def test_lnprob_calculates_single_phase_probability_for_success(datasets_db): """lnprob() succesfully calculates the probability from single phase data""" datasets_db.insert(single_phase_json) res = lnprob( [10], comps=['CU', 'MG', 'VA'], dbf=dbf, phases=['LIQUID', 'FCC_A1', 'HCP_A3', 'LAVES_C15', 'CUMG2'], datasets=datasets_db, symbols_to_fit=['VV0001'], phase_models=None, scheduler=None, ) assert np.isreal(res) assert np.isclose(res, -19859.38)
def test_mixing_energies_are_fit(datasets_db): """Tests that given mixing energy data, the excess parameter is fit.""" phase_models = { "components": ["AL", "B"], "phases": { "LIQUID": { "sublattice_model": [["AL", "B"]], "sublattice_site_ratios": [1] }, "FCC_A1": { "sublattice_model": [["AL", "B"]], "sublattice_site_ratios": [1] } } } dataset_excess_mixing = { "components": ["AL", "B"], "phases": ["FCC_A1"], "solver": { "sublattice_site_ratios": [1], "sublattice_occupancies": [[[0.5, 0.5]]], "sublattice_configurations": [[["AL", "B"]]], "mode": "manual" }, "conditions": { "P": 101325, "T": 298.15 }, "output": "HM_MIX", "values": [[[-10000]]] } datasets_db.insert(dataset_excess_mixing) dbf = generate_parameters(phase_models, datasets_db, 'SGTE91', 'linear') assert dbf.elements == {'AL', 'B'} assert set(dbf.phases.keys()) == {'LIQUID', 'FCC_A1'} assert len(dbf._parameters.search(where('parameter_type') == 'L')) == 1 # check that read/write is ok read_dbf = dbf.from_string(dbf.to_string(fmt='tdb'), fmt='tdb') assert read_dbf.elements == {'AL', 'B'} assert set(read_dbf.phases.keys()) == {'LIQUID', 'FCC_A1'} assert len( read_dbf._parameters.search(where('parameter_type') == 'L')) == 1
def test_mixing_data_is_excess_only(datasets_db): """Tests that given an entropy of mixing datapoint of 0, no excess parameters are fit (meaning datasets do not include ideal mixing).""" phase_models = { "components": ["AL", "B"], "phases": { "LIQUID": { "sublattice_model": [["AL", "B"]], "sublattice_site_ratios": [1] }, "FCC_A1": { "sublattice_model": [["AL", "B"]], "sublattice_site_ratios": [1] } } } dataset_excess_mixing = { "components": ["AL", "B"], "phases": ["FCC_A1"], "solver": { "sublattice_site_ratios": [1], "sublattice_occupancies": [[[0.5, 0.5]]], "sublattice_configurations": [[["AL", "B"]]], "mode": "manual" }, "conditions": { "P": 101325, "T": 298.15 }, "output": "SM_MIX", "values": [[[0]]] } datasets_db.insert(dataset_excess_mixing) dbf = generate_parameters(phase_models, datasets_db, 'SGTE91', 'linear') assert dbf.elements == {'AL', 'B'} assert set(dbf.phases.keys()) == {'LIQUID', 'FCC_A1'} assert len(dbf._parameters.search(where('parameter_type') == 'L')) == 0
def test_multi_sublattice_mixing_energies_are_fit(datasets_db): """Tests the correct excess parameter is fit for phases with multiple sublattices with vacancies.""" phase_models = { "components": ["AL", "B", "VA"], "phases": { "FCC_A1": { "sublattice_model": [["AL", "B"], ["AL", "VA"]], "sublattice_site_ratios": [1, 3] } } } dataset_excess_mixing = { "components": ["AL", "B", "VA"], "phases": ["FCC_A1"], "solver": { "sublattice_site_ratios": [1, 3], "sublattice_occupancies": [[[0.5, 0.5], 1], [[0.5, 0.5], 1]], "sublattice_configurations": [[["AL", "B"], "VA"], [["AL", "B"], "AL"]], "mode": "manual" }, "conditions": { "P": 101325, "T": 298.15 }, "output": "HM_MIX", "values": [[[-10000, -10000]]] } datasets_db.insert(dataset_excess_mixing) dbf = generate_parameters(phase_models, datasets_db, 'SGTE91', 'linear') assert set(dbf.phases.keys()) == {'FCC_A1'} assert len(dbf._parameters.search(where('parameter_type') == 'L')) == 2 assert dbf.symbols['VV0000'] == -160000.0 assert dbf.symbols['VV0001'] == -40000.0