| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- from ray.dag import DAGNode
- from ray.util.annotations import DeveloperAPI
- @DeveloperAPI
- def get_dag_node_str(
- dag_node: DAGNode,
- body_line,
- ):
- indent = _get_indentation()
- other_args_to_resolve_lines = _get_other_args_to_resolve_lines(
- dag_node._bound_other_args_to_resolve
- )
- return (
- f"({dag_node.__class__.__name__}, {dag_node._stable_uuid})(\n"
- f"{indent}body={body_line}\n"
- f"{indent}args={_get_args_lines(dag_node._bound_args)}\n"
- f"{indent}kwargs={_get_kwargs_lines(dag_node._bound_kwargs)}\n"
- f"{indent}options={_get_options_lines(dag_node._bound_options)}\n"
- f"{indent}other_args_to_resolve={other_args_to_resolve_lines}\n"
- f")"
- )
- def _get_indentation(num_spaces=4):
- return " " * num_spaces
- def _get_args_lines(bound_args):
- """Pretty prints bounded args of a DAGNode, and recursively handle
- DAGNode in list / dict containers.
- """
- indent = _get_indentation()
- lines = []
- for arg in bound_args:
- if isinstance(arg, DAGNode):
- node_repr_lines = str(arg).split("\n")
- for node_repr_line in node_repr_lines:
- lines.append(f"{indent}" + node_repr_line)
- elif isinstance(arg, list):
- for ele in arg:
- node_repr_lines = str(ele).split("\n")
- for node_repr_line in node_repr_lines:
- lines.append(f"{indent}" + node_repr_line)
- elif isinstance(arg, dict):
- for _, val in arg.items():
- node_repr_lines = str(val).split("\n")
- for node_repr_line in node_repr_lines:
- lines.append(f"{indent}" + node_repr_line)
- # TODO: (jiaodong) Handle nested containers and other obj types
- else:
- lines.append(f"{indent}" + str(arg) + ", ")
- if len(lines) == 0:
- args_line = "[]"
- else:
- args_line = "["
- for args in lines:
- args_line += f"\n{indent}{args}"
- args_line += f"\n{indent}]"
- return args_line
- def _get_kwargs_lines(bound_kwargs):
- """Pretty prints bounded kwargs of a DAGNode, and recursively handle
- DAGNode in list / dict containers.
- """
- # TODO: (jiaodong) Nits, we're missing keys and indentation was a bit off.
- if not bound_kwargs:
- return "{}"
- indent = _get_indentation()
- kwargs_lines = []
- for key, val in bound_kwargs.items():
- if isinstance(val, DAGNode):
- node_repr_lines = str(val).split("\n")
- for index, node_repr_line in enumerate(node_repr_lines):
- if index == 0:
- kwargs_lines.append(
- f"{indent}{key}:" + f"{indent}" + node_repr_line
- )
- else:
- kwargs_lines.append(f"{indent}{indent}" + node_repr_line)
- elif isinstance(val, list):
- for ele in val:
- node_repr_lines = str(ele).split("\n")
- for node_repr_line in node_repr_lines:
- kwargs_lines.append(f"{indent}" + node_repr_line)
- elif isinstance(val, dict):
- for _, inner_val in val.items():
- node_repr_lines = str(inner_val).split("\n")
- for node_repr_line in node_repr_lines:
- kwargs_lines.append(f"{indent}" + node_repr_line)
- # TODO: (jiaodong) Handle nested containers and other obj types
- else:
- kwargs_lines.append(val)
- if len(kwargs_lines) > 0:
- kwargs_line = "{"
- for line in kwargs_lines:
- kwargs_line += f"\n{indent}{line}"
- kwargs_line += f"\n{indent}}}"
- else:
- kwargs_line = "{}"
- return kwargs_line
- def _get_options_lines(bound_options):
- """Pretty prints .options() in DAGNode. Only prints non-empty values."""
- if not bound_options:
- return "{}"
- indent = _get_indentation()
- options_lines = []
- for key, val in bound_options.items():
- if val:
- options_lines.append(f"{indent}{key}: " + str(val))
- options_line = "{"
- for line in options_lines:
- options_line += f"\n{indent}{line}"
- options_line += f"\n{indent}}}"
- return options_line
- def _get_other_args_to_resolve_lines(other_args_to_resolve):
- if not other_args_to_resolve:
- return "{}"
- indent = _get_indentation()
- other_args_to_resolve_lines = []
- for key, val in other_args_to_resolve.items():
- if isinstance(val, DAGNode):
- node_repr_lines = str(val).split("\n")
- for index, node_repr_line in enumerate(node_repr_lines):
- if index == 0:
- other_args_to_resolve_lines.append(
- f"{indent}{key}:"
- + f"{indent}"
- + "\n"
- + f"{indent}{indent}{indent}"
- + node_repr_line
- )
- else:
- other_args_to_resolve_lines.append(
- f"{indent}{indent}" + node_repr_line
- )
- else:
- other_args_to_resolve_lines.append(f"{indent}{key}: " + str(val))
- other_args_to_resolve_line = "{"
- for line in other_args_to_resolve_lines:
- other_args_to_resolve_line += f"\n{indent}{line}"
- other_args_to_resolve_line += f"\n{indent}}}"
- return other_args_to_resolve_line
|