def get_varied_labels(testres, shorten=False, join_acfgs=False, sep=''):
    '\n        Returns labels indicating only the parameters that have been varied between\n        different annot/pipeline configurations.\n\n        Helper for consistent figure titles\n\n        CommandLine:\n            python -m wbia --tf TestResult.make_figtitle  --prefix "Seperability " --db GIRM_Master1   -a timectrl -t Ell:K=2     --hargv=scores\n            python -m wbia --tf TestResult.make_figtitle\n            python -m wbia TestResult.get_varied_labels\n\n        Example:\n            >>> # SLOW_DOCTEST\n            >>> from wbia.expt.test_result import *  # NOQA\n            >>> import wbia\n            >>> ibs, testres = wbia.testdata_expts(\n            >>>     \'PZ_MTEST\', t=\'default:K=[1,2]\',\n            >>>     #a=[\'timectrl:qsize=[1,2],dsize=[3,4]\']\n            >>>     a=[\n            >>>        \'default:qsize=[1,2],dsize=2,joinme=1,view=left\',\n            >>>        \'default:qsize=2,dsize=3,joinme=1,view=primary\',\n            >>>        \'default:qsize=[3,2],dsize=4,joinme=2,view=left\',\n            >>>        \'default:qsize=4,dsize=5,joinme=2,view=primary\',\n            >>>       ]\n            >>> )\n            >>> # >>> ibs, testres = wbia.testdata_expts(\n            >>> # >>>     \'WWF_Lynx_Copy\', t=\'default:K=1\',\n            >>> # >>>     a=[\n            >>> # >>>         \'default:minqual=good,require_timestamp=True,view=left,dcrossval_enc=1,joinme=1\',\n            >>> # >>>         \'default:minqual=good,require_timestamp=True,view=left,dcrossval_enc=2,joinme=2\',\n            >>> # >>>         #\'default:minqual=good,require_timestamp=True,view=left,dcrossval_enc=3,joinme=3\',\n            >>> # >>>         \'default:minqual=good,require_timestamp=True,view=right,dcrossval_enc=1,joinme=1\',\n            >>> # >>>         \'default:minqual=good,require_timestamp=True,view=right,dcrossval_enc=2,joinme=2\',\n            >>> # >>>         #\'default:minqual=good,require_timestamp=True,view=right,dcrossval_enc=3,joinme=3\',\n            >>> # >>>       ]\n            >>> # >>> )\n            >>> varied_lbls = testres.get_varied_labels(shorten=False, join_acfgs=True)\n            >>> result = (\'varied_lbls = %s\' % (ut.repr2(varied_lbls, strvals=True, nl=2),))\n            >>> print(result)\n\n            varied_lbls = [u\'K=1+qsize=1\', u\'K=2+qsize=1\', u\'K=1+qsize=2\', u\'K=2+qsize=2\']\n        '
    from wbia.expt import annotation_configs
    varied_acfgs = annotation_configs.get_varied_acfg_labels(testres.cfgx2_acfg, checkname=True)
    varied_pcfgs = ut.get_varied_cfg_lbls(testres.cfgx2_pcfg, checkname=True)
    name_sep = ':'
    cfg_sep = '+'
    if join_acfgs:
        new_varied_acfgs = []
        groupxs = testres.get_cfgx_groupxs()
        grouped_acfgs = ut.apply_grouping(varied_acfgs, groupxs)
        grouped_pcfgs = ut.apply_grouping(varied_pcfgs, groupxs)
        for group in grouped_acfgs:
            group = [(p if (name_sep in p) else (name_sep + p)) for p in group]
            cfgdicts_ = cfghelpers.parse_cfgstr_list2(group, strict=False)
            cfgdicts = ut.take_column(cfgdicts_, 0)
            new_acfgs = ut.partition_varied_cfg_list(cfgdicts)
            new_acfg = new_acfgs[0]
            if True:
                internal_cfgs = new_acfgs[1]
                import pandas as pd
                intern_variations = pd.DataFrame.from_dict(internal_cfgs).to_dict(orient='list')
                op_prefixes = {'sum': (np.sum, 'Σ-', ''), 'mean': (np.mean, 'µ-', ''), 'set': ((lambda x: '&'.join(set(map(str, x)))), '', 's')}
                known_modes = {'dsize': 'mean', 'qsize': 'sum', 'view': 'set'}
                for key in intern_variations.keys():
                    if key.startswith('_'):
                        continue
                    mode = known_modes.get(key, None)
                    vals = intern_variations[key]
                    if (mode is None):
                        mode = 'set'
                    if (key == 'crossval_idx'):
                        new_acfg['folds'] = len(intern_variations['crossval_idx'])
                    else:
                        (op, pref, suff) = op_prefixes[mode]
                        c = op(vals)
                        if isinstance(c, str):
                            new_acfg[((pref + key) + suff)] = c
                        else:
                            new_acfg[((pref + key) + suff)] = ut.repr2(c, precision=2)
            new_varied_acfgs.append(new_acfg)
        common_new_acfg = ut.partition_varied_cfg_list(new_varied_acfgs)[0]
        for key in common_new_acfg.keys():
            if (not key.startswith('_')):
                for new_acfg in new_varied_acfgs:
                    del new_acfg[key]
        varied_pcfgs = ut.take_column(grouped_pcfgs, 0)
        varied_acfgs = [ut.get_cfg_lbl(new_acfg_, with_name=False, sep=sep) for new_acfg_ in new_varied_acfgs]

    def combo_lbls(lbla, lblp):
        parts = []
        if ((lbla != name_sep) and lbla):
            parts.append(lbla)
        if ((lblp != name_sep) and lblp):
            parts.append(lblp)
        return (sep + cfg_sep).join(parts)
    varied_lbls = [combo_lbls(lbla, lblp) for (lblp, lbla) in zip(varied_acfgs, varied_pcfgs)]
    if shorten:
        varied_lbls = [testres._shorten_lbls(lbl) for lbl in varied_lbls]
    return varied_lbls
Returns labels indicating only the parameters that have been varied between
different annot/pipeline configurations.

Helper for consistent figure titles

CommandLine:
    python -m wbia --tf TestResult.make_figtitle  --prefix "Seperability " --db GIRM_Master1   -a timectrl -t Ell:K=2     --hargv=scores
    python -m wbia --tf TestResult.make_figtitle
    python -m wbia TestResult.get_varied_labels

Example:
    >>> # SLOW_DOCTEST
    >>> from wbia.expt.test_result import *  # NOQA
    >>> import wbia
    >>> ibs, testres = wbia.testdata_expts(
    >>>     'PZ_MTEST', t='default:K=[1,2]',
    >>>     #a=['timectrl:qsize=[1,2],dsize=[3,4]']
    >>>     a=[
    >>>        'default:qsize=[1,2],dsize=2,joinme=1,view=left',
    >>>        'default:qsize=2,dsize=3,joinme=1,view=primary',
    >>>        'default:qsize=[3,2],dsize=4,joinme=2,view=left',
    >>>        'default:qsize=4,dsize=5,joinme=2,view=primary',
    >>>       ]
    >>> )
    >>> # >>> ibs, testres = wbia.testdata_expts(
    >>> # >>>     'WWF_Lynx_Copy', t='default:K=1',
    >>> # >>>     a=[
    >>> # >>>         'default:minqual=good,require_timestamp=True,view=left,dcrossval_enc=1,joinme=1',
    >>> # >>>         'default:minqual=good,require_timestamp=True,view=left,dcrossval_enc=2,joinme=2',
    >>> # >>>         #'default:minqual=good,require_timestamp=True,view=left,dcrossval_enc=3,joinme=3',
    >>> # >>>         'default:minqual=good,require_timestamp=True,view=right,dcrossval_enc=1,joinme=1',
    >>> # >>>         'default:minqual=good,require_timestamp=True,view=right,dcrossval_enc=2,joinme=2',
    >>> # >>>         #'default:minqual=good,require_timestamp=True,view=right,dcrossval_enc=3,joinme=3',
    >>> # >>>       ]
    >>> # >>> )
    >>> varied_lbls = testres.get_varied_labels(shorten=False, join_acfgs=True)
    >>> result = ('varied_lbls = %s' % (ut.repr2(varied_lbls, strvals=True, nl=2),))
    >>> print(result)

    varied_lbls = [u'K=1+qsize=1', u'K=2+qsize=1', u'K=1+qsize=2', u'K=2+qsize=2']
def get_varied_labels(testres, shorten=False, join_acfgs=False, sep=):
    '\n        Returns labels indicating only the parameters that have been varied between\n        different annot/pipeline configurations.\n\n        Helper for consistent figure titles\n\n        CommandLine:\n            python -m wbia --tf TestResult.make_figtitle  --prefix "Seperability " --db GIRM_Master1   -a timectrl -t Ell:K=2     --hargv=scores\n            python -m wbia --tf TestResult.make_figtitle\n            python -m wbia TestResult.get_varied_labels\n\n        Example:\n            >>> # SLOW_DOCTEST\n            >>> from wbia.expt.test_result import *  # NOQA\n            >>> import wbia\n            >>> ibs, testres = wbia.testdata_expts(\n            >>>     \'PZ_MTEST\', t=\'default:K=[1,2]\',\n            >>>     #a=[\'timectrl:qsize=[1,2],dsize=[3,4]\']\n            >>>     a=[\n            >>>        \'default:qsize=[1,2],dsize=2,joinme=1,view=left\',\n            >>>        \'default:qsize=2,dsize=3,joinme=1,view=primary\',\n            >>>        \'default:qsize=[3,2],dsize=4,joinme=2,view=left\',\n            >>>        \'default:qsize=4,dsize=5,joinme=2,view=primary\',\n            >>>       ]\n            >>> )\n            >>> # >>> ibs, testres = wbia.testdata_expts(\n            >>> # >>>     \'WWF_Lynx_Copy\', t=\'default:K=1\',\n            >>> # >>>     a=[\n            >>> # >>>         \'default:minqual=good,require_timestamp=True,view=left,dcrossval_enc=1,joinme=1\',\n            >>> # >>>         \'default:minqual=good,require_timestamp=True,view=left,dcrossval_enc=2,joinme=2\',\n            >>> # >>>         #\'default:minqual=good,require_timestamp=True,view=left,dcrossval_enc=3,joinme=3\',\n            >>> # >>>         \'default:minqual=good,require_timestamp=True,view=right,dcrossval_enc=1,joinme=1\',\n            >>> # >>>         \'default:minqual=good,require_timestamp=True,view=right,dcrossval_enc=2,joinme=2\',\n            >>> # >>>         #\'default:minqual=good,require_timestamp=True,view=right,dcrossval_enc=3,joinme=3\',\n            >>> # >>>       ]\n            >>> # >>> )\n            >>> varied_lbls = testres.get_varied_labels(shorten=False, join_acfgs=True)\n            >>> result = (\'varied_lbls = %s\' % (ut.repr2(varied_lbls, strvals=True, nl=2),))\n            >>> print(result)\n\n            varied_lbls = [u\'K=1+qsize=1\', u\'K=2+qsize=1\', u\'K=1+qsize=2\', u\'K=2+qsize=2\']\n        '
    from wbia.expt import annotation_configs
    varied_acfgs = annotation_configs.get_varied_acfg_labels(testres.cfgx2_acfg, checkname=True)
    varied_pcfgs = ut.get_varied_cfg_lbls(testres.cfgx2_pcfg, checkname=True)
    name_sep = ':'
    cfg_sep = '+'
    if join_acfgs:
        new_varied_acfgs = []
        groupxs = testres.get_cfgx_groupxs()
        grouped_acfgs = ut.apply_grouping(varied_acfgs, groupxs)
        grouped_pcfgs = ut.apply_grouping(varied_pcfgs, groupxs)
        for group in grouped_acfgs:
            group = [(p if (name_sep in p) else (name_sep + p)) for p in group]
            cfgdicts_ = cfghelpers.parse_cfgstr_list2(group, strict=False)
            cfgdicts = ut.take_column(cfgdicts_, 0)
            new_acfgs = ut.partition_varied_cfg_list(cfgdicts)
            new_acfg = new_acfgs[0]
            if True:
                internal_cfgs = new_acfgs[1]
                import pandas as pd
                intern_variations = pd.DataFrame.from_dict(internal_cfgs).to_dict(orient='list')
                op_prefixes = {'sum': (np.sum, 'Σ-', ), 'mean': (np.mean, 'µ-', ), 'set': ((lambda x: '&'.join(set(map(str, x)))), , 's')}
                known_modes = {'dsize': 'mean', 'qsize': 'sum', 'view': 'set'}
                for key in intern_variations.keys():
                    if key.startswith('_'):
                        continue
                    mode = known_modes.get(key, None)
                    vals = intern_variations[key]
                    if (mode is None):
                        mode = 'set'
                    if (key == 'crossval_idx'):
                        new_acfg['folds'] = len(intern_variations['crossval_idx'])
                    else:
                        (op, pref, suff) = op_prefixes[mode]
                        c = op(vals)
                        if isinstance(c, str):
                            new_acfg[((pref + key) + suff)] = c
                        else:
                            new_acfg[((pref + key) + suff)] = ut.repr2(c, precision=2)
            new_varied_acfgs.append(new_acfg)
        common_new_acfg = ut.partition_varied_cfg_list(new_varied_acfgs)[0]
        for key in common_new_acfg.keys():
            if (not key.startswith('_')):
                for new_acfg in new_varied_acfgs:
                    del new_acfg[key]
        varied_pcfgs = ut.take_column(grouped_pcfgs, 0)
        varied_acfgs = [ut.get_cfg_lbl(new_acfg_, with_name=False, sep=sep) for new_acfg_ in new_varied_acfgs]

    def combo_lbls(lbla, lblp):
        parts = []
        if ((lbla != name_sep) and lbla):
            parts.append(lbla)
        if ((lblp != name_sep) and lblp):
            parts.append(lblp)
        return (sep + cfg_sep).join(parts)
    varied_lbls = [combo_lbls(lbla, lblp) for (lblp, lbla) in zip(varied_acfgs, varied_pcfgs)]
    if shorten:
        varied_lbls = [testres._shorten_lbls(lbl) for lbl in varied_lbls]
    return varied_lbls