Ejemplo n.º 1
0
def test_from_dict():
    pm = ParameterHelper(
        species=["O", "C", "H"],
        kernels=["twobody", "threebody"],
        allseparate=True,
        random=True,
        parameters={"cutoff_twobody": 7, "cutoff_threebody": 4.5, "cutoff_manybody": 3},
        verbose="debug",
    )
    hm = pm.as_dict()
    Parameters.check_instantiation(hm["hyps"], hm["cutoffs"], hm["kernels"], hm)

    pm1 = ParameterHelper.from_dict(hm, verbose="debug", init_spec=["O", "C", "H"])
    hm1 = pm1.as_dict()
    Parameters.compare_dict(hm, hm1)
Ejemplo n.º 2
0
    def update_bounds(self, GP):
        rebuild_container = False

        # double check the container and the GP is consistent
        if not Parameters.compare_dict(GP.hyps_mask, self.hyps_mask):
            rebuild_container = True

        lower_bound = self.bounds[0]
        min_dist = self.search_lower_bound(GP)
        # change lower bound only when there appears a smaller distance
        if lower_bound is None or min_dist < np.max(lower_bound):
            lower_bound = np.max((min_dist - self.lower_bound_relax, 0.0))
            rebuild_container = True

            warnings.warn(
                "The minimal distance in training data is lower than "
                f"the current lower bound, will reset lower bound to {lower_bound}"
            )

        upper_bound = self.bounds[1]
        if self.auto_upper or upper_bound is None:
            gp_cutoffs = Parameters.get_cutoff(self.kernel_name, self.species,
                                               GP.hyps_mask)
            if upper_bound is None or np.any(gp_cutoffs > upper_bound):
                upper_bound = gp_cutoffs
                rebuild_container = True

        if rebuild_container:
            self.set_bounds(lower_bound, upper_bound)
            self.build_map_container()
Ejemplo n.º 3
0
def test_from_dict():
    pm = ParameterHelper(species=['O', 'C', 'H'],
                         kernels=['twobody', 'threebody'],
                         allseparate=True,
                         random=True,
                         parameters={'cutoff_twobody': 7,
                                     'cutoff_threebody': 4.5,
                                     'cutoff_manybody': 3},
                         verbose="debug")
    hm = pm.as_dict()
    Parameters.check_instantiation(
        hm['hyps'], hm['cutoffs'], hm['kernels'], hm)

    pm1 = ParameterHelper.from_dict(
        hm, verbose="debug", init_spec=['O', 'C', 'H'])
    hm1 = pm1.as_dict()
    Parameters.compare_dict(hm, hm1)
Ejemplo n.º 4
0
    def predict(self, atom_env):

        assert Parameters.compare_dict(
            self.hyps_mask, atom_env.cutoffs_mask
        ), "GP.hyps_mask is not the same as atom_env.cutoffs_mask"

        f_spcs = np.zeros(3)
        vir_spcs = np.zeros(6)
        v_spcs = 0
        e_spcs = 0
        kern = 0

        if len(atom_env.bond_array_2) == 0:
            return f_spcs, vir_spcs, kern, v_spcs, e_spcs

        en_kernel, cutoffs, hyps, hyps_mask = self.kernel_info

        args = from_mask_to_args(hyps, cutoffs, hyps_mask)

        if self.var_map == "pca":
            kern = en_kernel(atom_env, atom_env, *args)

        spcs, comp_r, comp_xyz = self.get_arrays(atom_env)

        # predict for each species
        rebuild_spc = []
        new_bounds = []
        for i, spc in enumerate(spcs):
            lengths = np.array(comp_r[i])
            xyzs = np.array(comp_xyz[i])
            map_ind = self.find_map_index(spc)
            try:
                f, vir, v, e = self.maps[map_ind].predict(lengths, xyzs)
            except ValueError as err_msg:
                rebuild_spc.append(err_msg.args[0])
                new_bounds.append(err_msg.args[1])

            if len(rebuild_spc) > 0:
                raise ValueError(
                    rebuild_spc,
                    new_bounds,
                    f"The {self.kernel_name} map needs re-constructing.",
                )

            f_spcs += f
            vir_spcs += vir
            v_spcs += v
            e_spcs += e

        return f_spcs, vir_spcs, kern, v_spcs, e_spcs
Ejemplo n.º 5
0
def test_predict(all_gp, all_mgp, bodies, multihyps):
    """
    test the predict for mc_simple kernel
    """

    gp_model = all_gp[f"{bodies}{multihyps}"]
    mgp_model = all_mgp[f"{bodies}{multihyps}"]

    # # debug
    # filename = f'grid_{bodies}_{multihyps}.pickle'
    # with open(filename, 'rb') as f:
    #     mgp_model = pickle.load(f)

    nenv = 6
    cell = 1.0 * np.eye(3)
    cutoffs = gp_model.cutoffs
    unique_species = gp_model.training_statistics["species"]
    struc_test, f = get_random_structure(cell, unique_species, nenv)
    test_envi = env.AtomicEnvironment(struc_test,
                                      0,
                                      cutoffs,
                                      cutoffs_mask=gp_model.hyps_mask)

    if "2" in bodies:
        kernel_name = "twobody"
    elif "3" in bodies:
        kernel_name = "threebody"
        # compare_triplet(mgp_model.maps['threebody'], gp_model, test_envi)

    mgp_f, mgp_e_var, mgp_s, mgp_e = mgp_model.predict(test_envi)

    assert Parameters.compare_dict(gp_model.hyps_mask,
                                   mgp_model.maps[kernel_name].hyps_mask)

    if multihyps:
        gp_e, gp_e_var = gp_model.predict_local_energy_and_var(test_envi)
        gp_f, gp_f_var = gp_model.predict_force_xyz(test_envi)
    else:
        gp_e, gp_f, gp_s, gp_e_var, _, _ = gp_model.predict_efs(test_envi)
        gp_s = -gp_s[[0, 3, 5, 4, 2, 1]]

        # check stress
        assert np.allclose(mgp_s, gp_s, rtol=1e-2)

    # check mgp is within 2 meV/A of the gp
    print("mgp_en, gp_en", mgp_e, gp_e)
    assert np.allclose(mgp_e, gp_e, rtol=2e-3), (f"{bodies} body"
                                                 f" energy mapping is wrong")

    # check forces
    print("isclose?", mgp_f - gp_f, gp_f)
    assert np.allclose(mgp_f, gp_f,
                       atol=1e-3), f"{bodies} body force mapping is wrong"

    if mgp_model.var_map == "simple":
        print(bodies, multihyps)
        for i in range(struc_test.nat):
            test_envi = env.AtomicEnvironment(struc_test,
                                              i,
                                              cutoffs,
                                              cutoffs_mask=gp_model.hyps_mask)
            mgp_pred = mgp_model.predict(test_envi)
            mgp_var = mgp_pred[1]
            gp_var = predict_atom_diag_var(test_envi, gp_model, kernel_name)
            print("mgp_var, gp_var", mgp_var, gp_var)
            assert np.allclose(mgp_var, gp_var, rtol=1e-2)

    print("struc_test positions", struc_test.positions,
          struc_test.species_labels)
Ejemplo n.º 6
0
def test_predict(all_gp, all_mgp, bodies, multihyps):
    """
    test the predict for mc_simple kernel
    """

    gp_model = all_gp[f'{bodies}{multihyps}']
    mgp_model = all_mgp[f'{bodies}{multihyps}']

    # # debug
    # filename = f'grid_{bodies}_{multihyps}.pickle'
    # with open(filename, 'rb') as f:
    #     mgp_model = pickle.load(f)

    nenv = 6
    cell = 1.0 * np.eye(3)
    cutoffs = gp_model.cutoffs
    unique_species = gp_model.training_statistics['species']
    struc_test, f = get_random_structure(cell, unique_species, nenv)
    test_envi = env.AtomicEnvironment(struc_test,
                                      0,
                                      cutoffs,
                                      cutoffs_mask=gp_model.hyps_mask)

    if '2' in bodies:
        kernel_name = 'twobody'
    elif '3' in bodies:
        kernel_name = 'threebody'
        #compare_triplet(mgp_model.maps['threebody'], gp_model, test_envi)

    assert Parameters.compare_dict(gp_model.hyps_mask,
                                   mgp_model.maps[kernel_name].hyps_mask)

    gp_pred_en, gp_pred_envar = gp_model.predict_local_energy_and_var(
        test_envi)
    gp_pred = np.array([gp_model.predict(test_envi, d + 1)
                        for d in range(3)]).T
    print('mgp pred')
    mgp_pred = mgp_model.predict(test_envi)

    # check mgp is within 2 meV/A of the gp
    map_str = 'energy'
    gp_pred_var = gp_pred_envar
    print('mgp_en, gp_en', mgp_pred[3], gp_pred_en)
    assert(np.allclose(mgp_pred[3], gp_pred_en, rtol=2e-3), \
            f"{bodies} body {map_str} mapping is wrong")

    #    if multihyps and ('3' in bodies):
    #        pytest.skip()

    print('mgp_pred', mgp_pred[0])
    print('gp_pred', gp_pred[0])

    print("isclose?", mgp_pred[0] - gp_pred[0], gp_pred[0])
    assert(np.allclose(mgp_pred[0], gp_pred[0], atol=1e-3)), \
            f"{bodies} body {map_str} mapping is wrong"

    if mgp_model.var_map == 'simple':
        print(bodies, multihyps)
        for i in range(struc_test.nat):
            test_envi = env.AtomicEnvironment(struc_test,
                                              i,
                                              cutoffs,
                                              cutoffs_mask=gp_model.hyps_mask)
            mgp_pred = mgp_model.predict(test_envi)
            mgp_var = mgp_pred[1]
            gp_var = predict_atom_diag_var(test_envi, gp_model, kernel_name)
            print('mgp_var, gp_var', mgp_var, gp_var)
            assert np.allclose(mgp_var, gp_var, rtol=1e-2)

    print('struc_test positions', struc_test.positions,
          struc_test.species_labels)