@@ -38,9 +38,10 @@ class DuplicateNodeNameException(Exception):
3838 pass
3939
4040 def __init__ (self , nodes : List [Node ], idref : str , default_node : Node = None ):
41+ """
42+ Passed-in default nodes are optional. If one is not passed in, one will be created.
43+ """
4144 super ().__init__ (idref = idref )
42- # TODO: node ids should be required to be UNIQUE to prevent later failures when running EMOD. Any update to
43- # self.nodes should trigger a check/error if needed.
4445 self .nodes = nodes
4546 self .implicits = list ()
4647 self .migration_files = list ()
@@ -50,33 +51,28 @@ def __init__(self, nodes: List[Node], idref: str, default_node: Node = None):
5051 if node .id <= 0 :
5152 raise InvalidNodeIdException (f"Non-default nodes must have integer ids > 0 . Found id: { node .id } " )
5253
53- # Build the default node if not provided
54- metadata = self .generate_headers ()
55- if default_node is None : # use raw attribute, current malaria/other disease style
56- # currently all non-HIV disease route
57- self .default_node = None
58- self .metadata = None
59- self .raw = {"Defaults" : dict (), "Metadata" : metadata }
60- self .raw ["Defaults" ]["NodeAttributes" ] = dict ()
61- self .raw ["Defaults" ]["IndividualAttributes" ] = dict ()
62- self .raw ["Defaults" ]["NodeID" ] = 0
63- self .raw ["Defaults" ]["IndividualProperties" ] = list ()
64- # TODO: remove the following setting of birth_rate on the default node once this EMOD binary issue is fixed
65- # https://github.com/InstituteforDiseaseModeling/DtkTrunk/issues/4009
66- self .raw ["Defaults" ]["NodeAttributes" ]["BirthRate" ] = 0
67- else : # HIV style
68- self .default_node = default_node
69- self .default_node .name = self .DEFAULT_NODE_NAME
70- if self .default_node .id != 0 :
71- raise InvalidNodeIdException (f"Default nodes must have an id of 0. It is { self .default_node .id } ." )
72- self .metadata = metadata
73- # TODO: remove the following setting of birth_rate on the default node once this EMOD binary issue is fixed
74- # https://github.com/InstituteforDiseaseModeling/DtkTrunk/issues/4009
75- self .get_node_by_id (node_id = 0 ).birth_rate = 0
54+ # Build the default node if not provided and then perform some setup/verification
55+ default_node = self ._generate_default_node () if default_node is None else default_node
56+ self .default_node = default_node
57+ self .default_node .name = self .DEFAULT_NODE_NAME
58+ if self .default_node .id != 0 :
59+ raise InvalidNodeIdException (f"Default nodes must have an id of 0. It is { self .default_node .id } ." )
60+ self .metadata = self .generate_headers ()
61+ # TODO: remove the following setting of birth_rate on the default node once this EMOD binary issue is fixed
62+ # https://github.com/InstituteforDiseaseModeling/DtkTrunk/issues/4009
63+ if self .default_node .birth_rate is None :
64+ self .default_node .birth_rate = 0
7665
7766 # enforce unique node ids and names
7867 self .verify_demographics_integrity ()
7968
69+ def _generate_default_node (self ) -> Node :
70+ default_node = Node (lat = 0 , lon = 0 , pop = 0 , name = self .DEFAULT_NODE_NAME , forced_id = 0 )
71+ # TODO: remove the following setting of birth_rate on the default node once this EMOD binary issue is fixed
72+ # https://github.com/InstituteforDiseaseModeling/DtkTrunk/issues/4009
73+ default_node .birth_rate = 0
74+ return default_node
75+
8076 def _select_node_dicts (self , node_ids = None ):
8177 if node_ids is None :
8278 node_dicts = [self .raw ['Defaults' ]]
@@ -1060,3 +1056,13 @@ def min_not_nan(x_list):
10601056 }
10611057 self .implicits .append (DT ._set_mortality_age_gender_year )
10621058 return dict_female , dict_male
1059+
1060+ def to_dict (self ) -> Dict :
1061+ self .verify_demographics_integrity ()
1062+ demographics_dict = {
1063+ 'Defaults' : self .default_node .to_dict (),
1064+ 'Nodes' : [node .to_dict () for node in self .nodes ],
1065+ 'Metadata' : self .metadata
1066+ }
1067+ demographics_dict ["Metadata" ]["NodeCount" ] = len (self .nodes )
1068+ return demographics_dict
0 commit comments