Source code for pymatgen.analysis.diffusion.aimd.tests.test_clustering
# Copyright (c) Materials Virtual Lab.
# Distributed under the terms of the BSD License.
from __future__ import annotations
import itertools
import unittest
import numpy as np
from scipy.cluster.vq import kmeans
from pymatgen.analysis.diffusion.aimd.clustering import Kmeans, KmeansPBC
from pymatgen.core import Lattice
from pymatgen.util.coord import pbc_diff
[docs]
class KmeansTest(unittest.TestCase):
[docs]
def test_cluster(self):
data = np.random.uniform(size=(10, 5))
data = list(data)
d2 = np.random.uniform(size=(10, 5)) + ([5] * 5)
data.extend(list(d2))
d2 = np.random.uniform(size=(10, 5)) + ([-5] * 5)
data.extend(list(d2))
data = np.array(data)
k = Kmeans()
clusters = []
for _i in range(10):
clusters.append(k.cluster(data, 3))
c1, l1, ss = min(clusters, key=lambda d: d[2])
c2, d = kmeans(data, 3)
same = False
for a in itertools.permutations(c2):
if np.allclose(c1, a):
same = True
break
assert same
[docs]
class KmeansPBCTest(unittest.TestCase):
[docs]
def test_cluster(self):
lattice = Lattice.cubic(4)
pts = []
initial = [[0, 0, 0], [0.5, 0.5, 0.5], [0.25, 0.25, 0.25], [0.5, 0, 0]]
for c in initial:
for _i in range(100):
pts.append(np.array(c) + np.random.randn(3) * 0.01 + np.random.randint(3))
pts = np.array(pts)
k = KmeansPBC(lattice)
centroids, labels, ss = k.cluster(pts, 4)
for c1 in centroids:
found = False
for c2 in centroids:
if np.allclose(pbc_diff(c1, c2), [0, 0, 0], atol=0.1):
found = True
break
assert found