def test_dict_config_to_table(datadir): """Check that we can convert to table with dict rows and back""" config_yml = load_configuration(datadir / "small_config.yml") table = dict_config_to_table(config_yml) print_table_config(table) config_table = load_configuration(table) assert config_table == config_yml
def test_indexing_columns_in_parameters_overrides(datadir, file_format): """Check that columns indices from parameters override those from filename suffix""" config_yml = load_configuration(datadir / "small_config.yml") config_xlsx = load_configuration( datadir / f"small_config.{file_format}::key_column=A,value_column=A", value_column="B", ) assert config_xlsx == config_yml
def test_sheet_access(datadir, file_format): """Check that a sheet can be access by name""" config_yml = load_configuration(datadir / "small_config.yml") config_xlsx = load_configuration( datadir / f"small_config.{file_format}", sheet="Config Version 1", key_column="A", value_column="B", ) assert config_xlsx == config_yml
def test_user_friendly_config_load(datadir, file_format): """Check that a full user-friendly configuration loads from a table""" config_csv = load_configuration(datadir / "user_friendly_config.csv", key_column="D", value_column="B") config_other = load_configuration( datadir / f"user_friendly_config.{file_format}", key_column="D", value_column="B", ) num_top_level_keys = 3 assert len(config_csv) == num_top_level_keys assert len(config_other) == num_top_level_keys assert config_other == config_csv
def test_scenarios(datadir, tmp_path): """Check that scenarios run from CSV and generate results""" basic_config = load_configuration(datadir / "config.yml") scenario_table = load_scenario_table(datadir / "scenarios_config.csv") results = run_scenarios( config=basic_config, scenario_table=scenario_table, seed=42, num_simulations=2, num_consignments=50, ) assert len(scenario_table) == len(results) save_scenario_result_to_table( tmp_path / "results.csv", results, config_columns=[ "name", "consignment/parameter_based/boxes/min", "consignment/parameter_based/boxes/max", "consignment/items_per_box/default", "contamination/contamination_rate/parameters", ], result_columns=[ "missing", "avg_boxes_opened_completion", "avg_boxes_opened_detection", ], )
def test_scenarios(datadir): """Scenario results convert to data frame with specified columns""" basic_config = load_configuration(datadir / "config.yml") scenario_table = load_scenario_table(datadir / "scenarios_config.csv") results = run_scenarios( config=basic_config, scenario_table=scenario_table, seed=42, num_simulations=2, num_consignments=10, ) assert len(scenario_table) == len(results) config_columns = [ "name", "consignment/parameter_based/boxes/min", "consignment/parameter_based/boxes/max", "consignment/items_per_box/default", "contamination/contamination_rate/parameters", ] result_columns = [ "missing", "avg_boxes_opened_completion", "avg_boxes_opened_detection", ] df = save_scenario_result_to_pandas(results, config_columns=config_columns, result_columns=result_columns) shape = df.shape assert len(shape) == 2 rows, cols = shape assert cols == len(config_columns) + len(result_columns) assert rows == len(scenario_table)
def main(): basic_config = load_configuration("data/config.yml") scenario_table = load_scenario_table("data/scenarios_config_subset.csv") results = run_scenarios( config=basic_config, scenario_table=scenario_table, seed=42, num_simulations=1, num_consignments=1000, ) assert len(scenario_table) == len(results) save_scenario_result_to_table( "results.csv", results, config_columns=[ "name", "consignment/parameter_based/boxes/min", "consignment/parameter_based/boxes/max", "consignment/items_per_box/default", "contamination/contamination_rate/parameters", "contamination/arrangement", "inspection/unit", "inspection/sample_strategy", "inspection/proportion/value", "inspection/hypergeometric/detection_level", "inspection/selection_strategy", "inspection/within_box_proportion", "inspection/cluster/cluster_selection", ], result_columns=[ "missing", "true_contamination_rate", "max_missed_contamination_rate", "avg_missed_contamination_rate", "max_intercepted_contamination_rate", "avg_intercepted_contamination_rate", "avg_boxes_opened_completion", "avg_boxes_opened_detection", "avg_items_inspected_completion", "avg_items_inspected_detection", "pct_items_inspected_detection", "pct_contaminant_unreported_if_detection", "total_missed_contaminants", "total_intercepted_contaminants", "false_neg", "intercepted", ], )
def test_scenarios_with_xlsx(datadir): """Check that scenarios can load XLSX and run from it""" basic_config = load_configuration(datadir / "config.yml") scenario_table = load_scenario_table(datadir / "scenarios_config.xlsx") assert scenario_table[0] == { "name": "clustered_10", "consignment_name": "clustered", "inspection_name": "boxes 0.01 hypergeometric random", "consignment/parameter_based/boxes/min": 5, "consignment/parameter_based/boxes/max": 25, "consignment/items_per_box/default": 200, "contamination/contamination_rate/parameters": [1, 80], "contamination/arrangement": "clustered", "inspection/unit": "box", "inspection/sample_strategy": "hypergeometric", "inspection/proportion/proportion": None, "inspection/hypergeometric/detection_level": 0.01, "inspection/selection_strategy": "random", "inspection/within_box_pct": 1, "inspection/cluster/cluster_selection": None, } assert scenario_table[8] == { "name": "clustered_02", "consignment_name": "clustered", "inspection_name": "boxes 2% random", "consignment/parameter_based/boxes/min": 5, "consignment/parameter_based/boxes/max": 25, "consignment/items_per_box/default": 200, "contamination/contamination_rate/parameters": [1, 80], "contamination/arrangement": "clustered", "inspection/unit": "box", "inspection/sample_strategy": "proportion", "inspection/proportion/proportion": 0.02, "inspection/hypergeometric/detection_level": None, "inspection/selection_strategy": "random", "inspection/within_box_pct": 1, "inspection/cluster/cluster_selection": None, } results = run_scenarios( config=basic_config, scenario_table=scenario_table, seed=42, num_simulations=1, num_consignments=5, ) assert len(scenario_table) == len(results)
def test_include_files_list(datadir): """Included CSV file formatted as a list of items loads""" config = load_configuration(datadir / "small_config_with_list_includes.yml") consignments = config["contamination"]["consignments"] assert isinstance(consignments, list) assert len(consignments) == 7 assert consignments[0] == { "commodity": "Liatris", "origin": "Netherlands", "contamination": { "arrangement": "random_box" }, } assert consignments[-1] == { "commodity": "Sedum", "origin": "Colombia", "contamination": { "arrangement": "random" }, }
def test_large_config_load(datadir, column): """Check that a larger, somewhat complete, configuration loads from a table""" load_configuration(datadir / f"large_config.xlsx::value_column={column}")
def test_default_columns(datadir, file_format): """Check that default columns are correctly used""" config_yml = load_configuration(datadir / "small_config.yml") config_xlsx = load_configuration(datadir / f"small_config.{file_format}") assert config_xlsx == config_yml
def test_letter_indexing_columns_xlsx(datadir, file_format): """Check that columns can be indexed using letter indices""" config_yml = load_configuration(datadir / "small_config.yml") config_xlsx = load_configuration( datadir / f"small_config.{file_format}::key_column=A,value_column=B") assert config_xlsx == config_yml
def test_number_indexing_columns_xlsx(datadir, file_format): """Check that columns can be indexed using 1-based numerical indices""" config_yml = load_configuration(datadir / "small_config.yml") config_xlsx = load_configuration( datadir / f"small_config.{file_format}::key_column=1,value_column=2") assert config_xlsx == config_yml
def test_small_configs_are_same(datadir, file_format): """Check that configurations loaded from tables are the same as YAML""" config_yml = load_configuration(datadir / "small_config.yml") config_csv = load_configuration(datadir / f"small_config.{file_format}") assert config_csv == config_yml
def test_include_files(datadir): """Included YAML file with a list loads""" config = load_configuration(datadir / "small_config_with_includes.yml") consignments = config["contamination"]["consignments"] assert isinstance(consignments, list) assert len(consignments) == 8
def fixture_config(datadir): """Get loaded configuration""" return load_configuration(datadir / "config.yml")