Source code for federatedscope.core.auxiliaries.splitter_builder

import logging

import federatedscope.register as register

logger = logging.getLogger(__name__)

try:
    from federatedscope.contrib.splitter import *
except ImportError as error:
    logger.warning(
        f'{error} in `federatedscope.contrib.splitter`, some modules are not '
        f'available.')


[docs]def get_splitter(config): """ This function is to build splitter to generate simulated federation \ datasets from non-FL dataset. Args: config: configurations for FL, see ``federatedscope.core.configs`` Returns: An instance of splitter (see ``core.splitters`` for details) Note: The key-value pairs of ``cfg.data.splitter`` and domain: =================== ================================================ Splitter type Domain =================== ================================================ lda Generic iid Generic louvain Graph (node-level) random Graph (node-level) rel_type Graph (link-level) scaffold Molecular scaffold_lda Molecular rand_chunk Graph (graph-level) =================== ================================================ """ client_num = config.federate.client_num if config.data.splitter_args: kwargs = config.data.splitter_args[0] else: kwargs = {} for func in register.splitter_dict.values(): splitter = func(config.data.splitter, client_num, **kwargs) if splitter is not None: return splitter # Delay import # generic splitter if config.data.splitter == 'lda': from federatedscope.core.splitters.generic import LDASplitter splitter = LDASplitter(client_num, **kwargs) # graph splitter elif config.data.splitter == 'louvain': from federatedscope.core.splitters.graph import LouvainSplitter splitter = LouvainSplitter(client_num, **kwargs) elif config.data.splitter == 'random': from federatedscope.core.splitters.graph import RandomSplitter splitter = RandomSplitter(client_num, **kwargs) elif config.data.splitter == 'rel_type': from federatedscope.core.splitters.graph import RelTypeSplitter splitter = RelTypeSplitter(client_num, **kwargs) elif config.data.splitter == 'scaffold': from federatedscope.core.splitters.graph import ScaffoldSplitter splitter = ScaffoldSplitter(client_num, **kwargs) elif config.data.splitter == 'scaffold_lda': from federatedscope.core.splitters.graph import ScaffoldLdaSplitter splitter = ScaffoldLdaSplitter(client_num, **kwargs) elif config.data.splitter == 'rand_chunk': from federatedscope.core.splitters.graph import RandChunkSplitter splitter = RandChunkSplitter(client_num, **kwargs) elif config.data.splitter == 'iid': from federatedscope.core.splitters.generic import IIDSplitter splitter = IIDSplitter(client_num) else: logger.warning(f'Splitter {config.data.splitter} not found or not ' f'used.') splitter = None return splitter