"""Composition class used to represent a chemical composition."""from__future__importannotationsfromfunctoolsimportcached_propertyfrompymatgen.core.compositionimportCompositionasPymatgenComposition
[docs]classComposition(PymatgenComposition):"""Modified Composition class adapted from pymatgen. The purpose of this is to modify / extend methods for better performance within the rxn_network package. """def__init__(self,*args,strict:bool=False,**kwargs):"""Very flexible Composition construction, similar to the built-in Python dict(). Also extended to allow simple string init. Takes any inputs supported by the Python built-in dict function. 1. A dict of either {Element/Species: amount}, {string symbol:amount}, or {atomic number:amount} or any mixture of these. E.g., {Element("Li"): 2, Element("O"): 1}, {"Li":2, "O":1}, {3: 2, 8: 1} all result in a Li2O composition. 2. Keyword arg initialization, similar to a dict, e.g., Composition(Li = 2, O = 1) In addition, the Composition constructor also allows a single string as an input formula. E.g., Composition("Li2O"). Args: *args: Any number of 2-tuples as key-value pairs. strict (bool): Only allow valid Elements and Species in the Composition. Defaults to False. allow_negative (bool): Whether to allow negative compositions. Defaults to False. **kwargs: Additional kwargs supported by the dict() constructor. """super().__init__(*args,strict=strict,**kwargs)@cached_propertydefreduced_formula(self)->str:"""Returns a pretty normalized formula, i.e., LiFePO4 instead of Li4Fe4P4O16. """returnself.get_reduced_formula_and_factor()[0]