Source code for emodpy_hiv.countries.converting.new_demographics_old_format
import json
from pathlib import Path
from typing import Union
import emodpy_hiv.country_model as country_model
def _reduce_to_population_only(demog_json):
"""
Reduce the demographics json to only include the population parameters.
This is used to create the Demographics.json file.
"""
del demog_json["Defaults"]["Society"]
for node in demog_json["Nodes"]:
del node["IndividualProperties"]
del node["Society"]
return demog_json
def _reduce_to_ip_only(demog_json):
"""
Reduce the demographics json to only include the IndividualProperties
parameters. This is used to create the Accessibility_and_Risk_IP_Overlay.json file.
"""
del demog_json["Defaults"]["Society"]
del demog_json["Defaults"]["IndividualAttributes"]
del demog_json["Defaults"]["NodeAttributes"]
for node in demog_json["Nodes"]:
new_ips = []
for ip_name in ["Accessibility", "Risk", "CascadeState"]:
for ip in node["IndividualProperties"]:
if ip["Property"] == ip_name:
new_ips.append(ip)
node["IndividualProperties"] = new_ips
del node["Society"]
del node["IndividualAttributes"]
del node["NodeAttributes"]
return demog_json
def _reduce_to_society_only(demog_json):
"""
Reduce the demographics json to only include the Society parameters minus
the Concurrency_Configuration and Relationship_Parameters.
This is used to create the PFA_Overlay.json file.
"""
from emodpy_hiv.utils.emod_enum import RelationshipType
del demog_json["Defaults"]["IndividualAttributes"]
del demog_json["Defaults"]["IndividualProperties"]
del demog_json["Defaults"]["NodeAttributes"]
for rel_type in RelationshipType:
if rel_type == RelationshipType.COUNT:
continue
demog_json["Defaults"]["Society"][rel_type.value]["Pair_Formation_Parameters"]["Assortivity"] = {"Group": "NO_GROUP"}
del demog_json["Defaults"]["Society"][rel_type.value]["Relationship_Parameters"]
for node in demog_json["Nodes"]:
del node["IndividualAttributes"]
del node["IndividualProperties"]
del node["NodeAttributes"]
del node["Society"]["Concurrency_Configuration"]
return demog_json
def _reduce_to_assortivity_only(demog_json):
"""
Reduce the demographics json to only include the Assortivity parameter/matrix
that is part of the Pair_Formation_Parameters. This used to be the old
Risk_Assortivity_Overlay.json file.
"""
from emodpy_hiv.utils.emod_enum import RelationshipType
del demog_json["Defaults"]["IndividualAttributes"]
del demog_json["Defaults"]["IndividualProperties"]
del demog_json["Defaults"]["NodeAttributes"]
del demog_json["Defaults"]["Society"]["Concurrency_Configuration"]
for rel_type in RelationshipType:
if rel_type == RelationshipType.COUNT:
continue
assortivity = demog_json["Defaults"]["Society"][rel_type.value]["Pair_Formation_Parameters"]["Assortivity"]
del demog_json["Defaults"]["Society"][rel_type.value]["Pair_Formation_Parameters"]
demog_json["Defaults"]["Society"][rel_type.value]["Pair_Formation_Parameters"] = {}
demog_json["Defaults"]["Society"][rel_type.value]["Pair_Formation_Parameters"]["Assortivity"] = assortivity
del demog_json["Defaults"]["Society"][rel_type.value]["Concurrency_Parameters"]
del demog_json["Defaults"]["Society"][rel_type.value]["Relationship_Parameters"]
for node in demog_json["Nodes"]:
del node["IndividualAttributes"]
del node["IndividualProperties"]
del node["NodeAttributes"]
del node["Society"]["Concurrency_Configuration"]
for rel_type in RelationshipType:
if rel_type == RelationshipType.COUNT:
continue
del node["Society"][rel_type]["Relationship_Parameters"]
return demog_json
OLD_FILENAMES = [
"Demographics",
"PFA_Overlay",
"Accessibility_and_Risk_IP_Overlay",
"Risk_Assortivity_Overlay"
]
[docs]
def get_old_demographic_filenames(add_extension: bool = True):
filenames = OLD_FILENAMES.copy()
if add_extension:
for name in filenames:
name = name + ".json"
return filenames
[docs]
def create_old_demographic_files(country_name: str,
output_dir: Union[str, Path] = None,
suffix: str = None):
"""
A function that outputs the demographics files for the Zambia model in the old format
of four overlay files: Demographics.json, PFA_Overlay.json, Accessibility_and_Risk_IP_Overlay.json,
Risk_Assortivity_Overlay.json. The files are created in the output_dir directory. This can be
helpful wnen comparing the new and old models.
Args:
output_dir (str or Path)
The directory where the files will be created. If None, the current
directory will be used.
suffix (str):
A suffix to add to the file names. If None, no suffix will be added.
"""
if country_name is None:
raise ValueError("You must specify a country to create the demographics for.")
country_class = country_model.get_country_class(country_class_name=country_name)
if output_dir is None:
output_dir = "."
reduce_list = ["population", "ip", "society", "assortivity"]
for reduce in reduce_list:
demog = country_class.build_demographics()
demog_json = demog.to_dict()
reduced_fn = None
if reduce == "population":
demog_json = _reduce_to_population_only(demog_json=demog_json)
reduced_fn = OLD_FILENAMES[0]
elif reduce == "society":
demog_json = _reduce_to_society_only(demog_json=demog_json)
reduced_fn = OLD_FILENAMES[1]
elif reduce == "ip":
demog_json = _reduce_to_ip_only(demog_json=demog_json)
reduced_fn = OLD_FILENAMES[2]
elif reduce == "assortivity":
demog_json = _reduce_to_assortivity_only(demog_json=demog_json)
reduced_fn = OLD_FILENAMES[3]
if suffix is not None:
reduced_fn = reduced_fn + "_" + suffix
tmp_filename = Path(output_dir).joinpath(reduced_fn + ".json")
with open(tmp_filename, "w") as file:
tmp = json.dumps(demog_json, indent=4, sort_keys=True)
tmp = json.loads(tmp, parse_float=lambda x: round(float(x), 9))
json.dump(tmp, file, indent=4, sort_keys=True)
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-c', '--country', type=str, default=None, help='The country class to create the demographics for.')
parser.add_argument('-o', '--output', type=str, default=None, help='A directory to save the default demographics data to in the old set of four overlay files format.')
parser.add_argument('-s', '--suffix', type=str, default=None, help='A short string to append to the output file names.')
args = parser.parse_args()
create_old_demographic_files(args.country, args.output, args.suffix)