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
Exemple #5
0
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)
Exemple #7
0
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",
        ],
    )
Exemple #8
0
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")