Source code for metawards._demographic


from dataclasses import dataclass as _dataclass

from ._variableset import VariableSet
from ._network import Network

__all__ = ["Demographic"]


[docs]@_dataclass class Demographic: """This class represents a single demographic""" #: The name of this demographic. This will be used as a label, #: and should be unique within the Demographics name: str = None #: The proportion of "work" (fixed movement) members in this #: demographic out of the entire population. This can either #: be a single number, or a list with a value for every ward. #: Whichever way is used, the sum of "work_ratio" for each demographic #: must equal 1.0 in each ward (every member of the work population #: must be represented) work_ratio: float = 0.0 #: The proportion of "play" (random movement) members in this #: demographic out of the entire population. This can also either #: be a single number, or a list with a value for every ward. #: Whichever way is used, the sum of "play_ratio" for each demographic #: must equal 1.0 in each ward (every member of the play population #: must be represented) play_ratio: float = 0.0 #: How the parameters for this demographic should be changed compared #: to the parameters used for the whole population. This is currently #: changed to fixed values, but future developments in VariableSet #: will support rules for varying relative to the whole population. #: If this is None then this demographic will have the same #: parameters as the whole population adjustment: VariableSet = None
[docs] def specialise(self, network: Network, profiler=None, nthreads: int = 1): """Return a copy of the passed network that has been specialised for this demographic. The returned network will contain only members of this demographic, with the parameters of the network adjusted according to the rules of this demographic Parameters ---------- network: Network The network to be specialised Returns ------- network: Network The specialised network """ # Start by making a shallow copy of all elements - I really do # only want the immediate children of the network to be copied. # I will then change what is needed in deep copies - this should # save memory for things that don't change import copy subnet = copy.copy(network) # Now create safe copies of the nodes and links. This will # shallow copy what it can, and will deep copy variables # that will change during a model run subnet.nodes = network.nodes.copy() subnet.links = network.links.copy() subnet.play = network.play.copy() # Now we need to adjust the number of susceptibles in each # ward according to work_ratio and play_ratio subnet.scale_susceptibles(work_ratio=self.work_ratio, play_ratio=self.play_ratio) # Now specialise the parameters for this network if self.adjustment is not None: subnet.params = network.params.set_variables(self.adjustment) subnet.name = self.name return subnet