Пример #1
0
    def test_crossover(self):
        """Tests that disabling/enabling crossover works as expected."""
        pos = [[0.1, 0.1, 0.1]]
        species = [1, 8]
        nmax = 5
        lmax = 5

        # GTO
        desc = SOAP(
            species=species,
            rbf="gto",
            crossover=True,
            rcut=3,
            nmax=nmax,
            lmax=lmax,
            periodic=False,
        )
        hh_loc_full = desc.get_location(("H", "H"))
        oo_loc_full = desc.get_location(("O", "O"))
        full_output = desc.create(H2O, positions=pos)
        desc.crossover = False
        hh_loc = desc.get_location(("H", "H"))
        oo_loc = desc.get_location(("O", "O"))
        partial_output = desc.create(H2O, positions=pos)
        self.assertTrue(oo_loc_full != oo_loc)
        self.assertTrue(
            np.array_equal(full_output[:, hh_loc_full], partial_output[:, hh_loc])
        )
        self.assertTrue(
            np.array_equal(full_output[:, oo_loc_full], partial_output[:, oo_loc])
        )

        # Polynomial
        desc = SOAP(
            species=species,
            rbf="polynomial",
            crossover=True,
            rcut=3,
            nmax=lmax,
            lmax=lmax,
            periodic=False,
        )
        hh_loc_full = desc.get_location(("H", "H"))
        oo_loc_full = desc.get_location(("O", "O"))
        full_output = desc.create(H2O, pos)
        desc.crossover = False
        hh_loc = desc.get_location(("H", "H"))
        oo_loc = desc.get_location(("O", "O"))
        partial_output = desc.create(H2O, pos)
        self.assertTrue(oo_loc_full != oo_loc)
        self.assertTrue(
            np.array_equal(full_output[:, hh_loc_full], partial_output[:, hh_loc])
        )
        self.assertTrue(
            np.array_equal(full_output[:, oo_loc_full], partial_output[:, oo_loc])
        )
Пример #2
0
    def test_get_location_w_crossover(self):
        """Tests that disabling/enabling crossover works as expected.
        """
        # With crossover
        species = ["H", "O", "C"]
        desc = SOAP(species=species,
                    rbf="gto",
                    crossover=True,
                    rcut=3,
                    nmax=5,
                    lmax=5,
                    periodic=False)

        # Symbols
        loc_hh = desc.get_location(("H", "H"))
        loc_ho = desc.get_location(("H", "O"))
        loc_oh = desc.get_location(("O", "H"))
        loc_oo = desc.get_location(("O", "O"))
        loc_cc = desc.get_location(("C", "C"))
        loc_co = desc.get_location(("C", "O"))
        loc_ch = desc.get_location(("C", "H"))

        # Undefined elements
        with self.assertRaises(ValueError):
            desc.get_location((2, 1))
        with self.assertRaises(ValueError):
            desc.get_location(("He", "H"))

        # Check that slices in the output are correctly empty or filled
        co2 = molecule("CO2")
        h2o = molecule("H2O")
        co2_out = desc.create(co2)
        h2o_out = desc.create(h2o)

        # Check that slices with reversed atomic numbers are identical
        self.assertTrue(loc_ho == loc_oh)

        # H-H
        self.assertTrue(co2_out[:, loc_hh].sum() == 0)
        self.assertTrue(h2o_out[:, loc_hh].sum() != 0)

        # H-C
        self.assertTrue(co2_out[:, loc_ch].sum() == 0)
        self.assertTrue(h2o_out[:, loc_ch].sum() == 0)

        # H-O
        self.assertTrue(co2_out[:, loc_ho].sum() == 0)
        self.assertTrue(h2o_out[:, loc_ho].sum() != 0)

        # C-O
        self.assertTrue(co2_out[:, loc_co].sum() != 0)
        self.assertTrue(h2o_out[:, loc_co].sum() == 0)

        # C-C
        self.assertTrue(co2_out[:, loc_cc].sum() != 0)
        self.assertTrue(h2o_out[:, loc_cc].sum() == 0)

        # O-O
        self.assertTrue(co2_out[:, loc_oo].sum() != 0)
        self.assertTrue(h2o_out[:, loc_oo].sum() != 0)
Пример #3
0
print(copper.get_pbc())
periodic_soap = SOAP(species=[29],
                     rcut=rcut,
                     nmax=nmax,
                     lmax=nmax,
                     periodic=True,
                     sparse=False)

soap_copper = periodic_soap.create(copper)

print(soap_copper)
print(soap_copper.sum(axis=1))

# Locations
# The locations of specific element combinations can be retrieved like this.
hh_loc = soap.get_location(("H", "H"))
ho_loc = soap.get_location(("H", "O"))

# These locations can be directly used to slice the corresponding part from an
# SOAP output for e.g. plotting.
soap_water[0, hh_loc]
soap_water[0, ho_loc]

# Sparse output
soap = SOAP(species=species, rcut=rcut, nmax=nmax, lmax=lmax, sparse=True)
soap_water = soap.create(water)
print(type(soap_water))

soap = SOAP(species=species, rcut=rcut, nmax=nmax, lmax=lmax, sparse=False)
soap_water = soap.create(water)
print(type(soap_water))
Пример #4
0
    def test_basis(self):
        """Tests that the output vectors for both GTO and polynomial radial
        basis behave correctly.
        """
        sys1 = Atoms(
            symbols=["H", "H"],
            positions=[[1, 0, 0], [0, 1, 0]],
            cell=[2, 2, 2],
            pbc=True,
        )
        sys2 = Atoms(
            symbols=["O", "O"],
            positions=[[1, 0, 0], [0, 1, 0]],
            cell=[2, 2, 2],
            pbc=True,
        )
        sys3 = Atoms(
            symbols=["C", "C"],
            positions=[[1, 0, 0], [0, 1, 0]],
            cell=[2, 2, 2],
            pbc=True,
        )
        sys4 = Atoms(
            symbols=["H", "C"],
            positions=[[-1, 0, 0], [1, 0, 0]],
            cell=[2, 2, 2],
            pbc=True,
        )
        sys5 = Atoms(
            symbols=["H", "C"],
            positions=[[1, 0, 0], [0, 1, 0]],
            cell=[2, 2, 2],
            pbc=True,
        )
        sys6 = Atoms(
            symbols=["H", "O"],
            positions=[[1, 0, 0], [0, 1, 0]],
            cell=[2, 2, 2],
            pbc=True,
        )
        sys7 = Atoms(
            symbols=["C", "O"],
            positions=[[1, 0, 0], [0, 1, 0]],
            cell=[2, 2, 2],
            pbc=True,
        )

        for rbf in ["gto", "polynomial"]:
            desc = SOAP(
                species=[1, 6, 8],
                rcut=5,
                nmax=1,
                lmax=1,
                rbf=rbf,
                periodic=False,
                crossover=True,
                sparse=False,
            )

            # Create vectors for each system
            vec1 = desc.create(sys1, positions=[[0, 0, 0]])[0, :]
            vec2 = desc.create(sys2, positions=[[0, 0, 0]])[0, :]
            vec3 = desc.create(sys3, positions=[[0, 0, 0]])[0, :]
            vec4 = desc.create(sys4, positions=[[0, 0, 0]])[0, :]
            vec5 = desc.create(sys5, positions=[[0, 0, 0]])[0, :]
            vec6 = desc.create(sys6, positions=[[0, 0, 0]])[0, :]
            vec7 = desc.create(sys7, positions=[[0, 0, 0]])[0, :]

            # The dot-product should be zero when there are no overlapping elements
            dot = np.dot(vec1, vec2)
            self.assertEqual(dot, 0)
            dot = np.dot(vec2, vec3)
            self.assertEqual(dot, 0)

            # The dot-product should be non-zero when there are overlapping elements
            dot = np.dot(vec4, vec5)
            self.assertNotEqual(dot, 0)

            # Check that self-terms are in correct location
            hh_loc = desc.get_location(("H", "H"))
            h_part1 = vec1[hh_loc]
            h_part2 = vec2[hh_loc]
            h_part4 = vec4[hh_loc]
            self.assertNotEqual(np.sum(h_part1), 0)
            self.assertEqual(np.sum(h_part2), 0)
            self.assertNotEqual(np.sum(h_part4), 0)

            # Check that cross terms are in correct location
            hc_loc = desc.get_location(("H", "C"))
            co_loc = desc.get_location(("C", "O"))
            hc_part1 = vec1[hc_loc]
            hc_part4 = vec4[hc_loc]
            co_part6 = vec6[co_loc]
            co_part7 = vec7[co_loc]
            self.assertEqual(np.sum(hc_part1), 0)
            self.assertNotEqual(np.sum(hc_part4), 0)
            self.assertEqual(np.sum(co_part6), 0)
            self.assertNotEqual(np.sum(co_part7), 0)