diff --git a/ngraph/blueprints.py b/ngraph/blueprints.py index c39bd69..f99a283 100644 --- a/ngraph/blueprints.py +++ b/ngraph/blueprints.py @@ -1,5 +1,6 @@ from dataclasses import dataclass from typing import Any, Dict, List +import copy from ngraph.network import Link, Network, Node @@ -15,7 +16,7 @@ class Blueprint: Attributes: name (str): Unique identifier of this blueprint. groups (Dict[str, Any]): A mapping of group_name -> group definition - (e.g. node_count, name_template, node_attrs). + (e.g., node_count, name_template, attrs). adjacency (List[Dict[str, Any]]): A list of adjacency dictionaries describing how groups are linked. """ @@ -59,11 +60,10 @@ def expand_network_dsl(data: Dict[str, Any]) -> Network: 8) Process node overrides. Args: - data (Dict[str, Any]): The YAML-parsed dictionary containing - optional "blueprints" + "network". + data: The YAML-parsed dictionary containing optional "blueprints" + "network". Returns: - Network: A fully expanded Network object with all nodes and links. + The fully expanded Network object with all nodes and links. """ # 1) Parse blueprint definitions blueprint_map: Dict[str, Blueprint] = {} @@ -87,13 +87,7 @@ def expand_network_dsl(data: Dict[str, Any]) -> Network: # 3) Expand top-level groups (blueprint usage or direct node groups) for group_name, group_def in network_data.get("groups", {}).items(): - _expand_group( - ctx, - parent_path="", - group_name=group_name, - group_def=group_def, - blueprint_expansion=False, - ) + _expand_group(ctx, parent_path="", group_name=group_name, group_def=group_def) # 4) Process direct node definitions _process_direct_nodes(ctx.network, network_data) @@ -119,26 +113,21 @@ def _expand_group( parent_path: str, group_name: str, group_def: Dict[str, Any], - *, - blueprint_expansion: bool = False, ) -> None: """ Expands a single group definition into either: - Another blueprint's subgroups, or - - A direct node group (node_count, name_template, node_attrs). + - A direct node group (node_count, name_template, attrs). If the group references 'use_blueprint', we expand that blueprint's groups under the current hierarchy path. Otherwise, we create nodes directly. Args: - ctx (DSLExpansionContext): The context containing all blueprint info - and the target Network. - parent_path (str): The parent path in the hierarchy. - group_name (str): The current group's name. - group_def (Dict[str, Any]): The group definition (e.g. {node_count, name_template} + ctx: The context containing all blueprint info and the target Network. + parent_path: The parent path in the hierarchy. + group_name: The current group's name. + group_def: The group definition (e.g. {node_count, name_template} or {use_blueprint, parameters, ...}). - blueprint_expansion (bool): Indicates whether we are expanding within - a blueprint context or not. """ if parent_path: effective_path = f"{parent_path}/{group_name}" @@ -148,41 +137,36 @@ def _expand_group( if "use_blueprint" in group_def: # Expand blueprint subgroups blueprint_name: str = group_def["use_blueprint"] - try: - bp = ctx.blueprints.get(blueprint_name) - if not bp: - raise ValueError( - f"Group '{group_name}' references unknown blueprint '{blueprint_name}'." - ) - - param_overrides: Dict[str, Any] = group_def.get("parameters", {}) - coords = group_def.get("coords") - - # For each subgroup in the blueprint, apply overrides and expand - for bp_sub_name, bp_sub_def in bp.groups.items(): - merged_def = _apply_parameters(bp_sub_name, bp_sub_def, param_overrides) - if coords is not None and "coords" not in merged_def: - merged_def["coords"] = coords - - _expand_group( - ctx, - parent_path=effective_path, - group_name=bp_sub_name, - group_def=merged_def, - blueprint_expansion=True, - ) - - # Expand blueprint adjacency - for adj_def in bp.adjacency: - _expand_blueprint_adjacency(ctx, adj_def, effective_path) - - except Exception as e: - raise ValueError(f"Error expanding blueprint '{blueprint_name}': {e}") + bp = ctx.blueprints.get(blueprint_name) + if not bp: + raise ValueError( + f"Group '{group_name}' references unknown blueprint '{blueprint_name}'." + ) + + param_overrides: Dict[str, Any] = group_def.get("parameters", {}) + coords = group_def.get("coords") + + # For each subgroup in the blueprint, apply overrides and expand + for bp_sub_name, bp_sub_def in bp.groups.items(): + merged_def = _apply_parameters(bp_sub_name, bp_sub_def, param_overrides) + if coords is not None and "coords" not in merged_def: + merged_def["coords"] = coords + + _expand_group( + ctx, + parent_path=effective_path, + group_name=bp_sub_name, + group_def=merged_def, + ) + + # Expand blueprint adjacency + for adj_def in bp.adjacency: + _expand_blueprint_adjacency(ctx, adj_def, effective_path) else: # It's a direct node group node_count = group_def.get("node_count", 1) name_template = group_def.get("name_template", f"{group_name}-{{node_num}}") - node_attrs = group_def.get("node_attrs", {}) + attrs = group_def.get("attrs", {}) for i in range(1, node_count + 1): label = name_template.format(node_num=i) @@ -192,26 +176,23 @@ def _expand_group( # Merge any extra attributes if "coords" in group_def: node.attrs["coords"] = group_def["coords"] - node.attrs.update(node_attrs) # Apply bulk attributes + node.attrs.update(attrs) # Apply bulk attributes node.attrs.setdefault("type", "node") - ctx.network.add_node(node) def _expand_blueprint_adjacency( - ctx: DSLExpansionContext, - adj_def: Dict[str, Any], - parent_path: str, + ctx: DSLExpansionContext, adj_def: Dict[str, Any], parent_path: str ) -> None: """ Expands adjacency definitions from within a blueprint, using parent_path as the local root. Args: - ctx (DSLExpansionContext): The context object with blueprint info and the network. - adj_def (Dict[str, Any]): The adjacency definition inside the blueprint, + ctx: The context object with blueprint info and the network. + adj_def: The adjacency definition inside the blueprint, containing 'source', 'target', 'pattern', etc. - parent_path (str): The path that serves as the base for the blueprint's node paths. + parent_path: The path serving as the base for the blueprint's node paths. """ source_rel = adj_def["source"] target_rel = adj_def["target"] @@ -225,17 +206,14 @@ def _expand_blueprint_adjacency( _expand_adjacency_pattern(ctx, src_path, tgt_path, pattern, link_params, link_count) -def _expand_adjacency( - ctx: DSLExpansionContext, - adj_def: Dict[str, Any], -) -> None: +def _expand_adjacency(ctx: DSLExpansionContext, adj_def: Dict[str, Any]) -> None: """ Expands a top-level adjacency definition from 'network.adjacency'. Args: - ctx (DSLExpansionContext): The context containing the target network. - adj_def (Dict[str, Any]): The adjacency definition dict, containing - 'source', 'target', and optional 'pattern', 'link_params'. + ctx: The context containing the target network. + adj_def: The adjacency definition dict, containing 'source', 'target', + and optional 'pattern', 'link_params'. """ source_path_raw = adj_def["source"] target_path_raw = adj_def["target"] @@ -243,7 +221,6 @@ def _expand_adjacency( link_count = adj_def.get("link_count", 1) link_params = adj_def.get("link_params", {}) - # Convert to an absolute or relative path source_path = _join_paths("", source_path_raw) target_path = _join_paths("", target_path_raw) @@ -271,12 +248,12 @@ def _expand_adjacency_pattern( of the smaller set size. Args: - ctx (DSLExpansionContext): The context containing the target network. - source_path (str): The path pattern identifying the source node group(s). - target_path (str): The path pattern identifying the target node group(s). - pattern (str): The type of adjacency pattern (e.g., "mesh", "one_to_one"). - link_params (Dict[str, Any]): Additional link parameters (capacity, cost, attrs). - link_count (int): Number of parallel links to create for each adjacency. + ctx: The context containing the target network. + source_path: The path pattern identifying the source node group(s). + target_path: The path pattern identifying the target node group(s). + pattern: The type of adjacency pattern (e.g., "mesh", "one_to_one"). + link_params: Additional link parameters (capacity, cost, attrs). + link_count: Number of parallel links to create for each adjacency. """ source_node_groups = ctx.network.select_node_groups_by_path(source_path) target_node_groups = ctx.network.select_node_groups_by_path(target_path) @@ -284,7 +261,6 @@ def _expand_adjacency_pattern( source_nodes = [node for _, nodes in source_node_groups.items() for node in nodes] target_nodes = [node for _, nodes in target_node_groups.items() for node in nodes] - # If either list is empty, no links to create if not source_nodes or not target_nodes: return @@ -340,19 +316,15 @@ def _create_link( ) -> None: """ Creates and adds one or more Links to the network, applying capacity, cost, - and attributes from link_params. Uses deep copies of the attributes to avoid - accidental shared mutations. + and attributes from link_params. Args: - net (Network): The network to which the new link(s) is/are added. - source (str): Source node name for the link. - target (str): Target node name for the link. - link_params (Dict[str, Any]): A dict possibly containing 'capacity', 'cost', - and 'attrs' keys. - link_count (int): Number of parallel links to create between source and target. + net: The network to which the new link(s) will be added. + source: Source node name for the link. + target: Target node name for the link. + link_params: A dict possibly containing 'capacity', 'cost', and 'attrs' keys. + link_count: Number of parallel links to create between source and target. """ - import copy - for _ in range(link_count): capacity = link_params.get("capacity", 1.0) cost = link_params.get("cost", 1.0) @@ -380,13 +352,12 @@ def _process_direct_nodes(net: Network, network_data: Dict[str, Any]) -> None: hw_type: "X100" Args: - net (Network): The network to which nodes are added. - network_data (Dict[str, Any]): DSL data containing a "nodes" dict - keyed by node name -> attributes. + net: The network to which nodes are added. + network_data: DSL data containing a "nodes" dict keyed by node name -> attributes. """ - for node_name, node_attrs in network_data.get("nodes", {}).items(): + for node_name, attrs in network_data.get("nodes", {}).items(): if node_name not in net.nodes: - new_node = Node(name=node_name, attrs=node_attrs or {}) + new_node = Node(name=node_name, attrs=attrs or {}) new_node.attrs.setdefault("type", "node") net.add_node(new_node) @@ -406,8 +377,8 @@ def _process_direct_links(net: Network, network_data: Dict[str, Any]) -> None: color: "blue" Args: - net (Network): The network to which links are added. - network_data (Dict[str, Any]): DSL data containing a "links" list, + net: The network to which links are added. + network_data: DSL data containing a "links" list, each item must have "source", "target", and optionally "link_params". """ existing_node_names = set(net.nodes.keys()) @@ -423,7 +394,7 @@ def _process_direct_links(net: Network, network_data: Dict[str, Any]) -> None: _create_link(net, source, target, link_params, link_count) -def _process_link_overrides(network: Network, network_data: Dict[str, Any]) -> None: +def _process_link_overrides(net: Network, network_data: Dict[str, Any]) -> None: """ Processes the 'link_overrides' section of the network DSL, updating existing links with new parameters. @@ -438,10 +409,9 @@ def _process_link_overrides(network: Network, network_data: Dict[str, Any]) -> N shared_risk_group: "SRG1" Args: - network (Network): The Network whose links will be updated. - network_data (Dict[str, Any]): The overall DSL data for the 'network'. - Expected to contain 'link_overrides' as a list of dicts, each with - 'source', 'target', and 'link_params'. + net: The Network whose links will be updated. + network_data: The overall DSL data for the 'network'. + Expected to contain 'link_overrides' as a list of dicts. """ link_overrides = network_data.get("link_overrides", []) for link_override in link_overrides: @@ -449,7 +419,7 @@ def _process_link_overrides(network: Network, network_data: Dict[str, Any]) -> N target = link_override["target"] link_params = link_override["link_params"] any_direction = link_override.get("any_direction", True) - _update_links(network, source, target, link_params, any_direction) + _update_links(net, source, target, link_params, any_direction) def _process_node_overrides(net: Network, network_data: Dict[str, Any]) -> None: @@ -465,10 +435,9 @@ def _process_node_overrides(net: Network, network_data: Dict[str, Any]) -> None: shared_risk_group: "SRG2" Args: - net (Network): The Network whose nodes will be updated. - network_data (Dict[str, Any]): The overall DSL data for the 'network'. - Expected to contain 'node_overrides' as a list of dicts, each with - 'path' and 'attrs'. + net: The Network whose nodes will be updated. + network_data: The overall DSL data for the 'network'. + Expected to contain 'node_overrides' as a list of dicts. """ node_overrides = network_data.get("node_overrides", []) for override in node_overrides: @@ -492,11 +461,11 @@ def _update_links( are updated. Args: - net (Network): The network whose links should be updated. - source (str): A path pattern identifying source node group(s). - target (str): A path pattern identifying target node group(s). - link_params (Dict[str, Any]): New parameter values for the links (capacity, cost, attrs). - any_direction (bool): If True, also update links in the reverse direction. + net: The network whose links should be updated. + source: A path pattern identifying source node group(s). + target: A path pattern identifying target node group(s). + link_params: New parameter values for the links (capacity, cost, attrs). + any_direction: If True, also update links in the reverse direction. """ source_node_groups = net.select_node_groups_by_path(source) target_node_groups = net.select_node_groups_by_path(target) @@ -521,23 +490,19 @@ def _update_links( link.attrs.update(link_params.get("attrs", {})) -def _update_nodes( - net: Network, - path: str, - node_attrs: Dict[str, Any], -) -> None: +def _update_nodes(net: Network, path: str, attrs: Dict[str, Any]) -> None: """ Updates attributes on all nodes matching a given path pattern. Args: - net (Network): The network containing nodes. - path (str): A path pattern identifying which node group(s) to modify. - node_attrs (Dict[str, Any]): A dictionary of new attributes to set/merge. + net: The network containing nodes. + path: A path pattern identifying which node group(s) to modify. + attrs: A dictionary of new attributes to set/merge. """ node_groups = net.select_node_groups_by_path(path) for _, nodes in node_groups.items(): for node in nodes: - node.attrs.update(node_attrs) + node.attrs.update(attrs) def _apply_parameters( @@ -550,21 +515,19 @@ def _apply_parameters( If 'spine.node_count' = 6 is in params_overrides, it sets 'node_count'=6 for the 'spine' subgroup. - If 'spine.node_attrs.hw_type' = 'Dell', - it sets subgroup_def['node_attrs']['hw_type'] = 'Dell'. + If 'spine.attrs.hw_type' = 'Dell', + it sets subgroup_def['attrs']['hw_type'] = 'Dell'. Args: - subgroup_name (str): Name of the subgroup in the blueprint (e.g. 'spine'). - subgroup_def (Dict[str, Any]): The default definition of the subgroup. - params_overrides (Dict[str, Any]): Overrides in the form of - {'spine.node_count': 6, 'spine.node_attrs.hw_type': 'Dell'}. + subgroup_name: Name of the subgroup in the blueprint (e.g. 'spine'). + subgroup_def: The default definition of the subgroup. + params_overrides: Overrides in the form of + {'spine.node_count': 6, 'spine.attrs.hw_type': 'Dell'}. Returns: - Dict[str, Any]: A copy of subgroup_def with parameter overrides applied, - including nested dictionary fields if specified by dotted paths (e.g. node_attrs.foo). + A copy of subgroup_def with parameter overrides applied, + including nested dictionary fields if specified by dotted paths (e.g. attrs.foo). """ - import copy - out = copy.deepcopy(subgroup_def) for key, val in params_overrides.items(): @@ -581,7 +544,7 @@ def _apply_nested_path( node_def: Dict[str, Any], path_parts: List[str], value: Any ) -> None: """ - Recursively applies a path like ["node_attrs", "role"] to set node_def["node_attrs"]["role"] = value. + Recursively applies a path like ["attrs", "role"] to set node_def["attrs"]["role"] = value. Creates intermediate dicts as needed. """ if not path_parts: @@ -591,7 +554,6 @@ def _apply_nested_path( node_def[key] = value return - # Ensure that node_def[key] is a dict if key not in node_def or not isinstance(node_def[key], dict): node_def[key] = {} _apply_nested_path(node_def[key], path_parts[1:], value) @@ -606,11 +568,11 @@ def _join_paths(parent_path: str, rel_path: str) -> str: - Otherwise, simply append rel_path to parent_path if parent_path is non-empty. Args: - parent_path (str): The existing path prefix. - rel_path (str): A relative path that may start with '/'. + parent_path: The existing path prefix. + rel_path: A relative path that may start with '/'. Returns: - str: The combined path as a single string. + The combined path as a single string. """ if rel_path.startswith("/"): rel_path = rel_path[1:] diff --git a/ngraph/components.py b/ngraph/components.py new file mode 100644 index 0000000..b1bac5d --- /dev/null +++ b/ngraph/components.py @@ -0,0 +1,294 @@ +from __future__ import annotations + +import yaml +from copy import deepcopy +from dataclasses import dataclass, field +from typing import Dict, Any, Optional + + +@dataclass(slots=True) +class Component: + """ + A generic component that can represent chassis, line cards, optics, etc. + Components can have nested children, each with their own cost, power, etc. + + Attributes: + name (str): Name of the component (e.g., "SpineChassis" or "400G-LR4"). + component_type (str): A string label (e.g., "chassis", "linecard", "optic"). + description (str): A human-readable description of this component. + cost (float): Cost (capex) of a single instance of this component. + power_watts (float): Typical/nominal power usage (watts) for one instance. + power_watts_max (float): Maximum/peak power usage (watts) for one instance. + capacity (float): A generic capacity measure (e.g., platform capacity). + ports (int): Number of ports if relevant for this component. + count (int): How many identical copies of this component are present. + attrs (Dict[str, Any]): Arbitrary key-value attributes for extra metadata. + children (Dict[str, Component]): Nested child components (e.g., line cards + inside a chassis), keyed by child name. + """ + + name: str + component_type: str = "generic" + description: str = "" + cost: float = 0.0 + + power_watts: float = 0.0 # Typical power usage + power_watts_max: float = 0.0 # Peak power usage + + capacity: float = 0.0 + ports: int = 0 + count: int = 1 + + attrs: Dict[str, Any] = field(default_factory=dict) + children: Dict[str, Component] = field(default_factory=dict) + + def total_cost(self) -> float: + """ + Computes the total (recursive) cost of this component, including children, + multiplied by this component's count. + + Returns: + float: The total cost. + """ + single_instance_cost = self.cost + for child in self.children.values(): + single_instance_cost += child.total_cost() + return single_instance_cost * self.count + + def total_power(self) -> float: + """ + Computes the total *typical* (recursive) power usage of this component, + including children, multiplied by this component's count. + + Returns: + float: The total typical power in watts. + """ + single_instance_power = self.power_watts + for child in self.children.values(): + single_instance_power += child.total_power() + return single_instance_power * self.count + + def total_power_max(self) -> float: + """ + Computes the total *peak* (recursive) power usage of this component, + including children, multiplied by this component's count. + + Returns: + float: The total maximum (peak) power in watts. + """ + single_instance_power_max = self.power_watts_max + for child in self.children.values(): + single_instance_power_max += child.total_power_max() + return single_instance_power_max * self.count + + def total_capacity(self) -> float: + """ + Computes the total (recursive) capacity of this component, + including children, multiplied by this component's count. + + Returns: + float: The total capacity (dimensionless or user-defined units). + """ + single_instance_capacity = self.capacity + for child in self.children.values(): + single_instance_capacity += child.total_capacity() + return single_instance_capacity * self.count + + def as_dict(self, include_children: bool = True) -> Dict[str, Any]: + """ + Returns a dictionary containing all properties of this component. + + Args: + include_children (bool): If True, recursively includes children. + + Returns: + Dict[str, Any]: Dictionary representation of this component. + """ + data = { + "name": self.name, + "component_type": self.component_type, + "description": self.description, + "cost": self.cost, + "power_watts": self.power_watts, + "power_watts_max": self.power_watts_max, + "capacity": self.capacity, + "ports": self.ports, + "count": self.count, + "attrs": dict(self.attrs), # shallow copy + } + if include_children: + data["children"] = { + child_name: child.as_dict(True) + for child_name, child in self.children.items() + } + return data + + +@dataclass(slots=True) +class ComponentsLibrary: + """ + Holds a collection of named Components. Each entry is a top-level "template" + that can be referenced for cost/power/capacity lookups, possibly with nested children. + + Example (YAML-like): + components: + BigSwitch: + component_type: chassis + cost: 20000 + power_watts: 1750 + capacity: 25600 + children: + PIM16Q-16x200G: + component_type: linecard + cost: 1000 + power_watts: 10 + ports: 16 + count: 8 + 200G-FR4: + component_type: optic + cost: 2000 + power_watts: 6 + power_watts_max: 6.5 + """ + + components: Dict[str, Component] = field(default_factory=dict) + + def get(self, name: str) -> Optional[Component]: + """ + Retrieves a Component by its name from the library. + + Args: + name (str): Name of the component. + + Returns: + Optional[Component]: The requested Component or None if not found. + """ + return self.components.get(name) + + def merge( + self, other: ComponentsLibrary, override: bool = True + ) -> ComponentsLibrary: + """ + Merges another ComponentsLibrary into this one. By default (override=True), + duplicate components in `other` overwrite those in the current library. + + Args: + other (ComponentsLibrary): Another library to merge into this one. + override (bool): If True, components in `other` override existing ones. + + Returns: + ComponentsLibrary: This instance, updated in place. + """ + for comp_name, comp_obj in other.components.items(): + if override or comp_name not in self.components: + self.components[comp_name] = comp_obj + return self + + def clone(self) -> ComponentsLibrary: + """ + Creates a deep copy of this ComponentsLibrary. + + Returns: + ComponentsLibrary: A new, cloned library instance. + """ + return ComponentsLibrary(components=deepcopy(self.components)) + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> ComponentsLibrary: + """ + Constructs a ComponentsLibrary from a dictionary of raw component definitions. + + Args: + data (Dict[str, Any]): Raw component definitions. + + Returns: + ComponentsLibrary: A newly constructed library. + """ + components_map: Dict[str, Component] = {} + for comp_name, comp_def in data.items(): + components_map[comp_name] = cls._build_component(comp_name, comp_def) + return cls(components=components_map) + + @classmethod + def _build_component(cls, name: str, definition_data: Dict[str, Any]) -> Component: + """ + Recursively constructs a single Component from a dictionary definition. + + Args: + name (str): Name of the component. + definition_data (Dict[str, Any]): Dictionary data for the component definition. + + Returns: + Component: The constructed Component instance. + """ + comp_type = definition_data.get("component_type", "generic") + cost = float(definition_data.get("cost", 0.0)) + power = float(definition_data.get("power_watts", 0.0)) + power_max = float(definition_data.get("power_watts_max", 0.0)) + capacity = float(definition_data.get("capacity", 0.0)) + ports = int(definition_data.get("ports", 0)) + count = int(definition_data.get("count", 1)) + + child_definitions = definition_data.get("children", {}) + children_map: Dict[str, Component] = {} + for child_name, child_data in child_definitions.items(): + children_map[child_name] = cls._build_component(child_name, child_data) + + recognized_keys = { + "component_type", + "cost", + "power_watts", + "power_watts_max", + "capacity", + "ports", + "children", + "attrs", + "count", + "description", + } + attrs: Dict[str, Any] = dict(definition_data.get("attrs", {})) + leftover_keys = { + k: v for k, v in definition_data.items() if k not in recognized_keys + } + attrs.update(leftover_keys) + + return Component( + name=name, + component_type=comp_type, + description=definition_data.get("description", ""), + cost=cost, + power_watts=power, + power_watts_max=power_max, + capacity=capacity, + ports=ports, + count=count, + attrs=attrs, + children=children_map, + ) + + @classmethod + def from_yaml(cls, yaml_str: str) -> ComponentsLibrary: + """ + Constructs a ComponentsLibrary from a YAML string. If the YAML contains + a top-level 'components' key, that key is used; otherwise the entire + top-level is treated as component definitions. + + Args: + yaml_str (str): A YAML-formatted string of component definitions. + + Returns: + ComponentsLibrary: A newly built components library. + + Raises: + ValueError: If the top-level is not a dictionary or if the 'components' + key is present but not a dictionary. + """ + data = yaml.safe_load(yaml_str) + if not isinstance(data, dict): + raise ValueError("Top-level must be a dict in Components YAML.") + + components_data = data.get("components") or data + if not isinstance(components_data, dict): + raise ValueError("'components' must be a dict if present.") + + return cls.from_dict(components_data) diff --git a/ngraph/explorer.py b/ngraph/explorer.py new file mode 100644 index 0000000..3e4319f --- /dev/null +++ b/ngraph/explorer.py @@ -0,0 +1,485 @@ +from __future__ import annotations + +import logging +from dataclasses import dataclass, field +from typing import Dict, List, Set, Optional + +from ngraph.network import Network, Node, Link +from ngraph.components import ComponentsLibrary + +logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) + + +@dataclass +class ExternalLinkBreakdown: + """ + Holds stats for external links to a particular other subtree. + + Attributes: + link_count (int): Number of links to that other subtree. + link_capacity (float): Sum of capacities for those links. + """ + + link_count: int = 0 + link_capacity: float = 0.0 + + +@dataclass +class TreeStats: + """ + Aggregated statistics for a single tree node (subtree). + + Attributes: + node_count (int): Total number of nodes in this subtree. + internal_link_count (int): Number of internal links in this subtree. + internal_link_capacity (float): Sum of capacities for those internal links. + external_link_count (int): Number of external links from this subtree to another. + external_link_capacity (float): Sum of capacities for those external links. + external_link_details (Dict[str, ExternalLinkBreakdown]): Breakdown of external + links by the other subtree's path. + total_cost (float): Cumulative cost from node 'hw_component' plus link 'hw_component'. + total_power (float): Cumulative power from node 'hw_component' plus link 'hw_component'. + """ + + node_count: int = 0 + + internal_link_count: int = 0 + internal_link_capacity: float = 0.0 + + external_link_count: int = 0 + external_link_capacity: float = 0.0 + + external_link_details: Dict[str, ExternalLinkBreakdown] = field( + default_factory=dict + ) + + total_cost: float = 0.0 + total_power: float = 0.0 + + +@dataclass(eq=False) +class TreeNode: + """ + Represents a node in the hierarchical tree. + + Attributes: + name (str): Name/label of this node (e.g., "dc1", "plane1", etc.). + parent (Optional[TreeNode]): Pointer to the parent tree node. + children (Dict[str, TreeNode]): Mapping of child name -> child TreeNode. + subtree_nodes (Set[str]): The set of all node names in this subtree. + stats (TreeStats): Computed statistics for this subtree. + raw_nodes (List[Node]): Direct Node objects at this hierarchical level. + """ + + name: str + parent: Optional[TreeNode] = None + + children: Dict[str, TreeNode] = field(default_factory=dict) + subtree_nodes: Set[str] = field(default_factory=set) + stats: TreeStats = field(default_factory=TreeStats) + raw_nodes: List[Node] = field(default_factory=list) + + def __hash__(self) -> int: + """ + Make the node hashable based on object identity. + This preserves uniqueness in sets/dicts without + forcing equality by fields. + """ + return id(self) + + def add_child(self, child_name: str) -> TreeNode: + """ + Ensure a child node named 'child_name' exists and return it. + + Args: + child_name (str): The name of the child node to add/find. + + Returns: + TreeNode: The new or existing child TreeNode. + """ + if child_name not in self.children: + child_node = TreeNode(name=child_name, parent=self) + self.children[child_name] = child_node + return self.children[child_name] + + def is_leaf(self) -> bool: + """ + Return True if this node has no children. + + Returns: + bool: True if there are no children, False otherwise. + """ + return len(self.children) == 0 + + +class NetworkExplorer: + """ + Provides hierarchical exploration of a Network, computing internal/external + link counts, node counts, and cost/power usage. Also records external link + breakdowns by subtree path, with optional roll-up of leaf nodes in display. + """ + + def __init__( + self, + network: Network, + components_library: Optional[ComponentsLibrary] = None, + ) -> None: + """ + Initialize a NetworkExplorer. Generally, use 'explore_network' to build + and populate stats automatically. + + Args: + network (Network): The network to explore. + components_library (Optional[ComponentsLibrary]): Library of + hardware/optic components to calculate cost/power. If None, + an empty library is used and cost/power will be 0. + """ + self.network = network + self.components_library = components_library or ComponentsLibrary() + + self.root_node: Optional[TreeNode] = None + + # For quick lookups: + self._node_map: Dict[str, TreeNode] = {} # node_name -> deepest TreeNode + self._path_map: Dict[str, TreeNode] = {} # path -> TreeNode + + # Cache for storing each node's ancestor set: + self._ancestors_cache: Dict[TreeNode, Set[TreeNode]] = {} + + @classmethod + def explore_network( + cls, + network: Network, + components_library: Optional[ComponentsLibrary] = None, + ) -> NetworkExplorer: + """ + Creates a NetworkExplorer, builds a hierarchy tree, and computes stats. + + NOTE: If you do not pass a non-empty components_library, any hardware + references for cost/power data will not be found. + + Args: + network (Network): The network to explore. + components_library (Optional[ComponentsLibrary]): Components library + to use for cost/power lookups. + + Returns: + NetworkExplorer: A fully populated explorer instance with stats. + """ + instance = cls(network, components_library) + + # 1) Build the hierarchical structure + instance.root_node = instance._build_hierarchy_tree() + + # 2) Compute subtree sets (subtree_nodes) + instance._compute_subtree_sets(instance.root_node) + + # 3) Build node and path maps + instance._build_node_map(instance.root_node) + instance._build_path_map(instance.root_node) + + # 4) Aggregate statistics (node counts, link stats, cost, power) + instance._compute_statistics() + + return instance + + def _build_hierarchy_tree(self) -> TreeNode: + """ + Build a multi-level tree by splitting node names on '/'. + Example: "dc1/plane1/ssw/ssw-1" => root/dc1/plane1/ssw/ssw-1 + + Returns: + TreeNode: The root of the newly constructed tree. + """ + root = TreeNode(name="root") + for nd in self.network.nodes.values(): + path_parts = nd.name.split("/") + current = root + for part in path_parts: + current = current.add_child(part) + current.raw_nodes.append(nd) + return root + + def _compute_subtree_sets(self, node: TreeNode) -> Set[str]: + """ + Recursively compute the set of node names in each subtree. + + Args: + node (TreeNode): The current tree node. + + Returns: + Set[str]: A set of node names belonging to the subtree under 'node'. + """ + collected = set() + for child in node.children.values(): + collected |= self._compute_subtree_sets(child) + for nd in node.raw_nodes: + collected.add(nd.name) + node.subtree_nodes = collected + return collected + + def _build_node_map(self, node: TreeNode) -> None: + """ + Post-order traversal to populate _node_map. + + Each node_name in 'node.subtree_nodes' maps to 'node' if not already + assigned. The "deepest" node (lowest in the hierarchy) takes precedence. + + Args: + node (TreeNode): The current tree node. + """ + for child in node.children.values(): + self._build_node_map(child) + for node_name in node.subtree_nodes: + if node_name not in self._node_map: + self._node_map[node_name] = node + + def _build_path_map(self, node: TreeNode) -> None: + """ + Build a path->TreeNode map for easy lookups. Skips "root" in paths. + + Args: + node (TreeNode): The current tree node. + """ + path_str = self._compute_full_path(node) + self._path_map[path_str] = node + for child in node.children.values(): + self._build_path_map(child) + + def _compute_full_path(self, node: TreeNode) -> str: + """ + Return a '/'-joined path, omitting "root". + + Args: + node (TreeNode): The tree node to compute a path for. + + Returns: + str: E.g., "dc1/plane1/ssw". + """ + parts = [] + current = node + while current and current.name != "root": + parts.append(current.name) + current = current.parent + return "/".join(reversed(parts)) + + def _roll_up_if_leaf(self, path: str) -> str: + """ + If 'path' corresponds to a leaf node, climb up until a non-leaf or root + is found. Return the resulting path. + + Args: + path (str): A '/'-joined path. + + Returns: + str: Possibly re-mapped path if a leaf was rolled up. + """ + node = self._path_map.get(path) + if not node: + return path + while node.parent and node.parent.name != "root" and node.is_leaf(): + node = node.parent + return self._compute_full_path(node) + + def _get_ancestors(self, node: TreeNode) -> Set[TreeNode]: + """ + Return a cached set of this node's ancestors (including itself), + up to the root. + """ + if node in self._ancestors_cache: + return self._ancestors_cache[node] + + ancestors = set() + current = node + while current is not None: + ancestors.add(current) + current = current.parent + self._ancestors_cache[node] = ancestors + return ancestors + + def _compute_statistics(self) -> None: + """ + Computes all subtree statistics in a more efficient manner: + + - node_count is set from each node's 'subtree_nodes' (already stored). + - For each network node, cost/power is added to all ancestors in the + hierarchy. + - For each link, we figure out which subtrees see it as internal or + external, and update stats accordingly. + """ + + # 1) node_count: use subtree sets + # (each node gets the size of subtree_nodes) + # stats are zeroed initially in the constructor. + def set_node_counts(node: TreeNode) -> None: + node.stats.node_count = len(node.subtree_nodes) + for child in node.children.values(): + set_node_counts(child) + + set_node_counts(self.root_node) + + # 2) Accumulate node cost/power into all ancestor stats + for nd in self.network.nodes.values(): + hw_component = nd.attrs.get("hw_component") + comp = None + if hw_component: + comp = self.components_library.get(hw_component) + if comp is None: + logger.warning( + "Node '%s' references unknown hw_component '%s'.", + nd.name, + hw_component, + ) + + # Walk up from the deepest node + node_for_name = self._node_map[nd.name] + ancestors = self._get_ancestors(node_for_name) + if comp: + cval = comp.total_cost() + pval = comp.total_power() + for an in ancestors: + an.stats.total_cost += cval + an.stats.total_power += pval + + # 3) Single pass to accumulate link stats + # For each link, determine for which subtrees it's internal vs external, + # and update stats accordingly. Also add link hw cost/power if applicable. + for link in self.network.links.values(): + src = link.source + dst = link.target + + # Check link's hw_component + hw_comp = link.attrs.get("hw_component") + link_comp = None + if hw_comp: + link_comp = self.components_library.get(hw_comp) + if link_comp is None: + logger.warning( + "Link '%s->%s' references unknown hw_component '%s'.", + src, + dst, + hw_comp, + ) + + src_node = self._node_map[src] + dst_node = self._node_map[dst] + A_src = self._get_ancestors(src_node) + A_dst = self._get_ancestors(dst_node) + + # Intersection => internal + # XOR => external + inter = A_src & A_dst + xor = A_src ^ A_dst + + # Capacity + cap = link.capacity + + # For cost/power from link, we add to any node + # that sees it either internal or external. + link_cost = link_comp.total_cost() if link_comp else 0.0 + link_power = link_comp.total_power() if link_comp else 0.0 + + # Internal link updates + for an in inter: + an.stats.internal_link_count += 1 + an.stats.internal_link_capacity += cap + an.stats.total_cost += link_cost + an.stats.total_power += link_power + + # External link updates + for an in xor: + an.stats.external_link_count += 1 + an.stats.external_link_capacity += cap + an.stats.total_cost += link_cost + an.stats.total_power += link_power + + # Update external_link_details + if an in A_src: + # 'an' sees the other side as 'dst' + other_path = self._compute_full_path(dst_node) + else: + # 'an' sees the other side as 'src' + other_path = self._compute_full_path(src_node) + bd = an.stats.external_link_details.setdefault( + other_path, ExternalLinkBreakdown() + ) + bd.link_count += 1 + bd.link_capacity += cap + + def print_tree( + self, + node: Optional[TreeNode] = None, + indent: int = 0, + max_depth: Optional[int] = None, + skip_leaves: bool = False, + detailed: bool = False, + ) -> None: + """ + Print the hierarchy from the given node (default: root). + If detailed=True, show link capacities and external link breakdown. + If skip_leaves=True, leaf nodes are omitted from printing (rolled up). + + Args: + node (Optional[TreeNode]): The node to start printing from; defaults to root. + indent (int): Indentation level for the output. + max_depth (Optional[int]): If set, stop printing deeper levels when exceeded. + skip_leaves (bool): If True, leaf nodes are not individually printed. + detailed (bool): If True, print more detailed link/capacity breakdowns. + """ + if node is None: + node = self.root_node + if node is None: + print("No hierarchy built yet.") + return + + if max_depth is not None and indent > max_depth: + return + + if skip_leaves and node.is_leaf() and node.parent is not None: + return + + stats = node.stats + total_links = stats.internal_link_count + stats.external_link_count + line = ( + f"{' ' * indent}- {node.name or 'root'} | " + f"Nodes={stats.node_count}, Links={total_links}, " + f"Cost={stats.total_cost}, Power={stats.total_power}" + ) + if detailed: + line += ( + f" | IntLinkCap={stats.internal_link_capacity}, " + f"ExtLinkCap={stats.external_link_capacity}" + ) + + print(line) + + # If detailed, show external link breakdown + if detailed and stats.external_link_details: + rolled_map: Dict[str, ExternalLinkBreakdown] = {} + for other_path, info in stats.external_link_details.items(): + rolled_path = other_path + if skip_leaves: + rolled_path = self._roll_up_if_leaf(rolled_path) + accum = rolled_map.setdefault(rolled_path, ExternalLinkBreakdown()) + accum.link_count += info.link_count + accum.link_capacity += info.link_capacity + + for path_str in sorted(rolled_map.keys()): + ext_info = rolled_map[path_str] + if path_str == "": + path_str = "[root]" + print( + f"{' ' * indent} -> External to [{path_str}]: " + f"{ext_info.link_count} links, cap={ext_info.link_capacity}" + ) + + # Recurse children + for child in node.children.values(): + self.print_tree( + node=child, + indent=indent + 1, + max_depth=max_depth, + skip_leaves=skip_leaves, + detailed=detailed, + ) diff --git a/ngraph/scenario.py b/ngraph/scenario.py index 448bc2c..988f716 100644 --- a/ngraph/scenario.py +++ b/ngraph/scenario.py @@ -2,7 +2,7 @@ import yaml from dataclasses import dataclass, field -from typing import Any, Dict, List +from typing import Any, Dict, List, Optional from ngraph.network import Network from ngraph.failure_policy import FailurePolicy, FailureRule, FailureCondition @@ -10,6 +10,7 @@ from ngraph.results import Results from ngraph.workflow.base import WorkflowStep, WORKFLOW_STEP_REGISTRY from ngraph.blueprints import expand_network_dsl +from ngraph.components import ComponentsLibrary @dataclass(slots=True) @@ -23,9 +24,11 @@ class Scenario: - A set of traffic demands. - A list of workflow steps to execute. - A results container for storing outputs. + - A components_library for hardware/optics definitions. Typical usage example: - scenario = Scenario.from_yaml(yaml_str) + + scenario = Scenario.from_yaml(yaml_str, default_components=default_lib) scenario.run() # Inspect scenario.results @@ -35,6 +38,7 @@ class Scenario: traffic_demands (List[TrafficDemand]): Describes source/target flows. workflow (List[WorkflowStep]): Defines the execution pipeline. results (Results): Stores outputs from the workflow steps. + components_library (ComponentsLibrary): Stores hardware/optics definitions. """ network: Network @@ -42,6 +46,7 @@ class Scenario: traffic_demands: List[TrafficDemand] workflow: List[WorkflowStep] results: Results = field(default_factory=Results) + components_library: ComponentsLibrary = field(default_factory=ComponentsLibrary) def run(self) -> None: """ @@ -54,22 +59,30 @@ def run(self) -> None: step.run(self) @classmethod - def from_yaml(cls, yaml_str: str) -> Scenario: + def from_yaml( + cls, + yaml_str: str, + default_components: Optional[ComponentsLibrary] = None, + ) -> Scenario: """ - Constructs a Scenario from a YAML string, including blueprint expansion. + Constructs a Scenario from a YAML string, optionally merging + with a default ComponentsLibrary if provided. Expected top-level YAML keys: - - blueprints: Optional set of blueprint definitions - - network: Network DSL that references blueprints and/or direct nodes/links - - failure_policy: Multi-rule policy definition - - traffic_demands: List of demands (source, target, amount) - - workflow: Steps to execute + - blueprints: Optional blueprint definitions. + - network: Network DSL referencing blueprints or direct node/link definitions. + - failure_policy: Multi-rule policy definition. + - traffic_demands: A list of demands (source, target, amount). + - workflow: Steps to execute in sequence. + - components: Optional dictionary defining scenario-specific components. Args: yaml_str (str): The YAML string that defines the scenario. + default_components (Optional[ComponentsLibrary]): An optional default + library to merge with scenario-specific components. Returns: - Scenario: An initialized Scenario instance with expanded network. + Scenario: An initialized Scenario with expanded network. Raises: ValueError: If the YAML is malformed or missing required sections. @@ -93,11 +106,26 @@ def from_yaml(cls, yaml_str: str) -> Scenario: workflow_data = data.get("workflow", []) workflow_steps = cls._build_workflow_steps(workflow_data) + # 5) Build/merge components library + scenario_comps_data = data.get("components", {}) + scenario_comps_lib = ( + ComponentsLibrary.from_dict(scenario_comps_data) + if scenario_comps_data + else None + ) + + final_components = ( + default_components.clone() if default_components else ComponentsLibrary() + ) + if scenario_comps_lib: + final_components.merge(scenario_comps_lib) + return cls( network=network, failure_policy=failure_policy, traffic_demands=traffic_demands, workflow=workflow_steps, + components_library=final_components, ) @staticmethod @@ -120,18 +148,24 @@ def _build_failure_policy(fp_data: Dict[str, Any]) -> FailurePolicy: count: 1 Args: - fp_data (Dict[str, Any]): Dictionary for the 'failure_policy' section. + fp_data (Dict[str, Any]): Dictionary from the 'failure_policy' section. Returns: FailurePolicy: A policy containing a list of FailureRule objects. + + Raises: + ValueError: If 'rules' is not a list when provided. """ rules_data = fp_data.get("rules", []) - rules: List[FailureRule] = [] + if not isinstance(rules_data, list): + raise ValueError("failure_policy 'rules' must be a list if present.") + rules: List[FailureRule] = [] for rule_dict in rules_data: conditions_data = rule_dict.get("conditions", []) conditions: List[FailureCondition] = [] for cond_dict in conditions_data: + # Rely on KeyError to surface missing required fields condition = FailureCondition( attr=cond_dict["attr"], operator=cond_dict["operator"], @@ -161,8 +195,7 @@ def _build_workflow_steps( Converts workflow step dictionaries into instantiated WorkflowStep objects. Each step dict must have a "step_type" referencing a registered workflow - step in WORKFLOW_STEP_REGISTRY. Any additional keys are passed as init - arguments to that WorkflowStep subclass. + step in WORKFLOW_STEP_REGISTRY. Additional keys are passed to that step's init. Example: workflow: @@ -176,25 +209,27 @@ def _build_workflow_steps( describing a workflow step. Returns: - List[WorkflowStep]: A list of WorkflowStep instances, constructed - in the order provided. + List[WorkflowStep]: A list of WorkflowStep instances. Raises: - ValueError: If a dict lacks "step_type" or references an unknown type. + ValueError: If workflow_data is not a list, or if any entry + lacks "step_type" or references an unknown step type. """ + if not isinstance(workflow_data, list): + raise ValueError("'workflow' must be a list if present.") + steps: List[WorkflowStep] = [] for step_info in workflow_data: step_type = step_info.get("step_type") if not step_type: raise ValueError( - "Each workflow entry must have a 'step_type' field indicating " - "which WorkflowStep subclass to use." + "Each workflow entry must have a 'step_type' field " + "to indicate the WorkflowStep subclass to use." ) step_cls = WORKFLOW_STEP_REGISTRY.get(step_type) if not step_cls: raise ValueError(f"Unrecognized 'step_type': {step_type}") - # Remove 'step_type' so it doesn't conflict with step_cls.__init__ step_args = {k: v for k, v in step_info.items() if k != "step_type"} steps.append(step_cls(**step_args)) return steps diff --git a/notebooks/lib_examples.ipynb b/notebooks/lib_examples.ipynb index 2511c12..0388885 100644 --- a/notebooks/lib_examples.ipynb +++ b/notebooks/lib_examples.ipynb @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -47,7 +47,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -108,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ diff --git a/notebooks/scenario_dc.ipynb b/notebooks/scenario_dc.ipynb index cdc7789..560ad4f 100644 --- a/notebooks/scenario_dc.ipynb +++ b/notebooks/scenario_dc.ipynb @@ -12,7 +12,8 @@ "from ngraph.lib.flow_policy import FlowPolicyConfig, FlowPolicy, FlowPlacement\n", "from ngraph.lib.algorithms.base import PathAlg, EdgeSelect\n", "from ngraph.failure_manager import FailureManager\n", - "from ngraph.failure_policy import FailurePolicy, FailureRule, FailureCondition" + "from ngraph.failure_policy import FailurePolicy, FailureRule, FailureCondition\n", + "from ngraph.explorer import NetworkExplorer" ] }, { @@ -26,13 +27,19 @@ " server_pod:\n", " rsw:\n", " node_count: 48\n", + " attrs:\n", + " hw_component: Minipack2_128x200GE\n", " \n", " f16_2tier:\n", " groups:\n", " ssw:\n", " node_count: 36\n", + " attrs:\n", + " hw_component: Minipack2_128x200GE\n", " fsw:\n", " node_count: 96\n", + " attrs:\n", + " hw_component: Minipack2_128x200GE\n", "\n", " adjacency:\n", " - source: /ssw\n", @@ -46,8 +53,12 @@ " groups:\n", " fauu:\n", " node_count: 8\n", + " attrs:\n", + " hw_component: Minipack2_128x200GE\n", " fadu:\n", " node_count: 36\n", + " attrs:\n", + " hw_component: Minipack2_128x200GE\n", "\n", " adjacency:\n", " - source: /fauu\n", @@ -329,7 +340,14 @@ " link_count: 2\n", " link_params:\n", " capacity: 400\n", - " cost: 1 \n", + " cost: 1 \n", + "components:\n", + " Minipack2_128x200GE:\n", + " component_type: router\n", + " power_watts: 1750 # typical power consumption with 128x200GE QSFP56 200G-FR4 at 30C\n", + " QSFP56_200G-FR4_2km:\n", + " component_type: pluggable_optics\n", + " power_watts: 6.5 \n", "\"\"\"\n", "scenario = Scenario.from_yaml(scenario_yaml)\n", "network = scenario.network" @@ -343,7 +361,7 @@ { "data": { "text/plain": [ - "6016" + "Node(name='dc1/plane1/ssw/ssw-1', attrs={'hw_component': 'Minipack2_128x200GE', 'type': 'node', 'disabled': False})" ] }, "execution_count": 3, @@ -352,7 +370,7 @@ } ], "source": [ - "len(network.nodes)" + "network.nodes[\"dc1/plane1/ssw/ssw-1\"]" ] }, { @@ -363,7 +381,7 @@ { "data": { "text/plain": [ - "167984" + "Component(name='Minipack2_128x200GE', component_type='router', description='', cost=0.0, power_watts=1750.0, power_watts_max=0.0, capacity=0.0, ports=0, count=1, attrs={}, children={})" ] }, "execution_count": 4, @@ -372,119 +390,14 @@ } ], "source": [ - "len(network.links)" + "comp_lib = scenario.components_library\n", + "comp_lib.get(\"Minipack2_128x200GE\")" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "64" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(network.find_links(\".*/fauu/.*\", \".*/eb01/.*-1$\", any_direction=True))" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[Link(source='fa/fa1/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa1/fauu/fauu-1|ebb/eb01/eb01-1|3sFZdEgESQCvfbx96QfJuA'),\n", - " Link(source='fa/fa1/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa1/fauu/fauu-1|ebb/eb01/eb01-1|3JxzPvRuTeCAqu7Q4cgibA'),\n", - " Link(source='fa/fa1/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa1/fauu/fauu-5|ebb/eb01/eb01-1|NZ7fHr2pRx-1J7d5bSub6w'),\n", - " Link(source='fa/fa1/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa1/fauu/fauu-5|ebb/eb01/eb01-1|jnwHFsqpRH-V48FRmO79Jw'),\n", - " Link(source='fa/fa2/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa2/fauu/fauu-1|ebb/eb01/eb01-1|eEVxX_YfS2OCTehS5hgYuA'),\n", - " Link(source='fa/fa2/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa2/fauu/fauu-1|ebb/eb01/eb01-1|8IdHep87QRmENLXjNFXxsQ'),\n", - " Link(source='fa/fa2/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa2/fauu/fauu-5|ebb/eb01/eb01-1|tjLb3bIsQKqrP2Nrh7j4OA'),\n", - " Link(source='fa/fa2/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa2/fauu/fauu-5|ebb/eb01/eb01-1|s3DcdER4SBa3-J3PbHux5A'),\n", - " Link(source='fa/fa3/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa3/fauu/fauu-1|ebb/eb01/eb01-1|LYBH3n-DRL-A2fFSj_NHVg'),\n", - " Link(source='fa/fa3/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa3/fauu/fauu-1|ebb/eb01/eb01-1|34tRumy7Rf-49B1C5rtArQ'),\n", - " Link(source='fa/fa3/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa3/fauu/fauu-5|ebb/eb01/eb01-1|aB7ahwgFReWnuIoBfxkruA'),\n", - " Link(source='fa/fa3/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa3/fauu/fauu-5|ebb/eb01/eb01-1|_SVDn8NKQcGJZydMWB_E2g'),\n", - " Link(source='fa/fa4/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa4/fauu/fauu-1|ebb/eb01/eb01-1|5FaBSNGpSu-V4RWEs-2cwA'),\n", - " Link(source='fa/fa4/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa4/fauu/fauu-1|ebb/eb01/eb01-1|btcKCJPlQEGuMyBSa1pq7g'),\n", - " Link(source='fa/fa4/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa4/fauu/fauu-5|ebb/eb01/eb01-1|RjSP6OsWTm-mnwxqgzmBgg'),\n", - " Link(source='fa/fa4/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa4/fauu/fauu-5|ebb/eb01/eb01-1|0WpNC5L3ROKYpJbHZkc4Jg'),\n", - " Link(source='fa/fa5/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa5/fauu/fauu-1|ebb/eb01/eb01-1|nMT7xc9jTNy0YkRv8CmEyA'),\n", - " Link(source='fa/fa5/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa5/fauu/fauu-1|ebb/eb01/eb01-1|ipajqjjKRb-ZgEPTZK5Ytw'),\n", - " Link(source='fa/fa5/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa5/fauu/fauu-5|ebb/eb01/eb01-1|ZEa5wPFNSNywSpRnNuHO3g'),\n", - " Link(source='fa/fa5/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa5/fauu/fauu-5|ebb/eb01/eb01-1|MLsm1p5NT3uGwPH_7v7j9w'),\n", - " Link(source='fa/fa6/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa6/fauu/fauu-1|ebb/eb01/eb01-1|0Tdcj7YsRfmcTRzZBsquCA'),\n", - " Link(source='fa/fa6/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa6/fauu/fauu-1|ebb/eb01/eb01-1|A8QM3HsxSFC2JEl69vP1jQ'),\n", - " Link(source='fa/fa6/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa6/fauu/fauu-5|ebb/eb01/eb01-1|G5VvsYp7QmaSLEDDlqkpHg'),\n", - " Link(source='fa/fa6/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa6/fauu/fauu-5|ebb/eb01/eb01-1|tjFWHD5UQ3-BbJOBviPTWQ'),\n", - " Link(source='fa/fa7/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa7/fauu/fauu-1|ebb/eb01/eb01-1|TBYcB4j_SPGdO8U8OwzgDQ'),\n", - " Link(source='fa/fa7/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa7/fauu/fauu-1|ebb/eb01/eb01-1|5I2a_93oTvuUQGMRR7f65g'),\n", - " Link(source='fa/fa7/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa7/fauu/fauu-5|ebb/eb01/eb01-1|Mfbpq7DfSOqbmi24SOsUtg'),\n", - " Link(source='fa/fa7/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa7/fauu/fauu-5|ebb/eb01/eb01-1|0OOU1NAjQXKgeChp26vreA'),\n", - " Link(source='fa/fa8/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa8/fauu/fauu-1|ebb/eb01/eb01-1|ZnCeNYFOQ-W0mlq2FdwyPg'),\n", - " Link(source='fa/fa8/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa8/fauu/fauu-1|ebb/eb01/eb01-1|lyDKbj0yRoeEIBXhob1JgA'),\n", - " Link(source='fa/fa8/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa8/fauu/fauu-5|ebb/eb01/eb01-1|qt_ZaZBZTXqyrH9vg3Qx7g'),\n", - " Link(source='fa/fa8/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa8/fauu/fauu-5|ebb/eb01/eb01-1|V4pMQ_feQOWyww0Ytek3Dw'),\n", - " Link(source='fa/fa9/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa9/fauu/fauu-1|ebb/eb01/eb01-1|IZYCdOpbRbeip7CgXek2Iw'),\n", - " Link(source='fa/fa9/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa9/fauu/fauu-1|ebb/eb01/eb01-1|0G3_Hm9iQmmDwiR1UwVL1g'),\n", - " Link(source='fa/fa9/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa9/fauu/fauu-5|ebb/eb01/eb01-1|MrY8MqXdRDiaVo3GWsnGgQ'),\n", - " Link(source='fa/fa9/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa9/fauu/fauu-5|ebb/eb01/eb01-1|0aMsS0oeRmu-2bY5csK5kA'),\n", - " Link(source='fa/fa10/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa10/fauu/fauu-1|ebb/eb01/eb01-1|2lh071h8SFOw7hUVbKu0vQ'),\n", - " Link(source='fa/fa10/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa10/fauu/fauu-1|ebb/eb01/eb01-1|XqjYTBqOSRGKOm2rgRJJpg'),\n", - " Link(source='fa/fa10/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa10/fauu/fauu-5|ebb/eb01/eb01-1|9cDhtlQLTniFAIQe55Zwyg'),\n", - " Link(source='fa/fa10/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa10/fauu/fauu-5|ebb/eb01/eb01-1|zV_QOefgRQ-mcyYfdajR5Q'),\n", - " Link(source='fa/fa11/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa11/fauu/fauu-1|ebb/eb01/eb01-1|dg_oJ3brQBOWTSp228oypw'),\n", - " Link(source='fa/fa11/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa11/fauu/fauu-1|ebb/eb01/eb01-1|xNutN2i0RhSnuzmZvUHJ3g'),\n", - " Link(source='fa/fa11/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa11/fauu/fauu-5|ebb/eb01/eb01-1|b-c0YviiTdSqws7rrWMohg'),\n", - " Link(source='fa/fa11/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa11/fauu/fauu-5|ebb/eb01/eb01-1|08WzWfDNT3y2OwTD0ImPCQ'),\n", - " Link(source='fa/fa12/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa12/fauu/fauu-1|ebb/eb01/eb01-1|-JSm2a1DSKmJRs4pV12MiA'),\n", - " Link(source='fa/fa12/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa12/fauu/fauu-1|ebb/eb01/eb01-1|pYBAOmmPQty6qjYJe0ih_w'),\n", - " Link(source='fa/fa12/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa12/fauu/fauu-5|ebb/eb01/eb01-1|zGNViXJRSVCofdyTC9PREQ'),\n", - " Link(source='fa/fa12/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa12/fauu/fauu-5|ebb/eb01/eb01-1|8NMeBXywRFK_SG5QgTwAUQ'),\n", - " Link(source='fa/fa13/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa13/fauu/fauu-1|ebb/eb01/eb01-1|qOWmvDnSToacZEImJ3dZRw'),\n", - " Link(source='fa/fa13/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa13/fauu/fauu-1|ebb/eb01/eb01-1|x0eXL0FdTw6WzAVfJhaDtA'),\n", - " Link(source='fa/fa13/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa13/fauu/fauu-5|ebb/eb01/eb01-1|-s3s3UlKTKKtoSfNz58RXg'),\n", - " Link(source='fa/fa13/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa13/fauu/fauu-5|ebb/eb01/eb01-1|kQg0piKYTwCDh4ctq-SD2Q'),\n", - " Link(source='fa/fa14/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa14/fauu/fauu-1|ebb/eb01/eb01-1|tcQG7Tr5RLaIYXDKOyUT7A'),\n", - " Link(source='fa/fa14/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa14/fauu/fauu-1|ebb/eb01/eb01-1|LNZDkx32TO2u8hSuSWpOpA'),\n", - " Link(source='fa/fa14/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa14/fauu/fauu-5|ebb/eb01/eb01-1|S9onJLikQNeLozaV2mTzWQ'),\n", - " Link(source='fa/fa14/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa14/fauu/fauu-5|ebb/eb01/eb01-1|R_2psKt5QbSsvkZQicfVbQ'),\n", - " Link(source='fa/fa15/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa15/fauu/fauu-1|ebb/eb01/eb01-1|d63StE8ZRjOhW7ZZZ2SYhg'),\n", - " Link(source='fa/fa15/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa15/fauu/fauu-1|ebb/eb01/eb01-1|JR-XUzkDRq-nflDnl1dNeQ'),\n", - " Link(source='fa/fa15/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa15/fauu/fauu-5|ebb/eb01/eb01-1|5T92ttV_ThmH3p7AkeqDNQ'),\n", - " Link(source='fa/fa15/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa15/fauu/fauu-5|ebb/eb01/eb01-1|HmnUGlF9TB2khZJgo655gQ'),\n", - " Link(source='fa/fa16/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa16/fauu/fauu-1|ebb/eb01/eb01-1|ux5CC0D6Qq-yRjsw3FgkMQ'),\n", - " Link(source='fa/fa16/fauu/fauu-1', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa16/fauu/fauu-1|ebb/eb01/eb01-1|68HvEe8ASf2CU7VdWhnnTg'),\n", - " Link(source='fa/fa16/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa16/fauu/fauu-5|ebb/eb01/eb01-1|yIEvs6SBQIiY532ytWUSmA'),\n", - " Link(source='fa/fa16/fauu/fauu-5', target='ebb/eb01/eb01-1', capacity=400, cost=1, attrs={'type': 'link', 'disabled': False}, id='fa/fa16/fauu/fauu-5|ebb/eb01/eb01-1|m44kZWu3SkaSqu5475t5bQ'),\n", - " Link(source='ebb/eb01/eb01-1', target='ebb/eb01/eb01-2', capacity=3200, cost=10, attrs={'type': 'link', 'disabled': False}, id='ebb/eb01/eb01-1|ebb/eb01/eb01-2|MJfZW6JTRSubtfpacP_cZw'),\n", - " Link(source='ebb/eb01/eb01-1', target='ebb/eb01/eb01-3', capacity=3200, cost=10, attrs={'type': 'link', 'disabled': False}, id='ebb/eb01/eb01-1|ebb/eb01/eb01-3|EZFmY2k4R_SRa1M2E4pYoQ'),\n", - " Link(source='ebb/eb01/eb01-1', target='ebb/eb01/eb01-4', capacity=3200, cost=10, attrs={'type': 'link', 'disabled': False}, id='ebb/eb01/eb01-1|ebb/eb01/eb01-4|vyH96mBPRbCAaB4pBGDLjQ')]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "network.find_links(\".*\", \".*/eb01/.*-1$\", any_direction=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, "outputs": [ { "data": { @@ -492,7 +405,7 @@ "{('.*/fsw.*', '.*/eb.*'): 819200.0}" ] }, - "execution_count": 7, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -508,258 +421,249 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " 6761619 function calls (6746212 primitive calls) in 2.001 seconds\n", + " 6761460 function calls (6746059 primitive calls) in 1.968 seconds\n", "\n", " Ordered by: internal time\n", "\n", " ncalls tottime percall cumtime percall filename:lineno(function)\n", - " 339840 0.353 0.000 1.057 0.000 /Users/networmix/ws/NetGraph/ngraph/lib/graph.py:143(add_edge)\n", - " 339840 0.223 0.000 0.239 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/coreviews.py:81(__getitem__)\n", - " 339840 0.207 0.000 0.289 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/multidigraph.py:417(add_edge)\n", - " 1 0.195 0.195 0.215 0.215 /Users/networmix/ws/NetGraph/ngraph/lib/algorithms/spf.py:94(_spf_fast_all_min_cost_with_cap_remaining_dijkstra)\n", - " 1 0.141 0.141 1.128 1.128 /Users/networmix/ws/NetGraph/ngraph/network.py:131(to_strict_multidigraph)\n", - " 1 0.131 0.131 0.152 0.152 /Users/networmix/ws/NetGraph/ngraph/lib/algorithms/calc_capacity.py:10(_init_graph_data)\n", - " 1 0.130 0.130 0.180 0.180 /Users/networmix/ws/NetGraph/ngraph/lib/algorithms/flow_init.py:6(init_flow_graph)\n", - " 1 0.057 0.057 0.273 0.273 /Users/networmix/ws/NetGraph/ngraph/lib/algorithms/calc_capacity.py:294(calc_graph_capacity)\n", - " 339840 0.053 0.000 0.069 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/coreviews.py:103(__getitem__)\n", - " 725446 0.051 0.000 0.051 0.000 {method 'setdefault' of 'dict' objects}\n", - " 1 0.048 0.048 1.908 1.908 /Users/networmix/ws/NetGraph/ngraph/network.py:219(max_flow)\n", - " 685700 0.041 0.000 0.041 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/graph.py:462(__contains__)\n", - " 339840 0.037 0.000 0.105 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/graph.py:498(__getitem__)\n", + " 339840 0.356 0.000 1.061 0.000 /Users/networmix/ws/NetGraph/ngraph/lib/graph.py:143(add_edge)\n", + " 339840 0.226 0.000 0.242 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/coreviews.py:81(__getitem__)\n", + " 1 0.209 0.209 0.231 0.231 /Users/networmix/ws/NetGraph/ngraph/lib/algorithms/spf.py:94(_spf_fast_all_min_cost_with_cap_remaining_dijkstra)\n", + " 339840 0.209 0.000 0.290 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/multidigraph.py:417(add_edge)\n", + " 1 0.151 0.151 0.175 0.175 /Users/networmix/ws/NetGraph/ngraph/lib/algorithms/calc_capacity.py:10(_init_graph_data)\n", + " 1 0.137 0.137 1.128 1.128 /Users/networmix/ws/NetGraph/ngraph/network.py:131(to_strict_multidigraph)\n", + " 1 0.129 0.129 0.179 0.179 /Users/networmix/ws/NetGraph/ngraph/lib/algorithms/flow_init.py:6(init_flow_graph)\n", + " 339840 0.052 0.000 0.067 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/coreviews.py:103(__getitem__)\n", + " 1 0.052 0.052 0.285 0.285 /Users/networmix/ws/NetGraph/ngraph/lib/algorithms/calc_capacity.py:294(calc_graph_capacity)\n", + " 725446 0.050 0.000 0.050 0.000 {method 'setdefault' of 'dict' objects}\n", + " 685700 0.040 0.000 0.040 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/graph.py:462(__contains__)\n", + " 339840 0.037 0.000 0.104 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/graph.py:498(__getitem__)\n", " 345859 0.033 0.000 0.033 0.000 {method 'update' of 'dict' objects}\n", - " 345858 0.033 0.000 0.048 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/utils/misc.py:595(_clear_cache)\n", + " 345858 0.032 0.000 0.047 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/utils/misc.py:595(_clear_cache)\n", " 679681 0.030 0.000 0.030 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/coreviews.py:44(__init__)\n", - " 15393/1 0.028 0.000 0.034 0.034 /Users/networmix/ws/NetGraph/ngraph/lib/algorithms/calc_capacity.py:178(_push_flow_dfs)\n", - " 1 0.022 0.022 0.305 0.305 /Users/networmix/ws/NetGraph/ngraph/lib/algorithms/place_flow.py:29(place_flow_on_graph)\n", - " 279550 0.019 0.000 0.019 0.000 {method 'get' of 'dict' objects}\n", + " 15393/1 0.028 0.000 0.033 0.033 /Users/networmix/ws/NetGraph/ngraph/lib/algorithms/calc_capacity.py:178(_push_flow_dfs)\n", + " 1 0.021 0.021 0.318 0.318 /Users/networmix/ws/NetGraph/ngraph/lib/algorithms/place_flow.py:29(place_flow_on_graph)\n", + " 279548 0.019 0.000 0.019 0.000 {method 'get' of 'dict' objects}\n", " 373200 0.018 0.000 0.018 0.000 {method 'items' of 'dict' objects}\n", - " 341568 0.018 0.000 0.018 0.000 {built-in method builtins.abs}\n", - " 339840 0.016 0.000 0.016 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/coreviews.py:53(__getitem__)\n", - " 345867 0.015 0.000 0.015 0.000 {built-in method builtins.getattr}\n", - " 1 0.012 0.012 0.025 0.025 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/decorator.py:229(fun)\n", - " 2 0.011 0.005 0.012 0.006 /Users/networmix/ws/NetGraph/ngraph/lib/algorithms/calc_capacity.py:148(_set_levels_bfs)\n", - " 182336 0.011 0.000 0.015 0.000 {built-in method builtins.sum}\n", - " 177734 0.009 0.000 0.009 0.000 {method 'append' of 'list' objects}\n", + " 339840 0.015 0.000 0.015 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/coreviews.py:53(__getitem__)\n", + " 345866 0.015 0.000 0.015 0.000 {built-in method builtins.getattr}\n", + " 341568 0.013 0.000 0.013 0.000 {built-in method builtins.abs}\n", + " 182336 0.011 0.000 0.016 0.000 {built-in method builtins.sum}\n", + " 2 0.011 0.006 0.012 0.006 /Users/networmix/ws/NetGraph/ngraph/lib/algorithms/calc_capacity.py:148(_set_levels_bfs)\n", + " 177732 0.010 0.000 0.010 0.000 {method 'append' of 'list' objects}\n", + " 1 0.006 0.006 0.036 0.036 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/sugar/socket.py:709(send_multipart)\n", " 24128 0.005 0.000 0.005 0.000 /Users/networmix/ws/NetGraph/ngraph/lib/algorithms/place_flow.py:104()\n", - " 1 0.005 0.005 1.861 1.861 /Users/networmix/ws/NetGraph/ngraph/network.py:291(_compute_flow_single_group)\n", - " 2 0.004 0.002 0.025 0.013 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/sugar/socket.py:709(send_multipart)\n", + " 1 0.005 0.005 1.894 1.894 /Users/networmix/ws/NetGraph/ngraph/network.py:291(_compute_flow_single_group)\n", " 3872 0.004 0.000 0.004 0.000 {built-in method posix.urandom}\n", " 3872 0.003 0.000 0.004 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/uuid.py:142(__init__)\n", - " 6018 0.003 0.000 0.004 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/digraph.py:439(add_node)\n", - " 41412 0.003 0.000 0.003 0.000 {method 'add' of 'set' objects}\n", " 6018 0.003 0.000 0.003 0.000 {built-in method _heapq.heappop}\n", - " 6018 0.002 0.000 0.007 0.000 /Users/networmix/ws/NetGraph/ngraph/lib/graph.py:104(add_node)\n", - " 1 0.002 0.002 0.012 0.012 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py:418(flush)\n", - " 1 0.002 0.002 0.702 0.702 /Users/networmix/ws/NetGraph/ngraph/lib/algorithms/max_flow.py:8(calc_max_flow)\n", + " 41412 0.003 0.000 0.003 0.000 {method 'add' of 'set' objects}\n", + " 1 0.003 0.003 0.020 0.020 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/IPython/core/history.py:845(writeout_cache)\n", + " 6018 0.003 0.000 0.004 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/digraph.py:439(add_node)\n", + " 1 0.003 0.003 0.069 0.069 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/ipykernel/iostream.py:278(_really_send)\n", " 1746 0.002 0.000 0.004 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/ipykernel/ipkernel.py:775(_clean_thread_parent_frames)\n", - " 14 0.002 0.000 0.013 0.001 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/sugar/socket.py:632(send)\n", - " 2/1 0.002 0.001 0.006 0.006 {method 'control' of 'select.kqueue' objects}\n", + " 6018 0.002 0.000 0.007 0.000 /Users/networmix/ws/NetGraph/ngraph/lib/graph.py:104(add_node)\n", + " 1 0.002 0.002 0.729 0.729 /Users/networmix/ws/NetGraph/ngraph/lib/algorithms/max_flow.py:8(calc_max_flow)\n", " 2 0.002 0.001 0.004 0.002 /Users/networmix/ws/NetGraph/ngraph/network.py:188(select_node_groups_by_path)\n", " 3872 0.002 0.000 0.014 0.000 /Users/networmix/ws/NetGraph/ngraph/lib/graph.py:11(new_base64_uuid)\n", - " 2 0.001 0.001 0.069 0.034 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/ipykernel/iostream.py:276()\n", " 12032 0.001 0.000 0.001 0.000 {method 'match' of 're.Pattern' objects}\n", " 3872 0.001 0.000 0.009 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/uuid.py:710(uuid4)\n", - " 1 0.001 0.001 0.006 0.006 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/base_events.py:871(call_soon_threadsafe)\n", - " 3/2 0.001 0.000 1.985 0.992 {built-in method builtins.exec}\n", + " 2/1 0.001 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/base_events.py:1953(_run_once)\n", + " 2 0.001 0.000 0.001 0.000 /Users/networmix/ws/NetGraph/ngraph/lib/graph.py:254(get_nodes)\n", + " 873 0.001 0.000 0.001 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/threading.py:1477(enumerate)\n", " 3872 0.001 0.000 0.002 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/base64.py:112(urlsafe_b64encode)\n", " 15393 0.001 0.000 0.001 0.000 {built-in method builtins.min}\n", - " 12078 0.001 0.000 0.001 0.000 {method 'popleft' of 'collections.deque' objects}\n", - " 873 0.001 0.000 0.001 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/threading.py:1477(enumerate)\n", - " 2 0.001 0.000 0.001 0.000 /Users/networmix/ws/NetGraph/ngraph/lib/graph.py:254(get_nodes)\n", - " 12075 0.001 0.000 0.001 0.000 {method 'append' of 'collections.deque' objects}\n", + " 12075 0.001 0.000 0.001 0.000 {method 'popleft' of 'collections.deque' objects}\n", + " 12073 0.001 0.000 0.001 0.000 {method 'append' of 'collections.deque' objects}\n", " 6111 0.001 0.000 0.001 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/threading.py:1110(ident)\n", - " 3872 0.000 0.000 0.001 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/uuid.py:288(bytes)\n", " 3872 0.000 0.000 0.014 0.000 /Users/networmix/ws/NetGraph/ngraph/lib/graph.py:64(new_edge_key)\n", + " 3872 0.000 0.000 0.001 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/uuid.py:288(bytes)\n", " 6017 0.000 0.000 0.000 0.000 {built-in method _heapq.heappush}\n", " 3872 0.000 0.000 0.001 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/base64.py:51(b64encode)\n", - "5773/5769 0.000 0.000 0.000 0.000 {built-in method builtins.isinstance}\n", - " 3872 0.000 0.000 0.000 0.000 {method 'translate' of 'bytes' objects}\n", - " 3872 0.000 0.000 0.000 0.000 {method 'count' of 'list' objects}\n", + "5736/5732 0.000 0.000 0.000 0.000 {built-in method builtins.isinstance}\n", " 3872 0.000 0.000 0.000 0.000 {method 'to_bytes' of 'int' objects}\n", + " 3872 0.000 0.000 0.000 0.000 {method 'count' of 'list' objects}\n", + " 3872 0.000 0.000 0.000 0.000 {method 'translate' of 'bytes' objects}\n", " 3872 0.000 0.000 0.000 0.000 {method 'decode' of 'bytes' objects}\n", " 3872 0.000 0.000 0.000 0.000 {built-in method from_bytes}\n", " 3872 0.000 0.000 0.000 0.000 {built-in method binascii.b2a_base64}\n", " 3494 0.000 0.000 0.000 0.000 {method 'keys' of 'dict' objects}\n", - " 3890 0.000 0.000 0.000 0.000 {built-in method builtins.len}\n", + " 3886 0.000 0.000 0.000 0.000 {built-in method builtins.len}\n", " 3872 0.000 0.000 0.000 0.000 {method 'groups' of 're.Match' objects}\n", " 1752 0.000 0.000 0.000 0.000 {method 'values' of 'dict' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/sugar/attrsettr.py:66(_get_attr_opt)\n", - " 2/1 0.000 0.000 1.984 1.984 /var/folders/xh/83kdwyfd0fv66b04mchbfzcc0000gn/T/ipykernel_31684/1424787899.py:1()\n", + " 11 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/sugar/socket.py:632(send)\n", " 874 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.RLock' objects}\n", + " 4 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/sugar/attrsettr.py:66(_get_attr_opt)\n", " 2 0.000 0.000 0.000 0.000 {built-in method builtins.compile}\n", - " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n", - " 5/2 0.000 0.000 0.069 0.035 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/events.py:87(_run)\n", - " 72 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/enum.py:1585(_get_value)\n", - " 16 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/enum.py:1592(__or__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/sugar/attrsettr.py:43(__getattr__)\n", " 1 0.000 0.000 0.000 0.000 {method 'execute' of 'sqlite3.Connection' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/sugar/socket.py:780(recv_multipart)\n", - " 31 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/enum.py:695(__call__)\n", + " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n", + " 1 0.000 0.000 0.020 0.020 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/decorator.py:229(fun)\n", + " 12 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/enum.py:1592(__or__)\n", + " 54 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/enum.py:1585(_get_value)\n", + " 2/1 0.000 0.000 0.000 0.000 {method 'control' of 'select.kqueue' objects}\n", + " 23 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/enum.py:695(__call__)\n", + " 4 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/sugar/attrsettr.py:43(__getattr__)\n", " 2 0.000 0.000 0.000 0.000 {method 'recv' of '_socket.socket' objects}\n", - " 3 0.000 0.000 0.151 0.050 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/base_events.py:1953(_run_once)\n", - " 3/2 0.000 0.000 1.989 0.994 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/IPython/core/interactiveshell.py:3543(run_code)\n", - " 5/2 0.000 0.000 0.069 0.035 {method 'run' of '_contextvars.Context' objects}\n", - " 8 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/enum.py:1603(__and__)\n", - " 31 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/enum.py:1152(__new__)\n", - " 2 0.000 0.000 0.063 0.031 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/ipykernel/iostream.py:278(_really_send)\n", " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/inspect.py:3120(_bind)\n", - " 2 0.000 0.000 0.069 0.035 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py:574(_handle_events)\n", - " 10 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:676(__get__)\n", - " 6 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/typing.py:426(inner)\n", - " 1 0.000 0.000 0.000 0.000 {method 'send' of '_socket.socket' objects}\n", - " 2 0.000 0.000 0.000 0.000 {method '__exit__' of 'sqlite3.Connection' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/queues.py:225(get)\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/IPython/core/history.py:845(writeout_cache)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/ipykernel/kernelbase.py:302(poll_control_queue)\n", + " 23 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/enum.py:1152(__new__)\n", " 3 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py:654(_rebuild_io_state)\n", - " 2 0.000 0.000 0.069 0.034 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py:547(_run_callback)\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/sugar/poll.py:80(poll)\n", - " 1 0.000 0.000 0.006 0.006 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/ipykernel/kernelbase.py:302(poll_control_queue)\n", - " 3 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/base_events.py:847(_call_soon)\n", - " 2 0.000 0.000 0.069 0.034 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/ipykernel/iostream.py:157(_handle_event)\n", - " 5 0.000 0.000 0.000 0.000 :1390(_handle_fromlist)\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/platform/asyncio.py:225(add_callback)\n", - " 10 0.000 0.000 0.000 0.000 {built-in method builtins.hasattr}\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/sugar/socket.py:780(recv_multipart)\n", + " 6 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/enum.py:1603(__and__)\n", + " 2 0.000 0.000 0.000 0.000 {method '__exit__' of 'sqlite3.Connection' objects}\n", + " 8 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:676(__get__)\n", + " 2/1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/selectors.py:540(select)\n", " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/digraph.py:334(__init__)\n", + " 3 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/queue.py:115(empty)\n", + " 1 0.000 0.000 0.000 0.000 {method 'send' of '_socket.socket' objects}\n", " 3 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py:677(_update_handler)\n", - " 4 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/queue.py:115(empty)\n", - " 10 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:629(get)\n", - " 1 0.000 0.000 0.215 0.215 /Users/networmix/ws/NetGraph/ngraph/lib/algorithms/spf.py:159(spf)\n", - " 1 0.000 0.000 0.006 0.006 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/futures.py:391(_call_set_state)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/IPython/core/history.py:833(_writeout_input_cache)\n", + " 8 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:629(get)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/platform/asyncio.py:225(add_callback)\n", + " 3 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/base_events.py:847(_call_soon)\n", " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/codeop.py:113(__call__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/decorator.py:199(fix)\n", - " 2/1 0.000 0.000 0.006 0.006 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/selectors.py:540(select)\n", - " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/typing.py:1665(__subclasscheck__)\n", + " 10 0.000 0.000 0.000 0.000 {built-in method builtins.next}\n", " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/functools.py:1023(__get__)\n", + " 3 0.000 0.000 0.000 0.000 {method 'run' of '_contextvars.Context' objects}\n", + " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/typing.py:1665(__subclasscheck__)\n", + " 1 0.000 0.000 0.231 0.231 /Users/networmix/ws/NetGraph/ngraph/lib/algorithms/spf.py:159(spf)\n", + " 3 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/typing.py:426(inner)\n", " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/queues.py:209(put_nowait)\n", - " 5 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/base_events.py:767(time)\n", - " 2 0.000 0.000 0.069 0.034 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py:615(_handle_recv)\n", + " 4 0.000 0.000 0.000 0.000 :1390(_handle_fromlist)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/queues.py:225(get)\n", + " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/inspect.py:3259(bind)\n", + " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/concurrent/futures/_base.py:537(set_result)\n", + " 3 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/events.py:36(__init__)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/decorator.py:199(fix)\n", + " 4 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects}\n", " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/selector_events.py:129(_read_from_self)\n", " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:3631(set)\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/queues.py:186(put)\n", - " 3 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/threading.py:303(__enter__)\n", - " 10 0.000 0.000 0.000 0.000 {built-in method builtins.next}\n", - " 3 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/events.py:36(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:718(_validate)\n", - " 2 0.000 0.000 0.013 0.006 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/ioloop.py:742(_run_callback)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph/lib/graph.py:49(__init__)\n", + " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/re/__init__.py:330(_compile)\n", + " 9 0.000 0.000 0.000 0.000 {built-in method builtins.hasattr}\n", + " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/contextlib.py:108(__init__)\n", + " 3 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/events.py:87(_run)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:1527(_notify_observers)\n", + " 3 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/base_events.py:767(time)\n", " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:689(set)\n", - " 4 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:708(__set__)\n", - " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/inspect.py:3259(bind)\n", " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:3474(validate)\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:1527(_notify_observers)\n", - " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:727(_cross_validate)\n", - " 1 0.000 0.000 0.006 0.006 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/concurrent/futures/_base.py:337(_invoke_callbacks)\n", - " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/inspect.py:2934(apply_defaults)\n", - " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/contextlib.py:108(__init__)\n", + " 2 0.000 0.000 0.000 0.000 {built-in method _abc._abc_subclasscheck}\n", + " 3 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/threading.py:303(__enter__)\n", " 3 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/reportviews.py:207(__call__)\n", - " 1 0.000 0.000 0.012 0.012 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/ipykernel/kernelbase.py:324(_flush)\n", - " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/reportviews.py:333(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/queues.py:256(get_nowait)\n", - " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/queues.py:322(_consume_expired)\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph/lib/graph.py:49(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/threading.py:315(_acquire_restore)\n", - " 4 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/selector_events.py:740(_process_events)\n", + " 1 0.000 0.000 0.000 0.000 :2(__init__)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py:615(_handle_recv)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/queues.py:186(put)\n", + " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/inspect.py:2934(apply_defaults)\n", + " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:718(_validate)\n", + " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/typing.py:1443(__hash__)\n", + " 1 0.000 0.000 0.000 0.000 /var/folders/xh/83kdwyfd0fv66b04mchbfzcc0000gn/T/ipykernel_88989/1424787899.py:1()\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/ipykernel/iostream.py:213(_is_master_process)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py:574(_handle_events)\n", + " 2 0.000 0.000 0.000 0.000 :121(__subclasscheck__)\n", + " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/contextlib.py:303(helper)\n", + " 3 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/queue.py:267(_qsize)\n", + " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/base_events.py:818(call_soon)\n", + " 4 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/IPython/core/compilerop.py:180(extra_flags)\n", + " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/re/__init__.py:287(compile)\n", + " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/typing.py:1374(__instancecheck__)\n", + " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/contextlib.py:145(__exit__)\n", + " 3 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py:533(sending)\n", + " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:727(_cross_validate)\n", " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:3624(validate_elements)\n", - " 4 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/typing.py:1443(__hash__)\n", + " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/threading.py:315(_acquire_restore)\n", + " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/futures.py:391(_call_set_state)\n", + " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:708(__set__)\n", " 5 0.000 0.000 0.000 0.000 {built-in method builtins.iter}\n", - " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/typing.py:1374(__instancecheck__)\n", - " 2 0.000 0.000 0.000 0.000 {method 'set_result' of '_asyncio.Future' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/graph.py:745(nodes)\n", - " 4 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py:533(sending)\n", - " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/base_events.py:818(call_soon)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _abc._abc_subclasscheck}\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/concurrent.py:182(future_set_result_unless_cancelled)\n", - " 32 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/typing.py:2367(cast)\n", + " 1 0.000 0.000 0.069 0.069 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/ipykernel/iostream.py:276()\n", + " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:2304(validate)\n", " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/threading.py:428(notify_all)\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:1512(_notify_trait)\n", - " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/base_events.py:1938(_add_callback)\n", - " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/re/__init__.py:330(_compile)\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/IPython/core/history.py:839(_writeout_output_cache)\n", - " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/inspect.py:2881(args)\n", + " 1/0 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/IPython/core/interactiveshell.py:3543(run_code)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/multidigraph.py:302(__init__)\n", " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:1523(notify_change)\n", - " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:2304(validate)\n", - " 2 0.000 0.000 0.000 0.000 :121(__subclasscheck__)\n", - " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/re/__init__.py:287(compile)\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/IPython/core/history.py:833(_writeout_input_cache)\n", - " 1 0.000 0.000 0.006 0.006 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/IPython/core/history.py:55(only_when_enabled)\n", - " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/contextlib.py:303(helper)\n", - " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/ipykernel/iostream.py:213(_is_master_process)\n", - " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/contextlib.py:145(__exit__)\n", - " 1 0.000 0.000 0.006 0.006 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/concurrent/futures/_base.py:537(set_result)\n", - " 3 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/threading.py:306(__exit__)\n", - " 5 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects}\n", " 2 0.000 0.000 0.000 0.000 {built-in method builtins.issubclass}\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/queues.py:317(__put_internal)\n", - " 8 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.lock' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/IPython/core/compilerop.py:180(extra_flags)\n", - " 4 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/queue.py:267(_qsize)\n", - " 1 0.000 0.000 0.000 0.000 :2(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/multidigraph.py:302(__init__)\n", + " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/inspect.py:2881(args)\n", + " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/reportviews.py:333(__iter__)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/IPython/core/history.py:839(_writeout_output_cache)\n", " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/contextlib.py:136(__enter__)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method builtins.sorted}\n", - " 10 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/inspect.py:2791(kind)\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py:459(update_flag)\n", - " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/threading.py:398(notify)\n", - " 5 0.000 0.000 0.000 0.000 {built-in method time.monotonic}\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/multidigraph.py:365(adj)\n", " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/threading.py:312(_release_save)\n", " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/graph.py:63(__set__)\n", - " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/threading.py:631(clear)\n", - " 1 0.000 0.000 0.069 0.069 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/platform/asyncio.py:200(_handle_events)\n", - " 1 0.000 0.000 0.000 0.000 {method 'values' of 'mappingproxy' objects}\n", + " 1/0 0.000 0.000 0.000 {built-in method builtins.exec}\n", + " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/queues.py:322(_consume_expired)\n", + " 2 0.000 0.000 0.000 0.000 {built-in method builtins.sorted}\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/graph.py:745(nodes)\n", + " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/base_events.py:871(call_soon_threadsafe)\n", + " 3 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/threading.py:306(__exit__)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/queues.py:256(get_nowait)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:1512(_notify_trait)\n", + " 1 0.000 0.000 0.020 0.020 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/IPython/core/history.py:55(only_when_enabled)\n", + " 2 0.000 0.000 0.000 0.000 {method 'set_result' of '_asyncio.Future' objects}\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/reportviews.py:187(__iter__)\n", + " 27 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/typing.py:2367(cast)\n", + " 4 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects}\n", " 4 0.000 0.000 0.000 0.000 {built-in method builtins.max}\n", - " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/ipykernel/iostream.py:216(_check_mp_mode)\n", - " 3 0.000 0.000 0.000 0.000 {method 'acquire' of '_thread.lock' objects}\n", - " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/inspect.py:2904(kwargs)\n", - " 5 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py:529(receiving)\n", + " 2 0.000 0.000 0.000 0.000 {built-in method _contextvars.copy_context}\n", + " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/concurrent/futures/_base.py:337(_invoke_callbacks)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/reportviews.py:180(__init__)\n", " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/selector_events.py:141(_write_to_self)\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/reportviews.py:187(__iter__)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method builtins.hash}\n", - " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:3486(validate_elements)\n", + " 7 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.lock' objects}\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/multidigraph.py:365(adj)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/ioloop.py:742(_run_callback)\n", + " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/threading.py:398(notify)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/queues.py:317(__put_internal)\n", + " 3 0.000 0.000 0.000 0.000 {method 'acquire' of '_thread.lock' objects}\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py:547(_run_callback)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/concurrent.py:182(future_set_result_unless_cancelled)\n", " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/IPython/core/interactiveshell.py:3495(compare)\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/queues.py:173(qsize)\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/reportviews.py:180(__init__)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _contextvars.copy_context}\n", " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/digraph.py:41(__set__)\n", + " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/threading.py:631(clear)\n", + " 1 0.000 0.000 0.000 0.000 {method 'values' of 'mappingproxy' objects}\n", + " 3 0.000 0.000 0.000 0.000 {built-in method time.monotonic}\n", + " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/inspect.py:2904(kwargs)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/ipykernel/iostream.py:157(_handle_event)\n", + " 10 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/inspect.py:2791(kind)\n", + " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/traitlets/traitlets.py:3486(validate_elements)\n", " 3 0.000 0.000 0.000 0.000 {method 'items' of 'mappingproxy' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/sugar/poll.py:31(register)\n", + " 1 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.RLock' objects}\n", + " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/IPython/core/interactiveshell.py:1277(user_global_ns)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/ipykernel/iostream.py:216(_check_mp_mode)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/queues.py:173(qsize)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/queues.py:312(_put)\n", " 1 0.000 0.000 0.000 0.000 {built-in method _asyncio.get_running_loop}\n", - " 5 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/base_events.py:2051(get_debug)\n", " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/unix_events.py:83(_process_self_data)\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/queues.py:312(_put)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method posix.getpid}\n", - " 4 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/inspect.py:2779(name)\n", " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py:685()\n", + " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/threading.py:318(_is_owned)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/queues.py:177(empty)\n", + " 5 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/base_events.py:2051(get_debug)\n", + " 4 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/inspect.py:3074(parameters)\n", + " 2 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}\n", + " 2 0.000 0.000 0.000 0.000 {built-in method builtins.hash}\n", + " 3 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/base_events.py:549(_check_closed)\n", + " 4 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py:529(receiving)\n", + " 3 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph/lib/graph.py:263(get_edges)\n", " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/digraph.py:78(__set__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'done' of '_asyncio.Future' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/IPython/core/interactiveshell.py:1277(user_global_ns)\n", + " 1 0.000 0.000 0.000 0.000 {built-in method posix.getpid}\n", + " 2 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/selector_events.py:740(_process_events)\n", " 2 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.lock' objects}\n", + " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/reportviews.py:315(__init__)\n", + " 4 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/inspect.py:2779(name)\n", " 2 0.000 0.000 0.000 0.000 {method 'cancelled' of '_asyncio.Future' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/queues.py:309(_get)\n", - " 2 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/inspect.py:3074(parameters)\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/queues.py:177(empty)\n", - " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/ipykernel/iostream.py:255(closed)\n", + " 1 0.000 0.000 0.000 0.000 {method 'done' of '_asyncio.Future' objects}\n", " 1 0.000 0.000 0.000 0.000 {built-in method _thread.allocate_lock}\n", - " 1 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.RLock' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/queues.py:59(_set_timeout)\n", - " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/threading.py:318(_is_owned)\n", - " 3 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph/lib/graph.py:263(get_edges)\n", - " 2 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/networkx/classes/reportviews.py:315(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/base_events.py:549(_check_closed)\n", - " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/inspect.py:2873(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/locks.py:224(clear)\n", - " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/base_events.py:753(is_closed)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/queues.py:309(_get)\n", " 1 0.000 0.000 0.000 0.000 {method 'release' of '_thread.lock' objects}\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/ipykernel/iostream.py:255(closed)\n", + " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/base_events.py:753(is_closed)\n", " 1 0.000 0.000 0.000 0.000 {method '_is_owned' of '_thread.RLock' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py:650(_check_closed)\n", + " 1 0.000 0.000 0.000 0.000 /opt/homebrew/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/inspect.py:2873(__init__)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/locks.py:224(clear)\n", + " 1 0.000 0.000 0.000 0.000 /Users/networmix/ws/NetGraph/ngraph-venv/lib/python3.13/site-packages/tornado/queues.py:59(_set_timeout)\n", "\n", "\n" ] @@ -767,10 +671,10 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 8, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -796,6 +700,3415 @@ "stats.sort_stats(pstats.SortKey.TIME).print_stats()" ] }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "explorer = NetworkExplorer.explore_network(network, scenario.components_library)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "- root | Nodes=6016, Links=167984, Cost=0.0, Power=10472000.0 | IntLinkCap=35072000.0, ExtLinkCap=0.0\n", + " - dc1 | Nodes=1056, Links=32256, Cost=0.0, Power=1848000.0 | IntLinkCap=5529600.0, ExtLinkCap=921600.0\n", + " -> External to [fa/fa1/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa10/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa11/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa12/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa13/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa14/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa15/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa16/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa2/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa3/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa4/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa5/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa6/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa7/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa8/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa9/fadu]: 288 links, cap=57600.0\n", + " - plane1 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc1/plane1/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc1/plane1/ssw]: 3456 links, cap=691200.0\n", + " - plane2 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc1/plane2/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc1/plane2/ssw]: 3456 links, cap=691200.0\n", + " - plane3 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc1/plane3/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc1/plane3/ssw]: 3456 links, cap=691200.0\n", + " - plane4 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc1/plane4/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc1/plane4/ssw]: 3456 links, cap=691200.0\n", + " - plane5 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc1/plane5/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc1/plane5/ssw]: 3456 links, cap=691200.0\n", + " - plane6 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc1/plane6/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc1/plane6/ssw]: 3456 links, cap=691200.0\n", + " - plane7 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc1/plane7/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc1/plane7/ssw]: 3456 links, cap=691200.0\n", + " - plane8 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc1/plane8/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc1/plane8/ssw]: 3456 links, cap=691200.0\n", + " - dc2 | Nodes=1056, Links=32256, Cost=0.0, Power=1848000.0 | IntLinkCap=5529600.0, ExtLinkCap=921600.0\n", + " -> External to [fa/fa1/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa10/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa11/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa12/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa13/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa14/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa15/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa16/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa2/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa3/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa4/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa5/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa6/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa7/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa8/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa9/fadu]: 288 links, cap=57600.0\n", + " - plane1 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc2/plane1/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc2/plane1/ssw]: 3456 links, cap=691200.0\n", + " - plane2 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc2/plane2/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc2/plane2/ssw]: 3456 links, cap=691200.0\n", + " - plane3 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc2/plane3/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc2/plane3/ssw]: 3456 links, cap=691200.0\n", + " - plane4 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc2/plane4/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc2/plane4/ssw]: 3456 links, cap=691200.0\n", + " - plane5 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc2/plane5/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc2/plane5/ssw]: 3456 links, cap=691200.0\n", + " - plane6 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc2/plane6/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc2/plane6/ssw]: 3456 links, cap=691200.0\n", + " - plane7 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc2/plane7/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc2/plane7/ssw]: 3456 links, cap=691200.0\n", + " - plane8 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc2/plane8/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc2/plane8/ssw]: 3456 links, cap=691200.0\n", + " - dc3 | Nodes=1056, Links=32256, Cost=0.0, Power=1848000.0 | IntLinkCap=5529600.0, ExtLinkCap=921600.0\n", + " -> External to [fa/fa1/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa10/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa11/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa12/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa13/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa14/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa15/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa16/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa2/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa3/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa4/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa5/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa6/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa7/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa8/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa9/fadu]: 288 links, cap=57600.0\n", + " - plane1 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc3/plane1/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc3/plane1/ssw]: 3456 links, cap=691200.0\n", + " - plane2 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc3/plane2/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc3/plane2/ssw]: 3456 links, cap=691200.0\n", + " - plane3 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc3/plane3/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc3/plane3/ssw]: 3456 links, cap=691200.0\n", + " - plane4 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc3/plane4/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc3/plane4/ssw]: 3456 links, cap=691200.0\n", + " - plane5 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc3/plane5/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc3/plane5/ssw]: 3456 links, cap=691200.0\n", + " - plane6 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc3/plane6/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc3/plane6/ssw]: 3456 links, cap=691200.0\n", + " - plane7 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc3/plane7/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc3/plane7/ssw]: 3456 links, cap=691200.0\n", + " - plane8 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc3/plane8/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc3/plane8/ssw]: 3456 links, cap=691200.0\n", + " - dc5 | Nodes=1056, Links=32256, Cost=0.0, Power=1848000.0 | IntLinkCap=5529600.0, ExtLinkCap=921600.0\n", + " -> External to [fa/fa1/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa10/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa11/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa12/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa13/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa14/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa15/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa16/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa2/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa3/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa4/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa5/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa6/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa7/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa8/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa9/fadu]: 288 links, cap=57600.0\n", + " - plane1 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc5/plane1/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc5/plane1/ssw]: 3456 links, cap=691200.0\n", + " - plane2 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc5/plane2/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc5/plane2/ssw]: 3456 links, cap=691200.0\n", + " - plane3 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc5/plane3/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc5/plane3/ssw]: 3456 links, cap=691200.0\n", + " - plane4 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc5/plane4/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc5/plane4/ssw]: 3456 links, cap=691200.0\n", + " - plane5 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc5/plane5/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc5/plane5/ssw]: 3456 links, cap=691200.0\n", + " - plane6 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc5/plane6/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc5/plane6/ssw]: 3456 links, cap=691200.0\n", + " - plane7 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc5/plane7/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc5/plane7/ssw]: 3456 links, cap=691200.0\n", + " - plane8 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc5/plane8/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc5/plane8/ssw]: 3456 links, cap=691200.0\n", + " - dc6 | Nodes=1056, Links=32256, Cost=0.0, Power=1848000.0 | IntLinkCap=5529600.0, ExtLinkCap=921600.0\n", + " -> External to [fa/fa1/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa10/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa11/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa12/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa13/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa14/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa15/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa16/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa2/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa3/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa4/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa5/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa6/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa7/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa8/fadu]: 288 links, cap=57600.0\n", + " -> External to [fa/fa9/fadu]: 288 links, cap=57600.0\n", + " - plane1 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc6/plane1/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc6/plane1/ssw]: 3456 links, cap=691200.0\n", + " - plane2 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc6/plane2/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc6/plane2/ssw]: 3456 links, cap=691200.0\n", + " - plane3 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc6/plane3/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc6/plane3/ssw]: 3456 links, cap=691200.0\n", + " - plane4 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc6/plane4/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc6/plane4/ssw]: 3456 links, cap=691200.0\n", + " - plane5 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc6/plane5/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc6/plane5/ssw]: 3456 links, cap=691200.0\n", + " - plane6 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc6/plane6/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc6/plane6/ssw]: 3456 links, cap=691200.0\n", + " - plane7 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc6/plane7/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc6/plane7/ssw]: 3456 links, cap=691200.0\n", + " - plane8 | Nodes=132, Links=4032, Cost=0.0, Power=231000.0 | IntLinkCap=691200.0, ExtLinkCap=115200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - ssw | Nodes=36, Links=4032, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=806400.0\n", + " -> External to [dc6/plane8/fsw]: 3456 links, cap=691200.0\n", + " -> External to [fa/fa1/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fadu]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fadu]: 36 links, cap=7200.0\n", + " - fsw | Nodes=96, Links=3456, Cost=0.0, Power=168000.0 | IntLinkCap=0.0, ExtLinkCap=691200.0\n", + " -> External to [dc6/plane8/ssw]: 3456 links, cap=691200.0\n", + " - fa | Nodes=704, Links=29696, Cost=0.0, Power=1232000.0 | IntLinkCap=1843200.0, ExtLinkCap=5427200.0\n", + " -> External to [dc1/plane1/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc1/plane2/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc1/plane3/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc1/plane4/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc1/plane5/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc1/plane6/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc1/plane7/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc1/plane8/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc2/plane1/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc2/plane2/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc2/plane3/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc2/plane4/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc2/plane5/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc2/plane6/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc2/plane7/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc2/plane8/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc3/plane1/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc3/plane2/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc3/plane3/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc3/plane4/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc3/plane5/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc3/plane6/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc3/plane7/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc3/plane8/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc5/plane1/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc5/plane2/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc5/plane3/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc5/plane4/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc5/plane5/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc5/plane6/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc5/plane7/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc5/plane8/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc6/plane1/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc6/plane2/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc6/plane3/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc6/plane4/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc6/plane5/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc6/plane6/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc6/plane7/ssw]: 576 links, cap=115200.0\n", + " -> External to [dc6/plane8/ssw]: 576 links, cap=115200.0\n", + " -> External to [ebb/eb01]: 256 links, cap=102400.0\n", + " -> External to [ebb/eb02]: 256 links, cap=102400.0\n", + " -> External to [ebb/eb03]: 256 links, cap=102400.0\n", + " -> External to [ebb/eb04]: 256 links, cap=102400.0\n", + " -> External to [ebb/eb05]: 256 links, cap=102400.0\n", + " -> External to [ebb/eb06]: 256 links, cap=102400.0\n", + " -> External to [ebb/eb07]: 256 links, cap=102400.0\n", + " -> External to [ebb/eb08]: 256 links, cap=102400.0\n", + " - fa1 | Nodes=44, Links=1856, Cost=0.0, Power=77000.0 | IntLinkCap=115200.0, ExtLinkCap=339200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " - fauu | Nodes=8, Links=416, Cost=0.0, Power=14000.0 | IntLinkCap=0.0, ExtLinkCap=166400.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " -> External to [fa/fa1/fadu]: 288 links, cap=115200.0\n", + " - fadu | Nodes=36, Links=1728, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=403200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [fa/fa1/fauu]: 288 links, cap=115200.0\n", + " - fa2 | Nodes=44, Links=1856, Cost=0.0, Power=77000.0 | IntLinkCap=115200.0, ExtLinkCap=339200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " - fauu | Nodes=8, Links=416, Cost=0.0, Power=14000.0 | IntLinkCap=0.0, ExtLinkCap=166400.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " -> External to [fa/fa2/fadu]: 288 links, cap=115200.0\n", + " - fadu | Nodes=36, Links=1728, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=403200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [fa/fa2/fauu]: 288 links, cap=115200.0\n", + " - fa3 | Nodes=44, Links=1856, Cost=0.0, Power=77000.0 | IntLinkCap=115200.0, ExtLinkCap=339200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " - fauu | Nodes=8, Links=416, Cost=0.0, Power=14000.0 | IntLinkCap=0.0, ExtLinkCap=166400.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " -> External to [fa/fa3/fadu]: 288 links, cap=115200.0\n", + " - fadu | Nodes=36, Links=1728, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=403200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [fa/fa3/fauu]: 288 links, cap=115200.0\n", + " - fa4 | Nodes=44, Links=1856, Cost=0.0, Power=77000.0 | IntLinkCap=115200.0, ExtLinkCap=339200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " - fauu | Nodes=8, Links=416, Cost=0.0, Power=14000.0 | IntLinkCap=0.0, ExtLinkCap=166400.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " -> External to [fa/fa4/fadu]: 288 links, cap=115200.0\n", + " - fadu | Nodes=36, Links=1728, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=403200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [fa/fa4/fauu]: 288 links, cap=115200.0\n", + " - fa5 | Nodes=44, Links=1856, Cost=0.0, Power=77000.0 | IntLinkCap=115200.0, ExtLinkCap=339200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " - fauu | Nodes=8, Links=416, Cost=0.0, Power=14000.0 | IntLinkCap=0.0, ExtLinkCap=166400.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " -> External to [fa/fa5/fadu]: 288 links, cap=115200.0\n", + " - fadu | Nodes=36, Links=1728, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=403200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [fa/fa5/fauu]: 288 links, cap=115200.0\n", + " - fa6 | Nodes=44, Links=1856, Cost=0.0, Power=77000.0 | IntLinkCap=115200.0, ExtLinkCap=339200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " - fauu | Nodes=8, Links=416, Cost=0.0, Power=14000.0 | IntLinkCap=0.0, ExtLinkCap=166400.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " -> External to [fa/fa6/fadu]: 288 links, cap=115200.0\n", + " - fadu | Nodes=36, Links=1728, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=403200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [fa/fa6/fauu]: 288 links, cap=115200.0\n", + " - fa7 | Nodes=44, Links=1856, Cost=0.0, Power=77000.0 | IntLinkCap=115200.0, ExtLinkCap=339200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " - fauu | Nodes=8, Links=416, Cost=0.0, Power=14000.0 | IntLinkCap=0.0, ExtLinkCap=166400.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " -> External to [fa/fa7/fadu]: 288 links, cap=115200.0\n", + " - fadu | Nodes=36, Links=1728, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=403200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [fa/fa7/fauu]: 288 links, cap=115200.0\n", + " - fa8 | Nodes=44, Links=1856, Cost=0.0, Power=77000.0 | IntLinkCap=115200.0, ExtLinkCap=339200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " - fauu | Nodes=8, Links=416, Cost=0.0, Power=14000.0 | IntLinkCap=0.0, ExtLinkCap=166400.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " -> External to [fa/fa8/fadu]: 288 links, cap=115200.0\n", + " - fadu | Nodes=36, Links=1728, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=403200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [fa/fa8/fauu]: 288 links, cap=115200.0\n", + " - fa9 | Nodes=44, Links=1856, Cost=0.0, Power=77000.0 | IntLinkCap=115200.0, ExtLinkCap=339200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " - fauu | Nodes=8, Links=416, Cost=0.0, Power=14000.0 | IntLinkCap=0.0, ExtLinkCap=166400.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " -> External to [fa/fa9/fadu]: 288 links, cap=115200.0\n", + " - fadu | Nodes=36, Links=1728, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=403200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [fa/fa9/fauu]: 288 links, cap=115200.0\n", + " - fa10 | Nodes=44, Links=1856, Cost=0.0, Power=77000.0 | IntLinkCap=115200.0, ExtLinkCap=339200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " - fauu | Nodes=8, Links=416, Cost=0.0, Power=14000.0 | IntLinkCap=0.0, ExtLinkCap=166400.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " -> External to [fa/fa10/fadu]: 288 links, cap=115200.0\n", + " - fadu | Nodes=36, Links=1728, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=403200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [fa/fa10/fauu]: 288 links, cap=115200.0\n", + " - fa11 | Nodes=44, Links=1856, Cost=0.0, Power=77000.0 | IntLinkCap=115200.0, ExtLinkCap=339200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " - fauu | Nodes=8, Links=416, Cost=0.0, Power=14000.0 | IntLinkCap=0.0, ExtLinkCap=166400.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " -> External to [fa/fa11/fadu]: 288 links, cap=115200.0\n", + " - fadu | Nodes=36, Links=1728, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=403200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [fa/fa11/fauu]: 288 links, cap=115200.0\n", + " - fa12 | Nodes=44, Links=1856, Cost=0.0, Power=77000.0 | IntLinkCap=115200.0, ExtLinkCap=339200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " - fauu | Nodes=8, Links=416, Cost=0.0, Power=14000.0 | IntLinkCap=0.0, ExtLinkCap=166400.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " -> External to [fa/fa12/fadu]: 288 links, cap=115200.0\n", + " - fadu | Nodes=36, Links=1728, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=403200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [fa/fa12/fauu]: 288 links, cap=115200.0\n", + " - fa13 | Nodes=44, Links=1856, Cost=0.0, Power=77000.0 | IntLinkCap=115200.0, ExtLinkCap=339200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " - fauu | Nodes=8, Links=416, Cost=0.0, Power=14000.0 | IntLinkCap=0.0, ExtLinkCap=166400.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " -> External to [fa/fa13/fadu]: 288 links, cap=115200.0\n", + " - fadu | Nodes=36, Links=1728, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=403200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [fa/fa13/fauu]: 288 links, cap=115200.0\n", + " - fa14 | Nodes=44, Links=1856, Cost=0.0, Power=77000.0 | IntLinkCap=115200.0, ExtLinkCap=339200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " - fauu | Nodes=8, Links=416, Cost=0.0, Power=14000.0 | IntLinkCap=0.0, ExtLinkCap=166400.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " -> External to [fa/fa14/fadu]: 288 links, cap=115200.0\n", + " - fadu | Nodes=36, Links=1728, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=403200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [fa/fa14/fauu]: 288 links, cap=115200.0\n", + " - fa15 | Nodes=44, Links=1856, Cost=0.0, Power=77000.0 | IntLinkCap=115200.0, ExtLinkCap=339200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " - fauu | Nodes=8, Links=416, Cost=0.0, Power=14000.0 | IntLinkCap=0.0, ExtLinkCap=166400.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " -> External to [fa/fa15/fadu]: 288 links, cap=115200.0\n", + " - fadu | Nodes=36, Links=1728, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=403200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [fa/fa15/fauu]: 288 links, cap=115200.0\n", + " - fa16 | Nodes=44, Links=1856, Cost=0.0, Power=77000.0 | IntLinkCap=115200.0, ExtLinkCap=339200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " - fauu | Nodes=8, Links=416, Cost=0.0, Power=14000.0 | IntLinkCap=0.0, ExtLinkCap=166400.0\n", + " -> External to [ebb/eb01]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb02]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb03]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb04]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb05]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb06]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb07]: 16 links, cap=6400.0\n", + " -> External to [ebb/eb08]: 16 links, cap=6400.0\n", + " -> External to [fa/fa16/fadu]: 288 links, cap=115200.0\n", + " - fadu | Nodes=36, Links=1728, Cost=0.0, Power=63000.0 | IntLinkCap=0.0, ExtLinkCap=403200.0\n", + " -> External to [dc1/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc1/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc2/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc3/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc5/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane1/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane2/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane3/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane4/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane5/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane6/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane7/ssw]: 36 links, cap=7200.0\n", + " -> External to [dc6/plane8/ssw]: 36 links, cap=7200.0\n", + " -> External to [fa/fa16/fauu]: 288 links, cap=115200.0\n", + " - ebb | Nodes=32, Links=2096, Cost=0.0, Power=0.0 | IntLinkCap=153600.0, ExtLinkCap=819200.0\n", + " -> External to [fa/fa1/fauu]: 128 links, cap=51200.0\n", + " -> External to [fa/fa10/fauu]: 128 links, cap=51200.0\n", + " -> External to [fa/fa11/fauu]: 128 links, cap=51200.0\n", + " -> External to [fa/fa12/fauu]: 128 links, cap=51200.0\n", + " -> External to [fa/fa13/fauu]: 128 links, cap=51200.0\n", + " -> External to [fa/fa14/fauu]: 128 links, cap=51200.0\n", + " -> External to [fa/fa15/fauu]: 128 links, cap=51200.0\n", + " -> External to [fa/fa16/fauu]: 128 links, cap=51200.0\n", + " -> External to [fa/fa2/fauu]: 128 links, cap=51200.0\n", + " -> External to [fa/fa3/fauu]: 128 links, cap=51200.0\n", + " -> External to [fa/fa4/fauu]: 128 links, cap=51200.0\n", + " -> External to [fa/fa5/fauu]: 128 links, cap=51200.0\n", + " -> External to [fa/fa6/fauu]: 128 links, cap=51200.0\n", + " -> External to [fa/fa7/fauu]: 128 links, cap=51200.0\n", + " -> External to [fa/fa8/fauu]: 128 links, cap=51200.0\n", + " -> External to [fa/fa9/fauu]: 128 links, cap=51200.0\n", + " - eb01 | Nodes=4, Links=262, Cost=0.0, Power=0.0 | IntLinkCap=19200.0, ExtLinkCap=102400.0\n", + " -> External to [fa/fa1/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa10/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa11/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa12/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa13/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa14/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa15/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa16/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa2/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa3/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa4/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa5/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa6/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa7/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa8/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa9/fauu]: 16 links, cap=6400.0\n", + " - eb02 | Nodes=4, Links=262, Cost=0.0, Power=0.0 | IntLinkCap=19200.0, ExtLinkCap=102400.0\n", + " -> External to [fa/fa1/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa10/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa11/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa12/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa13/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa14/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa15/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa16/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa2/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa3/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa4/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa5/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa6/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa7/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa8/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa9/fauu]: 16 links, cap=6400.0\n", + " - eb03 | Nodes=4, Links=262, Cost=0.0, Power=0.0 | IntLinkCap=19200.0, ExtLinkCap=102400.0\n", + " -> External to [fa/fa1/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa10/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa11/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa12/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa13/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa14/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa15/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa16/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa2/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa3/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa4/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa5/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa6/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa7/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa8/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa9/fauu]: 16 links, cap=6400.0\n", + " - eb04 | Nodes=4, Links=262, Cost=0.0, Power=0.0 | IntLinkCap=19200.0, ExtLinkCap=102400.0\n", + " -> External to [fa/fa1/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa10/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa11/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa12/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa13/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa14/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa15/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa16/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa2/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa3/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa4/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa5/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa6/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa7/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa8/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa9/fauu]: 16 links, cap=6400.0\n", + " - eb05 | Nodes=4, Links=262, Cost=0.0, Power=0.0 | IntLinkCap=19200.0, ExtLinkCap=102400.0\n", + " -> External to [fa/fa1/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa10/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa11/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa12/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa13/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa14/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa15/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa16/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa2/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa3/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa4/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa5/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa6/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa7/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa8/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa9/fauu]: 16 links, cap=6400.0\n", + " - eb06 | Nodes=4, Links=262, Cost=0.0, Power=0.0 | IntLinkCap=19200.0, ExtLinkCap=102400.0\n", + " -> External to [fa/fa1/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa10/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa11/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa12/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa13/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa14/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa15/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa16/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa2/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa3/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa4/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa5/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa6/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa7/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa8/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa9/fauu]: 16 links, cap=6400.0\n", + " - eb07 | Nodes=4, Links=262, Cost=0.0, Power=0.0 | IntLinkCap=19200.0, ExtLinkCap=102400.0\n", + " -> External to [fa/fa1/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa10/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa11/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa12/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa13/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa14/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa15/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa16/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa2/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa3/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa4/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa5/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa6/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa7/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa8/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa9/fauu]: 16 links, cap=6400.0\n", + " - eb08 | Nodes=4, Links=262, Cost=0.0, Power=0.0 | IntLinkCap=19200.0, ExtLinkCap=102400.0\n", + " -> External to [fa/fa1/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa10/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa11/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa12/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa13/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa14/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa15/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa16/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa2/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa3/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa4/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa5/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa6/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa7/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa8/fauu]: 16 links, cap=6400.0\n", + " -> External to [fa/fa9/fauu]: 16 links, cap=6400.0\n" + ] + } + ], + "source": [ + "explorer.print_tree(skip_leaves=True, detailed=True)" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/notebooks/small_demo.ipynb b/notebooks/small_demo.ipynb index 35d734c..ce87051 100644 --- a/notebooks/small_demo.ipynb +++ b/notebooks/small_demo.ipynb @@ -174,8 +174,8 @@ "output_type": "stream", "text": [ "Overall Statistics:\n", - " mean: 212.69\n", - " stdev: 25.50\n", + " mean: 208.79\n", + " stdev: 23.94\n", " min: 178.94\n", " max: 253.71\n" ] @@ -210,13 +210,13 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/folders/xh/83kdwyfd0fv66b04mchbfzcc0000gn/T/ipykernel_31753/4192461833.py:60: UserWarning: No artists with labels found to put in legend. Note that artists whose label start with an underscore are ignored when legend() is called with no argument.\n", + "/var/folders/xh/83kdwyfd0fv66b04mchbfzcc0000gn/T/ipykernel_78882/4192461833.py:60: UserWarning: No artists with labels found to put in legend. Note that artists whose label start with an underscore are ignored when legend() is called with no argument.\n", " plt.legend(title=\"Priority\")\n" ] }, { "data": { - "image/png": "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if1m6YucVCqtRLt2TGZERCVNxrlauRl269YtvZvHVqxYEdu3b890PpMnT5YuHHjdwYMH9V6/8847OHfunNF5PHjwAGXLlkWnTp0yXY4p8fBlAXnzGZhk6HaCgs8FJSIi2UlKSsLNmzcxc+ZMDBkyJMsrQU2Je8oKSMYzMN8MHRqNBnv27EVgYABUKpWZemdeSanpRvYeEhERycO3336LadOmoWXLlgaPfSpIDGUFSPcMTP0SaxQCaiVgY1kKKhXLT0REJDeZHfosaDx8SURERCQDDGVEREREMsBQRkRERCQDDGVEREREMsBQRkRERCQDDGVEREREMsBQRkRERCQDDGVEREREMsBQRkRERAXi9Yd7F3emWFeGMiIiIjKpjMcIJiUlmbknhSdjXfPzCEU+54eIiIhMSqlUwsHBAY8fPwYA2NjYQKFQ5GleWq0WqampePXqFSws5LcvSQiBpKQkPH78GA4ODlAqlXmeF0MZERERmZybmxsASMEsr4QQSE5OhrW1dZ6DXWFwcHCQ1jmvGMqIiIjI5BQKBdzd3VGuXDloNJo8z0ej0eDw4cNo2bJlvg4NFiSVSpWvPWQZGMqIiIiowCiVynwFFqVSibS0NFhZWck2lJmK/A7OEhEREZVADGVEREREMsBQRkRERCQDDGVEREREMsBQRkRERCQDDGVEREREMsBQRkRERCQDDGVEREREMsBQRkRERCQDDGVEREREMsBQRkRERCQDDGVEREREMsBQRkRERCQDDGVEREREMsBQRkRERCQDDGVEREREMsBQRkRERCQDDGVEREREMsBQRkRERCQDDGVEREREMsBQRmaVnJoOIYS5u0FERGR2DGVkVu/MOoRPl0QymBERUYnHUEaFzlqlhE9FB+n1qbsvkKxJN1+HiIiIZIChjAqdQqHA+oGN8U2jNHN3hYiISDYYysgsFAoFLLn1ERERSfizSERERCQDDGVEREREMsBQRkRERCQDDGVEREREMsBQRkRERCQDDGVEREREMmD2ULZw4UJ4e3vDysoKTZs2xYkTJ7Icf968eXjrrbdgbW0NT09PfPHFF3j16lUh9ZaIiIioYJg1lG3cuBEhISGYNGkSzpw5g/r16yMwMBCPHz82Ov66deswfvx4TJo0CVeuXMGyZcuwceNGfPXVV4XccyIiIiLTMmsomzt3LgYNGoT+/fujVq1aWLJkCWxsbLB8+XKj4x87dgzNmzdHz5494e3tjYCAAPTo0SPbvWtEREREclfKXAtOTU3F6dOnERoaKrVZWFjA398fkZGRRqdp1qwZ1qxZgxMnTqBJkya4desWdu3ahT59+mS6nJSUFKSkpEiv4+PjAQAajQYajcZEa5NzGcs0x7Ll5M3112g00ChK3kPJuT3osA46rIMO66DDOugUhzrktO9mC2VPnz5Feno6XF1d9dpdXV1x9epVo9P07NkTT58+xbvvvgshBNLS0jB06NAsD1/OmDEDYWFhBu179+6FjY1N/lYiH8LDw822bDnas2cv1Epz98J8uD3osA46rIMO66DDOugU5TokJSXlaDyzhbK8OHjwIKZPn45FixahadOmuHHjBkaOHImpU6fi66+/NjpNaGgoQkJCpNfx8fHw9PREQEAA7O3tC6vrEo1Gg/DwcLRu3RoqlarQly8XGo0Gf+7+vw9YYGAAbCyL1OZoEtwedFgHHdZBh3XQYR10ikMdMo7SZcdsv4LOzs5QKpWIiYnRa4+JiYGbm5vRab7++mv06dMHAwcOBADUrVsXiYmJGDx4MP773//CwsLwFDm1Wg21Wm3QrlKpzPrmmnv5cqOrR8kLZRm4PeiwDjqsgw7roMM66BTlOuS032Y70d/S0hI+Pj7Yt2+f1KbVarFv3z74+voanSYpKckgeCmVumNeQpS885GIiIio+DDrromQkBD07dsXjRo1QpMmTTBv3jwkJiaif//+AICgoCCUL18eM2bMAAB07NgRc+fORcOGDaXDl19//TU6duwohTMiIiKiosisoaxbt2548uQJJk6ciEePHqFBgwbYvXu3dPL/vXv39PaMTZgwAQqFAhMmTMCDBw/g4uKCjh07Ytq0aeZaBSIiIiKTMPtJPMHBwQgODjY67ODBg3qvS5UqhUmTJmHSpEmF0DMiIiKiwmP2xywREREREUMZERERkSwwlBERERHJAEMZERERkQyY/UR/IgBISk3P0XjWKiUUCkUB94aIiKjwMZSRLDT6JiJn43k5YtNQXwYzIiIqdnj4kszG0gLwqeiQq2lO3X2BZE3O9qoREREVJdxTRmajUADrBzZGWg7+bZCUmp7jvWlERERFEUMZmZVCoYBNCX4QORERUQYeviQiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAYYyIiIiIhlgKCMiIiKSAbOHsoULF8Lb2xtWVlZo2rQpTpw4keX4sbGxGD58ONzd3aFWq1G9enXs2rWrkHpLREREVDBKmXPhGzduREhICJYsWYKmTZti3rx5CAwMxLVr11CuXDmD8VNTU9G6dWuUK1cOv//+O8qXL4+7d+/CwcGh8DtPREREZEJmDWVz587FoEGD0L9/fwDAkiVLsHPnTixfvhzjx483GH/58uV4/vw5jh07BpVKBQDw9vYuzC4TERERFQizhbLU1FScPn0aoaGhUpuFhQX8/f0RGRlpdJodO3bA19cXw4cPx/bt2+Hi4oKePXviyy+/hFKpNDpNSkoKUlJSpNfx8fEAAI1GA41GY8I1ypmMZZpj2XKS2zpoNGl602oUokD6Vdi4PeiwDjqsgw7roMM66BSHOuS072YLZU+fPkV6ejpcXV312l1dXXH16lWj09y6dQv79+9Hr169sGvXLty4cQPDhg2DRqPBpEmTjE4zY8YMhIWFGbTv3bsXNjY2+V+RPAoPDzfbsuUkp3VISQcyNtc9e/ZCbTyDF1ncHnRYBx3WQYd10GEddIpyHZKSknI0nlkPX+aWVqtFuXLlsHTpUiiVSvj4+ODBgwf47rvvMg1loaGhCAkJkV7Hx8fD09MTAQEBsLe3L6yuSzQaDcLDw9G6dWvpEGxJlNs6JKWmYdyJ/QCAwMAA2FgWqU03U9wedFgHHdZBh3XQYR10ikMdMo7SZcdsv2zOzs5QKpWIiYnRa4+JiYGbm5vRadzd3aFSqfQOVdasWROPHj1CamoqLC0tDaZRq9VQq9UG7SqVyqxvrrmXLxc5rYNKKN6YpniEsgzcHnRYBx3WQYd10GEddIpyHXLab7PdEsPS0hI+Pj7Yt2+f1KbVarFv3z74+voanaZ58+a4ceMGtFqt1Pbvv//C3d3daCAjIiIiKirMep+ykJAQ/Pzzz1i1ahWuXLmCzz//HImJidLVmEFBQXoXAnz++ed4/vw5Ro4ciX///Rc7d+7E9OnTMXz4cHOtAhEREZFJmPUYULdu3fDkyRNMnDgRjx49QoMGDbB7927p5P979+7BwuL/cqOnpyf27NmDL774AvXq1UP58uUxcuRIfPnll+ZaBSIiIiKTMPuJOcHBwQgODjY67ODBgwZtvr6++Oeffwq4V0RERESFy+yPWSIiIiIihjIiIiIiWWAoIyIiIpIBhjIiIiIiGWAoIyIiIpKBPF99qdFo8OjRIyQlJcHFxQVOTk6m7BcRERFRiZKrPWUJCQlYvHgx/Pz8YG9vD29vb9SsWRMuLi7w8vLCoEGDcPLkyYLqKxEREVGxleNQNnfuXHh7e2PFihXw9/fHtm3bEBUVhX///ReRkZGYNGkS0tLSEBAQgDZt2uD69esF2W8iIiKiYiXHhy9PnjyJw4cPo3bt2kaHN2nSBJ999hmWLFmCFStW4MiRI6hWrZrJOkpERERUnOU4lK1fvz5H46nVagwdOjTPHSIiIiIqifJ09eWTJ08yHXbhwoU8d4aIiIiopMpTKKtbty527txp0D579mw0adIk350iIiIiKmnyFMpCQkLwySef4PPPP0dycjIePHiADz74AN9++y3WrVtn6j4SERERFXt5CmXjxo1DZGQkjhw5gnr16qFevXpQq9U4f/48PvroI1P3kYiIiKjYy/Md/atWrYo6dergzp07iI+PR7du3eDm5mbKvhERERGVGHkKZUePHkW9evVw/fp1nD9/HosXL8aIESPQrVs3vHjxwtR9JCIiIir28hTK3n//fXTr1g3//PMPatasiYEDB+Ls2bO4d+8e6tata+o+EhERERV7eXr25d69e+Hn56fXVqVKFRw9ehTTpk0zSceIiIiISpI87Sl7M5BJM7OwwNdff52vDhERERGVRHk+0Z+IiIiITIehjIiIiEgGGMqIiIiIZIChjIiIiEgGGMqIiIiIZCBfoaxz584YMWKE9PrmzZvw8PDId6eIiIiISpo8h7K4uDjs2rULmzZtktrS0tIQExNjko4RERERlSR5DmV79+6Fm5sbkpKScPLkSVP2iYiIiKjEyXMo27VrF9q3b4/3338fu3btMmWfiIiIiEqcPIeyPXv2oEOHDmjXrh1DGREREVE+5SmUnT59GnFxcfjggw/Qtm1bnDlzBk+fPjV134iIiIhKjDyFsl27dqFVq1awsrKCp6cnatSogd27d5u6b0REREQlRp5DWfv27aXX7dq1w86dO03WKSIiIqKSJtehLDk5GUqlEh06dJDaPv74Y8TFxcHa2hpNmjQxaQeJiIiISoJSuZ3A2toaf//9t15b06ZNpZP9IyMjTdMzIiIiohKEj1kiIiIikgGGMiIiIiIZYCgjIiIikgGGMiIiIiIZYCgjIiIikoFchbJly5ZlOTwhIQEDBw7MV4eIiIiISqJchbKQkBB06NABjx49Mhi2Z88e1K5dGydPnjRZ54iIiIhKilyFsnPnziExMRG1a9fG+vXrAej2jg0YMAAdO3ZE7969cerUqQLpKBEREVFxlqubx3p7e+PAgQOYN28eBg0ahLVr1+LChQuws7PD0aNH0bhx44LqJ5EkKTXd3F0wGY0mDSnpQFJqGlRCYe7umA3roGPKOlirlFAoSm4tiYqiXN/RHwCGDBmCw4cPY9u2bbC1tcWff/6JunXrmrpvREY1+ibC3F0wsVIYd2K/uTshA6yDjmnq0MjLEZuG+jKYERUhub768ujRo6hfvz6uXr2K3bt3o23btvD19cX8+fMLon9EAHT/6m/k5WjubhAVGafuvkCypvjsVSYqCXK1p2z06NH48ccfERwcjGnTpsHKygoBAQHYuHEjgoODsXXrVqxYsQKVKlUqqP5SCaVQKLBpqG+x+5HRaDTYs2cvAgMDoFKpzN0ds2EddExRh6TU9GK4N5moZMhVKNu+fTsiIiLQokULvfZu3bqhVatWGDx4MOrVq4eEhASTdpII0AUzG8s8HXGXLY1CQK0EbCxLQaUqXuuWG6yDDutAVLLl6lN//vx52NjYGB3m6uqK7du3Y/Xq1SbpGBEREVFJkqtzyjILZK/r06dPnjtDREREVFLlOJTNnDkTSUlJORr3+PHj2LlzZ547RURERFTS5DiUXb58GV5eXhg2bBj++usvPHnyRBqWlpaG8+fPY9GiRWjWrBm6deuG0qVLF0iHiYiIiIqjHJ9T9uuvv+LcuXP48ccf0bNnT8THx0OpVEKtVkt70Bo2bIiBAweiX79+sLKyKrBOExERERU3uTrRv379+vj555/x008/4dy5c7h37x6Sk5Ph7OyMBg0awNnZuaD6SURERFSs5emaawsLCzRs2BANGzY0dX+IiIiISqRcXX2Znp6OWbNmoXnz5mjcuDHGjx+P5OTkguobERERUYmRq1A2ffp0fPXVV7Czs0P58uUxf/58DB8+vKD6RkRE+ZCUmo6k1DSjf0IIc3ePiN6Qq8OXv/76KxYtWoQhQ4YAACIiItC+fXv88ssvsLDI9WM0iYioAGX1uCU+sJxIfnKVpO7du4d27dpJr/39/aFQKPDw4UOTd4yIiHLPWqVEIy/HbMfjA8uJ5CdXe8rS0tIMbnWhUqmg0WhM2ikiIsobhUKBTUN9Mw1cfGA5kXzlKpQJIdCvXz+o1Wqp7dWrVxg6dChsbW2lti1btpiuh0RElCsKhQI2lnygOVFRk6tPbd++fQ3aevfubbLOEBEREZVUuQplK1asKKh+EBEREZVovGSSiIiISAYYyoiIiIhkgKGMiIiISAYYyoiIiIhkQBahbOHChfD29oaVlRWaNm2KEydO5Gi6DRs2QKFQoHPnzgXbQSIiIqICZvZQtnHjRoSEhGDSpEk4c+YM6tevj8DAQDx+/DjL6e7cuYMxY8agRYsWhdRTIiIiooJj9rsLzp07F4MGDUL//v0BAEuWLMHOnTuxfPlyjB8/3ug06enp6NWrF8LCwnDkyBHExsYWYo+JiIqHpFR5PmZJo0lDSjqQlJoGlcj5szmtVUo+y5OKNLOGstTUVJw+fRqhoaFSm4WFBfz9/REZGZnpdFOmTEG5cuUwYMAAHDlyJMtlpKSkICUlRXodHx8PANBoNGZ5PFTGMkv6o6lYBx3WQYd10CmMOmg0adL/y/txS6Uw7sT+XE3hU9EB6wc2LjbBjJ8LneJQh5z23ayh7OnTp0hPT4erq6teu6urK65evWp0mr///hvLli1DVFRUjpYxY8YMhIWFGbTv3bsXNjY2ue6zqYSHh5tt2XLCOuiwDjqsg05B1kEIoFJpJW4nFI/g8rrT92Kx7c+/oFaauyemxc+FTlGuQ1JSUo7GM/vhy9xISEhAnz598PPPP8PZ2TlH04SGhiIkJER6HR8fD09PTwQEBMDe3r6gupopjUaD8PBwtG7dGiqVqtCXLxesgw7roMM66BRWHdq1E5k+sFwONJo07N+/H++//z5Uqux/ppJT0/HOrEMAgMDAgGLz3E9+LnSKQx0yjtJlx6xbrrOzM5RKJWJiYvTaY2Ji4ObmZjD+zZs3cefOHXTs2FFq02q1AIBSpUrh2rVrqFKlit40arVa7wHqGVQqlVnfXHMvXy5YBx3WQYd10CmMOlhaFujs80Wj0UCtBMrYWuWoDipV2mv/r8pRkCtK+LnQKcp1yGm/zXr1paWlJXx8fLBv3z6pTavVYt++ffD19TUYv0aNGrhw4QKioqKkvw8//BDvvfceoqKi4OnpWZjdJyIiIjIZs/9zIiQkBH379kWjRo3QpEkTzJs3D4mJidLVmEFBQShfvjxmzJgBKysr1KlTR296BwcHADBoJyIiIipKzB7KunXrhidPnmDixIl49OgRGjRogN27d0sn/9+7dw8WFma/nRoRERFRgTJ7KAOA4OBgBAcHGx128ODBLKdduXKl6TtEREREVMi4C4qIiIhIBhjKiIiIiGSAoYyIiIhIBhjKiIiIiGSAoYyIiIhIBhjKiIiIiGSAoYyIiIhIBhjKiIiIiGSAoYyIiIhIBhjKiIiIiGSAoYyIiIhIBhjKiIiIiGSAoYyIiIhIBhjKiIiIiGSAoYyIiIhIBhjKiIiIiGSglLk7QEREZCpJqemFvkxrlRIKhaLQl0vFD0MZEREVG42+iSj8ZXo5YtNQXwYzyjceviQioiLNWqVEIy9Hsy3/1N0XSNYU/h46Kn64p4yIiIo0hUKBTUN9Cz0YJaWmm2XPHBVfDGVERFTkKRQK2FjyJ42KNh6+JCIiIpIBhjIiIiIiGWAoIyIiIpIBhjIiIiIiGWAoIyIiIpIBhjIiIiIiGWAoIyIiIpIBhjIiIiIiGWAoIyIiyichzN0DKg4YyoiIiPLp0yWREExmlE8MZURERHlgrVKilrs9AOBydDwfSk75xlBGRESUBxkPQicyFYYyIiKiPFIozN0DKk4YyoiIiIhkgKGMiIiISAYYyoiIiIhkgKGMiIiISAYYyoiIiIhkgKGMiIiISAYYyoiIiIhkgKGMiIiISAZKmbsDRERExUFSquFjlqxVSih4h1nKIYYyIiIiE2j0TYRhm5cjNg31ZTCjHOHhSyIiojyyVinRyMsx0+Gn7r7gg8opx7injIiIKI8yHkr+ZvBKSk03uueMKCsMZURERPmgUChgY8mfU8o/Hr4kIiIikgGGMiIiIiIZYCgjIiIikgGGMiIiIiIZYCgjIiIikgGGMiIiIiIZYCgjIiIikgGGMiIiIiIZYCgjIiIqQEmp6RBCmLsbVAQwlBERERWgRt9E4NMlkQxmlC2GMiIiIhN780HlfDA55QRDGRERkYllPKj81AR/c3eFihCGMiIiogKge1C50tzdoCKEoYyIiIhIBhjKiIiIiGSAoYyIiIhIBhjKiIiIiGSAoYyIiIhIBhjKiIiIiGRAFqFs4cKF8Pb2hpWVFZo2bYoTJ05kOu7PP/+MFi1awNHREY6OjvD3989yfCIiIqKiwOyhbOPGjQgJCcGkSZNw5swZ1K9fH4GBgXj8+LHR8Q8ePIgePXrgwIEDiIyMhKenJwICAvDgwYNC7jkRERGR6Zg9lM2dOxeDBg1C//79UatWLSxZsgQ2NjZYvny50fHXrl2LYcOGoUGDBqhRowZ++eUXaLVa7Nu3r5B7TkRERGQ6pcy58NTUVJw+fRqhoaFSm4WFBfz9/REZGZmjeSQlJUGj0cDJycno8JSUFKSkpEiv4+PjAQAajQYajSYfvc+bjGWaY9lywjrosA46rIMO66BTnOqg0aS99v8aaBQ5fyh5capDfhSHOuS07wphxsfWP3z4EOXLl8exY8fg6+srtY8bNw6HDh3C8ePHs53HsGHDsGfPHly6dAlWVlYGwydPnoywsDCD9nXr1sHGxiZ/K0BERJSFlHRg3And/o9vm6RBzaculUhJSUno2bMn4uLiYG9vn+l4Zt1Tll8zZ87Ehg0bcPDgQaOBDABCQ0MREhIivY6Pj5fOQ8uqMAVFo9EgPDwcrVu3hkqlKvTlywXroMM66LAOOqyDTnGqQ1JqGsad2A8ACAwMgI1lzn92i1Md8qM41CHjKF12zBrKnJ2doVQqERMTo9ceExMDNze3LKedPXs2Zs6ciYiICNSrVy/T8dRqNdRqtUG7SqUy65tr7uXLBeugwzrosA46rINOcaiDSij+7/9VKqhUuf/ZLQ51MIWiXIec9tusJ/pbWlrCx8dH7yT9jJP2Xz+c+aZvv/0WU6dOxe7du9GoUaPC6CoRERFRgTL74cuQkBD07dsXjRo1QpMmTTBv3jwkJiaif//+AICgoCCUL18eM2bMAADMmjULEydOxLp16+Dt7Y1Hjx4BAOzs7GBnZ2e29SAiIiLKD7OHsm7duuHJkyeYOHEiHj16hAYNGmD37t1wdXUFANy7dw8WFv+3Q2/x4sVITU1Fly5d9OYzadIkTJ48uTC7TkRERGQyZg9lABAcHIzg4GCjww4ePKj3+s6dOwXfISIiIqJCZvabxxIRERERQxkRERGRLDCUEREREckAQxkRERGRDDCUERERFQLzPdSQigqGMiIiokLw6ZJImPFx01QEMJQREREVEGuVErXcdc9Zvhwdj2RNupl7RHLGUEZERFRAFAoFNg3N/LGBRK9jKCMiIipACkX24xABDGVEREREssBQRkRERCQDDGVEREREMsBQRkRERCQDDGVEREREMsBQRkRERCQDDGVEREREMlDK3B0gIiIqKZJSc35Hf40mDSnpQFJqGlSi5N7sLKd1sFYpoSjiN4VjKCMiIiokjb6JyOUUpTDuxP4C6UvRkn0dGnk5YtNQ3yIdzHj4koiIqABZq5Ro5OVo7m4Ue6fuvijyzxblnjIiIqIClPH8y9wGBo1Ggz179iIwMAAqlaqAeid/2dUhKTU9D3sg5YmhjIiIqIApFArYWObuJ1ejEFArARvLUlCpSu7PdUmqAw9fEhEREckAQxkRERGRDDCUEREREckAQxkRERGRDDCUEREREckAQxkRERGRDDCUEREREckAQxkRERGRDDCUEREREckAQxkRERGRDDCUEREREckAQxkRERGRDDCUEREREckAQxkRERGRDDCUEREREckAQxkRERGRDDCUEREREckAQxkRERGRDDCUEREREckAQxkRERGRDDCUEREREckAQxkREREVC0mp6RBCmLsbecZQRkRERMVCo28i8OmSyCIbzBjKiIiIqMiyVinRyMtRen3q7gska9LN2KO8YygjIiKiIkuhUGDTUF+cmuBv7q7kG0MZERERFWkKhQI2lkpzdyPfGMqIiIiIZIChjIiIiEgGGMqIiIiIZIChjIiIiEgGGMqIiIiIZIChjIiIiEgGGMqIiIiIZIChjIiIiEgGSpm7A0RERESmlJSau8csWauUUCgUBdSbnGMoIyIiomKl0TcRuRvfyxGb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", + "image/png": "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sjdv3owpU6ZIr318fEwS9kyBV18WABnfRoWIiEgWWrdujeXLlyMlJQU7d+7E0KFDoVKpEBYWpjdeamoqAMDV1TVfJ9OnpqbC0tISzs7O+ep3QeKeMiIiIip0arUa7u7u8Pb2xqeffoqAgABs374dffr0QceOHTF16lR4enqiRo0aAAwPX969excdOnSAnZ0d7O3t0blzZ8TExEjDJ06ciPr16+OXX35BxYoVpdtUvHr4skWLFrhz5w4+//xzac9dYmIi7O3t8fvvv+v1d+vWrbC1tcXz588LrCYMZURERGR21tbW0l6xffv24dq1awgPD8f27dsNxtVqtejQoQNiY2Nx6NAhhIeH49atW+jSpYveeDdu3MCmTZuwefNmREZGGsxn8+bNKF++PCZPnozo6GhER0fD1tYWXbt2xfLly/XGXb58OTp16oTSpUubbqVfw8OXREREZDZCCOzbtw+7d+/GZ599hsePH8PW1ha//PILLC0todVqkZCQoDfNvn37cOHCBURFRcHLywsA8Ouvv6JWrVo4efIkGjVqBEB3yPLXX3+Fq6ur0WU7OztDqVSidOnScHd3l9r79++Ppk2bIjo6Gh4eHnj06BF27tyJvXv3FlAVdLinjIiIiArdn3/+CTs7O1hZWaFNmzbo0qULJk6cCACoU6dOls+QvHLlCry8vKRABgA1a9aEo6Mjrly5IrV5e3tnGsiy0rhxY9SqVQsrV64EAKxevRre3t5o3rx5rueVGwxlREREVOjeffddREZG4vr160hOTsbKlStha2sLANJ/8ys/8+nfvz9WrFgBQHfosm/fvgX+QHSGMiIiIip0tra2qFKlCipUqIBSpXJ3NlWNGjVw79493Lt3T2q7fPky4uLiULNmzVzNy9LSEunphvcU7dmzJ+7cuYMffvgBly9fRu/evXM137xgKCMiIqIiJSAgAHXq1EGPHj1w5swZnDhxAiEhIfD390fDhg1zNS8fHx8cPnwY9+/fx5MnT6R2JycnfPjhhxg9ejQCAwNRvnx5U6+GAYayAsanLBEREZmWQqHAtm3b4OTkhObNmyMgIACVKlXChg0bcj2vyZMn4/bt26hcubLB+Wf9+vVDamoqPvnkE1N1PUu8+rKAfbw4Ajv+83aBH4cmIiIqKjLO1crNsFu3bundPLZChQrYtm1bpvOZOHGidOHAqw4ePKj3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yjh69CimTp1qko4RERERlSR52lP2eiCTZmZhga+//jpfHSIiIiIqifJ8oj8RERERmQ5DGREREZEMMJQRERERyQBDGREREZEMMJQRERERyUC+QlnHjh3x2WefSa9v3rwJT0/PfHeKiIiIqKTJcyiLj4/Hzp07sXHjRqktLS0NMTExJukYERERUUmS51C2Z88euLu7IykpCSdPnjRln4iIiIhKnDyHsp07d6Jdu3Zo2bIldu7caco+EREREZU4eQ5lu3fvRvv27dG2bVuGMiIiIqJ8ylMoO336NOLj4/Hee++hTZs2OHPmDJ48eWLqvhERERGVGHkKZTt37kSLFi1gZWUFLy8vVK9eHbt27TJ134iIiIhKjDyHsnbt2kmv27Ztix07dpisU0REREQlTa5DWXJyMpRKJdq3by+1ffjhh4iPj4e1tTUaN25s0g4SERERlQSlcjuBtbU1/v77b722Jk2aSCf7R0REmKZnRERERCUIH7NEREREJAMMZUREREQywFBGREREJAMMZUREREQywFBGREREJAO5CmVLly7Ncvjz58/Rv3//fHWIiIiIqCTKVSgLDQ1F+/bt8fDhQ4Nhu3fvRq1atXDy5EmTdY6IiIiopMhVKDt37hwSExNRq1YtrFu3DoBu71i/fv0QHByMnj174tSpUwXSUSIiIqLiLFc3j/Xx8cGBAwcwd+5cDBgwAGvWrMGFCxdgZ2eHo0ePolGjRgXVTyIiIqJiLdd39AeAQYMG4fDhw9i6dStsbW3x559/ok6dOqbuGxEREVGJkeurL48ePYp69erh6tWr2LVrF9q0aQM/Pz/MmzevIPpHREREVCLkKpSNHDkSLVu2RHBwMM6cOYPAwED89ttvWLp0Kb755hu0aNECUVFRBdVXIiIiomIrV6Fs27Zt2Lt3L2bPng0rKyupvUuXLrh48SIcHBxQt25dk3eSiIiIqLjL1Tll58+fh42NjdFhbm5u2LZtG1atWmWSjhERERGVJLnaU5ZZIHtVr1698twZIiIiopIqx6FsxowZSEpKytG4x48fx44dO/LcKSIiIqKSJseh7PLly/D29saQIUPw119/4fHjx9KwtLQ0nD9/HgsXLkTTpk3RpUsXlC5dukA6TERERFQc5ficsl9//RXnzp3Djz/+iO7duyMhIQFKpRJqtVrag9agQQP0798fffr00bsQgIiIiIiylqsT/evVq4eff/4ZP/30E86dO4e7d+8iOTkZLi4uqF+/PlxcXAqqn0RERETFWp7u6G9hYYEGDRqgQYMGpu4PERERUYmUq6sv09PTMXPmTDRr1gyNGjXC2LFjkZycXFB9IyIiIioxcrWnbNq0aZg4cSICAgJgbW2NefPm4dGjR1i2bFlB9Y/IQFJqurm7YDIaTRpS0oGk1DSohMLc3TFgrVJCoZBfv4iIiqNchbJff/0VCxcuxKBBgwAAe/fuRbt27fDLL7/AwiLXj9EkypOG3+w1dxdMrBTGnNhv7k4Y1dDbCRsH+zGYEREVglwlqbt376Jt27bS64CAACgUCjx48MDkHSN6lbVKiYbeTubuRolz6s4zJGuKz55JIiI5y9WesrS0NINbXahUKmg0GpN2iuh1CoUCGwf7FbuAoNFosHv3HgQFBUKlUpm7O5Kk1PRiuEeSiEjechXKhBDo06cP1Gq11Pby5UsMHjwYtra2UtvmzZtN10Oi/6dQKGBjmacLhmVLoxBQKwEby1JQqYrXuhERUe7k6legd+/eBm09e/Y0WWeIiIiISqpchbLly5cXVD+IiIiISjReMklEREQkAwxlRERERDLAUEZEREQkAwxlRERERDIgi1C2YMEC+Pj4wMrKCk2aNMGJEydyNN369euhUCjQsWPHgu0gERERUQEzeyjbsGEDQkNDMWHCBJw5cwb16tVDUFAQHj16lOV0t2/fxqhRo/DOO+8UUk+JiIiICo7Z71Y5Z84cDBgwAH379gUALF68GDt27MCyZcswduxYo9Okp6ejR48emDRpEo4cOYK4uLhC7DFRyVIYD4CX+4PZC4sp68CHyRMVPWYNZampqTh9+jTCwsKkNgsLCwQEBCAiIiLT6SZPnoyyZcuiX79+OHLkSJbLSElJQUpKivQ6ISEBgO7xNuZ4PFTGMkv6o6lYBx251kGjSZP+v/AetyTfB7MXLtPUwbeCI9b1b1Qkg5lcPxeFjXXQKQ51yGnfzRrKnjx5gvT0dLi5uem1u7m54erVq0an+fvvv7F06VJERkbmaBnTp0/HpEmTDNr37NkDGxubXPfZVMLDw822bDlhHXTkVgchgIqllYh6XvR+0Enn9N04bP3zL6iV5u5J3sntc2EurINOUa5DUlJSjsYz++HL3Hj+/Dl69eqFn3/+GS4uLjmaJiwsDKGhodLrhIQEeHl5ITAwEPb29gXV1UxpNBqEh4ejVatWsnoAdWFjHXTkXIe2bUWhPQBeo0nD/v370bJlyxL9DFBT1CE5NR1vzTwEAAgKCiySz4uV8+eiMLEOOsWhDhlH6bJj1k+ri4sLlEolYmJi9NpjYmLg7u5uMP7Nmzdx+/ZtBAcHS21arRYAUKpUKVy7dg2VK1fWm0atVus9QD2DSqUy65tr7uXLBeugI9c6WFoWznI0Gg3USsDB1kqWdSgspqiDSpX2yv+rinTIlevnorCxDjpFuQ457bdZr760tLSEr68v9u3bJ7VptVrs27cPfn5+BuNXr14dFy5cQGRkpPT3/vvv491330VkZCS8vLwKs/tEREREJmP2f0KFhoaid+/eaNiwIRo3boy5c+ciMTFRuhozJCQE5cqVw/Tp02FlZYXatWvrTe/o6AgABu1ERERERYnZQ1mXLl3w+PFjjB8/Hg8fPkT9+vWxa9cu6eT/u3fvwsLC7LdTIyIiIipQZg9lADBs2DAMGzbM6LCDBw9mOe2KFStM3yEiIiKiQsZdUEREREQywFBGREREJAMMZUREREQywFBGREREJAOyONGfiIhML6uHyfOB5UTyw1BGRFRMZfUw+YbeTtg42I/BjEhGePiSiKgYsVYp0dDbKdvxTt15VmjPNiWinOGeMiKiYkShUGDjYL9MA1dSanqWe9CIyHwYyoiIihmFQgEbS369ExU1PHxJREREJAMMZUREREQywFBGREREJAMMZUREREQywFBGREREJAMMZUREREQywFBGREREJAO8kQ0RUQmV1bMxzUmjSUNKOpCUmgaVyPljoPg8TyrqGMqIiEooed/ZvxTGnNifqyn4PE8q6nj4koioBMnpszGLIj7Pk4o67ikjIipBsns2phxoNBrs3r0HQUGBUKlU2Y7P53lSccFQRkRUwsj92ZgahYBaCdhYloJKJd9+EpkaD18SERERyQBDGREREZEMMJQRERERyQBDGREREZEMMJQRERERyQBDGREREZEMMJQRERERyQBDGREREZEMMJQRERERyQBDGREREZEMMJQRERERyQBDGREREZEMMJQRERERyQBDGREREZEMMJQRERERyQBDGREREZEMMJQRERERyQBDGREREZEMMJQRERERyQBDGREREZEMMJQRERERyUApc3eAiIjIVJJS082yXGuVEgqFwizLpuKDoYyIiIqNht/sNc9yvZ2wcbAfgxnlCw9fEhFRkWatUqKht5NZ+3DqzjMka8yzl46KD+4pIyKiIk2hUGDjYD+zhKKk1HSz7Z2j4oehjIiIijyFQgEbS/6kUdHGw5dEREREMsBQRkRERCQDDGVEREREMsBQRkRERCQDDGVEREREMsBQRkRERCQDDGVEREREMsBQRkRERCQDDGVEREREMsBQRkRERCQDDGVEREREMsBQRkRERCQDDGVEREREMsBQRkRERCQDDGVEREREMsBQRkRERCQDDGVEREREMsBQRkRERCQDDGVEREREMiCLULZgwQL4+PjAysoKTZo0wYkTJzId9+eff8Y777wDJycnODk5ISAgIMvxiYiIiIoCs4eyDRs2IDQ0FBMmTMCZM2dQr149BAUF4dGjR0bHP3jwILp164YDBw4gIiICXl5eCAwMxP379wu550RERESmY/ZQNmfOHAwYMAB9+/ZFzZo1sXjxYtjY2GDZsmVGx1+zZg2GDBmC+vXro3r16vjll1+g1Wqxb9++Qu45ERHR/ySlpiMpNc3onxDC3N2jIqCUOReempqK06dPIywsTGqzsLBAQEAAIiIicjSPpKQkaDQaODs7Gx2ekpKClJQU6XVCQgIAQKPRQKPR5KP3eZOxTHMsW05YBx3WQYd10GEddIpSHTSaNOn/G36zN9PxfCs4Yl3/RlAoFLmYd9GpQ0EqDnXIad8Vwozx/cGDByhXrhyOHTsGPz8/qX3MmDE4dOgQjh8/nu08hgwZgt27d+PSpUuwsrIyGD5x4kRMmjTJoH3t2rWwsbHJ3woQEVGJJgQw75ISUc+zD1vfNk6DWlkInSLZSUpKQvfu3REfHw97e/tMxzPrnrL8mjFjBtavX4+DBw8aDWQAEBYWhtDQUOl1QkKCdB5aVoUpKBqNBuHh4WjVqhVUKlWhL18uWAcd1kGHddBhHXSKWh3athVI1qQbHZacmo63Zh4CAAQFBcLGMuc/u0WtDgWlONQh4yhddswaylxcXKBUKhETE6PXHhMTA3d39yynnTVrFmbMmIG9e/eibt26mY6nVquhVqsN2lUqlVnfXHMvXy5YBx3WQYd10GEddIpSHSwtjberVGmv/L8KKlXuf3aLUh0KUlGuQ077bdYT/S0tLeHr66t3kn7GSfuvHs583bfffospU6Zg165daNiwYWF0lYiIiKhAmf3wZWhoKHr37o2GDRuicePGmDt3LhITE9G3b18AQEhICMqVK4fp06cDAGbOnInx48dj7dq18PHxwcOHDwEAdnZ2sLOzM9t6EBEREeWH2UNZly5d8PjxY4wfPx4PHz5E/fr1sWvXLri5uQEA7t69CwuL/+3QW7RoEVJTU9GpUye9+UyYMAETJ04szK4TERERmYzZQxkADBs2DMOGDTM67ODBg3qvb9++XfAdIiIiIipkZr95LBERERExlBERERHJAkMZERERkQwwlBERERHJAEMZERERkQwwlBERERHJAEMZERERkQwwlBERERHJAEMZERERkQwwlBERERHJAEMZERERkQwwlBERERHJAEMZERERkQwwlBERERHJAEMZERERkQwwlBERERHJAEMZERERkQwwlBERERHJAEMZERERkQwwlBERERHJAEMZERERkQwwlBERERHJAEMZERERkQwwlBERERHJAEMZERERkQwwlBERERHJAEMZERERkQwwlBERERHJAEMZERERkQwwlBERERHJAEMZERERkQwwlBERERHJAEMZERERkQwwlBERERHJAEMZERERkQwwlBERERHJAEMZERERkQwwlBERERHJAEMZERERkQwwlBERERHJAEMZERERkQwwlBERERHJQClzd4CIiKgkSEpNz9X4Gk0aUtKBpNQ0qISigHolf7mpg7VKCYWi6NaKoYyIiKgQNPxmbx6mKoUxJ/abvC9FT87q0NDbCRsH+xXZYMbDl0RERAXEWqVEQ28nc3ejxDh15xmSNbnbIykn3FNGRERUQBQKBTYO9stTUNBoNNi9ew+CggKhUqkKoHdFQ07qkJSansc9kfLCUEZERFSAFAoFbCxz/3OrUQiolYCNZSmoVCX357ok1YGHL4mIiIhkgKGMiIiISAYYyoiIiIhkgKGMiIiISAYYyoiIiIhkgKGMiIiISAYYyoiIiIhkgKGMiIiISAaK913YiIiIqETJ7YPfAfk8yJyhjIiIiIqNvDxuSS4PMufhSyIiIirS8vvgd7k8yJx7yoiIiKhIy+uD3+X2IHOGMiIiIiry8vrgdznh4UsiIiIiGWAoIyIiIpIBhjIiIiIiGWAoIyIiIpIBhjIiIiIiGWAoIyIiIpIBWYSyBQsWwMfHB1ZWVmjSpAlOnDiR5fgbN25E9erVYWVlhTp1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", "text/plain": [ "
" ] diff --git a/tests/scenarios/scenario_3.yaml b/tests/scenarios/scenario_3.yaml index 18f8063..86e7242 100644 --- a/tests/scenarios/scenario_3.yaml +++ b/tests/scenarios/scenario_3.yaml @@ -67,36 +67,36 @@ network: capacity: 1 cost: 1 - # Demonstrates setting a shared_risk_group and optic_type on all spine to spine links. + # Demonstrates setting a shared_risk_group and hw_component on all spine to spine links. - source: .*/spine/.* target: .*/spine/.* any_direction: True link_params: attrs: shared_risk_group: "SpineSRG" - optic_type: "400G-LR4" + hw_component: "400G-LR4" # Example node overrides that assign SRGs and hardware types node_overrides: - path: my_clos1/b1/t1 attrs: shared_risk_group: "clos1-b1t1-SRG" - hw_type: "LeafHW-A" + hw_component: "LeafHW-A" - path: my_clos2/b2/t1 attrs: shared_risk_group: "clos2-b2t1-SRG" - hw_type: "LeafHW-B" + hw_component: "LeafHW-B" - path: my_clos1/spine/t3.* attrs: shared_risk_group: "clos1-spine-SRG" - hw_type: "SpineHW" + hw_component: "SpineHW" - path: my_clos2/spine/t3.* attrs: shared_risk_group: "clos2-spine-SRG" - hw_type: "SpineHW" + hw_component: "SpineHW" workflow: - step_type: BuildGraph diff --git a/tests/scenarios/test_scenario_3.py b/tests/scenarios/test_scenario_3.py index 58bfbdd..7e9fa3f 100644 --- a/tests/scenarios/test_scenario_3.py +++ b/tests/scenarios/test_scenario_3.py @@ -18,7 +18,7 @@ def test_scenario_3_build_graph_and_capacity_probe() -> None: 4) An empty failure policy by default. 5) The max flow from my_clos1/b -> my_clos2/b (and reverse) is as expected for the two capacity probe steps (PROPORTIONAL vs. EQUAL_BALANCED). - 6) That node overrides and link overrides have been applied (e.g. SRG, hw_type). + 6) That node overrides and link overrides have been applied (e.g. SRG, hw_component). """ # 1) Load the YAML file scenario_path = Path(__file__).parent / "scenario_3.yaml" @@ -73,23 +73,23 @@ def test_scenario_3_build_graph_and_capacity_probe() -> None: net = scenario.network # (A) Node attribute checks from node_overrides: - # For "my_clos1/b1/t1/t1-1", we expect hw_type="LeafHW-A" and SRG="clos1-b1t1-SRG" + # For "my_clos1/b1/t1/t1-1", we expect hw_component="LeafHW-A" and SRG="clos1-b1t1-SRG" node_a1 = net.nodes["my_clos1/b1/t1/t1-1"] assert ( - node_a1.attrs.get("hw_type") == "LeafHW-A" - ), "Expected hw_type=LeafHW-A for 'my_clos1/b1/t1/t1-1', but not found." + node_a1.attrs.get("hw_component") == "LeafHW-A" + ), "Expected hw_component=LeafHW-A for 'my_clos1/b1/t1/t1-1', but not found." assert ( node_a1.attrs.get("shared_risk_group") == "clos1-b1t1-SRG" ), "Expected shared_risk_group=clos1-b1t1-SRG for 'my_clos1/b1/t1/t1-1'." - # For "my_clos2/b2/t1/t1-1", check hw_type="LeafHW-B" and SRG="clos2-b2t1-SRG" + # For "my_clos2/b2/t1/t1-1", check hw_component="LeafHW-B" and SRG="clos2-b2t1-SRG" node_b2 = net.nodes["my_clos2/b2/t1/t1-1"] - assert node_b2.attrs.get("hw_type") == "LeafHW-B" + assert node_b2.attrs.get("hw_component") == "LeafHW-B" assert node_b2.attrs.get("shared_risk_group") == "clos2-b2t1-SRG" - # For "my_clos1/spine/t3-1", check hw_type="SpineHW" and SRG="clos1-spine-SRG" + # For "my_clos1/spine/t3-1", check hw_component="SpineHW" and SRG="clos1-spine-SRG" node_spine1 = net.nodes["my_clos1/spine/t3-1"] - assert node_spine1.attrs.get("hw_type") == "SpineHW" + assert node_spine1.attrs.get("hw_component") == "SpineHW" assert node_spine1.attrs.get("shared_risk_group") == "clos1-spine-SRG" # (B) Link attribute checks from link_overrides: @@ -107,7 +107,7 @@ def test_scenario_3_build_graph_and_capacity_probe() -> None: "'my_clos2/spine/t3-1'" ) - # Another override sets shared_risk_group="SpineSRG" + optic_type="400G-LR4" on all spine-spine links + # Another override sets shared_risk_group="SpineSRG" + hw_component="400G-LR4" on all spine-spine links # We'll check a random spine pair, e.g. "t3-2" link_id_2 = net.find_links( "my_clos1/spine/t3-2$", @@ -119,8 +119,8 @@ def test_scenario_3_build_graph_and_capacity_probe() -> None: link_obj.attrs.get("shared_risk_group") == "SpineSRG" ), "Expected SRG=SpineSRG on spine<->spine link." assert ( - link_obj.attrs.get("optic_type") == "400G-LR4" - ), "Expected optic_type=400G-LR4 on spine<->spine link." + link_obj.attrs.get("hw_component") == "400G-LR4" + ), "Expected hw_component=400G-LR4 on spine<->spine link." # 10) The capacity probe step computed forward and reverse flows in 'combine' mode # with PROPORTIONAL flow placement. diff --git a/tests/test_blueprints.py b/tests/test_blueprints.py index 53915be..1ba9260 100644 --- a/tests/test_blueprints.py +++ b/tests/test_blueprints.py @@ -1,7 +1,684 @@ import pytest +from ngraph.network import Network, Node, Link + +from ngraph.blueprints import ( + DSLExpansionContext, + Blueprint, + _apply_parameters, + _join_paths, + _create_link, + _expand_adjacency_pattern, + _process_direct_nodes, + _process_direct_links, + _expand_blueprint_adjacency, + _expand_adjacency, + _expand_group, + _update_nodes, + _update_links, + _process_node_overrides, + _process_link_overrides, + expand_network_dsl, +) + + +def test_join_paths(): + """ + Tests _join_paths for correct handling of leading slash, parent/child combinations, etc. + """ + # No parent path, no slash + assert _join_paths("", "SFO") == "SFO" + # No parent path, child with leading slash => "SFO" + assert _join_paths("", "/SFO") == "SFO" + # Parent path plus child => "SEA/leaf" + assert _join_paths("SEA", "leaf") == "SEA/leaf" + # Parent path plus leading slash => "SEA/leaf" + assert _join_paths("SEA", "/leaf") == "SEA/leaf" + + +def test_apply_parameters(): + """ + Tests _apply_parameters to ensure user-provided overrides get applied + to the correct subgroup fields. + """ + original_def = { + "node_count": 4, + "name_template": "spine-{node_num}", + "other_attr": True, + } + params = { + # Overwrite node_count for 'spine' + "spine.node_count": 6, + # Overwrite name_template for 'spine' + "spine.name_template": "myspine-{node_num}", + # Overwrite a non-existent param => ignored + "leaf.node_count": 10, + } + updated = _apply_parameters("spine", original_def, params) + assert updated["node_count"] == 6 + assert updated["name_template"] == "myspine-{node_num}" + # Check that we preserved "other_attr" + assert updated["other_attr"] is True + # Check that there's no spurious new key + assert len(updated) == 3, f"Unexpected keys: {updated.keys()}" + + +def test_create_link(): + """ + Tests _create_link to verify creation and insertion into a Network. + """ + net = Network() + net.add_node(Node("A")) + net.add_node(Node("B")) + + _create_link(net, "A", "B", {"capacity": 50, "cost": 5, "attrs": {"color": "red"}}) + + assert len(net.links) == 1 + link_obj = list(net.links.values())[0] + assert link_obj.source == "A" + assert link_obj.target == "B" + assert link_obj.capacity == 50 + assert link_obj.cost == 5 + assert link_obj.attrs["color"] == "red" + + +def test_create_link_multiple(): + """ + Tests _create_link with link_count=2 to ensure multiple parallel links are created. + """ + net = Network() + net.add_node(Node("A")) + net.add_node(Node("B")) + + _create_link( + net, + "A", + "B", + {"capacity": 10, "cost": 1, "attrs": {"color": "green"}}, + link_count=2, + ) + + assert len(net.links) == 2 + for link_obj in net.links.values(): + assert link_obj.source == "A" + assert link_obj.target == "B" + assert link_obj.capacity == 10 + assert link_obj.cost == 1 + assert link_obj.attrs["color"] == "green" + + +def test_expand_adjacency_pattern_one_to_one(): + """ + Tests _expand_adjacency_pattern in 'one_to_one' mode for a simple 2:2 case. + Should produce pairs: (S1->T1), (S2->T2). + """ + ctx_net = Network() + ctx_net.add_node(Node("S1")) + ctx_net.add_node(Node("S2")) + ctx_net.add_node(Node("T1")) + ctx_net.add_node(Node("T2")) + + ctx = DSLExpansionContext(blueprints={}, network=ctx_net) + + _expand_adjacency_pattern(ctx, "S", "T", "one_to_one", {"capacity": 10}) + # We expect 2 links: S1->T1, S2->T2 + assert len(ctx_net.links) == 2 + # Confirm the pairs + pairs = {(l.source, l.target) for l in ctx_net.links.values()} + assert pairs == {("S1", "T1"), ("S2", "T2")} + + # Also confirm the capacity + for l in ctx_net.links.values(): + assert l.capacity == 10 + + +def test_expand_adjacency_pattern_one_to_one_wrap(): + """ + Tests 'one_to_one' with wrapping case: e.g., 4 vs 2. (both sides a multiple). + => S1->T1, S2->T2, S3->T1, S4->T2 => total 4 links. + """ + ctx_net = Network() + # 4 source nodes + ctx_net.add_node(Node("S1")) + ctx_net.add_node(Node("S2")) + ctx_net.add_node(Node("S3")) + ctx_net.add_node(Node("S4")) + # 2 target nodes + ctx_net.add_node(Node("T1")) + ctx_net.add_node(Node("T2")) + + ctx = DSLExpansionContext({}, ctx_net) + + _expand_adjacency_pattern(ctx, "S", "T", "one_to_one", {"cost": 99}) + # Expect 4 total links + assert len(ctx_net.links) == 4 + # Check the actual pairs + pairs = {(l.source, l.target) for l in ctx_net.links.values()} + expected = { + ("S1", "T1"), + ("S2", "T2"), + ("S3", "T1"), + ("S4", "T2"), + } + assert pairs == expected + for l in ctx_net.links.values(): + assert l.cost == 99 + + +def test_expand_adjacency_pattern_one_to_one_mismatch(): + """ + Tests 'one_to_one' with a mismatch (3 vs 2) => raises a ValueError + since 3 % 2 != 0. + """ + ctx_net = Network() + # 3 sources, 2 targets + ctx_net.add_node(Node("S1")) + ctx_net.add_node(Node("S2")) + ctx_net.add_node(Node("S3")) + ctx_net.add_node(Node("T1")) + ctx_net.add_node(Node("T2")) + + ctx = DSLExpansionContext({}, ctx_net) + + with pytest.raises(ValueError) as exc: + _expand_adjacency_pattern(ctx, "S", "T", "one_to_one", {}) + # Our error text checks + assert "requires sizes with a multiple factor" in str(exc.value) + + +def test_expand_adjacency_pattern_mesh(): + """ + Tests _expand_adjacency_pattern in 'mesh' mode: all-to-all links among matched nodes, + skipping self-loops and deduplicating reversed pairs. + """ + ctx_net = Network() + ctx_net.add_node(Node("X1")) + ctx_net.add_node(Node("X2")) + ctx_net.add_node(Node("Y1")) + ctx_net.add_node(Node("Y2")) + + ctx = DSLExpansionContext({}, ctx_net) -from ngraph.blueprints import expand_network_dsl -from ngraph.network import Node + # mesh => X1,X2 => Y1,Y2 => 4 links total + _expand_adjacency_pattern(ctx, "X", "Y", "mesh", {"capacity": 99}) + assert len(ctx_net.links) == 4 + for link in ctx_net.links.values(): + assert link.capacity == 99 + + +def test_expand_adjacency_pattern_mesh_link_count(): + """ + Tests 'mesh' mode with link_count=2 to ensure multiple parallel links are created per pairing. + """ + ctx_net = Network() + ctx_net.add_node(Node("A1")) + ctx_net.add_node(Node("A2")) + ctx_net.add_node(Node("B1")) + ctx_net.add_node(Node("B2")) + + ctx = DSLExpansionContext({}, ctx_net) + + _expand_adjacency_pattern(ctx, "A", "B", "mesh", {"attrs": {"color": "purple"}}, 2) + # A1->B1, A1->B2, A2->B1, A2->B2 => each repeated 2 times => 8 total links + assert len(ctx_net.links) == 8 + for link in ctx_net.links.values(): + assert link.attrs.get("color") == "purple" + + +def test_expand_adjacency_pattern_unknown(): + """ + Tests that an unknown adjacency pattern raises ValueError. + """ + ctx_net = Network() + ctx_net.add_node(Node("N1")) + ctx_net.add_node(Node("N2")) + ctx = DSLExpansionContext({}, ctx_net) + + with pytest.raises(ValueError) as excinfo: + _expand_adjacency_pattern(ctx, "N1", "N2", "non_existent_pattern", {}) + assert "Unknown adjacency pattern" in str(excinfo.value) + + +def test_process_direct_nodes(): + """ + Tests _process_direct_nodes to ensure direct node creation works. + Existing nodes are not overwritten. + """ + net = Network() + net.add_node(Node("Existing")) + + network_data = { + "nodes": { + "New1": {"foo": "bar"}, + "Existing": { + "override": "ignored" + }, # This won't be merged since node already exists + }, + } + + _process_direct_nodes(net, network_data) + + # "New1" was created + assert "New1" in net.nodes + assert net.nodes["New1"].attrs["foo"] == "bar" + # "Existing" was not overwritten + assert "override" not in net.nodes["Existing"].attrs + + +def test_process_direct_links(): + """ + Tests _process_direct_links to ensure direct link creation works. + """ + net = Network() + net.add_node(Node("Existing1")) + net.add_node(Node("Existing2")) + + network_data = { + "links": [ + { + "source": "Existing1", + "target": "Existing2", + "link_params": {"capacity": 5}, + } + ], + } + + _process_direct_links(net, network_data) + + # Confirm that links were created + assert len(net.links) == 1 + link = next(iter(net.links.values())) + assert link.source == "Existing1" + assert link.target == "Existing2" + assert link.capacity == 5 + + +def test_process_direct_links_link_count(): + """ + Tests _process_direct_links with link_count > 1 to ensure multiple parallel links. + """ + net = Network() + net.add_node(Node("N1")) + net.add_node(Node("N2")) + + network_data = { + "links": [ + { + "source": "N1", + "target": "N2", + "link_params": {"capacity": 20}, + "link_count": 3, + } + ] + } + _process_direct_links(net, network_data) + + assert len(net.links) == 3 + for link_obj in net.links.values(): + assert link_obj.capacity == 20 + assert link_obj.source == "N1" + assert link_obj.target == "N2" + + +def test_direct_links_same_node_raises(): + """ + Tests that creating a link that references the same node as source and target + raises a ValueError. + """ + net = Network() + net.add_node(Node("X")) + network_data = { + "links": [ + { + "source": "X", + "target": "X", + } + ] + } + + with pytest.raises(ValueError) as excinfo: + _process_direct_links(net, network_data) + assert "Link cannot have the same source and target" in str(excinfo.value) + + +def test_expand_blueprint_adjacency(): + """ + Tests _expand_blueprint_adjacency: verifying that relative paths inside a blueprint + are joined with parent_path, then expanded as normal adjacency. + """ + ctx_net = Network() + ctx_net.add_node(Node("Parent/leaf-1")) + ctx_net.add_node(Node("Parent/leaf-2")) + ctx_net.add_node(Node("Parent/spine-1")) + + ctx = DSLExpansionContext({}, ctx_net) + + adj_def = { + "source": "/leaf-1", + "target": "/spine-1", + "pattern": "mesh", + "link_params": {"cost": 999}, + } + # parent_path => "Parent" + _expand_blueprint_adjacency(ctx, adj_def, "Parent") + + # Only "Parent/leaf-1" matches the source path => single source node, + # "Parent/spine-1" => single target node => 1 link + assert len(ctx_net.links) == 1 + link = next(iter(ctx_net.links.values())) + assert link.source == "Parent/leaf-1" + assert link.target == "Parent/spine-1" + assert link.cost == 999 + + +def test_expand_adjacency(): + """ + Tests _expand_adjacency for a top-level adjacency definition (non-blueprint), + verifying that leading '/' is stripped and used to find nodes in the global context. + """ + ctx_net = Network() + ctx_net.add_node(Node("Global/A1")) + ctx_net.add_node(Node("Global/B1")) + + ctx = DSLExpansionContext({}, ctx_net) + + # adjacency => "one_to_one" with /Global/A1 -> /Global/B1 + adj_def = { + "source": "/Global/A1", + "target": "/Global/B1", + "pattern": "one_to_one", + "link_params": {"capacity": 10}, + } + _expand_adjacency(ctx, adj_def) + + # single pairing => A1 -> B1 + assert len(ctx_net.links) == 1 + link = next(iter(ctx_net.links.values())) + assert link.source == "Global/A1" + assert link.target == "Global/B1" + assert link.capacity == 10 + + +def test_expand_group_direct(): + """ + Tests _expand_group for a direct node group (no use_blueprint), + ensuring node_count and name_template usage. + """ + ctx_net = Network() + ctx = DSLExpansionContext({}, ctx_net) + + group_def = { + "node_count": 3, + "name_template": "myNode-{node_num}", + "coords": [1, 2], + } + _expand_group(ctx, parent_path="", group_name="TestGroup", group_def=group_def) + + # Expect 3 nodes => "TestGroup/myNode-1" ... "TestGroup/myNode-3" + assert len(ctx_net.nodes) == 3 + for i in range(1, 4): + name = f"TestGroup/myNode-{i}" + assert name in ctx_net.nodes + node = ctx_net.nodes[name] + assert node.attrs["coords"] == [1, 2] + assert node.attrs["type"] == "node" + + +def test_expand_group_blueprint(): + """ + Tests _expand_group referencing a blueprint (basic subgroups + adjacency). + We'll create a blueprint 'bp1' with one subgroup and adjacency, then reference it from group 'Main'. + """ + bp = Blueprint( + name="bp1", + groups={ + "leaf": {"node_count": 2}, + }, + adjacency=[ + { + "source": "/leaf", + "target": "/leaf", + "pattern": "mesh", + } + ], + ) + ctx_net = Network() + ctx = DSLExpansionContext(blueprints={"bp1": bp}, network=ctx_net) + + # group_def referencing the blueprint + group_def = { + "use_blueprint": "bp1", + "coords": [10, 20], + } + _expand_group( + ctx, + parent_path="", + group_name="Main", + group_def=group_def, + ) + + # This expands 2 leaf nodes => "Main/leaf/leaf-1", "Main/leaf/leaf-2" + # plus adjacency => single link (leaf-1 <-> leaf-2) due to mesh + dedup + assert len(ctx_net.nodes) == 2 + assert "Main/leaf/leaf-1" in ctx_net.nodes + assert "Main/leaf/leaf-2" in ctx_net.nodes + # coords should be carried over + assert ctx_net.nodes["Main/leaf/leaf-1"].attrs["coords"] == [10, 20] + + # adjacency => mesh => 1 unique link + assert len(ctx_net.links) == 1 + link = next(iter(ctx_net.links.values())) + sources_targets = {link.source, link.target} + assert sources_targets == {"Main/leaf/leaf-1", "Main/leaf/leaf-2"} + + +def test_expand_group_blueprint_with_params(): + """ + Tests _expand_group with blueprint usage and parameter overrides. + """ + bp = Blueprint( + name="bp1", + groups={ + "leaf": { + "node_count": 2, + "name_template": "leafy-{node_num}", + "attrs": {"role": "old"}, + }, + }, + adjacency=[], + ) + ctx_net = Network() + ctx = DSLExpansionContext(blueprints={"bp1": bp}, network=ctx_net) + + group_def = { + "use_blueprint": "bp1", + "parameters": { + # Overriding the name_template for the subgroup 'leaf' + "leaf.name_template": "newleaf-{node_num}", + "leaf.attrs.role": "updated", + }, + } + _expand_group( + ctx, + parent_path="ZoneA", + group_name="Main", + group_def=group_def, + ) + + # We expect 2 nodes => "ZoneA/Main/leaf/newleaf-1" and "...-2" + # plus the updated role attribute + assert len(ctx_net.nodes) == 2 + n1_name = "ZoneA/Main/leaf/newleaf-1" + n2_name = "ZoneA/Main/leaf/newleaf-2" + assert n1_name in ctx_net.nodes + assert n2_name in ctx_net.nodes + assert ctx_net.nodes[n1_name].attrs["role"] == "updated" + assert ctx_net.nodes[n2_name].attrs["role"] == "updated" + + +def test_expand_group_blueprint_unknown(): + """ + Tests _expand_group with a reference to an unknown blueprint -> ValueError. + """ + ctx_net = Network() + ctx = DSLExpansionContext(blueprints={}, network=ctx_net) + + group_def = { + "use_blueprint": "non_existent", + } + with pytest.raises(ValueError) as exc: + _expand_group( + ctx, + parent_path="", + group_name="Test", + group_def=group_def, + ) + assert "unknown blueprint 'non_existent'" in str(exc.value) + + +def test_update_nodes(): + """ + Tests _update_nodes to ensure it updates matching node attributes in bulk. + """ + net = Network() + net.add_node(Node("N1", attrs={"foo": "old"})) + net.add_node(Node("N2", attrs={"foo": "old"})) + net.add_node(Node("M1", attrs={"foo": "unchanged"})) + + # We only want to update nodes whose path matches "N" + _update_nodes(net, "N", {"hw_type": "X100", "foo": "new"}) + + # N1, N2 should get updated + assert net.nodes["N1"].attrs["hw_type"] == "X100" + assert net.nodes["N1"].attrs["foo"] == "new" + assert net.nodes["N2"].attrs["hw_type"] == "X100" + assert net.nodes["N2"].attrs["foo"] == "new" + + # M1 remains unchanged + assert "hw_type" not in net.nodes["M1"].attrs + assert net.nodes["M1"].attrs["foo"] == "unchanged" + + +def test_update_links(): + """ + Tests _update_links to ensure it updates matching links in bulk. + """ + net = Network() + net.add_node(Node("S1")) + net.add_node(Node("S2")) + net.add_node(Node("T1")) + net.add_node(Node("T2")) + + # Create some links + net.add_link(Link("S1", "T1")) + net.add_link(Link("S2", "T2")) + net.add_link(Link("T1", "S2")) # reversed direction + + # Update all links from S->T with capacity=999 + _update_links(net, "S", "T", {"capacity": 999}) + + # The link S1->T1 is updated + link_st = [l for l in net.links.values() if l.source == "S1" and l.target == "T1"] + assert link_st[0].capacity == 999 + + link_st2 = [l for l in net.links.values() if l.source == "S2" and l.target == "T2"] + assert link_st2[0].capacity == 999 + + # The reversed link T1->S2 also matches if any_direction is True by default + link_ts = [l for l in net.links.values() if l.source == "T1" and l.target == "S2"] + assert link_ts[0].capacity == 999 + + +def test_update_links_any_direction_false(): + """ + Tests _update_links with any_direction=False to ensure reversed links are NOT updated. + """ + net = Network() + net.add_node(Node("S1")) + net.add_node(Node("T1")) + + # Create forward and reversed links + fwd_link = Link("S1", "T1", capacity=10) + rev_link = Link("T1", "S1", capacity=10) + net.add_link(fwd_link) + net.add_link(rev_link) + + # Update only S->T direction + _update_links(net, "S", "T", {"capacity": 999}, any_direction=False) + + # Only the forward link is updated + assert net.links[fwd_link.id].capacity == 999 + assert net.links[rev_link.id].capacity == 10 + + +def test_process_node_overrides(): + """ + Tests _process_node_overrides to verify node attributes get updated + based on the DSL's node_overrides block. + """ + net = Network() + net.add_node(Node("A/1")) + net.add_node(Node("A/2")) + net.add_node(Node("B/1")) + + network_data = { + "node_overrides": [ + { + "path": "A", # matches "A/1" and "A/2" + "attrs": {"optics_type": "SR4", "shared_risk_group": "SRG1"}, + } + ] + } + _process_node_overrides(net, network_data) + + # "A/1" and "A/2" should be updated + assert net.nodes["A/1"].attrs["optics_type"] == "SR4" + assert net.nodes["A/1"].attrs["shared_risk_group"] == "SRG1" + assert net.nodes["A/2"].attrs["optics_type"] == "SR4" + assert net.nodes["A/2"].attrs["shared_risk_group"] == "SRG1" + + # "B/1" remains unchanged + assert "optics_type" not in net.nodes["B/1"].attrs + assert "shared_risk_group" not in net.nodes["B/1"].attrs + + +def test_process_link_overrides(): + """ + Tests _process_link_overrides to verify link attributes get updated + based on the DSL's link_overrides block. + """ + net = Network() + net.add_node(Node("A/1")) + net.add_node(Node("A/2")) + net.add_node(Node("B/1")) + + net.add_link(Link("A/1", "A/2", attrs={"color": "red"})) + net.add_link(Link("A/1", "B/1")) + + network_data = { + "link_overrides": [ + { + "source": "A/1", + "target": "A/2", + "link_params": {"capacity": 123, "attrs": {"color": "blue"}}, + } + ] + } + + _process_link_overrides(net, network_data) + + # Only the link A/1->A/2 is updated + link1 = [l for l in net.links.values() if l.source == "A/1" and l.target == "A/2"][ + 0 + ] + assert link1.capacity == 123 + assert link1.attrs["color"] == "blue" + + # The other link remains unmodified + link2 = [l for l in net.links.values() if l.source == "A/1" and l.target == "B/1"][ + 0 + ] + assert link2.capacity == 1.0 # default + assert "color" not in link2.attrs def test_minimal_no_blueprints(): @@ -182,8 +859,7 @@ def test_adjacency_one_to_one(): # 4 total nodes assert len(net.nodes) == 4 - # one_to_one => 2 total links => (GroupA/GroupA-1->GroupB/GroupB-1, GroupA/GroupA-2->GroupB/GroupB-2) - assert len(net.links) == 2 + # one_to_one => 2 total links link_names = {(l.source, l.target) for l in net.links.values()} expected_links = { ("GroupA/GroupA-1", "GroupB/GroupB-1"), @@ -256,7 +932,7 @@ def test_adjacency_mesh(): # 4 total nodes assert len(net.nodes) == 4 - # mesh => (Left-1->Right-1), (Left-1->Right-2), (Left-2->Right-1), (Left-2->Right-2) => 4 unique links + # mesh => 4 unique links assert len(net.links) == 4 for link in net.links.values(): assert link.cost == 5 @@ -293,9 +969,7 @@ def test_fallback_prefix_behavior(): assert len(net.nodes) == 1 assert "FallbackGroup/FallbackGroup-1" in net.nodes - # If we skip self-loops for "one_to_one", we get 0 links. - # If your code doesn't skip self-loops in "one_to_one", you'll get 1 link. - # Adjust as needed: + # "one_to_one" with a single node => skipping self-loops => 0 links assert len(net.links) == 0 diff --git a/tests/test_blueprints_helpers.py b/tests/test_blueprints_helpers.py deleted file mode 100644 index 7e3ed0a..0000000 --- a/tests/test_blueprints_helpers.py +++ /dev/null @@ -1,625 +0,0 @@ -import pytest -from ngraph.network import Network, Node, Link - -from ngraph.blueprints import ( - DSLExpansionContext, - Blueprint, - _apply_parameters, - _join_paths, - _create_link, - _expand_adjacency_pattern, - _process_direct_nodes, - _process_direct_links, - _expand_blueprint_adjacency, - _expand_adjacency, - _expand_group, - _update_nodes, - _update_links, - _process_node_overrides, - _process_link_overrides, -) - - -def test_join_paths(): - """ - Tests _join_paths for correct handling of leading slash, parent/child combinations, etc. - """ - # No parent path, no slash - assert _join_paths("", "SFO") == "SFO" - # No parent path, child with leading slash => "SFO" - assert _join_paths("", "/SFO") == "SFO" - # Parent path plus child => "SEA/leaf" - assert _join_paths("SEA", "leaf") == "SEA/leaf" - # Parent path plus leading slash => "SEA/leaf" - assert _join_paths("SEA", "/leaf") == "SEA/leaf" - - -def test_apply_parameters(): - """ - Tests _apply_parameters to ensure user-provided overrides get applied - to the correct subgroup fields. - """ - original_def = { - "node_count": 4, - "name_template": "spine-{node_num}", - "other_attr": True, - } - params = { - # Overwrite node_count for 'spine' - "spine.node_count": 6, - # Overwrite name_template for 'spine' - "spine.name_template": "myspine-{node_num}", - # Overwrite a non-existent param => ignored - "leaf.node_count": 10, - } - updated = _apply_parameters("spine", original_def, params) - assert updated["node_count"] == 6 - assert updated["name_template"] == "myspine-{node_num}" - # Check that we preserved "other_attr" - assert updated["other_attr"] is True - # Check that there's no spurious new key - assert len(updated) == 3, f"Unexpected keys: {updated.keys()}" - - -def test_create_link(): - """ - Tests _create_link to verify creation and insertion into a Network. - """ - net = Network() - net.add_node(Node("A")) - net.add_node(Node("B")) - - _create_link(net, "A", "B", {"capacity": 50, "cost": 5, "attrs": {"color": "red"}}) - - assert len(net.links) == 1 - link_obj = list(net.links.values())[0] - assert link_obj.source == "A" - assert link_obj.target == "B" - assert link_obj.capacity == 50 - assert link_obj.cost == 5 - assert link_obj.attrs["color"] == "red" - - -def test_create_link_multiple(): - """ - Tests _create_link with link_count=2 to ensure multiple parallel links are created. - """ - net = Network() - net.add_node(Node("A")) - net.add_node(Node("B")) - - _create_link( - net, - "A", - "B", - {"capacity": 10, "cost": 1, "attrs": {"color": "green"}}, - link_count=2, - ) - - assert len(net.links) == 2 - for link_obj in net.links.values(): - assert link_obj.source == "A" - assert link_obj.target == "B" - assert link_obj.capacity == 10 - assert link_obj.cost == 1 - assert link_obj.attrs["color"] == "green" - - -def test_expand_adjacency_pattern_one_to_one(): - """ - Tests _expand_adjacency_pattern in 'one_to_one' mode for a simple 2:2 case. - Should produce pairs: (S1->T1), (S2->T2). - """ - ctx_net = Network() - ctx_net.add_node(Node("S1")) - ctx_net.add_node(Node("S2")) - ctx_net.add_node(Node("T1")) - ctx_net.add_node(Node("T2")) - - ctx = DSLExpansionContext(blueprints={}, network=ctx_net) - - _expand_adjacency_pattern(ctx, "S", "T", "one_to_one", {"capacity": 10}) - # We expect 2 links: S1->T1, S2->T2 - assert len(ctx_net.links) == 2 - # Confirm the pairs - pairs = {(l.source, l.target) for l in ctx_net.links.values()} - assert pairs == {("S1", "T1"), ("S2", "T2")} - - # Also confirm the capacity - for l in ctx_net.links.values(): - assert l.capacity == 10 - - -def test_expand_adjacency_pattern_one_to_one_wrap(): - """ - Tests 'one_to_one' with wrapping case: e.g., 4 vs 2. (both sides a multiple). - => S1->T1, S2->T2, S3->T1, S4->T2 => total 4 links. - """ - ctx_net = Network() - # 4 source nodes - ctx_net.add_node(Node("S1")) - ctx_net.add_node(Node("S2")) - ctx_net.add_node(Node("S3")) - ctx_net.add_node(Node("S4")) - # 2 target nodes - ctx_net.add_node(Node("T1")) - ctx_net.add_node(Node("T2")) - - ctx = DSLExpansionContext({}, ctx_net) - - _expand_adjacency_pattern(ctx, "S", "T", "one_to_one", {"cost": 99}) - # Expect 4 total links - assert len(ctx_net.links) == 4 - # Check the actual pairs - pairs = {(l.source, l.target) for l in ctx_net.links.values()} - expected = { - ("S1", "T1"), - ("S2", "T2"), - ("S3", "T1"), - ("S4", "T2"), - } - assert pairs == expected - for l in ctx_net.links.values(): - assert l.cost == 99 - - -def test_expand_adjacency_pattern_one_to_one_mismatch(): - """ - Tests 'one_to_one' with a mismatch (3 vs 2) => raises a ValueError - since 3 % 2 != 0. - """ - ctx_net = Network() - # 3 sources, 2 targets - ctx_net.add_node(Node("S1")) - ctx_net.add_node(Node("S2")) - ctx_net.add_node(Node("S3")) - ctx_net.add_node(Node("T1")) - ctx_net.add_node(Node("T2")) - - ctx = DSLExpansionContext({}, ctx_net) - - with pytest.raises(ValueError) as exc: - _expand_adjacency_pattern(ctx, "S", "T", "one_to_one", {}) - # Our error text checks - assert "requires sizes with a multiple factor" in str(exc.value) - - -def test_expand_adjacency_pattern_mesh(): - """ - Tests _expand_adjacency_pattern in 'mesh' mode: all-to-all links among matched nodes, - skipping self-loops and deduplicating reversed pairs. - """ - ctx_net = Network() - ctx_net.add_node(Node("X1")) - ctx_net.add_node(Node("X2")) - ctx_net.add_node(Node("Y1")) - ctx_net.add_node(Node("Y2")) - - ctx = DSLExpansionContext({}, ctx_net) - - # mesh => X1,X2 => Y1,Y2 => 4 links total - _expand_adjacency_pattern(ctx, "X", "Y", "mesh", {"capacity": 99}) - assert len(ctx_net.links) == 4 - for link in ctx_net.links.values(): - assert link.capacity == 99 - - -def test_expand_adjacency_pattern_mesh_link_count(): - """ - Tests 'mesh' mode with link_count=2 to ensure multiple parallel links are created per pairing. - """ - ctx_net = Network() - ctx_net.add_node(Node("A1")) - ctx_net.add_node(Node("A2")) - ctx_net.add_node(Node("B1")) - ctx_net.add_node(Node("B2")) - - ctx = DSLExpansionContext({}, ctx_net) - - _expand_adjacency_pattern(ctx, "A", "B", "mesh", {"attrs": {"color": "purple"}}, 2) - # A1->B1, A1->B2, A2->B1, A2->B2 => each repeated 2 times => 8 total links - assert len(ctx_net.links) == 8 - for link in ctx_net.links.values(): - assert link.attrs.get("color") == "purple" - - -def test_process_direct_nodes(): - """ - Tests _process_direct_nodes to ensure direct node creation works. - Existing nodes are not overwritten. - """ - net = Network() - net.add_node(Node("Existing")) - - network_data = { - "nodes": { - "New1": {"foo": "bar"}, - "Existing": { - "override": "ignored" - }, # This won't be merged since node already exists - }, - } - - _process_direct_nodes(net, network_data) - - # "New1" was created - assert "New1" in net.nodes - assert net.nodes["New1"].attrs["foo"] == "bar" - # "Existing" was not overwritten - assert "override" not in net.nodes["Existing"].attrs - - -def test_process_direct_links(): - """ - Tests _process_direct_links to ensure direct link creation works. - """ - net = Network() - net.add_node(Node("Existing1")) - net.add_node(Node("Existing2")) - - network_data = { - "links": [ - { - "source": "Existing1", - "target": "Existing2", - "link_params": {"capacity": 5}, - } - ], - } - - _process_direct_links(net, network_data) - - # Confirm that links were created - assert len(net.links) == 1 - link = next(iter(net.links.values())) - assert link.source == "Existing1" - assert link.target == "Existing2" - assert link.capacity == 5 - - -def test_process_direct_links_link_count(): - """ - Tests _process_direct_links with link_count > 1 to ensure multiple parallel links. - """ - net = Network() - net.add_node(Node("N1")) - net.add_node(Node("N2")) - - network_data = { - "links": [ - { - "source": "N1", - "target": "N2", - "link_params": {"capacity": 20}, - "link_count": 3, - } - ] - } - _process_direct_links(net, network_data) - - assert len(net.links) == 3 - for link_obj in net.links.values(): - assert link_obj.capacity == 20 - assert link_obj.source == "N1" - assert link_obj.target == "N2" - - -def test_expand_blueprint_adjacency(): - """ - Tests _expand_blueprint_adjacency: verifying that relative paths inside a blueprint - are joined with parent_path, then expanded as normal adjacency. - """ - ctx_net = Network() - ctx_net.add_node(Node("Parent/leaf-1")) - ctx_net.add_node(Node("Parent/leaf-2")) - ctx_net.add_node(Node("Parent/spine-1")) - - ctx = DSLExpansionContext({}, ctx_net) - - adj_def = { - "source": "/leaf-1", - "target": "/spine-1", - "pattern": "mesh", - "link_params": {"cost": 999}, - } - # parent_path => "Parent" - _expand_blueprint_adjacency(ctx, adj_def, "Parent") - - # Only "Parent/leaf-1" matches the source path => single source node, - # "Parent/spine-1" => single target node => 1 link - assert len(ctx_net.links) == 1 - link = next(iter(ctx_net.links.values())) - assert link.source == "Parent/leaf-1" - assert link.target == "Parent/spine-1" - assert link.cost == 999 - - -def test_expand_adjacency(): - """ - Tests _expand_adjacency for a top-level adjacency definition (non-blueprint), - verifying that leading '/' is stripped and used to find nodes in the global context. - """ - ctx_net = Network() - ctx_net.add_node(Node("Global/A1")) - ctx_net.add_node(Node("Global/B1")) - - ctx = DSLExpansionContext({}, ctx_net) - - # adjacency => "one_to_one" with /Global/A1 -> /Global/B1 - adj_def = { - "source": "/Global/A1", - "target": "/Global/B1", - "pattern": "one_to_one", - "link_params": {"capacity": 10}, - } - _expand_adjacency(ctx, adj_def) - - # single pairing => A1 -> B1 - assert len(ctx_net.links) == 1 - link = next(iter(ctx_net.links.values())) - assert link.source == "Global/A1" - assert link.target == "Global/B1" - assert link.capacity == 10 - - -def test_expand_group_direct(): - """ - Tests _expand_group for a direct node group (no use_blueprint), - ensuring node_count and name_template usage. - """ - ctx_net = Network() - ctx = DSLExpansionContext({}, ctx_net) - - group_def = { - "node_count": 3, - "name_template": "myNode-{node_num}", - "coords": [1, 2], - } - _expand_group(ctx, parent_path="", group_name="TestGroup", group_def=group_def) - - # Expect 3 nodes => "TestGroup/myNode-1" ... "TestGroup/myNode-3" - assert len(ctx_net.nodes) == 3 - for i in range(1, 4): - name = f"TestGroup/myNode-{i}" - assert name in ctx_net.nodes - node = ctx_net.nodes[name] - assert node.attrs["coords"] == [1, 2] - assert node.attrs["type"] == "node" - - -def test_expand_group_blueprint(): - """ - Tests _expand_group referencing a blueprint (basic subgroups + adjacency). - We'll create a blueprint 'bp1' with one subgroup and adjacency, then reference it from group 'Main'. - """ - bp = Blueprint( - name="bp1", - groups={ - "leaf": {"node_count": 2}, - }, - adjacency=[ - { - "source": "/leaf", - "target": "/leaf", - "pattern": "mesh", - } - ], - ) - ctx_net = Network() - ctx = DSLExpansionContext(blueprints={"bp1": bp}, network=ctx_net) - - # group_def referencing the blueprint - group_def = { - "use_blueprint": "bp1", - "coords": [10, 20], - } - _expand_group( - ctx, - parent_path="", - group_name="Main", - group_def=group_def, - blueprint_expansion=False, - ) - - # This expands 2 leaf nodes => "Main/leaf/leaf-1", "Main/leaf/leaf-2" - # plus adjacency => single link (leaf-1 <-> leaf-2) due to mesh + dedup - assert len(ctx_net.nodes) == 2 - assert "Main/leaf/leaf-1" in ctx_net.nodes - assert "Main/leaf/leaf-2" in ctx_net.nodes - # coords should be carried over - assert ctx_net.nodes["Main/leaf/leaf-1"].attrs["coords"] == [10, 20] - - # adjacency => mesh => 1 unique link - assert len(ctx_net.links) == 1 - link = next(iter(ctx_net.links.values())) - sources_targets = {link.source, link.target} - assert sources_targets == {"Main/leaf/leaf-1", "Main/leaf/leaf-2"} - - -def test_expand_group_blueprint_with_params(): - """ - Tests _expand_group with blueprint usage and parameter overrides. - """ - bp = Blueprint( - name="bp1", - groups={ - "leaf": { - "node_count": 2, - "name_template": "leafy-{node_num}", - "node_attrs": {"role": "old"}, - }, - }, - adjacency=[], - ) - ctx_net = Network() - ctx = DSLExpansionContext(blueprints={"bp1": bp}, network=ctx_net) - - group_def = { - "use_blueprint": "bp1", - "parameters": { - # Overriding the name_template for the subgroup 'leaf' - "leaf.name_template": "newleaf-{node_num}", - "leaf.node_attrs.role": "updated", - }, - } - _expand_group( - ctx, - parent_path="ZoneA", - group_name="Main", - group_def=group_def, - blueprint_expansion=False, - ) - - # We expect 2 nodes => "ZoneA/Main/leaf/newleaf-1" and "...-2" - # plus the updated role attribute - assert len(ctx_net.nodes) == 2 - n1_name = "ZoneA/Main/leaf/newleaf-1" - n2_name = "ZoneA/Main/leaf/newleaf-2" - assert n1_name in ctx_net.nodes - assert n2_name in ctx_net.nodes - assert ctx_net.nodes[n1_name].attrs["role"] == "updated" - assert ctx_net.nodes[n2_name].attrs["role"] == "updated" - - -def test_expand_group_blueprint_unknown(): - """ - Tests _expand_group with a reference to an unknown blueprint -> ValueError. - """ - ctx_net = Network() - ctx = DSLExpansionContext(blueprints={}, network=ctx_net) - - group_def = { - "use_blueprint": "non_existent", - } - with pytest.raises(ValueError) as exc: - _expand_group( - ctx, - parent_path="", - group_name="Test", - group_def=group_def, - ) - assert "unknown blueprint 'non_existent'" in str(exc.value) - - -def test_update_nodes(): - """ - Tests _update_nodes to ensure it updates matching node attributes in bulk. - """ - net = Network() - net.add_node(Node("N1", attrs={"foo": "old"})) - net.add_node(Node("N2", attrs={"foo": "old"})) - net.add_node(Node("M1", attrs={"foo": "unchanged"})) - - # We only want to update nodes whose path matches "N" - _update_nodes(net, "N", {"hw_type": "X100", "foo": "new"}) - - # N1, N2 should get updated - assert net.nodes["N1"].attrs["hw_type"] == "X100" - assert net.nodes["N1"].attrs["foo"] == "new" - assert net.nodes["N2"].attrs["hw_type"] == "X100" - assert net.nodes["N2"].attrs["foo"] == "new" - - # M1 remains unchanged - assert "hw_type" not in net.nodes["M1"].attrs - assert net.nodes["M1"].attrs["foo"] == "unchanged" - - -def test_update_links(): - """ - Tests _update_links to ensure it updates matching links in bulk. - """ - net = Network() - net.add_node(Node("S1")) - net.add_node(Node("S2")) - net.add_node(Node("T1")) - net.add_node(Node("T2")) - - # Create some links - net.add_link(Link("S1", "T1")) - net.add_link(Link("S2", "T2")) - net.add_link(Link("T1", "S2")) # reversed direction - - # Update all links from S->T with capacity=999 - _update_links(net, "S", "T", {"capacity": 999}) - - # The link S1->T1 is updated - link_st = [l for l in net.links.values() if l.source == "S1" and l.target == "T1"] - assert link_st[0].capacity == 999 - - link_st2 = [l for l in net.links.values() if l.source == "S2" and l.target == "T2"] - assert link_st2[0].capacity == 999 - - # The reversed link T1->S2 also matches if any_direction is True by default - link_ts = [l for l in net.links.values() if l.source == "T1" and l.target == "S2"] - assert link_ts[0].capacity == 999 - - -def test_process_node_overrides(): - """ - Tests _process_node_overrides to verify node attributes get updated - based on the DSL's node_overrides block. - """ - net = Network() - net.add_node(Node("A/1")) - net.add_node(Node("A/2")) - net.add_node(Node("B/1")) - - network_data = { - "node_overrides": [ - { - "path": "A", # matches "A/1" and "A/2" - "attrs": {"optics_type": "SR4", "shared_risk_group": "SRG1"}, - } - ] - } - _process_node_overrides(net, network_data) - - # "A/1" and "A/2" should be updated - assert net.nodes["A/1"].attrs["optics_type"] == "SR4" - assert net.nodes["A/1"].attrs["shared_risk_group"] == "SRG1" - assert net.nodes["A/2"].attrs["optics_type"] == "SR4" - assert net.nodes["A/2"].attrs["shared_risk_group"] == "SRG1" - - # "B/1" remains unchanged - assert "optics_type" not in net.nodes["B/1"].attrs - assert "shared_risk_group" not in net.nodes["B/1"].attrs - - -def test_process_link_overrides(): - """ - Tests _process_link_overrides to verify link attributes get updated - based on the DSL's link_overrides block. - """ - net = Network() - net.add_node(Node("A/1")) - net.add_node(Node("A/2")) - net.add_node(Node("B/1")) - - net.add_link(Link("A/1", "A/2", attrs={"color": "red"})) - net.add_link(Link("A/1", "B/1")) - - network_data = { - "link_overrides": [ - { - "source": "A/1", - "target": "A/2", - "link_params": {"capacity": 123, "attrs": {"color": "blue"}}, - } - ] - } - - _process_link_overrides(net, network_data) - - # Only the link A/1->A/2 is updated - link1 = [l for l in net.links.values() if l.source == "A/1" and l.target == "A/2"][ - 0 - ] - assert link1.capacity == 123 - assert link1.attrs["color"] == "blue" - - # The other link remains unmodified - link2 = [l for l in net.links.values() if l.source == "A/1" and l.target == "B/1"][ - 0 - ] - assert link2.capacity == 1.0 # default - assert "color" not in link2.attrs diff --git a/tests/test_components.py b/tests/test_components.py new file mode 100644 index 0000000..241fa63 --- /dev/null +++ b/tests/test_components.py @@ -0,0 +1,289 @@ +import pytest +from copy import deepcopy +from typing import Dict + +from ngraph.components import Component, ComponentsLibrary + + +def test_component_creation() -> None: + """ + Test that a Component can be created with the correct attributes. + """ + comp = Component( + name="TestComp", + component_type="linecard", + cost=100.0, + power_watts=50.0, + ports=24, + ) + assert comp.name == "TestComp" + assert comp.component_type == "linecard" + assert comp.cost == 100.0 + assert comp.power_watts == 50.0 + assert comp.ports == 24 + assert comp.children == {} + + +def test_component_total_cost_and_power_no_children() -> None: + """ + Test total_cost and total_power with no child components. + """ + comp = Component(name="Solo", cost=200.0, power_watts=10.0) + assert comp.total_cost() == 200.0 + assert comp.total_power() == 10.0 + + +def test_component_total_cost_and_power_with_children() -> None: + """ + Test total_cost and total_power with nested child components. + """ + child1 = Component(name="Child1", cost=50.0, power_watts=5.0) + child2 = Component(name="Child2", cost=20.0, power_watts=2.0) + parent = Component( + name="Parent", + cost=100.0, + power_watts=10.0, + children={"Child1": child1, "Child2": child2}, + ) + + assert parent.total_cost() == 100.0 + 50.0 + 20.0 + assert parent.total_power() == 10.0 + 5.0 + 2.0 + + +def test_component_as_dict() -> None: + """ + Test that as_dict returns a dictionary with correct fields, + and that we can exclude child data if desired. + """ + child = Component(name="Child", cost=10.0) + parent = Component( + name="Parent", + cost=100.0, + power_watts=25.0, + children={"Child": child}, + attrs={"location": "rack1"}, + ) + + # Include children + parent_dict_incl = parent.as_dict(include_children=True) + assert parent_dict_incl["name"] == "Parent" + assert parent_dict_incl["cost"] == 100.0 + assert parent_dict_incl["power_watts"] == 25.0 + assert parent_dict_incl["attrs"]["location"] == "rack1" + assert "children" in parent_dict_incl + assert len(parent_dict_incl["children"]) == 1 + assert parent_dict_incl["children"]["Child"]["name"] == "Child" + assert parent_dict_incl["children"]["Child"]["cost"] == 10.0 + + # Exclude children + parent_dict_excl = parent.as_dict(include_children=False) + assert parent_dict_excl["name"] == "Parent" + assert "children" not in parent_dict_excl + + +def test_components_library_empty() -> None: + """ + Test initializing an empty ComponentsLibrary. + """ + lib = ComponentsLibrary() + assert isinstance(lib.components, dict) + assert len(lib.components) == 0 + + +def test_components_library_get() -> None: + """ + Test that retrieving a component by name returns the correct component, + or None if not found. + """ + comp_a = Component("CompA", cost=10.0) + comp_b = Component("CompB", cost=20.0) + lib = ComponentsLibrary(components={"CompA": comp_a, "CompB": comp_b}) + + assert lib.get("CompA") is comp_a + assert lib.get("CompB") is comp_b + assert lib.get("Missing") is None + + +def test_components_library_merge_override_true() -> None: + """ + Test merging two libraries with override=True. + Components with duplicate names in 'other' should overwrite the original. + """ + original_comp = Component("Overlap", cost=100.0) + lib1 = ComponentsLibrary( + components={ + "Overlap": original_comp, + "UniqueLib1": Component("UniqueLib1", cost=50.0), + } + ) + + new_comp = Component("Overlap", cost=200.0) + lib2 = ComponentsLibrary( + components={ + "Overlap": new_comp, + "UniqueLib2": Component("UniqueLib2", cost=75.0), + } + ) + + lib1.merge(lib2, override=True) + # The "Overlap" component should now be the one from lib2 (cost=200). + assert lib1.get("Overlap") is new_comp + # The new library should also include the previously missing component. + assert "UniqueLib2" in lib1.components + # The old unique component remains. + assert "UniqueLib1" in lib1.components + + +def test_components_library_merge_override_false() -> None: + """ + Test merging two libraries with override=False. + Original components should remain in case of a name clash. + """ + original_comp = Component("Overlap", cost=100.0) + lib1 = ComponentsLibrary( + components={ + "Overlap": original_comp, + "UniqueLib1": Component("UniqueLib1", cost=50.0), + } + ) + + new_comp = Component("Overlap", cost=200.0) + lib2 = ComponentsLibrary( + components={ + "Overlap": new_comp, + "UniqueLib2": Component("UniqueLib2", cost=75.0), + } + ) + + lib1.merge(lib2, override=False) + # The "Overlap" component should remain the original_comp (cost=100). + assert lib1.get("Overlap") is original_comp + # The new library should also include the previously missing component. + assert "UniqueLib2" in lib1.components + + +def test_components_library_clone() -> None: + """ + Test that clone() creates a deep copy of the library. + """ + comp_a = Component("CompA", cost=10.0) + comp_b = Component("CompB", cost=20.0) + original = ComponentsLibrary(components={"CompA": comp_a, "CompB": comp_b}) + clone_lib = original.clone() + + assert clone_lib is not original + assert clone_lib.components is not original.components + # The components should be deep-copied, meaning not the same references + assert clone_lib.get("CompA") is not original.get("CompA") + assert clone_lib.get("CompB") is not original.get("CompB") + + +def test_components_library_from_dict() -> None: + """ + Test building a ComponentsLibrary from a dictionary structure, + including nested child components. + """ + data = { + "BigSwitch": { + "component_type": "chassis", + "cost": 20000, + "power_watts": 1000, + "children": { + "LC-48x10G": { + "component_type": "linecard", + "cost": 5000, + "power_watts": 300, + "ports": 48, + } + }, + }, + "400G-LR4": {"component_type": "optic", "cost": 2000, "power_watts": 10}, + } + + lib = ComponentsLibrary.from_dict(data) + assert "BigSwitch" in lib.components + assert "400G-LR4" in lib.components + + big_switch = lib.get("BigSwitch") + assert big_switch is not None + assert big_switch.component_type == "chassis" + assert big_switch.total_cost() == 20000 + 5000 + assert big_switch.total_power() == 1000 + 300 + assert "LC-48x10G" in big_switch.children + + optic = lib.get("400G-LR4") + assert optic is not None + assert optic.component_type == "optic" + assert optic.cost == 2000 + assert optic.power_watts == 10 + + +def test_components_library_from_yaml_valid() -> None: + """ + Test building a ComponentsLibrary from a valid YAML string. + """ + yaml_str = """ +components: + MyChassis: + component_type: chassis + cost: 5000 + power_watts: 300 + MyOptic: + component_type: optic + cost: 200 + power_watts: 5 + """ + lib = ComponentsLibrary.from_yaml(yaml_str) + assert lib.get("MyChassis") is not None + assert lib.get("MyOptic") is not None + chassis = lib.get("MyChassis") + optic = lib.get("MyOptic") + assert chassis and chassis.cost == 5000 + assert chassis.power_watts == 300 + assert optic and optic.cost == 200 + assert optic.power_watts == 5 + + +def test_components_library_from_yaml_no_components_key() -> None: + """ + Test that from_yaml() can parse top-level YAML data without + a 'components' key. + """ + yaml_str = """ +MyChassis: + component_type: chassis + cost: 4000 + power_watts: 250 +""" + lib = ComponentsLibrary.from_yaml(yaml_str) + chassis = lib.get("MyChassis") + assert chassis is not None + assert chassis.cost == 4000 + assert chassis.power_watts == 250 + + +def test_components_library_from_yaml_invalid_top_level() -> None: + """ + Test that from_yaml() raises an error if the top-level is not a dict. + """ + yaml_str = """ +- name: NotADict + cost: 100 +""" + with pytest.raises(ValueError) as exc: + _ = ComponentsLibrary.from_yaml(yaml_str) + assert "Top-level must be a dict" in str(exc.value) + + +def test_components_library_from_yaml_invalid_components_type() -> None: + """ + Test that from_yaml() raises an error if 'components' is present + but is not a dict. + """ + yaml_str = """ +components: + - NotAValidDict: 1 +""" + with pytest.raises(ValueError) as exc: + _ = ComponentsLibrary.from_yaml(yaml_str) + assert "'components' must be a dict if present." in str(exc.value) diff --git a/tests/test_explorer.py b/tests/test_explorer.py new file mode 100644 index 0000000..a7316d1 --- /dev/null +++ b/tests/test_explorer.py @@ -0,0 +1,277 @@ +import pytest +import logging + +from ngraph.explorer import ( + NetworkExplorer, + TreeNode, + TreeStats, + ExternalLinkBreakdown, +) +from ngraph.network import Network, Node, Link +from ngraph.components import ComponentsLibrary, Component + + +def create_mock_components_library() -> ComponentsLibrary: + """Create a mock ComponentsLibrary containing sample components.""" + lib = ComponentsLibrary() + # Add a couple of known components for testing cost/power aggregation + lib.components["known_hw"] = Component( + name="known_hw", + cost=10.0, + power_watts=2.0, + ) + lib.components["optic_hw"] = Component( + name="optic_hw", + cost=5.0, + power_watts=1.0, + ) + return lib + + +@pytest.fixture +def caplog_info_level(): + """ + Pytest fixture to set the logger level to INFO and capture logs. + Ensures we can see warning messages in tests. + """ + logger = logging.getLogger("explorer") + old_level = logger.level + logger.setLevel(logging.INFO) + yield + logger.setLevel(old_level) + + +def test_explore_empty_network(): + """Test exploring an empty network (no nodes, no links).""" + network = Network() + explorer = NetworkExplorer.explore_network(network) + + assert explorer.root_node is not None + # Root node with no children, no stats + assert explorer.root_node.name == "root" + assert explorer.root_node.subtree_nodes == set() + assert explorer.root_node.stats.node_count == 0 + assert explorer.root_node.stats.internal_link_count == 0 + assert explorer.root_node.stats.external_link_count == 0 + assert explorer.root_node.stats.total_cost == 0 + assert explorer.root_node.stats.total_power == 0 + + +def test_explore_single_node_no_slash(): + """Test exploring a network with a single node that has no slashes in its name.""" + network = Network() + network.nodes["nodeA"] = Node(name="nodeA") + + explorer = NetworkExplorer.explore_network(network) + root = explorer.root_node + + assert root is not None + assert len(root.children) == 1 + child_node = next(iter(root.children.values())) + assert child_node.name == "nodeA" + assert child_node.subtree_nodes == {"nodeA"} + assert child_node.stats.node_count == 1 + + +def test_explore_single_node_with_slashes(): + """ + Test a single node whose name includes multiple slash segments. + Should build nested child TreeNodes under 'root'. + """ + network = Network() + network.nodes["dc1/plane1/ssw/ssw-1"] = Node(name="dc1/plane1/ssw/ssw-1") + + explorer = NetworkExplorer.explore_network(network) + root = explorer.root_node + + # root -> dc1 -> plane1 -> ssw -> ssw-1 + assert len(root.children) == 1 + dc1_node = root.children["dc1"] + assert len(dc1_node.children) == 1 + plane1_node = dc1_node.children["plane1"] + assert len(plane1_node.children) == 1 + ssw_node = plane1_node.children["ssw"] + assert len(ssw_node.children) == 1 + leaf = ssw_node.children["ssw-1"] + + # Check stats + assert leaf.subtree_nodes == {"dc1/plane1/ssw/ssw-1"} + assert leaf.stats.node_count == 1 + + +def test_explore_network_with_links(): + """ + Test a network with multiple nodes and links (internal + external), + verifying the stats are aggregated correctly. + """ + # Setup network + network = Network() + + # Create some nodes + # "dc1/plane1/ssw-1" and "dc1/plane1/ssw-2" share a common prefix, so they are in the same subtree + network.nodes["dc1/plane1/ssw-1"] = Node( + name="dc1/plane1/ssw-1", attrs={"hw_component": "known_hw"} + ) + network.nodes["dc1/plane1/ssw-2"] = Node(name="dc1/plane1/ssw-2") # no hw component + # "dc2/plane2/ssw-3" is in a different subtree + network.nodes["dc2/plane2/ssw-3"] = Node( + name="dc2/plane2/ssw-3", attrs={"hw_component": "unknown_hw"} + ) + + # Add links: one internal link (within dc1 subtree), one crossing subtree boundary + network.links["l1"] = Link( + source="dc1/plane1/ssw-1", + target="dc1/plane1/ssw-2", + capacity=100.0, + attrs={"hw_component": "optic_hw"}, + ) + network.links["l2"] = Link( + source="dc1/plane1/ssw-1", + target="dc2/plane2/ssw-3", + capacity=200.0, + ) + + # Explore + lib = create_mock_components_library() + explorer = NetworkExplorer.explore_network(network, components_library=lib) + root = explorer.root_node + assert root is not None + + # Validate that the hierarchy is built + dc1_node = root.children.get("dc1") + assert dc1_node is not None + plane1_node = dc1_node.children.get("plane1") + assert plane1_node is not None + ssw_1_node = plane1_node.children.get("ssw-1") + ssw_2_node = plane1_node.children.get("ssw-2") + assert ssw_1_node is not None + assert ssw_2_node is not None + + dc2_node = root.children.get("dc2") + assert dc2_node is not None + plane2_node = dc2_node.children.get("plane2") + assert plane2_node is not None + ssw_3_node = plane2_node.children.get("ssw-3") + assert ssw_3_node is not None + + # Check aggregated stats for the root + # By default, from the root's perspective, both links connect nodes in its subtree => both internal + assert root.stats.node_count == 3 + assert ( + root.stats.internal_link_count == 2 + ) # both links appear as internal at the root + assert root.stats.internal_link_capacity == 300.0 + assert root.stats.external_link_count == 0 + assert root.stats.external_link_capacity == 0.0 + assert root.stats.total_cost == 15.0 # 10 (node) + 5 (link) for known + assert root.stats.total_power == 3.0 # 2 (node) + 1 (link) + + # From dc1's perspective, the link to dc2 is external + dc1_subtree_node = dc1_node + assert dc1_subtree_node.stats.external_link_count == 1 + assert "dc2/plane2/ssw-3" in dc1_subtree_node.stats.external_link_details + assert ( + dc1_subtree_node.stats.external_link_details["dc2/plane2/ssw-3"].link_count == 1 + ) + assert ( + dc1_subtree_node.stats.external_link_details["dc2/plane2/ssw-3"].link_capacity + == 200.0 + ) + + +def test_unknown_hw_warnings(caplog, caplog_info_level): + """Test that unknown hw_component on nodes/links triggers a warning.""" + network = Network() + network.nodes["n1"] = Node(name="n1", attrs={"hw_component": "unknown_node_hw"}) + network.nodes["n2"] = Node(name="n2") + network.links["l1"] = Link( + source="n1", target="n2", attrs={"hw_component": "unknown_link_hw"} + ) + + lib = create_mock_components_library() + NetworkExplorer.explore_network(network, components_library=lib) + + # The aggregator can visit the same link/node multiple times at different levels, + # but for our test we only require that at least one unknown-node warning + # and one unknown-link warning appears in the logs: + warnings = [r.message for r in caplog.records if r.levelname == "WARNING"] + assert any("unknown_node_hw" in w for w in warnings) + assert any("unknown_link_hw" in w for w in warnings) + + +def test_compute_full_path_direct(): + """ + Test _compute_full_path on a small TreeNode chain, + ensuring 'root' is omitted from the final path. + """ + root = TreeNode(name="root") + dc1 = root.add_child("dc1") + plane1 = dc1.add_child("plane1") + ssw = plane1.add_child("ssw") + # Should produce: "dc1/plane1/ssw" + + explorer = NetworkExplorer(Network()) + path = explorer._compute_full_path(ssw) + assert path == "dc1/plane1/ssw" + + +def test_roll_up_if_leaf(): + """ + Test _roll_up_if_leaf to ensure it climbs up until a non-leaf node is found. + """ + net = Network() + net.nodes["dc1/plane1/ssw/ssw-1"] = Node(name="dc1/plane1/ssw/ssw-1") + explorer = NetworkExplorer.explore_network(net) + + # The path is "dc1/plane1/ssw/ssw-1". This is a leaf node, so we climb up + # until we find "ssw" isn't a leaf (it has one child), so we stop at "ssw". + rolled_path = explorer._roll_up_if_leaf("dc1/plane1/ssw/ssw-1") + assert rolled_path == "dc1/plane1/ssw" + + # Confirm that if we pass "dc1/plane1/ssw" (not a leaf), it stays the same + same_path = explorer._roll_up_if_leaf("dc1/plane1/ssw") + assert same_path == "dc1/plane1/ssw" + + +def test_print_tree_basic(capsys): + """ + Basic test of print_tree output with skip_leaves=False, detailed=False. + """ + network = Network() + network.nodes["n1"] = Node(name="n1") + network.nodes["n2"] = Node(name="n2") + explorer = NetworkExplorer.explore_network(network) + + explorer.print_tree() + captured = capsys.readouterr().out + + # Expect lines for root, n1, n2 + assert "root" in captured + assert "n1" in captured + assert "n2" in captured + + +def test_print_tree_options(capsys): + """ + Test printing with skip_leaves=True and detailed=True, ensuring coverage of those branches. + """ + network = Network() + network.nodes["dc1/plane1/ssw-1"] = Node(name="dc1/plane1/ssw-1") + network.nodes["dc1/plane1/ssw-2"] = Node(name="dc1/plane1/ssw-2") + # Make them internal link + network.links["l1"] = Link( + source="dc1/plane1/ssw-1", target="dc1/plane1/ssw-2", capacity=123.0 + ) + + explorer = NetworkExplorer.explore_network(network) + explorer.print_tree(skip_leaves=True, detailed=True) + captured = capsys.readouterr().out + + # skip_leaves=True -> leaf nodes (ssw-1, ssw-2) might be skipped if their parent isn't the root + # We expect 'plane1' printed, but not the individual leaf names if they are considered leaves + assert "ssw-1" not in captured + assert "ssw-2" not in captured + assert "plane1" in captured + + # 'detailed=True' prints 'IntLinkCap=' in the output + assert "IntLinkCap=123.0" in captured diff --git a/tests/test_scenario.py b/tests/test_scenario.py index 95200d0..bd60bd1 100644 --- a/tests/test_scenario.py +++ b/tests/test_scenario.py @@ -244,7 +244,7 @@ def test_scenario_from_yaml_valid(valid_scenario_yaml: str) -> None: # Check failure policy assert isinstance(scenario.failure_policy, FailurePolicy) assert len(scenario.failure_policy.rules) == 2, "Expected 2 rules in the policy." - # leftover fields (e.g. name, description) in policy.attrs + # leftover fields (e.g., name, description) in policy.attrs assert scenario.failure_policy.attrs.get("name") == "multi_rule_example" assert ( scenario.failure_policy.attrs.get("description")