Source code for eclypse.policies.topology.churn
"""Node churn topology policy."""
from __future__ import annotations
from typing import TYPE_CHECKING
from eclypse.policies._helpers import validate_probability
if TYPE_CHECKING:
from eclypse.graph.asset_graph import AssetGraph
from eclypse.utils.types import UpdatePolicy
[docs]
def churn(
*,
remove_probability: float = 0.0,
add_probability: float = 0.0,
candidate_nodes: dict[str, dict] | None = None,
) -> UpdatePolicy:
"""Randomly remove existing nodes and add candidate nodes.
Args:
remove_probability (float): Per-existing-node probability of removal.
add_probability (float): Per-candidate-node probability of addition.
candidate_nodes (dict[str, dict] | None): Optional mapping from node id to node assets.
Returns:
Policy that applies node churn.
"""
validate_probability("remove_probability", remove_probability)
validate_probability("add_probability", add_probability)
def policy(graph: AssetGraph):
for node_id in list(graph.nodes):
if graph.rnd.random() < remove_probability:
graph.remove_node(node_id)
for node_id, assets in (candidate_nodes or {}).items():
if not graph.has_node(node_id) and graph.rnd.random() < add_probability:
graph.add_node(node_id, strict=False, **assets)
return policy