def add_source(self, start: Node, stag: Optional[str], should_scatter) -> Edge: """ Add a connection :param start: :param stag: :param should_scatter: :return: """ from janis_core.workflow.workflow import StepNode stype = ( start.outputs()[stag] if stag is not None else first_value(start.outputs()) ).outtype ftype = ( self.finish.inputs()[self.ftag] if self.ftag is not None else first_value(self.finish.inputs()) ).intype start_is_scattered = isinstance(start, StepNode) and start.scatter is not None if start_is_scattered: Logger.log( f"This edge merges the inputs from '{full_dot(start, stag)}' for " f"'{full_dot(self.finish, self.ftag)}'" ) stype = Array(stype) if should_scatter: if not isinstance(stype, Array): raise Exception( f"Scatter was required for '{start.id()}.{stag} → '{self.finish.id()}.{self.ftag}' but " f"the input type was {type(stype).__name__} and not an array" ) stype = stype.subtype() if len(self.source_map) == 1 and start.id() not in self.source_map: self.multiple_inputs = True if not isinstance(ftype, Array): raise Exception( f"Adding multiple inputs to '{self.finish.id()}' and '{ftype.id()}' is not an array" ) if not isinstance(stype, Array) and isinstance(ftype, Array): # https://www.commonwl.org/user_guide/misc/#connect-a-solo-value-to-an-input-that-expects-an-array-of-that-type self.multiple_inputs = True e = Edge(start, stag, self.finish, self.ftag, should_scatter=should_scatter) self.source_map[start.id()] = e return e
def full_lbl(node: Node, tag: Optional[str]) -> str: if tag is None: return node.id() return f"{node.id()}/{tag}"