def test_slatm_local_representation(): files = ["qm7/0001.xyz", "qm7/0002.xyz", "qm7/0003.xyz", "qm7/0004.xyz", "qm7/0005.xyz", "qm7/0006.xyz", "qm7/0007.xyz", "qm7/0008.xyz", "qm7/0009.xyz", "qm7/0010.xyz"] path = os.path.dirname(os.path.realpath(__file__)) mols = [] for xyz_file in files: mol = qml.data.Compound(xyz=path + "/" + xyz_file) mols.append(mol) mbtypes = get_slatm_mbtypes(np.array([mol.nuclear_charges for mol in mols])) for i, mol in enumerate(mols): mol.generate_slatm(mbtypes, local=True) X_qml = [] for i, mol in enumerate(mols): for rep in mol.representation: X_qml.append(rep) X_qml = np.asarray(X_qml) X_ref = np.loadtxt(path + "/data/slatm_local_representation.txt") assert np.allclose(X_qml, X_ref), "Error in SLATM generation"
def get_slatm_representations(atoms_list, coordinates_list): charge_list = [] for atoms in atoms_list: charges = [get_atom(atom) for atom in atoms] charges = np.array(charges) charge_list.append(charges) mbtypes = qml_representations.get_slatm_mbtypes(charge_list) replist = [ qml_representations.generate_slatm(coordinates, atoms, mbtypes, local=False) for coordinates, atoms in zip(coordinates_list, charge_list) ] replist = np.array(replist) return replist
def _get_slatm_mbtypes(self, arr): from qml.representations import get_slatm_mbtypes return get_slatm_mbtypes(arr)
# Make training and test sets n_test = 60 n_train = 140 training = mols[:n_train] test = mols[-n_test:] sigma = 100.0 llambda = 1e-10 # List of properties Y = np.array([mol.properties for mol in training]) Ys = np.array([mol.properties for mol in test]) # List of representations mbtypes = get_slatm_mbtypes(np.array([mol.nuclear_charges for mol in mols])) for i, mol in enumerate(training): mol.generate_slatm(mbtypes, local=False, rpower=6) for i, mol in enumerate(test): mol.generate_slatm(mbtypes, local=False, rpower=6) X = np.array([mol.representation for mol in training]) Xs = np.array([mol.representation for mol in test]) # Generate training Kernel K = gaussian_kernel(X, X, sigma) Ks = gaussian_kernel(X, Xs, sigma) K[np.diag_indices_from(K)] += llambda alpha = cho_solve(K, Y)