Ejemplo n.º 1
0
    def run_sim(self,
                params_dict=None,
                write_results_json=False,
                population_type=None):
        if not self.simulation_parameters or params_dict:  # If we need one, or have one here
            self.set_simulation_parameters(params_dict=params_dict)
            pass

        self.simulation_parameters['interventions'] = self.interventions

        self.sim = Sim(pars=self.simulation_parameters, datafile=None)
        if not self.simulation_prognoses:
            self.simulation_prognoses = parameters.get_prognoses(
                self.simulation_parameters[
                    TestProperties.ParameterKeys.ProgressionKeys.
                    ProbabilityKeys.progression_by_age])
            pass

        self.sim['prognoses'] = self.simulation_prognoses
        if population_type:
            self.sim.update_pars(pop_type=population_type)
        self.sim.run(verbose=0)
        self.simulation_result = self.sim.to_json(tostring=False)
        if write_results_json or self.is_debugging:
            with open(self.expected_result_filename, 'w') as outfile:
                json.dump(self.simulation_result,
                          outfile,
                          indent=4,
                          sort_keys=True)
        pass
Ejemplo n.º 2
0
class MiscellaneousFeatureTests(CovaTest):
    def setUp(self):
        super().setUp()
        self.sim = Sim(pop_size=500)
        self.pars = parameters.make_pars()
        self.is_debugging = False

    def test_xslx_generation(self):
        super().tearDown()
        self.is_debugging = False
        root_filename = "DEBUG_test_xlsx_generation"
        excel_filename = f"{root_filename}.xlsx"
        if os.path.isfile(excel_filename):
            os.unlink(excel_filename)
        test_infected_value = 31
        params_dict = {'pop_size': 500, 'pop_infected': test_infected_value}
        self.run_sim(params_dict)
        self.sim.to_excel(filename=root_filename)
        simulation_df = pd.ExcelFile(excel_filename)
        expected_sheets = ['Results', 'Parameters']
        for sheet in expected_sheets:
            self.assertIn(sheet, simulation_df.sheet_names)
        params_df = simulation_df.parse('Parameters')
        observed_infected_param = params_df.loc[
            params_df['Parameter'] == 'pop_infected', 'Value'].values[0]
        self.assertEqual(
            observed_infected_param,
            test_infected_value,
            msg=
            "Should be able to parse the pop_infected parameter from the results sheet"
        )
        results_df = simulation_df.parse('Results')
        observed_day_0_exposed = results_df.loc[results_df['t'] == 0,
                                                'n_exposed'].values[0]
        self.assertGreaterEqual(
            observed_day_0_exposed,
            test_infected_value,
            msg=
            "Should be able to parse the day 0 n_exposed value from the results sheet."
        )
        if not self.is_debugging:
            os.unlink(excel_filename)

    def test_set_pars_invalid_key(self):
        with self.assertRaises(KeyError) as context:
            self.sim['n_infectey'] = 10
        error_message = str(context.exception)
        self.assertIn('n_infectey', error_message)
        self.assertIn('pop_infected', error_message)

    def test_update_pars_invalid_key(self):
        invalid_key = {'dooty_doo': 5}
        with self.assertRaises(KeyError) as context:
            self.sim.update_pars(invalid_key)
        error_message = str(context.exception)
        self.assertIn('dooty_doo', error_message)
Ejemplo n.º 3
0
 def run_sim(self, params_dict=None, write_results_json=True):
     if not self.simulation_parameters or params_dict: # If we need one, or have one here
         self.set_simulation_parameters(params_dict=params_dict)
         pass
     self.sim = Sim(pars=self.simulation_parameters,
                    datafile=None)
     self.sim.run(verbose=0)
     self.simulation_result = self.sim.to_json(tostring=False)
     if write_results_json:
         with open(self.expected_result_filename, 'w') as outfile:
             json.dump(self.simulation_result, outfile, indent=4, sort_keys=True)
     pass
Ejemplo n.º 4
0
def test_basic_contact_trace():

    tweaking = {
        'n_days': 60,
        'pop_size': 2000,
        'pop_type': 'hybrid'
    }

    start_days = []
    interventions = []

    test_prob_start_day = 35
    prob_test_perfect_symptomatic = test_prob(symp_prob=1.0, symp_quar_prob=1.0, asymp_quar_prob=1.0,
                                              test_sensitivity=1.0, test_delay=1, start_day=test_prob_start_day)
    start_days.append(test_prob_start_day)
    interventions.append(prob_test_perfect_symptomatic)

    contact_trace_start_day = 35
    all_contacts = {
        'h': 1.0,
        'w': 1.0,
        's': 1.0,
        'c': 1.0
    }
    single_day_delays = {
        'h': 1,
        'w': 1,
        's': 1,
        'c': 1
    }
    brutal_contact_trace = contact_tracing(trace_probs=all_contacts,
                                           trace_time=single_day_delays,
                                           start_day=contact_trace_start_day)
    start_days.append(contact_trace_start_day)
    interventions.append(brutal_contact_trace)

    tweaking['interventions'] = interventions

    test_stuff_simulation = Sim(pars=tweaking)
    test_stuff_simulation.run()

    test_stuff_results = test_stuff_simulation.to_json(tostring=False)
    with open("DEBUG_test_intervention_list_simulation.json","w") as outfile:
        json.dump(test_stuff_results, outfile, indent=4, sort_keys=True)
        pass

    assert test_stuff_results["results"]["n_symptomatic"][test_prob_start_day] > 0  # If there are symptomatics
    assert sum(test_stuff_results["results"]["new_tests"][test_prob_start_day:test_prob_start_day + 5]) > 0  # then there should be tests
    assert sum(test_stuff_results["results"]["new_diagnoses"][test_prob_start_day + 1:test_prob_start_day + 6]) > 0 # and some diagnoses
    assert sum(test_stuff_results["results"]["new_diagnoses"][test_prob_start_day + 2:test_prob_start_day + 7]) > 0 # and therefore some quarantined
    pass
Ejemplo n.º 5
0
    def apply(self, sim: cv.Sim):
        ''' Perform testing '''

        t = sim.t

        if self.n_tests[t]:

            # Compute weights for people who would test positive or negative
            positive_tests = np.zeros((sim.n, ))
            for i, person in enumerate(sim.people.values()):
                if person.infectious:
                    positive_tests[i] = 1
            negative_tests = 1 - positive_tests

            # Select the people to test in each category
            positive_inds = cv.choose_weighted(probs=positive_tests,
                                               n=min(sum(positive_tests),
                                                     self.n_positive[t]),
                                               normalize=True)
            negative_inds = cv.choose_weighted(
                probs=negative_tests,
                n=min(sum(negative_tests),
                      self.n_tests[t] - len(positive_inds)),
                normalize=True)

            # Todo - assess performance and optimize e.g. to reduce dict indexing
            for ind in positive_inds:
                person = sim.get_person(ind)
                person.test(
                    t, test_sensitivity=1.0
                )  # Sensitivity is 1 because the person is guaranteed to test positive
                sim.results['new_diagnoses'][t] += 1

            for ind in negative_inds:
                person = sim.get_person(ind)
                person.test(t, test_sensitivity=1.0)

            sim.results['new_tests'][t] += self.n_tests[t]

        return
class MiscellaneousFeatureTests(CovaSimTest):
    def setUp(self):
        super().setUp()
        self.sim = Sim()
        self.pars = parameters.make_pars()
        self.is_debugging = False

    def test_xslx_generation(self):
        super().tearDown()
        self.sim.run()
        self.sim.to_xlsx()
        pass

    def test_set_pars_invalid_key(self):
        with self.assertRaises(KeyError) as context:
            self.sim['n_infectey'] = 10
            pass
        error_message = str(context.exception)
        self.assertIn('n_infectey', error_message)
        self.assertIn('n_infected', error_message)
        print("OH YEAH")
        pass

    def test_update_pars_invalid_key(self):
        invalid_key = {'dooty_doo': 5}
        with self.assertRaises(KeyError) as context:
            self.sim.update_pars(invalid_key)
            pass
        error_message = str(context.exception)
        self.assertIn('dooty_doo', error_message)
        pass

    def test_update_pars_invalid_type(self):
        invalid_key = ('dooty_doo', 5)
        with self.assertRaises(TypeError) as context:
            self.sim.update_pars(invalid_key)
            pass
        error_message = str(context.exception)
        self.assertIn('dict', error_message)
        pass
Ejemplo n.º 7
0
    def apply(self, sim: cv.Sim):

        t = sim.t

        # Check that there are still tests
        if t < len(self.daily_tests):
            n_tests = self.daily_tests[t]  # Number of tests for this day
            sim.results['new_tests'][t] += n_tests
        else:
            return

        # If there are no tests today, abort early
        if not (n_tests and pl.isfinite(n_tests)):
            return

        test_probs = np.ones(sim.n)

        for i, person in enumerate(sim.people.values()):
            # Adjust testing probability based on what's happened to the person
            # NB, these need to be separate if statements, because a person can be both diagnosed and infectious/symptomatic
            if person.symptomatic:
                test_probs[i] *= self.sympt_test  # They're symptomatic
            if person.known_contact:
                test_probs[
                    i] *= self.trace_test  # They've had contact with a known positive
            if person.diagnosed:
                test_probs[i] = 0.0

        test_inds = cv.choose_weighted(probs=test_probs,
                                       n=n_tests,
                                       normalize=True)

        for test_ind in test_inds:
            person = sim.get_person(test_ind)
            person.test(t, self.sensitivity)
            if person.diagnosed:
                sim.results['new_diagnoses'][t] += 1

        return
Ejemplo n.º 8
0
class CovaSimTest(unittest.TestCase):
    def setUp(self):
        self.is_debugging = False

        self.simulation_parameters = None
        self.sim = None
        self.simulation_result = None
        self.expected_result_filename = f"DEBUG_{self.id()}.json"
        if os.path.isfile(self.expected_result_filename):
            os.unlink(self.expected_result_filename)
        pass

    def tearDown(self):
        if not self.is_debugging:
            if os.path.isfile(self.expected_result_filename):
                os.unlink(self.expected_result_filename)
        pass

    # region configuration methods
    def set_simulation_parameters(self, params_dict=None):
        """
        Overrides all of the default sim parameters
        with the ones in the dictionary
        Args:
            params_dict: keys are param names, values are expected values to use

        Returns:
            None, sets self.simulation_params

        """
        if not self.simulation_parameters:
            self.simulation_parameters = parameters.make_pars(
                set_prognoses=True, prog_by_age=True, use_layers=True)
        if params_dict:
            self.simulation_parameters.update(params_dict)
        pass

    def set_simulation_prognosis_probability(self, params_dict):
        """
        Allows for testing prognoses probability as absolute rather than relative.
        NOTE: You can only call this once per test or you will overwrite your stuff.
        """
        ProbKeys = TestProperties.ParameterKeys.ProgressionKeys.ProbabilityKeys
        supported_probabilities = [
            ProbKeys.inf_to_symptomatic_probability,
            ProbKeys.sym_to_severe_probability,
            ProbKeys.sev_to_critical_probability,
            ProbKeys.crt_to_death_probability
        ]
        for k in params_dict:
            if k not in supported_probabilities:
                raise KeyError(
                    f"Key {k} not found in {supported_probabilities}.")
        if not self.simulation_parameters:
            self.set_simulation_parameters()
            pass
        for k in params_dict:
            expected_prob = params_dict[k]
            old_probs = self.simulation_parameters['prognoses'][k]
            self.simulation_parameters['prognoses'][k] = np.array(
                [expected_prob] * len(old_probs))
            pass
        pass

    def set_duration_distribution_parameters(self, duration_in_question, par1,
                                             par2):
        if not self.simulation_parameters:
            self.set_simulation_parameters()
            pass
        duration_node = self.simulation_parameters["dur"]
        duration_node[duration_in_question] = {
            "dist": "normal",
            "par1": par1,
            "par2": par2
        }
        params_dict = {"dur": duration_node}
        self.set_simulation_parameters(params_dict=params_dict)

    def run_sim(self, params_dict=None, write_results_json=False):
        if not self.simulation_parameters or params_dict:  # If we need one, or have one here
            self.set_simulation_parameters(params_dict=params_dict)
            pass
        self.sim = Sim(pars=self.simulation_parameters, datafile=None)
        self.sim.run(verbose=0)
        self.simulation_result = self.sim.to_json(tostring=False)
        if write_results_json:
            with open(self.expected_result_filename, 'w') as outfile:
                json.dump(self.simulation_result,
                          outfile,
                          indent=4,
                          sort_keys=True)
        pass

    # endregion

    # region simulation results support
    def get_full_result_channel(self, channel):
        result_data = self.simulation_result["results"][channel]
        return result_data

    def get_day_zero_channel_value(
            self,
            channel=TestProperties.ResultsDataKeys.susceptible_at_timestep):
        """

        Args:
            channel: timeseries channel to report ('n_susceptible')

        Returns: day zero value for channel

        """
        result_data = self.get_full_result_channel(channel=channel)
        return result_data[0]

    def get_day_final_channel_value(self, channel):
        channel = self.get_full_result_channel(channel=channel)
        return channel[-1]

    # endregion

    # region specialized simulation methods
    def set_microsim(self):
        Simkeys = TestProperties.ParameterKeys.SimulationKeys
        Micro = TestProperties.SpecializedSimulations.Microsim
        microsim_parameters = {
            Simkeys.number_agents: Micro.n,
            Simkeys.initial_infected_count: Micro.pop_infected,
            Simkeys.number_simulated_days: Micro.n_days
        }
        self.set_simulation_parameters(microsim_parameters)
        pass

    def set_everyone_infected(self, agent_count=1000):
        Simkeys = TestProperties.ParameterKeys.SimulationKeys
        everyone_infected = {
            Simkeys.number_agents: agent_count,
            Simkeys.initial_infected_count: agent_count
        }
        self.set_simulation_parameters(params_dict=everyone_infected)
        pass

    DurationKeys = TestProperties.ParameterKeys.ProgressionKeys.DurationKeys

    def set_everyone_infectious_same_day(self,
                                         num_agents,
                                         days_to_infectious=1,
                                         num_days=60):
        """
        Args:
            num_agents: number of agents to create and infect
            days_to_infectious: days until all agents are infectious (1)
            num_days: days to simulate (60)
        """
        self.set_everyone_infected(agent_count=num_agents)
        prob_dict = {
            TestProperties.ParameterKeys.ProgressionKeys.ProbabilityKeys.inf_to_symptomatic_probability:
            0
        }
        self.set_simulation_prognosis_probability(prob_dict)
        test_config = {
            TestProperties.ParameterKeys.SimulationKeys.number_simulated_days:
            num_days
        }
        self.set_duration_distribution_parameters(
            duration_in_question=DurationKeys.exposed_to_infectious,
            par1=days_to_infectious,
            par2=0)
        self.set_simulation_parameters(params_dict=test_config)
        pass

    def set_everyone_symptomatic(self, num_agents, constant_delay: int = None):
        """
        Cause all agents in the simulation to begin infected
        And proceed to symptomatic (but not severe or death)
        Args:
            num_agents: Number of agents to begin with
        """
        self.set_everyone_infectious_same_day(num_agents=num_agents,
                                              days_to_infectious=0)
        prob_dict = {
            TestProperties.ParameterKeys.ProgressionKeys.ProbabilityKeys.inf_to_symptomatic_probability:
            1.0,
            TestProperties.ParameterKeys.ProgressionKeys.ProbabilityKeys.sym_to_severe_probability:
            0
        }
        self.set_simulation_prognosis_probability(prob_dict)
        if constant_delay is not None:
            self.set_duration_distribution_parameters(
                duration_in_question=DurationKeys.infectious_to_symptomatic,
                par1=constant_delay,
                par2=0)
        pass

    def set_everyone_is_going_to_die(self, num_agents):
        """
        Cause all agents in the simulation to begin infected and die.
        Args:
            num_agents: Number of agents to simulate
        """
        ProbKeys = TestProperties.ParameterKeys.ProgressionKeys.ProbabilityKeys
        self.set_everyone_infectious_same_day(num_agents=num_agents)
        prob_dict = {
            ProbKeys.inf_to_symptomatic_probability: 1,
            ProbKeys.sym_to_severe_probability: 1,
            ProbKeys.sev_to_critical_probability: 1,
            ProbKeys.crt_to_death_probability: 1
        }
        self.set_simulation_prognosis_probability(prob_dict)
        pass

    def set_everyone_severe(self, num_agents, constant_delay: int = None):
        self.set_everyone_symptomatic(num_agents=num_agents,
                                      constant_delay=constant_delay)
        prob_dict = {
            TestProperties.ParameterKeys.ProgressionKeys.ProbabilityKeys.sym_to_severe_probability:
            1.0,
            TestProperties.ParameterKeys.ProgressionKeys.ProbabilityKeys.sev_to_critical_probability:
            0.0
        }
        self.set_simulation_prognosis_probability(prob_dict)
        if constant_delay is not None:
            self.set_duration_distribution_parameters(
                duration_in_question=DurationKeys.symptomatic_to_severe,
                par1=constant_delay,
                par2=0)
        pass

    def set_everyone_critical(self, num_agents, constant_delay: int = None):
        """
        Causes all agents to become critically ill day 1
        """
        self.set_everyone_severe(num_agents=num_agents,
                                 constant_delay=constant_delay)
        prob_dict = {
            TestProperties.ParameterKeys.ProgressionKeys.ProbabilityKeys.sev_to_critical_probability:
            1.0,
            TestProperties.ParameterKeys.ProgressionKeys.ProbabilityKeys.crt_to_death_probability:
            0.0
        }
        self.set_simulation_prognosis_probability(prob_dict)
        if constant_delay is not None:
            self.set_duration_distribution_parameters(
                duration_in_question=DurationKeys.severe_to_critical,
                par1=constant_delay,
                par2=0)
        pass

    def set_smallpop_hightransmission(self):
        """
        Creates a small population with lots of transmission
        """
        Simkeys = TestProperties.ParameterKeys.SimulationKeys
        Transkeys = TestProperties.ParameterKeys.TransmissionKeys
        Progkeys = TestProperties.ParameterKeys.ProgressionKeys
        Hightrans = TestProperties.SpecializedSimulations.Hightransmission
        hightrans_parameters = {
            Simkeys.number_agents: Hightrans.n,
            Simkeys.initial_infected_count: Hightrans.pop_infected,
            Simkeys.number_simulated_days: Hightrans.n_days,
            Transkeys.beta: Hightrans.beta
        }
        self.set_simulation_parameters(hightrans_parameters)
        pass

    # endregion
    pass
 def setUp(self):
     super().setUp()
     self.sim = Sim()
     self.pars = parameters.make_pars()
     self.is_debugging = False
Ejemplo n.º 10
0
class CovaSimTest(unittest.TestCase):
    def setUp(self):
        self.is_debugging = False

        self.simulation_parameters = None
        self.sim = None
        self.simulation_result = None
        self.expected_result_filename = f"DEBUG_{self.id()}.json"
        if os.path.isfile(self.expected_result_filename):
            os.unlink(self.expected_result_filename)
        pass

    def tearDown(self):
        if not self.is_debugging:
            if os.path.isfile(self.expected_result_filename):
                os.unlink(self.expected_result_filename)
        pass

    # region configuration methods
    def set_simulation_parameters(self, params_dict=None):
        """
        Overrides all of the default sim parameters
        with the ones in the dictionary
        Args:
            params_dict: keys are param names, values are expected values to use

        Returns:
            None, sets self.simulation_params

        """
        if not self.simulation_parameters:
            self.simulation_parameters = parameters.make_pars()
        if params_dict:
            self.simulation_parameters.update(params_dict)
        pass

    def run_sim(self, params_dict=None, write_results_json=True):
        if not self.simulation_parameters or params_dict:  # If we need one, or have one here
            self.set_simulation_parameters(params_dict=params_dict)
            pass
        self.sim = Sim(pars=self.simulation_parameters, datafile=None)
        self.sim.run(verbose=0)
        self.simulation_result = self.sim.to_json(tostring=False)
        if write_results_json:
            with open(self.expected_result_filename, 'w') as outfile:
                json.dump(self.simulation_result,
                          outfile,
                          indent=4,
                          sort_keys=True)
        pass

    # endregion

    # region simulation results support
    def get_full_result_channel(self, channel):
        result_data = self.simulation_result["results"][channel]
        return result_data

    def get_day_zero_channel_value(
            self,
            channel=TestProperties.ResultsDataKeys.susceptible_at_timestep):
        """

        Args:
            channel: timeseries channel to report ('n_susceptible')

        Returns: day zero value for channel

        """
        result_data = self.get_full_result_channel(channel=channel)
        return result_data[0]

    def get_day_final_channel_value(self, channel):
        channel = self.get_full_result_channel(channel=channel)
        return channel[-1]

    # endregion

    # region specialized simulation methods
    def set_microsim(self):
        Simkeys = TestProperties.ParameterKeys.SimulationKeys
        Transkeys = TestProperties.ParameterKeys.TransmissionKeys
        Micro = TestProperties.SpecializedSimulations.Microsim
        microsim_parameters = {
            Simkeys.number_agents: Micro.n,
            Simkeys.initial_infected_count: Micro.n_infected,
            Simkeys.number_simulated_days: Micro.n_days,
            Transkeys.contacts_per_agent: Micro.contacts
        }
        self.set_simulation_parameters(microsim_parameters)
        pass

    def set_smallpop_hightransmission(self):
        """
        Creates a small population with lots of transmission
        """
        Simkeys = TestProperties.ParameterKeys.SimulationKeys
        Transkeys = TestProperties.ParameterKeys.TransmissionKeys
        Progkeys = TestProperties.ParameterKeys.ProgressionKeys
        Hightrans = TestProperties.SpecializedSimulations.Hightransmission
        hightrans_parameters = {
            Simkeys.number_agents: Hightrans.n,
            Simkeys.initial_infected_count: Hightrans.n_infected,
            Simkeys.number_simulated_days: Hightrans.n_days,
            Transkeys.contacts_per_agent: Hightrans.contacts,
            Transkeys.beta: Hightrans.beta,
            Progkeys.exposed_to_infectious: Hightrans.serial,
            Progkeys.exposed_to_infectious_std: Hightrans.serial_std,
            Progkeys.infectiousness_duration: Hightrans.dur
        }
        self.set_simulation_parameters(hightrans_parameters)
        pass

    def set_superhigh_mortality(self):
        """
        builds on high transmission with high mortality
        """
        Simkeys = TestProperties.ParameterKeys.SimulationKeys
        MortKeys = TestProperties.ParameterKeys.MortalityKeys
        MortalityTestKeys = TestProperties.SpecializedSimulations.HighMortality
        self.set_smallpop_hightransmission()
        more_people_high_mortality = {
            Simkeys.number_agents: MortalityTestKeys.n,
            MortKeys.use_cfr_by_age: MortalityTestKeys.cfr_by_age,
            MortKeys.default_cfr: MortalityTestKeys.default_cfr,
            MortKeys.time_to_death: MortalityTestKeys.timetodie,
            MortKeys.time_to_death_std: MortalityTestKeys.timetodie_std
        }
        self.set_simulation_parameters(params_dict=more_people_high_mortality)
        pass

    # endregion
    pass
Ejemplo n.º 11
0
class CovaSimTest(unittest.TestCase):
    def setUp(self):
        self.is_debugging = False

        self.simulation_parameters = None
        self.sim = None
        self.simulation_result = None
        self.expected_result_filename = f"DEBUG_{self.id()}.json"
        if os.path.isfile(self.expected_result_filename):
            os.unlink(self.expected_result_filename)
        pass

    def tearDown(self):
        if not self.is_debugging:
            if os.path.isfile(self.expected_result_filename):
                os.unlink(self.expected_result_filename)
        pass

    # region configuration methods
    def set_simulation_parameters(self, params_dict=None):
        """
        Overrides all of the default sim parameters
        with the ones in the dictionary
        Args:
            params_dict: keys are param names, values are expected values to use

        Returns:
            None, sets self.simulation_params

        """
        if not self.simulation_parameters:
            self.simulation_parameters = parameters.make_pars()
        if params_dict:
            self.simulation_parameters.update(params_dict)
        pass

    def run_sim(self, params_dict=None, write_results_json=True):
        if not self.simulation_parameters or params_dict: # If we need one, or have one here
            self.set_simulation_parameters(params_dict=params_dict)
            pass
        self.sim = Sim(pars=self.simulation_parameters,
                       datafile=None)
        self.sim.run(verbose=0)
        self.simulation_result = self.sim.to_json(tostring=False)
        if write_results_json:
            with open(self.expected_result_filename, 'w') as outfile:
                json.dump(self.simulation_result, outfile, indent=4, sort_keys=True)
        pass
    # endregion

    # region simulation results support
    def get_full_result_channel(self, channel):
        result_data = self.simulation_result["results"][channel]
        return result_data

    def get_day_zero_channel_value(self, channel=TestProperties.ResultsDataKeys.susceptible_at_timestep):
        """

        Args:
            channel: timeseries channel to report ('n_susceptible')

        Returns: day zero value for channel

        """
        result_data = self.get_full_result_channel(channel=channel)
        return result_data[0]

    def get_day_final_channel_value(self, channel):
        channel = self.get_full_result_channel(channel=channel)
        return channel[-1]
    # endregion

    # region specialized simulation methods
    def set_microsim(self):
        Simkeys = TestProperties.ParameterKeys.SimulationKeys
        Transkeys = TestProperties.ParameterKeys.TransmissionKeys
        Micro = TestProperties.SpecializedSimulations.Microsim
        microsim_parameters = {
            Simkeys.number_agents : Micro.n,
            Simkeys.initial_infected_count: Micro.n_infected,
            Simkeys.number_simulated_days: Micro.n_days,
            Transkeys.contacts_per_agent: Micro.contacts
        }
        self.set_simulation_parameters(microsim_parameters)
        pass

    def set_everyone_infected(self, agent_count=1000):
        Simkeys = TestProperties.ParameterKeys.SimulationKeys
        everyone_infected = {
            Simkeys.number_agents: agent_count,
            Simkeys.initial_infected_count: agent_count
        }
        self.set_simulation_parameters(params_dict=everyone_infected)
        pass

    def set_everyone_infectious_same_day(self, num_agents, days_to_infectious=1, num_days=60):
        """
        Args:
            num_agents: number of agents to create and infect
            days_to_infectious: days until all agents are infectious (1)
            num_days: days to simulate (60)
        """
        self.set_everyone_infected(agent_count=num_agents)
        test_config = {
            TestProperties.ParameterKeys.SimulationKeys.number_simulated_days: num_days,
            TestProperties.ParameterKeys.ProgressionKeys.exposed_to_infectious: days_to_infectious,
            TestProperties.ParameterKeys.ProgressionKeys.exposed_to_infectious_std: 0,
            TestProperties.ParameterKeys.MortalityKeys.use_cfr_by_age: False,
            TestProperties.ParameterKeys.MortalityKeys.prob_infected_symptomatic: 0
        }
        self.set_simulation_parameters(params_dict=test_config)
        pass

    def set_everyone_symptomatic(self, num_agents):
        """
        Cause all agents in the simulation to begin infected
        And proceed to symptomatic (but not severe or death)
        Args:
            num_agents: Number of agents to begin with
        """
        self.set_everyone_infectious_same_day(num_agents=num_agents,
                                              days_to_infectious=0)
        everyone_symptomatic_config = {
            TestProperties.ParameterKeys.MortalityKeys.prob_infected_symptomatic: 1.0,
            TestProperties.ParameterKeys.MortalityKeys.prob_symptomatic_severe: 0
        }
        self.set_simulation_parameters(params_dict=everyone_symptomatic_config)
        pass

    def set_everyone_is_going_to_die(self, num_agents):
        """
        Cause all agents in the simulation to begin infected and die.
        Args:
            num_agents: Number of agents to simulate
        """
        self.set_everyone_infectious_same_day(num_agents=num_agents)
        everyone_dying_config = {
            TestProperties.ParameterKeys.MortalityKeys.use_cfr_by_age: False,
            TestProperties.ParameterKeys.MortalityKeys.prob_infected_symptomatic: 1,  # Uh oh
            TestProperties.ParameterKeys.MortalityKeys.prob_symptomatic_severe: 1,  # Oh no
            TestProperties.ParameterKeys.MortalityKeys.prob_severe_death: 1,  # No recoveries
        }
        self.set_simulation_parameters(params_dict=everyone_dying_config)
        pass

    def set_smallpop_hightransmission(self):
        """
        Creates a small population with lots of transmission
        """
        Simkeys = TestProperties.ParameterKeys.SimulationKeys
        Transkeys = TestProperties.ParameterKeys.TransmissionKeys
        Progkeys = TestProperties.ParameterKeys.ProgressionKeys
        Hightrans = TestProperties.SpecializedSimulations.Hightransmission
        hightrans_parameters = {
            Simkeys.number_agents : Hightrans.n,
            Simkeys.initial_infected_count: Hightrans.n_infected,
            Simkeys.number_simulated_days: Hightrans.n_days,
            Transkeys.contacts_per_agent: Hightrans.contacts,
            Transkeys.beta : Hightrans.beta,
            Progkeys.exposed_to_infectious: Hightrans.serial,
            Progkeys.exposed_to_infectious_std: Hightrans.serial_std,
            Progkeys.infectiousness_duration: Hightrans.dur
        }
        self.set_simulation_parameters(hightrans_parameters)
        pass

    # endregion
    pass