def combine_testres_list(ibs, testres_list):
    "\n    combine test results over multiple annot configs\n\n    The combination of pipeline and annotation config is indexed by cfgx.\n    A cfgx corresponds to a unique query request\n\n    CommandLine:\n        python -m wbia --tf combine_testres_list\n\n        python -m wbia --tf -draw_rank_cmc --db PZ_MTEST --show\n        python -m wbia --tf -draw_rank_cmc --db PZ_Master1 --show\n        python -m wbia --tf -draw_rank_cmc --db PZ_MTEST --show -a varysize -t default\n        python -m wbia --tf -draw_rank_cmc --db PZ_MTEST --show -a varysize -t default\n\n    >>> # DISABLE_DOCTEST\n    >>> from wbia.expt.test_result import *  # NOQA\n    >>> from wbia.expt import harness\n    >>> ibs, testres = harness.testdata_expts('PZ_MTEST', ['varysize'])\n    "
    import copy
    from wbia.expt import annotation_configs
    acfg_list = [tr.acfg for tr in testres_list]
    acfg_lbl_list = annotation_configs.get_varied_acfg_labels(acfg_list)
    flat_acfg_list = annotation_configs.flatten_acfg_list(acfg_list)
    (nonvaried_acfg, varied_acfg_list) = ut.partition_varied_cfg_list(flat_acfg_list)

    def combine_lbls(lbl, acfg_lbl):
        if (len(lbl) == 0):
            return acfg_lbl
        if (len(acfg_lbl) == 0):
            return lbl
        return ((lbl + '+') + acfg_lbl)
    agg_cfg_list = ut.flatten([tr.cfg_list for tr in testres_list])
    agg_cfgx2_qreq_ = ut.flatten([tr.cfgx2_qreq_ for tr in testres_list])
    agg_cfgdict_list = ut.flatten([tr.cfgdict_list for tr in testres_list])
    agg_cfgx2_cmsinfo = ut.flatten([tr.cfgx2_cmsinfo for tr in testres_list])
    agg_varied_acfg_list = ut.flatten([([acfg] * len(tr.cfg_list)) for (tr, acfg) in zip(testres_list, varied_acfg_list)])
    agg_cfgx2_lbls = ut.flatten([[combine_lbls(lbl, acfg_lbl) for lbl in tr.cfgx2_lbl] for (tr, acfg_lbl) in zip(testres_list, acfg_lbl_list)])
    agg_cfgx2_acfg = ut.flatten([([copy.deepcopy(acfg)] * len(tr.cfg_list)) for (tr, acfg) in zip(testres_list, acfg_list)])
    big_testres = TestResult(agg_cfg_list, agg_cfgx2_lbls, agg_cfgx2_cmsinfo, agg_cfgx2_qreq_)
    big_testres.acfg = annotation_configs.unflatten_acfgdict(nonvaried_acfg)
    big_testres.cfgdict_list = agg_cfgdict_list
    big_testres.common_acfg = annotation_configs.compress_aidcfg(big_testres.acfg)
    big_testres.common_cfgdict = reduce(ut.dict_intersection, big_testres.cfgdict_list)
    big_testres.varied_acfg_list = agg_varied_acfg_list
    big_testres.nonvaried_acfg = nonvaried_acfg
    big_testres.varied_cfg_list = [ut.delete_dict_keys(cfgdict.copy(), list(big_testres.common_cfgdict.keys())) for cfgdict in big_testres.cfgdict_list]
    big_testres.acfg_list = acfg_list
    big_testres.cfgx2_acfg = agg_cfgx2_acfg
    big_testres.cfgx2_pcfg = agg_cfgdict_list
    assert (len(agg_cfgdict_list) == len(agg_cfgx2_acfg))
    testres = big_testres
    return testres
combine test results over multiple annot configs

The combination of pipeline and annotation config is indexed by cfgx.
A cfgx corresponds to a unique query request

CommandLine:
    python -m wbia --tf combine_testres_list

    python -m wbia --tf -draw_rank_cmc --db PZ_MTEST --show
    python -m wbia --tf -draw_rank_cmc --db PZ_Master1 --show
    python -m wbia --tf -draw_rank_cmc --db PZ_MTEST --show -a varysize -t default
    python -m wbia --tf -draw_rank_cmc --db PZ_MTEST --show -a varysize -t default

>>> # DISABLE_DOCTEST
>>> from wbia.expt.test_result import *  # NOQA
>>> from wbia.expt import harness
>>> ibs, testres = harness.testdata_expts('PZ_MTEST', ['varysize'])
def combine_testres_list(ibs, testres_list):
    "\n    combine test results over multiple annot configs\n\n    The combination of pipeline and annotation config is indexed by cfgx.\n    A cfgx corresponds to a unique query request\n\n    CommandLine:\n        python -m wbia --tf combine_testres_list\n\n        python -m wbia --tf -draw_rank_cmc --db PZ_MTEST --show\n        python -m wbia --tf -draw_rank_cmc --db PZ_Master1 --show\n        python -m wbia --tf -draw_rank_cmc --db PZ_MTEST --show -a varysize -t default\n        python -m wbia --tf -draw_rank_cmc --db PZ_MTEST --show -a varysize -t default\n\n    >>> # DISABLE_DOCTEST\n    >>> from wbia.expt.test_result import *  # NOQA\n    >>> from wbia.expt import harness\n    >>> ibs, testres = harness.testdata_expts('PZ_MTEST', ['varysize'])\n    "
    import copy
    from wbia.expt import annotation_configs
    acfg_list = [tr.acfg for tr in testres_list]
    acfg_lbl_list = annotation_configs.get_varied_acfg_labels(acfg_list)
    flat_acfg_list = annotation_configs.flatten_acfg_list(acfg_list)
    (nonvaried_acfg, varied_acfg_list) = ut.partition_varied_cfg_list(flat_acfg_list)

    def combine_lbls(lbl, acfg_lbl):
        if (len(lbl) == 0):
            return acfg_lbl
        if (len(acfg_lbl) == 0):
            return lbl
        return ((lbl + '+') + acfg_lbl)
    agg_cfg_list = ut.flatten([tr.cfg_list for tr in testres_list])
    agg_cfgx2_qreq_ = ut.flatten([tr.cfgx2_qreq_ for tr in testres_list])
    agg_cfgdict_list = ut.flatten([tr.cfgdict_list for tr in testres_list])
    agg_cfgx2_cmsinfo = ut.flatten([tr.cfgx2_cmsinfo for tr in testres_list])
    agg_varied_acfg_list = ut.flatten([([acfg] * len(tr.cfg_list)) for (tr, acfg) in zip(testres_list, varied_acfg_list)])
    agg_cfgx2_lbls = ut.flatten([[combine_lbls(lbl, acfg_lbl) for lbl in tr.cfgx2_lbl] for (tr, acfg_lbl) in zip(testres_list, acfg_lbl_list)])
    agg_cfgx2_acfg = ut.flatten([([copy.deepcopy(acfg)] * len(tr.cfg_list)) for (tr, acfg) in zip(testres_list, acfg_list)])
    big_testres = TestResult(agg_cfg_list, agg_cfgx2_lbls, agg_cfgx2_cmsinfo, agg_cfgx2_qreq_)
    big_testres.acfg = annotation_configs.unflatten_acfgdict(nonvaried_acfg)
    big_testres.cfgdict_list = agg_cfgdict_list
    big_testres.common_acfg = annotation_configs.compress_aidcfg(big_testres.acfg)
    big_testres.common_cfgdict = reduce(ut.dict_intersection, big_testres.cfgdict_list)
    big_testres.varied_acfg_list = agg_varied_acfg_list
    big_testres.nonvaried_acfg = nonvaried_acfg
    big_testres.varied_cfg_list = [ut.delete_dict_keys(cfgdict.copy(), list(big_testres.common_cfgdict.keys())) for cfgdict in big_testres.cfgdict_list]
    big_testres.acfg_list = acfg_list
    big_testres.cfgx2_acfg = agg_cfgx2_acfg
    big_testres.cfgx2_pcfg = agg_cfgdict_list
    assert (len(agg_cfgdict_list) == len(agg_cfgx2_acfg))
    testres = big_testres
    return testres