Source code for fl4health.client_managers.fixed_without_replacement_manager
import random
from logging import WARNING
from flwr.common.logger import log
from flwr.server.client_proxy import ClientProxy
from flwr.server.criterion import Criterion
from fl4health.client_managers.base_sampling_manager import BaseFractionSamplingManager
[docs]
class FixedSamplingByFractionClientManager(BaseFractionSamplingManager):
"""Overrides the Simple Client Manager to provide Fixed Sampling without replacement for Clients by fraction"""
[docs]
def sample_fraction(
self,
sample_fraction: float,
# minimum number of clients required to be available
min_num_clients: int | None = None,
criterion: Criterion | None = None,
) -> list[ClientProxy]:
"""Sample a number of Flower ClientProxy instances."""
available_cids = self.wait_and_filter(min_num_clients, criterion)
n_available_cids = len(available_cids)
num_to_sample = int(sample_fraction * n_available_cids)
if num_to_sample < 1:
log(
WARNING,
f"Sample fraction of {round(sample_fraction, 3)} resulted in 0 samples to being selected"
f"from {n_available_cids}.",
)
return []
sampled_cids = random.sample(available_cids, num_to_sample)
return [self.clients[cid] for cid in sampled_cids]