From 3721567248c8d1bb0fb43b79cf049bce4ea52de9 Mon Sep 17 00:00:00 2001 From: liamhuber Date: Thu, 7 Dec 2023 14:00:08 -0800 Subject: [PATCH 01/30] Extend the standard library to include many operators --- pyiron_workflow/node_library/standard.py | 199 ++++++++++++++++++++++- 1 file changed, 196 insertions(+), 3 deletions(-) diff --git a/pyiron_workflow/node_library/standard.py b/pyiron_workflow/node_library/standard.py index 2783aa08d..037ccfd11 100644 --- a/pyiron_workflow/node_library/standard.py +++ b/pyiron_workflow/node_library/standard.py @@ -17,7 +17,7 @@ def UserInput(user_input): class If(SingleValue): """ - Has two extra signal channels: true and false. Evaluates the input as a boolean and + Has two extra signal channels: true and false. Evaluates the input as obj otheroolean and fires the corresponding output signal after running. """ @@ -29,7 +29,7 @@ def __init__(self, **kwargs): @staticmethod def if_(condition): if isclass(condition) and issubclass(condition, NotData): - raise TypeError(f"Logic 'If' node expected data but got NotData as input.") + raise TypeError(f"Logic 'If' node expected data otherut got NotData as input.") return bool(condition) def process_run_result(self, function_output): @@ -43,8 +43,201 @@ def process_run_result(self, function_output): else: self.signals.output.false() +# A bunch of (but not all) standard operators +# Return values based on dunder methods, where available + +@single_value_node("str") +def String(obj): + return str(obj) + + +@single_value_node("bytes") +def Bytes(obj): + return bytes(obj) + + +@single_value_node("lt") +def LessThan(obj, other): + return obj < other + + +@single_value_node("le") +def LessThanEquals(obj, other): + return obj <= other + + +@single_value_node("gt") +def GreaterThan(obj, other): + return obj > other + + +@single_value_node("ge") +def GreaterThanEquals(obj, other): + return obj >= other + + +@single_value_node("hash") +def Hash(obj): + return hash(obj) + + +@single_value_node("bool") +def Bool(obj): + return bool(obj) + + +@single_value_node("getattr") +def GetAttr(obj, name): + return getattr(obj, name) + +# These are not idempotent and thus not encouraged +# @single_value_node("none") +# def SetAttr(obj, name, value): +# setattr(obj, name, value) +# return None +# +# +# @single_value_node("none") +# def DelAttr(obj, name): +# delattr(obj, name) +# return None + +@single_value_node("dir") +def Dir(obj): + return dir(obj) + + +@single_value_node("len") +def Length(obj): + return len(obj) + + +@single_value_node("add") +def Add(obj, other): + return obj + other + + +@single_value_node("in") +def Contains(obj, other): + return other in obj + + +@single_value_node("sub") +def Subtract(obj, other): + return obj - other + + +@single_value_node("mul") +def Multiply(obj, other): + return obj * other + + +@single_value_node("matmul") +def MatrixMultiply(obj, other): + return obj @ other + + +@single_value_node("truediv") +def Divide(obj, other): + return obj / other + + +@single_value_node("floordiv") +def FloorDivide(obj, other): + return obj // other + + +@single_value_node("mod") +def Modulo(obj, other): + return obj % other + + +@single_value_node("pow") +def Power(obj, other): + return obj ** other + + +@single_value_node("and") +def And(obj, other): + return obj & other + + +@single_value_node("xor") +def XOr(obj, other): + return obj ^ other + + +@single_value_node("or") +def Or(obj, other): + return obj ^ other + + +@single_value_node("neg") +def Negative(obj): + return -obj + + +@single_value_node("pos") +def Positive(obj): + return +obj + + +@single_value_node("abs") +def Absolute(obj): + return abs(obj) + + +@single_value_node("invert") +def Invert(obj): + return ~obj + + +@single_value_node("int") +def Int(obj): + return int(obj) + + +@single_value_node("float") +def Float(obj): + return float(obj) + + +@single_value_node("round") +def Round(obj): + return round(obj) + nodes = [ - UserInput, + Absolute, + Add, + And, + Bool, + Bytes, + Contains, + Dir, + Divide, + Float, + FloorDivide, + GetAttr, + GreaterThan, + GreaterThanEquals, + Hash, If, + Int, + Invert, + Length, + LessThan, + LessThanEquals, + MatrixMultiply, + Modulo, + Multiply, + Negative, + Or, + Positive, + Power, + Round, + String, + Subtract, + UserInput, + XOr, ] From ee4e789068fdcdb571486babbbe7098e3eb60926 Mon Sep 17 00:00:00 2001 From: liamhuber Date: Thu, 7 Dec 2023 14:11:14 -0800 Subject: [PATCH 02/30] Use standard nodes --- pyiron_workflow/meta.py | 8 ++++---- tests/integration/test_workflow.py | 29 +++++++++++++---------------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/pyiron_workflow/meta.py b/pyiron_workflow/meta.py index 570ac4dc8..1e221e7fd 100644 --- a/pyiron_workflow/meta.py +++ b/pyiron_workflow/meta.py @@ -216,17 +216,17 @@ def while_loop( >>> >>> AddWhile = Workflow.create.meta.while_loop( ... loop_body_class=Add, - ... condition_class=LessThanTen, + ... condition_class=Workflow.create.standard.LessThan, ... internal_connection_map=[ - ... ("Add", "a + b", "LessThanTen", "value"), + ... ("Add", "a + b", "LessThan", "obj"), ... ("Add", "a + b", "Add", "a") ... ], - ... inputs_map={"Add__a": "a", "Add__b": "b"}, + ... inputs_map={"Add__a": "a", "Add__b": "b", "LessThan__other": "cap"}, ... outputs_map={"Add__a + b": "total"} ... ) >>> >>> wf = Workflow("do_while") - >>> wf.add_while = AddWhile() + >>> wf.add_while = AddWhile(cap=10) >>> >>> wf.inputs_map = { ... "add_while__a": "a", diff --git a/tests/integration/test_workflow.py b/tests/integration/test_workflow.py index 464b0d560..128ca00d7 100644 --- a/tests/integration/test_workflow.py +++ b/tests/integration/test_workflow.py @@ -147,23 +147,19 @@ def GreaterThan(x: float, threshold: float): with self.subTest("Self-data-loop"): - @Workflow.wrap_as.single_value_node() - def Add(a, b): - return a + b - - @Workflow.wrap_as.single_value_node() - def LessThanTen(value): - return value < 10 - AddWhile = Workflow.create.meta.while_loop( - loop_body_class=Add, - condition_class=LessThanTen, + loop_body_class=Workflow.create.standard.Add, + condition_class=Workflow.create.standard.LessThan, internal_connection_map=[ - ("Add", "a + b", "LessThanTen", "value"), - ("Add", "a + b", "Add", "a") + ("Add", "add", "LessThan", "obj"), + ("Add", "add", "Add", "obj") ], - inputs_map={"Add__a": "a", "Add__b": "b"}, - outputs_map={"Add__a + b": "total"} + inputs_map={ + "Add__obj": "a", + "Add__other": "b", + "LessThan__other": "cap", + }, + outputs_map={"Add__add": "total"} ) wf = Workflow("do_while") @@ -171,11 +167,12 @@ def LessThanTen(value): wf.inputs_map = { "add_while__a": "a", - "add_while__b": "b" + "add_while__b": "b", + "add_while__cap": "cap" } wf.outputs_map = {"add_while__total": "total"} - out = wf(a=1, b=2) + out = wf(a=1, b=2, cap=10) self.assertEqual(out.total, 11) def test_executor_and_creator_interaction(self): From 1608779cbfd617a80351d3faa5cbb7bdf910244b Mon Sep 17 00:00:00 2001 From: liamhuber Date: Thu, 7 Dec 2023 14:12:01 -0800 Subject: [PATCH 03/30] Add an item node --- pyiron_workflow/node_library/standard.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pyiron_workflow/node_library/standard.py b/pyiron_workflow/node_library/standard.py index 037ccfd11..8d01edcc2 100644 --- a/pyiron_workflow/node_library/standard.py +++ b/pyiron_workflow/node_library/standard.py @@ -102,6 +102,11 @@ def GetAttr(obj, name): # delattr(obj, name) # return None +@single_value_node("getitem") +def GetItem(obj, item): + return obj[item] + + @single_value_node("dir") def Dir(obj): return dir(obj) From 026a1e5d082c832c2d4fc80da34424ae09609d75 Mon Sep 17 00:00:00 2001 From: pyiron-runner Date: Thu, 7 Dec 2023 22:19:41 +0000 Subject: [PATCH 04/30] Format black --- pyiron_workflow/node_library/standard.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pyiron_workflow/node_library/standard.py b/pyiron_workflow/node_library/standard.py index 8d01edcc2..a523d012b 100644 --- a/pyiron_workflow/node_library/standard.py +++ b/pyiron_workflow/node_library/standard.py @@ -29,7 +29,9 @@ def __init__(self, **kwargs): @staticmethod def if_(condition): if isclass(condition) and issubclass(condition, NotData): - raise TypeError(f"Logic 'If' node expected data otherut got NotData as input.") + raise TypeError( + f"Logic 'If' node expected data otherut got NotData as input." + ) return bool(condition) def process_run_result(self, function_output): @@ -43,9 +45,11 @@ def process_run_result(self, function_output): else: self.signals.output.false() + # A bunch of (but not all) standard operators # Return values based on dunder methods, where available + @single_value_node("str") def String(obj): return str(obj) @@ -90,6 +94,7 @@ def Bool(obj): def GetAttr(obj, name): return getattr(obj, name) + # These are not idempotent and thus not encouraged # @single_value_node("none") # def SetAttr(obj, name, value): @@ -102,6 +107,7 @@ def GetAttr(obj, name): # delattr(obj, name) # return None + @single_value_node("getitem") def GetItem(obj, item): return obj[item] @@ -159,7 +165,7 @@ def Modulo(obj, other): @single_value_node("pow") def Power(obj, other): - return obj ** other + return obj**other @single_value_node("and") From ebfd9d7e41697fe5886716ccc4e2b0e39ca30290 Mon Sep 17 00:00:00 2001 From: liamhuber Date: Thu, 7 Dec 2023 14:58:46 -0800 Subject: [PATCH 05/30] Re-order nodes --- pyiron_workflow/node_library/standard.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pyiron_workflow/node_library/standard.py b/pyiron_workflow/node_library/standard.py index a523d012b..bde203914 100644 --- a/pyiron_workflow/node_library/standard.py +++ b/pyiron_workflow/node_library/standard.py @@ -123,16 +123,16 @@ def Length(obj): return len(obj) -@single_value_node("add") -def Add(obj, other): - return obj + other - - @single_value_node("in") def Contains(obj, other): return other in obj +@single_value_node("add") +def Add(obj, other): + return obj + other + + @single_value_node("sub") def Subtract(obj, other): return obj - other From e1660f2a631f57485d5253447b50d433ea5030f9 Mon Sep 17 00:00:00 2001 From: liamhuber Date: Thu, 7 Dec 2023 15:07:23 -0800 Subject: [PATCH 06/30] Remove the __len__ shortcut for channels So we can inject length checks on OutputData values --- pyiron_workflow/channels.py | 3 --- tests/unit/test_channels.py | 22 ++++------------------ 2 files changed, 4 insertions(+), 21 deletions(-) diff --git a/pyiron_workflow/channels.py b/pyiron_workflow/channels.py index 63f4561c3..da79890ed 100644 --- a/pyiron_workflow/channels.py +++ b/pyiron_workflow/channels.py @@ -183,9 +183,6 @@ def connected(self) -> bool: def __iter__(self): return self.connections.__iter__() - def __len__(self): - return len(self.connections) - @property def channel(self) -> Channel: return self diff --git a/tests/unit/test_channels.py b/tests/unit/test_channels.py index 66ab99ec8..b501875b6 100644 --- a/tests/unit/test_channels.py +++ b/tests/unit/test_channels.py @@ -59,20 +59,6 @@ def test_connection_validity(self): self.inp.connect(self.out) # A conjugate pair should work fine - def test_length(self): - self.inp.connect(self.out) - self.out2.connect(self.inp) - self.assertEqual( - 2, - len(self.inp), - msg="Promised that channel length was number of connections" - ) - self.assertEqual( - 1, - len(self.out), - msg="Promised that channel length was number of connections" - ) - def test_connection_reflexivity(self): self.inp.connect(self.out) @@ -359,13 +345,13 @@ def test_connections(self): with self.subTest("Ignore repeated connection"): self.out.connect(self.inp) - self.assertEqual(len(self.inp), 1) - self.assertEqual(len(self.out), 1) + self.assertEqual(len(self.inp.connections), 1) + self.assertEqual(len(self.out.connections), 1) with self.subTest("Check disconnection"): self.out.disconnect_all() - self.assertEqual(len(self.inp), 0) - self.assertEqual(len(self.out), 0) + self.assertEqual(len(self.inp.connections), 0) + self.assertEqual(len(self.out.connections), 0) with self.subTest("No connections to non-SignalChannels"): bad = InputData(label="numeric", node=DummyNode(), default=1, type_hint=int) From 2c3081024b574434921867300b03ea73431c1acd Mon Sep 17 00:00:00 2001 From: liamhuber Date: Thu, 7 Dec 2023 15:26:55 -0800 Subject: [PATCH 07/30] Parse (many but not all) operations on output nodes by injecting new nodes! --- pyiron_workflow/channels.py | 151 +++++++++++++++++++++ tests/integration/test_output_injection.py | 79 +++++++++++ 2 files changed, 230 insertions(+) create mode 100644 tests/integration/test_output_injection.py diff --git a/pyiron_workflow/channels.py b/pyiron_workflow/channels.py index da79890ed..f64814ae9 100644 --- a/pyiron_workflow/channels.py +++ b/pyiron_workflow/channels.py @@ -488,6 +488,157 @@ class OutputData(DataChannel): def connection_partner_type(self): return InputData + @staticmethod + def _other_label(other): + return other.channel.scoped_label if isinstance(other, HasChannel) else str(other) + + def get_injected_label(self, injection_class, other=None): + suffix = f"_{self._other_label(other)}" if other is not None else "" + return f"{self.scoped_label}_{injection_class.__name__}{suffix}" + + def _binary_injection(self, injection_class, other): + """A template for injecting binary function nodes""" + label = self.get_injected_label(injection_class, other) + try: + # First check if the node already exists + return self.node.parent.nodes[label] + except (AttributeError, KeyError): + # Fall back on creating a new node in case parent is None or node nexists + return injection_class(self, other, parent=self.node.parent, label=label) + + def _unary_injection(self, injection_class): + """A template for injecting unary function nodes""" + # We can't just do an `if other is None` and combine this implementation with + # the binary, because users might pass `None` other data on purpose + label = self.get_injected_label(injection_class) + try: + # First check if the node already exists + return self.node.parent.nodes[label] + except (AttributeError, KeyError): + # Fall back on creating a new node in case parent is None or node nexists + return injection_class(self, parent=self.node.parent, label=label) + + # We don't wrap __all__ the operators, because you might really want the string or + # hash or whatever of the actual channel. But we do wrap all the dunder methods + # that should be unambiguously referring to an operation on values + + def __lt__(self, other): + from pyiron_workflow.node_library.standard import LessThan + return self._binary_injection(LessThan, other) + + def __le__(self, other): + from pyiron_workflow.node_library.standard import LessThanEquals + return self._binary_injection(LessThanEquals, other) + + def __gt__(self, other): + from pyiron_workflow.node_library.standard import GreaterThan + return self._binary_injection(GreaterThan, other) + + def __ge__(self, other): + from pyiron_workflow.node_library.standard import GreaterThanEquals + return self._binary_injection(GreaterThanEquals, other) + + def __bool__(self): + from pyiron_workflow.node_library.standard import Bool + return self._unary_injection(Bool) + + def __getattr__(self, name): + from pyiron_workflow.node_library.standard import GetAttr + return self._binary_injection(GetAttr, name) + + def __getitem__(self, item): + from pyiron_workflow.node_library.standard import GetItem + return self._binary_injection(GetItem, item) + + def __len__(self): + from pyiron_workflow.node_library.standard import Length + return self._unary_injection(Length) + + def __contains__(self, other): + from pyiron_workflow.node_library.standard import Contains + return self._binary_injection(Contains, other) + + def __add__(self, other): + from pyiron_workflow.node_library.standard import Add + return self._binary_injection(Add, other) + + def __sub__(self, other): + from pyiron_workflow.node_library.standard import Subtract + return self._binary_injection(Subtract, other) + + def __mul__(self, other): + from pyiron_workflow.node_library.standard import Multiply + return self._binary_injection(Multiply, other) + + def __matmul__(self, other): + from pyiron_workflow.node_library.standard import MatrixMultiply + return self._binary_injection(MatrixMultiply, other) + + def __truediv__(self, other): + from pyiron_workflow.node_library.standard import Divide + return self._binary_injection(Divide, other) + + def __floordiv__(self, other): + from pyiron_workflow.node_library.standard import FloorDivide + return self._binary_injection(FloorDivide, other) + + def __mod__(self, other): + from pyiron_workflow.node_library.standard import Modulo + return self._binary_injection(Modulo, other) + + def __pow__(self, other): + from pyiron_workflow.node_library.standard import Power + return self._binary_injection(Power, other) + + def __and__(self, other): + from pyiron_workflow.node_library.standard import And + return self._binary_injection(And, other) + + def __xor__(self, other): + from pyiron_workflow.node_library.standard import XOr + return self._binary_injection(XOr, other) + + def __or__(self, other): + from pyiron_workflow.node_library.standard import Or + return self._binary_injection(Or, other) + + def __neg__(self): + from pyiron_workflow.node_library.standard import Negative + return self._unary_injection(Negative) + + def __pos__(self): + from pyiron_workflow.node_library.standard import Positive + return self._unary_injection(Positive) + + def __abs__(self): + from pyiron_workflow.node_library.standard import Absolute + return self._unary_injection(Absolute) + + def __invert__(self): + from pyiron_workflow.node_library.standard import Invert + return self._unary_injection(Invert) + + def __int__(self): + from pyiron_workflow.node_library.standard import Int + return self._unary_injection(Int) + + def __float__(self): + from pyiron_workflow.node_library.standard import Float + return self._unary_injection(Float) + + def __round__(self): + from pyiron_workflow.node_library.standard import Round + return self._unary_injection(Round) + + # Because we override __getattr__ we need to get and set state for serialization + def __getstate__(self): + return self.__dict__ + + def __setstate__(self, state): + # Update instead of overriding in case some other attributes were added on the + # main process while a remote process was working away + self.__dict__.update(**state) + class SignalChannel(Channel, ABC): """ diff --git a/tests/integration/test_output_injection.py b/tests/integration/test_output_injection.py new file mode 100644 index 000000000..b8bc0ef79 --- /dev/null +++ b/tests/integration/test_output_injection.py @@ -0,0 +1,79 @@ +import unittest + +from pyiron_workflow import Workflow +from pyiron_workflow.node import Node + + +class TestOutputInjection(unittest.TestCase): + """ + I.e. the process of inserting new nodes on-the-fly by modifying output channels" + """ + + def test_a_few_operations(self): + wf = Workflow("output_manipulation") + + wf.a = Workflow.create.standard.Add(1, 2) + wf.b = Workflow.create.standard.Add(3, 4) + wf.c = Workflow.create.standard.UserInput(list(range(10))) + wf.d = Workflow.create.standard.UserInput({"foo": 42}) + + class Something: + myattr = 1 + + wf.e = Workflow.create.standard.UserInput(Something()) + + wf.a.outputs.add < wf.b.outputs.add + wf.c.outputs.user_input[:5] + wf.d.outputs.user_input["foo"] + wf.e.outputs.user_input.myattr + out = wf() + self.assertDictEqual( + out, + { + 'a__add_LessThan_b__add__lt': True, + 'c__user_input_GetItem_slice(None, 5, None)__getitem': [0, 1, 2, 3, 4], + 'd__user_input_GetItem_foo__getitem': 42, + 'e__user_input_GetAttr_myattr__getattr': 1 + } + ) + + def test_repeated_access(self): + wf = Workflow("output_manipulation") + wf.n = Workflow.create.standard.UserInput(list(range(10))) + + a = wf.n.outputs.user_input[:4] + b = wf.n.outputs.user_input[:4] + c = wf.n.outputs.user_input[1:] + + self.assertIs( + a, + b, + msg="The same operation should re-access an existing node in the parent" + ) + self.assertIsNot( + a, + c, + msg="Unique operations should yield unique nodes" + ) + + def test_without_parent(self): + n = Workflow.create.standard.UserInput(list(range(10))) + d1 = n.outputs.user_input[5] + d2 = n.outputs.user_input[5] + + self.assertIsInstance(d1, Node) + self.assertIsNot( + d1, + d2, + msg="Outside the scope of a parent, we can't expect to re-access an " + "equivalent node" + ) + self.assertEqual( + d1.label, + d2.label, + msg="Equivalent operations should nonetheless generate equal labels" + ) + + +if __name__ == '__main__': + unittest.main() From 402beede52dc87022905f861e94166f70cb5de7a Mon Sep 17 00:00:00 2001 From: liamhuber Date: Thu, 7 Dec 2023 15:32:02 -0800 Subject: [PATCH 08/30] Refactor: slide --- pyiron_workflow/function.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/pyiron_workflow/function.py b/pyiron_workflow/function.py index 42f8aafc6..82d55e589 100644 --- a/pyiron_workflow/function.py +++ b/pyiron_workflow/function.py @@ -616,8 +616,13 @@ def color(self) -> str: """For drawing the graph""" return SeabornColors.cyan - def __getitem__(self, item): - return self.single_value.__getitem__(item) + def __repr__(self): + return self.single_value.__repr__() + + def __str__(self): + return f"{self.label} ({self.__class__.__name__}) output single-value: " + str( + self.single_value + ) def __getattr__(self, item): try: @@ -628,13 +633,8 @@ def __getattr__(self, item): f"{self.single_value}" ) from e - def __repr__(self): - return self.single_value.__repr__() - - def __str__(self): - return f"{self.label} ({self.__class__.__name__}) output single-value: " + str( - self.single_value - ) + def __getitem__(self, item): + return self.single_value.__getitem__(item) def _wrapper_factory( From f1e4b4785f45e341dbc7afe7717829b9543e4f06 Mon Sep 17 00:00:00 2001 From: liamhuber Date: Thu, 7 Dec 2023 22:59:28 -0800 Subject: [PATCH 09/30] Fail with grace when running at initialization but not ready This is necessary for node injection when processing output: if you're injecting a node on top of an existing result you probably want the injection immediately available, but if you're injecting it at the end of something that hasn't run yet you don't want to see an error. --- pyiron_workflow/node.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/pyiron_workflow/node.py b/pyiron_workflow/node.py index 2026c0afd..125c3717b 100644 --- a/pyiron_workflow/node.py +++ b/pyiron_workflow/node.py @@ -71,6 +71,10 @@ def wrapped_method(node: Node, *args, **kwargs): # rather node:Node return wrapped_method +class ReadinessError(ValueError): + pass + + class Node(HasToDict, ABC, metaclass=AbstractHasPost): """ Nodes are elements of a computational graph. @@ -120,6 +124,8 @@ class Node(HasToDict, ABC, metaclass=AbstractHasPost): held by the output channels - If an error is encountered _after_ reaching the state of actually computing the node's task, the status will get set to failure + - Nodes can be instructed to run at the end of their initialization, but will exit + cleanly if they get to checking their readiness and find they are not ready - Nodes have a label by which they are identified - Nodes may open a working directory related to their label, their parent(age) and the python process working directory @@ -247,7 +253,10 @@ def __init__( def __post__(self, *args, run_after_init: bool = False, **kwargs): if run_after_init: - self.run() + try: + self.run() + except ReadinessError: + pass @property @abstractmethod @@ -376,7 +385,7 @@ def run( self.inputs.fetch() if check_readiness and not self.ready: - raise ValueError( + raise ReadinessError( f"{self.label} received a run command but is not ready. The node " f"should be neither running nor failed, and all input values should" f" conform to type hints.\n" + self.readiness_report From 120246ac2ef83b6b9ee70c1b2315ec6d86763549 Mon Sep 17 00:00:00 2001 From: liamhuber Date: Thu, 7 Dec 2023 23:03:56 -0800 Subject: [PATCH 10/30] Try to run operator injections at the end of initialization --- pyiron_workflow/channels.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/pyiron_workflow/channels.py b/pyiron_workflow/channels.py index f64814ae9..819f585b9 100644 --- a/pyiron_workflow/channels.py +++ b/pyiron_workflow/channels.py @@ -261,6 +261,14 @@ class DataChannel(Channel, ABC): which is to say it is data (not `NotData`) and that it conforms to the type hint (if one is provided and checking is active). + Output data facilitates most (but not all) python operators by injecting a new + node to perform that operation. These new nodes are instructed to run at the end of + instantiation, but this fails cleanly in case they are not ready. This is intended + to accommodate two likely scenarios: if you're injecting a node on top of an + existing result you probably want the injection result to also be immediately + available, but if you're injecting it at the end of something that hasn't run yet + you don't want to see an error. + TODO: - Storage (including priority and history) - Ontological hinting @@ -504,7 +512,9 @@ def _binary_injection(self, injection_class, other): return self.node.parent.nodes[label] except (AttributeError, KeyError): # Fall back on creating a new node in case parent is None or node nexists - return injection_class(self, other, parent=self.node.parent, label=label) + return injection_class( + self, other, parent=self.node.parent, label=label, run_after_init=True + ) def _unary_injection(self, injection_class): """A template for injecting unary function nodes""" @@ -516,7 +526,9 @@ def _unary_injection(self, injection_class): return self.node.parent.nodes[label] except (AttributeError, KeyError): # Fall back on creating a new node in case parent is None or node nexists - return injection_class(self, parent=self.node.parent, label=label) + return injection_class( + self, parent=self.node.parent, label=label, run_after_init=True + ) # We don't wrap __all__ the operators, because you might really want the string or # hash or whatever of the actual channel. But we do wrap all the dunder methods From b65ccc44460bd153e9cbcf4a16db088d0dff6f5c Mon Sep 17 00:00:00 2001 From: liamhuber Date: Thu, 7 Dec 2023 23:04:18 -0800 Subject: [PATCH 11/30] Extend single value node to use operators like output --- pyiron_workflow/function.py | 99 ++++++++++++++++++++++++++++++------- tests/unit/test_function.py | 29 +++++++---- 2 files changed, 102 insertions(+), 26 deletions(-) diff --git a/pyiron_workflow/function.py b/pyiron_workflow/function.py index 82d55e589..e772d0fb3 100644 --- a/pyiron_workflow/function.py +++ b/pyiron_workflow/function.py @@ -582,13 +582,15 @@ class SingleValue(Function, HasChannel): """ A node that _must_ return only a single value. - Attribute and item access is modified to finally attempt access on the output value. - Note that this means any attributes/method available on the output value become - available directly at the node level (at least those which don't conflict with the - existing node namespace). + Attribute and item access is modified to finally attempt access on the output + channel, and other operations (those supported by the output channel) are also + passed there automatically. + This means that the node itself can be used in place of its output channel, + and that the `value` attribtue directly accesses the output value. Promises (in addition parent class promises): - - Attribute and item access will finally attempt to access the output value + - Attribute and item access will finally attempt to access the output + - Other operators supported by the output channel operate there immediately. - The entire node can be used in place of its output value for connections, e.g. `some_node.input.some_channel = my_svn_instance`. """ @@ -603,8 +605,8 @@ def _get_output_labels(self, output_labels: str | list[str] | tuple[str] | None) return output_labels @property - def single_value(self): - return self.outputs[self.outputs.labels[0]].value + def output(self) -> OutputData: + return self.outputs[self.outputs.labels[0]] @property def channel(self) -> OutputData: @@ -617,24 +619,87 @@ def color(self) -> str: return SeabornColors.cyan def __repr__(self): - return self.single_value.__repr__() + return self.output.value.__repr__() def __str__(self): return f"{self.label} ({self.__class__.__name__}) output single-value: " + str( - self.single_value + self.output.value ) def __getattr__(self, item): - try: - return getattr(self.single_value, item) - except Exception as e: - raise AttributeError( - f"Could not find {item} as an attribute of the single value " - f"{self.single_value}" - ) from e + return getattr(self.output, item) def __getitem__(self, item): - return self.single_value.__getitem__(item) + return self.output.__getitem__(item) + + def __lt__(self, other): + return self.output.__lt__(other) + + def __le__(self, other): + return self.output.__le__(other) + + def __gt__(self, other): + return self.output.__gt__(other) + + def __ge__(self, other): + return self.output.__ge__(other) + + def __bool__(self): + return self.output.__bool__() + + def __len__(self): + return self.output.__len__() + + def __contains__(self, other): + return self.output.__contains__(other) + + def __add__(self, other): + return self.output.__add__(other) + + def __sub__(self, other): + return self.output.__sub__(other) + + def __matmul__(self, other): + return self.output.__matmul__(other) + + def __truediv__(self, other): + return self.output.__truediv__(other) + + def __floordiv__(self, other): + return self.output.__floordiv__(other) + + def __mod__(self, other): + return self.output.__mod__(other) + + def __pow__(self, other): + return self.output.__pow__(other) + + def __and__(self, other): + return self.output.__and__(other) + + def __xor__(self, other): + return self.output.__xor__(other) + + def __or__(self, other): + return self.output.__or__(other) + + def __neg__(self): + return self.output.__neg__() + + def __pos__(self): + return self.output.__pos__() + + def __abs__(self): + return self.output.__abs__() + + def __int__(self): + return self.output.__int__() + + def __float__(self): + return self.output.__float__() + + def __round__(self): + return self.output.__round__() def _wrapper_factory( diff --git a/tests/unit/test_function.py b/tests/unit/test_function.py index 5a993c18d..285aa586c 100644 --- a/tests/unit/test_function.py +++ b/tests/unit/test_function.py @@ -480,31 +480,42 @@ def returns_foo() -> Foo: return Foo() svn = SingleValue(returns_foo, output_labels="foo") + + self.assertEqual( + svn.connected, + False, + msg="Should return the _node_ attribute, not acting on the output channel" + ) + + injection = svn[0] # Should pass cleanly, even though it tries to run svn.run() self.assertEqual( - svn.some_attribute, + svn.some_attribute.value, # The call runs the dynamic node "exists", - msg="Should fall back to looking on the single value" + msg="Should fall back to acting on the output channel and creating a node" ) self.assertEqual( svn.connected, - False, - msg="Should return the _node_ attribute, not the single value attribute" + True, + msg="Should now be connected to the dynamically created nodes" ) - with self.assertRaises(AttributeError): + with self.assertRaises( + AttributeError, + msg="Aggressive running hits the problem that no such attribute exists" + ): svn.doesnt_exists_anywhere self.assertEqual( - svn[0], + injection(), True, - msg="Should fall back to looking on the single value" + msg="Should be able to query injection later" ) self.assertEqual( - svn["some other key"], + svn["some other key"].value, False, msg="Should fall back to looking on the single value" ) @@ -531,7 +542,7 @@ def test_str(self): svn = SingleValue(plus_one) svn.run() self.assertTrue( - str(svn).endswith(str(svn.single_value)), + str(svn).endswith(str(svn.value)), msg="SingleValueNodes should have their output as a string in their string " "representation (e.g., perhaps with a reminder note that this is " "actually still a Function and not just the value you're seeing.)" From 93ad2ffd620b972361ca73476b862051f7cb59a2 Mon Sep 17 00:00:00 2001 From: liamhuber Date: Thu, 7 Dec 2023 23:23:22 -0800 Subject: [PATCH 12/30] :bug: include GetItem in the standard package --- pyiron_workflow/node_library/standard.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pyiron_workflow/node_library/standard.py b/pyiron_workflow/node_library/standard.py index bde203914..88d7d732a 100644 --- a/pyiron_workflow/node_library/standard.py +++ b/pyiron_workflow/node_library/standard.py @@ -230,6 +230,7 @@ def Round(obj): Float, FloorDivide, GetAttr, + GetItem, GreaterThan, GreaterThanEquals, Hash, From b627a6938854876c1d99f2f2ae7f0bd8b7694704 Mon Sep 17 00:00:00 2001 From: pyiron-runner Date: Fri, 8 Dec 2023 07:28:28 +0000 Subject: [PATCH 13/30] Format black --- pyiron_workflow/channels.py | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/pyiron_workflow/channels.py b/pyiron_workflow/channels.py index 819f585b9..889360590 100644 --- a/pyiron_workflow/channels.py +++ b/pyiron_workflow/channels.py @@ -498,7 +498,9 @@ def connection_partner_type(self): @staticmethod def _other_label(other): - return other.channel.scoped_label if isinstance(other, HasChannel) else str(other) + return ( + other.channel.scoped_label if isinstance(other, HasChannel) else str(other) + ) def get_injected_label(self, injection_class, other=None): suffix = f"_{self._other_label(other)}" if other is not None else "" @@ -536,110 +538,137 @@ def _unary_injection(self, injection_class): def __lt__(self, other): from pyiron_workflow.node_library.standard import LessThan + return self._binary_injection(LessThan, other) def __le__(self, other): from pyiron_workflow.node_library.standard import LessThanEquals + return self._binary_injection(LessThanEquals, other) def __gt__(self, other): from pyiron_workflow.node_library.standard import GreaterThan + return self._binary_injection(GreaterThan, other) def __ge__(self, other): from pyiron_workflow.node_library.standard import GreaterThanEquals + return self._binary_injection(GreaterThanEquals, other) def __bool__(self): from pyiron_workflow.node_library.standard import Bool + return self._unary_injection(Bool) def __getattr__(self, name): from pyiron_workflow.node_library.standard import GetAttr + return self._binary_injection(GetAttr, name) def __getitem__(self, item): from pyiron_workflow.node_library.standard import GetItem + return self._binary_injection(GetItem, item) def __len__(self): from pyiron_workflow.node_library.standard import Length + return self._unary_injection(Length) def __contains__(self, other): from pyiron_workflow.node_library.standard import Contains + return self._binary_injection(Contains, other) def __add__(self, other): from pyiron_workflow.node_library.standard import Add + return self._binary_injection(Add, other) def __sub__(self, other): from pyiron_workflow.node_library.standard import Subtract + return self._binary_injection(Subtract, other) def __mul__(self, other): from pyiron_workflow.node_library.standard import Multiply + return self._binary_injection(Multiply, other) def __matmul__(self, other): from pyiron_workflow.node_library.standard import MatrixMultiply + return self._binary_injection(MatrixMultiply, other) def __truediv__(self, other): from pyiron_workflow.node_library.standard import Divide + return self._binary_injection(Divide, other) def __floordiv__(self, other): from pyiron_workflow.node_library.standard import FloorDivide + return self._binary_injection(FloorDivide, other) def __mod__(self, other): from pyiron_workflow.node_library.standard import Modulo + return self._binary_injection(Modulo, other) def __pow__(self, other): from pyiron_workflow.node_library.standard import Power + return self._binary_injection(Power, other) def __and__(self, other): from pyiron_workflow.node_library.standard import And + return self._binary_injection(And, other) def __xor__(self, other): from pyiron_workflow.node_library.standard import XOr + return self._binary_injection(XOr, other) def __or__(self, other): from pyiron_workflow.node_library.standard import Or + return self._binary_injection(Or, other) def __neg__(self): from pyiron_workflow.node_library.standard import Negative + return self._unary_injection(Negative) def __pos__(self): from pyiron_workflow.node_library.standard import Positive + return self._unary_injection(Positive) def __abs__(self): from pyiron_workflow.node_library.standard import Absolute + return self._unary_injection(Absolute) def __invert__(self): from pyiron_workflow.node_library.standard import Invert + return self._unary_injection(Invert) def __int__(self): from pyiron_workflow.node_library.standard import Int + return self._unary_injection(Int) def __float__(self): from pyiron_workflow.node_library.standard import Float + return self._unary_injection(Float) def __round__(self): from pyiron_workflow.node_library.standard import Round + return self._unary_injection(Round) # Because we override __getattr__ we need to get and set state for serialization From ae81c6d92421d7ca6622ead43a1430cb1d19500b Mon Sep 17 00:00:00 2001 From: liamhuber Date: Fri, 8 Dec 2023 10:35:10 -0800 Subject: [PATCH 14/30] Don't define access to the output twice I used this class to try out ChatGPT3.5. It was almost entirely drivel, but I'll be damned if it didn't notice that I defined this property twice. --- pyiron_workflow/function.py | 62 +++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 33 deletions(-) diff --git a/pyiron_workflow/function.py b/pyiron_workflow/function.py index e772d0fb3..4192ae108 100644 --- a/pyiron_workflow/function.py +++ b/pyiron_workflow/function.py @@ -602,16 +602,12 @@ def _get_output_labels(self, output_labels: str | list[str] | tuple[str] | None) f"{self.__class__.__name__} must only have a single return value, but " f"got multiple output labels: {output_labels}" ) - return output_labels - - @property - def output(self) -> OutputData: - return self.outputs[self.outputs.labels[0]] + return output_labels @property def channel(self) -> OutputData: """The channel for the single output""" - return list(self.outputs.channel_dict.values())[0] + return self.outputs[self.outputs.labels[0]] @property def color(self) -> str: @@ -619,87 +615,87 @@ def color(self) -> str: return SeabornColors.cyan def __repr__(self): - return self.output.value.__repr__() + return self.channel.value.__repr__() def __str__(self): return f"{self.label} ({self.__class__.__name__}) output single-value: " + str( - self.output.value + self.channel.value ) def __getattr__(self, item): - return getattr(self.output, item) + return getattr(self.channel, item) def __getitem__(self, item): - return self.output.__getitem__(item) + return self.channel.__getitem__(item) def __lt__(self, other): - return self.output.__lt__(other) + return self.channel.__lt__(other) def __le__(self, other): - return self.output.__le__(other) + return self.channel.__le__(other) def __gt__(self, other): - return self.output.__gt__(other) + return self.channel.__gt__(other) def __ge__(self, other): - return self.output.__ge__(other) + return self.channel.__ge__(other) def __bool__(self): - return self.output.__bool__() + return self.channel.__bool__() def __len__(self): - return self.output.__len__() + return self.channel.__len__() def __contains__(self, other): - return self.output.__contains__(other) + return self.channel.__contains__(other) def __add__(self, other): - return self.output.__add__(other) + return self.channel.__add__(other) def __sub__(self, other): - return self.output.__sub__(other) + return self.channel.__sub__(other) def __matmul__(self, other): - return self.output.__matmul__(other) + return self.channel.__matmul__(other) def __truediv__(self, other): - return self.output.__truediv__(other) + return self.channel.__truediv__(other) def __floordiv__(self, other): - return self.output.__floordiv__(other) + return self.channel.__floordiv__(other) def __mod__(self, other): - return self.output.__mod__(other) + return self.channel.__mod__(other) def __pow__(self, other): - return self.output.__pow__(other) + return self.channel.__pow__(other) def __and__(self, other): - return self.output.__and__(other) + return self.channel.__and__(other) def __xor__(self, other): - return self.output.__xor__(other) + return self.channel.__xor__(other) def __or__(self, other): - return self.output.__or__(other) + return self.channel.__or__(other) def __neg__(self): - return self.output.__neg__() + return self.channel.__neg__() def __pos__(self): - return self.output.__pos__() + return self.channel.__pos__() def __abs__(self): - return self.output.__abs__() + return self.channel.__abs__() def __int__(self): - return self.output.__int__() + return self.channel.__int__() def __float__(self): - return self.output.__float__() + return self.channel.__float__() def __round__(self): - return self.output.__round__() + return self.channel.__round__() def _wrapper_factory( From 2646953942b30ee75bd32a2bb634b70377263e96 Mon Sep 17 00:00:00 2001 From: liamhuber Date: Fri, 8 Dec 2023 10:48:09 -0800 Subject: [PATCH 15/30] Introduce a slice node --- pyiron_workflow/node_library/standard.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/pyiron_workflow/node_library/standard.py b/pyiron_workflow/node_library/standard.py index 88d7d732a..7181b5f90 100644 --- a/pyiron_workflow/node_library/standard.py +++ b/pyiron_workflow/node_library/standard.py @@ -46,6 +46,24 @@ def process_run_result(self, function_output): self.signals.output.false() +@single_value_node("slice") +def Slice(start=None, stop=None, step=None): + if start is None: + if stop is None: + raise ValueError( + "Slice must define at least start or stop, but both are None" + ) + elif step is not None: + raise ValueError("If step is provided, start _must_ be provided") + else: + s = slice(stop) + elif stop is None: + raise ValueError("If start is provided, stop _must_ be provided") + else: + s = slice(start, stop, step) + return s + + # A bunch of (but not all) standard operators # Return values based on dunder methods, where available @@ -248,6 +266,7 @@ def Round(obj): Positive, Power, Round, + Slice, String, Subtract, UserInput, From 7ee71448f58466e304d49b9685375eb2846d8cd7 Mon Sep 17 00:00:00 2001 From: liamhuber Date: Fri, 8 Dec 2023 11:09:50 -0800 Subject: [PATCH 16/30] Replace the binary and unary injectors with one for arbitrary nargs --- pyiron_workflow/channels.py | 91 +++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 45 deletions(-) diff --git a/pyiron_workflow/channels.py b/pyiron_workflow/channels.py index 889360590..bf0a57ba1 100644 --- a/pyiron_workflow/channels.py +++ b/pyiron_workflow/channels.py @@ -506,30 +506,32 @@ def get_injected_label(self, injection_class, other=None): suffix = f"_{self._other_label(other)}" if other is not None else "" return f"{self.scoped_label}_{injection_class.__name__}{suffix}" - def _binary_injection(self, injection_class, other): - """A template for injecting binary function nodes""" - label = self.get_injected_label(injection_class, other) - try: - # First check if the node already exists - return self.node.parent.nodes[label] - except (AttributeError, KeyError): - # Fall back on creating a new node in case parent is None or node nexists - return injection_class( - self, other, parent=self.node.parent, label=label, run_after_init=True - ) + def _get_injection_label(self, injection_class, *args): + other_labels = "_".join(self._other_label(other) for other in args) + suffix = f"_{other_labels}" if len(args) > 0 else "" + return f"{self.scoped_label}_{injection_class.__name__}{suffix}" - def _unary_injection(self, injection_class): - """A template for injecting unary function nodes""" - # We can't just do an `if other is None` and combine this implementation with - # the binary, because users might pass `None` other data on purpose - label = self.get_injected_label(injection_class) + def _node_injection(self, injection_class, *args): + """ + Create a new node with the same parent as this channel's node, and feed it + arguments, or load such a node if it already exists on the parent (based on a + name dynamically generated from the injected node class and arguments). + + Args: + injection_class (type[Node]): The new node class to instantiate + *args: Any arguments for that function node + + Returns: + (Node): The instantiated or loaded node. + """ + label = self._get_injection_label(injection_class, *args) try: # First check if the node already exists return self.node.parent.nodes[label] except (AttributeError, KeyError): # Fall back on creating a new node in case parent is None or node nexists return injection_class( - self, parent=self.node.parent, label=label, run_after_init=True + self, *args, parent=self.node.parent, label=label, run_after_init=True ) # We don't wrap __all__ the operators, because you might really want the string or @@ -539,137 +541,136 @@ def _unary_injection(self, injection_class): def __lt__(self, other): from pyiron_workflow.node_library.standard import LessThan - return self._binary_injection(LessThan, other) + return self._node_injection(LessThan, other) def __le__(self, other): from pyiron_workflow.node_library.standard import LessThanEquals - return self._binary_injection(LessThanEquals, other) + return self._node_injection(LessThanEquals, other) def __gt__(self, other): from pyiron_workflow.node_library.standard import GreaterThan - return self._binary_injection(GreaterThan, other) + return self._node_injection(GreaterThan, other) def __ge__(self, other): from pyiron_workflow.node_library.standard import GreaterThanEquals - return self._binary_injection(GreaterThanEquals, other) + return self._node_injection(GreaterThanEquals, other) def __bool__(self): from pyiron_workflow.node_library.standard import Bool - return self._unary_injection(Bool) + return self._node_injection(Bool) def __getattr__(self, name): from pyiron_workflow.node_library.standard import GetAttr - return self._binary_injection(GetAttr, name) + return self._node_injection(GetAttr, name) def __getitem__(self, item): from pyiron_workflow.node_library.standard import GetItem - - return self._binary_injection(GetItem, item) + return self._node_injection(GetItem, item) def __len__(self): from pyiron_workflow.node_library.standard import Length - return self._unary_injection(Length) + return self._node_injection(Length) def __contains__(self, other): from pyiron_workflow.node_library.standard import Contains - return self._binary_injection(Contains, other) + return self._node_injection(Contains, other) def __add__(self, other): from pyiron_workflow.node_library.standard import Add - return self._binary_injection(Add, other) + return self._node_injection(Add, other) def __sub__(self, other): from pyiron_workflow.node_library.standard import Subtract - return self._binary_injection(Subtract, other) + return self._node_injection(Subtract, other) def __mul__(self, other): from pyiron_workflow.node_library.standard import Multiply - return self._binary_injection(Multiply, other) + return self._node_injection(Multiply, other) def __matmul__(self, other): from pyiron_workflow.node_library.standard import MatrixMultiply - return self._binary_injection(MatrixMultiply, other) + return self._node_injection(MatrixMultiply, other) def __truediv__(self, other): from pyiron_workflow.node_library.standard import Divide - return self._binary_injection(Divide, other) + return self._node_injection(Divide, other) def __floordiv__(self, other): from pyiron_workflow.node_library.standard import FloorDivide - return self._binary_injection(FloorDivide, other) + return self._node_injection(FloorDivide, other) def __mod__(self, other): from pyiron_workflow.node_library.standard import Modulo - return self._binary_injection(Modulo, other) + return self._node_injection(Modulo, other) def __pow__(self, other): from pyiron_workflow.node_library.standard import Power - return self._binary_injection(Power, other) + return self._node_injection(Power, other) def __and__(self, other): from pyiron_workflow.node_library.standard import And - return self._binary_injection(And, other) + return self._node_injection(And, other) def __xor__(self, other): from pyiron_workflow.node_library.standard import XOr - return self._binary_injection(XOr, other) + return self._node_injection(XOr, other) def __or__(self, other): from pyiron_workflow.node_library.standard import Or - return self._binary_injection(Or, other) + return self._node_injection(Or, other) def __neg__(self): from pyiron_workflow.node_library.standard import Negative - return self._unary_injection(Negative) + return self._node_injection(Negative) def __pos__(self): from pyiron_workflow.node_library.standard import Positive - return self._unary_injection(Positive) + return self._node_injection(Positive) def __abs__(self): from pyiron_workflow.node_library.standard import Absolute - return self._unary_injection(Absolute) + return self._node_injection(Absolute) def __invert__(self): from pyiron_workflow.node_library.standard import Invert - return self._unary_injection(Invert) + return self._node_injection(Invert) def __int__(self): from pyiron_workflow.node_library.standard import Int - return self._unary_injection(Int) + return self._node_injection(Int) def __float__(self): from pyiron_workflow.node_library.standard import Float - return self._unary_injection(Float) + return self._node_injection(Float) def __round__(self): from pyiron_workflow.node_library.standard import Round - return self._unary_injection(Round) + return self._node_injection(Round) # Because we override __getattr__ we need to get and set state for serialization def __getstate__(self): From 89e9356a2d680f41e3b7293b537c7739612ed328 Mon Sep 17 00:00:00 2001 From: liamhuber Date: Fri, 8 Dec 2023 12:16:43 -0800 Subject: [PATCH 17/30] Make it optional to inject the base channel as the 0th arg --- pyiron_workflow/channels.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pyiron_workflow/channels.py b/pyiron_workflow/channels.py index bf0a57ba1..fe4a1a4a6 100644 --- a/pyiron_workflow/channels.py +++ b/pyiron_workflow/channels.py @@ -511,7 +511,7 @@ def _get_injection_label(self, injection_class, *args): suffix = f"_{other_labels}" if len(args) > 0 else "" return f"{self.scoped_label}_{injection_class.__name__}{suffix}" - def _node_injection(self, injection_class, *args): + def _node_injection(self, injection_class, *args, inject_self=True): """ Create a new node with the same parent as this channel's node, and feed it arguments, or load such a node if it already exists on the parent (based on a @@ -520,6 +520,8 @@ def _node_injection(self, injection_class, *args): Args: injection_class (type[Node]): The new node class to instantiate *args: Any arguments for that function node + inject_self (bool): Whether to pre-pend the args with self. (Default is + True.) Returns: (Node): The instantiated or loaded node. @@ -530,8 +532,9 @@ def _node_injection(self, injection_class, *args): return self.node.parent.nodes[label] except (AttributeError, KeyError): # Fall back on creating a new node in case parent is None or node nexists + node_args = (self, *args) if inject_self else args return injection_class( - self, *args, parent=self.node.parent, label=label, run_after_init=True + *node_args, parent=self.node.parent, label=label ) # We don't wrap __all__ the operators, because you might really want the string or From be84f146b07e8dd7c27c42238912b1131b218af8 Mon Sep 17 00:00:00 2001 From: liamhuber Date: Fri, 8 Dec 2023 12:16:54 -0800 Subject: [PATCH 18/30] Extend getitem to handle slices --- pyiron_workflow/channels.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pyiron_workflow/channels.py b/pyiron_workflow/channels.py index fe4a1a4a6..474724bd8 100644 --- a/pyiron_workflow/channels.py +++ b/pyiron_workflow/channels.py @@ -572,6 +572,16 @@ def __getattr__(self, name): return self._node_injection(GetAttr, name) def __getitem__(self, item): + # Break slices into deeper injections, if any slice arguments are channel-like + if isinstance(item, slice) and any( + isinstance(slice_input, HasChannel) + for slice_input in [item.start, item.stop, item.step] + ): + from pyiron_workflow.node_library.standard import Slice + item = self._node_injection( + Slice, item.start, item.stop, item.step, inject_self=False + ) + from pyiron_workflow.node_library.standard import GetItem return self._node_injection(GetItem, item) From 12a4259db47eed1af45f5ab6e76547712bc7f927 Mon Sep 17 00:00:00 2001 From: liamhuber Date: Fri, 8 Dec 2023 13:34:54 -0800 Subject: [PATCH 19/30] Add equality and finish multiply --- pyiron_workflow/channels.py | 15 +++++++++++++++ pyiron_workflow/function.py | 12 ++++++++++++ pyiron_workflow/node_library/standard.py | 18 ++++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/pyiron_workflow/channels.py b/pyiron_workflow/channels.py index 474724bd8..9a31524f7 100644 --- a/pyiron_workflow/channels.py +++ b/pyiron_workflow/channels.py @@ -551,6 +551,16 @@ def __le__(self, other): return self._node_injection(LessThanEquals, other) + def eq(self, other): + from pyiron_workflow.node_library.standard import Equals + + return self._node_injection(Equals, other) + + def __ne__(self, other): + from pyiron_workflow.node_library.standard import NotEquals + + return self._node_injection(NotEquals, other) + def __gt__(self, other): from pyiron_workflow.node_library.standard import GreaterThan @@ -610,6 +620,11 @@ def __mul__(self, other): return self._node_injection(Multiply, other) + def __rmul__(self, other): + from pyiron_workflow.node_library.standard import RightMultiply + + return self._node_injection(RightMultiply, other) + def __matmul__(self, other): from pyiron_workflow.node_library.standard import MatrixMultiply diff --git a/pyiron_workflow/function.py b/pyiron_workflow/function.py index 4192ae108..b1af65753 100644 --- a/pyiron_workflow/function.py +++ b/pyiron_workflow/function.py @@ -634,6 +634,12 @@ def __lt__(self, other): def __le__(self, other): return self.channel.__le__(other) + def eq(self, other): + return self.channel.eq(other) + + def __ne__(self, other): + return self.channel.__ne__(other) + def __gt__(self, other): return self.channel.__gt__(other) @@ -655,6 +661,12 @@ def __add__(self, other): def __sub__(self, other): return self.channel.__sub__(other) + def __mul__(self, other): + return self.channel.__mul__(other) + + def __rmul__(self, other): + return self.channel.__rmul__(other) + def __matmul__(self, other): return self.channel.__matmul__(other) diff --git a/pyiron_workflow/node_library/standard.py b/pyiron_workflow/node_library/standard.py index 7181b5f90..3e3b1c69e 100644 --- a/pyiron_workflow/node_library/standard.py +++ b/pyiron_workflow/node_library/standard.py @@ -88,6 +88,16 @@ def LessThanEquals(obj, other): return obj <= other +@single_value_node("eq") +def Equals(obj, other): + return obj == other + + +@single_value_node("neq") +def NotEquals(obj, other): + return obj != other + + @single_value_node("gt") def GreaterThan(obj, other): return obj > other @@ -161,6 +171,11 @@ def Multiply(obj, other): return obj * other +@single_value_node("rmul") +def RightMultiply(obj, other): + return other * obj + + @single_value_node("matmul") def MatrixMultiply(obj, other): return obj @ other @@ -245,6 +260,7 @@ def Round(obj): Contains, Dir, Divide, + Equals, Float, FloorDivide, GetAttr, @@ -262,9 +278,11 @@ def Round(obj): Modulo, Multiply, Negative, + NotEquals, Or, Positive, Power, + RightMultiply, Round, Slice, String, From c895cc24aa2e9bfac4fe3eade2960ce9d584d908 Mon Sep 17 00:00:00 2001 From: liamhuber Date: Fri, 8 Dec 2023 14:18:55 -0800 Subject: [PATCH 20/30] Give Slice's stop input a show-stopping default So it doesn't execute prematurely with all those defaults and crash hard --- pyiron_workflow/node_library/standard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyiron_workflow/node_library/standard.py b/pyiron_workflow/node_library/standard.py index 3e3b1c69e..1e7820df3 100644 --- a/pyiron_workflow/node_library/standard.py +++ b/pyiron_workflow/node_library/standard.py @@ -47,7 +47,7 @@ def process_run_result(self, function_output): @single_value_node("slice") -def Slice(start=None, stop=None, step=None): +def Slice(start=None, stop=NotData, step=None): if start is None: if stop is None: raise ValueError( From 90a18102c8422e2d72d781f9cdaf8d03e15c79ea Mon Sep 17 00:00:00 2001 From: liamhuber Date: Fri, 8 Dec 2023 14:20:11 -0800 Subject: [PATCH 21/30] Start modifying bad operators Some operators like `len(obj)` get really pissy if `obj.__len__()` doesn't return the type they're expecting. Since we want to be returning, e.g. here, channels instead of ints, we'd better not mess with these operators. I'm following the practice of using their dunder names as the basis for a method. --- pyiron_workflow/channels.py | 25 ++++++++++++++----------- pyiron_workflow/function.py | 12 ++++++------ 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/pyiron_workflow/channels.py b/pyiron_workflow/channels.py index 9a31524f7..b6d9cc566 100644 --- a/pyiron_workflow/channels.py +++ b/pyiron_workflow/channels.py @@ -261,13 +261,16 @@ class DataChannel(Channel, ABC): which is to say it is data (not `NotData`) and that it conforms to the type hint (if one is provided and checking is active). - Output data facilitates most (but not all) python operators by injecting a new - node to perform that operation. These new nodes are instructed to run at the end of - instantiation, but this fails cleanly in case they are not ready. This is intended - to accommodate two likely scenarios: if you're injecting a node on top of an - existing result you probably want the injection result to also be immediately - available, but if you're injecting it at the end of something that hasn't run yet - you don't want to see an error. + Output data facilitates many (but not all) python operators by injecting a new + node to perform that operation. Where the operator is not supported, we try to + support using the operator's dunder name as a method, e.g. `==` gives us trouble + with hashing, but this exploits the dunder method `.__eq__(other)`, so you can call + `.eq(other)` on output data. + These new nodes are instructed to run at the end of instantiation, but this fails + cleanly in case they are not ready. This is intended to accommodate two likely + scenarios: if you're injecting a node on top of an existing result you probably + want the injection result to also be immediately available, but if you're injecting + it at the end of something that hasn't run yet you don't want to see an error. TODO: - Storage (including priority and history) @@ -534,7 +537,7 @@ def _node_injection(self, injection_class, *args, inject_self=True): # Fall back on creating a new node in case parent is None or node nexists node_args = (self, *args) if inject_self else args return injection_class( - *node_args, parent=self.node.parent, label=label + *node_args, parent=self.node.parent, label=label, run_after_init=True ) # We don't wrap __all__ the operators, because you might really want the string or @@ -571,7 +574,7 @@ def __ge__(self, other): return self._node_injection(GreaterThanEquals, other) - def __bool__(self): + def bool(self): from pyiron_workflow.node_library.standard import Bool return self._node_injection(Bool) @@ -595,12 +598,12 @@ def __getitem__(self, item): from pyiron_workflow.node_library.standard import GetItem return self._node_injection(GetItem, item) - def __len__(self): + def len(self): from pyiron_workflow.node_library.standard import Length return self._node_injection(Length) - def __contains__(self, other): + def contains(self, other): from pyiron_workflow.node_library.standard import Contains return self._node_injection(Contains, other) diff --git a/pyiron_workflow/function.py b/pyiron_workflow/function.py index b1af65753..ecba3eef0 100644 --- a/pyiron_workflow/function.py +++ b/pyiron_workflow/function.py @@ -646,14 +646,14 @@ def __gt__(self, other): def __ge__(self, other): return self.channel.__ge__(other) - def __bool__(self): - return self.channel.__bool__() + def bool(self): + return self.channel.bool() - def __len__(self): - return self.channel.__len__() + def len(self): + return self.channel.len() - def __contains__(self, other): - return self.channel.__contains__(other) + def contains(self, other): + return self.channel.contains(other) def __add__(self, other): return self.channel.__add__(other) From bcfdd7e1210e595ddd3d30589abb8394acaa1c74 Mon Sep 17 00:00:00 2001 From: liamhuber Date: Fri, 8 Dec 2023 20:01:35 -0800 Subject: [PATCH 22/30] Refactor: slide --- pyiron_workflow/channels.py | 38 ++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/pyiron_workflow/channels.py b/pyiron_workflow/channels.py index b6d9cc566..17e87393b 100644 --- a/pyiron_workflow/channels.py +++ b/pyiron_workflow/channels.py @@ -544,6 +544,25 @@ def _node_injection(self, injection_class, *args, inject_self=True): # hash or whatever of the actual channel. But we do wrap all the dunder methods # that should be unambiguously referring to an operation on values + def __getattr__(self, name): + from pyiron_workflow.node_library.standard import GetAttr + + return self._node_injection(GetAttr, name) + + def __getitem__(self, item): + # Break slices into deeper injections, if any slice arguments are channel-like + if isinstance(item, slice) and any( + isinstance(slice_input, HasChannel) + for slice_input in [item.start, item.stop, item.step] + ): + from pyiron_workflow.node_library.standard import Slice + item = self._node_injection( + Slice, item.start, item.stop, item.step, inject_self=False + ) + + from pyiron_workflow.node_library.standard import GetItem + return self._node_injection(GetItem, item) + def __lt__(self, other): from pyiron_workflow.node_library.standard import LessThan @@ -579,25 +598,6 @@ def bool(self): return self._node_injection(Bool) - def __getattr__(self, name): - from pyiron_workflow.node_library.standard import GetAttr - - return self._node_injection(GetAttr, name) - - def __getitem__(self, item): - # Break slices into deeper injections, if any slice arguments are channel-like - if isinstance(item, slice) and any( - isinstance(slice_input, HasChannel) - for slice_input in [item.start, item.stop, item.step] - ): - from pyiron_workflow.node_library.standard import Slice - item = self._node_injection( - Slice, item.start, item.stop, item.step, inject_self=False - ) - - from pyiron_workflow.node_library.standard import GetItem - return self._node_injection(GetItem, item) - def len(self): from pyiron_workflow.node_library.standard import Length From fe5ad802f0fb704c7994f1ece4a7c76384eedbb0 Mon Sep 17 00:00:00 2001 From: liamhuber Date: Fri, 8 Dec 2023 20:34:58 -0800 Subject: [PATCH 23/30] Add invert on the SingleValue --- pyiron_workflow/function.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyiron_workflow/function.py b/pyiron_workflow/function.py index ecba3eef0..12372f941 100644 --- a/pyiron_workflow/function.py +++ b/pyiron_workflow/function.py @@ -700,8 +700,8 @@ def __pos__(self): def __abs__(self): return self.channel.__abs__() - def __int__(self): - return self.channel.__int__() + def __invert__(self): + return self.channel.__invert__() def __float__(self): return self.channel.__float__() From 563e0e73085065cabe95efb044af97cdfb7f0280 Mon Sep 17 00:00:00 2001 From: liamhuber Date: Fri, 8 Dec 2023 20:35:22 -0800 Subject: [PATCH 24/30] Redo casts as methods The builtin functions do a stupid type check --- pyiron_workflow/channels.py | 4 ++-- pyiron_workflow/function.py | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pyiron_workflow/channels.py b/pyiron_workflow/channels.py index 17e87393b..dd85d689e 100644 --- a/pyiron_workflow/channels.py +++ b/pyiron_workflow/channels.py @@ -688,12 +688,12 @@ def __invert__(self): return self._node_injection(Invert) - def __int__(self): + def int(self): from pyiron_workflow.node_library.standard import Int return self._node_injection(Int) - def __float__(self): + def float(self): from pyiron_workflow.node_library.standard import Float return self._node_injection(Float) diff --git a/pyiron_workflow/function.py b/pyiron_workflow/function.py index 12372f941..0eb4a5b34 100644 --- a/pyiron_workflow/function.py +++ b/pyiron_workflow/function.py @@ -703,8 +703,11 @@ def __abs__(self): def __invert__(self): return self.channel.__invert__() - def __float__(self): - return self.channel.__float__() + def int(self): + return self.channel.int() + + def float(self): + return self.channel.float() def __round__(self): return self.channel.__round__() From 860250eda681281151a730daa8373a2df2c37f3c Mon Sep 17 00:00:00 2001 From: liamhuber Date: Fri, 8 Dec 2023 20:35:42 -0800 Subject: [PATCH 25/30] Add tests for most of the new operators And the way they propagate all the way to SingleValue --- tests/integration/test_output_injection.py | 184 +++++++++++++++++---- 1 file changed, 155 insertions(+), 29 deletions(-) diff --git a/tests/integration/test_output_injection.py b/tests/integration/test_output_injection.py index b8bc0ef79..3fc550434 100644 --- a/tests/integration/test_output_injection.py +++ b/tests/integration/test_output_injection.py @@ -8,42 +8,169 @@ class TestOutputInjection(unittest.TestCase): """ I.e. the process of inserting new nodes on-the-fly by modifying output channels" """ + def setUp(self) -> None: + self.wf = Workflow("injection") + self.int = Workflow.create.standard.UserInput(42, run_after_init=True) + self.list = Workflow.create.standard.UserInput( + list(range(10)), run_after_init=True + ) - def test_a_few_operations(self): - wf = Workflow("output_manipulation") + def test_equality(self): + with self.subTest("True expressions"): + for expression in [ + self.int < 100, + 0 < self.int, + self.int <= 100, + self.int <= 42, + 0 <= self.int, + self.int.eq(42), + self.int != 43, + self.int > 0, + 100 > self.int, + self.int >= 0, + 100 >= self.int, + self.int >= 42, + ]: + with self.subTest(expression.label): + self.assertTrue(expression.value) + + with self.subTest("False expressions"): + for expression in [ + self.int > 100, + 0 > self.int, + self.int >= 100, + 0 >= self.int, + self.int != 42, + self.int.eq(43), + self.int < 0, + 100 < self.int, + self.int <= 0, + 100 <= self.int, + ]: + with self.subTest(expression.label): + self.assertFalse(expression.value) + + def test_bool(self): + b = self.int.bool() + self.assertTrue(b.value) + self.int.inputs.user_input = False + self.assertFalse(b()) + + def test_len(self): + self.assertEqual(10, self.list.len().value) + + def test_contains(self): + self.assertTrue(self.list.contains(1).value) + self.assertFalse(self.list.contains(-1).value) + + def test_algebra(self): + x = self.int # 42 + for lhs, rhs in [ + (x + x, 2 * x), + (2 * x, x * 2), + (x * x, x**2), + (x - x, 0 * x), + (x + x - x, x), + (x / 42, x / x), + (x // 2, x / 2), + (x // 43, 0 * x), + ((x + 1) % x, x + 1 - x), + (-x, -1 * x), + (+x, (-x)**2 / x), + (x, abs(-x)), + ]: + with self.subTest(f"{lhs.label} == {rhs.label}"): + self.assertEqual(lhs.value, rhs.value) + + # This passes fine, but requires numpy so don't include it + # def test_matmul(self): + # import numpy as np + # + # a = np.random.rand(2, 2) + # b = np.random.rand(2, 2) + # self.wf.a = Workflow.create.standard.UserInput(a, run_after_init=True) + # self.wf.b = Workflow.create.standard.UserInput(b, run_after_init=True) + # self.assertListEqual( + # (self.wf.a @ self.wf.b).value.tolist(), + # (a @ b).tolist() + # ) + + def test_logic(self): + # Note: We can't invert with not etc. because overloading __bool__ does not work + self.true = Workflow.create.standard.UserInput(True, run_after_init=True) + self.false = Workflow.create.standard.UserInput(False, run_after_init=True) - wf.a = Workflow.create.standard.Add(1, 2) - wf.b = Workflow.create.standard.Add(3, 4) - wf.c = Workflow.create.standard.UserInput(list(range(10))) - wf.d = Workflow.create.standard.UserInput({"foo": 42}) + with self.subTest("True expressions"): + for expression in [ + self.true & True, + # True & self.true, # There's no __land__ etc. + self.true & self.true, + self.true ^ False, + # False ^ self.true, + self.true ^ self.false, + self.false ^ self.true, + self.true | False, + self.true | self.false, + self.false | self.true, + self.false | False | self.true, + # False | self.true, + ]: + with self.subTest(expression.label): + self.assertTrue(expression.value) + + with self.subTest("False expressions"): + for expression in [ + self.true & False, + self.false & self.false, + self.false & self.true, + self.true & self.false, + self.true ^ self.true, + self.false ^ self.false, + self.false | self.false, + self.false | False, + ]: + with self.subTest(expression.label): + self.assertFalse(expression.value) + + def test_casts(self): + self.float = Workflow.create.standard.UserInput(42.2, run_after_init=True) + + self.assertIsInstance(self.int.float().value, float) + self.assertIsInstance(self.float.int().value, int) + self.assertEqual(self.int.value, round(self.float).value) + + def test_access(self): + + self.dict = Workflow.create.standard.UserInput( + {"foo": 42}, run_after_init=True + ) class Something: myattr = 1 - wf.e = Workflow.create.standard.UserInput(Something()) - - wf.a.outputs.add < wf.b.outputs.add - wf.c.outputs.user_input[:5] - wf.d.outputs.user_input["foo"] - wf.e.outputs.user_input.myattr - out = wf() - self.assertDictEqual( - out, - { - 'a__add_LessThan_b__add__lt': True, - 'c__user_input_GetItem_slice(None, 5, None)__getitem': [0, 1, 2, 3, 4], - 'd__user_input_GetItem_foo__getitem': 42, - 'e__user_input_GetAttr_myattr__getattr': 1 - } + self.obj = Workflow.create.standard.UserInput( + Something(), run_after_init=True ) - def test_repeated_access(self): + self.assertIsInstance(self.list[0].value, int) + self.assertEqual(5, self.list[:5].len().value) + self.assertEqual(4, self.list[1:5].len().value) + self.assertEqual(3, self.list[-3:].len().value) + self.assertEqual(2, self.list[1:5:2].len().value) + + self.assertEqual(42, self.dict["foo"].value) + self.assertEqual(1, self.obj.myattr.value) + + def test_chaining(self): + self.assertFalse((self.list[:self.int//42][0] != 0).value) + + def test_repeated_access_in_parent_scope(self): wf = Workflow("output_manipulation") - wf.n = Workflow.create.standard.UserInput(list(range(10))) + wf.list = Workflow.create.standard.UserInput(list(range(10))) - a = wf.n.outputs.user_input[:4] - b = wf.n.outputs.user_input[:4] - c = wf.n.outputs.user_input[1:] + a = wf.list[:4] + b = wf.list[:4] + c = wf.list[1:] self.assertIs( a, @@ -57,9 +184,8 @@ def test_repeated_access(self): ) def test_without_parent(self): - n = Workflow.create.standard.UserInput(list(range(10))) - d1 = n.outputs.user_input[5] - d2 = n.outputs.user_input[5] + d1 = self.list[5] + d2 = self.list[5] self.assertIsInstance(d1, Node) self.assertIsNot( From d9caaedd35119d7de710ab3acf333c983fbddf8e Mon Sep 17 00:00:00 2001 From: liamhuber Date: Sat, 9 Dec 2023 13:28:37 -0800 Subject: [PATCH 26/30] Update atomistics notebook --- notebooks/atomistics_nodes.ipynb | 141 +++++++++++++++++-------------- 1 file changed, 76 insertions(+), 65 deletions(-) diff --git a/notebooks/atomistics_nodes.ipynb b/notebooks/atomistics_nodes.ipynb index 1ecd1c5a1..cfd988d1d 100644 --- a/notebooks/atomistics_nodes.ipynb +++ b/notebooks/atomistics_nodes.ipynb @@ -29,7 +29,8 @@ "source": [ "Workflow.register(\"calculator\", \"pyiron_workflow.node_library.atomistics.calculator\")\n", "Workflow.register(\"macro\", \"pyiron_workflow.node_library.atomistics.macro\")\n", - "Workflow.register(\"task\", \"pyiron_workflow.node_library.atomistics.task\")" + "Workflow.register(\"task\", \"pyiron_workflow.node_library.atomistics.task\")\n", + "Workflow.register(\"plotting\", \"pyiron_workflow.node_library.plotting\")" ] }, { @@ -37,24 +38,49 @@ "execution_count": 3, "id": "bc0e6187-236d-4cba-8674-de14a0520257", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "wf = Workflow(\"ev_curve\")\n", "\n", "wf.structure = wf.create.task.Bulk(\"Al\")\n", "wf.calculator = wf.create.calculator.Emt()\n", + "\n", "wf.ev = wf.create.macro.EnergyVolumeCurve(\n", " structure=wf.structure, \n", " calculator=wf.calculator,\n", ")\n", + "wf.ev_plot = wf.create.plotting.Scatter(\n", + " wf.ev.outputs.result_dict['volume'],\n", + " wf.ev.outputs.result_dict['energy']\n", + ")\n", + "\n", "wf.elastic = wf.create.macro.ElasticMatrix(\n", " structure=wf.structure, \n", " calculator=wf.calculator,\n", ")\n", + "wf.C = wf.elastic.outputs.result_dict[\"C\"]\n", + "\n", "wf.phonons = wf.create.macro.Phonons(\n", " structure=wf.structure, \n", " calculator=wf.calculator,\n", - ")" + ")\n", + "wf.dos_plot = wf.create.plotting.Scatter(\n", + " wf.phonons.outputs.result_dict[1][\"frequency_points\"],\n", + " wf.phonons.outputs.result_dict[1][\"total_dos\"],\n", + ")\n", + "\n", + "out = wf()" ] }, { @@ -62,36 +88,51 @@ "execution_count": 4, "id": "585b69dc-7140-4891-be1d-9250827f96ac", "metadata": {}, - "outputs": [], - "source": [ - "out = wf()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "a523bcd8-c7f0-4b55-9592-5a3c37c6f34e", - "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/huber/work/pyiron/pyiron_workflow/pyiron_workflow/channels.py:164: UserWarning: The channel accumulate_and_run was not connected to ran, andthus could not disconnect from it.\n", + " warn(\n", + "/Users/huber/work/pyiron/pyiron_workflow/pyiron_workflow/channels.py:164: UserWarning: The channel ran was not connected to accumulate_and_run, andthus could not disconnect from it.\n", + " warn(\n", + "/Users/huber/work/pyiron/pyiron_workflow/pyiron_workflow/channels.py:164: UserWarning: The channel run was not connected to ran, andthus could not disconnect from it.\n", + " warn(\n" + ] + }, { "data": { "text/plain": [ - "39.544084907317895" + "" ] }, - "execution_count": 5, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ - "out.ev__result_dict[\"bulkmodul_eq\"]" + "wf.ev_plot() \n", + "# We should be able to look at .value.figure\n", + "# but we need to get matplotlib to clear the previous double plot\n", + "# This is something to fix in the plotting package." ] }, { "cell_type": "code", - "execution_count": 6, - "id": "65c4cd50-85dd-405f-9d2f-a0f89cb39c7f", + "execution_count": 5, + "id": "56ec091c-c05a-4d98-8ec3-a98099a26857", "metadata": {}, "outputs": [ { @@ -111,74 +152,44 @@ " 32.8950073 ]])" ] }, - "execution_count": 6, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "out.elastic__result_dict[\"C\"]" + "wf.C" ] }, { "cell_type": "code", - "execution_count": 7, - "id": "f36b7134-fdaf-439c-a8ed-8e0d12dea6ac", + "execution_count": 6, + "id": "b738be10-20f0-4be1-abf7-b2fe8053d170", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([0. , 0. , 0. , 0. , 0. ,\n", - " 0. , 0. , 0. , 0. , 0. ,\n", - " 0. , 0. , 0. , 0. , 0. ,\n", - " 0. , 0. , 0.00694078, 0.00988315, 0.01328576,\n", - " 0.01714862, 0.02147171, 0.02625505, 0.02985557, 0.037727 ,\n", - " 0.0434232 , 0.04946553, 0.05566541, 0.06215958, 0.07115592,\n", - " 0.08064991, 0.09079663, 0.09922499, 0.107314 , 0.11598167,\n", - " 0.12677452, 0.13892215, 0.15277843, 0.16509068, 0.17714585,\n", - " 0.18908449, 0.20207234, 0.21663715, 0.23193372, 0.24787345,\n", - " 0.26531108, 0.28151195, 0.29720939, 0.31555894, 0.33441182,\n", - " 0.35381457, 0.37348888, 0.39467179, 0.41600753, 0.43856869,\n", - " 0.46236269, 0.48653458, 0.51129518, 0.53659094, 0.56254718,\n", - " 0.59054813, 0.62101398, 0.65275413, 0.68514049, 0.71793811,\n", - " 0.75144708, 0.78583379, 0.82253802, 0.86542963, 0.90976761,\n", - " 0.95550071, 1.00263393, 1.05112517, 1.10148731, 1.33991857,\n", - " 1.36193113, 1.34430559, 1.32697925, 1.30233052, 1.2507499 ,\n", - " 1.49092299, 1.63962028, 3.26506443, 2.06872102, 2.14988263,\n", - " 2.25562045, 2.26389212, 2.24957095, 2.23068922, 2.19906969,\n", - " 2.0990768 , 1.92248659, 2.05381061, 2.22262812, 2.26534629,\n", - " 2.39290591, 2.44805769, 2.51126138, 2.56481713, 2.44897559,\n", - " 2.39584353, 2.4114828 , 2.49193391, 2.57081989, 2.57019593,\n", - " 2.41341987, 2.25573881, 2.29896005, 2.57661295, 2.6898915 ,\n", - " 2.52674647, 2.40732058, 2.39797664, 2.6860019 , 2.77461177,\n", - " 2.74267508, 2.68147413, 2.65588543, 2.70193114, 2.76928622,\n", - " 2.6439207 , 2.65435265, 2.90982222, 2.73490294, 1.98457979,\n", - " 1.72106217, 1.58627925, 1.56213379, 1.62154002, 1.73544337,\n", - " 1.70256902, 1.65407997, 1.66713389, 1.67643965, 1.63648852,\n", - " 1.60695654, 1.56655864, 1.61633361, 1.61150893, 1.55133986,\n", - " 1.53831926, 1.50303936, 1.46605859, 1.56752315, 1.43714305,\n", - " 1.24968842, 1.45944483, 1.66145587, 1.75923322, 1.73118812,\n", - " 1.5623509 , 1.49846885, 1.41120813, 1.37756017, 1.49546786,\n", - " 1.17761685, 1.07980165, 0.98605362, 1.08530243, 1.21699949,\n", - " 1.93599882, 2.10774636, 2.30948133, 2.46933119, 2.71827848,\n", - " 2.83882417, 2.97242386, 3.17702959, 3.24129876, 3.4949328 ,\n", - " 3.60987129, 3.83610362, 2.90427366, 2.52017744, 2.24833264,\n", - " 2.03412564, 1.82270575, 1.63369566, 1.45666495, 1.27615313,\n", - " 1.07133396, 0.8484739 , 0.60012783, 0.15450282, 0. ,\n", - " 0. , 0. , 0. , 0. , 0. ,\n", - " 0. , 0. , 0. , 0. , 0. ,\n", - " 0. , 0. , 0. , 0. , 0. ,\n", - " 0. ])" + "" ] }, - "execution_count": 7, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" + }, + { + "data": { + "image/png": "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qKKigmAkCcgZSZB+/fppwoQJqqmpCTpeU1Oj6667zqZROVMgENDixYv14osvatu2bSoqKrJ7SI41bdo0vf3226qrq+t8TJw4UX/zN3+juro6ApE4mjx5co8S9XfeeUeXXXaZTSNytk8++UR9+gRfErOysijtTRJmRhKovLxct912myZOnKiysjKtX79ex44d04IFC+wemqMsWrRIzz33nF5++WXl5eV1zka53W7179/f5tE5S15eXo9cnIEDB2rIkCHk6MTZvffeq+uuu04///nP9Vd/9Vfau3ev1q9fr/Xr19s9NEeaO3eufvazn+nSSy9VSUmJDh48qH/+53/W97//fbuHlhkCSKhf/OIXgcsuuyzQr1+/wPjx4wM7duywe0iOIynk45lnnrF7aBnhxhtvDCxZssTuYTjS5s2bA6WlpYGcnJzAVVddFVi/fr3dQ3Isv98fWLJkSeDSSy8N5ObmBi6//PLAj370o0Bra6vdQ8sI9BkBAAC2ImcEAADYimAEAADYimAEAADYimAEAADYimAEAADYimAEAADYimAEAADYimAEAADYimAEAADYimAEAADYimAEAADYimAEAADY6v8BEKVk8pHuah4AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ - "out.phonons__result_dict[1][\"total_dos\"]" + "wf.dos_plot()" ] } ], From 77adf425be439365a3ca7664e4d0f103996285a9 Mon Sep 17 00:00:00 2001 From: liamhuber Date: Sat, 9 Dec 2023 13:42:46 -0800 Subject: [PATCH 27/30] Update quickstart --- notebooks/quickstart.ipynb | 674 +++++++++++++++++++++++++++++-------- 1 file changed, 530 insertions(+), 144 deletions(-) diff --git a/notebooks/quickstart.ipynb b/notebooks/quickstart.ipynb index 38eda8dfb..344a454ee 100644 --- a/notebooks/quickstart.ipynb +++ b/notebooks/quickstart.ipynb @@ -189,7 +189,9 @@ "\n", "We can work with nodes all by themselves, but since the whole point is to connect them together to make a computation graph, we can get extra tools by intentionally making these children of a `Workflow` node.\n", "\n", - "The `Workflow` class not only gives us access to the decorators for defining new nodes, but also lets us register modules of existing nodes and use them. Let's put together a workflow that uses both an existing node from a package, and a `Function` node that is more general than we used above in that it allows us to have multiple return values. This function node will also exploit our ability to name outputs and give type hints:" + "The `Workflow` class not only gives us access to the decorators for defining new nodes, but also lets us register modules of existing nodes and use them. Let's put together a workflow that uses both an existing node from a package, and a `Function` node that is more general than we used above in that it allows us to have multiple return values. This function node will also exploit our ability to name outputs and give type hints. \n", + "\n", + "We can also take output channels (or single value nodes) and perform many (but not all...) python operations on them to dynamically create new output nodes! Below see how we do math and indexing right on the output channels:" ] }, { @@ -207,238 +209,611 @@ "\n", "\n", - "\n", - "\n", + "\n", + "\n", "clustermy_workflow\n", - "\n", - "my_workflow: Workflow\n", + "\n", + "my_workflow: Workflow\n", "\n", "clustermy_workflowInputs\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", - "Inputs\n", + "\n", + "Inputs\n", "\n", "\n", "clustermy_workflowOutputs\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", - "Outputs\n", + "\n", + "Outputs\n", "\n", "\n", - "clustermy_workflowarrays\n", + "clustermy_workflowarange\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", - "arrays: SquareRange\n", + "\n", + "arange: Arange\n", "\n", "\n", - "clustermy_workflowarraysInputs\n", + "clustermy_workflowarangeInputs\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", - "Inputs\n", + "\n", + "Inputs\n", "\n", "\n", - "clustermy_workflowarraysOutputs\n", + "clustermy_workflowarangeOutputs\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", - "Outputs\n", + "\n", + "Outputs\n", "\n", "\n", - "clustermy_workflowplot\n", + "clustermy_workflowarange__len_Subtract_1\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", - "plot: Scatter\n", + "\n", + "arange__len_Subtract_1: Subtract\n", "\n", "\n", - "clustermy_workflowplotInputs\n", + "clustermy_workflowarange__len_Subtract_1Inputs\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", - "Inputs\n", + "\n", + "Inputs\n", "\n", "\n", + "clustermy_workflowarange__len_Subtract_1Outputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Outputs\n", + "\n", + "\n", + "clustermy_workflowarange__arange_Slice_None_arange__len_Subtract_1__sub_None\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "arange__arange_Slice_None_arange__len_Subtract_1__sub_None: Slice\n", + "\n", + "\n", + "clustermy_workflowarange__arange_Slice_None_arange__len_Subtract_1__sub_NoneInputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Inputs\n", + "\n", + "\n", + "clustermy_workflowarange__arange_Slice_None_arange__len_Subtract_1__sub_NoneOutputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Outputs\n", + "\n", + "\n", + "clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__slice\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "arange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__slice: GetItem\n", + "\n", + "\n", + "clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__sliceInputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Inputs\n", + "\n", + "\n", + "clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__sliceOutputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Outputs\n", + "\n", + "\n", + "clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__slice__getitem_Power_2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "arange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__slice__getitem_Power_2: Power\n", + "\n", + "\n", + "clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__slice__getitem_Power_2Inputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Inputs\n", + "\n", + "\n", + "clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__slice__getitem_Power_2Outputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Outputs\n", + "\n", + "\n", + "clustermy_workflowplot\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "plot: Scatter\n", + "\n", + "\n", + "clustermy_workflowplotInputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Inputs\n", + "\n", + "\n", "clustermy_workflowplotOutputs\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", - "Outputs\n", + "\n", + "Outputs\n", "\n", "\n", "\n", "clustermy_workflowInputsrun\n", - "\n", - "run\n", + "\n", + "run\n", "\n", "\n", - "\n", + "\n", "clustermy_workflowOutputsran\n", - "\n", - "ran\n", + "\n", + "ran\n", "\n", "\n", "\n", "\n", "clustermy_workflowInputsaccumulate_and_run\n", - "\n", - "accumulate_and_run\n", + "\n", + "accumulate_and_run\n", "\n", - "\n", + "\n", "\n", - "clustermy_workflowInputsarrays__x\n", - "\n", - "arrays__x: int\n", + "clustermy_workflowInputsarange__n\n", + "\n", + "arange__n: int\n", "\n", - "\n", - "\n", - "clustermy_workflowarraysInputsx\n", - "\n", - "x: int\n", + "\n", + "\n", + "clustermy_workflowarangeInputsn\n", + "\n", + "n: int\n", "\n", - "\n", - "\n", - "clustermy_workflowInputsarrays__x->clustermy_workflowarraysInputsx\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "clustermy_workflowInputsarange__n->clustermy_workflowarangeInputsn\n", + "\n", + "\n", + "\n", "\n", - "\n", + "\n", + "\n", + "clustermy_workflowInputsarange__len_Subtract_1__other\n", + "\n", + "arange__len_Subtract_1__other\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__len_Subtract_1Inputsother\n", + "\n", + "other\n", + "\n", + "\n", + "\n", + "clustermy_workflowInputsarange__len_Subtract_1__other->clustermy_workflowarange__len_Subtract_1Inputsother\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n", - "clustermy_workflowOutputsplot__fig\n", - "\n", - "plot__fig\n", + "clustermy_workflowInputsarange__arange_Slice_None_arange__len_Subtract_1__sub_None__start\n", + "\n", + "arange__arange_Slice_None_arange__len_Subtract_1__sub_None__start\n", "\n", - "\n", + "\n", + "\n", + "clustermy_workflowarange__arange_Slice_None_arange__len_Subtract_1__sub_NoneInputsstart\n", + "\n", + "start\n", + "\n", + "\n", + "\n", + "clustermy_workflowInputsarange__arange_Slice_None_arange__len_Subtract_1__sub_None__start->clustermy_workflowarange__arange_Slice_None_arange__len_Subtract_1__sub_NoneInputsstart\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n", - "clustermy_workflowarraysInputsrun\n", - "\n", - "run\n", + "clustermy_workflowInputsarange__arange_Slice_None_arange__len_Subtract_1__sub_None__step\n", + "\n", + "arange__arange_Slice_None_arange__len_Subtract_1__sub_None__step\n", "\n", - "\n", - "\n", - "clustermy_workflowarraysOutputsran\n", - "\n", - "ran\n", + "\n", + "\n", + "clustermy_workflowarange__arange_Slice_None_arange__len_Subtract_1__sub_NoneInputsstep\n", + "\n", + "step\n", + "\n", + "\n", + "\n", + "clustermy_workflowInputsarange__arange_Slice_None_arange__len_Subtract_1__sub_None__step->clustermy_workflowarange__arange_Slice_None_arange__len_Subtract_1__sub_NoneInputsstep\n", + "\n", + "\n", + "\n", "\n", - "\n", - "\n", + "\n", "\n", - "clustermy_workflowarraysInputsaccumulate_and_run\n", - "\n", - "accumulate_and_run\n", + "clustermy_workflowInputsarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__slice__getitem_Power_2__other\n", + "\n", + "arange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__slice__getitem_Power_2__other\n", "\n", - "\n", + "\n", + "\n", + "clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__slice__getitem_Power_2Inputsother\n", + "\n", + "other\n", + "\n", + "\n", + "\n", + "clustermy_workflowInputsarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__slice__getitem_Power_2__other->clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__slice__getitem_Power_2Inputsother\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "clustermy_workflowOutputsplot__fig\n", + "\n", + "plot__fig\n", + "\n", + "\n", "\n", - "clustermy_workflowarraysOutputsx\n", - "\n", - "x: ndarray\n", + "clustermy_workflowarangeInputsrun\n", + "\n", + "run\n", "\n", - "\n", + "\n", + "\n", + "clustermy_workflowarangeOutputsran\n", + "\n", + "ran\n", + "\n", + "\n", + "\n", + "\n", + "clustermy_workflowarangeInputsaccumulate_and_run\n", + "\n", + "accumulate_and_run\n", + "\n", + "\n", "\n", + "clustermy_workflowarangeOutputsarange\n", + "\n", + "arange: ndarray\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__sliceInputsobj\n", + "\n", + "obj\n", + "\n", + "\n", + "\n", + "clustermy_workflowarangeOutputsarange->clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__sliceInputsobj\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "clustermy_workflowarangeOutputslen\n", + "\n", + "len: int\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__len_Subtract_1Inputsobj\n", + "\n", + "obj\n", + "\n", + "\n", + "\n", + "clustermy_workflowarangeOutputslen->clustermy_workflowarange__len_Subtract_1Inputsobj\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__len_Subtract_1Inputsrun\n", + "\n", + "run\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__len_Subtract_1Outputsran\n", + "\n", + "ran\n", + "\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__len_Subtract_1Inputsaccumulate_and_run\n", + "\n", + "accumulate_and_run\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__len_Subtract_1Outputssub\n", + "\n", + "sub\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__arange_Slice_None_arange__len_Subtract_1__sub_NoneInputsstop\n", + "\n", + "stop\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__len_Subtract_1Outputssub->clustermy_workflowarange__arange_Slice_None_arange__len_Subtract_1__sub_NoneInputsstop\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__arange_Slice_None_arange__len_Subtract_1__sub_NoneInputsrun\n", + "\n", + "run\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__arange_Slice_None_arange__len_Subtract_1__sub_NoneOutputsran\n", + "\n", + "ran\n", + "\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__arange_Slice_None_arange__len_Subtract_1__sub_NoneInputsaccumulate_and_run\n", + "\n", + "accumulate_and_run\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__arange_Slice_None_arange__len_Subtract_1__sub_NoneOutputsslice\n", + "\n", + "slice\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__sliceInputsitem\n", + "\n", + "item\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__arange_Slice_None_arange__len_Subtract_1__sub_NoneOutputsslice->clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__sliceInputsitem\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__sliceInputsrun\n", + "\n", + "run\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__sliceOutputsran\n", + "\n", + "ran\n", + "\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__sliceInputsaccumulate_and_run\n", + "\n", + "accumulate_and_run\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__sliceOutputsgetitem\n", + "\n", + "getitem\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__slice__getitem_Power_2Inputsobj\n", + "\n", + "obj\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__sliceOutputsgetitem->clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__slice__getitem_Power_2Inputsobj\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "clustermy_workflowplotInputsx\n", - "\n", - "x: Union\n", + "\n", + "x: Union\n", "\n", - "\n", - "\n", - "clustermy_workflowarraysOutputsx->clustermy_workflowplotInputsx\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__sliceOutputsgetitem->clustermy_workflowplotInputsx\n", + "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "clustermy_workflowarraysOutputsx_sq\n", - "\n", - "x_sq: ndarray\n", + "\n", + "\n", + "clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__slice__getitem_Power_2Inputsrun\n", + "\n", + "run\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__slice__getitem_Power_2Outputsran\n", + "\n", + "ran\n", + "\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__slice__getitem_Power_2Inputsaccumulate_and_run\n", + "\n", + "accumulate_and_run\n", + "\n", + "\n", + "\n", + "clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__slice__getitem_Power_2Outputspow\n", + "\n", + "pow\n", "\n", "\n", - "\n", + "\n", "clustermy_workflowplotInputsy\n", - "\n", - "y: Union\n", + "\n", + "y: Union\n", "\n", - "\n", - "\n", - "clustermy_workflowarraysOutputsx_sq->clustermy_workflowplotInputsy\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "clustermy_workflowarange__arange_GetItem_arange__arange_Slice_None_arange__len_Subtract_1__sub_None__slice__getitem_Power_2Outputspow->clustermy_workflowplotInputsy\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clustermy_workflowplotInputsrun\n", - "\n", - "run\n", + "\n", + "run\n", "\n", "\n", - "\n", + "\n", "clustermy_workflowplotOutputsran\n", - "\n", - "ran\n", + "\n", + "ran\n", "\n", "\n", "\n", - "\n", + "\n", "clustermy_workflowplotInputsaccumulate_and_run\n", - "\n", - "accumulate_and_run\n", + "\n", + "accumulate_and_run\n", "\n", "\n", - "\n", + "\n", "clustermy_workflowplotOutputsfig\n", - "\n", - "fig\n", + "\n", + "fig\n", "\n", "\n", - "\n", + "\n", "clustermy_workflowplotOutputsfig->clustermy_workflowOutputsplot__fig\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, "execution_count": 7, @@ -451,17 +826,19 @@ "\n", "wf = Workflow(\"my_workflow\")\n", "\n", - "@Workflow.wrap_as.function_node(\"x\", \"x_sq\")\n", - "def SquareRange(x: int) -> tuple[np.ndarray, np.ndarray]:\n", - " x = np.arange(x)\n", - " return x, (x**2)\n", + "@Workflow.wrap_as.function_node(\"arange\", \"len\")\n", + "def Arange(n: int) -> tuple[np.ndarray, int]:\n", + " \"\"\"\n", + " Two outputs is silly overkill, but just to demonstrate how Function nodes work\n", + " \"\"\"\n", + " return np.arange(n), n\n", "\n", "wf.register(\"plotting\", \"pyiron_workflow.node_library.plotting\")\n", "\n", - "wf.arrays = SquareRange()\n", + "wf.arange = Arange(10)\n", "wf.plot = wf.create.plotting.Scatter(\n", - " x=wf.arrays.outputs.x,\n", - " y=wf.arrays.outputs.x_sq\n", + " x=wf.arange.outputs.arange[:wf.arange.outputs.len -1],\n", + " y=wf.arange.outputs.arange[:wf.arange.outputs.len -1]**2\n", ")\n", "\n", "wf.draw()" @@ -472,7 +849,7 @@ "id": "ffc897e4-0f12-4231-8ebe-82862c890de5", "metadata": {}, "source": [ - "We can see that the workflow automatically exposes unconnected IO of its children and gives them a name based on the child node's name and that node's IO name.\n", + "We can see that the workflow automatically exposes unconnected IO of its children and gives them a name based on the child node's name and that node's IO name. Further, the math and indexing we do automatically injects new nodes after the output. Note that the slicing nodes get re-used in both occurrences for computational efficiency.\n", "\n", "Let's run our workflow and look at the result:" ] @@ -483,10 +860,18 @@ "id": "c499c0ed-7af5-491a-b340-2d2f4f48529c", "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/huber/work/pyiron/pyiron_workflow/pyiron_workflow/node.py:613: UserWarning: The keyword 'arrays__x' was not found among input labels. If you are trying to update a node keyword, please use attribute assignment directly instead of calling\n", + " warnings.warn(\n" + ] + }, { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 8, @@ -495,7 +880,7 @@ }, { "data": { - "image/png": "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hmNZloLBYNjvnDZ/XelujOHE8/xNnjxZb7/9tmpqakLb6NGjNWvWLNXU1Cg5ObnTPjGZx6hdyhoDGzdutPr162c9++yz1sGDB61FixZZ55xzjvXRRx9ZlmVZS5cutebMmRPq/+GHH1pnn322tXjxYuvgwYPWs88+a/Xr18/6y1/+EqshdCvS8f3+97+3SktLrcOHD1sHDhywli5dakmyNm3aFKshdKupqcmqrq62qqurLUnWihUrrOrqauvjjz+2LMv582dZkY/RSXM4f/58y+PxWOXl5VZ9fX1o+/zzz0N9nD6HfRmjk+awuLjYqqystGpra6233nrLuv/++62kpCRr27ZtlmU5f/4sK/IxOmn+uvL1u13iYR4TKnxYlmX98Y9/tAYPHmylpqZal112WYdb4ObOnWtdc801HfqXl5dbl156qZWammoNGTLEWr16teGKIxPJ+JYvX25deOGFVlpamnXeeedZ48ePt1555ZUYVN077be0fX2bO3euZVmJMX+RjtFJcxhuXJKs559/PtTH6XPYlzE6aQ7vuOOO0P8v3/zmN63JkyeHfpQty/nzZ1mRj9FJ89eVr4ePeJhHl2X9/1UlAAAABiTMNR8AAMAZCB8AAMAowgcAADCK8AEAAIwifAAAAKMIHwAAwCjCBwAAMIrwAQAAjCJ8AAAAowgfAADAKMIHAAAwivABAACM+j9THZLTIiRtrwAAAABJRU5ErkJggg==", + "image/png": "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", "text/plain": [ "
" ] @@ -527,13 +912,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "The channel x cannot take the value `5.5` because it is not compliant with the type hint \n" + "Can only set Channel object or connect to existing channels, but the attribute x got assigned 5.5 of type \n" ] } ], "source": [ "try:\n", - " wf.arrays.inputs.x = 5.5\n", + " wf.arange.inputs.x = 5.5\n", "except TypeError as e:\n", " message = e.args[0]\n", " print(message)" @@ -560,15 +945,15 @@ "source": [ "@Workflow.wrap_as.macro_node()\n", "def MySquarePlot(macro):\n", - " macro.arrays = SquareRange()\n", + " macro.arange = Arange()\n", " macro.plot = macro.create.plotting.Scatter(\n", - " x=macro.arrays.outputs.x,\n", - " y=macro.arrays.outputs.x_sq\n", + " x=macro.arange.outputs.arange,\n", + " y=macro.arange.outputs.arange**2\n", " )\n", - " macro.inputs_map = {\"arrays__x\": \"n\"}\n", + " macro.inputs_map = {\"arange__n\": \"n\"}\n", " macro.outputs_map = {\n", - " \"arrays__x\": \"x\",\n", - " \"arrays__x_sq\": \"y\",\n", + " \"arange__arange\": \"x\",\n", + " \"arange__len\": \"n\",\n", " \"plot__fig\": \"fig\"\n", " }\n", " # Note that we also forced regularly hidden IO to be exposed!\n", @@ -584,8 +969,9 @@ { "data": { "text/plain": [ - "{'square_plot__fig': ,\n", - " 'shifted_square_plot__fig': }" + "{'square_plot__n': 10,\n", + " 'square_plot__fig': ,\n", + " 'plus_one_square_plot__fig': }" ] }, "execution_count": 11, @@ -594,7 +980,7 @@ }, { "data": { - "image/png": "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", + "image/png": "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7lYg/h6m4e9hFv4e5uFvkj8F+SVZAAAwvbGDAgAAjENAAQAAxiGgAAAA4xBQAACAcQgon/DCCy8oEonI4/FowYIFeuONN+xuacZqbGzUXXfdJa/Xq+LiYj300EN677337G4L5zU2NsrhcKi2ttbuVmas48ePa/Xq1Zo7d65mzZqlO++8UwcPHrS7rRnp3Llz+s53vqNIJKKioiLdcssteuaZZ5ROp+1uraARUM579dVXVVtbq23btuntt9/WkiVL9MUvflHHjh2zu7UZqaOjQxs2bNBbb72l9vZ2nTt3TlVVVfrggw/sbm3G6+7u1p49e/S5z33O7lZmrNOnT+uee+7R1VdfrZ///OeKxWL63ve+p+uuu87u1makHTt26Pvf/76ampr07rvvaufOnfrud7+r559/3u7WChrHjM9bvHixKioq1NzcnF277bbb9NBDD6mxsdHGziBJf/jDH1RcXKyOjg59/vOft7udGWtoaEgVFRV64YUX9E//9E+68847tXv3brvbmnG2bNmiX//61+zyGuLBBx9UIBDQv/3bv2XX/uIv/kKzZs3Sj370Ixs7K2zsoEg6e/asDh48qKqqqpz1qqoqdXZ22tQVPimRSEiS5syZY3MnM9uGDRv0wAMP6P7777e7lRmtpaVFCxcu1Fe/+lUVFxdr/vz5evHFF+1ua8a699579ctf/lLvv/++JOm3v/2t3nzzTX3pS1+yubPCVpA3C8y3P/7xj0qlUgoEAjnrgUBA/f39NnWFCyzL0saNG3XvvfeqvLzc7nZmrFdeeUWHDh1Sd3e33a3MeL///e/V3NysjRs36u///u/V1dWlb33rW3K73VqzZo3d7c04mzdvViKR0Lx58+RyuZRKpfTss8/q4Ycftru1gkZA+QSHw5Hz3LKsUWuYek888YR+97vf6c0337S7lRmrr69PTz31lPbv3y+Px2N3OzNeOp3WwoUL1dDQIEmaP3++jhw5oubmZgKKDV599VXt3btX+/bt0+23367Dhw+rtrZW4XBYjz76qN3tFSwCiqQbbrhBLpdr1G7JwMDAqF0VTK0nn3xSLS0tOnDggG666Sa725mxDh48qIGBAS1YsCC7lkqldODAATU1NWlkZEQul8vGDmeWUCikaDSas3bbbbfpxz/+sU0dzWzf/va3tWXLFn3961+XJN1xxx06evSoGhsbCShXgO+gSLrmmmu0YMECtbe356y3t7ersrLSpq5mNsuy9MQTT+gnP/mJfvWrXykSidjd0ox233336Z133tHhw4ezj4ULF+qRRx7R4cOHCSdT7J577hl17P79999XaWmpTR3NbB9++KGcztyPU5fLxTHjK8QOynkbN27UN77xDS1cuFB333239uzZo2PHjunxxx+3u7UZacOGDdq3b59++tOfyuv1Zne3/H6/ioqKbO5u5vF6vaO+/3Pttddq7ty5fC/IBk8//bQqKyvV0NCglStXqqurS3v27NGePXvsbm1Gqqmp0bPPPqubb75Zt99+u95++23t2rVL3/zmN+1urbBZyPqXf/kXq7S01LrmmmusiooKq6Ojw+6WZixJl3z84Ac/sLs1nLd06VLrqaeesruNGau1tdUqLy+33G63NW/ePGvPnj12tzRjJZNJ66mnnrJuvvlmy+PxWLfccou1bds2a2RkxO7WChpzUAAAgHH4DgoAADAOAQUAABiHgAIAAIxDQAEAAMYhoAAAAOMQUAAAgHEIKAAAwDgEFAAAYBwCCgAAMA4BBQAAGIeAAgAAjENAAQAAxvn/lASCsr1Dz/AAAAAASUVORK5CYII=", "text/plain": [ "
" ] @@ -607,10 +993,10 @@ "wf2 = Workflow(\"my_composed_workflow\")\n", "\n", "wf2.square_plot = MySquarePlot(n=10)\n", - "wf2.shift = AddOne(wf2.square_plot.outputs.x)\n", - "wf2.shifted_square_plot = wf2.create.plotting.Scatter(\n", - " x=wf2.shift,\n", - " y=wf2.square_plot.outputs.y,\n", + "wf2.plus_one = wf2.square_plot.outputs.x + 1\n", + "wf2.plus_one_square_plot = wf2.create.plotting.Scatter(\n", + " x=wf2.square_plot.outputs.x,\n", + " y=wf2.plus_one**2,\n", ")\n", "wf2()" ] From 99bd93c34236d922df3506928239b15f9adc6ad2 Mon Sep 17 00:00:00 2001 From: liamhuber Date: Sat, 9 Dec 2023 14:20:31 -0800 Subject: [PATCH 28/30] Update deepdive --- notebooks/deepdive.ipynb | 2170 +++++++++++++++++++++++++------------- 1 file changed, 1438 insertions(+), 732 deletions(-) diff --git a/notebooks/deepdive.ipynb b/notebooks/deepdive.ipynb index 1c4d22eea..781dd5369 100644 --- a/notebooks/deepdive.ipynb +++ b/notebooks/deepdive.ipynb @@ -524,8 +524,6 @@ "name": "stderr", "output_type": "stream", "text": [ - "/Users/huber/work/pyiron/pyiron_workflow/pyiron_workflow/channels.py:164: UserWarning: The channel ran was not connected to run, andthus could not disconnect from it.\n", - " warn(\n", "/Users/huber/work/pyiron/pyiron_workflow/pyiron_workflow/channels.py:164: UserWarning: The channel run was not connected to ran, andthus could not disconnect from it.\n", " warn(\n" ] @@ -636,6 +634,210 @@ "This let's us set up nodes which only start running after _all_ of their up-data-stream nodes have fired their `ran` signal. This is the default behaviour when `Composite` `Workflow` or `Macro` nodes automate their execution flow for DAG data graphs. We'll look at it again near the end of the notebook when we talk about remote execution." ] }, + { + "cell_type": "markdown", + "id": "6d464066-4271-41be-a34f-20c78d75867c", + "metadata": {}, + "source": [ + "# Output manipulation\n", + "\n", + "Most (but not all) python operations can be performed _directly on output channels_. This works by injecting new nodes after the output channels to perform the requested operation.\n", + "\n", + "Let's look at how we can repeat some of the above examples much more succinctly using this feature:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "98312fbb-0e87-417c-9780-d22903cdb3f4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "9" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Subtract and square\n", + "\n", + "x = Linear(x=4)\n", + "y = Linear(x=1)\n", + "((x.outputs.x - y.outputs.x)**2).pull() # It's just a node so we can pull it" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "b0e8fc87-fba1-4501-882b-f162c4eadf97", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "20" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Times two\n", + "l = Linear(x=10, run_after_init=True)\n", + "(2*l.outputs.x).value # These nodes will try to run right away if everything upstream is ready" + ] + }, + { + "cell_type": "markdown", + "id": "3052c26c-3559-4d61-8c93-08708293b88c", + "metadata": {}, + "source": [ + "This also works with more sophisticated features like attribute and item access, including slicing:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "8a195c41-233e-4076-ad77-008c93297f9c", + "metadata": {}, + "outputs": [], + "source": [ + "foo = [1, 2, 3]" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "6805b0c3-9103-49f4-bc29-569b0b4d6ed0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "foo.reverse" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "7c4cbe66-9b0a-428b-835f-31959a7f75bb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 2]" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a_list = Linear(x=[1,2,3,4], run_after_init=True)\n", + "a_list.outputs.x[:2].value" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "16c2d0de-de6f-4b33-84e4-aefbe5db4177", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a_dict = Linear(x={\"a\": 1, \"b\": 2}, run_after_init=True)\n", + "a_dict.outputs.x[\"a\"].value" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "30b4ed75-bb73-44bb-b6d9-fe525b924652", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "42" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "class Foo:\n", + " bar = 42\n", + " \n", + "an_object = Linear(x=Foo(), run_after_init=True)\n", + "an_object.outputs.x.bar.value" + ] + }, + { + "cell_type": "markdown", + "id": "eab9c6b6-c954-471a-8613-792590e0464f", + "metadata": {}, + "source": [ + "Some features don't work this way, e.g. overriding the `==` operator has other deterious effects so we don't do that. Most of these operators are available as a method on output channels, based on their dunder name. E.g." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "786b1402-b595-4337-8872-fd58687c2725", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(True, False)" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = Linear(x=42)\n", + "b = Linear(x=42)\n", + "c = Linear(x=0)\n", + "\n", + "a_eq_b = a.outputs.x.eq(b.outputs.x)\n", + "a_eq_c = a.outputs.x.eq(c.outputs.x)\n", + "\n", + "(a_eq_b | a_eq_c).pull(), (a_eq_b & a_eq_c).pull()" + ] + }, { "cell_type": "markdown", "id": "e5c531a3-77e4-48ad-a189-fed619e79baa", @@ -645,14 +847,14 @@ "\n", "Many functions return just a single value. In this case, we can take advantage of the `SingleValue` node class which employs a bunch of syntactic tricks to make our lives easier.\n", "\n", - "The main difference between this and it's parent the `Function` class is that attribute and item access fall back to looking for attributes and items of this single output value.\n", + "The main difference between this and it's parent the `Function` class is that attribute and item access fall back to looking for attributes and items of this single output channel. I.e. you can use a single value node in many places you'd use an output channel, including in connection formation and output manipulation\n", "\n", - "Let's look at a use case:" + "Let's look at a use case for output manipulation:" ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 31, "id": "1a4e9693-0980-4435-aecc-3331d8b608dd", "metadata": {}, "outputs": [], @@ -664,7 +866,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 32, "id": "7c4d314b-33bb-4a67-bfb9-ed77fba3949c", "metadata": {}, "outputs": [ @@ -689,8 +891,8 @@ "lin()\n", "\n", "print(type(lin.outputs.linspace.value)) # Output is just what we expect\n", - "print(lin[1:4]) # Gets items from the output\n", - "print(lin.mean()) # Finds the method on the output -- a special feature of SingleValueNode" + "print(lin[1:4].value) # Gets items from the output\n", + "print(lin.mean.value()) # Outputs the method on the output, which we can then call" ] }, { @@ -698,12 +900,12 @@ "id": "eef23cb0-6192-4fe6-b9cc-007e261e347a", "metadata": {}, "source": [ - "The other advantage is that single value nodes can also be connected directly to input, since there is only one possible data connection. Of course it has a construction decorator just like `Function`, so let's replace `@function_node` with `@single_value_node` in one of our examples above to see how it tightens up the syntax a bit:" + "Our examples above also become more compact:" ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 33, "id": "61ae572f-197b-4a60-8d3e-e19c1b9cc6e2", "metadata": {}, "outputs": [ @@ -713,7 +915,7 @@ "4" ] }, - "execution_count": 25, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -734,6 +936,35 @@ "t2.pull()" ] }, + { + "cell_type": "markdown", + "id": "01780601-f2fd-4730-acb8-95a7359d4b3c", + "metadata": {}, + "source": [ + "Or even just" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "5dd7ebc2-b45f-4759-bfc4-d4dd29afe216", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(2*l).value" + ] + }, { "cell_type": "markdown", "id": "b2e56a64-d053-4127-bb8c-069777c1c6b5", @@ -744,7 +975,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 35, "id": "6569014a-815b-46dd-8b47-4e1cd4584b3b", "metadata": {}, "outputs": [ @@ -758,7 +989,7 @@ }, { "data": { - "image/png": "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HAAAMAiD/f3m2jQAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKtCCiPl5eXKyMiQ2+1WTk6OampqvrJ/V1eX1qxZo/T0dCUlJWnq1KnatGlTSAUDAIDRJcHpBtu3b9fy5ctVXl6u2bNn68knn9T8+fNVX1+v//mf/+l3mxtvvFEfffSRNm7cqPPOO0/Nzc06derUkIsHAAAjn8sYY5xsMGvWLGVnZ6uioqK3bfr06VqwYIHKysr69K+qqtJNN92ko0ePKiUlJaQi29vb5fF45Pf7lZycHNJjAACA6Brs77ej3TQnT57U/v37VVBQENReUFCgvXv39rvNyy+/rJkzZ+rBBx/UpEmTdMEFF+jee+/V559/PuDzdHV1qb29PegGAABGJ0e7aVpaWhQIBJSamhrUnpqaqqampn63OXr0qHbv3i23260dO3aopaVFd9xxh9ra2gY8bqSsrEylpaVOSgMAACNUSAewulyuoPvGmD5tPbq7u+VyubRlyxbl5ubq2muv1cMPP6xnnnlmwNmR1atXy+/3996OHTsWSpkAgDALdBu9daRVfzz4od460qpAt6M9/UC/HM2MTJgwQfHx8X1mQZqbm/vMlvTwer2aNGmSPB5Pb9v06dNljNHx48d1/vnn99kmKSlJSUlJTkoDAERYVZ1PpTvr5fN39rZ5PW6VFGZqXpbXYmUY6RzNjCQmJionJ0fV1dVB7dXV1crPz+93m9mzZ+vEiRP65JNPetsO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jAy53W7l5OSopqZmwL4vvfSS5s6dq7PPPlvJycnKy8vTq6++GsVqI8fJOOzevVuzZ8/W+PHjNWbMGF144YV65JFHolhtZDgZgy/as2ePEhISdMkll0S2wChxMg5vvPGGXC5Xn9vf/va3KFYcfk7fC11dXVqzZo3S09OVlJSkqVOnatOmTVGqNnKcjMOtt97a73thxowZUaw4/Jy+F7Zs2aKLL75YZ555prxer2677Ta1trZGqdoQGVj1u9/9zpxxxhnmt7/9ramvrzd33323GTt2rPnggw/67X/33XebBx54wOzbt88cPnzYrF692pxxxhnmwIEDUa48vJyOw4EDB8zWrVtNXV2daWhoMM8995w588wzzZNPPhnlysPH6Rj0+Pjjj825555rCgoKzMUXXxydYiPI6Ti8/vrrRpL5+9//bnw+X+/t1KlTUa48fEJ5L1x//fVm1qxZprq62jQ0NJg///nPZs+ePVGsOvycjsPHH38c9B44duyYSUlJMSUlJdEtPIycjkFNTY2Ji4szjz76qDl69KipqakxM2bMMAsWLIhy5c4QRizLzc01xcXFQW0XXnihWbVq1aAfIzMz05SWloa7tKgKxzh873vfMwsXLgx3aVET6hgUFRWZX/ziF6akpGRUhBGn49ATRv79739HobrocDoGr7zyivF4PKa1tTUa5UXNUL8XduzYYVwul/nnP/8ZifKiwukY/PKXvzTnnntuUNtjjz1mJk+eHLEaw4HdNBadPHlS+/fvV0FBQVB7QUGB9u7dO6jH6O7uVkdHh1JSUiJRYlSEYxxqa2u1d+9eXXHFFZEoMeJCHYOnn35aR44cUUlJSaRLjIqhvBcuvfRSeb1eXXXVVXr99dcjWWZEhTIGL7/8smbOnKkHH3xQkyZN0gUXXKB7771Xn3/+eTRKjohwfC9s3LhRV199tdLT0yNRYsSFMgb5+fk6fvy4KisrZYzRRx99pBdeeEHXXXddNEoO2Yi4UN5o1dLSokAgoNTU1KD21NRUNTU1DeoxHnroIX366ae68cYbI1FiVAxlHCZPnqx//etfOnXqlNauXavbb789kqVGTChj8P7772vVqlWqqalRQsLo+CiHMg5er1cbNmxQTk6Ourq69Nxzz+mqq67SG2+8oe985zvRKDusQhmDo0ePavfu3XK73dqxY4daWlp0xx13qK2tbcQeNzLU70efz6dXXnlFW7dujVSJERfKGOTn52vLli0qKipSZ2enTp06peuvv16PP/54NEoO2ej4BhvhXC5X0H1jTJ+2/mzbtk1r167VH//4R02cODFS5UVNKONQU1OjTz75RG+//bZWrVql8847Tz/4wQ8iWWZEDXYMAoGAbr75ZpWWluqCCy6IVnlR4+S9MG3aNE2bNq33fl5eno4dO6Zf/epXIzKM9HAyBt3d3XK5XNqyZUvvFVIffvhh3XDDDVq/fr3GjBkT8XojJdTvx2eeeUZnnXWWFixYEKHKosfJGNTX12vZsmW67777dM0118jn82nlypUqLi7Wxo0bo1FuSAgjFk2YMEHx8fF9Em5zc3OfJPxl27dv15IlS/T888/r6quvjmSZETeUccjIyJAkffvb39ZHH32ktWvXjsgw4nQMOjo69M4776i2tlZ33XWXpNM/SMYYJSQk6LXXXtOVV14ZldrDaSjvhS+67LLLtHnz5nCXFxWhjIHX69WkSZOCLtU+ffp0GWN0/PhxnX/++RGtORKG8l4wxmjTpk1atGiREhMTI1lmRIUyBmVlZZo9e7ZWrlwpSbrooos0duxYzZkzR/fff7+8Xm/E6w4Fx4xYlJiYqJycHFVXVwe1V1dXKz8/f8Dttm3bpltvvVVbt24d9vsBByPUcfgyY4y6urrCXV5UOB2D5ORkvfvuuzp48GDvrbi4WNOmTdPBgwc1a9asaJUeVuF6L9TW1g7bL92vE8oYzJ49WydOnNAnn3zS23b48GHFxcVp8uTJEa03UobyXti1a5f+8Y9/aMmSJZEsMeJCGYPPPvtMcXHBP+3x8fGSTn9HDltWDptFr57TtjZu3Gjq6+vN8uXLzdixY3uP/l61apVZtGhRb/+tW7eahIQEs379+qBT2D7++GNbLyEsnI7DE088YV5++WVz+PBhc/jwYbNp0yaTnJxs1qxZY+slDJnTMfiy0XI2jdNxeOSRR8yOHTvM4cOHTV1dnVm1apWRZF588UVbL2HInI5BR0eHmTx5srnhhhvMe++9Z3bt2mXOP/98c/vtt9t6CWER6mdi4cKFZtasWdEuNyKcjsHTTz9tEhISTHl5uTly5IjZvXu3mTlzpsnNzbX1EgaFMDIMrF+/3qSnp5vExESTnZ1tdu3a1fu3W265xVxxxRW996+44gojqc/tlltuiX7hYeZkHB577DEzY8YMc+aZZ5rk5GRz6aWXmvLychMIBCxUHj5OxuDLRksYMcbZODzwwANm6tSpxu12m29+85vm8ssvN3/6058sVB1eTt8Lhw4dMldffbUZM2aMmTx5slmxYoX57LPPolx1+Dkdh48//tiMGTPGbNiwIcqVRo7TMXjsscdMZmamGTNmjPF6veaHP/yhOX78eJSrdsZlzHCetwEAAKMdx4wAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACs+v+L01PP7QJlgQAAAABJRU5ErkJggg==", + "image/png": "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", "text/plain": [ "
" ] @@ -813,7 +1044,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 36, "id": "1cd000bd-9b24-4c39-9cac-70a3291d0660", "metadata": {}, "outputs": [], @@ -840,7 +1071,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 37, "id": "7964df3c-55af-4c25-afc5-9e07accb606a", "metadata": {}, "outputs": [ @@ -866,7 +1097,7 @@ "for i, (label, node) in enumerate(wf.nodes.items()):\n", " x = i / len(wf)\n", " node(x=x)\n", - " print(f\"{label} == {node.label}) {x} > 0.5 {node.single_value}\")" + " print(f\"{label} == {node.label}) {x} > 0.5 {node.value}\")" ] }, { @@ -887,7 +1118,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 38, "id": "809178a5-2e6b-471d-89ef-0797db47c5ad", "metadata": {}, "outputs": [ @@ -941,7 +1172,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 39, "id": "52c48d19-10a2-4c48-ae81-eceea4129a60", "metadata": {}, "outputs": [ @@ -951,7 +1182,7 @@ "{'ay': 3, 'a + b + 2': 7}" ] }, - "execution_count": 30, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } @@ -979,7 +1210,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 40, "id": "bb35ba3e-602d-4c9c-b046-32da9401dd1c", "metadata": {}, "outputs": [ @@ -989,7 +1220,7 @@ "(7, 3)" ] }, - "execution_count": 31, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } @@ -1008,7 +1239,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 41, "id": "2b0d2c85-9049-417b-8739-8a8432a1efbe", "metadata": {}, "outputs": [ @@ -1350,10 +1581,10 @@ "
\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 32, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } @@ -1380,14 +1611,14 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 42, "id": "ae500d5e-e55b-432c-8b5f-d5892193cdf5", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "a4dc82761024407e909840aab64b54de", + "model_id": "f77a418c673c4579b9a3a6cbd090ef8e", "version_major": 2, "version_minor": 0 }, @@ -1406,10 +1637,10 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 33, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" }, @@ -1452,7 +1683,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 43, "id": "2114d0c3-cdad-43c7-9ffa-50c36d56d18f", "metadata": {}, "outputs": [ @@ -1666,10 +1897,10 @@ "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 34, + "execution_count": 43, "metadata": {}, "output_type": "execute_result" } @@ -1706,7 +1937,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 44, "id": "c71a8308-f8a1-4041-bea0-1c841e072a6d", "metadata": {}, "outputs": [], @@ -1716,7 +1947,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 45, "id": "2b9bb21a-73cd-444e-84a9-100e202aa422", "metadata": {}, "outputs": [ @@ -1734,7 +1965,7 @@ "13" ] }, - "execution_count": 36, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } @@ -1781,7 +2012,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 46, "id": "3668f9a9-adca-48a4-84ea-13add965897c", "metadata": {}, "outputs": [ @@ -1791,7 +2022,7 @@ "{'intermediate': 102, 'plus_three': 103}" ] }, - "execution_count": 37, + "execution_count": 46, "metadata": {}, "output_type": "execute_result" } @@ -1829,7 +2060,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 47, "id": "9aaeeec0-5f88-4c94-a6cc-45b56d2f0111", "metadata": {}, "outputs": [], @@ -1848,18 +2079,12 @@ " macro.outputs_map = {\n", " \"calc__energy_pot\": \"energy\",\n", " \"structure__structure\": \"structure\",\n", - " }\n", - "\n", - "@Workflow.wrap_as.single_value_node()\n", - "def PerAtomEnergyDifference(structure1, energy1, structure2, energy2):\n", - " # The unrelaxed structure is fine, we're just using it to get n_atoms\n", - " de = (energy2[-1]/len(structure2)) - (energy1[-1]/len(structure1))\n", - " return de" + " }" ] }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 48, "id": "a832e552-b3cc-411a-a258-ef21574fc439", "metadata": {}, "outputs": [], @@ -1868,12 +2093,28 @@ "wf.element = wf.create.standard.UserInput()\n", "wf.min_phase1 = LammpsMinimize(element=wf.element)\n", "wf.min_phase2 = LammpsMinimize(element=wf.element)\n", - "wf.compare = PerAtomEnergyDifference(\n", - " wf.min_phase1.outputs.structure,\n", - " wf.min_phase1.outputs.energy,\n", - " wf.min_phase2.outputs.structure,\n", - " wf.min_phase2.outputs.energy,\n", - ")\n", + "\n", + "wf.e1 = wf.min_phase1.outputs.energy[-1]\n", + "wf.n1 = wf.min_phase1.outputs.structure.len()\n", + "wf.e2 = wf.min_phase2.outputs.energy[-1]\n", + "wf.n2 = wf.min_phase2.outputs.structure.len()\n", + "wf.compare = (wf.e2 / wf.n2) - (wf.e1 / wf.n1)\n", + "\n", + "\n", + "# Or we could write a single node to do that:\n", + "\n", + "# @Workflow.wrap_as.single_value_node()\n", + "# def PerAtomEnergyDifference(structure1, energy1, structure2, energy2):\n", + "# # The unrelaxed structure is fine, we're just using it to get n_atoms\n", + "# sub = (energy2[-1]/len(structure2)) - (energy1[-1]/len(structure1))\n", + "# return sub\n", + "\n", + "# wf.compare = PerAtomEnergyDifference(\n", + "# wf.min_phase1.outputs.structure,\n", + "# wf.min_phase1.outputs.energy,\n", + "# wf.min_phase2.outputs.structure,\n", + "# wf.min_phase2.outputs.energy,\n", + "# )\n", "\n", "wf.inputs_map = {\n", " \"element__user_input\": \"element\",\n", @@ -1886,7 +2127,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 49, "id": "b764a447-236f-4cb7-952a-7cba4855087d", "metadata": {}, "outputs": [ @@ -1899,1251 +2140,1715 @@ "\n", "\n", - "\n", - "\n", + "\n", + "\n", "clusterphase_preference\n", - "\n", - "phase_preference: Workflow\n", - "\n", - "clusterphase_preferencecompare\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "compare: PerAtomEnergyDifference\n", - "\n", - "\n", - "clusterphase_preferencecompareInputs\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Inputs\n", - "\n", - "\n", - "clusterphase_preferencecompareOutputs\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Outputs\n", - "\n", + "\n", + "phase_preference: Workflow\n", "\n", "clusterphase_preferenceInputs\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", - "Inputs\n", + "\n", + "Inputs\n", "\n", "\n", "clusterphase_preferenceOutputs\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", - "Outputs\n", + "\n", + "Outputs\n", "\n", "\n", "clusterphase_preferenceelement\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", - "element: UserInput\n", + "\n", + "element: UserInput\n", "\n", "\n", "clusterphase_preferenceelementInputs\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", - "Inputs\n", + "\n", + "Inputs\n", "\n", "\n", "clusterphase_preferenceelementOutputs\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", - "Outputs\n", + "\n", + "Outputs\n", "\n", "\n", "clusterphase_preferencemin_phase1\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", - "min_phase1: LammpsMinimize\n", + "\n", + "min_phase1: LammpsMinimize\n", "\n", "\n", "clusterphase_preferencemin_phase1Inputs\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", - "Inputs\n", + "\n", + "Inputs\n", "\n", "\n", "clusterphase_preferencemin_phase1Outputs\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", - "Outputs\n", + "\n", + "Outputs\n", "\n", "\n", "clusterphase_preferencemin_phase2\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", - "min_phase2: LammpsMinimize\n", + "\n", + "min_phase2: LammpsMinimize\n", "\n", "\n", "clusterphase_preferencemin_phase2Inputs\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", - "Inputs\n", + "\n", + "Inputs\n", "\n", "\n", "clusterphase_preferencemin_phase2Outputs\n", "\n", - "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", - "Outputs\n", + "\n", + "Outputs\n", "\n", - "\n", - "\n", - "clusterphase_preferenceInputsrun\n", - "\n", - "run\n", + "\n", + "clusterphase_preferencee1\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "e1: GetItem\n", + "\n", + "\n", + "clusterphase_preferencee1Inputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Inputs\n", + "\n", + "\n", + "clusterphase_preferencee1Outputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Outputs\n", + "\n", + "\n", + "clusterphase_preferencen1\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "n1: Length\n", + "\n", + "\n", + "clusterphase_preferencen1Inputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Inputs\n", + "\n", + "\n", + "clusterphase_preferencen1Outputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Outputs\n", + "\n", + "\n", + "clusterphase_preferencee2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "e2: GetItem\n", + "\n", + "\n", + "clusterphase_preferencee2Inputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Inputs\n", + "\n", + "\n", + "clusterphase_preferencee2Outputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Outputs\n", + "\n", + "\n", + "clusterphase_preferencen2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "n2: Length\n", + "\n", + "\n", + "clusterphase_preferencen2Inputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Inputs\n", + "\n", + "\n", + "clusterphase_preferencen2Outputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Outputs\n", + "\n", + "\n", + "clusterphase_preferencee2__getitem_Divide_n2__len\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "e2__getitem_Divide_n2__len: Divide\n", + "\n", + "\n", + "clusterphase_preferencee2__getitem_Divide_n2__lenInputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Inputs\n", + "\n", + "\n", + "clusterphase_preferencee2__getitem_Divide_n2__lenOutputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Outputs\n", + "\n", + "\n", + "clusterphase_preferencee1__getitem_Divide_n1__len\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "e1__getitem_Divide_n1__len: Divide\n", + "\n", + "\n", + "clusterphase_preferencee1__getitem_Divide_n1__lenInputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Inputs\n", + "\n", + "\n", + "clusterphase_preferencee1__getitem_Divide_n1__lenOutputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Outputs\n", + "\n", + "\n", + "clusterphase_preferencecompare\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "compare: Subtract\n", + "\n", + "\n", + "clusterphase_preferencecompareInputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Inputs\n", + "\n", + "\n", + "clusterphase_preferencecompareOutputs\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Outputs\n", + "\n", + "\n", + "\n", + "clusterphase_preferenceInputsrun\n", + "\n", + "run\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsran\n", - "\n", - "ran\n", + "\n", + "ran\n", "\n", "\n", "\n", "\n", "clusterphase_preferenceInputsaccumulate_and_run\n", - "\n", - "accumulate_and_run\n", + "\n", + "accumulate_and_run\n", "\n", "\n", "\n", "clusterphase_preferenceInputselement\n", - "\n", - "element\n", + "\n", + "element\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceelementInputsuser_input\n", - "\n", - "user_input\n", + "\n", + "user_input\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceInputselement->clusterphase_preferenceelementInputsuser_input\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "clusterphase_preferenceInputsphase1\n", - "\n", - "phase1\n", + "\n", + "phase1\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Inputscrystalstructure\n", - "\n", - "crystalstructure\n", + "\n", + "crystalstructure\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceInputsphase1->clusterphase_preferencemin_phase1Inputscrystalstructure\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "clusterphase_preferenceInputslattice_guess1\n", - "\n", - "lattice_guess1\n", + "\n", + "lattice_guess1\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Inputslattice_guess\n", - "\n", - "lattice_guess\n", + "\n", + "lattice_guess\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceInputslattice_guess1->clusterphase_preferencemin_phase1Inputslattice_guess\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "clusterphase_preferenceInputsmin_phase1__structure__c\n", - "\n", - "min_phase1__structure__c\n", + "\n", + "min_phase1__structure__c\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Inputsstructure__c\n", - "\n", - "structure__c\n", + "\n", + "structure__c\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceInputsmin_phase1__structure__c->clusterphase_preferencemin_phase1Inputsstructure__c\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "clusterphase_preferenceInputsmin_phase1__structure__covera\n", - "\n", - "min_phase1__structure__covera\n", + "\n", + "min_phase1__structure__covera\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Inputsstructure__covera\n", - "\n", - "structure__covera\n", + "\n", + "structure__covera\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceInputsmin_phase1__structure__covera->clusterphase_preferencemin_phase1Inputsstructure__covera\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "clusterphase_preferenceInputsmin_phase1__structure__u\n", - "\n", - "min_phase1__structure__u\n", + "\n", + "min_phase1__structure__u\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Inputsstructure__u\n", - "\n", - "structure__u\n", + "\n", + "structure__u\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceInputsmin_phase1__structure__u->clusterphase_preferencemin_phase1Inputsstructure__u\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "clusterphase_preferenceInputsmin_phase1__structure__orthorhombic\n", - "\n", - "min_phase1__structure__orthorhombic\n", + "\n", + "min_phase1__structure__orthorhombic\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Inputsstructure__orthorhombic\n", - "\n", - "structure__orthorhombic\n", + "\n", + "structure__orthorhombic\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceInputsmin_phase1__structure__orthorhombic->clusterphase_preferencemin_phase1Inputsstructure__orthorhombic\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "clusterphase_preferenceInputsmin_phase1__structure__cubic\n", - "\n", - "min_phase1__structure__cubic\n", + "\n", + "min_phase1__structure__cubic\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Inputsstructure__cubic\n", - "\n", - "structure__cubic\n", + "\n", + "structure__cubic\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceInputsmin_phase1__structure__cubic->clusterphase_preferencemin_phase1Inputsstructure__cubic\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "clusterphase_preferenceInputsmin_phase1__calc__n_ionic_steps\n", - "\n", - "min_phase1__calc__n_ionic_steps: int\n", + "\n", + "min_phase1__calc__n_ionic_steps: int\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Inputscalc__n_ionic_steps\n", - "\n", - "calc__n_ionic_steps: int\n", + "\n", + "calc__n_ionic_steps: int\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceInputsmin_phase1__calc__n_ionic_steps->clusterphase_preferencemin_phase1Inputscalc__n_ionic_steps\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "clusterphase_preferenceInputsmin_phase1__calc__n_print\n", - "\n", - "min_phase1__calc__n_print: int\n", + "\n", + "min_phase1__calc__n_print: int\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Inputscalc__n_print\n", - "\n", - "calc__n_print: int\n", + "\n", + "calc__n_print: int\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceInputsmin_phase1__calc__n_print->clusterphase_preferencemin_phase1Inputscalc__n_print\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "clusterphase_preferenceInputsmin_phase1__calc__pressure\n", - "\n", - "min_phase1__calc__pressure\n", + "\n", + "min_phase1__calc__pressure\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Inputscalc__pressure\n", - "\n", - "calc__pressure\n", + "\n", + "calc__pressure\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceInputsmin_phase1__calc__pressure->clusterphase_preferencemin_phase1Inputscalc__pressure\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "clusterphase_preferenceInputsphase2\n", - "\n", - "phase2\n", + "\n", + "phase2\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Inputscrystalstructure\n", - "\n", - "crystalstructure\n", + "\n", + "crystalstructure\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceInputsphase2->clusterphase_preferencemin_phase2Inputscrystalstructure\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "clusterphase_preferenceInputslattice_guess2\n", - "\n", - "lattice_guess2\n", + "\n", + "lattice_guess2\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Inputslattice_guess\n", - "\n", - "lattice_guess\n", + "\n", + "lattice_guess\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceInputslattice_guess2->clusterphase_preferencemin_phase2Inputslattice_guess\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "clusterphase_preferenceInputsmin_phase2__structure__c\n", - "\n", - "min_phase2__structure__c\n", + "\n", + "min_phase2__structure__c\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Inputsstructure__c\n", - "\n", - "structure__c\n", + "\n", + "structure__c\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceInputsmin_phase2__structure__c->clusterphase_preferencemin_phase2Inputsstructure__c\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "clusterphase_preferenceInputsmin_phase2__structure__covera\n", - "\n", - "min_phase2__structure__covera\n", + "\n", + "min_phase2__structure__covera\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Inputsstructure__covera\n", - "\n", - "structure__covera\n", + "\n", + "structure__covera\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceInputsmin_phase2__structure__covera->clusterphase_preferencemin_phase2Inputsstructure__covera\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "clusterphase_preferenceInputsmin_phase2__structure__u\n", - "\n", - "min_phase2__structure__u\n", + "\n", + "min_phase2__structure__u\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Inputsstructure__u\n", - "\n", - "structure__u\n", + "\n", + "structure__u\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceInputsmin_phase2__structure__u->clusterphase_preferencemin_phase2Inputsstructure__u\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "clusterphase_preferenceInputsmin_phase2__structure__orthorhombic\n", - "\n", - "min_phase2__structure__orthorhombic\n", + "\n", + "min_phase2__structure__orthorhombic\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Inputsstructure__orthorhombic\n", - "\n", - "structure__orthorhombic\n", + "\n", + "structure__orthorhombic\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceInputsmin_phase2__structure__orthorhombic->clusterphase_preferencemin_phase2Inputsstructure__orthorhombic\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "clusterphase_preferenceInputsmin_phase2__structure__cubic\n", - "\n", - "min_phase2__structure__cubic\n", + "\n", + "min_phase2__structure__cubic\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Inputsstructure__cubic\n", - "\n", - "structure__cubic\n", + "\n", + "structure__cubic\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceInputsmin_phase2__structure__cubic->clusterphase_preferencemin_phase2Inputsstructure__cubic\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "clusterphase_preferenceInputsmin_phase2__calc__n_ionic_steps\n", - "\n", - "min_phase2__calc__n_ionic_steps: int\n", + "\n", + "min_phase2__calc__n_ionic_steps: int\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Inputscalc__n_ionic_steps\n", - "\n", - "calc__n_ionic_steps: int\n", + "\n", + "calc__n_ionic_steps: int\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceInputsmin_phase2__calc__n_ionic_steps->clusterphase_preferencemin_phase2Inputscalc__n_ionic_steps\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "clusterphase_preferenceInputsmin_phase2__calc__n_print\n", - "\n", - "min_phase2__calc__n_print: int\n", + "\n", + "min_phase2__calc__n_print: int\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Inputscalc__n_print\n", - "\n", - "calc__n_print: int\n", + "\n", + "calc__n_print: int\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceInputsmin_phase2__calc__n_print->clusterphase_preferencemin_phase2Inputscalc__n_print\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "clusterphase_preferenceInputsmin_phase2__calc__pressure\n", - "\n", - "min_phase2__calc__pressure\n", + "\n", + "min_phase2__calc__pressure\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Inputscalc__pressure\n", - "\n", - "calc__pressure\n", + "\n", + "calc__pressure\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceInputsmin_phase2__calc__pressure->clusterphase_preferencemin_phase2Inputscalc__pressure\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", - "\n", + "\n", + "\n", + "clusterphase_preferenceInputse1__item\n", + "\n", + "e1__item\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee1Inputsitem\n", + "\n", + "item\n", + "\n", + "\n", + "\n", + "clusterphase_preferenceInputse1__item->clusterphase_preferencee1Inputsitem\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n", + "clusterphase_preferenceInputse2__item\n", + "\n", + "e2__item\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee2Inputsitem\n", + "\n", + "item\n", + "\n", + "\n", + "\n", + "clusterphase_preferenceInputse2__item->clusterphase_preferencee2Inputsitem\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "clusterphase_preferenceOutputsmin_phase1__calc__cells\n", - "\n", - "min_phase1__calc__cells\n", + "\n", + "min_phase1__calc__cells\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase1__calc__displacements\n", - "\n", - "min_phase1__calc__displacements\n", + "\n", + "min_phase1__calc__displacements\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase1__calc__energy_tot\n", - "\n", - "min_phase1__calc__energy_tot\n", + "\n", + "min_phase1__calc__energy_tot\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase1__calc__force_max\n", - "\n", - "min_phase1__calc__force_max\n", + "\n", + "min_phase1__calc__force_max\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase1__calc__forces\n", - "\n", - "min_phase1__calc__forces\n", + "\n", + "min_phase1__calc__forces\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase1__calc__indices\n", - "\n", - "min_phase1__calc__indices\n", + "\n", + "min_phase1__calc__indices\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase1__calc__positions\n", - "\n", - "min_phase1__calc__positions\n", + "\n", + "min_phase1__calc__positions\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase1__calc__pressures\n", - "\n", - "min_phase1__calc__pressures\n", + "\n", + "min_phase1__calc__pressures\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase1__calc__steps\n", - "\n", - "min_phase1__calc__steps\n", + "\n", + "min_phase1__calc__steps\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase1__calc__total_displacements\n", - "\n", - "min_phase1__calc__total_displacements\n", + "\n", + "min_phase1__calc__total_displacements\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase1__calc__unwrapped_positions\n", - "\n", - "min_phase1__calc__unwrapped_positions\n", + "\n", + "min_phase1__calc__unwrapped_positions\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase1__calc__volume\n", - "\n", - "min_phase1__calc__volume\n", + "\n", + "min_phase1__calc__volume\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase2__calc__cells\n", - "\n", - "min_phase2__calc__cells\n", + "\n", + "min_phase2__calc__cells\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase2__calc__displacements\n", - "\n", - "min_phase2__calc__displacements\n", + "\n", + "min_phase2__calc__displacements\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase2__calc__energy_tot\n", - "\n", - "min_phase2__calc__energy_tot\n", + "\n", + "min_phase2__calc__energy_tot\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase2__calc__force_max\n", - "\n", - "min_phase2__calc__force_max\n", + "\n", + "min_phase2__calc__force_max\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase2__calc__forces\n", - "\n", - "min_phase2__calc__forces\n", + "\n", + "min_phase2__calc__forces\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase2__calc__indices\n", - "\n", - "min_phase2__calc__indices\n", + "\n", + "min_phase2__calc__indices\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase2__calc__positions\n", - "\n", - "min_phase2__calc__positions\n", + "\n", + "min_phase2__calc__positions\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase2__calc__pressures\n", - "\n", - "min_phase2__calc__pressures\n", + "\n", + "min_phase2__calc__pressures\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase2__calc__steps\n", - "\n", - "min_phase2__calc__steps\n", + "\n", + "min_phase2__calc__steps\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase2__calc__total_displacements\n", - "\n", - "min_phase2__calc__total_displacements\n", + "\n", + "min_phase2__calc__total_displacements\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase2__calc__unwrapped_positions\n", - "\n", - "min_phase2__calc__unwrapped_positions\n", + "\n", + "min_phase2__calc__unwrapped_positions\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceOutputsmin_phase2__calc__volume\n", - "\n", - "min_phase2__calc__volume\n", + "\n", + "min_phase2__calc__volume\n", "\n", - "\n", - "\n", - "clusterphase_preferenceOutputscompare__de\n", - "\n", - "compare__de\n", + "\n", + "\n", + "clusterphase_preferenceOutputscompare__sub\n", + "\n", + "compare__sub\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceelementInputsrun\n", - "\n", - "run\n", + "\n", + "run\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceelementOutputsran\n", - "\n", - "ran\n", + "\n", + "ran\n", "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceelementInputsaccumulate_and_run\n", - "\n", - "accumulate_and_run\n", + "\n", + "accumulate_and_run\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceelementOutputsuser_input\n", - "\n", - "user_input\n", + "\n", + "user_input\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Inputselement\n", - "\n", - "element\n", + "\n", + "element\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceelementOutputsuser_input->clusterphase_preferencemin_phase1Inputselement\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Inputselement\n", - "\n", - "element\n", + "\n", + "element\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferenceelementOutputsuser_input->clusterphase_preferencemin_phase2Inputselement\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Inputsrun\n", - "\n", - "run\n", + "\n", + "run\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputsran\n", - "\n", - "ran\n", + "\n", + "ran\n", "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Inputsaccumulate_and_run\n", - "\n", - "accumulate_and_run\n", + "\n", + "accumulate_and_run\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputsstructure\n", - "\n", - "structure\n", + "\n", + "structure\n", "\n", - "\n", - "\n", - "clusterphase_preferencecompareInputsstructure1\n", - "\n", - "structure1\n", + "\n", + "\n", + "clusterphase_preferencen1Inputsobj\n", + "\n", + "obj\n", "\n", - "\n", - "\n", - "clusterphase_preferencemin_phase1Outputsstructure->clusterphase_preferencecompareInputsstructure1\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "clusterphase_preferencemin_phase1Outputsstructure->clusterphase_preferencen1Inputsobj\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__cells\n", - "\n", - "calc__cells\n", + "\n", + "calc__cells\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__cells->clusterphase_preferenceOutputsmin_phase1__calc__cells\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__displacements\n", - "\n", - "calc__displacements\n", + "\n", + "calc__displacements\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__displacements->clusterphase_preferenceOutputsmin_phase1__calc__displacements\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputsenergy\n", - "\n", - "energy\n", + "\n", + "energy\n", "\n", - "\n", - "\n", - "clusterphase_preferencecompareInputsenergy1\n", - "\n", - "energy1\n", + "\n", + "\n", + "clusterphase_preferencee1Inputsobj\n", + "\n", + "obj\n", "\n", - "\n", - "\n", - "clusterphase_preferencemin_phase1Outputsenergy->clusterphase_preferencecompareInputsenergy1\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "clusterphase_preferencemin_phase1Outputsenergy->clusterphase_preferencee1Inputsobj\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__energy_tot\n", - "\n", - "calc__energy_tot\n", + "\n", + "calc__energy_tot\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__energy_tot->clusterphase_preferenceOutputsmin_phase1__calc__energy_tot\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__force_max\n", - "\n", - "calc__force_max\n", + "\n", + "calc__force_max\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__force_max->clusterphase_preferenceOutputsmin_phase1__calc__force_max\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__forces\n", - "\n", - "calc__forces\n", + "\n", + "calc__forces\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__forces->clusterphase_preferenceOutputsmin_phase1__calc__forces\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__indices\n", - "\n", - "calc__indices\n", + "\n", + "calc__indices\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__indices->clusterphase_preferenceOutputsmin_phase1__calc__indices\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__positions\n", - "\n", - "calc__positions\n", + "\n", + "calc__positions\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__positions->clusterphase_preferenceOutputsmin_phase1__calc__positions\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__pressures\n", - "\n", - "calc__pressures\n", + "\n", + "calc__pressures\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__pressures->clusterphase_preferenceOutputsmin_phase1__calc__pressures\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__steps\n", - "\n", - "calc__steps\n", + "\n", + "calc__steps\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__steps->clusterphase_preferenceOutputsmin_phase1__calc__steps\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__total_displacements\n", - "\n", - "calc__total_displacements\n", + "\n", + "calc__total_displacements\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__total_displacements->clusterphase_preferenceOutputsmin_phase1__calc__total_displacements\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__unwrapped_positions\n", - "\n", - "calc__unwrapped_positions\n", + "\n", + "calc__unwrapped_positions\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__unwrapped_positions->clusterphase_preferenceOutputsmin_phase1__calc__unwrapped_positions\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__volume\n", - "\n", - "calc__volume\n", + "\n", + "calc__volume\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase1Outputscalc__volume->clusterphase_preferenceOutputsmin_phase1__calc__volume\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Inputsrun\n", - "\n", - "run\n", + "\n", + "run\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputsran\n", - "\n", - "ran\n", + "\n", + "ran\n", "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Inputsaccumulate_and_run\n", - "\n", - "accumulate_and_run\n", + "\n", + "accumulate_and_run\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputsstructure\n", - "\n", - "structure\n", + "\n", + "structure\n", "\n", - "\n", - "\n", - "clusterphase_preferencecompareInputsstructure2\n", - "\n", - "structure2\n", + "\n", + "\n", + "clusterphase_preferencen2Inputsobj\n", + "\n", + "obj\n", "\n", - "\n", - "\n", - "clusterphase_preferencemin_phase2Outputsstructure->clusterphase_preferencecompareInputsstructure2\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "clusterphase_preferencemin_phase2Outputsstructure->clusterphase_preferencen2Inputsobj\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__cells\n", - "\n", - "calc__cells\n", + "\n", + "calc__cells\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__cells->clusterphase_preferenceOutputsmin_phase2__calc__cells\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__displacements\n", - "\n", - "calc__displacements\n", + "\n", + "calc__displacements\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__displacements->clusterphase_preferenceOutputsmin_phase2__calc__displacements\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputsenergy\n", - "\n", - "energy\n", + "\n", + "energy\n", "\n", - "\n", - "\n", - "clusterphase_preferencecompareInputsenergy2\n", - "\n", - "energy2\n", + "\n", + "\n", + "clusterphase_preferencee2Inputsobj\n", + "\n", + "obj\n", "\n", - "\n", - "\n", - "clusterphase_preferencemin_phase2Outputsenergy->clusterphase_preferencecompareInputsenergy2\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "clusterphase_preferencemin_phase2Outputsenergy->clusterphase_preferencee2Inputsobj\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__energy_tot\n", - "\n", - "calc__energy_tot\n", + "\n", + "calc__energy_tot\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__energy_tot->clusterphase_preferenceOutputsmin_phase2__calc__energy_tot\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__force_max\n", - "\n", - "calc__force_max\n", + "\n", + "calc__force_max\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__force_max->clusterphase_preferenceOutputsmin_phase2__calc__force_max\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__forces\n", - "\n", - "calc__forces\n", + "\n", + "calc__forces\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__forces->clusterphase_preferenceOutputsmin_phase2__calc__forces\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__indices\n", - "\n", - "calc__indices\n", + "\n", + "calc__indices\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__indices->clusterphase_preferenceOutputsmin_phase2__calc__indices\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__positions\n", - "\n", - "calc__positions\n", + "\n", + "calc__positions\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__positions->clusterphase_preferenceOutputsmin_phase2__calc__positions\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__pressures\n", - "\n", - "calc__pressures\n", + "\n", + "calc__pressures\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__pressures->clusterphase_preferenceOutputsmin_phase2__calc__pressures\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__steps\n", - "\n", - "calc__steps\n", + "\n", + "calc__steps\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__steps->clusterphase_preferenceOutputsmin_phase2__calc__steps\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__total_displacements\n", - "\n", - "calc__total_displacements\n", + "\n", + "calc__total_displacements\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__total_displacements->clusterphase_preferenceOutputsmin_phase2__calc__total_displacements\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__unwrapped_positions\n", - "\n", - "calc__unwrapped_positions\n", + "\n", + "calc__unwrapped_positions\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__unwrapped_positions->clusterphase_preferenceOutputsmin_phase2__calc__unwrapped_positions\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__volume\n", - "\n", - "calc__volume\n", + "\n", + "calc__volume\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencemin_phase2Outputscalc__volume->clusterphase_preferenceOutputsmin_phase2__calc__volume\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee1Inputsrun\n", + "\n", + "run\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee1Outputsran\n", + "\n", + "ran\n", + "\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee1Inputsaccumulate_and_run\n", + "\n", + "accumulate_and_run\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee1Outputsgetitem\n", + "\n", + "getitem\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee1__getitem_Divide_n1__lenInputsobj\n", + "\n", + "obj\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee1Outputsgetitem->clusterphase_preferencee1__getitem_Divide_n1__lenInputsobj\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "clusterphase_preferencen1Inputsrun\n", + "\n", + "run\n", + "\n", + "\n", + "\n", + "clusterphase_preferencen1Outputsran\n", + "\n", + "ran\n", + "\n", + "\n", + "\n", + "\n", + "clusterphase_preferencen1Inputsaccumulate_and_run\n", + "\n", + "accumulate_and_run\n", + "\n", + "\n", + "\n", + "clusterphase_preferencen1Outputslen\n", + "\n", + "len\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee1__getitem_Divide_n1__lenInputsother\n", + "\n", + "other\n", + "\n", + "\n", + "\n", + "clusterphase_preferencen1Outputslen->clusterphase_preferencee1__getitem_Divide_n1__lenInputsother\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee2Inputsrun\n", + "\n", + "run\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee2Outputsran\n", + "\n", + "ran\n", + "\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee2Inputsaccumulate_and_run\n", + "\n", + "accumulate_and_run\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee2Outputsgetitem\n", + "\n", + "getitem\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee2__getitem_Divide_n2__lenInputsobj\n", + "\n", + "obj\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee2Outputsgetitem->clusterphase_preferencee2__getitem_Divide_n2__lenInputsobj\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "clusterphase_preferencen2Inputsrun\n", + "\n", + "run\n", + "\n", + "\n", + "\n", + "clusterphase_preferencen2Outputsran\n", + "\n", + "ran\n", + "\n", + "\n", + "\n", + "\n", + "clusterphase_preferencen2Inputsaccumulate_and_run\n", + "\n", + "accumulate_and_run\n", + "\n", + "\n", + "\n", + "clusterphase_preferencen2Outputslen\n", + "\n", + "len\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee2__getitem_Divide_n2__lenInputsother\n", + "\n", + "other\n", + "\n", + "\n", + "\n", + "clusterphase_preferencen2Outputslen->clusterphase_preferencee2__getitem_Divide_n2__lenInputsother\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee2__getitem_Divide_n2__lenInputsrun\n", + "\n", + "run\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee2__getitem_Divide_n2__lenOutputsran\n", + "\n", + "ran\n", + "\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee2__getitem_Divide_n2__lenInputsaccumulate_and_run\n", + "\n", + "accumulate_and_run\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee2__getitem_Divide_n2__lenOutputstruediv\n", + "\n", + "truediv\n", + "\n", + "\n", + "\n", + "clusterphase_preferencecompareInputsobj\n", + "\n", + "obj\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee2__getitem_Divide_n2__lenOutputstruediv->clusterphase_preferencecompareInputsobj\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee1__getitem_Divide_n1__lenInputsrun\n", + "\n", + "run\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee1__getitem_Divide_n1__lenOutputsran\n", + "\n", + "ran\n", + "\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee1__getitem_Divide_n1__lenInputsaccumulate_and_run\n", + "\n", + "accumulate_and_run\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee1__getitem_Divide_n1__lenOutputstruediv\n", + "\n", + "truediv\n", + "\n", + "\n", + "\n", + "clusterphase_preferencecompareInputsother\n", + "\n", + "other\n", + "\n", + "\n", + "\n", + "clusterphase_preferencee1__getitem_Divide_n1__lenOutputstruediv->clusterphase_preferencecompareInputsother\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencecompareInputsrun\n", - "\n", - "run\n", + "\n", + "run\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencecompareOutputsran\n", - "\n", - "ran\n", + "\n", + "ran\n", "\n", "\n", "\n", - "\n", + "\n", "clusterphase_preferencecompareInputsaccumulate_and_run\n", - "\n", - "accumulate_and_run\n", + "\n", + "accumulate_and_run\n", "\n", - "\n", - "\n", - "clusterphase_preferencecompareOutputsde\n", - "\n", - "de\n", + "\n", + "\n", + "clusterphase_preferencecompareOutputssub\n", + "\n", + "sub\n", "\n", - "\n", - "\n", - "clusterphase_preferencecompareOutputsde->clusterphase_preferenceOutputscompare__de\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "clusterphase_preferencecompareOutputssub->clusterphase_preferenceOutputscompare__sub\n", + "\n", + "\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 40, + "execution_count": 49, "metadata": {}, "output_type": "execute_result" } @@ -3154,7 +3859,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 50, "id": "b51bef25-86c5-4d57-80c1-ab733e703caf", "metadata": {}, "outputs": [ @@ -3170,12 +3875,12 @@ ], "source": [ "out = wf(element=\"Al\", phase1=\"fcc\", phase2=\"hcp\", lattice_guess1=4, lattice_guess2=4)\n", - "print(f\"{wf.inputs.element.value}: E({wf.inputs.phase2.value}) - E({wf.inputs.phase1.value}) = {out.compare__de:.2f} eV/atom\")" + "print(f\"{wf.inputs.element.value}: E({wf.inputs.phase2.value}) - E({wf.inputs.phase1.value}) = {out.compare__sub:.2f} eV/atom\")" ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 51, "id": "091e2386-0081-436c-a736-23d019bd9b91", "metadata": {}, "outputs": [ @@ -3199,7 +3904,7 @@ ], "source": [ "out = wf(element=\"Mg\", phase1=\"fcc\", phase2=\"hcp\", lattice_guess1=3, lattice_guess2=3)\n", - "print(f\"{wf.inputs.element.value}: E({wf.inputs.phase2.value}) - E({wf.inputs.phase1.value}) = {out.compare__de:.2f} eV/atom\")" + "print(f\"{wf.inputs.element.value}: E({wf.inputs.phase2.value}) - E({wf.inputs.phase1.value}) = {out.compare__sub:.2f} eV/atom\")" ] }, { @@ -3216,7 +3921,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 52, "id": "4cdffdca-48d3-4486-9045-48102c7e5f31", "metadata": {}, "outputs": [ @@ -3230,9 +3935,9 @@ " warn(\n", "/Users/huber/work/pyiron/pyiron_workflow/pyiron_workflow/channels.py:164: UserWarning: The channel element was not connected to user_input, andthus could not disconnect from it.\n", " warn(\n", - "/Users/huber/work/pyiron/pyiron_workflow/pyiron_workflow/channels.py:164: UserWarning: The channel structure was not connected to structure1, andthus could not disconnect from it.\n", + "/Users/huber/work/pyiron/pyiron_workflow/pyiron_workflow/channels.py:164: UserWarning: The channel structure was not connected to obj, andthus could not disconnect from it.\n", " warn(\n", - "/Users/huber/work/pyiron/pyiron_workflow/pyiron_workflow/channels.py:164: UserWarning: The channel energy was not connected to energy1, andthus could not disconnect from it.\n", + "/Users/huber/work/pyiron/pyiron_workflow/pyiron_workflow/channels.py:164: UserWarning: The channel energy was not connected to obj, andthus could not disconnect from it.\n", " warn(\n" ] } @@ -3254,7 +3959,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 53, "id": "ed4a3a22-fc3a-44c9-9d4f-c65bc1288889", "metadata": {}, "outputs": [ @@ -3279,12 +3984,12 @@ "source": [ "# Bad guess\n", "out = wf(element=\"Al\", phase1=\"fcc\", phase2=\"hcp\", lattice_guess1=3, lattice_guess2=3.1)\n", - "print(f\"{wf.inputs.element.value}: E({wf.inputs.phase2.value}) - E({wf.inputs.phase1.value}) = {out.compare__de:.2f} eV/atom\")" + "print(f\"{wf.inputs.element.value}: E({wf.inputs.phase2.value}) - E({wf.inputs.phase1.value}) = {out.compare__sub:.2f} eV/atom\")" ] }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 54, "id": "5a985cbf-c308-4369-9223-b8a37edb8ab1", "metadata": {}, "outputs": [ @@ -3309,7 +4014,7 @@ "source": [ "# Good guess\n", "out = wf(element=\"Al\", phase1=\"fcc\", phase2=\"hcp\", lattice_guess1=4.05, lattice_guess2=3.2)\n", - "print(f\"{wf.inputs.element.value}: E({wf.inputs.phase2.value}) - E({wf.inputs.phase1.value}) = {out.compare__de:.2f} eV/atom\")" + "print(f\"{wf.inputs.element.value}: E({wf.inputs.phase2.value}) - E({wf.inputs.phase1.value}) = {out.compare__sub:.2f} eV/atom\")" ] }, { @@ -3352,7 +4057,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 55, "id": "aa575249-b209-4e0c-9ea6-a82bc69dc833", "metadata": {}, "outputs": [ @@ -3361,25 +4066,21 @@ "output_type": "stream", "text": [ "None 1\n", - " \n" + " \n" ] } ], "source": [ - "@Workflow.wrap_as.single_value_node(\"sum\")\n", - "def Add(x, y):\n", - " return x + y\n", - "\n", "wf = Workflow(\"with_executor\")\n", - "wf.a1 = Add(0, 1)\n", - "wf.a2 = Add(2, 3)\n", - "wf.b = Add(wf.a1, wf.a2)\n", + "wf.a1 = wf.create.standard.Add(0, 1)\n", + "wf.a2 = wf.create.standard.Add(2, 3)\n", + "wf.b = wf.a1 + wf.a2\n", "\n", "wf.a2.executor = wf.create.Executor()\n", "wf()\n", "\n", - "print(wf.a1.future, wf.a1.outputs.sum.value)\n", - "print(wf.a2.future, wf.a2.outputs.sum.value)" + "print(wf.a1.future, wf.a1.outputs.add.value)\n", + "print(wf.a2.future, wf.a2.outputs.add.value)" ] }, { @@ -3392,7 +4093,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 56, "id": "c1b7b4e9-1c76-470c-ba6e-a58ea3f611f6", "metadata": {}, "outputs": [ @@ -3420,7 +4121,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 57, "id": "7e98058b-a791-4cb1-ae2c-864ad7e56cee", "metadata": {}, "outputs": [], @@ -3438,7 +4139,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 58, "id": "0d1b4005-488e-492f-adcb-8ad7235e4fe3", "metadata": {}, "outputs": [ @@ -3447,7 +4148,7 @@ "output_type": "stream", "text": [ "None 1\n", - " \n", + " \n", "Finally 5\n", "b (Add) output single-value: 6\n" ] @@ -3456,15 +4157,15 @@ "source": [ "with Workflow.create.Executor() as executor:\n", " wf = Workflow(\"with_executor\")\n", - " wf.a1 = Add(0, 1)\n", - " wf.a2 = Add(2, 3)\n", - " wf.b = Add(wf.a1, wf.a2)\n", + " wf.a1 = wf.create.standard.Add(0, 1)\n", + " wf.a2 = wf.create.standard.Add(2, 3)\n", + " wf.b = wf.a1 + wf.a2\n", "\n", " wf.a2.executor = executor\n", " wf()\n", " \n", - " print(wf.a1.future, wf.a1.outputs.sum.value)\n", - " print(wf.a2.future, wf.a2.outputs.sum.value)\n", + " print(wf.a1.future, wf.a1.outputs.add.value)\n", + " print(wf.a2.future, wf.a2.outputs.add.value)\n", " \n", " print(\"Finally\", wf.a2.future.result())\n", " print(wf.b)" @@ -3482,7 +4183,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 59, "id": "d03ca074-35a0-4e0d-9377-d4eaa5521f85", "metadata": {}, "outputs": [], @@ -3501,7 +4202,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 60, "id": "a7c07aa0-84fc-4f43-aa4f-6498c0837d76", "metadata": {}, "outputs": [ @@ -3509,7 +4210,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "6.029127317946404\n" + "6.018927805998828\n" ] } ], @@ -3533,7 +4234,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 61, "id": "b062ab5f-9b98-4843-8925-b93bf4c173f8", "metadata": {}, "outputs": [ @@ -3541,7 +4242,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "2.678937633987516\n" + "3.0853979130042717\n" ] } ], @@ -3615,7 +4316,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 62, "id": "0b373764-b389-4c24-8086-f3d33a4f7fd7", "metadata": {}, "outputs": [ @@ -3629,7 +4330,7 @@ " 17.230249999999995]" ] }, - "execution_count": 53, + "execution_count": 62, "metadata": {}, "output_type": "execute_result" } @@ -3666,7 +4367,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 63, "id": "0dd04b4c-e3e7-4072-ad34-58f2c1e4f596", "metadata": {}, "outputs": [ @@ -3725,7 +4426,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 64, "id": "2dfb967b-41ac-4463-b606-3e315e617f2a", "metadata": {}, "outputs": [ @@ -3749,7 +4450,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 65, "id": "2e87f858-b327-4f6b-9237-c8a557f29aeb", "metadata": {}, "outputs": [ @@ -3757,8 +4458,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "0.189 <= 0.2\n", - "Finally 0.189\n" + "0.676 > 0.2\n", + "0.208 > 0.2\n", + "0.919 > 0.2\n", + "0.834 > 0.2\n", + "0.952 > 0.2\n", + "0.031 <= 0.2\n", + "Finally 0.031\n" ] } ], From 24de8b38e94b85bb0f45e968f828f9bdacca7c66 Mon Sep 17 00:00:00 2001 From: liamhuber Date: Sat, 9 Dec 2023 14:37:57 -0800 Subject: [PATCH 29/30] Update README --- README.md | 51 +++++++++++++++++--------------- docs/_static/readme_diagram.png | Bin 66041 -> 153751 bytes docs/_static/readme_shifted.png | Bin 10735 -> 0 bytes 3 files changed, 27 insertions(+), 24 deletions(-) delete mode 100644 docs/_static/readme_shifted.png diff --git a/README.md b/README.md index de9ec21db..5ee2c292b 100644 --- a/README.md +++ b/README.md @@ -47,40 +47,43 @@ Nodes can be used by themselves and -- other than being "delayed" in that their ``` -But the intent is to collect them together into a workflow and leverage existing nodes: +But the intent is to collect them together into a workflow and leverage existing nodes. We can directly perform (many but not quite all) python actions natively on output channels, can build up data graph topology by simply assigning values (to attributes or at instantiation), and can package things together into reusable macros with customizable IO interfaces: ```python >>> from pyiron_workflow import Workflow +>>> Workflow.register("plotting", "pyiron_workflow.node_library.plotting") >>> >>> @Workflow.wrap_as.single_value_node() -... def add_one(x): -... return x + 1 +... def Arange(n: int): +... import numpy as np +... return np.arange(n) >>> >>> @Workflow.wrap_as.macro_node() -... def add_three_macro(macro): -... macro.start = add_one() -... macro.middle = add_one(x=macro.start) -... macro.end = add_one(x=macro.middle) -... macro.inputs_map = {"start__x": "x"} -... macro.outputs_map = {"end__x + 1": "y"} ->>> ->>> Workflow.register( -... "plotting", -... "pyiron_workflow.node_library.plotting" -... ) +... def PlotShiftedSquare(macro): +... macro.shift = macro.create.standard.UserInput(0) +... macro.arange = Arange() +... macro.plot = macro.create.plotting.Scatter( +... x=macro.arange + macro.shift, +... y=macro.arange**2 +... ) +... macro.inputs_map = { +... "shift__user_input": "shift", +... "arange__n": "n", +... } +... macro.outputs_map = {"plot__fig": "fig"} >>> ->>> wf = Workflow("add_5_and_plot") ->>> wf.add_one = add_one() ->>> wf.add_three = add_three_macro(x=wf.add_one) ->>> wf.plot = wf.create.plotting.Scatter( -... x=wf.add_one, -... y=wf.add_three.outputs.y -... ) +>>> wf = Workflow("plot_with_and_without_shift") +>>> wf.n = wf.create.standard.UserInput() +>>> wf.no_shift = PlotShiftedSquare(shift=0, n=10) +>>> wf.shift = PlotShiftedSquare(shift=2, n=10) +>>> wf.inputs_map = { +... "n__user_input": "n", +... "shift__shift": "shift" +... } >>> >>> diagram = wf.draw() >>> ->>> import numpy as np ->>> fig = wf(add_one__x=np.arange(5)).plot__fig +>>> out = wf(shift=3, n=10) ``` @@ -90,7 +93,7 @@ Which gives the workflow `diagram` And the resulting `fig` -![](docs/_static/readme_shifted.png) +![](docs/_static/readme_fig.png) ## Installation diff --git a/docs/_static/readme_diagram.png b/docs/_static/readme_diagram.png index b5e242731422842d3b0cf63e4739b65449c0fe18..45e495153535ef0a350322ce3326083170c73db3 100644 GIT binary patch literal 153751 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

xB|0y=~tWDGBZ79M&B*>X_g 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 CSeozv diff --git a/docs/_static/readme_shifted.png b/docs/_static/readme_shifted.png deleted file mode 100644 index 7daa81dacd0e0c1ce2251e73b9f79463bbf59351..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10735 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 F`ftV~Y`p*g From 2c33750c4ca8b57fbb63f027185037eb2aef3a2b Mon Sep 17 00:00:00 2001 From: pyiron-runner Date: Sat, 9 Dec 2023 22:39:01 +0000 Subject: [PATCH 30/30] Format black --- pyiron_workflow/channels.py | 2 ++ pyiron_workflow/function.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pyiron_workflow/channels.py b/pyiron_workflow/channels.py index dd85d689e..6065691db 100644 --- a/pyiron_workflow/channels.py +++ b/pyiron_workflow/channels.py @@ -556,11 +556,13 @@ def __getitem__(self, item): for slice_input in [item.start, item.stop, item.step] ): from pyiron_workflow.node_library.standard import Slice + item = self._node_injection( Slice, item.start, item.stop, item.step, inject_self=False ) from pyiron_workflow.node_library.standard import GetItem + return self._node_injection(GetItem, item) def __lt__(self, other): diff --git a/pyiron_workflow/function.py b/pyiron_workflow/function.py index 0eb4a5b34..82e6498c4 100644 --- a/pyiron_workflow/function.py +++ b/pyiron_workflow/function.py @@ -602,7 +602,7 @@ def _get_output_labels(self, output_labels: str | list[str] | tuple[str] | None) f"{self.__class__.__name__} must only have a single return value, but " f"got multiple output labels: {output_labels}" ) - return output_labels + return output_labels @property def channel(self) -> OutputData: