• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

materialsproject / pymatgen / 4075885785

pending completion
4075885785

push

github

Shyue Ping Ong
Merge branch 'master' of github.com:materialsproject/pymatgen

96 of 96 new or added lines in 27 files covered. (100.0%)

81013 of 102710 relevant lines covered (78.88%)

0.79 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

99.75
/pymatgen/analysis/chemenv/coordination_environments/tests/test_weights.py
1
from __future__ import annotations
1✔
2

3
import json
1✔
4
import os
1✔
5
import unittest
1✔
6

7
import pytest
1✔
8

9
from pymatgen.analysis.chemenv.coordination_environments.chemenv_strategies import (
1✔
10
    AngleNbSetWeight,
11
    CNBiasNbSetWeight,
12
    DeltaCSMNbSetWeight,
13
    DeltaDistanceNbSetWeight,
14
    DistanceAngleAreaNbSetWeight,
15
    DistanceNbSetWeight,
16
    NormalizedAngleDistanceNbSetWeight,
17
    SelfCSMNbSetWeight,
18
)
19
from pymatgen.analysis.chemenv.coordination_environments.structure_environments import (
1✔
20
    StructureEnvironments,
21
)
22
from pymatgen.util.testing import PymatgenTest
1✔
23

24
__author__ = "waroquiers"
1✔
25

26
se_files_dir = os.path.join(
1✔
27
    PymatgenTest.TEST_FILES_DIR,
28
    "chemenv",
29
    "structure_environments_files",
30
)
31

32

33
class FakeNbSet:
1✔
34
    def __init__(self, cn=None):
1✔
35
        self.cn = cn
1✔
36

37
    def __len__(self):
1✔
38
        return self.cn
1✔
39

40

41
class DummyStructureEnvironments:
1✔
42
    pass
1✔
43

44

45
class DummyVoronoiContainer:
1✔
46
    pass
1✔
47

48

49
class StrategyWeightsTest(PymatgenTest):
1✔
50
    def test_angle_weight(self):
1✔
51
        fake_nb_set = FakeNbSet()
1✔
52
        dummy_se = DummyStructureEnvironments()
1✔
53

54
        # Angles for a given fake nb_set with 5 neighbors
55
        fake_nb_set.angles = [
1✔
56
            1.8595833644514066,
57
            2.622518848090717,
58
            3.08570351705799,
59
            2.2695472184920042,
60
            2.2695338778592387,
61
        ]
62
        angle_weight = AngleNbSetWeight(aa=1.0)
1✔
63
        aw = angle_weight.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
64
        assert abs(aw - 0.9634354419021528) < 1e-8
1✔
65
        angle_weight = AngleNbSetWeight(aa=2.0)
1✔
66
        aw = angle_weight.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
67
        assert abs(aw - 0.92820785071319645) < 1e-8
1✔
68
        angle_weight = AngleNbSetWeight(aa=0.5)
1✔
69
        aw = angle_weight.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
70
        assert abs(aw - 0.98154747307613843) < 1e-8
1✔
71

72
        assert AngleNbSetWeight(1.0) != AngleNbSetWeight(2.0)
1✔
73

74
        # nb_set with no neighbor
75
        fake_nb_set.angles = []
1✔
76
        angle_weight = AngleNbSetWeight(aa=1.0)
1✔
77
        aw = angle_weight.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
78
        assert abs(aw - 0.0) < 1e-8
1✔
79
        angle_weight = AngleNbSetWeight(aa=2.0)
1✔
80
        aw = angle_weight.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
81
        assert abs(aw - 0.0) < 1e-8
1✔
82

83
        # nb_set with one neighbor
84
        fake_nb_set.angles = [3.08570351705799]
1✔
85
        angle_weight = AngleNbSetWeight(aa=1.0)
1✔
86
        aw = angle_weight.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
87
        assert abs(aw - 0.24555248382791284) < 1e-8
1✔
88
        angle_weight = AngleNbSetWeight(aa=2.0)
1✔
89
        aw = angle_weight.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
90
        assert abs(aw - 0.060296022314057396) < 1e-8
1✔
91
        angle_weight = AngleNbSetWeight(aa=0.5)
1✔
92
        aw = angle_weight.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
93
        assert abs(aw - 0.49553252549950022) < 1e-8
1✔
94

95
        # nb_set with 6 neighbors (sum of the angles is 4*pi, i.e. the full sphere)
96
        fake_nb_set.angles = [
1✔
97
            1.8595833644514066,
98
            0.459483788407816,
99
            2.622518848090717,
100
            3.08570351705799,
101
            2.2695472184920042,
102
            2.2695338778592387,
103
        ]
104
        angle_weight = AngleNbSetWeight(aa=1.0)
1✔
105
        aw = angle_weight.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
106
        assert abs(aw - 1.0) < 1e-8
1✔
107
        angle_weight = AngleNbSetWeight(aa=2.0)
1✔
108
        aw = angle_weight.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
109
        assert abs(aw - 1.0) < 1e-8
1✔
110
        angle_weight = AngleNbSetWeight(aa=0.5)
1✔
111
        aw = angle_weight.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
112
        assert abs(aw - 1.0) < 1e-8
1✔
113

114
    def test_normalized_angle_distance_weight(self):
1✔
115
        fake_nb_set = FakeNbSet()
1✔
116
        dummy_se = DummyStructureEnvironments()
1✔
117

118
        nadw1 = NormalizedAngleDistanceNbSetWeight(average_type="geometric", aa=1, bb=1)
1✔
119
        nadw2 = NormalizedAngleDistanceNbSetWeight(average_type="arithmetic", aa=1, bb=1)
1✔
120
        nadw3 = NormalizedAngleDistanceNbSetWeight(average_type="geometric", aa=0, bb=1)
1✔
121
        nadw4 = NormalizedAngleDistanceNbSetWeight(average_type="arithmetic", aa=1, bb=0)
1✔
122
        nadw5 = NormalizedAngleDistanceNbSetWeight(average_type="arithmetic", aa=0.1, bb=0.1)
1✔
123
        nadw6 = NormalizedAngleDistanceNbSetWeight(average_type="arithmetic", aa=0, bb=0.1)
1✔
124
        nadw7 = NormalizedAngleDistanceNbSetWeight(average_type="arithmetic", aa=0.1, bb=0)
1✔
125
        nadw8 = NormalizedAngleDistanceNbSetWeight(average_type="arithmetic", aa=2, bb=0)
1✔
126
        nadw9 = NormalizedAngleDistanceNbSetWeight(average_type="arithmetic", aa=0, bb=2)
1✔
127
        nadw10 = NormalizedAngleDistanceNbSetWeight(average_type="arithmetic", aa=2, bb=2)
1✔
128
        nadw11 = NormalizedAngleDistanceNbSetWeight(average_type="geometric", aa=1, bb=2)
1✔
129
        nadw12 = NormalizedAngleDistanceNbSetWeight(average_type="geometric", aa=2, bb=1)
1✔
130
        assert nadw11 != nadw12
1✔
131
        with pytest.raises(ValueError, match="Both exponents are 0."):
1✔
132
            NormalizedAngleDistanceNbSetWeight(average_type="arithmetic", aa=0, bb=0)
1✔
133
        with pytest.raises(
1✔
134
            ValueError, match="Average type is 'arithmetix' while it should be 'geometric' or 'arithmetic'"
135
        ):
136
            NormalizedAngleDistanceNbSetWeight(average_type="arithmetix", aa=1, bb=1)
1✔
137

138
        fake_nb_set.normalized_distances = [
1✔
139
            1.2632574171572457,
140
            1.1231971151388764,
141
            1.0,
142
            1.1887986376446249,
143
            1.188805134890625,
144
        ]
145
        fake_nb_set.normalized_angles = [
1✔
146
            0.6026448601336767,
147
            0.8498933334305273,
148
            1.0,
149
            0.7355039801931018,
150
            0.7354996568248028,
151
        ]
152
        w1 = nadw1.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
153
        assert abs(w1 - 0.67310887189488189) < 1e-8
1✔
154
        w2 = nadw2.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
155
        assert abs(w2 - 0.69422258996523023) < 1e-8
1✔
156
        w3 = nadw3.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
157
        assert abs(w3 - 0.8700949310182079) < 1e-8
1✔
158
        w4 = nadw4.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
159
        assert abs(w4 - 0.7847083661164217) < 1e-8
1✔
160
        w5 = nadw5.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
161
        assert abs(w5 - 0.96148050989126843) < 1e-8
1✔
162
        w6 = nadw6.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
163
        assert abs(w6 - 0.98621181678741754) < 1e-8
1✔
164
        w7 = nadw7.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
165
        assert abs(w7 - 0.97479580875402994) < 1e-8
1✔
166
        w8 = nadw8.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
167
        assert abs(w8 - 0.63348507114489783) < 1e-8
1✔
168
        w9 = nadw9.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
169
        assert abs(w9 - 0.7668954450583646) < 1e-8
1✔
170
        w10 = nadw10.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
171
        assert abs(w10 - 0.51313920014833292) < 1e-8
1✔
172
        w11 = nadw11.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
173
        assert abs(w11 - 0.585668617459) < 1e-8
1✔
174
        w12 = nadw12.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
175
        assert abs(w12 - 0.520719679281) < 1e-8
1✔
176

177
    def test_CN_bias_weight(self):
1✔
178
        fake_nb_set = FakeNbSet()
1✔
179
        dummy_se = DummyStructureEnvironments()
1✔
180
        bias_weight1 = CNBiasNbSetWeight.linearly_equidistant(weight_cn1=1.0, weight_cn13=13.0)
1✔
181
        bias_weight2 = CNBiasNbSetWeight.geometrically_equidistant(weight_cn1=1.0, weight_cn13=1.1**12)
1✔
182
        bias_weight3 = CNBiasNbSetWeight.explicit(
1✔
183
            cn_weights={
184
                1: 1.0,
185
                2: 3.0,
186
                3: 3.2,
187
                4: 4.0,
188
                5: 4.1,
189
                6: 4.2,
190
                7: 4.3,
191
                8: 4.4,
192
                9: 4.5,
193
                10: 4.6,
194
                11: 4.6,
195
                12: 4.7,
196
                13: 4.8,
197
            }
198
        )
199
        with pytest.raises(ValueError, match="Weights should be provided for CN 1 to 13"):
1✔
200
            CNBiasNbSetWeight.explicit(cn_weights={1: 1.0, 13: 2.0})
1✔
201

202
        fake_nb_set.cn = 1
1✔
203
        w1 = bias_weight1.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
204
        assert abs(w1 - 1.0) < 1e-8
1✔
205
        w2 = bias_weight2.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
206
        assert abs(w2 - 1.0) < 1e-8
1✔
207
        w3 = bias_weight3.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
208
        assert abs(w3 - 1.0) < 1e-8
1✔
209
        fake_nb_set.cn = 7
1✔
210
        w1 = bias_weight1.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
211
        assert abs(w1 - 7.0) < 1e-8
1✔
212
        w2 = bias_weight2.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
213
        assert abs(w2 - 1.1**6) < 1e-8
1✔
214
        w3 = bias_weight3.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
215
        assert abs(w3 - 4.3) < 1e-8
1✔
216
        fake_nb_set.cn = 13
1✔
217
        w1 = bias_weight1.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
218
        assert abs(w1 - 13.0) < 1e-8
1✔
219
        w2 = bias_weight2.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
220
        assert abs(w2 - 1.1**12) < 1e-8
1✔
221
        w3 = bias_weight3.weight(nb_set=fake_nb_set, structure_environments=dummy_se)
1✔
222
        assert abs(w3 - 4.8) < 1e-8
1✔
223

224
        bias_weight4 = CNBiasNbSetWeight.from_description(
1✔
225
            {"type": "linearly_equidistant", "weight_cn1": 2.0, "weight_cn13": 26.0}
226
        )
227
        for cn in range(1, 14):
1✔
228
            assert round(abs(bias_weight4.cn_weights[cn] - 2.0 * cn), 7) == 0
1✔
229

230
        bias_weight5 = CNBiasNbSetWeight.from_description(
1✔
231
            {
232
                "type": "geometrically_equidistant",
233
                "weight_cn1": 1.0,
234
                "weight_cn13": 13.0,
235
            }
236
        )
237
        assert round(abs(bias_weight5.cn_weights[1] - 1.0), 7) == 0
1✔
238
        assert round(abs(bias_weight5.cn_weights[3] - 1.5334062370163877), 7) == 0
1✔
239
        assert round(abs(bias_weight5.cn_weights[9] - 5.5287748136788739), 7) == 0
1✔
240
        assert round(abs(bias_weight5.cn_weights[12] - 10.498197520079623), 7) == 0
1✔
241

242
        cn_weights = {cn: 0.0 for cn in range(1, 14)}
1✔
243
        cn_weights[6] = 2.0
1✔
244
        cn_weights[4] = 1.0
1✔
245
        bias_weight6 = CNBiasNbSetWeight.from_description({"type": "explicit", "cn_weights": cn_weights})
1✔
246

247
        assert round(abs(bias_weight6.cn_weights[1] - 0.0), 7) == 0
1✔
248
        assert round(abs(bias_weight6.cn_weights[4] - 1.0), 7) == 0
1✔
249
        assert round(abs(bias_weight6.cn_weights[6] - 2.0), 7) == 0
1✔
250

251
    def test_self_csms_weight(self):
1✔
252
        # Get the StructureEnvironments for K2NaNb2Fe7Si8H4O31 (mp-743972)
253
        with open(os.path.join(se_files_dir, "se_mp-743972.json")) as f:
1✔
254
            dd = json.load(f)
1✔
255
        se = StructureEnvironments.from_dict(dd)
1✔
256

257
        # Get neighbors sets for which we get the weights
258
        cn_maps = [(12, 3), (12, 2), (13, 2), (12, 0), (12, 1)]
1✔
259
        nbsets = {cn_map: se.neighbors_sets[0][cn_map[0]][cn_map[1]] for cn_map in cn_maps}
1✔
260

261
        effective_csm_estimator = {
1✔
262
            "function": "power2_inverse_decreasing",
263
            "options": {"max_csm": 8.0},
264
        }
265
        weight_estimator = {
1✔
266
            "function": "power2_decreasing_exp",
267
            "options": {"max_csm": 8.0, "alpha": 1.0},
268
        }
269
        weight_estimator2 = {
1✔
270
            "function": "power2_decreasing_exp",
271
            "options": {"max_csm": 8.1, "alpha": 1.0},
272
        }
273
        symmetry_measure_type = "csm_wcs_ctwcc"
1✔
274
        self_weight = SelfCSMNbSetWeight(
1✔
275
            effective_csm_estimator=effective_csm_estimator,
276
            weight_estimator=weight_estimator,
277
            symmetry_measure_type=symmetry_measure_type,
278
        )
279
        self_weight2 = SelfCSMNbSetWeight(
1✔
280
            effective_csm_estimator=effective_csm_estimator,
281
            weight_estimator=weight_estimator2,
282
            symmetry_measure_type=symmetry_measure_type,
283
        )
284
        assert self_weight != self_weight2
1✔
285

286
        additional_info = {}
1✔
287
        cn_map = (12, 3)
1✔
288
        self_w = self_weight.weight(
1✔
289
            nb_set=nbsets[cn_map],
290
            structure_environments=se,
291
            cn_map=cn_map,
292
            additional_info=additional_info,
293
        )
294
        assert abs(self_w - 0.11671945916431022) < 1e-8
1✔
295
        cn_map = (12, 2)
1✔
296
        self_w = self_weight.weight(
1✔
297
            nb_set=nbsets[cn_map],
298
            structure_environments=se,
299
            cn_map=cn_map,
300
            additional_info=additional_info,
301
        )
302
        assert abs(self_w - 0.0) < 1e-8
1✔
303
        cn_map = (12, 0)
1✔
304
        self_w = self_weight.weight(
1✔
305
            nb_set=nbsets[cn_map],
306
            structure_environments=se,
307
            cn_map=cn_map,
308
            additional_info=additional_info,
309
        )
310
        assert abs(self_w - 0.0) < 1e-8
1✔
311
        cn_map = (12, 1)
1✔
312
        self_w = self_weight.weight(
1✔
313
            nb_set=nbsets[cn_map],
314
            structure_environments=se,
315
            cn_map=cn_map,
316
            additional_info=additional_info,
317
        )
318
        assert abs(self_w - 0.0) < 1e-8
1✔
319
        cn_map = (13, 2)
1✔
320
        self_w = self_weight.weight(
1✔
321
            nb_set=nbsets[cn_map],
322
            structure_environments=se,
323
            cn_map=cn_map,
324
            additional_info=additional_info,
325
        )
326
        assert abs(self_w - 0.14204073172729198) < 1e-8
1✔
327

328
        # Get the StructureEnvironments for SiO2 (mp-7000)
329
        with open(os.path.join(se_files_dir, "se_mp-7000.json")) as f:
1✔
330
            dd = json.load(f)
1✔
331
        se = StructureEnvironments.from_dict(dd)
1✔
332

333
        # Get neighbors sets for which we get the weights
334
        cn_maps = [(2, 0), (4, 0)]
1✔
335
        nbsets = {cn_map: se.neighbors_sets[6][cn_map[0]][cn_map[1]] for cn_map in cn_maps}
1✔
336

337
        effective_csm_estimator = {
1✔
338
            "function": "power2_inverse_decreasing",
339
            "options": {"max_csm": 8.0},
340
        }
341

342
        weight_estimator = {
1✔
343
            "function": "power2_decreasing_exp",
344
            "options": {"max_csm": 8.0, "alpha": 1.0},
345
        }
346
        symmetry_measure_type = "csm_wcs_ctwcc"
1✔
347
        self_weight = SelfCSMNbSetWeight(
1✔
348
            effective_csm_estimator=effective_csm_estimator,
349
            weight_estimator=weight_estimator,
350
            symmetry_measure_type=symmetry_measure_type,
351
        )
352

353
        additional_info = {}
1✔
354
        cn_map = (2, 0)
1✔
355
        self_w = self_weight.weight(
1✔
356
            nb_set=nbsets[cn_map],
357
            structure_environments=se,
358
            cn_map=cn_map,
359
            additional_info=additional_info,
360
        )
361
        assert abs(self_w - 0.8143992162836029) < 1e-8
1✔
362
        cn_map = (4, 0)
1✔
363
        self_w = self_weight.weight(
1✔
364
            nb_set=nbsets[cn_map],
365
            structure_environments=se,
366
            cn_map=cn_map,
367
            additional_info=additional_info,
368
        )
369
        assert abs(self_w - 0.99629742352359496) < 1e-8
1✔
370

371
    def test_delta_csms_weight(self):
1✔
372
        # Get the StructureEnvironments for K2NaNb2Fe7Si8H4O31 (mp-743972)
373
        with open(os.path.join(se_files_dir, "se_mp-743972.json")) as f:
1✔
374
            dd = json.load(f)
1✔
375
        se = StructureEnvironments.from_dict(dd)
1✔
376

377
        # Get neighbors sets for which we get the weights
378
        cn_maps = [(12, 3), (12, 2), (13, 2), (12, 0), (12, 1), (13, 0), (13, 1)]
1✔
379
        nbsets = {cn_map: se.neighbors_sets[0][cn_map[0]][cn_map[1]] for cn_map in cn_maps}
1✔
380

381
        effective_csm_estimator = {
1✔
382
            "function": "power2_inverse_decreasing",
383
            "options": {"max_csm": 8.0},
384
        }
385
        weight_estimator = {
1✔
386
            "function": "smootherstep",
387
            "options": {"delta_csm_min": 0.5, "delta_csm_max": 3.0},
388
        }
389
        symmetry_measure_type = "csm_wcs_ctwcc"
1✔
390
        delta_weight = DeltaCSMNbSetWeight(
1✔
391
            effective_csm_estimator=effective_csm_estimator,
392
            weight_estimator=weight_estimator,
393
            symmetry_measure_type=symmetry_measure_type,
394
        )
395

396
        additional_info = {}
1✔
397
        cn_map = (12, 3)
1✔
398
        delta_w = delta_weight.weight(
1✔
399
            nb_set=nbsets[cn_map],
400
            structure_environments=se,
401
            cn_map=cn_map,
402
            additional_info=additional_info,
403
        )
404
        assert abs(delta_w - 0.0) < 1e-8
1✔
405
        cn_map = (12, 2)
1✔
406
        delta_w = delta_weight.weight(
1✔
407
            nb_set=nbsets[cn_map],
408
            structure_environments=se,
409
            cn_map=cn_map,
410
            additional_info=additional_info,
411
        )
412
        assert abs(delta_w - 0.0) < 1e-8
1✔
413
        cn_map = (12, 0)
1✔
414
        delta_w = delta_weight.weight(
1✔
415
            nb_set=nbsets[cn_map],
416
            structure_environments=se,
417
            cn_map=cn_map,
418
            additional_info=additional_info,
419
        )
420
        assert abs(delta_w - 0.0) < 1e-8
1✔
421
        cn_map = (12, 1)
1✔
422
        delta_w = delta_weight.weight(
1✔
423
            nb_set=nbsets[cn_map],
424
            structure_environments=se,
425
            cn_map=cn_map,
426
            additional_info=additional_info,
427
        )
428
        assert abs(delta_w - 0.0) < 1e-8
1✔
429
        cn_map = (13, 2)
1✔
430
        delta_w = delta_weight.weight(
1✔
431
            nb_set=nbsets[cn_map],
432
            structure_environments=se,
433
            cn_map=cn_map,
434
            additional_info=additional_info,
435
        )
436
        assert abs(delta_w - 1.0) < 1e-8
1✔
437
        cn_map = (13, 0)
1✔
438
        delta_w = delta_weight.weight(
1✔
439
            nb_set=nbsets[cn_map],
440
            structure_environments=se,
441
            cn_map=cn_map,
442
            additional_info=additional_info,
443
        )
444
        assert abs(delta_w - 0.0) < 1e-8
1✔
445
        cn_map = (13, 1)
1✔
446
        delta_w = delta_weight.weight(
1✔
447
            nb_set=nbsets[cn_map],
448
            structure_environments=se,
449
            cn_map=cn_map,
450
            additional_info=additional_info,
451
        )
452
        assert abs(delta_w - 0.0) < 1e-8
1✔
453

454
        effective_csm_estimator = {
1✔
455
            "function": "power2_inverse_decreasing",
456
            "options": {"max_csm": 8.0},
457
        }
458

459
        weight_estimator = {
1✔
460
            "function": "smootherstep",
461
            "options": {"delta_csm_min": -1.0, "delta_csm_max": 3.0},
462
        }
463
        symmetry_measure_type = "csm_wcs_ctwcc"
1✔
464
        delta_weight = DeltaCSMNbSetWeight(
1✔
465
            effective_csm_estimator=effective_csm_estimator,
466
            weight_estimator=weight_estimator,
467
            symmetry_measure_type=symmetry_measure_type,
468
        )
469

470
        additional_info = {}
1✔
471
        cn_map = (12, 3)
1✔
472
        delta_w = delta_weight.weight(
1✔
473
            nb_set=nbsets[cn_map],
474
            structure_environments=se,
475
            cn_map=cn_map,
476
            additional_info=additional_info,
477
        )
478
        assert abs(delta_w - 0.040830741048481355) < 1e-8
1✔
479
        cn_map = (13, 2)
1✔
480
        delta_w = delta_weight.weight(
1✔
481
            nb_set=nbsets[cn_map],
482
            structure_environments=se,
483
            cn_map=cn_map,
484
            additional_info=additional_info,
485
        )
486
        assert abs(delta_w - 1.0) < 1e-8
1✔
487
        cn_map = (13, 0)
1✔
488
        delta_w = delta_weight.weight(
1✔
489
            nb_set=nbsets[cn_map],
490
            structure_environments=se,
491
            cn_map=cn_map,
492
            additional_info=additional_info,
493
        )
494
        assert abs(delta_w - 0.103515625) < 1e-8
1✔
495
        cn_map = (13, 1)
1✔
496
        delta_w = delta_weight.weight(
1✔
497
            nb_set=nbsets[cn_map],
498
            structure_environments=se,
499
            cn_map=cn_map,
500
            additional_info=additional_info,
501
        )
502
        assert abs(delta_w - 0.103515625) < 1e-8
1✔
503

504
        # Get the StructureEnvironments for SiO2 (mp-7000)
505
        with open(os.path.join(se_files_dir, "se_mp-7000.json")) as f:
1✔
506
            dd = json.load(f)
1✔
507
        se = StructureEnvironments.from_dict(dd)
1✔
508

509
        # Get neighbors sets for which we get the weights
510
        cn_maps = [(2, 0), (4, 0)]
1✔
511
        nbsets = {cn_map: se.neighbors_sets[6][cn_map[0]][cn_map[1]] for cn_map in cn_maps}
1✔
512

513
        effective_csm_estimator = {
1✔
514
            "function": "power2_inverse_decreasing",
515
            "options": {"max_csm": 8.0},
516
        }
517

518
        weight_estimator = {
1✔
519
            "function": "smootherstep",
520
            "options": {"delta_csm_min": 0.5, "delta_csm_max": 3.0},
521
        }
522
        symmetry_measure_type = "csm_wcs_ctwcc"
1✔
523
        delta_weight = DeltaCSMNbSetWeight(
1✔
524
            effective_csm_estimator=effective_csm_estimator,
525
            weight_estimator=weight_estimator,
526
            symmetry_measure_type=symmetry_measure_type,
527
        )
528

529
        additional_info = {}
1✔
530
        cn_map = (2, 0)
1✔
531
        delta_w = delta_weight.weight(
1✔
532
            nb_set=nbsets[cn_map],
533
            structure_environments=se,
534
            cn_map=cn_map,
535
            additional_info=additional_info,
536
        )
537
        assert abs(delta_w - 0.0) < 1e-8
1✔
538
        cn_map = (4, 0)
1✔
539
        delta_w = delta_weight.weight(
1✔
540
            nb_set=nbsets[cn_map],
541
            structure_environments=se,
542
            cn_map=cn_map,
543
            additional_info=additional_info,
544
        )
545
        assert abs(delta_w - 1.0) < 1e-8
1✔
546

547
    def test_dist_angle_area_weight(self):
1✔
548
        surface_definition = {
1✔
549
            "type": "standard_elliptic",
550
            "distance_bounds": {"lower": 1.2, "upper": 1.8},
551
            "angle_bounds": {"lower": 0.2, "upper": 0.8},
552
        }
553
        da_area_weight = DistanceAngleAreaNbSetWeight(
1✔
554
            weight_type="has_intersection",
555
            surface_definition=surface_definition,
556
            nb_sets_from_hints="fallback_to_source",
557
            other_nb_sets="0_weight",
558
            additional_condition=DistanceAngleAreaNbSetWeight.AC.ONLY_ACB,
559
        )
560

561
        d1, d2, a1, a2 = 1.05, 1.15, 0.05, 0.08
1✔
562
        assert not da_area_weight.rectangle_crosses_area(d1=d1, d2=d2, a1=a1, a2=a2)
1✔
563
        d1, d2, a1, a2 = 1.05, 1.15, 0.1, 0.2
1✔
564
        assert not da_area_weight.rectangle_crosses_area(d1=d1, d2=d2, a1=a1, a2=a2)
1✔
565
        d1, d2, a1, a2 = 1.9, 1.95, 0.1, 0.2
1✔
566
        assert not da_area_weight.rectangle_crosses_area(d1=d1, d2=d2, a1=a1, a2=a2)
1✔
567
        d1, d2, a1, a2 = 1.05, 1.95, 0.05, 0.25
1✔
568
        assert da_area_weight.rectangle_crosses_area(d1=d1, d2=d2, a1=a1, a2=a2)
1✔
569
        d1, d2, a1, a2 = 1.05, 1.95, 0.75, 0.9
1✔
570
        assert da_area_weight.rectangle_crosses_area(d1=d1, d2=d2, a1=a1, a2=a2)
1✔
571
        d1, d2, a1, a2 = 1.1, 1.9, 0.1, 0.9
1✔
572
        assert da_area_weight.rectangle_crosses_area(d1=d1, d2=d2, a1=a1, a2=a2)
1✔
573
        d1, d2, a1, a2 = 1.23, 1.77, 0.48, 0.52
1✔
574
        assert da_area_weight.rectangle_crosses_area(d1=d1, d2=d2, a1=a1, a2=a2)
1✔
575
        d1, d2, a1, a2 = 1.23, 1.24, 0.48, 0.52
1✔
576
        assert not da_area_weight.rectangle_crosses_area(d1=d1, d2=d2, a1=a1, a2=a2)
1✔
577
        d1, d2, a1, a2 = 1.4, 1.6, 0.4, 0.6
1✔
578
        assert da_area_weight.rectangle_crosses_area(d1=d1, d2=d2, a1=a1, a2=a2)
1✔
579
        d1, d2, a1, a2 = 1.6, 1.9, 0.7, 0.9
1✔
580
        assert not da_area_weight.rectangle_crosses_area(d1=d1, d2=d2, a1=a1, a2=a2)
1✔
581
        d1, d2, a1, a2 = 1.5, 1.6, 0.75, 0.78
1✔
582
        assert not da_area_weight.rectangle_crosses_area(d1=d1, d2=d2, a1=a1, a2=a2)
1✔
583
        d1, d2, a1, a2 = 1.5, 1.6, 0.75, 0.95
1✔
584
        assert not da_area_weight.rectangle_crosses_area(d1=d1, d2=d2, a1=a1, a2=a2)
1✔
585
        d1, d2, a1, a2 = 1.4, 1.6, 0.1, 0.9
1✔
586
        assert da_area_weight.rectangle_crosses_area(d1=d1, d2=d2, a1=a1, a2=a2)
1✔
587
        d1, d2, a1, a2 = 1.4, 1.6, 0.3, 0.7
1✔
588
        assert da_area_weight.rectangle_crosses_area(d1=d1, d2=d2, a1=a1, a2=a2)
1✔
589

590
    def test_dist_nb_set_weight(self):
1✔
591
        dnbset_weight = DistanceNbSetWeight()
1✔
592
        dnbset_weight2 = DistanceNbSetWeight(
1✔
593
            weight_function={
594
                "function": "smoothstep",
595
                "options": {"lower": 1.2, "upper": 1.3},
596
            }
597
        )
598

599
        fake_nb_set1 = FakeNbSet(cn=1)
1✔
600
        fake_nb_set1.site_voronoi_indices = {0}
1✔
601
        fake_nb_set2 = FakeNbSet(cn=2)
1✔
602
        fake_nb_set2.site_voronoi_indices = {0, 1}
1✔
603
        fake_nb_set3 = FakeNbSet(cn=3)
1✔
604
        fake_nb_set3.site_voronoi_indices = {0, 1, 2}
1✔
605
        fake_nb_set4 = FakeNbSet(cn=4)
1✔
606
        fake_nb_set4.site_voronoi_indices = {0, 1, 2, 3}
1✔
607
        fake_nb_set5 = FakeNbSet(cn=5)
1✔
608
        fake_nb_set5.site_voronoi_indices = {0, 1, 2, 3, 4}
1✔
609
        fake_nb_set5_m2 = FakeNbSet(cn=4)
1✔
610
        fake_nb_set5_m2.site_voronoi_indices = {0, 1, 3, 4}
1✔
611
        fake_nb_set6 = FakeNbSet(cn=6)
1✔
612
        fake_nb_set6.site_voronoi_indices = {0, 1, 2, 3, 4, 5}
1✔
613
        fake_nb_set7 = FakeNbSet(cn=7)
1✔
614
        fake_nb_set7.site_voronoi_indices = {0, 1, 2, 3, 4, 5, 6}
1✔
615
        fake_nb_set1.isite = 0
1✔
616
        fake_nb_set2.isite = 0
1✔
617
        fake_nb_set3.isite = 0
1✔
618
        fake_nb_set4.isite = 0
1✔
619
        fake_nb_set5.isite = 0
1✔
620
        fake_nb_set5_m2.isite = 0
1✔
621
        fake_nb_set6.isite = 0
1✔
622
        fake_nb_set7.isite = 0
1✔
623
        dummy_se = DummyStructureEnvironments()
1✔
624
        dummy_se.neighbors_sets = []
1✔
625
        dummy_se.neighbors_sets.append({})
1✔
626
        dummy_se.neighbors_sets[0][1] = [fake_nb_set1]
1✔
627
        dummy_se.neighbors_sets[0][2] = [fake_nb_set2]
1✔
628
        dummy_se.neighbors_sets[0][3] = [fake_nb_set3]
1✔
629
        dummy_se.neighbors_sets[0][4] = [fake_nb_set4, fake_nb_set5_m2]
1✔
630
        dummy_se.neighbors_sets[0][5] = [fake_nb_set5]
1✔
631
        dummy_se.neighbors_sets[0][6] = [fake_nb_set6]
1✔
632
        dummy_se.neighbors_sets[0][7] = [fake_nb_set7]
1✔
633

634
        dummy_voronoi = DummyVoronoiContainer()
1✔
635
        dummy_voronoi.voronoi_list2 = []
1✔
636
        dummy_voronoi.voronoi_list2.append([])
1✔
637
        dummy_voronoi.voronoi_list2[0].append({"normalized_distance": 1.0})  # 0
1✔
638
        dummy_voronoi.voronoi_list2[0].append({"normalized_distance": 1.2})  # 1
1✔
639
        dummy_voronoi.voronoi_list2[0].append({"normalized_distance": 1.225})  # 2
1✔
640
        dummy_voronoi.voronoi_list2[0].append({"normalized_distance": 1.25})  # 3
1✔
641
        dummy_voronoi.voronoi_list2[0].append({"normalized_distance": 1.275})  # 4
1✔
642
        dummy_voronoi.voronoi_list2[0].append({"normalized_distance": 1.3})  # 5
1✔
643
        dummy_voronoi.voronoi_list2[0].append({"normalized_distance": 1.8})  # 6
1✔
644
        # Following fake neighbor dict is not in the neighbors sets
645
        dummy_voronoi.voronoi_list2[0].append({"normalized_distance": 1.55})  # 7
1✔
646

647
        for fake_nb_set in [
1✔
648
            fake_nb_set1,
649
            fake_nb_set2,
650
            fake_nb_set3,
651
            fake_nb_set4,
652
            fake_nb_set5,
653
            fake_nb_set5_m2,
654
            fake_nb_set6,
655
            fake_nb_set7,
656
        ]:
657
            fake_nb_set.normalized_distances = [
1✔
658
                dummy_voronoi.voronoi_list2[0][ivoro_nb]["normalized_distance"]
659
                for ivoro_nb in fake_nb_set.site_voronoi_indices
660
            ]
661

662
        dummy_se.voronoi = dummy_voronoi
1✔
663

664
        cn_map1 = (1, 0)
1✔
665
        cn_map2 = (2, 0)
1✔
666
        cn_map3 = (3, 0)
1✔
667
        cn_map4 = (4, 0)
1✔
668
        cn_map5 = (5, 0)
1✔
669
        cn_map5_m2 = (4, 1)
1✔
670
        cn_map6 = (6, 0)
1✔
671
        cn_map7 = (7, 0)
1✔
672

673
        myweight1 = dnbset_weight.weight(fake_nb_set1, dummy_se, cn_map=cn_map1, additional_info=None)
1✔
674
        assert abs(myweight1 - 0.0) < 1e-8
1✔
675
        myweight2 = dnbset_weight.weight(fake_nb_set2, dummy_se, cn_map=cn_map2, additional_info=None)
1✔
676
        assert abs(myweight2 - 0.103515625) < 1e-8
1✔
677
        myweight3 = dnbset_weight.weight(fake_nb_set3, dummy_se, cn_map=cn_map3, additional_info=None)
1✔
678
        assert abs(myweight3 - 0.5) < 1e-8
1✔
679
        myweight4 = dnbset_weight.weight(fake_nb_set4, dummy_se, cn_map=cn_map4, additional_info=None)
1✔
680
        assert abs(myweight4 - 0.896484375) < 1e-8
1✔
681
        myweight5 = dnbset_weight.weight(fake_nb_set5, dummy_se, cn_map=cn_map5, additional_info=None)
1✔
682
        assert abs(myweight5 - 1.0) < 1e-8
1✔
683
        myweight5_m2 = dnbset_weight.weight(fake_nb_set5_m2, dummy_se, cn_map=cn_map5_m2, additional_info=None)
1✔
684
        assert abs(myweight5_m2 - 0.103515625) < 1e-8
1✔
685
        myweight7 = dnbset_weight.weight(fake_nb_set7, dummy_se, cn_map=cn_map7, additional_info=None)
1✔
686
        assert abs(myweight7 - 1.0) < 1e-8
1✔
687

688
        myweight_2_3 = dnbset_weight2.weight(fake_nb_set3, dummy_se, cn_map=cn_map3, additional_info=None)
1✔
689
        assert abs(myweight_2_3 - 0.5) < 1e-8
1✔
690
        myweight_2_4 = dnbset_weight2.weight(fake_nb_set4, dummy_se, cn_map=cn_map4, additional_info=None)
1✔
691
        assert abs(myweight_2_4 - 0.84375) < 1e-8
1✔
692
        myweight_2_2 = dnbset_weight2.weight(fake_nb_set2, dummy_se, cn_map=cn_map2, additional_info=None)
1✔
693
        assert abs(myweight_2_2 - 0.15625) < 1e-8
1✔
694

695
        dnbset_weight3 = DistanceNbSetWeight(
1✔
696
            weight_function={
697
                "function": "smoothstep",
698
                "options": {"lower": 1.5, "upper": 1.7},
699
            },
700
            nbs_source="nb_sets",
701
        )
702
        dnbset_weight4 = DistanceNbSetWeight(
1✔
703
            weight_function={
704
                "function": "smoothstep",
705
                "options": {"lower": 1.5, "upper": 1.7},
706
            },
707
            nbs_source="voronoi",
708
        )
709

710
        myweight_3_6 = dnbset_weight3.weight(fake_nb_set6, dummy_se, cn_map=cn_map6, additional_info=None)
1✔
711
        assert abs(myweight_3_6 - 1.0) < 1e-8
1✔
712
        myweight_4_6 = dnbset_weight4.weight(fake_nb_set6, dummy_se, cn_map=cn_map6, additional_info=None)
1✔
713
        assert abs(myweight_4_6 - 0.15625) < 1e-8
1✔
714

715
        deltadnbset_weight = DeltaDistanceNbSetWeight(
1✔
716
            weight_function={
717
                "function": "smootherstep",
718
                "options": {"lower": 0.05, "upper": 0.15},
719
            }
720
        )
721

722
        myweightdelta1 = deltadnbset_weight.weight(fake_nb_set1, dummy_se, cn_map=cn_map1, additional_info=None)
1✔
723
        assert abs(myweightdelta1 - 1.0) < 1e-8
1✔
724
        myweightdelta2 = deltadnbset_weight.weight(fake_nb_set2, dummy_se, cn_map=cn_map2, additional_info=None)
1✔
725
        assert abs(myweightdelta2 - 0.0) < 1e-8
1✔
726
        myweightdelta3 = deltadnbset_weight.weight(fake_nb_set3, dummy_se, cn_map=cn_map3, additional_info=None)
1✔
727
        assert abs(myweightdelta3 - 0.0) < 1e-8
1✔
728

729
        deltadnbset_weight2 = DeltaDistanceNbSetWeight(
1✔
730
            weight_function={
731
                "function": "smootherstep",
732
                "options": {"lower": 0.1, "upper": 0.3},
733
            }
734
        )
735

736
        myweightdelta1 = deltadnbset_weight2.weight(fake_nb_set1, dummy_se, cn_map=cn_map1, additional_info=None)
1✔
737
        assert abs(myweightdelta1 - 0.5) < 1e-8
1✔
738
        myweightdelta2 = deltadnbset_weight2.weight(fake_nb_set2, dummy_se, cn_map=cn_map2, additional_info=None)
1✔
739
        assert abs(myweightdelta2 - 0.0) < 1e-8
1✔
740
        myweightdelta3 = deltadnbset_weight2.weight(fake_nb_set3, dummy_se, cn_map=cn_map3, additional_info=None)
1✔
741
        assert abs(myweightdelta3 - 0.0) < 1e-8
1✔
742

743
        deltadnbset_weight3 = DeltaDistanceNbSetWeight(
1✔
744
            weight_function={
745
                "function": "smoothstep",
746
                "options": {"lower": 0.1, "upper": 0.5},
747
            }
748
        )
749

750
        myweightdelta1 = deltadnbset_weight3.weight(fake_nb_set1, dummy_se, cn_map=cn_map1, additional_info=None)
1✔
751
        assert abs(myweightdelta1 - 0.15625) < 1e-8
1✔
752
        myweightdelta6 = deltadnbset_weight3.weight(fake_nb_set6, dummy_se, cn_map=cn_map6, additional_info=None)
1✔
753
        assert abs(myweightdelta6 - 0.31640625) < 1e-8
1✔
754

755
        deltadnbset_weight4 = DeltaDistanceNbSetWeight(
1✔
756
            weight_function={
757
                "function": "smoothstep",
758
                "options": {"lower": 0.1, "upper": 0.5},
759
            },
760
            nbs_source="nb_sets",
761
        )
762

763
        myweightdelta1 = deltadnbset_weight4.weight(fake_nb_set1, dummy_se, cn_map=cn_map1, additional_info=None)
1✔
764
        assert abs(myweightdelta1 - 0.15625) < 1e-8
1✔
765
        myweightdelta6 = deltadnbset_weight4.weight(fake_nb_set6, dummy_se, cn_map=cn_map6, additional_info=None)
1✔
766
        assert abs(myweightdelta6 - 1.0) < 1e-8
1✔
767

768

769
if __name__ == "__main__":
1✔
770
    unittest.main()
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc