Commit 02406cb2 authored by Jan Kiene's avatar Jan Kiene
Browse files

move scripts out of experiments folder and unify into one script

parent 3c4c3e80
Loading
Loading
Loading
Loading

experiments/__init__.py

deleted100644 → 0
+0 −0

Empty file deleted.

experiments/constants.py

deleted100644 → 0
+0 −5
Original line number Diff line number Diff line
from pathlib import Path

EXPERIMENTS_P800 = [f"P800-{i}" for i in range(1, 10)]
EXPERIMENTS_BS1534 = [f"BS1534-{i}{x}" for i in range(1, 8) for x in ["a", "b"]]
LAB_IDS = ["a", "b", "c", "d"]
 No newline at end of file

experiments/create_items.py

deleted100644 → 0
+0 −37
Original line number Diff line number Diff line
#! /usr/bin/env python3
import argparse
from pathlib import Path

import sys
HERE = Path(__file__).parent.absolute()
sys.path.append(str(HERE.parent))
from ivas_processing_scripts import main as generate_test
from ivas_processing_scripts.utils import apply_func_parallel

from .constants import EXPERIMENTS_P800, LAB_IDS


class Arguments:
    def __init__(self, config):
        self.config = config
        self.debug = False
        # used to overwrite the multiprocessing key in the configs to rather parallelize on category level
        self.multiprocessing = False


def create_items(experiment, lab):
    p800_path = Path(f"experiments/selection/{experiment}")
    p800_cfgs = p800_path.joinpath("config").glob(f"{experiment}cat*-lab_{lab}.yml")

    args = [Arguments(str(cfg)) for cfg in p800_cfgs]
    apply_func_parallel(generate_test, zip(args), type="mp")


# if is necessary here so that multiprocessing does not crash
if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("experiment", choices=EXPERIMENTS_P800)
    parser.add_argument("lab", choices=LAB_IDS)
    args = parser.parse_args()

    create_items(args.experiment, args.lab)
+55 −14
Original line number Diff line number Diff line
#! /usr/bin/env python3

import argparse
from pathlib import Path

import sys
HERE = Path(__file__).parent.absolute().resolve()
sys.path.append(str(HERE.parent))
from ivas_processing_scripts import config
from .constants import EXPERIMENTS_P800, EXPERIMENTS_BS1534, LAB_IDS
HERE = Path(__file__).parent.absolute()

from ivas_processing_scripts import main as generate_test, config
from ivas_processing_scripts.utils import apply_func_parallel

EXPERIMENTS_P800 = [f"P800-{i}" for i in range(1, 10)]
EXPERIMENTS_BS1534 = [f"BS1534-{i}{x}" for i in range(1, 8) for x in ["a", "b"]]
LAB_IDS = ["a", "b", "c", "d"]

# TODO: this is a placeholder for later, currently everything is FOA
IN_FMT_FOR_MASA_EXPS = {
@@ -18,12 +21,30 @@ IN_FMT_FOR_MASA_EXPS = {
}


def _get_seed(exp, lab):
    experiments = EXPERIMENTS_P800 + EXPERIMENTS_BS1534
    return 101 + experiments.index(exp) * 4 + LAB_IDS.index(lab)
def generate_tests(exp_lab_pairs, run_parallel=True):
    """
    Create configs and run them for all given experiment/lab pairs
    """
    # get config paths for all given experiment/lab combis and flatten into single list
    cfgs = [create_experiment_setup(exp, lab) for exp, lab in exp_lab_pairs]
    cfgs = [c for cl in cfgs for c in cl]

    args = [Arguments(str, cfg) for cfg in cfgs]
    apply_func_parallel(generate_test, zip(args), type="mp" if run_parallel else None)


class Arguments:
    def __init__(self, config):
        self.config = config
        self.debug = False
        # used to overwrite the multiprocessing key in the configs to rather parallelize on category level
        self.multiprocessing = False


def create_experiment_setup(experiment, lab) -> list[Path]:
    """
    Create the config files for all categories for the given experiment and lab id.
    """
    default_cfg_path = HERE.joinpath(f"selection/{experiment}/config/{experiment}.yml")

    num_categories = 1
@@ -35,7 +56,10 @@ def create_experiment_setup(experiment, lab) -> list[Path]:
        num_categories = 2
    categories = [f"cat{i}" for i in range(1, num_categories + 1)]

    seed = _get_seed(experiment, lab)
    # calculate the seed value according to processing plan
    experiments = EXPERIMENTS_P800 + EXPERIMENTS_BS1534
    seed = 101 + experiments.index(exp) * 4 + LAB_IDS.index(lab)

    base_path = Path(HERE.name).joinpath(f"selection/{experiment}")

    cfgs = list()
@@ -77,11 +101,28 @@ def create_experiment_setup(experiment, lab) -> list[Path]:
    return cfgs


def exp_lab_pair(arg):
    """
    Validation function for command line input
    """
    exp, lab = arg.split(',')

    msg = "'{}' is not a valid {}. Possible values are: {}"
    if exp not in EXPERIMENTS_BS1534 + EXPERIMENTS_P800:
        experiments_msg = ",".join(EXPERIMENTS_BS1534 + EXPERIMENTS_P800)
        err_msg = msg.format(exp, "experiment name", f"{{{experiments_msg}}}.")
        raise ValueError(err_msg)
    if lab not in LAB_IDS:
        labs_msg = ",".join(LAB_IDS)
        err_msg = msg.format(lab, "lab identifier", labs_msg)
        raise ValueError(err_msg)

    return exp, lab


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("experiment", type=str, choices=EXPERIMENTS_BS1534+EXPERIMENTS_P800)
    parser.add_argument("lab", type=str, choices=LAB_IDS)

    parser.add_argument("exp_lab_pairs", type=exp_lab_pair, nargs="+", help="The combinations of experiment/lab-id that you want to generate, separated by whitespace. Experiment and lab id need to be separated by a comma.")
    parser.add_argument("--no_parallel", action="store_true", help="If given, configs will not be run in parallel")
    args = parser.parse_args()

    create_experiment_setup(args.experiment, args.lab)
    generate_tests(args.exp_lab_pairs, not args.no_parallel)