Source code for rxn_network.pathways.basic

"""Implements a class for storing (unbalanced/unconstrained) collection of reactions
forming a reaction pathway.
"""

from __future__ import annotations

from typing import TYPE_CHECKING

from rxn_network.pathways.base import Pathway

if TYPE_CHECKING:
    from rxn_network.reactions.base import Reaction


[docs] class BasicPathway(Pathway): """Simple pathway class for storing multiple ComputedReaction objects which form a single reaction pathway. In this class, there are no constraints on stoichiometry. See BalancedPathway for the more constrained version. """ def __init__(self, reactions: list[Reaction], costs: list[float] | None = None): """Args: reactions: list of ComputedReaction objects making up the pathway. costs: Optional list of corresponding costs for each reaction. """ self._reactions = reactions self.costs = costs or [] @property def reactions(self) -> list[Reaction]: """A list of reactions contained in the reaction pathway.""" return self._reactions @property def total_cost(self) -> float: """The sum of all costs associated with reactions in the pathway.""" return sum(self.costs) @property def is_experimental(self) -> bool: """Whether or not all reactions in the pathway are experimental.""" return all(e.is_experimental for e in self.entries) def __repr__(self) -> str: path_info = "" for rxn in self.reactions: path_info += f"{rxn} (dG = {round(rxn.energy_per_atom, 3)} eV/atom) \n" path_info += f"Total Cost: {round(self.total_cost,3)}" return path_info def __eq__(self, other) -> bool: if isinstance(other, self.__class__): return all(other_rxn == rxn for other_rxn, rxn in zip(other.reactions, self.reactions)) return False def __hash__(self): return hash(tuple(self.reactions))