KarrLab/wc_sim

View on GitHub
wc_sim/future_multialgorithm_simulation.py

Summary

Maintainability
A
0 mins
Test Coverage
""" Future improvements to wc_sim/multialgorithm_simulation.py; useful later

:Author: Arthur Goldberg <Arthur.Goldberg@mssm.edu>
:Date: 2019-10-02
:Copyright: 2016-2019, Karr Lab
:License: MIT
"""

DEFAULT_VALUES = dict(  # pragma: no cover
    shared_species_store='SHARED_SPECIES_STORE'
)


# TODO(Arthur): not currently used; incorporate after MVP wc_sim done
class MultialgorithmSimulation(object):   # pragma: no cover; code for use later
    """ Initialize a multialgorithm simulation from a language model and run-time parameters

    Attributes:
        shared_species_store_name (:obj:`str`): the name for the shared species store
        species_pop_objs (:obj:`dict` of `SpeciesPopSimObject`): shared species
            populations used by `SimulationObject`\ 's; not currently used
        private_species (:obj:`dict` of `set`): map from `DynamicSubmodel` to a set of the species
                modeled by only the submodel; not currently used
        shared_species (:obj:`set`): the shared species
    """

    def __init__(self, model, args, shared_species_store_name=DEFAULT_VALUES['shared_species_store']):
        """
        Args:
            shared_species_store_name (:obj:`str`, optional): the name of the shared species store; not currently used
        """
        self.shared_species_store_name = shared_species_store_name  # not currently used
        self.species_pop_objs = {}

    # not currently used
    def partition_species(self):
        """ Partition species populations for this model's submodels
        """
        self.init_populations = self.get_initial_species_pop(self.model, self.random_state)
        # self.private_species not currently used
        self.private_species = ModelUtilities.find_private_species(self.model, return_ids=True)
        self.shared_species = ModelUtilities.find_shared_species(self.model, return_ids=True)
        # self.species_pop_objs not currently used
        self.species_pop_objs = self.create_shared_species_pop_objs()

    # not currently used
    def create_shared_species_pop_objs(self):
        """ Create the shared species object.

        Returns:
            dict: `dict` mapping id to `SpeciesPopSimObject` objects for the simulation
        """
        species_pop_sim_obj = SpeciesPopSimObject(
            self.shared_species_store_name,
            {species_id: self.init_populations[species_id] for species_id in self.shared_species},
            molecular_weights=self.molecular_weights_for_species(self.shared_species),
            random_state=self.random_state)
        self.simulation.add_object(species_pop_sim_obj)
        return {self.shared_species_store_name: species_pop_sim_obj}

    def create_access_species_pop(self, lang_submodel):   # pragma: no cover
        """ Create a `LocalSpeciesPopulations` for a submodel and wrap it in an `AccessSpeciesPopulations`

        Args:
            lang_submodel (:obj:`Submodel`): description of a submodel

        Returns:
            :obj:`AccessSpeciesPopulations`: an `AccessSpeciesPopulations` for the `lang_submodel`
        """
        # make LocalSpeciesPopulations & molecular weights
        initial_population = {species_id: self.init_populations[species_id]
                              for species_id in self.private_species[lang_submodel.id]}
        molecular_weights = self.molecular_weights_for_species(self.private_species[lang_submodel.id])

        # DFBA submodels need initial fluxes
        if are_terms_equivalent(lang_submodel.framework, onto['WC:dynamic_flux_balance_analysis']):
            init_pop_slopes = {species_id: 0 for species_id in self.private_species[lang_submodel.id]}
        else:
            init_pop_slopes = None
        local_species_population = LocalSpeciesPopulation(
            lang_submodel.id.replace('_', '_lsp_'),
            initial_population,
            molecular_weights,
            initial_population_slopes=init_pop_slopes)

        # make AccessSpeciesPopulations object
        access_species_population = AccessSpeciesPopulations(local_species_population,
                                                             self.species_pop_objs)

        # configure species locations in the access_species_population
        access_species_population.add_species_locations(LOCAL_POP_STORE,
                                                        self.private_species[lang_submodel.id])
        access_species_population.add_species_locations(self.shared_species_store_name,
                                                        self.shared_species)
        return access_species_population