Skip to content

gds_business.supplychain.checks

Supply chain verification checks (SCN-001..SCN-004).

SCN-001: All nodes reachable via BFS from demand/supply paths.

Source code in packages/gds-business/gds_business/supplychain/checks.py
def check_scn001_network_connectivity(model: SupplyChainModel) -> list[Finding]:
    """SCN-001: All nodes reachable via BFS from demand/supply paths."""
    findings: list[Finding] = []

    # Build undirected adjacency from shipments
    adj: dict[str, set[str]] = {n.name: set() for n in model.nodes}
    for s in model.shipments:
        if s.source in adj and s.target in adj:
            adj[s.source].add(s.target)
            adj[s.target].add(s.source)

    # Also connect demand source targets
    for d in model.demand_sources:
        if d.target in adj:
            adj[d.target].add(f"__demand_{d.name}")

    # BFS from each demand target
    reachable: set[str] = set()
    for d in model.demand_sources:
        if d.target not in adj:
            continue
        queue = [d.target]
        visited: set[str] = set()
        while queue:
            node = queue.pop(0)
            if node in visited or node not in adj:
                continue
            visited.add(node)
            reachable.add(node)
            queue.extend(adj[node] - visited)

    # If no demands, try from first node
    if not model.demand_sources and model.nodes:
        queue = [model.nodes[0].name]
        visited = set()
        while queue:
            node = queue.pop(0)
            if node in visited or node not in adj:
                continue
            visited.add(node)
            reachable.add(node)
            queue.extend(adj[node] - visited)

    for node in model.nodes:
        is_reachable = node.name in reachable
        findings.append(
            Finding(
                check_id="SCN-001",
                severity=Severity.WARNING,
                message=(
                    f"Node {node.name!r} "
                    f"{'is' if is_reachable else 'is NOT'} reachable "
                    f"in the supply network"
                ),
                source_elements=[node.name],
                passed=is_reachable,
            )
        )
    return findings

SCN-002: Shipment source and target exist.

Source code in packages/gds-business/gds_business/supplychain/checks.py
def check_scn002_shipment_node_validity(model: SupplyChainModel) -> list[Finding]:
    """SCN-002: Shipment source and target exist."""
    findings: list[Finding] = []
    for s in model.shipments:
        src_valid = s.source in model.node_names
        findings.append(
            Finding(
                check_id="SCN-002",
                severity=Severity.ERROR,
                message=(
                    f"Shipment {s.name!r} source {s.source!r} "
                    f"{'is' if src_valid else 'is NOT'} a declared node"
                ),
                source_elements=[s.name, s.source],
                passed=src_valid,
            )
        )
        tgt_valid = s.target in model.node_names
        findings.append(
            Finding(
                check_id="SCN-002",
                severity=Severity.ERROR,
                message=(
                    f"Shipment {s.name!r} target {s.target!r} "
                    f"{'is' if tgt_valid else 'is NOT'} a declared node"
                ),
                source_elements=[s.name, s.target],
                passed=tgt_valid,
            )
        )
    return findings

SCN-003: Demand target exists.

Source code in packages/gds-business/gds_business/supplychain/checks.py
def check_scn003_demand_target_validity(model: SupplyChainModel) -> list[Finding]:
    """SCN-003: Demand target exists."""
    findings: list[Finding] = []
    for d in model.demand_sources:
        valid = d.target in model.node_names
        findings.append(
            Finding(
                check_id="SCN-003",
                severity=Severity.ERROR,
                message=(
                    f"DemandSource {d.name!r} target {d.target!r} "
                    f"{'is' if valid else 'is NOT'} a declared node"
                ),
                source_elements=[d.name, d.target],
                passed=valid,
            )
        )
    return findings

SCN-004: Every node appears in at least one shipment or demand.

Source code in packages/gds-business/gds_business/supplychain/checks.py
def check_scn004_no_orphan_nodes(model: SupplyChainModel) -> list[Finding]:
    """SCN-004: Every node appears in at least one shipment or demand."""
    findings: list[Finding] = []
    connected: set[str] = set()
    for s in model.shipments:
        connected.add(s.source)
        connected.add(s.target)
    for d in model.demand_sources:
        connected.add(d.target)

    for node in model.nodes:
        is_connected = node.name in connected
        findings.append(
            Finding(
                check_id="SCN-004",
                severity=Severity.WARNING,
                message=(
                    f"Node {node.name!r} {'is' if is_connected else 'is NOT'} connected"
                ),
                source_elements=[node.name],
                passed=is_connected,
            )
        )
    return findings