diff --git a/aiida_simple.json b/aiida_simple.json new file mode 100644 index 0000000..60a60df --- /dev/null +++ b/aiida_simple.json @@ -0,0 +1,75 @@ +{ + "nodes": [ + { + "id": 0, + "type": "function", + "value": "workflow.get_prod_and_div" + }, + { + "id": 1, + "type": "function", + "value": "workflow.get_sum" + }, + { + "id": 2, + "type": "function", + "value": "workflow.square" + }, + { + "id": 3, + "type": "input", + "name": "x", + "value": 1.0 + }, + { + "id": 4, + "type": "input", + "name": "y", + "value": 2.0 + }, + { + "id": 5, + "type": "output", + "name": null, + "value": null + } + ], + "edges": [ + { + "target": 0, + "targetPort": "x", + "source": 3, + "sourcePort": null + }, + { + "target": 0, + "targetPort": "y", + "source": 4, + "sourcePort": null + }, + { + "target": 1, + "targetPort": "x", + "source": 0, + "sourcePort": "prod" + }, + { + "target": 1, + "targetPort": "y", + "source": 0, + "sourcePort": "div" + }, + { + "target": 2, + "targetPort": "x", + "source": 1, + "sourcePort": null + }, + { + "target": 5, + "targetPort": null, + "source": 2, + "sourcePort": null + } + ] +} diff --git a/example_workflows/arithmetic/aiida.ipynb b/example_workflows/arithmetic/aiida.ipynb index 6faaa43..745147c 100644 --- a/example_workflows/arithmetic/aiida.ipynb +++ b/example_workflows/arithmetic/aiida.ipynb @@ -1,230 +1,300 @@ { - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.8" - } - }, - "nbformat_minor": 4, - "nbformat": 4, "cells": [ { "cell_type": "markdown", - "source": "# Aiida", - "metadata": {} + "metadata": {}, + "source": [ + "# Aiida" + ] }, { "cell_type": "markdown", - "source": "## Define workflow with aiida", - "metadata": {} + "metadata": {}, + "source": [ + "## Define workflow with aiida" + ] }, { "cell_type": "code", - "source": "from python_workflow_definition.aiida import write_workflow_json\n\nfrom aiida_workgraph import WorkGraph, task\nfrom aiida import orm, load_profile\nload_profile()\n\nworkflow_json_filename = \"aiida_simple.json\"", + "execution_count": 1, "metadata": { "trusted": true }, "outputs": [], - "execution_count": 1 + "source": [ + "from python_workflow_definition.aiida import AiidaPwdConverter\n", + "\n", + "from aiida_workgraph import WorkGraph, task\n", + "from aiida import orm, load_profile\n", + "from rich.pretty import pprint\n", + "\n", + "load_profile()\n", + "\n", + "workflow_json_filename = \"aiida_simple.json\"" + ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": 2, + "metadata": {}, "outputs": [], - "execution_count": null, "source": [ "from workflow import (\n", " get_sum as _get_sum,\n", " get_prod_and_div as _get_prod_and_div,\n", + " square as _square\n", ")" ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": 3, + "metadata": {}, "outputs": [], - "execution_count": null, - "source": "wg = WorkGraph(\"arithmetic\")" + "source": [ + "wg = WorkGraph(\"arithmetic\")" + ] }, { "cell_type": "code", - "source": "get_prod_and_div_task = wg.add_task(\n task(outputs=['prod', 'div'])(_get_prod_and_div),\n name=\"get_prod_and_div\",\n x=orm.Float(1),\n y=orm.Float(2),\n)", + "execution_count": 4, "metadata": { "trusted": true }, "outputs": [], - "execution_count": 4 + "source": [ + "get_prod_and_div_task = wg.add_task(\n", + " task(outputs=['prod', 'div'])(_get_prod_and_div),\n", + " name=\"get_prod_and_div\",\n", + " # x=orm.Float(1),\n", + " # y=orm.Float(2),\n", + ")" + ] }, { "cell_type": "code", - "source": "get_sum_task = wg.add_task(\n _get_sum,\n name=\"get_sum\",\n x=get_prod_and_div_task.outputs.prod,\n y=get_prod_and_div_task.outputs.div,\n)", + "execution_count": 5, "metadata": { "trusted": true }, "outputs": [], - "execution_count": 5 + "source": [ + "get_sum_task = wg.add_task(\n", + " _get_sum,\n", + " name=\"get_sum\",\n", + " x=get_prod_and_div_task.outputs.prod,\n", + " y=get_prod_and_div_task.outputs.div,\n", + ")" + ] }, { "cell_type": "code", - "source": "write_workflow_json(wg=wg, file_name=workflow_json_filename)", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "square_task = wg.add_task(\n", + " _square,\n", + " name=\"square\",\n", + " x=get_sum_task.outputs.result,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, "metadata": { "trusted": true }, "outputs": [ { - "execution_count": 6, - "output_type": "execute_result", "data": { - "text/plain": "{'nodes': [{'id': 0, 'function': 'arithmetic_workflow.get_prod_and_div'},\n {'id': 1, 'function': 'arithmetic_workflow.get_sum'},\n {'id': 2, 'value': 1.0},\n {'id': 3, 'value': 2.0}],\n 'edges': [{'target': 1, 'targetPort': 'x', 'source': 0, 'sourcePort': 'prod'},\n {'target': 1, 'targetPort': 'y', 'source': 0, 'sourcePort': 'div'},\n {'target': 0, 'targetPort': 'x', 'source': 2, 'sourcePort': None},\n {'target': 0, 'targetPort': 'y', 'source': 3, 'sourcePort': None}]}" + "text/html": [ + "
{\n",
+       "'nodes': [\n",
+       "│   │   {'id': 0, 'type': 'function', 'value': 'workflow.get_prod_and_div'},\n",
+       "│   │   {'id': 1, 'type': 'function', 'value': 'workflow.get_sum'},\n",
+       "│   │   {'id': 2, 'type': 'function', 'value': 'workflow.square'},\n",
+       "│   │   {'id': 3, 'type': 'output', 'name': 'result', 'value': None}\n",
+       "],\n",
+       "'edges': [\n",
+       "│   │   {'target': 1, 'targetPort': 'x', 'source': 0, 'sourcePort': 'prod'},\n",
+       "│   │   {'target': 1, 'targetPort': 'y', 'source': 0, 'sourcePort': 'div'},\n",
+       "│   │   {'target': 2, 'targetPort': 'x', 'source': 1, 'sourcePort': None},\n",
+       "│   │   {'target': 3, 'targetPort': None, 'source': 2, 'sourcePort': None}\n",
+       "]\n",
+       "}\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m{\u001b[0m\n", + "\u001b[2;32m│ \u001b[0m\u001b[32m'nodes'\u001b[0m: \u001b[1m[\u001b[0m\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m0\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'function'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'workflow.get_prod_and_div'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m1\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'function'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'workflow.get_sum'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m2\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'function'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'workflow.square'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m3\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'output'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'result'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m\n", + "\u001b[2;32m│ \u001b[0m\u001b[1m]\u001b[0m,\n", + "\u001b[2;32m│ \u001b[0m\u001b[32m'edges'\u001b[0m: \u001b[1m[\u001b[0m\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m1\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'x'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m0\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m'prod'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m1\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'y'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m0\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m'div'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m2\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'x'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m1\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m3\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[3;35mNone\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m2\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m\n", + "\u001b[2;32m│ \u001b[0m\u001b[1m]\u001b[0m\n", + "\u001b[1m}\u001b[0m\n" + ] }, - "metadata": {} + "metadata": {}, + "output_type": "display_data" } ], - "execution_count": 6 + "source": [ + "aiida_converter = AiidaPwdConverter()\n", + "model = aiida_converter.workgraph_to_model(wg=wg)\n", + "pprint(model.model_dump())\n", + "\n", + "model.dump_json_file(file_name=workflow_json_filename)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "# Currently conversion PWD <-> WG is not atomic, as information is lost due to the `group_outputs` workaround, and the\n", + "# fact that `group_inputs` is not implemented in WG, at all\n", + "\n", + "# pwd_wf = PwdWorkflow.load_json_file(workflow_json_filename)\n", + "# wg = aiida_converter.model_to_workgraph(workflow_model=pwd_wf)\n", + "\n", + "# model = aiida_converter.workgraph_to_model(wg)\n", + "# pprint(model.model_dump())" + ] }, { "cell_type": "code", - "source": "!cat {workflow_json_filename}", + "execution_count": null, "metadata": { "trusted": true }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": "{\n \"nodes\": [\n {\n \"id\": 0,\n \"function\": \"arithmetic_workflow.get_prod_and_div\"\n },\n {\n \"id\": 1,\n \"function\": \"arithmetic_workflow.get_sum\"\n },\n {\n \"id\": 2,\n \"value\": 1.0\n },\n {\n \"id\": 3,\n \"value\": 2.0\n }\n ],\n \"edges\": [\n {\n \"target\": 1,\n \"targetPort\": \"x\",\n \"source\": 0,\n \"sourcePort\": \"prod\"\n },\n {\n \"target\": 1,\n \"targetPort\": \"y\",\n \"source\": 0,\n \"sourcePort\": \"div\"\n },\n {\n \"target\": 0,\n \"targetPort\": \"x\",\n \"source\": 2,\n \"sourcePort\": null\n },\n {\n \"target\": 0,\n \"targetPort\": \"y\",\n \"source\": 3,\n \"sourcePort\": null\n }\n ]\n}" - } - ], - "execution_count": 7 + "outputs": [], + "source": [ + "!cat {workflow_json_filename}" + ] }, { "cell_type": "markdown", - "source": "## Load Workflow with jobflow", - "metadata": {} + "metadata": {}, + "source": [ + "## Load Workflow with jobflow" + ] }, { "cell_type": "code", - "source": "from python_workflow_definition.jobflow import load_workflow_json", + "execution_count": null, "metadata": { "trusted": true }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": "/srv/conda/envs/notebook/lib/python3.12/site-packages/paramiko/pkey.py:82: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0.\n \"cipher\": algorithms.TripleDES,\n/srv/conda/envs/notebook/lib/python3.12/site-packages/paramiko/transport.py:253: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0.\n \"class\": algorithms.TripleDES,\n" - } - ], - "execution_count": 8 + "outputs": [], + "source": [ + "from python_workflow_definition.jobflow import load_workflow_json" + ] }, { "cell_type": "code", - "source": "from jobflow.managers.local import run_locally", + "execution_count": null, "metadata": { "trusted": true }, "outputs": [], - "execution_count": 9 + "source": [ + "from jobflow.managers.local import run_locally" + ] }, { "cell_type": "code", - "source": "flow = load_workflow_json(file_name=workflow_json_filename)", + "execution_count": null, "metadata": { "trusted": true }, "outputs": [], - "execution_count": 10 + "source": [ + "flow = load_workflow_json(file_name=workflow_json_filename)" + ] }, { "cell_type": "code", - "source": "result = run_locally(flow)\nresult", + "execution_count": null, "metadata": { "trusted": true }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": "2025-04-23 09:27:52,129 INFO Started executing jobs locally\n2025-04-23 09:27:52,561 INFO Starting job - get_prod_and_div (6eae194f-04a4-4c7c-b0d9-baf624bac375)\n2025-04-23 09:27:52,564 INFO Finished job - get_prod_and_div (6eae194f-04a4-4c7c-b0d9-baf624bac375)\n2025-04-23 09:27:52,564 INFO Starting job - get_sum (21fda98d-7701-45c7-a30a-816e9a91ab75)\n2025-04-23 09:27:52,566 INFO Finished job - get_sum (21fda98d-7701-45c7-a30a-816e9a91ab75)\n2025-04-23 09:27:52,566 INFO Finished executing jobs locally\n" - }, - { - "execution_count": 11, - "output_type": "execute_result", - "data": { - "text/plain": "{'6eae194f-04a4-4c7c-b0d9-baf624bac375': {1: Response(output={'prod': 2.0, 'div': 0.5}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n '21fda98d-7701-45c7-a30a-816e9a91ab75': {1: Response(output=2.5, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))}}" - }, - "metadata": {} - } - ], - "execution_count": 11 + "outputs": [], + "source": [ + "result = run_locally(flow)\n", + "result" + ] }, { "cell_type": "markdown", - "source": "## Load Workflow with pyiron_base", - "metadata": {} + "metadata": {}, + "source": [ + "## Load Workflow with pyiron_base" + ] }, { "cell_type": "code", - "source": "from python_workflow_definition.pyiron_base import load_workflow_json", + "execution_count": null, "metadata": { "trusted": true }, "outputs": [], - "execution_count": 12 + "source": [ + "from python_workflow_definition.pyiron_base import load_workflow_json" + ] }, { "cell_type": "code", - "source": "delayed_object_lst = load_workflow_json(file_name=workflow_json_filename)\ndelayed_object_lst[-1].draw()", + "execution_count": null, "metadata": { "trusted": true }, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": "", - "image/svg+xml": "\n\n\n\n\ncreate_function_job_92b349b68e1d28facd2c0cc67fea0894\n\ncreate_function_job=<pyiron_base.project.delayed.DelayedObject object at 0x7407d4c7d100>\n\n\n\nx_c8e04d7c4ce41e51517caabdd70267c4\n\nx=<pyiron_base.project.delayed.DelayedObject object at 0x7407ca519a90>\n\n\n\nx_c8e04d7c4ce41e51517caabdd70267c4->create_function_job_92b349b68e1d28facd2c0cc67fea0894\n\n\n\n\n\nx_974924ff998969b91bfc8b2db5f854a1\n\nx=1.0\n\n\n\nx_974924ff998969b91bfc8b2db5f854a1->x_c8e04d7c4ce41e51517caabdd70267c4\n\n\n\n\n\ny_6c83c1caef87634071eb9102b68e73cf\n\ny=<pyiron_base.project.delayed.DelayedObject object at 0x7407bf835610>\n\n\n\nx_974924ff998969b91bfc8b2db5f854a1->y_6c83c1caef87634071eb9102b68e73cf\n\n\n\n\n\ny_6c83c1caef87634071eb9102b68e73cf->create_function_job_92b349b68e1d28facd2c0cc67fea0894\n\n\n\n\n\ny_f12a7f1986b9dd058dfc666dbe230b20\n\ny=2.0\n\n\n\ny_f12a7f1986b9dd058dfc666dbe230b20->x_c8e04d7c4ce41e51517caabdd70267c4\n\n\n\n\n\ny_f12a7f1986b9dd058dfc666dbe230b20->y_6c83c1caef87634071eb9102b68e73cf\n\n\n\n\n" - }, - "metadata": {} - } - ], - "execution_count": 13 + "outputs": [], + "source": [ + "delayed_object_lst = load_workflow_json(file_name=workflow_json_filename)\n", + "delayed_object_lst[-1].draw()" + ] }, { "cell_type": "code", - "source": "delayed_object_lst[-1].pull()", + "execution_count": null, "metadata": { "trusted": true }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": "The job get_prod_and_div_7c19c6233dddb02781fc331f609558a1 was saved and received the ID: 1\nThe job get_sum_92b8e0a2d45fff6b04940562a8d7d8f7 was saved and received the ID: 2\n" - }, - { - "execution_count": 14, - "output_type": "execute_result", - "data": { - "text/plain": "2.5" - }, - "metadata": {} - } - ], - "execution_count": 14 + "outputs": [], + "source": [ + "delayed_object_lst[-1].pull()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "ADIS", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" } - ] + }, + "nbformat": 4, + "nbformat_minor": 4 } diff --git a/example_workflows/arithmetic/aiida_dev.py b/example_workflows/arithmetic/aiida_dev.py new file mode 100644 index 0000000..ea42447 --- /dev/null +++ b/example_workflows/arithmetic/aiida_dev.py @@ -0,0 +1,103 @@ +# %% [markdown] +# # Aiida + +# %% [markdown] +# ## Define workflow with aiida + +# %% +from python_workflow_definition.aiida import AiidaPwdConverter + +from aiida_workgraph import WorkGraph, task +from aiida import orm, load_profile +from rich.pretty import pprint + +load_profile() + +workflow_json_filename = "aiida_simple.json" + +# %% +from workflow import ( + get_sum as _get_sum, + get_prod_and_div as _get_prod_and_div, + square as _square +) + +# %% +wg = WorkGraph("arithmetic") + +# %% +get_prod_and_div_task = wg.add_task( + task(outputs=['prod', 'div'])(_get_prod_and_div), + name="get_prod_and_div", + x=orm.Float(1), + y=orm.Float(2), +) + +# %% +get_sum_task = wg.add_task( + _get_sum, + name="get_sum", + x=get_prod_and_div_task.outputs.prod, + y=get_prod_and_div_task.outputs.div, +) + +# %% +square_task = wg.add_task( + _square, + name="square", + x=get_sum_task.outputs.result, +) + +# %% +aiida_converter = AiidaPwdConverter() +model = aiida_converter.workgraph_to_model(wg=wg) +pprint(model.model_dump()) + +# model.dump_json_file(file_name=workflow_json_filename) + +wg = aiida_converter.model_to_workgraph(model) +wg +# model.dump_json_file(file_name=workflow_json_filename) + +# %% +# Currently conversion PWD <-> WG is not atomic, as information is lost due to the `group_outputs` workaround, and the +# fact that `group_inputs` is not implemented in WG, at all + +# pwd_wf = PwdWorkflow.load_json_file(workflow_json_filename) +# wg = aiida_converter.model_to_workgraph(workflow_model=pwd_wf) + +# model = aiida_converter.workgraph_to_model(wg) +# pprint(model.model_dump()) + +# %% + +# %% [markdown] +# ## Load Workflow with jobflow + +# %% +from python_workflow_definition.jobflow import load_workflow_json + +# %% +from jobflow.managers.local import run_locally + +# %% +flow = load_workflow_json(file_name=workflow_json_filename) + +# %% +result = run_locally(flow) +result + +# %% [markdown] +# ## Load Workflow with pyiron_base + +# %% +from python_workflow_definition.pyiron_base import load_workflow_json + +# %% +delayed_object_lst = load_workflow_json(file_name=workflow_json_filename) +delayed_object_lst[-1].draw() + +# %% +delayed_object_lst[-1].pull() + + diff --git a/example_workflows/arithmetic/aiida_simple.json b/example_workflows/arithmetic/aiida_simple.json new file mode 100644 index 0000000..275429c --- /dev/null +++ b/example_workflows/arithmetic/aiida_simple.json @@ -0,0 +1,51 @@ +{ + "nodes": [ + { + "id": 0, + "type": "function", + "value": "workflow.get_prod_and_div" + }, + { + "id": 1, + "type": "function", + "value": "workflow.get_sum" + }, + { + "id": 2, + "type": "function", + "value": "workflow.square" + }, + { + "id": 3, + "type": "output", + "name": "result", + "value": null + } + ], + "edges": [ + { + "target": 1, + "targetPort": "x", + "source": 0, + "sourcePort": "prod" + }, + { + "target": 1, + "targetPort": "y", + "source": 0, + "sourcePort": "div" + }, + { + "target": 2, + "targetPort": "x", + "source": 1, + "sourcePort": null + }, + { + "target": 3, + "targetPort": null, + "source": 2, + "sourcePort": null + } + ] +} \ No newline at end of file diff --git a/example_workflows/arithmetic/workflow.json b/example_workflows/arithmetic/workflow.json index e68cfc7..0d6bbda 100644 --- a/example_workflows/arithmetic/workflow.json +++ b/example_workflows/arithmetic/workflow.json @@ -1,14 +1,18 @@ { "nodes": [ - {"id": 0, "function": "workflow.get_prod_and_div"}, - {"id": 1, "function": "workflow.get_sum"}, - {"id": 2, "value": 1}, - {"id": 3, "value": 2} + { "id": 0, "type": "function", "value": "workflow.get_prod_and_div" }, + { "id": 1, "type": "function", "value": "workflow.get_sum" }, + { "id": 2, "type": "function", "value": "workflow.square" }, + { "id": 3, "type": "input", "name": "a", "value": 1.0 }, + { "id": 4, "type": "input", "name": "b", "value": 2.0 }, + { "id": 5, "type": "output", "name": "result", "value": null } ], "edges": [ - {"target": 0, "targetPort": "x", "source": 2, "sourcePort": null}, - {"target": 0, "targetPort": "y", "source": 3, "sourcePort": null}, - {"target": 1, "targetPort": "x", "source": 0, "sourcePort": "prod"}, - {"target": 1, "targetPort": "y", "source": 0, "sourcePort": "div"} + { "target": 0, "targetPort": "x", "source": 3, "sourcePort": null }, + { "target": 0, "targetPort": "y", "source": 4, "sourcePort": null }, + { "target": 1, "targetPort": "x", "source": 0, "sourcePort": "prod" }, + { "target": 1, "targetPort": "y", "source": 0, "sourcePort": "div" }, + { "target": 2, "targetPort": "x", "source": 1, "sourcePort": null }, + { "target": 5, "targetPort": null, "source": 2, "sourcePort": null } ] -} +} \ No newline at end of file diff --git a/example_workflows/arithmetic/workflow.py b/example_workflows/arithmetic/workflow.py index 3a12993..dabdfcc 100644 --- a/example_workflows/arithmetic/workflow.py +++ b/example_workflows/arithmetic/workflow.py @@ -4,3 +4,6 @@ def get_prod_and_div(x, y): def get_sum(x, y): return x + y + +def square(x): + return x**2 diff --git a/example_workflows/nfdi/aiida.ipynb b/example_workflows/nfdi/aiida.ipynb index d8b5ab7..5436549 100644 --- a/example_workflows/nfdi/aiida.ipynb +++ b/example_workflows/nfdi/aiida.ipynb @@ -1,62 +1,69 @@ { - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "name": "python", - "version": "3.12.8", - "mimetype": "text/x-python", - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "pygments_lexer": "ipython3", - "nbconvert_exporter": "python", - "file_extension": ".py" - } - }, - "nbformat_minor": 5, - "nbformat": 4, "cells": [ { - "id": "106ded66-d202-46ac-82b0-2755ca309bdd", "cell_type": "markdown", - "source": "# Aiida\n\nhttps://github.com/BAMresearch/NFDI4IngScientificWorkflowRequirements", - "metadata": {} + "id": "106ded66-d202-46ac-82b0-2755ca309bdd", + "metadata": {}, + "source": [ + "# Aiida\n", + "\n", + "https://github.com/BAMresearch/NFDI4IngScientificWorkflowRequirements" + ] }, { - "id": "11e09b78-cb72-465f-9c8b-5b77f0aa729c", "cell_type": "markdown", - "source": "## Define workflow with aiida", - "metadata": {} + "id": "11e09b78-cb72-465f-9c8b-5b77f0aa729c", + "metadata": {}, + "source": [ + "## Define workflow with aiida" + ] }, { - "id": "89c02460-b543-442c-a27e-f1757dc2262e", "cell_type": "code", - "source": "from python_workflow_definition.aiida import write_workflow_json\n\nfrom aiida_workgraph import WorkGraph, task\nfrom aiida import orm, load_profile\nload_profile()", + "execution_count": 1, + "id": "89c02460-b543-442c-a27e-f1757dc2262e", "metadata": { "trusted": true }, "outputs": [ { - "execution_count": 1, - "output_type": "execute_result", "data": { - "text/plain": "Profile" + "text/plain": [ + "Profile" + ] }, - "metadata": {} + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" } ], - "execution_count": 1 + "source": [ + "from python_workflow_definition.aiida import AiidaPwdConverter\n", + "\n", + "from aiida_workgraph import WorkGraph, task\n", + "from aiida import orm, load_profile\n", + "load_profile()" + ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], - "execution_count": null, + "execution_count": 2, + "id": "6dac225a1ce86b25", + "metadata": {}, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'conda_subprocess'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[2], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mworkflow\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (\n\u001b[1;32m 2\u001b[0m generate_mesh,\n\u001b[1;32m 3\u001b[0m convert_to_xdmf \u001b[38;5;28;01mas\u001b[39;00m _convert_to_xdmf,\n\u001b[1;32m 4\u001b[0m poisson \u001b[38;5;28;01mas\u001b[39;00m _poisson,\n\u001b[1;32m 5\u001b[0m plot_over_line,\n\u001b[1;32m 6\u001b[0m substitute_macros,\n\u001b[1;32m 7\u001b[0m compile_paper,\n\u001b[1;32m 8\u001b[0m )\n", + "File \u001b[0;32m~/aiida_projects/adis/git-repos/python-workflow-definition/example_workflows/nfdi/workflow.py:2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mos\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mconda_subprocess\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m check_output\n\u001b[1;32m 3\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mshutil\u001b[39;00m\n\u001b[1;32m 5\u001b[0m source_directory \u001b[38;5;241m=\u001b[39m os\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mjoin(os\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mdirname(os\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mabspath(\u001b[38;5;18m__file__\u001b[39m)), \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'conda_subprocess'" + ] + } + ], "source": [ "from workflow import (\n", " generate_mesh,\n", @@ -66,162 +73,251 @@ " substitute_macros,\n", " compile_paper,\n", ")" - ], - "id": "6dac225a1ce86b25" + ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "id": "c47205d289499756", + "metadata": {}, + "outputs": [], "source": [ "convert_to_xdmf = task(outputs=[\"xdmf_file\", \"h5_file\"])(_convert_to_xdmf)\n", "poisson = task(outputs=[\"numdofs\", \"pvd_file\", \"vtu_file\"])(_poisson)" - ], - "id": "c47205d289499756" + ] }, { - "id": "8d911f98-3b80-457f-a0f4-3cb37ebf1691", "cell_type": "code", - "source": "domain_size = orm.Float(2.0)", + "execution_count": 4, + "id": "8d911f98-3b80-457f-a0f4-3cb37ebf1691", "metadata": { "trusted": true }, "outputs": [], - "execution_count": 4 + "source": [ + "domain_size = orm.Float(2.0)" + ] }, { - "id": "1e7e14ba-c4a7-485f-9bd8-44625830cca0", "cell_type": "code", - "source": "wg = WorkGraph(\"wg-nfdi\")", + "execution_count": 5, + "id": "1e7e14ba-c4a7-485f-9bd8-44625830cca0", "metadata": { "trusted": true }, "outputs": [], - "execution_count": 5 + "source": [ + "wg = WorkGraph(\"wg-nfdi\")" + ] }, { - "id": "71d411b6-cbec-489e-99e3-ba71680bcb5b", "cell_type": "code", - "source": "gmsh_output_file = wg.add_task(\n generate_mesh,\n name=\"generate_mesh\",\n domain_size=domain_size,\n)", + "execution_count": 6, + "id": "71d411b6-cbec-489e-99e3-ba71680bcb5b", "metadata": { "tags": [], "trusted": true }, "outputs": [], - "execution_count": 6 + "source": [ + "gmsh_output_file = wg.add_task(\n", + " generate_mesh,\n", + " name=\"generate_mesh\",\n", + " domain_size=domain_size,\n", + ")" + ] }, { - "id": "1d0d9804-f250-48b3-a5d0-a546d520f79b", "cell_type": "code", - "source": "meshio_output_dict = wg.add_task(\n convert_to_xdmf,\n name=\"convert_to_xdmf\",\n gmsh_output_file=gmsh_output_file.outputs.result,\n)", + "execution_count": 7, + "id": "1d0d9804-f250-48b3-a5d0-a546d520f79b", "metadata": { "tags": [], "trusted": true }, "outputs": [], - "execution_count": 7 + "source": [ + "meshio_output_dict = wg.add_task(\n", + " convert_to_xdmf,\n", + " name=\"convert_to_xdmf\",\n", + " gmsh_output_file=gmsh_output_file.outputs.result,\n", + ")" + ] }, { - "id": "7b69bcff-e2b1-4d4a-b62c-6a1c86eeb590", "cell_type": "code", - "source": "poisson_dict = wg.add_task(\n poisson,\n name=\"poisson\",\n meshio_output_xdmf=meshio_output_dict.outputs.xdmf_file, \n meshio_output_h5=meshio_output_dict.outputs.h5_file,\n)", + "execution_count": 8, + "id": "7b69bcff-e2b1-4d4a-b62c-6a1c86eeb590", "metadata": { "tags": [], "trusted": true }, "outputs": [], - "execution_count": 8 + "source": [ + "poisson_dict = wg.add_task(\n", + " poisson,\n", + " name=\"poisson\",\n", + " meshio_output_xdmf=meshio_output_dict.outputs.xdmf_file, \n", + " meshio_output_h5=meshio_output_dict.outputs.h5_file,\n", + ")" + ] }, { - "id": "3c4a29b0-eb1e-490a-8be0-e03cfff15e0a", "cell_type": "code", - "source": "pvbatch_output_file = wg.add_task(\n plot_over_line,\n name=\"plot_over_line\",\n poisson_output_pvd_file=poisson_dict.outputs.pvd_file, \n poisson_output_vtu_file=poisson_dict.outputs.vtu_file,\n)", + "execution_count": 9, + "id": "3c4a29b0-eb1e-490a-8be0-e03cfff15e0a", "metadata": { "tags": [], "trusted": true }, "outputs": [], - "execution_count": 9 + "source": [ + "pvbatch_output_file = wg.add_task(\n", + " plot_over_line,\n", + " name=\"plot_over_line\",\n", + " poisson_output_pvd_file=poisson_dict.outputs.pvd_file, \n", + " poisson_output_vtu_file=poisson_dict.outputs.vtu_file,\n", + ")" + ] }, { - "id": "a0a4c233-322d-4723-9627-62ca2487bfa9", "cell_type": "code", - "source": "macros_tex_file = wg.add_task(\n substitute_macros,\n name=\"substitute_macros\",\n pvbatch_output_file=pvbatch_output_file.outputs.result, \n ndofs=poisson_dict.outputs.numdofs, \n domain_size=domain_size,\n)", + "execution_count": 10, + "id": "a0a4c233-322d-4723-9627-62ca2487bfa9", "metadata": { "tags": [], "trusted": true }, "outputs": [], - "execution_count": 10 + "source": [ + "macros_tex_file = wg.add_task(\n", + " substitute_macros,\n", + " name=\"substitute_macros\",\n", + " pvbatch_output_file=pvbatch_output_file.outputs.result, \n", + " ndofs=poisson_dict.outputs.numdofs, \n", + " domain_size=domain_size,\n", + ")" + ] }, { - "id": "c281408f-e63d-4380-a7e6-c595d49fbb8f", "cell_type": "code", - "source": "paper_output = wg.add_task(\n compile_paper,\n name=\"compile_paper\",\n macros_tex=macros_tex_file.outputs.result, \n plot_file=pvbatch_output_file.outputs.result,\n)", + "execution_count": 11, + "id": "c281408f-e63d-4380-a7e6-c595d49fbb8f", "metadata": { "trusted": true }, "outputs": [], - "execution_count": 11 + "source": [ + "paper_output = wg.add_task(\n", + " compile_paper,\n", + " name=\"compile_paper\",\n", + " macros_tex=macros_tex_file.outputs.result, \n", + " plot_file=pvbatch_output_file.outputs.result,\n", + ")" + ] }, { - "id": "a384d70a-8ef5-4fdd-880c-56ac7eaf87b9", "cell_type": "code", - "source": "wg", + "execution_count": 12, + "id": "a384d70a-8ef5-4fdd-880c-56ac7eaf87b9", "metadata": { "trusted": true }, "outputs": [ { - "execution_count": 12, - "output_type": "execute_result", "data": { - "text/plain": "NodeGraphWidget(settings={'minimap': True}, style={'width': '90%', 'height': '600px'}, value={'name': 'wg-nfdi…", "application/vnd.jupyter.widget-view+json": { + "model_id": "cc82d573b0404a4697e86fea0f52b39d", "version_major": 2, - "version_minor": 1, - "model_id": "cc82d573b0404a4697e86fea0f52b39d" - } + "version_minor": 1 + }, + "text/plain": [ + "NodeGraphWidget(settings={'minimap': True}, style={'width': '90%', 'height': '600px'}, value={'name': 'wg-nfdi…" + ] }, - "metadata": {} + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" } ], - "execution_count": 12 + "source": [ + "wg" + ] }, { - "id": "fb23ad9c-76fd-4c0b-b546-e305d6c49796", "cell_type": "code", - "source": "workflow_json_filename = \"aiida_nfdi.json\"", + "execution_count": 13, + "id": "fb23ad9c-76fd-4c0b-b546-e305d6c49796", "metadata": { "trusted": true }, "outputs": [], - "execution_count": 13 + "source": [ + "workflow_json_filename = \"aiida_nfdi.json\"" + ] }, { - "id": "4139547a-9717-4708-b1a5-8202a0382d77", "cell_type": "code", - "source": "write_workflow_json(wg=wg, file_name=workflow_json_filename)", + "execution_count": 14, + "id": "4139547a-9717-4708-b1a5-8202a0382d77", "metadata": { "trusted": true }, "outputs": [ { - "execution_count": 14, - "output_type": "execute_result", "data": { - "text/plain": "{'nodes': [{'id': 0, 'function': 'nfdi_ing_workflow.generate_mesh'},\n {'id': 1, 'function': 'nfdi_ing_workflow.convert_to_xdmf'},\n {'id': 2, 'function': 'nfdi_ing_workflow.poisson'},\n {'id': 3, 'function': 'nfdi_ing_workflow.plot_over_line'},\n {'id': 4, 'function': 'nfdi_ing_workflow.substitute_macros'},\n {'id': 5, 'function': 'nfdi_ing_workflow.compile_paper'},\n {'id': 6, 'value': 2.0}],\n 'edges': [{'target': 1,\n 'targetPort': 'gmsh_output_file',\n 'source': 0,\n 'sourcePort': None},\n {'target': 2,\n 'targetPort': 'meshio_output_xdmf',\n 'source': 1,\n 'sourcePort': 'xdmf_file'},\n {'target': 2,\n 'targetPort': 'meshio_output_h5',\n 'source': 1,\n 'sourcePort': 'h5_file'},\n {'target': 3,\n 'targetPort': 'poisson_output_pvd_file',\n 'source': 2,\n 'sourcePort': 'pvd_file'},\n {'target': 3,\n 'targetPort': 'poisson_output_vtu_file',\n 'source': 2,\n 'sourcePort': 'vtu_file'},\n {'target': 4,\n 'targetPort': 'pvbatch_output_file',\n 'source': 3,\n 'sourcePort': None},\n {'target': 4, 'targetPort': 'ndofs', 'source': 2, 'sourcePort': 'numdofs'},\n {'target': 5, 'targetPort': 'macros_tex', 'source': 4, 'sourcePort': None},\n {'target': 5, 'targetPort': 'plot_file', 'source': 3, 'sourcePort': None},\n {'target': 0, 'targetPort': 'domain_size', 'source': 6, 'sourcePort': None},\n {'target': 4, 'targetPort': 'domain_size', 'source': 6, 'sourcePort': None}]}" + "text/plain": [ + "{'nodes': [{'id': 0, 'function': 'nfdi_ing_workflow.generate_mesh'},\n", + " {'id': 1, 'function': 'nfdi_ing_workflow.convert_to_xdmf'},\n", + " {'id': 2, 'function': 'nfdi_ing_workflow.poisson'},\n", + " {'id': 3, 'function': 'nfdi_ing_workflow.plot_over_line'},\n", + " {'id': 4, 'function': 'nfdi_ing_workflow.substitute_macros'},\n", + " {'id': 5, 'function': 'nfdi_ing_workflow.compile_paper'},\n", + " {'id': 6, 'value': 2.0}],\n", + " 'edges': [{'target': 1,\n", + " 'targetPort': 'gmsh_output_file',\n", + " 'source': 0,\n", + " 'sourcePort': None},\n", + " {'target': 2,\n", + " 'targetPort': 'meshio_output_xdmf',\n", + " 'source': 1,\n", + " 'sourcePort': 'xdmf_file'},\n", + " {'target': 2,\n", + " 'targetPort': 'meshio_output_h5',\n", + " 'source': 1,\n", + " 'sourcePort': 'h5_file'},\n", + " {'target': 3,\n", + " 'targetPort': 'poisson_output_pvd_file',\n", + " 'source': 2,\n", + " 'sourcePort': 'pvd_file'},\n", + " {'target': 3,\n", + " 'targetPort': 'poisson_output_vtu_file',\n", + " 'source': 2,\n", + " 'sourcePort': 'vtu_file'},\n", + " {'target': 4,\n", + " 'targetPort': 'pvbatch_output_file',\n", + " 'source': 3,\n", + " 'sourcePort': None},\n", + " {'target': 4, 'targetPort': 'ndofs', 'source': 2, 'sourcePort': 'numdofs'},\n", + " {'target': 5, 'targetPort': 'macros_tex', 'source': 4, 'sourcePort': None},\n", + " {'target': 5, 'targetPort': 'plot_file', 'source': 3, 'sourcePort': None},\n", + " {'target': 0, 'targetPort': 'domain_size', 'source': 6, 'sourcePort': None},\n", + " {'target': 4, 'targetPort': 'domain_size', 'source': 6, 'sourcePort': None}]}" + ] }, - "metadata": {} + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" } ], - "execution_count": 14 + "source": [ + "write_workflow_json(wg=wg, file_name=workflow_json_filename)" + ] }, { - "id": "490df6a3-e402-4620-acf2-dbcfa0c5d537", "cell_type": "code", - "source": "!cat {workflow_json_filename}", + "execution_count": 15, + "id": "490df6a3-e402-4620-acf2-dbcfa0c5d537", "metadata": { "trusted": true }, @@ -229,21 +325,126 @@ { "name": "stdout", "output_type": "stream", - "text": "{\n \"nodes\": [\n {\n \"id\": 0,\n \"function\": \"nfdi_ing_workflow.generate_mesh\"\n },\n {\n \"id\": 1,\n \"function\": \"nfdi_ing_workflow.convert_to_xdmf\"\n },\n {\n \"id\": 2,\n \"function\": \"nfdi_ing_workflow.poisson\"\n },\n {\n \"id\": 3,\n \"function\": \"nfdi_ing_workflow.plot_over_line\"\n },\n {\n \"id\": 4,\n \"function\": \"nfdi_ing_workflow.substitute_macros\"\n },\n {\n \"id\": 5,\n \"function\": \"nfdi_ing_workflow.compile_paper\"\n },\n {\n \"id\": 6,\n \"value\": 2.0\n }\n ],\n \"edges\": [\n {\n \"target\": 1,\n \"targetPort\": \"gmsh_output_file\",\n \"source\": 0,\n \"sourcePort\": null\n },\n {\n \"target\": 2,\n \"targetPort\": \"meshio_output_xdmf\",\n \"source\": 1,\n \"sourcePort\": \"xdmf_file\"\n },\n {\n \"target\": 2,\n \"targetPort\": \"meshio_output_h5\",\n \"source\": 1,\n \"sourcePort\": \"h5_file\"\n },\n {\n \"target\": 3,\n \"targetPort\": \"poisson_output_pvd_file\",\n \"source\": 2,\n \"sourcePort\": \"pvd_file\"\n },\n {\n \"target\": 3,\n \"targetPort\": \"poisson_output_vtu_file\",\n \"source\": 2,\n \"sourcePort\": \"vtu_file\"\n },\n {\n \"target\": 4,\n \"targetPort\": \"pvbatch_output_file\",\n \"source\": 3,\n \"sourcePort\": null\n },\n {\n \"target\": 4,\n \"targetPort\": \"ndofs\",\n \"source\": 2,\n \"sourcePort\": \"numdofs\"\n },\n {\n \"target\": 5,\n \"targetPort\": \"macros_tex\",\n \"source\": 4,\n \"sourcePort\": null\n },\n {\n \"target\": 5,\n \"targetPort\": \"plot_file\",\n \"source\": 3,\n \"sourcePort\": null\n },\n {\n \"target\": 0,\n \"targetPort\": \"domain_size\",\n \"source\": 6,\n \"sourcePort\": null\n },\n {\n \"target\": 4,\n \"targetPort\": \"domain_size\",\n \"source\": 6,\n \"sourcePort\": null\n }\n ]\n}" + "text": [ + "{\n", + " \"nodes\": [\n", + " {\n", + " \"id\": 0,\n", + " \"function\": \"nfdi_ing_workflow.generate_mesh\"\n", + " },\n", + " {\n", + " \"id\": 1,\n", + " \"function\": \"nfdi_ing_workflow.convert_to_xdmf\"\n", + " },\n", + " {\n", + " \"id\": 2,\n", + " \"function\": \"nfdi_ing_workflow.poisson\"\n", + " },\n", + " {\n", + " \"id\": 3,\n", + " \"function\": \"nfdi_ing_workflow.plot_over_line\"\n", + " },\n", + " {\n", + " \"id\": 4,\n", + " \"function\": \"nfdi_ing_workflow.substitute_macros\"\n", + " },\n", + " {\n", + " \"id\": 5,\n", + " \"function\": \"nfdi_ing_workflow.compile_paper\"\n", + " },\n", + " {\n", + " \"id\": 6,\n", + " \"value\": 2.0\n", + " }\n", + " ],\n", + " \"edges\": [\n", + " {\n", + " \"target\": 1,\n", + " \"targetPort\": \"gmsh_output_file\",\n", + " \"source\": 0,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 2,\n", + " \"targetPort\": \"meshio_output_xdmf\",\n", + " \"source\": 1,\n", + " \"sourcePort\": \"xdmf_file\"\n", + " },\n", + " {\n", + " \"target\": 2,\n", + " \"targetPort\": \"meshio_output_h5\",\n", + " \"source\": 1,\n", + " \"sourcePort\": \"h5_file\"\n", + " },\n", + " {\n", + " \"target\": 3,\n", + " \"targetPort\": \"poisson_output_pvd_file\",\n", + " \"source\": 2,\n", + " \"sourcePort\": \"pvd_file\"\n", + " },\n", + " {\n", + " \"target\": 3,\n", + " \"targetPort\": \"poisson_output_vtu_file\",\n", + " \"source\": 2,\n", + " \"sourcePort\": \"vtu_file\"\n", + " },\n", + " {\n", + " \"target\": 4,\n", + " \"targetPort\": \"pvbatch_output_file\",\n", + " \"source\": 3,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 4,\n", + " \"targetPort\": \"ndofs\",\n", + " \"source\": 2,\n", + " \"sourcePort\": \"numdofs\"\n", + " },\n", + " {\n", + " \"target\": 5,\n", + " \"targetPort\": \"macros_tex\",\n", + " \"source\": 4,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 5,\n", + " \"targetPort\": \"plot_file\",\n", + " \"source\": 3,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 0,\n", + " \"targetPort\": \"domain_size\",\n", + " \"source\": 6,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 4,\n", + " \"targetPort\": \"domain_size\",\n", + " \"source\": 6,\n", + " \"sourcePort\": null\n", + " }\n", + " ]\n", + "}" + ] } ], - "execution_count": 15 + "source": [ + "!cat {workflow_json_filename}" + ] }, { - "id": "11a829e2-face-469f-b343-2c95763b1f13", "cell_type": "markdown", - "source": "## Load Workflow with jobflow", - "metadata": {} + "id": "11a829e2-face-469f-b343-2c95763b1f13", + "metadata": {}, + "source": [ + "## Load Workflow with jobflow" + ] }, { - "id": "4f3acabe-55df-479a-af4d-a23a80c4660d", "cell_type": "code", - "source": "from python_workflow_definition.jobflow import load_workflow_json", + "execution_count": 16, + "id": "4f3acabe-55df-479a-af4d-a23a80c4660d", "metadata": { "trusted": true }, @@ -251,35 +452,46 @@ { "name": "stderr", "output_type": "stream", - "text": "/srv/conda/envs/notebook/lib/python3.12/site-packages/paramiko/pkey.py:82: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0.\n \"cipher\": algorithms.TripleDES,\n/srv/conda/envs/notebook/lib/python3.12/site-packages/paramiko/transport.py:253: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0.\n \"class\": algorithms.TripleDES,\n" + "text": [ + "/srv/conda/envs/notebook/lib/python3.12/site-packages/paramiko/pkey.py:82: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0.\n", + " \"cipher\": algorithms.TripleDES,\n", + "/srv/conda/envs/notebook/lib/python3.12/site-packages/paramiko/transport.py:253: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0.\n", + " \"class\": algorithms.TripleDES,\n" + ] } ], - "execution_count": 16 + "source": [ + "from python_workflow_definition.jobflow import load_workflow_json" + ] }, { - "id": "b6ba9444-a2c8-451b-b74c-19b0f69ba369", "cell_type": "code", - "source": "from jobflow.managers.local import run_locally", + "execution_count": 17, + "id": "b6ba9444-a2c8-451b-b74c-19b0f69ba369", "metadata": { "trusted": true }, "outputs": [], - "execution_count": 17 + "source": [ + "from jobflow.managers.local import run_locally" + ] }, { - "id": "c3528d55-6bf7-47ed-a110-65c47446ba92", "cell_type": "code", - "source": "flow = load_workflow_json(file_name=workflow_json_filename)", + "execution_count": 18, + "id": "c3528d55-6bf7-47ed-a110-65c47446ba92", "metadata": { "trusted": true }, "outputs": [], - "execution_count": 18 + "source": [ + "flow = load_workflow_json(file_name=workflow_json_filename)" + ] }, { - "id": "5ef48778-4209-425f-8c6b-85a4cd2f92ec", "cell_type": "code", - "source": "result = run_locally(flow)\nresult", + "execution_count": 19, + "id": "5ef48778-4209-425f-8c6b-85a4cd2f92ec", "metadata": { "trusted": true }, @@ -287,58 +499,272 @@ { "name": "stdout", "output_type": "stream", - "text": "2025-04-23 09:29:09,718 INFO Started executing jobs locally\n2025-04-23 09:29:10,027 INFO Starting job - generate_mesh (db4e4162-f31c-4da8-b474-aff5f748b02a)\n2025-04-23 09:29:11,997 INFO Finished job - generate_mesh (db4e4162-f31c-4da8-b474-aff5f748b02a)\n2025-04-23 09:29:11,998 INFO Starting job - convert_to_xdmf (25f3510a-42fc-4895-bb0c-1ea58a357c1d)\n2025-04-23 09:29:13,640 INFO Finished job - convert_to_xdmf (25f3510a-42fc-4895-bb0c-1ea58a357c1d)\n2025-04-23 09:29:13,642 INFO Starting job - poisson (03732863-096b-4c7f-b9fe-62edb0fd5d91)\n2025-04-23 09:29:23,400 INFO Finished job - poisson (03732863-096b-4c7f-b9fe-62edb0fd5d91)\n2025-04-23 09:29:23,401 INFO Starting job - plot_over_line (d326049f-820a-4b9c-8645-70a4d5a8b581)\n2025-04-23 09:29:25,817 INFO Finished job - plot_over_line (d326049f-820a-4b9c-8645-70a4d5a8b581)\n2025-04-23 09:29:25,818 INFO Starting job - substitute_macros (ce1245a5-8a5d-4428-9e90-437f8dff22e2)\n2025-04-23 09:29:26,635 INFO Finished job - substitute_macros (ce1245a5-8a5d-4428-9e90-437f8dff22e2)\n2025-04-23 09:29:26,636 INFO Starting job - compile_paper (5b619ad3-49d6-4e76-ad3f-0ac31e7d63cb)\n2025-04-23 09:30:40,178 INFO Finished job - compile_paper (5b619ad3-49d6-4e76-ad3f-0ac31e7d63cb)\n2025-04-23 09:30:40,179 INFO Finished executing jobs locally\n" + "text": [ + "2025-04-23 09:29:09,718 INFO Started executing jobs locally\n", + "2025-04-23 09:29:10,027 INFO Starting job - generate_mesh (db4e4162-f31c-4da8-b474-aff5f748b02a)\n", + "2025-04-23 09:29:11,997 INFO Finished job - generate_mesh (db4e4162-f31c-4da8-b474-aff5f748b02a)\n", + "2025-04-23 09:29:11,998 INFO Starting job - convert_to_xdmf (25f3510a-42fc-4895-bb0c-1ea58a357c1d)\n", + "2025-04-23 09:29:13,640 INFO Finished job - convert_to_xdmf (25f3510a-42fc-4895-bb0c-1ea58a357c1d)\n", + "2025-04-23 09:29:13,642 INFO Starting job - poisson (03732863-096b-4c7f-b9fe-62edb0fd5d91)\n", + "2025-04-23 09:29:23,400 INFO Finished job - poisson (03732863-096b-4c7f-b9fe-62edb0fd5d91)\n", + "2025-04-23 09:29:23,401 INFO Starting job - plot_over_line (d326049f-820a-4b9c-8645-70a4d5a8b581)\n", + "2025-04-23 09:29:25,817 INFO Finished job - plot_over_line (d326049f-820a-4b9c-8645-70a4d5a8b581)\n", + "2025-04-23 09:29:25,818 INFO Starting job - substitute_macros (ce1245a5-8a5d-4428-9e90-437f8dff22e2)\n", + "2025-04-23 09:29:26,635 INFO Finished job - substitute_macros (ce1245a5-8a5d-4428-9e90-437f8dff22e2)\n", + "2025-04-23 09:29:26,636 INFO Starting job - compile_paper (5b619ad3-49d6-4e76-ad3f-0ac31e7d63cb)\n", + "2025-04-23 09:30:40,178 INFO Finished job - compile_paper (5b619ad3-49d6-4e76-ad3f-0ac31e7d63cb)\n", + "2025-04-23 09:30:40,179 INFO Finished executing jobs locally\n" + ] }, { - "execution_count": 19, - "output_type": "execute_result", "data": { - "text/plain": "{'db4e4162-f31c-4da8-b474-aff5f748b02a': {1: Response(output='/home/jovyan/preprocessing/square.msh', detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n '25f3510a-42fc-4895-bb0c-1ea58a357c1d': {1: Response(output={'xdmf_file': '/home/jovyan/preprocessing/square.xdmf', 'h5_file': '/home/jovyan/preprocessing/square.h5'}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n '03732863-096b-4c7f-b9fe-62edb0fd5d91': {1: Response(output={'numdofs': 357, 'pvd_file': '/home/jovyan/processing/poisson.pvd', 'vtu_file': '/home/jovyan/processing/poisson000000.vtu'}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n 'd326049f-820a-4b9c-8645-70a4d5a8b581': {1: Response(output='/home/jovyan/postprocessing/plotoverline.csv', detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n 'ce1245a5-8a5d-4428-9e90-437f8dff22e2': {1: Response(output='/home/jovyan/postprocessing/macros.tex', detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n '5b619ad3-49d6-4e76-ad3f-0ac31e7d63cb': {1: Response(output='/home/jovyan/postprocessing/paper.pdf', detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))}}" + "text/plain": [ + "{'db4e4162-f31c-4da8-b474-aff5f748b02a': {1: Response(output='/home/jovyan/preprocessing/square.msh', detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n", + " '25f3510a-42fc-4895-bb0c-1ea58a357c1d': {1: Response(output={'xdmf_file': '/home/jovyan/preprocessing/square.xdmf', 'h5_file': '/home/jovyan/preprocessing/square.h5'}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n", + " '03732863-096b-4c7f-b9fe-62edb0fd5d91': {1: Response(output={'numdofs': 357, 'pvd_file': '/home/jovyan/processing/poisson.pvd', 'vtu_file': '/home/jovyan/processing/poisson000000.vtu'}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n", + " 'd326049f-820a-4b9c-8645-70a4d5a8b581': {1: Response(output='/home/jovyan/postprocessing/plotoverline.csv', detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n", + " 'ce1245a5-8a5d-4428-9e90-437f8dff22e2': {1: Response(output='/home/jovyan/postprocessing/macros.tex', detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n", + " '5b619ad3-49d6-4e76-ad3f-0ac31e7d63cb': {1: Response(output='/home/jovyan/postprocessing/paper.pdf', detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))}}" + ] }, - "metadata": {} + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" } ], - "execution_count": 19 + "source": [ + "result = run_locally(flow)\n", + "result" + ] }, { - "id": "397b16a2-e1ec-4eec-8562-1c84f585c347", "cell_type": "markdown", - "source": "## Load Workflow with pyiron_base", - "metadata": {} + "id": "397b16a2-e1ec-4eec-8562-1c84f585c347", + "metadata": {}, + "source": [ + "## Load Workflow with pyiron_base" + ] }, { - "id": "be4d5d93-e9f6-4072-a6be-0ee5dc93590f", "cell_type": "code", - "source": "from python_workflow_definition.pyiron_base import load_workflow_json", + "execution_count": 20, + "id": "be4d5d93-e9f6-4072-a6be-0ee5dc93590f", "metadata": { "trusted": true }, "outputs": [], - "execution_count": 20 + "source": [ + "from python_workflow_definition.pyiron_base import load_workflow_json" + ] }, { - "id": "4452a648-d4c3-4f5f-8678-ffb54bef17dc", "cell_type": "code", - "source": "delayed_object_lst = load_workflow_json(file_name=workflow_json_filename)\ndelayed_object_lst[-1].draw()", + "execution_count": 21, + "id": "4452a648-d4c3-4f5f-8678-ffb54bef17dc", "metadata": { "trusted": true }, "outputs": [ { - "output_type": "display_data", "data": { - "text/plain": "", - "image/svg+xml": "\n\n\n\n\ncreate_function_job_69b38eef29d5c9aba4c6de512da1bb24\n\ncreate_function_job=<pyiron_base.project.delayed.DelayedObject object at 0x7470370855e0>\n\n\n\nmacros_tex_c5f640fc7b11414962941f82a40a8b04\n\nmacros_tex=<pyiron_base.project.delayed.DelayedObject object at 0x747042cb6ed0>\n\n\n\nmacros_tex_c5f640fc7b11414962941f82a40a8b04->create_function_job_69b38eef29d5c9aba4c6de512da1bb24\n\n\n\n\n\npvbatch_output_file_5f8f87a5c4f1bd1a4b6cca85a1fc2b78\n\npvbatch_output_file=<pyiron_base.project.delayed.DelayedObject object at 0x747041dd8c20>\n\n\n\npvbatch_output_file_5f8f87a5c4f1bd1a4b6cca85a1fc2b78->macros_tex_c5f640fc7b11414962941f82a40a8b04\n\n\n\n\n\npoisson_output_pvd_file_08c5d21e2c998fd513709b7a059c6649\n\npoisson_output_pvd_file=<pyiron_base.project.delayed.DelayedObject object at 0x74704c596180>\n\n\n\npoisson_output_pvd_file_08c5d21e2c998fd513709b7a059c6649->pvbatch_output_file_5f8f87a5c4f1bd1a4b6cca85a1fc2b78\n\n\n\n\n\nplot_file_5f8f87a5c4f1bd1a4b6cca85a1fc2b78\n\nplot_file=<pyiron_base.project.delayed.DelayedObject object at 0x747041dd8c20>\n\n\n\npoisson_output_pvd_file_08c5d21e2c998fd513709b7a059c6649->plot_file_5f8f87a5c4f1bd1a4b6cca85a1fc2b78\n\n\n\n\n\nplot_file_5f8f87a5c4f1bd1a4b6cca85a1fc2b78->create_function_job_69b38eef29d5c9aba4c6de512da1bb24\n\n\n\n\n\nmeshio_output_xdmf_fc75e768124c1b73ca0efc70a5765dea\n\nmeshio_output_xdmf=<pyiron_base.project.delayed.DelayedObject object at 0x7470340b41d0>\n\n\n\nmeshio_output_xdmf_fc75e768124c1b73ca0efc70a5765dea->poisson_output_pvd_file_08c5d21e2c998fd513709b7a059c6649\n\n\n\n\n\npoisson_output_vtu_file_62144723b416cb6b52989d18b3dec55b\n\npoisson_output_vtu_file=<pyiron_base.project.delayed.DelayedObject object at 0x74704c5960c0>\n\n\n\nmeshio_output_xdmf_fc75e768124c1b73ca0efc70a5765dea->poisson_output_vtu_file_62144723b416cb6b52989d18b3dec55b\n\n\n\n\n\nndofs_c3811e53ce75b5460d97029d314439b5\n\nndofs=<pyiron_base.project.delayed.DelayedObject object at 0x747041dd9310>\n\n\n\nmeshio_output_xdmf_fc75e768124c1b73ca0efc70a5765dea->ndofs_c3811e53ce75b5460d97029d314439b5\n\n\n\n\n\npoisson_output_vtu_file_62144723b416cb6b52989d18b3dec55b->pvbatch_output_file_5f8f87a5c4f1bd1a4b6cca85a1fc2b78\n\n\n\n\n\npoisson_output_vtu_file_62144723b416cb6b52989d18b3dec55b->plot_file_5f8f87a5c4f1bd1a4b6cca85a1fc2b78\n\n\n\n\n\nndofs_c3811e53ce75b5460d97029d314439b5->macros_tex_c5f640fc7b11414962941f82a40a8b04\n\n\n\n\n\ngmsh_output_file_950b49ac6562a70cf11f14756f9831ea\n\ngmsh_output_file=<pyiron_base.project.delayed.DelayedObject object at 0x746ea8314fb0>\n\n\n\ngmsh_output_file_950b49ac6562a70cf11f14756f9831ea->meshio_output_xdmf_fc75e768124c1b73ca0efc70a5765dea\n\n\n\n\n\nmeshio_output_h5_efe999f964b5fb7603bd642abcd8905d\n\nmeshio_output_h5=<pyiron_base.project.delayed.DelayedObject object at 0x746ea6f35d30>\n\n\n\ngmsh_output_file_950b49ac6562a70cf11f14756f9831ea->meshio_output_h5_efe999f964b5fb7603bd642abcd8905d\n\n\n\n\n\nmeshio_output_h5_efe999f964b5fb7603bd642abcd8905d->poisson_output_pvd_file_08c5d21e2c998fd513709b7a059c6649\n\n\n\n\n\nmeshio_output_h5_efe999f964b5fb7603bd642abcd8905d->poisson_output_vtu_file_62144723b416cb6b52989d18b3dec55b\n\n\n\n\n\nmeshio_output_h5_efe999f964b5fb7603bd642abcd8905d->ndofs_c3811e53ce75b5460d97029d314439b5\n\n\n\n\n\ndomain_size_f12a7f1986b9dd058dfc666dbe230b20\n\ndomain_size=2.0\n\n\n\ndomain_size_f12a7f1986b9dd058dfc666dbe230b20->macros_tex_c5f640fc7b11414962941f82a40a8b04\n\n\n\n\n\ndomain_size_f12a7f1986b9dd058dfc666dbe230b20->gmsh_output_file_950b49ac6562a70cf11f14756f9831ea\n\n\n\n\n" + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "create_function_job_69b38eef29d5c9aba4c6de512da1bb24\n", + "\n", + "create_function_job=<pyiron_base.project.delayed.DelayedObject object at 0x7470370855e0>\n", + "\n", + "\n", + "\n", + "macros_tex_c5f640fc7b11414962941f82a40a8b04\n", + "\n", + "macros_tex=<pyiron_base.project.delayed.DelayedObject object at 0x747042cb6ed0>\n", + "\n", + "\n", + "\n", + "macros_tex_c5f640fc7b11414962941f82a40a8b04->create_function_job_69b38eef29d5c9aba4c6de512da1bb24\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "pvbatch_output_file_5f8f87a5c4f1bd1a4b6cca85a1fc2b78\n", + "\n", + "pvbatch_output_file=<pyiron_base.project.delayed.DelayedObject object at 0x747041dd8c20>\n", + "\n", + "\n", + "\n", + "pvbatch_output_file_5f8f87a5c4f1bd1a4b6cca85a1fc2b78->macros_tex_c5f640fc7b11414962941f82a40a8b04\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "poisson_output_pvd_file_08c5d21e2c998fd513709b7a059c6649\n", + "\n", + "poisson_output_pvd_file=<pyiron_base.project.delayed.DelayedObject object at 0x74704c596180>\n", + "\n", + "\n", + "\n", + "poisson_output_pvd_file_08c5d21e2c998fd513709b7a059c6649->pvbatch_output_file_5f8f87a5c4f1bd1a4b6cca85a1fc2b78\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "plot_file_5f8f87a5c4f1bd1a4b6cca85a1fc2b78\n", + "\n", + "plot_file=<pyiron_base.project.delayed.DelayedObject object at 0x747041dd8c20>\n", + "\n", + "\n", + "\n", + "poisson_output_pvd_file_08c5d21e2c998fd513709b7a059c6649->plot_file_5f8f87a5c4f1bd1a4b6cca85a1fc2b78\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "plot_file_5f8f87a5c4f1bd1a4b6cca85a1fc2b78->create_function_job_69b38eef29d5c9aba4c6de512da1bb24\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "meshio_output_xdmf_fc75e768124c1b73ca0efc70a5765dea\n", + "\n", + "meshio_output_xdmf=<pyiron_base.project.delayed.DelayedObject object at 0x7470340b41d0>\n", + "\n", + "\n", + "\n", + "meshio_output_xdmf_fc75e768124c1b73ca0efc70a5765dea->poisson_output_pvd_file_08c5d21e2c998fd513709b7a059c6649\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "poisson_output_vtu_file_62144723b416cb6b52989d18b3dec55b\n", + "\n", + "poisson_output_vtu_file=<pyiron_base.project.delayed.DelayedObject object at 0x74704c5960c0>\n", + "\n", + "\n", + "\n", + "meshio_output_xdmf_fc75e768124c1b73ca0efc70a5765dea->poisson_output_vtu_file_62144723b416cb6b52989d18b3dec55b\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "ndofs_c3811e53ce75b5460d97029d314439b5\n", + "\n", + "ndofs=<pyiron_base.project.delayed.DelayedObject object at 0x747041dd9310>\n", + "\n", + "\n", + "\n", + "meshio_output_xdmf_fc75e768124c1b73ca0efc70a5765dea->ndofs_c3811e53ce75b5460d97029d314439b5\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "poisson_output_vtu_file_62144723b416cb6b52989d18b3dec55b->pvbatch_output_file_5f8f87a5c4f1bd1a4b6cca85a1fc2b78\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "poisson_output_vtu_file_62144723b416cb6b52989d18b3dec55b->plot_file_5f8f87a5c4f1bd1a4b6cca85a1fc2b78\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "ndofs_c3811e53ce75b5460d97029d314439b5->macros_tex_c5f640fc7b11414962941f82a40a8b04\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "gmsh_output_file_950b49ac6562a70cf11f14756f9831ea\n", + "\n", + "gmsh_output_file=<pyiron_base.project.delayed.DelayedObject object at 0x746ea8314fb0>\n", + "\n", + "\n", + "\n", + "gmsh_output_file_950b49ac6562a70cf11f14756f9831ea->meshio_output_xdmf_fc75e768124c1b73ca0efc70a5765dea\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "meshio_output_h5_efe999f964b5fb7603bd642abcd8905d\n", + "\n", + "meshio_output_h5=<pyiron_base.project.delayed.DelayedObject object at 0x746ea6f35d30>\n", + "\n", + "\n", + "\n", + "gmsh_output_file_950b49ac6562a70cf11f14756f9831ea->meshio_output_h5_efe999f964b5fb7603bd642abcd8905d\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "meshio_output_h5_efe999f964b5fb7603bd642abcd8905d->poisson_output_pvd_file_08c5d21e2c998fd513709b7a059c6649\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "meshio_output_h5_efe999f964b5fb7603bd642abcd8905d->poisson_output_vtu_file_62144723b416cb6b52989d18b3dec55b\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "meshio_output_h5_efe999f964b5fb7603bd642abcd8905d->ndofs_c3811e53ce75b5460d97029d314439b5\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "domain_size_f12a7f1986b9dd058dfc666dbe230b20\n", + "\n", + "domain_size=2.0\n", + "\n", + "\n", + "\n", + "domain_size_f12a7f1986b9dd058dfc666dbe230b20->macros_tex_c5f640fc7b11414962941f82a40a8b04\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "domain_size_f12a7f1986b9dd058dfc666dbe230b20->gmsh_output_file_950b49ac6562a70cf11f14756f9831ea\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] }, - "metadata": {} + "metadata": {}, + "output_type": "display_data" } ], - "execution_count": 21 + "source": [ + "delayed_object_lst = load_workflow_json(file_name=workflow_json_filename)\n", + "delayed_object_lst[-1].draw()" + ] }, { - "id": "1c2760b6-96b4-4f44-ac49-a229d4a0cf67", "cell_type": "code", - "source": "delayed_object_lst[-1].pull()", + "execution_count": 22, + "id": "1c2760b6-96b4-4f44-ac49-a229d4a0cf67", "metadata": { "trusted": true }, @@ -346,18 +772,50 @@ { "name": "stdout", "output_type": "stream", - "text": "The job generate_mesh_0b48cf5155cd6802c17d20bb58104132 was saved and received the ID: 1\nThe job convert_to_xdmf_29ad6ec6927268429dc9aef8166fde43 was saved and received the ID: 2\nThe job poisson_a0224b23ceb2119d105a5d98ef37f93e was saved and received the ID: 3\nThe job plot_over_line_82b37a42e0747f11d9a7f6318f63ac6b was saved and received the ID: 4\nThe job substitute_macros_874fc185ecec04b4cb9537c58b7efb7b was saved and received the ID: 5\nThe job compile_paper_3cee534ffe692833d37faf1fd2170cb6 was saved and received the ID: 6\n" + "text": [ + "The job generate_mesh_0b48cf5155cd6802c17d20bb58104132 was saved and received the ID: 1\n", + "The job convert_to_xdmf_29ad6ec6927268429dc9aef8166fde43 was saved and received the ID: 2\n", + "The job poisson_a0224b23ceb2119d105a5d98ef37f93e was saved and received the ID: 3\n", + "The job plot_over_line_82b37a42e0747f11d9a7f6318f63ac6b was saved and received the ID: 4\n", + "The job substitute_macros_874fc185ecec04b4cb9537c58b7efb7b was saved and received the ID: 5\n", + "The job compile_paper_3cee534ffe692833d37faf1fd2170cb6 was saved and received the ID: 6\n" + ] }, { - "execution_count": 22, - "output_type": "execute_result", "data": { - "text/plain": "'/home/jovyan/postprocessing/paper.pdf'" + "text/plain": [ + "'/home/jovyan/postprocessing/paper.pdf'" + ] }, - "metadata": {} + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" } ], - "execution_count": 22 + "source": [ + "delayed_object_lst[-1].pull()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "ADIS", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" } - ] + }, + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/example_workflows/quantum_espresso/aiida.ipynb b/example_workflows/quantum_espresso/aiida.ipynb index 8e4abce..925b7e4 100644 --- a/example_workflows/quantum_espresso/aiida.ipynb +++ b/example_workflows/quantum_espresso/aiida.ipynb @@ -1,59 +1,54 @@ { - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.8" - } - }, - "nbformat_minor": 4, - "nbformat": 4, "cells": [ { "cell_type": "markdown", - "source": "# Aiida", - "metadata": {} + "metadata": {}, + "source": [ + "# Aiida" + ] }, { "cell_type": "markdown", - "source": "## Define workflow with aiida", - "metadata": {} + "metadata": {}, + "source": [ + "## Define workflow with aiida" + ] }, { "cell_type": "code", - "source": "from python_workflow_definition.aiida import write_workflow_json\nfrom python_workflow_definition.shared import get_dict, get_list\n\nfrom aiida import load_profile, orm\n\nload_profile()\n\nworkflow_json_filename = \"aiida_qe.json\"", + "execution_count": 15, "metadata": { "trusted": true }, "outputs": [], - "execution_count": 1 + "source": [ + "from rich.pretty import pprint\n", + "from python_workflow_definition.aiida import AiidaPwdConverter\n", + "from python_workflow_definition.shared import get_dict, get_list\n", + "\n", + "from aiida import load_profile, orm\n", + "\n", + "load_profile()\n", + "\n", + "workflow_json_filename = \"aiida_qe.json\"" + ] }, { "cell_type": "code", - "source": "from aiida_workgraph import task, WorkGraph", + "execution_count": 2, "metadata": { "trusted": true }, "outputs": [], - "execution_count": 2 + "source": [ + "from aiida_workgraph import task, WorkGraph" + ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": 3, + "metadata": {}, "outputs": [], - "execution_count": null, "source": [ "from workflow import (\n", " generate_structures,\n", @@ -64,136 +59,499 @@ ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": 4, + "metadata": {}, "outputs": [], - "execution_count": null, - "source": "calculate_qe = task(outputs=[\"energy\", \"volume\", \"structure\"])(_calculate_qe)" + "source": [ + "calculate_qe = task(outputs=[\"energy\", \"volume\", \"structure\"])(_calculate_qe)" + ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": 5, + "metadata": {}, "outputs": [], - "execution_count": null, - "source": "wg = WorkGraph(\"wg-qe\")" + "source": [ + "wg = WorkGraph(\"wg-qe\")" + ] }, { "cell_type": "markdown", - "source": "### Prepare the inputs", - "metadata": {} + "metadata": {}, + "source": [ + "### Prepare the inputs" + ] }, { "cell_type": "code", - "source": "element = orm.Str(\"Al\")\na = orm.Float(4.04)\ncubic = orm.Bool(True)\nrelax_workdir = orm.Str(\"mini\")\npseudopotentials = orm.Dict({\"Al\": \"Al.pbe-n-kjpaw_psl.1.0.0.UPF\"})\nkpts = orm.List([3, 3, 3])\ncalc_type_relax = orm.Str(\"vc-relax\")\ncalc_type_scf = orm.Str(\"scf\")\nsmearing = orm.Float(0.02)\nstrain_lst = orm.List([0.9, 0.95, 1.0, 1.05, 1.1])", + "execution_count": 6, "metadata": { "trusted": true }, "outputs": [], - "execution_count": 6 + "source": [ + "element = orm.Str(\"Al\")\n", + "a = orm.Float(4.04)\n", + "cubic = orm.Bool(True)\n", + "relax_workdir = orm.Str(\"mini\")\n", + "pseudopotentials = orm.Dict({\"Al\": \"Al.pbe-n-kjpaw_psl.1.0.0.UPF\"})\n", + "kpts = orm.List([3, 3, 3])\n", + "calc_type_relax = orm.Str(\"vc-relax\")\n", + "calc_type_scf = orm.Str(\"scf\")\n", + "smearing = orm.Float(0.02)\n", + "strain_lst = orm.List([0.9, 0.95, 1.0, 1.05, 1.1])" + ] }, { "cell_type": "markdown", - "source": "### Actual tasks to construct the EOS workflow", - "metadata": {} + "metadata": {}, + "source": [ + "### Actual tasks to construct the EOS workflow" + ] }, { "cell_type": "code", - "source": "get_bulk_structure_task = wg.add_task(\n get_bulk_structure,\n name=\"get_bulk_structure\",\n element=element,\n a=a,\n cubic=cubic,\n)", + "execution_count": 7, "metadata": { "trusted": true }, "outputs": [], - "execution_count": 7 + "source": [ + "get_bulk_structure_task = wg.add_task(\n", + " get_bulk_structure,\n", + " name=\"get_bulk_structure\",\n", + " element=element,\n", + " a=a,\n", + " cubic=cubic,\n", + ")" + ] }, { "cell_type": "code", - "source": "relax_prepare_input_dict_task = wg.add_task(\n get_dict,\n name=\"relax_get_dict\",\n structure=get_bulk_structure_task.outputs.result,\n calculation=calc_type_relax,\n kpts=kpts,\n pseudopotentials=pseudopotentials,\n smearing=smearing,\n)\n\nrelax_task = wg.add_task(\n calculate_qe,\n name=\"mini\",\n input_dict=relax_prepare_input_dict_task.outputs.result,\n working_directory=relax_workdir,\n)", + "execution_count": 8, "metadata": { "trusted": true }, "outputs": [], - "execution_count": 8 + "source": [ + "relax_prepare_input_dict_task = wg.add_task(\n", + " get_dict,\n", + " name=\"relax_get_dict\",\n", + " structure=get_bulk_structure_task.outputs.result,\n", + " calculation=calc_type_relax,\n", + " kpts=kpts,\n", + " pseudopotentials=pseudopotentials,\n", + " smearing=smearing,\n", + ")\n", + "\n", + "relax_task = wg.add_task(\n", + " calculate_qe,\n", + " name=\"mini\",\n", + " input_dict=relax_prepare_input_dict_task.outputs.result,\n", + " working_directory=relax_workdir,\n", + ")" + ] }, { "cell_type": "code", - "source": "generate_structures_task = wg.add_task(\n generate_structures,\n name=\"generate_structures\",\n structure=relax_task.outputs.structure,\n strain_lst=strain_lst,\n)", + "execution_count": 9, "metadata": { "trusted": true }, "outputs": [], - "execution_count": 9 + "source": [ + "generate_structures_task = wg.add_task(\n", + " generate_structures,\n", + " name=\"generate_structures\",\n", + " structure=relax_task.outputs.structure,\n", + " strain_lst=strain_lst,\n", + ")" + ] }, { "cell_type": "code", - "source": "get_volumes_task = wg.add_task(get_list, name=\"get_volumes\")", + "execution_count": 10, "metadata": { "trusted": true }, "outputs": [], - "execution_count": 10 + "source": [ + "get_volumes_task = wg.add_task(get_list, name=\"get_volumes\")" + ] }, { "cell_type": "code", - "source": "get_energies_task = wg.add_task(get_list, name=\"get_energies\")", + "execution_count": 11, "metadata": { "trusted": true }, "outputs": [], - "execution_count": 11 + "source": [ + "get_energies_task = wg.add_task(get_list, name=\"get_energies\")" + ] }, { "cell_type": "code", - "source": "strain_dir_tasks, scf_qe_tasks, scf_get_dict_tasks = [], [], []\n\nfor i, strain in enumerate(strain_lst):\n\n structure_key = f\"s_{i}\"\n strain_dir = orm.Str(f\"strain_{i}\")\n generate_structures_task.add_output(\"workgraph.any\", structure_key)\n\n scf_prepare_input_dict_task = wg.add_task(\n get_dict,\n name=f\"get_dict_{i}\",\n structure=generate_structures_task.outputs[structure_key],\n calculation=calc_type_scf,\n kpts=kpts,\n pseudopotentials=pseudopotentials,\n smearing=smearing,\n )\n\n scf_qe_task = wg.add_task(\n calculate_qe,\n name=f\"qe_{i}\",\n input_dict=scf_prepare_input_dict_task.outputs.result,\n working_directory=strain_dir,\n )\n\n # collect energy and volume\n get_energies_task.set({f\"{i}\": scf_qe_task.outputs.energy})\n get_volumes_task.set({f\"{i}\": scf_qe_task.outputs.volume})", + "execution_count": 12, "metadata": { "trusted": true }, "outputs": [], - "execution_count": 12 + "source": [ + "strain_dir_tasks, scf_qe_tasks, scf_get_dict_tasks = [], [], []\n", + "\n", + "for i, strain in enumerate(strain_lst):\n", + "\n", + " structure_key = f\"s_{i}\"\n", + " strain_dir = orm.Str(f\"strain_{i}\")\n", + " generate_structures_task.add_output(\"workgraph.any\", structure_key)\n", + "\n", + " scf_prepare_input_dict_task = wg.add_task(\n", + " get_dict,\n", + " name=f\"get_dict_{i}\",\n", + " structure=generate_structures_task.outputs[structure_key],\n", + " calculation=calc_type_scf,\n", + " kpts=kpts,\n", + " pseudopotentials=pseudopotentials,\n", + " smearing=smearing,\n", + " )\n", + "\n", + " scf_qe_task = wg.add_task(\n", + " calculate_qe,\n", + " name=f\"qe_{i}\",\n", + " input_dict=scf_prepare_input_dict_task.outputs.result,\n", + " working_directory=strain_dir,\n", + " )\n", + "\n", + " # collect energy and volume\n", + " get_energies_task.set({f\"{i}\": scf_qe_task.outputs.energy})\n", + " get_volumes_task.set({f\"{i}\": scf_qe_task.outputs.volume})" + ] }, { "cell_type": "code", - "source": "plot_energy_volume_curve_task = wg.add_task(\n plot_energy_volume_curve,\n name=\"plot_energy_volume_curve\",\n volume_lst=get_volumes_task.outputs.result,\n energy_lst=get_energies_task.outputs.result,\n)", + "execution_count": 13, "metadata": { "trusted": true }, "outputs": [], - "execution_count": 13 + "source": [ + "plot_energy_volume_curve_task = wg.add_task(\n", + " plot_energy_volume_curve,\n", + " name=\"plot_energy_volume_curve\",\n", + " volume_lst=get_volumes_task.outputs.result,\n", + " energy_lst=get_energies_task.outputs.result,\n", + ")" + ] }, { "cell_type": "code", - "source": "wg", + "execution_count": 14, "metadata": { "trusted": true }, "outputs": [ { - "execution_count": 14, - "output_type": "execute_result", "data": { - "text/plain": "NodeGraphWidget(settings={'minimap': True}, style={'width': '90%', 'height': '600px'}, value={'name': 'wg-qe',…", "application/vnd.jupyter.widget-view+json": { + "model_id": "079f79168dac4f2fb2669a950175258a", "version_major": 2, - "version_minor": 1, - "model_id": "a44258c4d19f490bb7e35a61d721b97c" - } + "version_minor": 1 + }, + "text/plain": [ + "NodeGraphWidget(settings={'minimap': True}, style={'width': '90%', 'height': '600px'}, value={'name': 'wg-qe',…" + ] }, - "metadata": {} + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" } ], - "execution_count": 14 + "source": [ + "wg" + ] }, { "cell_type": "code", - "source": "_ = write_workflow_json(wg=wg, file_name=workflow_json_filename)\n", + "execution_count": 16, "metadata": { "trusted": true }, - "outputs": [], - "execution_count": 15 + "outputs": [ + { + "data": { + "text/html": [ + "
{\n",
+       "'nodes': [\n",
+       "│   │   {'id': 0, 'type': 'function', 'value': 'workflow.get_bulk_structure', 'name': 'get_bulk_structure'},\n",
+       "│   │   {'id': 1, 'type': 'function', 'value': 'python_workflow_definition.shared.get_dict', 'name': 'get_dict'},\n",
+       "│   │   {'id': 2, 'type': 'function', 'value': 'workflow.calculate_qe', 'name': 'calculate_qe'},\n",
+       "│   │   {'id': 3, 'type': 'function', 'value': 'workflow.generate_structures', 'name': 'generate_structures'},\n",
+       "│   │   {'id': 4, 'type': 'function', 'value': 'python_workflow_definition.shared.get_list', 'name': 'get_list'},\n",
+       "│   │   {'id': 5, 'type': 'function', 'value': 'python_workflow_definition.shared.get_list', 'name': 'get_list'},\n",
+       "│   │   {'id': 6, 'type': 'function', 'value': 'python_workflow_definition.shared.get_dict', 'name': 'get_dict'},\n",
+       "│   │   {'id': 7, 'type': 'function', 'value': 'workflow.calculate_qe', 'name': 'calculate_qe'},\n",
+       "│   │   {'id': 8, 'type': 'function', 'value': 'python_workflow_definition.shared.get_dict', 'name': 'get_dict'},\n",
+       "│   │   {'id': 9, 'type': 'function', 'value': 'workflow.calculate_qe', 'name': 'calculate_qe'},\n",
+       "│   │   {'id': 10, 'type': 'function', 'value': 'python_workflow_definition.shared.get_dict', 'name': 'get_dict'},\n",
+       "│   │   {'id': 11, 'type': 'function', 'value': 'workflow.calculate_qe', 'name': 'calculate_qe'},\n",
+       "│   │   {'id': 12, 'type': 'function', 'value': 'python_workflow_definition.shared.get_dict', 'name': 'get_dict'},\n",
+       "│   │   {'id': 13, 'type': 'function', 'value': 'workflow.calculate_qe', 'name': 'calculate_qe'},\n",
+       "│   │   {'id': 14, 'type': 'function', 'value': 'python_workflow_definition.shared.get_dict', 'name': 'get_dict'},\n",
+       "│   │   {'id': 15, 'type': 'function', 'value': 'workflow.calculate_qe', 'name': 'calculate_qe'},\n",
+       "│   │   {\n",
+       "│   │   │   'id': 16,\n",
+       "│   │   │   'type': 'function',\n",
+       "│   │   │   'value': 'workflow.plot_energy_volume_curve',\n",
+       "│   │   │   'name': 'plot_energy_volume_curve'\n",
+       "│   │   },\n",
+       "│   │   {'id': 17, 'type': 'input', 'name': 'element', 'value': 'Al'},\n",
+       "│   │   {'id': 18, 'type': 'input', 'name': 'a', 'value': 4.04},\n",
+       "│   │   {'id': 19, 'type': 'input', 'name': 'cubic', 'value': True},\n",
+       "│   │   {'id': 20, 'type': 'input', 'name': 'calculation', 'value': 'vc-relax'},\n",
+       "│   │   {'id': 21, 'type': 'input', 'name': 'kpts', 'value': [3, 3, 3]},\n",
+       "│   │   {\n",
+       "│   │   │   'id': 22,\n",
+       "│   │   │   'type': 'input',\n",
+       "│   │   │   'name': 'pseudopotentials',\n",
+       "│   │   │   'value': {'Al': 'Al.pbe-n-kjpaw_psl.1.0.0.UPF', 'node_type': 'data.core.dict.Dict.'}\n",
+       "│   │   },\n",
+       "│   │   {'id': 23, 'type': 'input', 'name': 'smearing', 'value': 0.02},\n",
+       "│   │   {'id': 24, 'type': 'input', 'name': 'working_directory', 'value': 'mini'},\n",
+       "│   │   {'id': 25, 'type': 'input', 'name': 'strain_lst', 'value': [0.9, 0.95, 1.0, 1.05, 1.1]},\n",
+       "│   │   {'id': 26, 'type': 'input', 'name': 'calculation', 'value': 'scf'},\n",
+       "│   │   {'id': 27, 'type': 'input', 'name': 'working_directory', 'value': 'strain_0'},\n",
+       "│   │   {'id': 28, 'type': 'input', 'name': 'working_directory', 'value': 'strain_1'},\n",
+       "│   │   {'id': 29, 'type': 'input', 'name': 'working_directory', 'value': 'strain_2'},\n",
+       "│   │   {'id': 30, 'type': 'input', 'name': 'working_directory', 'value': 'strain_3'},\n",
+       "│   │   {'id': 31, 'type': 'input', 'name': 'working_directory', 'value': 'strain_4'},\n",
+       "│   │   {'id': 32, 'type': 'output', 'name': 'energy', 'value': None},\n",
+       "│   │   {'id': 33, 'type': 'output', 'name': 'volume', 'value': None},\n",
+       "│   │   {'id': 34, 'type': 'output', 'name': 'result', 'value': None},\n",
+       "│   │   {'id': 35, 'type': 'output', 'name': 'structure', 'value': None},\n",
+       "│   │   {'id': 36, 'type': 'output', 'name': 'structure', 'value': None},\n",
+       "│   │   {'id': 37, 'type': 'output', 'name': 'structure', 'value': None},\n",
+       "│   │   {'id': 38, 'type': 'output', 'name': 'structure', 'value': None},\n",
+       "│   │   {'id': 39, 'type': 'output', 'name': 'structure', 'value': None},\n",
+       "│   │   {'id': 40, 'type': 'output', 'name': 'result', 'value': None}\n",
+       "],\n",
+       "'edges': [\n",
+       "│   │   {'target': 0, 'targetPort': 'element', 'source': 17, 'sourcePort': None},\n",
+       "│   │   {'target': 0, 'targetPort': 'a', 'source': 18, 'sourcePort': None},\n",
+       "│   │   {'target': 0, 'targetPort': 'cubic', 'source': 19, 'sourcePort': None},\n",
+       "│   │   {'target': 1, 'targetPort': 'calculation', 'source': 20, 'sourcePort': None},\n",
+       "│   │   {'target': 1, 'targetPort': 'kpts', 'source': 21, 'sourcePort': None},\n",
+       "│   │   {'target': 1, 'targetPort': 'pseudopotentials', 'source': 22, 'sourcePort': None},\n",
+       "│   │   {'target': 1, 'targetPort': 'smearing', 'source': 23, 'sourcePort': None},\n",
+       "│   │   {'target': 2, 'targetPort': 'working_directory', 'source': 24, 'sourcePort': None},\n",
+       "│   │   {'target': 3, 'targetPort': 'strain_lst', 'source': 25, 'sourcePort': None},\n",
+       "│   │   {'target': 6, 'targetPort': 'calculation', 'source': 26, 'sourcePort': None},\n",
+       "│   │   {'target': 6, 'targetPort': 'kpts', 'source': 21, 'sourcePort': None},\n",
+       "│   │   {'target': 6, 'targetPort': 'pseudopotentials', 'source': 22, 'sourcePort': None},\n",
+       "│   │   {'target': 6, 'targetPort': 'smearing', 'source': 23, 'sourcePort': None},\n",
+       "│   │   {'target': 7, 'targetPort': 'working_directory', 'source': 27, 'sourcePort': None},\n",
+       "│   │   {'target': 8, 'targetPort': 'calculation', 'source': 26, 'sourcePort': None},\n",
+       "│   │   {'target': 8, 'targetPort': 'kpts', 'source': 21, 'sourcePort': None},\n",
+       "│   │   {'target': 8, 'targetPort': 'pseudopotentials', 'source': 22, 'sourcePort': None},\n",
+       "│   │   {'target': 8, 'targetPort': 'smearing', 'source': 23, 'sourcePort': None},\n",
+       "│   │   {'target': 9, 'targetPort': 'working_directory', 'source': 28, 'sourcePort': None},\n",
+       "│   │   {'target': 10, 'targetPort': 'calculation', 'source': 26, 'sourcePort': None},\n",
+       "│   │   {'target': 10, 'targetPort': 'kpts', 'source': 21, 'sourcePort': None},\n",
+       "│   │   {'target': 10, 'targetPort': 'pseudopotentials', 'source': 22, 'sourcePort': None},\n",
+       "│   │   {'target': 10, 'targetPort': 'smearing', 'source': 23, 'sourcePort': None},\n",
+       "│   │   {'target': 11, 'targetPort': 'working_directory', 'source': 29, 'sourcePort': None},\n",
+       "│   │   {'target': 12, 'targetPort': 'calculation', 'source': 26, 'sourcePort': None},\n",
+       "│   │   {'target': 12, 'targetPort': 'kpts', 'source': 21, 'sourcePort': None},\n",
+       "│   │   {'target': 12, 'targetPort': 'pseudopotentials', 'source': 22, 'sourcePort': None},\n",
+       "│   │   {'target': 12, 'targetPort': 'smearing', 'source': 23, 'sourcePort': None},\n",
+       "│   │   {'target': 13, 'targetPort': 'working_directory', 'source': 30, 'sourcePort': None},\n",
+       "│   │   {'target': 14, 'targetPort': 'calculation', 'source': 26, 'sourcePort': None},\n",
+       "│   │   {'target': 14, 'targetPort': 'kpts', 'source': 21, 'sourcePort': None},\n",
+       "│   │   {'target': 14, 'targetPort': 'pseudopotentials', 'source': 22, 'sourcePort': None},\n",
+       "│   │   {'target': 14, 'targetPort': 'smearing', 'source': 23, 'sourcePort': None},\n",
+       "│   │   {'target': 15, 'targetPort': 'working_directory', 'source': 31, 'sourcePort': None},\n",
+       "│   │   {'target': 1, 'targetPort': 'structure', 'source': 0, 'sourcePort': None},\n",
+       "│   │   {'target': 2, 'targetPort': 'input_dict', 'source': 1, 'sourcePort': None},\n",
+       "│   │   {'target': 3, 'targetPort': 'structure', 'source': 2, 'sourcePort': 'structure'},\n",
+       "│   │   {'target': 6, 'targetPort': 'structure', 'source': 3, 'sourcePort': 's_0'},\n",
+       "│   │   {'target': 7, 'targetPort': 'input_dict', 'source': 6, 'sourcePort': None},\n",
+       "│   │   {'target': 5, 'targetPort': '0', 'source': 7, 'sourcePort': 'energy'},\n",
+       "│   │   {'target': 4, 'targetPort': '0', 'source': 7, 'sourcePort': 'volume'},\n",
+       "│   │   {'target': 8, 'targetPort': 'structure', 'source': 3, 'sourcePort': 's_1'},\n",
+       "│   │   {'target': 9, 'targetPort': 'input_dict', 'source': 8, 'sourcePort': None},\n",
+       "│   │   {'target': 5, 'targetPort': '1', 'source': 9, 'sourcePort': 'energy'},\n",
+       "│   │   {'target': 4, 'targetPort': '1', 'source': 9, 'sourcePort': 'volume'},\n",
+       "│   │   {'target': 10, 'targetPort': 'structure', 'source': 3, 'sourcePort': 's_2'},\n",
+       "│   │   {'target': 11, 'targetPort': 'input_dict', 'source': 10, 'sourcePort': None},\n",
+       "│   │   {'target': 5, 'targetPort': '2', 'source': 11, 'sourcePort': 'energy'},\n",
+       "│   │   {'target': 4, 'targetPort': '2', 'source': 11, 'sourcePort': 'volume'},\n",
+       "│   │   {'target': 12, 'targetPort': 'structure', 'source': 3, 'sourcePort': 's_3'},\n",
+       "│   │   {'target': 13, 'targetPort': 'input_dict', 'source': 12, 'sourcePort': None},\n",
+       "│   │   {'target': 5, 'targetPort': '3', 'source': 13, 'sourcePort': 'energy'},\n",
+       "│   │   {'target': 4, 'targetPort': '3', 'source': 13, 'sourcePort': 'volume'},\n",
+       "│   │   {'target': 14, 'targetPort': 'structure', 'source': 3, 'sourcePort': 's_4'},\n",
+       "│   │   {'target': 15, 'targetPort': 'input_dict', 'source': 14, 'sourcePort': None},\n",
+       "│   │   {'target': 5, 'targetPort': '4', 'source': 15, 'sourcePort': 'energy'},\n",
+       "│   │   {'target': 4, 'targetPort': '4', 'source': 15, 'sourcePort': 'volume'},\n",
+       "│   │   {'target': 16, 'targetPort': 'volume_lst', 'source': 4, 'sourcePort': None},\n",
+       "│   │   {'target': 16, 'targetPort': 'energy_lst', 'source': 5, 'sourcePort': None},\n",
+       "│   │   {'target': 32, 'targetPort': None, 'source': 2, 'sourcePort': 'energy'},\n",
+       "│   │   {'target': 33, 'targetPort': None, 'source': 2, 'sourcePort': 'volume'},\n",
+       "│   │   {'target': 34, 'targetPort': None, 'source': 3, 'sourcePort': None},\n",
+       "│   │   {'target': 35, 'targetPort': None, 'source': 7, 'sourcePort': 'structure'},\n",
+       "│   │   {'target': 36, 'targetPort': None, 'source': 9, 'sourcePort': 'structure'},\n",
+       "│   │   {'target': 37, 'targetPort': None, 'source': 11, 'sourcePort': 'structure'},\n",
+       "│   │   {'target': 38, 'targetPort': None, 'source': 13, 'sourcePort': 'structure'},\n",
+       "│   │   {'target': 39, 'targetPort': None, 'source': 15, 'sourcePort': 'structure'},\n",
+       "│   │   {'target': 40, 'targetPort': None, 'source': 16, 'sourcePort': None}\n",
+       "]\n",
+       "}\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m{\u001b[0m\n", + "\u001b[2;32m│ \u001b[0m\u001b[32m'nodes'\u001b[0m: \u001b[1m[\u001b[0m\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m0\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'function'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'workflow.get_bulk_structure'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'get_bulk_structure'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m1\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'function'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'python_workflow_definition.shared.get_dict'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'get_dict'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m2\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'function'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'workflow.calculate_qe'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'calculate_qe'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m3\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'function'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'workflow.generate_structures'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'generate_structures'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m4\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'function'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'python_workflow_definition.shared.get_list'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'get_list'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m5\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'function'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'python_workflow_definition.shared.get_list'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'get_list'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m6\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'function'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'python_workflow_definition.shared.get_dict'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'get_dict'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m7\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'function'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'workflow.calculate_qe'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'calculate_qe'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m8\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'function'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'python_workflow_definition.shared.get_dict'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'get_dict'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m9\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'function'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'workflow.calculate_qe'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'calculate_qe'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m10\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'function'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'python_workflow_definition.shared.get_dict'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'get_dict'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m11\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'function'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'workflow.calculate_qe'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'calculate_qe'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m12\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'function'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'python_workflow_definition.shared.get_dict'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'get_dict'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m13\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'function'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'workflow.calculate_qe'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'calculate_qe'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m14\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'function'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'python_workflow_definition.shared.get_dict'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'get_dict'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m15\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'function'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'workflow.calculate_qe'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'calculate_qe'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m16\u001b[0m,\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[32m'type'\u001b[0m: \u001b[32m'function'\u001b[0m,\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[32m'value'\u001b[0m: \u001b[32m'workflow.plot_energy_volume_curve'\u001b[0m,\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[32m'name'\u001b[0m: \u001b[32m'plot_energy_volume_curve'\u001b[0m\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m17\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'input'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'element'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'Al'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m18\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'input'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'a'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[1;36m4.04\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m19\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'input'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'cubic'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[3;92mTrue\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m20\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'input'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'calculation'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'vc-relax'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m21\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'input'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'kpts'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[1m[\u001b[0m\u001b[1;36m3\u001b[0m, \u001b[1;36m3\u001b[0m, \u001b[1;36m3\u001b[0m\u001b[1m]\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m22\u001b[0m,\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[32m'type'\u001b[0m: \u001b[32m'input'\u001b[0m,\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[32m'name'\u001b[0m: \u001b[32m'pseudopotentials'\u001b[0m,\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[32m'value'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'Al'\u001b[0m: \u001b[32m'Al.pbe-n-kjpaw_psl.1.0.0.UPF'\u001b[0m, \u001b[32m'node_type'\u001b[0m: \u001b[32m'data.core.dict.Dict.'\u001b[0m\u001b[1m}\u001b[0m\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m23\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'input'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'smearing'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[1;36m0.02\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m24\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'input'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'working_directory'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'mini'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m25\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'input'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'strain_lst'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[1m[\u001b[0m\u001b[1;36m0.9\u001b[0m, \u001b[1;36m0.95\u001b[0m, \u001b[1;36m1.0\u001b[0m, \u001b[1;36m1.05\u001b[0m, \u001b[1;36m1.1\u001b[0m\u001b[1m]\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m26\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'input'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'calculation'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'scf'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m27\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'input'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'working_directory'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'strain_0'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m28\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'input'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'working_directory'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'strain_1'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m29\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'input'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'working_directory'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'strain_2'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m30\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'input'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'working_directory'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'strain_3'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m31\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'input'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'working_directory'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[32m'strain_4'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m32\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'output'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'energy'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m33\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'output'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'volume'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m34\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'output'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'result'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m35\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'output'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'structure'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m36\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'output'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'structure'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m37\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'output'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'structure'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m38\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'output'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'structure'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m39\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'output'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'structure'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'id'\u001b[0m: \u001b[1;36m40\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'output'\u001b[0m, \u001b[32m'name'\u001b[0m: \u001b[32m'result'\u001b[0m, \u001b[32m'value'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m\n", + "\u001b[2;32m│ \u001b[0m\u001b[1m]\u001b[0m,\n", + "\u001b[2;32m│ \u001b[0m\u001b[32m'edges'\u001b[0m: \u001b[1m[\u001b[0m\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m0\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'element'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m17\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m0\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'a'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m18\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m0\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'cubic'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m19\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m1\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'calculation'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m20\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m1\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'kpts'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m21\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m1\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'pseudopotentials'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m22\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m1\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'smearing'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m23\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m2\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'working_directory'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m24\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m3\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'strain_lst'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m25\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m6\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'calculation'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m26\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m6\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'kpts'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m21\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m6\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'pseudopotentials'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m22\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m6\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'smearing'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m23\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m7\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'working_directory'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m27\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m8\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'calculation'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m26\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m8\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'kpts'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m21\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m8\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'pseudopotentials'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m22\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m8\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'smearing'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m23\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m9\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'working_directory'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m28\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m10\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'calculation'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m26\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m10\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'kpts'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m21\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m10\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'pseudopotentials'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m22\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m10\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'smearing'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m23\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m11\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'working_directory'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m29\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m12\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'calculation'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m26\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m12\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'kpts'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m21\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m12\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'pseudopotentials'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m22\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m12\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'smearing'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m23\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m13\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'working_directory'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m30\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m14\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'calculation'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m26\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m14\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'kpts'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m21\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m14\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'pseudopotentials'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m22\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m14\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'smearing'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m23\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m15\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'working_directory'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m31\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m1\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'structure'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m0\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m2\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'input_dict'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m1\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m3\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'structure'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m2\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m'structure'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m6\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'structure'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m3\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m's_0'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m7\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'input_dict'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m6\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m5\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'0'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m7\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m'energy'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m4\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'0'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m7\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m'volume'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m8\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'structure'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m3\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m's_1'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m9\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'input_dict'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m8\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m5\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'1'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m9\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m'energy'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m4\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'1'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m9\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m'volume'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m10\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'structure'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m3\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m's_2'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m11\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'input_dict'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m10\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m5\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'2'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m11\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m'energy'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m4\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'2'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m11\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m'volume'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m12\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'structure'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m3\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m's_3'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m13\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'input_dict'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m12\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m5\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'3'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m13\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m'energy'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m4\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'3'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m13\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m'volume'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m14\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'structure'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m3\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m's_4'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m15\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'input_dict'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m14\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m5\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'4'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m15\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m'energy'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m4\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'4'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m15\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m'volume'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m16\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'volume_lst'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m4\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m16\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[32m'energy_lst'\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m5\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m32\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[3;35mNone\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m2\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m'energy'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m33\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[3;35mNone\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m2\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m'volume'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m34\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[3;35mNone\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m3\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m35\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[3;35mNone\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m7\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m'structure'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m36\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[3;35mNone\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m9\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m'structure'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m37\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[3;35mNone\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m11\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m'structure'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m38\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[3;35mNone\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m13\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m'structure'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m39\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[3;35mNone\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m15\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[32m'structure'\u001b[0m\u001b[1m}\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m{\u001b[0m\u001b[32m'target'\u001b[0m: \u001b[1;36m40\u001b[0m, \u001b[32m'targetPort'\u001b[0m: \u001b[3;35mNone\u001b[0m, \u001b[32m'source'\u001b[0m: \u001b[1;36m16\u001b[0m, \u001b[32m'sourcePort'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m\n", + "\u001b[2;32m│ \u001b[0m\u001b[1m]\u001b[0m\n", + "\u001b[1m}\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "aiida_converter = AiidaPwdConverter()\n", + "model = aiida_converter.workgraph_to_model(wg=wg)\n", + "pprint(model.model_dump())\n", + "# _ = write_workflow_json(wg=wg, file_name=workflow_json_filename)\n" + ] }, { "cell_type": "code", - "source": "!cat {workflow_json_filename}", + "execution_count": 16, "metadata": { "trusted": true }, @@ -201,19 +559,524 @@ { "name": "stdout", "output_type": "stream", - "text": "{\n \"nodes\": [\n {\n \"id\": 0,\n \"function\": \"quantum_espresso_workflow.get_bulk_structure\"\n },\n {\n \"id\": 1,\n \"function\": \"python_workflow_definition.shared.get_dict\"\n },\n {\n \"id\": 2,\n \"function\": \"quantum_espresso_workflow.calculate_qe\"\n },\n {\n \"id\": 3,\n \"function\": \"quantum_espresso_workflow.generate_structures\"\n },\n {\n \"id\": 4,\n \"function\": \"python_workflow_definition.shared.get_list\"\n },\n {\n \"id\": 5,\n \"function\": \"python_workflow_definition.shared.get_list\"\n },\n {\n \"id\": 6,\n \"function\": \"python_workflow_definition.shared.get_dict\"\n },\n {\n \"id\": 7,\n \"function\": \"quantum_espresso_workflow.calculate_qe\"\n },\n {\n \"id\": 8,\n \"function\": \"python_workflow_definition.shared.get_dict\"\n },\n {\n \"id\": 9,\n \"function\": \"quantum_espresso_workflow.calculate_qe\"\n },\n {\n \"id\": 10,\n \"function\": \"python_workflow_definition.shared.get_dict\"\n },\n {\n \"id\": 11,\n \"function\": \"quantum_espresso_workflow.calculate_qe\"\n },\n {\n \"id\": 12,\n \"function\": \"python_workflow_definition.shared.get_dict\"\n },\n {\n \"id\": 13,\n \"function\": \"quantum_espresso_workflow.calculate_qe\"\n },\n {\n \"id\": 14,\n \"function\": \"python_workflow_definition.shared.get_dict\"\n },\n {\n \"id\": 15,\n \"function\": \"quantum_espresso_workflow.calculate_qe\"\n },\n {\n \"id\": 16,\n \"function\": \"quantum_espresso_workflow.plot_energy_volume_curve\"\n },\n {\n \"id\": 17,\n \"value\": \"Al\"\n },\n {\n \"id\": 18,\n \"value\": 4.04\n },\n {\n \"id\": 19,\n \"value\": true\n },\n {\n \"id\": 20,\n \"value\": \"vc-relax\"\n },\n {\n \"id\": 21,\n \"value\": [\n 3,\n 3,\n 3\n ]\n },\n {\n \"id\": 22,\n \"value\": {\n \"Al\": \"Al.pbe-n-kjpaw_psl.1.0.0.UPF\"\n }\n },\n {\n \"id\": 23,\n \"value\": 0.02\n },\n {\n \"id\": 24,\n \"value\": \"mini\"\n },\n {\n \"id\": 25,\n \"value\": [\n 0.9,\n 0.95,\n 1.0,\n 1.05,\n 1.1\n ]\n },\n {\n \"id\": 26,\n \"value\": \"scf\"\n },\n {\n \"id\": 27,\n \"value\": \"strain_0\"\n },\n {\n \"id\": 28,\n \"value\": \"strain_1\"\n },\n {\n \"id\": 29,\n \"value\": \"strain_2\"\n },\n {\n \"id\": 30,\n \"value\": \"strain_3\"\n },\n {\n \"id\": 31,\n \"value\": \"strain_4\"\n }\n ],\n \"edges\": [\n {\n \"target\": 1,\n \"targetPort\": \"structure\",\n \"source\": 0,\n \"sourcePort\": null\n },\n {\n \"target\": 2,\n \"targetPort\": \"input_dict\",\n \"source\": 1,\n \"sourcePort\": null\n },\n {\n \"target\": 3,\n \"targetPort\": \"structure\",\n \"source\": 2,\n \"sourcePort\": \"structure\"\n },\n {\n \"target\": 6,\n \"targetPort\": \"structure\",\n \"source\": 3,\n \"sourcePort\": \"s_0\"\n },\n {\n \"target\": 7,\n \"targetPort\": \"input_dict\",\n \"source\": 6,\n \"sourcePort\": null\n },\n {\n \"target\": 5,\n \"targetPort\": \"0\",\n \"source\": 7,\n \"sourcePort\": \"energy\"\n },\n {\n \"target\": 4,\n \"targetPort\": \"0\",\n \"source\": 7,\n \"sourcePort\": \"volume\"\n },\n {\n \"target\": 8,\n \"targetPort\": \"structure\",\n \"source\": 3,\n \"sourcePort\": \"s_1\"\n },\n {\n \"target\": 9,\n \"targetPort\": \"input_dict\",\n \"source\": 8,\n \"sourcePort\": null\n },\n {\n \"target\": 5,\n \"targetPort\": \"1\",\n \"source\": 9,\n \"sourcePort\": \"energy\"\n },\n {\n \"target\": 4,\n \"targetPort\": \"1\",\n \"source\": 9,\n \"sourcePort\": \"volume\"\n },\n {\n \"target\": 10,\n \"targetPort\": \"structure\",\n \"source\": 3,\n \"sourcePort\": \"s_2\"\n },\n {\n \"target\": 11,\n \"targetPort\": \"input_dict\",\n \"source\": 10,\n \"sourcePort\": null\n },\n {\n \"target\": 5,\n \"targetPort\": \"2\",\n \"source\": 11,\n \"sourcePort\": \"energy\"\n },\n {\n \"target\": 4,\n \"targetPort\": \"2\",\n \"source\": 11,\n \"sourcePort\": \"volume\"\n },\n {\n \"target\": 12,\n \"targetPort\": \"structure\",\n \"source\": 3,\n \"sourcePort\": \"s_3\"\n },\n {\n \"target\": 13,\n \"targetPort\": \"input_dict\",\n \"source\": 12,\n \"sourcePort\": null\n },\n {\n \"target\": 5,\n \"targetPort\": \"3\",\n \"source\": 13,\n \"sourcePort\": \"energy\"\n },\n {\n \"target\": 4,\n \"targetPort\": \"3\",\n \"source\": 13,\n \"sourcePort\": \"volume\"\n },\n {\n \"target\": 14,\n \"targetPort\": \"structure\",\n \"source\": 3,\n \"sourcePort\": \"s_4\"\n },\n {\n \"target\": 15,\n \"targetPort\": \"input_dict\",\n \"source\": 14,\n \"sourcePort\": null\n },\n {\n \"target\": 5,\n \"targetPort\": \"4\",\n \"source\": 15,\n \"sourcePort\": \"energy\"\n },\n {\n \"target\": 4,\n \"targetPort\": \"4\",\n \"source\": 15,\n \"sourcePort\": \"volume\"\n },\n {\n \"target\": 16,\n \"targetPort\": \"volume_lst\",\n \"source\": 4,\n \"sourcePort\": null\n },\n {\n \"target\": 16,\n \"targetPort\": \"energy_lst\",\n \"source\": 5,\n \"sourcePort\": null\n },\n {\n \"target\": 0,\n \"targetPort\": \"element\",\n \"source\": 17,\n \"sourcePort\": null\n },\n {\n \"target\": 0,\n \"targetPort\": \"a\",\n \"source\": 18,\n \"sourcePort\": null\n },\n {\n \"target\": 0,\n \"targetPort\": \"cubic\",\n \"source\": 19,\n \"sourcePort\": null\n },\n {\n \"target\": 1,\n \"targetPort\": \"calculation\",\n \"source\": 20,\n \"sourcePort\": null\n },\n {\n \"target\": 1,\n \"targetPort\": \"kpts\",\n \"source\": 21,\n \"sourcePort\": null\n },\n {\n \"target\": 1,\n \"targetPort\": \"pseudopotentials\",\n \"source\": 22,\n \"sourcePort\": null\n },\n {\n \"target\": 1,\n \"targetPort\": \"smearing\",\n \"source\": 23,\n \"sourcePort\": null\n },\n {\n \"target\": 2,\n \"targetPort\": \"working_directory\",\n \"source\": 24,\n \"sourcePort\": null\n },\n {\n \"target\": 3,\n \"targetPort\": \"strain_lst\",\n \"source\": 25,\n \"sourcePort\": null\n },\n {\n \"target\": 6,\n \"targetPort\": \"calculation\",\n \"source\": 26,\n \"sourcePort\": null\n },\n {\n \"target\": 6,\n \"targetPort\": \"kpts\",\n \"source\": 21,\n \"sourcePort\": null\n },\n {\n \"target\": 6,\n \"targetPort\": \"pseudopotentials\",\n \"source\": 22,\n \"sourcePort\": null\n },\n {\n \"target\": 6,\n \"targetPort\": \"smearing\",\n \"source\": 23,\n \"sourcePort\": null\n },\n {\n \"target\": 7,\n \"targetPort\": \"working_directory\",\n \"source\": 27,\n \"sourcePort\": null\n },\n {\n \"target\": 8,\n \"targetPort\": \"calculation\",\n \"source\": 26,\n \"sourcePort\": null\n },\n {\n \"target\": 8,\n \"targetPort\": \"kpts\",\n \"source\": 21,\n \"sourcePort\": null\n },\n {\n \"target\": 8,\n \"targetPort\": \"pseudopotentials\",\n \"source\": 22,\n \"sourcePort\": null\n },\n {\n \"target\": 8,\n \"targetPort\": \"smearing\",\n \"source\": 23,\n \"sourcePort\": null\n },\n {\n \"target\": 9,\n \"targetPort\": \"working_directory\",\n \"source\": 28,\n \"sourcePort\": null\n },\n {\n \"target\": 10,\n \"targetPort\": \"calculation\",\n \"source\": 26,\n \"sourcePort\": null\n },\n {\n \"target\": 10,\n \"targetPort\": \"kpts\",\n \"source\": 21,\n \"sourcePort\": null\n },\n {\n \"target\": 10,\n \"targetPort\": \"pseudopotentials\",\n \"source\": 22,\n \"sourcePort\": null\n },\n {\n \"target\": 10,\n \"targetPort\": \"smearing\",\n \"source\": 23,\n \"sourcePort\": null\n },\n {\n \"target\": 11,\n \"targetPort\": \"working_directory\",\n \"source\": 29,\n \"sourcePort\": null\n },\n {\n \"target\": 12,\n \"targetPort\": \"calculation\",\n \"source\": 26,\n \"sourcePort\": null\n },\n {\n \"target\": 12,\n \"targetPort\": \"kpts\",\n \"source\": 21,\n \"sourcePort\": null\n },\n {\n \"target\": 12,\n \"targetPort\": \"pseudopotentials\",\n \"source\": 22,\n \"sourcePort\": null\n },\n {\n \"target\": 12,\n \"targetPort\": \"smearing\",\n \"source\": 23,\n \"sourcePort\": null\n },\n {\n \"target\": 13,\n \"targetPort\": \"working_directory\",\n \"source\": 30,\n \"sourcePort\": null\n },\n {\n \"target\": 14,\n \"targetPort\": \"calculation\",\n \"source\": 26,\n \"sourcePort\": null\n },\n {\n \"target\": 14,\n \"targetPort\": \"kpts\",\n \"source\": 21,\n \"sourcePort\": null\n },\n {\n \"target\": 14,\n \"targetPort\": \"pseudopotentials\",\n \"source\": 22,\n \"sourcePort\": null\n },\n {\n \"target\": 14,\n \"targetPort\": \"smearing\",\n \"source\": 23,\n \"sourcePort\": null\n },\n {\n \"target\": 15,\n \"targetPort\": \"working_directory\",\n \"source\": 31,\n \"sourcePort\": null\n }\n ]\n}" + "text": [ + "{\n", + " \"nodes\": [\n", + " {\n", + " \"id\": 0,\n", + " \"function\": \"quantum_espresso_workflow.get_bulk_structure\"\n", + " },\n", + " {\n", + " \"id\": 1,\n", + " \"function\": \"python_workflow_definition.shared.get_dict\"\n", + " },\n", + " {\n", + " \"id\": 2,\n", + " \"function\": \"quantum_espresso_workflow.calculate_qe\"\n", + " },\n", + " {\n", + " \"id\": 3,\n", + " \"function\": \"quantum_espresso_workflow.generate_structures\"\n", + " },\n", + " {\n", + " \"id\": 4,\n", + " \"function\": \"python_workflow_definition.shared.get_list\"\n", + " },\n", + " {\n", + " \"id\": 5,\n", + " \"function\": \"python_workflow_definition.shared.get_list\"\n", + " },\n", + " {\n", + " \"id\": 6,\n", + " \"function\": \"python_workflow_definition.shared.get_dict\"\n", + " },\n", + " {\n", + " \"id\": 7,\n", + " \"function\": \"quantum_espresso_workflow.calculate_qe\"\n", + " },\n", + " {\n", + " \"id\": 8,\n", + " \"function\": \"python_workflow_definition.shared.get_dict\"\n", + " },\n", + " {\n", + " \"id\": 9,\n", + " \"function\": \"quantum_espresso_workflow.calculate_qe\"\n", + " },\n", + " {\n", + " \"id\": 10,\n", + " \"function\": \"python_workflow_definition.shared.get_dict\"\n", + " },\n", + " {\n", + " \"id\": 11,\n", + " \"function\": \"quantum_espresso_workflow.calculate_qe\"\n", + " },\n", + " {\n", + " \"id\": 12,\n", + " \"function\": \"python_workflow_definition.shared.get_dict\"\n", + " },\n", + " {\n", + " \"id\": 13,\n", + " \"function\": \"quantum_espresso_workflow.calculate_qe\"\n", + " },\n", + " {\n", + " \"id\": 14,\n", + " \"function\": \"python_workflow_definition.shared.get_dict\"\n", + " },\n", + " {\n", + " \"id\": 15,\n", + " \"function\": \"quantum_espresso_workflow.calculate_qe\"\n", + " },\n", + " {\n", + " \"id\": 16,\n", + " \"function\": \"quantum_espresso_workflow.plot_energy_volume_curve\"\n", + " },\n", + " {\n", + " \"id\": 17,\n", + " \"value\": \"Al\"\n", + " },\n", + " {\n", + " \"id\": 18,\n", + " \"value\": 4.04\n", + " },\n", + " {\n", + " \"id\": 19,\n", + " \"value\": true\n", + " },\n", + " {\n", + " \"id\": 20,\n", + " \"value\": \"vc-relax\"\n", + " },\n", + " {\n", + " \"id\": 21,\n", + " \"value\": [\n", + " 3,\n", + " 3,\n", + " 3\n", + " ]\n", + " },\n", + " {\n", + " \"id\": 22,\n", + " \"value\": {\n", + " \"Al\": \"Al.pbe-n-kjpaw_psl.1.0.0.UPF\"\n", + " }\n", + " },\n", + " {\n", + " \"id\": 23,\n", + " \"value\": 0.02\n", + " },\n", + " {\n", + " \"id\": 24,\n", + " \"value\": \"mini\"\n", + " },\n", + " {\n", + " \"id\": 25,\n", + " \"value\": [\n", + " 0.9,\n", + " 0.95,\n", + " 1.0,\n", + " 1.05,\n", + " 1.1\n", + " ]\n", + " },\n", + " {\n", + " \"id\": 26,\n", + " \"value\": \"scf\"\n", + " },\n", + " {\n", + " \"id\": 27,\n", + " \"value\": \"strain_0\"\n", + " },\n", + " {\n", + " \"id\": 28,\n", + " \"value\": \"strain_1\"\n", + " },\n", + " {\n", + " \"id\": 29,\n", + " \"value\": \"strain_2\"\n", + " },\n", + " {\n", + " \"id\": 30,\n", + " \"value\": \"strain_3\"\n", + " },\n", + " {\n", + " \"id\": 31,\n", + " \"value\": \"strain_4\"\n", + " }\n", + " ],\n", + " \"edges\": [\n", + " {\n", + " \"target\": 1,\n", + " \"targetPort\": \"structure\",\n", + " \"source\": 0,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 2,\n", + " \"targetPort\": \"input_dict\",\n", + " \"source\": 1,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 3,\n", + " \"targetPort\": \"structure\",\n", + " \"source\": 2,\n", + " \"sourcePort\": \"structure\"\n", + " },\n", + " {\n", + " \"target\": 6,\n", + " \"targetPort\": \"structure\",\n", + " \"source\": 3,\n", + " \"sourcePort\": \"s_0\"\n", + " },\n", + " {\n", + " \"target\": 7,\n", + " \"targetPort\": \"input_dict\",\n", + " \"source\": 6,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 5,\n", + " \"targetPort\": \"0\",\n", + " \"source\": 7,\n", + " \"sourcePort\": \"energy\"\n", + " },\n", + " {\n", + " \"target\": 4,\n", + " \"targetPort\": \"0\",\n", + " \"source\": 7,\n", + " \"sourcePort\": \"volume\"\n", + " },\n", + " {\n", + " \"target\": 8,\n", + " \"targetPort\": \"structure\",\n", + " \"source\": 3,\n", + " \"sourcePort\": \"s_1\"\n", + " },\n", + " {\n", + " \"target\": 9,\n", + " \"targetPort\": \"input_dict\",\n", + " \"source\": 8,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 5,\n", + " \"targetPort\": \"1\",\n", + " \"source\": 9,\n", + " \"sourcePort\": \"energy\"\n", + " },\n", + " {\n", + " \"target\": 4,\n", + " \"targetPort\": \"1\",\n", + " \"source\": 9,\n", + " \"sourcePort\": \"volume\"\n", + " },\n", + " {\n", + " \"target\": 10,\n", + " \"targetPort\": \"structure\",\n", + " \"source\": 3,\n", + " \"sourcePort\": \"s_2\"\n", + " },\n", + " {\n", + " \"target\": 11,\n", + " \"targetPort\": \"input_dict\",\n", + " \"source\": 10,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 5,\n", + " \"targetPort\": \"2\",\n", + " \"source\": 11,\n", + " \"sourcePort\": \"energy\"\n", + " },\n", + " {\n", + " \"target\": 4,\n", + " \"targetPort\": \"2\",\n", + " \"source\": 11,\n", + " \"sourcePort\": \"volume\"\n", + " },\n", + " {\n", + " \"target\": 12,\n", + " \"targetPort\": \"structure\",\n", + " \"source\": 3,\n", + " \"sourcePort\": \"s_3\"\n", + " },\n", + " {\n", + " \"target\": 13,\n", + " \"targetPort\": \"input_dict\",\n", + " \"source\": 12,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 5,\n", + " \"targetPort\": \"3\",\n", + " \"source\": 13,\n", + " \"sourcePort\": \"energy\"\n", + " },\n", + " {\n", + " \"target\": 4,\n", + " \"targetPort\": \"3\",\n", + " \"source\": 13,\n", + " \"sourcePort\": \"volume\"\n", + " },\n", + " {\n", + " \"target\": 14,\n", + " \"targetPort\": \"structure\",\n", + " \"source\": 3,\n", + " \"sourcePort\": \"s_4\"\n", + " },\n", + " {\n", + " \"target\": 15,\n", + " \"targetPort\": \"input_dict\",\n", + " \"source\": 14,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 5,\n", + " \"targetPort\": \"4\",\n", + " \"source\": 15,\n", + " \"sourcePort\": \"energy\"\n", + " },\n", + " {\n", + " \"target\": 4,\n", + " \"targetPort\": \"4\",\n", + " \"source\": 15,\n", + " \"sourcePort\": \"volume\"\n", + " },\n", + " {\n", + " \"target\": 16,\n", + " \"targetPort\": \"volume_lst\",\n", + " \"source\": 4,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 16,\n", + " \"targetPort\": \"energy_lst\",\n", + " \"source\": 5,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 0,\n", + " \"targetPort\": \"element\",\n", + " \"source\": 17,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 0,\n", + " \"targetPort\": \"a\",\n", + " \"source\": 18,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 0,\n", + " \"targetPort\": \"cubic\",\n", + " \"source\": 19,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 1,\n", + " \"targetPort\": \"calculation\",\n", + " \"source\": 20,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 1,\n", + " \"targetPort\": \"kpts\",\n", + " \"source\": 21,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 1,\n", + " \"targetPort\": \"pseudopotentials\",\n", + " \"source\": 22,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 1,\n", + " \"targetPort\": \"smearing\",\n", + " \"source\": 23,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 2,\n", + " \"targetPort\": \"working_directory\",\n", + " \"source\": 24,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 3,\n", + " \"targetPort\": \"strain_lst\",\n", + " \"source\": 25,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 6,\n", + " \"targetPort\": \"calculation\",\n", + " \"source\": 26,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 6,\n", + " \"targetPort\": \"kpts\",\n", + " \"source\": 21,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 6,\n", + " \"targetPort\": \"pseudopotentials\",\n", + " \"source\": 22,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 6,\n", + " \"targetPort\": \"smearing\",\n", + " \"source\": 23,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 7,\n", + " \"targetPort\": \"working_directory\",\n", + " \"source\": 27,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 8,\n", + " \"targetPort\": \"calculation\",\n", + " \"source\": 26,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 8,\n", + " \"targetPort\": \"kpts\",\n", + " \"source\": 21,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 8,\n", + " \"targetPort\": \"pseudopotentials\",\n", + " \"source\": 22,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 8,\n", + " \"targetPort\": \"smearing\",\n", + " \"source\": 23,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 9,\n", + " \"targetPort\": \"working_directory\",\n", + " \"source\": 28,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 10,\n", + " \"targetPort\": \"calculation\",\n", + " \"source\": 26,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 10,\n", + " \"targetPort\": \"kpts\",\n", + " \"source\": 21,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 10,\n", + " \"targetPort\": \"pseudopotentials\",\n", + " \"source\": 22,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 10,\n", + " \"targetPort\": \"smearing\",\n", + " \"source\": 23,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 11,\n", + " \"targetPort\": \"working_directory\",\n", + " \"source\": 29,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 12,\n", + " \"targetPort\": \"calculation\",\n", + " \"source\": 26,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 12,\n", + " \"targetPort\": \"kpts\",\n", + " \"source\": 21,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 12,\n", + " \"targetPort\": \"pseudopotentials\",\n", + " \"source\": 22,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 12,\n", + " \"targetPort\": \"smearing\",\n", + " \"source\": 23,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 13,\n", + " \"targetPort\": \"working_directory\",\n", + " \"source\": 30,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 14,\n", + " \"targetPort\": \"calculation\",\n", + " \"source\": 26,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 14,\n", + " \"targetPort\": \"kpts\",\n", + " \"source\": 21,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 14,\n", + " \"targetPort\": \"pseudopotentials\",\n", + " \"source\": 22,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 14,\n", + " \"targetPort\": \"smearing\",\n", + " \"source\": 23,\n", + " \"sourcePort\": null\n", + " },\n", + " {\n", + " \"target\": 15,\n", + " \"targetPort\": \"working_directory\",\n", + " \"source\": 31,\n", + " \"sourcePort\": null\n", + " }\n", + " ]\n", + "}" + ] } ], - "execution_count": 16 + "source": [ + "!cat {workflow_json_filename}" + ] }, { "cell_type": "markdown", - "source": "## Load Workflow with jobflow", - "metadata": {} + "metadata": {}, + "source": [ + "## Load Workflow with jobflow" + ] }, { "cell_type": "code", - "source": "from python_workflow_definition.jobflow import load_workflow_json", + "execution_count": 17, "metadata": { "trusted": true }, @@ -221,41 +1084,54 @@ { "name": "stderr", "output_type": "stream", - "text": "/srv/conda/envs/notebook/lib/python3.12/site-packages/paramiko/pkey.py:82: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0.\n \"cipher\": algorithms.TripleDES,\n/srv/conda/envs/notebook/lib/python3.12/site-packages/paramiko/transport.py:253: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0.\n \"class\": algorithms.TripleDES,\n" + "text": [ + "/srv/conda/envs/notebook/lib/python3.12/site-packages/paramiko/pkey.py:82: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0.\n", + " \"cipher\": algorithms.TripleDES,\n", + "/srv/conda/envs/notebook/lib/python3.12/site-packages/paramiko/transport.py:253: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0.\n", + " \"class\": algorithms.TripleDES,\n" + ] } ], - "execution_count": 17 + "source": [ + "from python_workflow_definition.jobflow import load_workflow_json" + ] }, { "cell_type": "code", - "source": "from jobflow.managers.local import run_locally", + "execution_count": 18, "metadata": { "trusted": true }, "outputs": [], - "execution_count": 18 + "source": [ + "from jobflow.managers.local import run_locally" + ] }, { "cell_type": "code", - "source": "flow = load_workflow_json(file_name=workflow_json_filename)", + "execution_count": 19, "metadata": { "trusted": true }, "outputs": [], - "execution_count": 19 + "source": [ + "flow = load_workflow_json(file_name=workflow_json_filename)" + ] }, { "cell_type": "code", - "source": "flow[0].function_kwargs[\"a\"] = 4.05", + "execution_count": 20, "metadata": { "trusted": true }, "outputs": [], - "execution_count": 20 + "source": [ + "flow[0].function_kwargs[\"a\"] = 4.05" + ] }, { "cell_type": "code", - "source": "result = run_locally(flow)\nresult", + "execution_count": 21, "metadata": { "trusted": true }, @@ -263,141 +1139,952 @@ { "name": "stdout", "output_type": "stream", - "text": "2025-04-23 09:31:18,763 INFO Started executing jobs locally\n2025-04-23 09:31:19,023 INFO Starting job - get_bulk_structure (ceb203d4-4b50-4fbf-bd60-36680543382b)\n2025-04-23 09:31:19,030 INFO Finished job - get_bulk_structure (ceb203d4-4b50-4fbf-bd60-36680543382b)\n2025-04-23 09:31:19,031 INFO Starting job - get_dict (27f28719-6394-4a85-b93f-c8ece2feceaf)\n2025-04-23 09:31:19,034 INFO Finished job - get_dict (27f28719-6394-4a85-b93f-c8ece2feceaf)\n2025-04-23 09:31:19,035 INFO Starting job - calculate_qe (ae0b4b06-5734-41ea-a7cc-e8393ef01e55)\n" + "text": [ + "2025-04-23 09:31:18,763 INFO Started executing jobs locally\n", + "2025-04-23 09:31:19,023 INFO Starting job - get_bulk_structure (ceb203d4-4b50-4fbf-bd60-36680543382b)\n", + "2025-04-23 09:31:19,030 INFO Finished job - get_bulk_structure (ceb203d4-4b50-4fbf-bd60-36680543382b)\n", + "2025-04-23 09:31:19,031 INFO Starting job - get_dict (27f28719-6394-4a85-b93f-c8ece2feceaf)\n", + "2025-04-23 09:31:19,034 INFO Finished job - get_dict (27f28719-6394-4a85-b93f-c8ece2feceaf)\n", + "2025-04-23 09:31:19,035 INFO Starting job - calculate_qe (ae0b4b06-5734-41ea-a7cc-e8393ef01e55)\n" + ] }, { "name": "stderr", "output_type": "stream", - "text": "[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01795] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\nNote: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n" + "text": [ + "[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01795] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n", + "Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n" + ] }, { "name": "stdout", "output_type": "stream", - "text": "2025-04-23 09:32:12,183 INFO Finished job - calculate_qe (ae0b4b06-5734-41ea-a7cc-e8393ef01e55)\n2025-04-23 09:32:12,184 INFO Starting job - generate_structures (e9deb2a2-2e2a-4077-a221-a6afc9701377)\n2025-04-23 09:32:12,189 INFO Finished job - generate_structures (e9deb2a2-2e2a-4077-a221-a6afc9701377)\n2025-04-23 09:32:12,189 INFO Starting job - get_dict (9f4a0c82-798c-4178-9a46-c5430a2853c1)\n2025-04-23 09:32:12,190 INFO Finished job - get_dict (9f4a0c82-798c-4178-9a46-c5430a2853c1)\n2025-04-23 09:32:12,191 INFO Starting job - get_dict (8e10ca3a-91ba-4647-bca8-3c905020fb39)\n2025-04-23 09:32:12,192 INFO Finished job - get_dict (8e10ca3a-91ba-4647-bca8-3c905020fb39)\n2025-04-23 09:32:12,193 INFO Starting job - get_dict (765da827-3180-44d3-940e-e9d5a7e2ae45)\n2025-04-23 09:32:12,194 INFO Finished job - get_dict (765da827-3180-44d3-940e-e9d5a7e2ae45)\n2025-04-23 09:32:12,195 INFO Starting job - get_dict (5f8ce3d7-f65e-481d-8cb0-291d204df659)\n2025-04-23 09:32:12,196 INFO Finished job - get_dict (5f8ce3d7-f65e-481d-8cb0-291d204df659)\n2025-04-23 09:32:12,196 INFO Starting job - get_dict (12912688-d0c2-4053-80b2-a758b50ce86a)\n2025-04-23 09:32:12,208 INFO Finished job - get_dict (12912688-d0c2-4053-80b2-a758b50ce86a)\n2025-04-23 09:32:12,209 INFO Starting job - calculate_qe (282ce127-dc4e-4e2d-9769-c22bdcdf2e3f)\n" + "text": [ + "2025-04-23 09:32:12,183 INFO Finished job - calculate_qe (ae0b4b06-5734-41ea-a7cc-e8393ef01e55)\n", + "2025-04-23 09:32:12,184 INFO Starting job - generate_structures (e9deb2a2-2e2a-4077-a221-a6afc9701377)\n", + "2025-04-23 09:32:12,189 INFO Finished job - generate_structures (e9deb2a2-2e2a-4077-a221-a6afc9701377)\n", + "2025-04-23 09:32:12,189 INFO Starting job - get_dict (9f4a0c82-798c-4178-9a46-c5430a2853c1)\n", + "2025-04-23 09:32:12,190 INFO Finished job - get_dict (9f4a0c82-798c-4178-9a46-c5430a2853c1)\n", + "2025-04-23 09:32:12,191 INFO Starting job - get_dict (8e10ca3a-91ba-4647-bca8-3c905020fb39)\n", + "2025-04-23 09:32:12,192 INFO Finished job - get_dict (8e10ca3a-91ba-4647-bca8-3c905020fb39)\n", + "2025-04-23 09:32:12,193 INFO Starting job - get_dict (765da827-3180-44d3-940e-e9d5a7e2ae45)\n", + "2025-04-23 09:32:12,194 INFO Finished job - get_dict (765da827-3180-44d3-940e-e9d5a7e2ae45)\n", + "2025-04-23 09:32:12,195 INFO Starting job - get_dict (5f8ce3d7-f65e-481d-8cb0-291d204df659)\n", + "2025-04-23 09:32:12,196 INFO Finished job - get_dict (5f8ce3d7-f65e-481d-8cb0-291d204df659)\n", + "2025-04-23 09:32:12,196 INFO Starting job - get_dict (12912688-d0c2-4053-80b2-a758b50ce86a)\n", + "2025-04-23 09:32:12,208 INFO Finished job - get_dict (12912688-d0c2-4053-80b2-a758b50ce86a)\n", + "2025-04-23 09:32:12,209 INFO Starting job - calculate_qe (282ce127-dc4e-4e2d-9769-c22bdcdf2e3f)\n" + ] }, { "name": "stderr", "output_type": "stream", - "text": "[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01814] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n" + "text": [ + "[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01814] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n" + ] }, { "name": "stdout", "output_type": "stream", - "text": "2025-04-23 09:32:23,091 INFO Finished job - calculate_qe (282ce127-dc4e-4e2d-9769-c22bdcdf2e3f)\n2025-04-23 09:32:23,092 INFO Starting job - calculate_qe (76b1d287-fd0f-4fed-a0b7-cc817dffe2d8)\n" + "text": [ + "2025-04-23 09:32:23,091 INFO Finished job - calculate_qe (282ce127-dc4e-4e2d-9769-c22bdcdf2e3f)\n", + "2025-04-23 09:32:23,092 INFO Starting job - calculate_qe (76b1d287-fd0f-4fed-a0b7-cc817dffe2d8)\n" + ] }, { "name": "stderr", "output_type": "stream", - "text": "Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01825] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n" + "text": [ + "Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n", + "[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01825] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n" + ] }, { "name": "stdout", "output_type": "stream", - "text": "2025-04-23 09:32:34,038 INFO Finished job - calculate_qe (76b1d287-fd0f-4fed-a0b7-cc817dffe2d8)\n2025-04-23 09:32:34,038 INFO Starting job - calculate_qe (2c6bfb73-15c3-4be7-95ab-f9afbeaf53bc)\n" + "text": [ + "2025-04-23 09:32:34,038 INFO Finished job - calculate_qe (76b1d287-fd0f-4fed-a0b7-cc817dffe2d8)\n", + "2025-04-23 09:32:34,038 INFO Starting job - calculate_qe (2c6bfb73-15c3-4be7-95ab-f9afbeaf53bc)\n" + ] }, { "name": "stderr", "output_type": "stream", - "text": "Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01836] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n" + "text": [ + "Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n", + "[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01836] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n" + ] }, { "name": "stdout", "output_type": "stream", - "text": "2025-04-23 09:32:46,472 INFO Finished job - calculate_qe (2c6bfb73-15c3-4be7-95ab-f9afbeaf53bc)\n2025-04-23 09:32:46,473 INFO Starting job - calculate_qe (4f947882-06db-4296-8456-b12cff2e66e3)\n" + "text": [ + "2025-04-23 09:32:46,472 INFO Finished job - calculate_qe (2c6bfb73-15c3-4be7-95ab-f9afbeaf53bc)\n", + "2025-04-23 09:32:46,473 INFO Starting job - calculate_qe (4f947882-06db-4296-8456-b12cff2e66e3)\n" + ] }, { "name": "stderr", "output_type": "stream", - "text": "Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01847] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\nNote: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n" + "text": [ + "Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n", + "[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01847] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n", + "Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n" + ] }, { "name": "stdout", "output_type": "stream", - "text": "2025-04-23 09:33:00,409 INFO Finished job - calculate_qe (4f947882-06db-4296-8456-b12cff2e66e3)\n2025-04-23 09:33:00,410 INFO Starting job - calculate_qe (d7bd31df-d3a7-49a1-9ae8-7766d4c519ec)\n" + "text": [ + "2025-04-23 09:33:00,409 INFO Finished job - calculate_qe (4f947882-06db-4296-8456-b12cff2e66e3)\n", + "2025-04-23 09:33:00,410 INFO Starting job - calculate_qe (d7bd31df-d3a7-49a1-9ae8-7766d4c519ec)\n" + ] }, { "name": "stderr", "output_type": "stream", - "text": "[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01858] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n" + "text": [ + "[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01858] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n" + ] }, { "name": "stdout", "output_type": "stream", - "text": "2025-04-23 09:33:14,798 INFO Finished job - calculate_qe (d7bd31df-d3a7-49a1-9ae8-7766d4c519ec)\n2025-04-23 09:33:14,800 INFO Starting job - get_list (daa806da-16e9-4733-afe1-2ae60dc6292f)\n2025-04-23 09:33:14,804 INFO Finished job - get_list (daa806da-16e9-4733-afe1-2ae60dc6292f)\n2025-04-23 09:33:14,805 INFO Starting job - get_list (407d4cb0-b4f3-41f5-ba66-077754af69eb)\n2025-04-23 09:33:14,808 INFO Finished job - get_list (407d4cb0-b4f3-41f5-ba66-077754af69eb)\n2025-04-23 09:33:14,810 INFO Starting job - plot_energy_volume_curve (e363e583-bcc3-4cd8-b943-f6e4487b11f0)\n" + "text": [ + "2025-04-23 09:33:14,798 INFO Finished job - calculate_qe (d7bd31df-d3a7-49a1-9ae8-7766d4c519ec)\n", + "2025-04-23 09:33:14,800 INFO Starting job - get_list (daa806da-16e9-4733-afe1-2ae60dc6292f)\n", + "2025-04-23 09:33:14,804 INFO Finished job - get_list (daa806da-16e9-4733-afe1-2ae60dc6292f)\n", + "2025-04-23 09:33:14,805 INFO Starting job - get_list (407d4cb0-b4f3-41f5-ba66-077754af69eb)\n", + "2025-04-23 09:33:14,808 INFO Finished job - get_list (407d4cb0-b4f3-41f5-ba66-077754af69eb)\n", + "2025-04-23 09:33:14,810 INFO Starting job - plot_energy_volume_curve (e363e583-bcc3-4cd8-b943-f6e4487b11f0)\n" + ] }, { "name": "stderr", "output_type": "stream", - "text": "Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n" + "text": [ + "Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n" + ] }, { "name": "stdout", "output_type": "stream", - "text": "2025-04-23 09:33:14,912 INFO Finished job - plot_energy_volume_curve (e363e583-bcc3-4cd8-b943-f6e4487b11f0)\n2025-04-23 09:33:14,913 INFO Finished executing jobs locally\n" + "text": [ + "2025-04-23 09:33:14,912 INFO Finished job - plot_energy_volume_curve (e363e583-bcc3-4cd8-b943-f6e4487b11f0)\n", + "2025-04-23 09:33:14,913 INFO Finished executing jobs locally\n" + ] }, { - "execution_count": 21, - "output_type": "execute_result", "data": { - "text/plain": "{'ceb203d4-4b50-4fbf-bd60-36680543382b': {1: Response(output='{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.05, 0.0, 0.0], [0.0, 4.05, 0.0], [0.0, 0.0, 4.05]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.025, 2.025], [2.025, 0.0, 2.025], [2.025, 2.025, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n '27f28719-6394-4a85-b93f-c8ece2feceaf': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.05, 0.0, 0.0], [0.0, 4.05, 0.0], [0.0, 0.0, 4.05]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.025, 2.025], [2.025, 0.0, 2.025], [2.025, 2.025, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'calculation': 'vc-relax', 'kpts': [3, 3, 3], 'pseudopotentials': {'Al': 'Al.pbe-n-kjpaw_psl.1.0.0.UPF'}, 'smearing': 0.02}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n 'ae0b4b06-5734-41ea-a7cc-e8393ef01e55': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.045637215946818, 0.0, 0.0], [0.0, 4.045637215946818, 0.0], [0.0, 0.0, 4.045637215946818]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.022818607973409, 2.022818607973409], [2.022818607973409, 0.0, 2.022818607973409], [2.022818607973409, 2.022818607973409, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'energy': -1074.93652622536, 'volume': 66.21567448236135}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n 'e9deb2a2-2e2a-4077-a221-a6afc9701377': {1: Response(output={'s_0': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[3.906019785962126, 0.0, 0.0], [0.0, 3.906019785962126, 0.0], [0.0, 0.0, 3.906019785962126]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 1.953009892981063, 1.953009892981063], [1.953009892981063, 0.0, 1.953009892981063], [1.953009892981063, 1.953009892981063, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 's_1': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[3.9770538443180263, 0.0, 0.0], [0.0, 3.9770538443180263, 0.0], [0.0, 0.0, 3.9770538443180263]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 1.9885269221590132, 1.9885269221590132], [1.9885269221590132, 0.0, 1.9885269221590132], [1.9885269221590132, 1.9885269221590132, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 's_2': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.045637215946818, 0.0, 0.0], [0.0, 4.045637215946818, 0.0], [0.0, 0.0, 4.045637215946818]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.022818607973409, 2.022818607973409], [2.022818607973409, 0.0, 2.022818607973409], [2.022818607973409, 2.022818607973409, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 's_3': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.111970927282933, 0.0, 0.0], [0.0, 4.111970927282933, 0.0], [0.0, 0.0, 4.111970927282933]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.0559854636414663, 2.0559854636414663], [2.0559854636414663, 0.0, 2.0559854636414663], [2.0559854636414663, 2.0559854636414663, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 's_4': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.176230852372157, 0.0, 0.0], [0.0, 4.176230852372157, 0.0], [0.0, 0.0, 4.176230852372157]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.0881154261860786, 2.0881154261860786], [2.0881154261860786, 0.0, 2.0881154261860786], [2.0881154261860786, 2.0881154261860786, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}'}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n '9f4a0c82-798c-4178-9a46-c5430a2853c1': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[3.906019785962126, 0.0, 0.0], [0.0, 3.906019785962126, 0.0], [0.0, 0.0, 3.906019785962126]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 1.953009892981063, 1.953009892981063], [1.953009892981063, 0.0, 1.953009892981063], [1.953009892981063, 1.953009892981063, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'calculation': 'scf', 'kpts': [3, 3, 3], 'pseudopotentials': {'Al': 'Al.pbe-n-kjpaw_psl.1.0.0.UPF'}, 'smearing': 0.02}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n '8e10ca3a-91ba-4647-bca8-3c905020fb39': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[3.9770538443180263, 0.0, 0.0], [0.0, 3.9770538443180263, 0.0], [0.0, 0.0, 3.9770538443180263]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 1.9885269221590132, 1.9885269221590132], [1.9885269221590132, 0.0, 1.9885269221590132], [1.9885269221590132, 1.9885269221590132, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'calculation': 'scf', 'kpts': [3, 3, 3], 'pseudopotentials': {'Al': 'Al.pbe-n-kjpaw_psl.1.0.0.UPF'}, 'smearing': 0.02}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n '765da827-3180-44d3-940e-e9d5a7e2ae45': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.045637215946818, 0.0, 0.0], [0.0, 4.045637215946818, 0.0], [0.0, 0.0, 4.045637215946818]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.022818607973409, 2.022818607973409], [2.022818607973409, 0.0, 2.022818607973409], [2.022818607973409, 2.022818607973409, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'calculation': 'scf', 'kpts': [3, 3, 3], 'pseudopotentials': {'Al': 'Al.pbe-n-kjpaw_psl.1.0.0.UPF'}, 'smearing': 0.02}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n '5f8ce3d7-f65e-481d-8cb0-291d204df659': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.111970927282933, 0.0, 0.0], [0.0, 4.111970927282933, 0.0], [0.0, 0.0, 4.111970927282933]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.0559854636414663, 2.0559854636414663], [2.0559854636414663, 0.0, 2.0559854636414663], [2.0559854636414663, 2.0559854636414663, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'calculation': 'scf', 'kpts': [3, 3, 3], 'pseudopotentials': {'Al': 'Al.pbe-n-kjpaw_psl.1.0.0.UPF'}, 'smearing': 0.02}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n '12912688-d0c2-4053-80b2-a758b50ce86a': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.176230852372157, 0.0, 0.0], [0.0, 4.176230852372157, 0.0], [0.0, 0.0, 4.176230852372157]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.0881154261860786, 2.0881154261860786], [2.0881154261860786, 0.0, 2.0881154261860786], [2.0881154261860786, 2.0881154261860786, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'calculation': 'scf', 'kpts': [3, 3, 3], 'pseudopotentials': {'Al': 'Al.pbe-n-kjpaw_psl.1.0.0.UPF'}, 'smearing': 0.02}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n '282ce127-dc4e-4e2d-9769-c22bdcdf2e3f': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[3.906019768889166, 0.0, 0.0], [0.0, 3.906019768889166, 0.0], [0.0, 0.0, 3.906019768889166]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 1.9530098844635175, 1.9530098844635175], [1.9530098844635175, 0.0, 1.9530098844635175], [1.9530098844635175, 1.9530098844635175, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'energy': -1074.8457446150626, 'volume': 59.594106252679225}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n '76b1d287-fd0f-4fed-a0b7-cc817dffe2d8': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[3.9770538269345797, 0.0, 0.0], [0.0, 3.9770538269345797, 0.0], [0.0, 0.0, 3.9770538269345797]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 1.9885269135082753, 1.9885269135082753], [1.9885269135082753, 0.0, 1.9885269135082753], [1.9885269135082753, 1.9885269135082753, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'energy': -1074.9161488594607, 'volume': 62.90488993338357}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n '2c6bfb73-15c3-4be7-95ab-f9afbeaf53bc': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.045637198263596, 0.0, 0.0], [0.0, 4.045637198263596, 0.0], [0.0, 0.0, 4.045637198263596]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.0228185991583882, 2.0228185991583882], [2.0228185991583882, 0.0, 2.0228185991583882], [2.0228185991583882, 2.0228185991583882, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'energy': -1074.9365241668372, 'volume': 66.21567361408789}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n '4f947882-06db-4296-8456-b12cff2e66e3': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.111970909309766, 0.0, 0.0], [0.0, 4.111970909309766, 0.0], [0.0, 0.0, 4.111970909309766]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.0559854546134178, 2.0559854546134178], [2.0559854546134178, 0.0, 2.0559854546134178], [2.0559854546134178, 2.0559854546134178, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'energy': -1074.9192860025842, 'volume': 69.52645729479204}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n 'd7bd31df-d3a7-49a1-9ae8-7766d4c519ec': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.17623083411812, 0.0, 0.0], [0.0, 4.17623083411812, 0.0], [0.0, 0.0, 4.17623083411812]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.08811541707298, 2.08811541707298], [2.08811541707298, 0.0, 2.08811541707298], [2.08811541707298, 2.08811541707298, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'energy': -1074.87379046934, 'volume': 72.83724097549673}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n 'daa806da-16e9-4733-afe1-2ae60dc6292f': {1: Response(output=[59.594106252679225, 62.90488993338357, 66.21567361408789, 69.52645729479204, 72.83724097549673], detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n '407d4cb0-b4f3-41f5-ba66-077754af69eb': {1: Response(output=[-1074.8457446150626, -1074.9161488594607, -1074.9365241668372, -1074.9192860025842, -1074.87379046934], detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n 'e363e583-bcc3-4cd8-b943-f6e4487b11f0': {1: Response(output=None, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))}}" + "text/plain": [ + "{'ceb203d4-4b50-4fbf-bd60-36680543382b': {1: Response(output='{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.05, 0.0, 0.0], [0.0, 4.05, 0.0], [0.0, 0.0, 4.05]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.025, 2.025], [2.025, 0.0, 2.025], [2.025, 2.025, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n", + " '27f28719-6394-4a85-b93f-c8ece2feceaf': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.05, 0.0, 0.0], [0.0, 4.05, 0.0], [0.0, 0.0, 4.05]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.025, 2.025], [2.025, 0.0, 2.025], [2.025, 2.025, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'calculation': 'vc-relax', 'kpts': [3, 3, 3], 'pseudopotentials': {'Al': 'Al.pbe-n-kjpaw_psl.1.0.0.UPF'}, 'smearing': 0.02}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n", + " 'ae0b4b06-5734-41ea-a7cc-e8393ef01e55': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.045637215946818, 0.0, 0.0], [0.0, 4.045637215946818, 0.0], [0.0, 0.0, 4.045637215946818]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.022818607973409, 2.022818607973409], [2.022818607973409, 0.0, 2.022818607973409], [2.022818607973409, 2.022818607973409, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'energy': -1074.93652622536, 'volume': 66.21567448236135}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n", + " 'e9deb2a2-2e2a-4077-a221-a6afc9701377': {1: Response(output={'s_0': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[3.906019785962126, 0.0, 0.0], [0.0, 3.906019785962126, 0.0], [0.0, 0.0, 3.906019785962126]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 1.953009892981063, 1.953009892981063], [1.953009892981063, 0.0, 1.953009892981063], [1.953009892981063, 1.953009892981063, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 's_1': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[3.9770538443180263, 0.0, 0.0], [0.0, 3.9770538443180263, 0.0], [0.0, 0.0, 3.9770538443180263]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 1.9885269221590132, 1.9885269221590132], [1.9885269221590132, 0.0, 1.9885269221590132], [1.9885269221590132, 1.9885269221590132, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 's_2': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.045637215946818, 0.0, 0.0], [0.0, 4.045637215946818, 0.0], [0.0, 0.0, 4.045637215946818]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.022818607973409, 2.022818607973409], [2.022818607973409, 0.0, 2.022818607973409], [2.022818607973409, 2.022818607973409, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 's_3': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.111970927282933, 0.0, 0.0], [0.0, 4.111970927282933, 0.0], [0.0, 0.0, 4.111970927282933]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.0559854636414663, 2.0559854636414663], [2.0559854636414663, 0.0, 2.0559854636414663], [2.0559854636414663, 2.0559854636414663, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 's_4': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.176230852372157, 0.0, 0.0], [0.0, 4.176230852372157, 0.0], [0.0, 0.0, 4.176230852372157]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.0881154261860786, 2.0881154261860786], [2.0881154261860786, 0.0, 2.0881154261860786], [2.0881154261860786, 2.0881154261860786, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}'}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n", + " '9f4a0c82-798c-4178-9a46-c5430a2853c1': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[3.906019785962126, 0.0, 0.0], [0.0, 3.906019785962126, 0.0], [0.0, 0.0, 3.906019785962126]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 1.953009892981063, 1.953009892981063], [1.953009892981063, 0.0, 1.953009892981063], [1.953009892981063, 1.953009892981063, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'calculation': 'scf', 'kpts': [3, 3, 3], 'pseudopotentials': {'Al': 'Al.pbe-n-kjpaw_psl.1.0.0.UPF'}, 'smearing': 0.02}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n", + " '8e10ca3a-91ba-4647-bca8-3c905020fb39': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[3.9770538443180263, 0.0, 0.0], [0.0, 3.9770538443180263, 0.0], [0.0, 0.0, 3.9770538443180263]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 1.9885269221590132, 1.9885269221590132], [1.9885269221590132, 0.0, 1.9885269221590132], [1.9885269221590132, 1.9885269221590132, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'calculation': 'scf', 'kpts': [3, 3, 3], 'pseudopotentials': {'Al': 'Al.pbe-n-kjpaw_psl.1.0.0.UPF'}, 'smearing': 0.02}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n", + " '765da827-3180-44d3-940e-e9d5a7e2ae45': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.045637215946818, 0.0, 0.0], [0.0, 4.045637215946818, 0.0], [0.0, 0.0, 4.045637215946818]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.022818607973409, 2.022818607973409], [2.022818607973409, 0.0, 2.022818607973409], [2.022818607973409, 2.022818607973409, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'calculation': 'scf', 'kpts': [3, 3, 3], 'pseudopotentials': {'Al': 'Al.pbe-n-kjpaw_psl.1.0.0.UPF'}, 'smearing': 0.02}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n", + " '5f8ce3d7-f65e-481d-8cb0-291d204df659': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.111970927282933, 0.0, 0.0], [0.0, 4.111970927282933, 0.0], [0.0, 0.0, 4.111970927282933]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.0559854636414663, 2.0559854636414663], [2.0559854636414663, 0.0, 2.0559854636414663], [2.0559854636414663, 2.0559854636414663, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'calculation': 'scf', 'kpts': [3, 3, 3], 'pseudopotentials': {'Al': 'Al.pbe-n-kjpaw_psl.1.0.0.UPF'}, 'smearing': 0.02}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n", + " '12912688-d0c2-4053-80b2-a758b50ce86a': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.176230852372157, 0.0, 0.0], [0.0, 4.176230852372157, 0.0], [0.0, 0.0, 4.176230852372157]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.0881154261860786, 2.0881154261860786], [2.0881154261860786, 0.0, 2.0881154261860786], [2.0881154261860786, 2.0881154261860786, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'calculation': 'scf', 'kpts': [3, 3, 3], 'pseudopotentials': {'Al': 'Al.pbe-n-kjpaw_psl.1.0.0.UPF'}, 'smearing': 0.02}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n", + " '282ce127-dc4e-4e2d-9769-c22bdcdf2e3f': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[3.906019768889166, 0.0, 0.0], [0.0, 3.906019768889166, 0.0], [0.0, 0.0, 3.906019768889166]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 1.9530098844635175, 1.9530098844635175], [1.9530098844635175, 0.0, 1.9530098844635175], [1.9530098844635175, 1.9530098844635175, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'energy': -1074.8457446150626, 'volume': 59.594106252679225}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n", + " '76b1d287-fd0f-4fed-a0b7-cc817dffe2d8': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[3.9770538269345797, 0.0, 0.0], [0.0, 3.9770538269345797, 0.0], [0.0, 0.0, 3.9770538269345797]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 1.9885269135082753, 1.9885269135082753], [1.9885269135082753, 0.0, 1.9885269135082753], [1.9885269135082753, 1.9885269135082753, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'energy': -1074.9161488594607, 'volume': 62.90488993338357}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n", + " '2c6bfb73-15c3-4be7-95ab-f9afbeaf53bc': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.045637198263596, 0.0, 0.0], [0.0, 4.045637198263596, 0.0], [0.0, 0.0, 4.045637198263596]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.0228185991583882, 2.0228185991583882], [2.0228185991583882, 0.0, 2.0228185991583882], [2.0228185991583882, 2.0228185991583882, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'energy': -1074.9365241668372, 'volume': 66.21567361408789}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n", + " '4f947882-06db-4296-8456-b12cff2e66e3': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.111970909309766, 0.0, 0.0], [0.0, 4.111970909309766, 0.0], [0.0, 0.0, 4.111970909309766]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.0559854546134178, 2.0559854546134178], [2.0559854546134178, 0.0, 2.0559854546134178], [2.0559854546134178, 2.0559854546134178, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'energy': -1074.9192860025842, 'volume': 69.52645729479204}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n", + " 'd7bd31df-d3a7-49a1-9ae8-7766d4c519ec': {1: Response(output={'structure': '{\"immutable_id\": null, \"last_modified\": null, \"elements\": [\"Al\"], \"nelements\": 1, \"elements_ratios\": [1.0], \"chemical_formula_descriptive\": \"Al4\", \"chemical_formula_reduced\": \"Al\", \"chemical_formula_hill\": null, \"chemical_formula_anonymous\": \"A\", \"dimension_types\": [1, 1, 1], \"nperiodic_dimensions\": 3, \"lattice_vectors\": [[4.17623083411812, 0.0, 0.0], [0.0, 4.17623083411812, 0.0], [0.0, 0.0, 4.17623083411812]], \"space_group_symmetry_operations_xyz\": null, \"space_group_symbol_hall\": null, \"space_group_symbol_hermann_mauguin\": null, \"space_group_symbol_hermann_mauguin_extended\": null, \"space_group_it_number\": null, \"cartesian_site_positions\": [[0.0, 0.0, 0.0], [0.0, 2.08811541707298, 2.08811541707298], [2.08811541707298, 0.0, 2.08811541707298], [2.08811541707298, 2.08811541707298, 0.0]], \"nsites\": 4, \"species\": [{\"name\": \"Al\", \"chemical_symbols\": [\"Al\"], \"concentration\": [1.0], \"mass\": null, \"original_name\": null, \"attached\": null, \"nattached\": null}], \"species_at_sites\": [\"Al\", \"Al\", \"Al\", \"Al\"], \"assemblies\": null, \"structure_features\": []}', 'energy': -1074.87379046934, 'volume': 72.83724097549673}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n", + " 'daa806da-16e9-4733-afe1-2ae60dc6292f': {1: Response(output=[59.594106252679225, 62.90488993338357, 66.21567361408789, 69.52645729479204, 72.83724097549673], detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n", + " '407d4cb0-b4f3-41f5-ba66-077754af69eb': {1: Response(output=[-1074.8457446150626, -1074.9161488594607, -1074.9365241668372, -1074.9192860025842, -1074.87379046934], detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))},\n", + " 'e363e583-bcc3-4cd8-b943-f6e4487b11f0': {1: Response(output=None, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False, job_dir=PosixPath('/home/jovyan'))}}" + ] }, - "metadata": {} + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" }, { - "output_type": "display_data", "data": { - "text/plain": "
", - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAksAAAHACAYAAACyIiyEAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAW/BJREFUeJzt3XlcVXXCx/HPZReUi8omgqC5AO5LKmZp5ZpLWpltmFZOzYwtVlb2tDht2t6UbdOUtttoWrZRmtrkgjuuCLjgwubKIsh6z/MHwkQiKsI9XPi+X6/7eh4u51y+98Rcvv5+5/yOxTAMAxERERGplJPZAURERETqMpUlERERkSqoLImIiIhUQWVJREREpAoqSyIiIiJVUFkSERERqYLKkoiIiEgVVJZEREREqqCyJCIiIlIFlSURERGRKqgsmeT555+nX79+eHp64uPjc177GIbBjBkzCAoKolGjRgwcOJAdO3aUfz85ORmLxVLpY/78+We8XkFBAd26dcNisRAXF3dB+d999126dOmCt7c33t7eREVF8dNPP13Qa4iIiDgClSWTFBYWMm7cOP7617+e9z4vvfQSr732GrNnz2b9+vUEBgYyePBgcnJyAAgJCSEtLa3C4x//+AdeXl4MHz78jNd75JFHCAoKqlb+4OBgZs2axYYNG9iwYQNXXXUV1157bYXyJiIiUi8YYqo5c+YYVqv1nNvZbDYjMDDQmDVrVvlz+fn5htVqNd57772z7tetWzfjjjvuOOP5H3/80QgPDzd27NhhAMbmzZsrfH/Hjh3G8OHDDS8vL8Pf39+47bbbjCNHjlSZsWnTpsa///3vc74XERERR6KRJQexb98+0tPTGTJkSPlz7u7uDBgwgNWrV1e6z8aNG4mLi+POO++s8HxGRgaTJ0/m008/xdPT84z90tLSGDBgAN26dWPDhg3ExMSQkZHBjTfeWOnPKSkpYd68eeTm5hIVFXUR71JERKTucTE7gJyf9PR0AAICAio8HxAQwP79+yvd58MPPyQiIoJ+/fqVP2cYBhMnTuSee+6hV69eJCcnn7Hfu+++S48ePXjhhRfKn/voo48ICQkhMTGR9u3bA7Bt2zaioqLIz8+ncePGLFq0iMjIyIt9qyIiInWKRpZq0IwZM856gnXZY8OGDRf1MywWS4WvDcM44zmAU6dO8cUXX5wxqvTWW2+RnZ3N9OnTz/ozNm7cyPLly2ncuHH5Izw8HIA9e/aUb9ehQwfi4uKIjY3lr3/9K7fffjs7d+68mLcnIiJS52hkqQZNmTKFm266qcptwsLCqvXagYGBQOkIU4sWLcqfP3z48BmjTQALFiwgLy+PCRMmVHh+2bJlxMbG4u7uXuH5Xr16ceutt/Lxxx9js9kYNWoUL7744hmv+8ef7ebmRtu2bcv3X79+Pf/85z95//33q/UeRURE6iKVpRrk6+uLr69vrbx269atCQwMZMmSJXTv3h0ovaLut99+q7TUfPjhh4wePRo/P78Kz7/55ps899xz5V+npqYydOhQvvrqK/r06QNAjx49+PrrrwkLC8PF5fx/RQzDoKCgoDpvT0REpM5SWTLJgQMHOH78OAcOHKCkpKR8naO2bdvSuHFjAMLDw5k5cyZjx47FYrHwwAMP8MILL9CuXTvatWvHCy+8gKenJ7fcckuF1969ezf//e9/+fHHH8/4ua1atarwddnPuuSSSwgODgbg73//Ox988AE333wz06ZNw9fXl927dzNv3jw++OADnJ2defzxxxk+fDghISHk5OQwb948VqxYQUxMTE0fKhEREVOpLJnkqaee4uOPPy7/umy0aPny5QwcOBCAhIQEsrKyyrd55JFHOHXqFH/72984ceIEffr04ZdffqFJkyYVXvujjz6iZcuWFa6cuxBBQUGsWrWKRx99lKFDh1JQUEBoaCjDhg3Dyan0NLeMjAyio6NJS0vDarXSpUsXYmJiGDx4cLV+poiISF1lMQzDMDuEiIiISF2lq+FEREREqqCyJCIiIlIFnbNUA2w2G6mpqTRp0qTSNY9ERESk7jEMg5ycHIKCgsrPya2MylINSE1NJSQkxOwYIiIiUg0HDx4svyK8MipLNaDsarSDBw/i7e1tchoRERE5H9nZ2YSEhJxxVfmfqSzVgLKpN29vb5UlERERB3OuU2h0greIiIhIFVSWRERERKqgsiQiIiJSBZUlERERkSqoLImIiIhUQWVJREREpAoqSyIiIiJVUFkSERERqYLKkoiIiEgVVJZEREREqqCyJCIiIlIFlSURERGRKqgs1WGGYbBu33HyCovNjiIiItJgqSzVYX/9bBM3vr+GRZtTzI4iIiLSYKks1WG9wpoCMHdVMoZhmJxGRESkYVJZqsNuvDQELzdnkg6fZNXu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Z2z/xhtvYLHo/k4iIiJSkUOs4B0fH09MTAyxsbH06dMHgA8++ICoqCgSEhLo0KHDGfskJSURGxvL9u3b6dixIwDvvPMO/v7+fPnll9x1113l227ZsoXXXnuN9evX06JFC/u8KREREXEIDjGytGbNGqxWa3lRAujbty9Wq5XVq1dXuk9BQQEAHh4e5c85Ozvj5ubGypUry5/Ly8vj5ptvZvbs2QQGBtbSOxARERFH5RBlKT09HX9//zOe9/f3Jz09vdJ9wsPDCQ0NZfr06Zw4cYLCwkJmzZpFeno6aWlp5dtNnTqVfv36ce211553noKCArKzsys8REREpH4ytSzNmDEDi8VS5WPDhg0AlZ5PZBjGWc8zcnV15euvvyYxMZFmzZrh6enJihUrGD58OM7OzgAsXryYZcuW8cYbb1xQ7pkzZ5afaG61WgkJCbmwNy4iIiIOw9RzlqZMmcJNN91U5TZhYWFs3bqVjIyMM7535MgRAgICzrpvz549iYuLIysri8LCQvz8/OjTpw+9evUCYNmyZezZswcfH58K+11//fVcfvnlrFixotLXnT59Og8++GD519nZ2SpMIiIi9ZTFMAzD7BDnEh8fT2RkJGvXrqV3794ArF27lr59+7Jr165KT/CuTFJSEuHh4fz0008MGTKE9PR0jh49WmGbzp07889//pNRo0bRunXr83rd871rsYiIiNQd5/v32yGuhouIiGDYsGFMnjyZ999/H4C//OUvjBw5skJRCg8PZ+bMmYwdOxaA+fPn4+fnR6tWrdi2bRv3338/Y8aMYciQIQAEBgZWelJ3q1atzrsoQel0IKBzl0RERBxI2d/tc40bOURZAvj888+57777yovO6NGjmT17doVtEhISyMrKKv86LS2NBx98kIyMDFq0aMGECRN48sknazxbTk4OgKbiREREHFBOTg5Wq/Ws33eIabi6zmazkZqaSpMmTerEwpZl51AdPHhQ04LoePyZjseZdEwq0vGoSMejovp0PAzDICcnh6CgIJyczn7Nm8OMLNVlTk5OBAcHmx3jDN7e3g7/i1yTdDwq0vE4k45JRToeFel4VFRfjkdVI0plHGKdJRERERGzqCyJiIiIVEFlqR5yd3fn6aefxt3d3ewodYKOR0U6HmfSMalIx6MiHY+KGuLx0AneIiIiIlXQyJKIiIhIFVSWRERERKqg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WRIRERGpgsqSiIiISBVUlkRERESqoLIkIiIiUgWVJREREZEqqCyJiIiIVEFlSUQatLCwMN544w2zY4hIHaayJCIOa9SoUQwaNKjS761ZswaLxcKmTZvsnEpE6huVJRFxWHfeeSfLli1j//79Z3zvo48+olu3bvTo0cOEZCJSn6gsiYjDGjlyJP7+/sydO7fC83l5eXz11VfceeedfP3113Ts2BF3d3fCwsJ49dVXz/p6ycnJWCwW4uLiyp/LzMzEYrGwYsUKAFasWIHFYuHnn3+me/fuNGrUiKuuuorDhw/z008/ERERgbe3NzfffDN5eXnlr2MYBi+99BJt2rShUaNGdO3alQULFtTk4RCRWqKyJCIOy8XFhQkTJjB37lz+eE/w+fPnU1hYSFRUFDfeeCM33XQT27ZtY8aMGTz55JNnlKvqmDFjBrNnz2b16tUcPHiQG2+8kTfeeIMvvviCH374gSVLlvDWW2+Vb//EE08wZ84c3n33XXbs2MHUqVO57bbb+O233y46i4jULovxx08YEREHs2vXLiIiIli2bBlXXnklAAMGDKBly5ZYLBaOHDnCL7/8Ur79I488wg8//MCOHTuA0hO8H3jgAR544AGSk5Np3bo1mzdvplu3bkDpyFLTpk1Zvnw5AwcOZMWKFVx55ZUsXbqUq6++GoBZs2Yxffp09uzZQ5s2bQC45557SE5OJiYmhtzcXHx9fVm2bBlRUVHlWe666y7y8vL44osv7HGoRKSaNLIkIg4tPDycfv368dFHHwGwZ88efv/9d+644w7i4+O57LLLKmx/2WWXkZSURElJyUX93C5dupT//wEBAXh6epYXpbLnDh8+DMDOnTvJz89n8ODBNG7cuPzxySefsGfPnovKISK1z8XsACIiF+vOO+9kypQpvP3228yZM4fQ0FCuvvpqDMPAYrFU2LaqwXQnJ6cztikqKqp0W1dX1/L/32KxVPi67DmbzQZQ/n9/+OEHWrZsWWE7d3f3c709ETGZRpZExOHdeOONODs788UXX/Dxxx8zadIkLBYLkZGRrFy5ssK2q1evpn379jg7O5/xOn5+fgCkpaWVP/fHk72rKzIyEnd3dw4cOEDbtm0rPEJCQi769UWkdmlkSUQcXuPGjRk/fjyPP/44WVlZTJw4EYCHHnqISy+9lGeffZbx48ezZs0aZs+ezTvvvFPp6zRq1Ii+ffsya9YswsLCOHr0KE888cRF52vSpAkPP/wwU6dOxWaz0b9/f7Kzs1m9ejWNGzfm9ttvv+ifISK1RyNLIlIv3HnnnZw4cYJBgwbRqlUrAHr06MF//vMf5s2bR6dOnXjqqad45plnystUZT766COKioro1asX999/P88991yN5Hv22Wd56qmnmDlzJhEREQwdOpTvvvuO1q1b18jri0jt0dVwIiIiIlXQyJKIiIhIFVSWRERERKqgsiQiIiJSBZUlERERkSqoLImIiIhUQWVJREREpAoqSyIiIiJVUFkSERERqYLKkoiIiEgVVJZEREREqqCyJCIiIlIFlSURERGRKvw/FsCLm/9axZsAAAAASUVORK5CYII=" + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAksAAAHACAYAAACyIiyEAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAW/BJREFUeJzt3XlcVXXCx/HPZReUi8omgqC5AO5LKmZp5ZpLWpltmFZOzYwtVlb2tDht2t6UbdOUtttoWrZRmtrkgjuuCLjgwubKIsh6z/MHwkQiKsI9XPi+X6/7eh4u51y+98Rcvv5+5/yOxTAMAxERERGplJPZAURERETqMpUlERERkSqoLImIiIhUQWVJREREpAoqSyIiIiJVUFkSERERqYLKkoiIiEgVVJZEREREqqCyJCIiIlIFlSURERGRKqgsmeT555+nX79+eHp64uPjc177GIbBjBkzCAoKolGjRgwcOJAdO3aUfz85ORmLxVLpY/78+We8XkFBAd26dcNisRAXF3dB+d999126dOmCt7c33t7eREVF8dNPP13Qa4iIiDgClSWTFBYWMm7cOP7617+e9z4vvfQSr732GrNnz2b9+vUEBgYyePBgcnJyAAgJCSEtLa3C4x//+AdeXl4MHz78jNd75JFHCAoKqlb+4OBgZs2axYYNG9iwYQNXXXUV1157bYXyJiIiUi8YYqo5c+YYVqv1nNvZbDYjMDDQmDVrVvlz+fn5htVqNd57772z7tetWzfjjjvuOOP5H3/80QgPDzd27NhhAMbmzZsrfH/Hjh3G8OHDDS8vL8Pf39+47bbbjCNHjlSZsWnTpsa///3vc74XERERR6KRJQexb98+0tPTGTJkSPlz7u7uDBgwgNWrV1e6z8aNG4mLi+POO++s8HxGRgaTJ0/m008/xdPT84z90tLSGDBgAN26dWPDhg3ExMSQkZHBjTfeWOnPKSkpYd68eeTm5hIVFXUR71JERKTucTE7gJyf9PR0AAICAio8HxAQwP79+yvd58MPPyQiIoJ+/fqVP2cYBhMnTuSee+6hV69eJCcnn7Hfu+++S48ePXjhhRfKn/voo48ICQkhMTGR9u3bA7Bt2zaioqLIz8+ncePGLFq0iMjIyIt9qyIiInWKRpZq0IwZM856gnXZY8OGDRf1MywWS4WvDcM44zmAU6dO8cUXX5wxqvTWW2+RnZ3N9OnTz/ozNm7cyPLly2ncuHH5Izw8HIA9e/aUb9ehQwfi4uKIjY3lr3/9K7fffjs7d+68mLcnIiJS52hkqQZNmTKFm266qcptwsLCqvXagYGBQOkIU4sWLcqfP3z48BmjTQALFiwgLy+PCRMmVHh+2bJlxMbG4u7uXuH5Xr16ceutt/Lxxx9js9kYNWoUL7744hmv+8ef7ebmRtu2bcv3X79+Pf/85z95//33q/UeRURE6iKVpRrk6+uLr69vrbx269atCQwMZMmSJXTv3h0ovaLut99+q7TUfPjhh4wePRo/P78Kz7/55ps899xz5V+npqYydOhQvvrqK/r06QNAjx49+PrrrwkLC8PF5fx/RQzDoKCgoDpvT0REpM5SWTLJgQMHOH78OAcOHKCkpKR8naO2bdvSuHFjAMLDw5k5cyZjx47FYrHwwAMP8MILL9CuXTvatWvHCy+8gKenJ7fcckuF1969ezf//e9/+fHHH8/4ua1atarwddnPuuSSSwgODgbg73//Ox988AE333wz06ZNw9fXl927dzNv3jw++OADnJ2defzxxxk+fDghISHk5OQwb948VqxYQUxMTE0fKhEREVOpLJnkqaee4uOPPy7/umy0aPny5QwcOBCAhIQEsrKyyrd55JFHOHXqFH/72984ceIEffr04ZdffqFJkyYVXvujjz6iZcuWFa6cuxBBQUGsWrWKRx99lKFDh1JQUEBoaCjDhg3Dyan0NLeMjAyio6NJS0vDarXSpUsXYmJiGDx4cLV+poiISF1lMQzDMDuEiIiISF2lq+FEREREqqCyJCIiIlIFnbNUA2w2G6mpqTRp0qTSNY9ERESk7jEMg5ycHIKCgsrPya2MylINSE1NJSQkxOwYIiIiUg0HDx4svyK8MipLNaDsarSDBw/i7e1tchoRERE5H9nZ2YSEhJxxVfmfqSzVgLKpN29vb5UlERERB3OuU2h0greIiIhIFVSWRERERKqgsiQiIiJSBZUlERERkSqoLImIiIhUQWVJREREpAoqSyIiIiJVUFkSERERqYLKkoiIiEgVVJZEREREqqCyJCIiIlIFlSURERGRKqgs1WGGYbBu33HyCovNjiIiItJgqSzVYX/9bBM3vr+GRZtTzI4iIiLSYKks1WG9wpoCMHdVMoZhmJxGRESkYVJZqsNuvDQELzdnkg6fZNXu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Z2z/xhtvYLHo/k4iIiJSkUOs4B0fH09MTAyxsbH06dMHgA8++ICoqCgSEhLo0KHDGfskJSURGxvL9u3b6dixIwDvvPMO/v7+fPnll9x1113l227ZsoXXXnuN9evX06JFC/u8KREREXEIDjGytGbNGqxWa3lRAujbty9Wq5XVq1dXuk9BQQEAHh4e5c85Ozvj5ubGypUry5/Ly8vj5ptvZvbs2QQGBtbSOxARERFH5RBlKT09HX9//zOe9/f3Jz09vdJ9wsPDCQ0NZfr06Zw4cYLCwkJmzZpFeno6aWlp5dtNnTqVfv36ce211553noKCArKzsys8REREpH4ytSzNmDEDi8VS5WPDhg0AlZ5PZBjGWc8zcnV15euvvyYxMZFmzZrh6enJihUrGD58OM7OzgAsXryYZcuW8cYbb1xQ7pkzZ5afaG61WgkJCbmwNy4iIiIOw9RzlqZMmcJNN91U5TZhYWFs3bqVjIyMM7535MgRAgICzrpvz549iYuLIysri8LCQvz8/OjTpw+9evUCYNmyZezZswcfH58K+11//fVcfvnlrFixotLXnT59Og8++GD519nZ2SpMIiIi9ZTFMAzD7BDnEh8fT2RkJGvXrqV3794ArF27lr59+7Jr165KT/CuTFJSEuHh4fz0008MGTKE9PR0jh49WmGbzp07889//pNRo0bRunXr83rd871rsYiIiNQd5/v32yGuhouIiGDYsGFMnjyZ999/H4C//OUvjBw5skJRCg8PZ+bMmYwdOxaA+fPn4+fnR6tWrdi2bRv3338/Y8aMYciQIQAEBgZWelJ3q1atzrsoQel0IKBzl0RERBxI2d/tc40bOURZAvj888+57777yovO6NGjmT17doVtEhISyMrKKv86LS2NBx98kIyMDFq0aMGECRN48sknazxbTk4OgKbiREREHFBOTg5Wq/Ws33eIabi6zmazkZqaSpMmTerEwpZl51AdPHhQ04LoePyZjseZdEwq0vGoSMejovp0PAzDICcnh6CgIJyczn7Nm8OMLNVlTk5OBAcHmx3jDN7e3g7/i1yTdDwq0vE4k45JRToeFel4VFRfjkdVI0plHGKdJRERERGzqCyJiIiIVEFlqR5yd3fn6aefxt3d3ewodYKOR0U6HmfSMalIx6MiHY+KGuLx0AneIiIiIlXQyJKIiIhIFVSWRERERKqg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WRIRERGpgsqSiIiISBVUlkRERESqoLIkIiIiUgWVJREREZEqqCyJiIiIVEFlSUQatLCwMN544w2zY4hIHaayJCIOa9SoUQwaNKjS761ZswaLxcKmTZvsnEpE6huVJRFxWHfeeSfLli1j//79Z3zvo48+olu3bvTo0cOEZCJSn6gsiYjDGjlyJP7+/sydO7fC83l5eXz11VfceeedfP3113Ts2BF3d3fCwsJ49dVXz/p6ycnJWCwW4uLiyp/LzMzEYrGwYsUKAFasWIHFYuHnn3+me/fuNGrUiKuuuorDhw/z008/ERERgbe3NzfffDN5eXnlr2MYBi+99BJt2rShUaNGdO3alQULFtTk4RCRWqKyJCIOy8XFhQkTJjB37lz+eE/w+fPnU1hYSFRUFDfeeCM33XQT27ZtY8aMGTz55JNnlKvqmDFjBrNnz2b16tUcPHiQG2+8kTfeeIMvvviCH374gSVLlvDWW2+Vb//EE08wZ84c3n33XXbs2MHUqVO57bbb+O233y46i4jULovxx08YEREHs2vXLiIiIli2bBlXXnklAAMGDKBly5ZYLBaOHDnCL7/8Ur79I488wg8//MCOHTuA0hO8H3jgAR544AGSk5Np3bo1mzdvplu3bkDpyFLTpk1Zvnw5AwcOZMWKFVx55ZUsXbqUq6++GoBZs2Yxffp09uzZQ5s2bQC45557SE5OJiYmhtzcXHx9fVm2bBlRUVHlWe666y7y8vL44osv7HGoRKSaNLIkIg4tPDycfv368dFHHwGwZ88efv/9d+644w7i4+O57LLLKmx/2WWXkZSURElJyUX93C5dupT//wEBAXh6epYXpbLnDh8+DMDOnTvJz89n8ODBNG7cuPzxySefsGfPnovKISK1z8XsACIiF+vOO+9kypQpvP3228yZM4fQ0FCuvvpqDMPAYrFU2LaqwXQnJ6cztikqKqp0W1dX1/L/32KxVPi67DmbzQZQ/n9/+OEHWrZsWWE7d3f3c709ETGZRpZExOHdeOONODs788UXX/Dxxx8zadIkLBYLkZGRrFy5ssK2q1evpn379jg7O5/xOn5+fgCkpaWVP/fHk72rKzIyEnd3dw4cOEDbtm0rPEJCQi769UWkdmlkSUQcXuPGjRk/fjyPP/44WVlZTJw4EYCHHnqISy+9lGeffZbx48ezZs0aZs+ezTvvvFPp6zRq1Ii+ffsya9YswsLCOHr0KE888cRF52vSpAkPP/wwU6dOxWaz0b9/f7Kzs1m9ejWNGzfm9ttvv+ifISK1RyNLIlIv3HnnnZw4cYJBgwbRqlUrAHr06MF//vMf5s2bR6dOnXjqqad45plnystUZT766COKioro1asX999/P88991yN5Hv22Wd56qmnmDlzJhEREQwdOpTvvvuO1q1b18jri0jt0dVwIiIiIlXQyJKIiIhIFVSWRERERKqgsiQiIiJSBZUlERERkSqoLImIiIhUQWVJREREpAoqSyIiIiJVUFkSERERqYLKkoiIiEgVVJZEREREqqCyJCIiIlIFlSURERGRKvw/FsCLm/9axZsAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] }, - "metadata": {} + "metadata": {}, + "output_type": "display_data" } ], - "execution_count": 21 + "source": [ + "result = run_locally(flow)\n", + "result" + ] }, { "cell_type": "markdown", - "source": "## Load Workflow with pyiron_base", - "metadata": {} + "metadata": {}, + "source": [ + "## Load Workflow with pyiron_base" + ] }, { "cell_type": "code", - "source": "from python_workflow_definition.pyiron_base import load_workflow_json", + "execution_count": 22, "metadata": { "trusted": true }, "outputs": [], - "execution_count": 22 + "source": [ + "from python_workflow_definition.pyiron_base import load_workflow_json" + ] }, { "cell_type": "code", - "source": "delayed_object_lst = load_workflow_json(file_name=workflow_json_filename)\ndelayed_object_lst[-1].draw()", + "execution_count": 23, "metadata": { "trusted": true }, "outputs": [ { - "output_type": "display_data", "data": { - "text/plain": "", - "image/svg+xml": "\n\n\n\n\ncreate_function_job_81ad14ceddd174cc2129a2d071b8dfeb\n\ncreate_function_job=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def64e90>\n\n\n\nvolume_lst_7877f4496713e91ee9569a3d39477944\n\nvolume_lst=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def64320>\n\n\n\nvolume_lst_7877f4496713e91ee9569a3d39477944->create_function_job_81ad14ceddd174cc2129a2d071b8dfeb\n\n\n\n\n\n0_e81e45d48628cffd23c97591d4742381\n\n0=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def46db0>\n\n\n\n0_e81e45d48628cffd23c97591d4742381->volume_lst_7877f4496713e91ee9569a3d39477944\n\n\n\n\n\ninput_dict_2104e1cd318f16e37db9c8fc50b44bf7\n\ninput_dict=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47f80>\n\n\n\ninput_dict_2104e1cd318f16e37db9c8fc50b44bf7->0_e81e45d48628cffd23c97591d4742381\n\n\n\n\n\n0_79d0e65e922efc9f26386930f67b4593\n\n0=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47a70>\n\n\n\ninput_dict_2104e1cd318f16e37db9c8fc50b44bf7->0_79d0e65e922efc9f26386930f67b4593\n\n\n\n\n\nenergy_lst_c39c096e088c6198246309199a06e31a\n\nenergy_lst=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def46c00>\n\n\n\n0_79d0e65e922efc9f26386930f67b4593->energy_lst_c39c096e088c6198246309199a06e31a\n\n\n\n\n\nstructure_8ec2a7af77e9d22260dc56b435bba70b\n\nstructure=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47cb0>\n\n\n\nstructure_8ec2a7af77e9d22260dc56b435bba70b->input_dict_2104e1cd318f16e37db9c8fc50b44bf7\n\n\n\n\n\nstructure_a2e153ee6a338726bca4488fd55e61d3\n\nstructure=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def46cf0>\n\n\n\nstructure_a2e153ee6a338726bca4488fd55e61d3->structure_8ec2a7af77e9d22260dc56b435bba70b\n\n\n\n\n\nstructure_c401a7118deb546adf8cacc894a995d4\n\nstructure=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47980>\n\n\n\nstructure_a2e153ee6a338726bca4488fd55e61d3->structure_c401a7118deb546adf8cacc894a995d4\n\n\n\n\n\nstructure_503093210fb645799cb9c53a6111f31d\n\nstructure=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47650>\n\n\n\nstructure_a2e153ee6a338726bca4488fd55e61d3->structure_503093210fb645799cb9c53a6111f31d\n\n\n\n\n\nstructure_feae982cf556b8d382334d6cbdf1cd8d\n\nstructure=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47320>\n\n\n\nstructure_a2e153ee6a338726bca4488fd55e61d3->structure_feae982cf556b8d382334d6cbdf1cd8d\n\n\n\n\n\nstructure_d63e04359ed4866d6c7b37b920475e13\n\nstructure=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def46ff0>\n\n\n\nstructure_a2e153ee6a338726bca4488fd55e61d3->structure_d63e04359ed4866d6c7b37b920475e13\n\n\n\n\n\ninput_dict_b90e408f5e84971a0acbe801ef8e7167\n\ninput_dict=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47c20>\n\n\n\nstructure_c401a7118deb546adf8cacc894a995d4->input_dict_b90e408f5e84971a0acbe801ef8e7167\n\n\n\n\n\ninput_dict_09a5f6ff4398ee33f2c690b496ea0142\n\ninput_dict=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def478f0>\n\n\n\nstructure_503093210fb645799cb9c53a6111f31d->input_dict_09a5f6ff4398ee33f2c690b496ea0142\n\n\n\n\n\ninput_dict_b75fbdc25556c6a295e00bd54557cdf3\n\ninput_dict=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def475c0>\n\n\n\nstructure_feae982cf556b8d382334d6cbdf1cd8d->input_dict_b75fbdc25556c6a295e00bd54557cdf3\n\n\n\n\n\ninput_dict_dff830eead42379c139eeb9148710ae8\n\ninput_dict=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47290>\n\n\n\nstructure_d63e04359ed4866d6c7b37b920475e13->input_dict_dff830eead42379c139eeb9148710ae8\n\n\n\n\n\ninput_dict_2f4bdfa637c1310ad67c1dbef51e42fc\n\ninput_dict=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def46660>\n\n\n\ninput_dict_2f4bdfa637c1310ad67c1dbef51e42fc->structure_a2e153ee6a338726bca4488fd55e61d3\n\n\n\n\n\nstructure_8a946279df78421b8c6c2efb8df18e00\n\nstructure=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def467b0>\n\n\n\nstructure_8a946279df78421b8c6c2efb8df18e00->input_dict_2f4bdfa637c1310ad67c1dbef51e42fc\n\n\n\n\n\nelement_467734216d9bd2497ffd28d5cd6daba0\n\nelement=Al\n\n\n\nelement_467734216d9bd2497ffd28d5cd6daba0->structure_8a946279df78421b8c6c2efb8df18e00\n\n\n\n\n\na_457b6d376c6fce696df148a385afa46d\n\na=4.04\n\n\n\na_457b6d376c6fce696df148a385afa46d->structure_8a946279df78421b8c6c2efb8df18e00\n\n\n\n\n\ncubic_bad787c53fa02a5559fe570238fdb23a\n\ncubic=True\n\n\n\ncubic_bad787c53fa02a5559fe570238fdb23a->structure_8a946279df78421b8c6c2efb8df18e00\n\n\n\n\n\ncalculation_77b75a01e65d83962d14fa8a882d6c34\n\ncalculation=vc-relax\n\n\n\ncalculation_77b75a01e65d83962d14fa8a882d6c34->input_dict_2f4bdfa637c1310ad67c1dbef51e42fc\n\n\n\n\n\nkpts_e961a9390797b0f6f8887a402ea3e9aa\n\nkpts=[3, 3, 3]\n\n\n\nkpts_e961a9390797b0f6f8887a402ea3e9aa->input_dict_2104e1cd318f16e37db9c8fc50b44bf7\n\n\n\n\n\nkpts_e961a9390797b0f6f8887a402ea3e9aa->input_dict_2f4bdfa637c1310ad67c1dbef51e42fc\n\n\n\n\n\nkpts_e961a9390797b0f6f8887a402ea3e9aa->input_dict_b90e408f5e84971a0acbe801ef8e7167\n\n\n\n\n\nkpts_e961a9390797b0f6f8887a402ea3e9aa->input_dict_09a5f6ff4398ee33f2c690b496ea0142\n\n\n\n\n\nkpts_e961a9390797b0f6f8887a402ea3e9aa->input_dict_b75fbdc25556c6a295e00bd54557cdf3\n\n\n\n\n\nkpts_e961a9390797b0f6f8887a402ea3e9aa->input_dict_dff830eead42379c139eeb9148710ae8\n\n\n\n\n\n1_6ad77da55455ab9aa590aedabc104f68\n\n1=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def648f0>\n\n\n\ninput_dict_b90e408f5e84971a0acbe801ef8e7167->1_6ad77da55455ab9aa590aedabc104f68\n\n\n\n\n\n1_f7ad5955f13722bf930d81c2b9e742e9\n\n1=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47a40>\n\n\n\ninput_dict_b90e408f5e84971a0acbe801ef8e7167->1_f7ad5955f13722bf930d81c2b9e742e9\n\n\n\n\n\n2_e195a45cae0bfce238475e97d9a58cd5\n\n2=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def64c20>\n\n\n\ninput_dict_09a5f6ff4398ee33f2c690b496ea0142->2_e195a45cae0bfce238475e97d9a58cd5\n\n\n\n\n\n2_112c792629e86543b9cea4a872270624\n\n2=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47350>\n\n\n\ninput_dict_09a5f6ff4398ee33f2c690b496ea0142->2_112c792629e86543b9cea4a872270624\n\n\n\n\n\n3_a983b77487f6859f18062f31bb895319\n\n3=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def647a0>\n\n\n\ninput_dict_b75fbdc25556c6a295e00bd54557cdf3->3_a983b77487f6859f18062f31bb895319\n\n\n\n\n\n3_f629cc0dcbd5dc353789776418f3701f\n\n3=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def473b0>\n\n\n\ninput_dict_b75fbdc25556c6a295e00bd54557cdf3->3_f629cc0dcbd5dc353789776418f3701f\n\n\n\n\n\n4_c9c83b9132566cff0bc7068536ede7ca\n\n4=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def64da0>\n\n\n\ninput_dict_dff830eead42379c139eeb9148710ae8->4_c9c83b9132566cff0bc7068536ede7ca\n\n\n\n\n\n4_4d455a4b322d423d9821fbd74191eb62\n\n4=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47050>\n\n\n\ninput_dict_dff830eead42379c139eeb9148710ae8->4_4d455a4b322d423d9821fbd74191eb62\n\n\n\n\n\npseudopotentials_453cdcc0d627a851e196cd899d956d10\n\npseudopotentials={'Al': 'Al.pbe-n-kjpaw_psl.1.0.0.UPF'}\n\n\n\npseudopotentials_453cdcc0d627a851e196cd899d956d10->input_dict_2104e1cd318f16e37db9c8fc50b44bf7\n\n\n\n\n\npseudopotentials_453cdcc0d627a851e196cd899d956d10->input_dict_2f4bdfa637c1310ad67c1dbef51e42fc\n\n\n\n\n\npseudopotentials_453cdcc0d627a851e196cd899d956d10->input_dict_b90e408f5e84971a0acbe801ef8e7167\n\n\n\n\n\npseudopotentials_453cdcc0d627a851e196cd899d956d10->input_dict_09a5f6ff4398ee33f2c690b496ea0142\n\n\n\n\n\npseudopotentials_453cdcc0d627a851e196cd899d956d10->input_dict_b75fbdc25556c6a295e00bd54557cdf3\n\n\n\n\n\npseudopotentials_453cdcc0d627a851e196cd899d956d10->input_dict_dff830eead42379c139eeb9148710ae8\n\n\n\n\n\nsmearing_64a632a7e5bfbb7d0c6face9b82082a9\n\nsmearing=0.02\n\n\n\nsmearing_64a632a7e5bfbb7d0c6face9b82082a9->input_dict_2104e1cd318f16e37db9c8fc50b44bf7\n\n\n\n\n\nsmearing_64a632a7e5bfbb7d0c6face9b82082a9->input_dict_2f4bdfa637c1310ad67c1dbef51e42fc\n\n\n\n\n\nsmearing_64a632a7e5bfbb7d0c6face9b82082a9->input_dict_b90e408f5e84971a0acbe801ef8e7167\n\n\n\n\n\nsmearing_64a632a7e5bfbb7d0c6face9b82082a9->input_dict_09a5f6ff4398ee33f2c690b496ea0142\n\n\n\n\n\nsmearing_64a632a7e5bfbb7d0c6face9b82082a9->input_dict_b75fbdc25556c6a295e00bd54557cdf3\n\n\n\n\n\nsmearing_64a632a7e5bfbb7d0c6face9b82082a9->input_dict_dff830eead42379c139eeb9148710ae8\n\n\n\n\n\nworking_directory_a17ade9a563d8dcadb655fb2e1c743a7\n\nworking_directory=mini\n\n\n\nworking_directory_a17ade9a563d8dcadb655fb2e1c743a7->structure_a2e153ee6a338726bca4488fd55e61d3\n\n\n\n\n\nstrain_lst_2d8c38dac8f1aeeeecfa3c0b1cc8a781\n\nstrain_lst=[0.9, 0.95, 1.0, 1.05, 1.1]\n\n\n\nstrain_lst_2d8c38dac8f1aeeeecfa3c0b1cc8a781->structure_8ec2a7af77e9d22260dc56b435bba70b\n\n\n\n\n\nstrain_lst_2d8c38dac8f1aeeeecfa3c0b1cc8a781->structure_c401a7118deb546adf8cacc894a995d4\n\n\n\n\n\nstrain_lst_2d8c38dac8f1aeeeecfa3c0b1cc8a781->structure_503093210fb645799cb9c53a6111f31d\n\n\n\n\n\nstrain_lst_2d8c38dac8f1aeeeecfa3c0b1cc8a781->structure_feae982cf556b8d382334d6cbdf1cd8d\n\n\n\n\n\nstrain_lst_2d8c38dac8f1aeeeecfa3c0b1cc8a781->structure_d63e04359ed4866d6c7b37b920475e13\n\n\n\n\n\ncalculation_bc91e0ce7227762f507f47b85f2f0a83\n\ncalculation=scf\n\n\n\ncalculation_bc91e0ce7227762f507f47b85f2f0a83->input_dict_2104e1cd318f16e37db9c8fc50b44bf7\n\n\n\n\n\ncalculation_bc91e0ce7227762f507f47b85f2f0a83->input_dict_b90e408f5e84971a0acbe801ef8e7167\n\n\n\n\n\ncalculation_bc91e0ce7227762f507f47b85f2f0a83->input_dict_09a5f6ff4398ee33f2c690b496ea0142\n\n\n\n\n\ncalculation_bc91e0ce7227762f507f47b85f2f0a83->input_dict_b75fbdc25556c6a295e00bd54557cdf3\n\n\n\n\n\ncalculation_bc91e0ce7227762f507f47b85f2f0a83->input_dict_dff830eead42379c139eeb9148710ae8\n\n\n\n\n\nworking_directory_2e9abb255f1a31f7d29b4451ad422add\n\nworking_directory=strain_0\n\n\n\nworking_directory_2e9abb255f1a31f7d29b4451ad422add->0_e81e45d48628cffd23c97591d4742381\n\n\n\n\n\nworking_directory_2e9abb255f1a31f7d29b4451ad422add->0_79d0e65e922efc9f26386930f67b4593\n\n\n\n\n\n1_6ad77da55455ab9aa590aedabc104f68->volume_lst_7877f4496713e91ee9569a3d39477944\n\n\n\n\n\n1_f7ad5955f13722bf930d81c2b9e742e9->energy_lst_c39c096e088c6198246309199a06e31a\n\n\n\n\n\nworking_directory_5423d2cc67129a6d0383af6f347df5bd\n\nworking_directory=strain_1\n\n\n\nworking_directory_5423d2cc67129a6d0383af6f347df5bd->1_6ad77da55455ab9aa590aedabc104f68\n\n\n\n\n\nworking_directory_5423d2cc67129a6d0383af6f347df5bd->1_f7ad5955f13722bf930d81c2b9e742e9\n\n\n\n\n\n2_e195a45cae0bfce238475e97d9a58cd5->volume_lst_7877f4496713e91ee9569a3d39477944\n\n\n\n\n\n2_112c792629e86543b9cea4a872270624->energy_lst_c39c096e088c6198246309199a06e31a\n\n\n\n\n\nworking_directory_cc646e064ddfc4b2811aba3d86d27992\n\nworking_directory=strain_2\n\n\n\nworking_directory_cc646e064ddfc4b2811aba3d86d27992->2_e195a45cae0bfce238475e97d9a58cd5\n\n\n\n\n\nworking_directory_cc646e064ddfc4b2811aba3d86d27992->2_112c792629e86543b9cea4a872270624\n\n\n\n\n\n3_a983b77487f6859f18062f31bb895319->volume_lst_7877f4496713e91ee9569a3d39477944\n\n\n\n\n\n3_f629cc0dcbd5dc353789776418f3701f->energy_lst_c39c096e088c6198246309199a06e31a\n\n\n\n\n\nworking_directory_e27768d53df6cd8dc245c52054ecf31f\n\nworking_directory=strain_3\n\n\n\nworking_directory_e27768d53df6cd8dc245c52054ecf31f->3_a983b77487f6859f18062f31bb895319\n\n\n\n\n\nworking_directory_e27768d53df6cd8dc245c52054ecf31f->3_f629cc0dcbd5dc353789776418f3701f\n\n\n\n\n\n4_c9c83b9132566cff0bc7068536ede7ca->volume_lst_7877f4496713e91ee9569a3d39477944\n\n\n\n\n\n4_4d455a4b322d423d9821fbd74191eb62->energy_lst_c39c096e088c6198246309199a06e31a\n\n\n\n\n\nworking_directory_72bba39b22d2b7ce154d37c7e8c658b7\n\nworking_directory=strain_4\n\n\n\nworking_directory_72bba39b22d2b7ce154d37c7e8c658b7->4_c9c83b9132566cff0bc7068536ede7ca\n\n\n\n\n\nworking_directory_72bba39b22d2b7ce154d37c7e8c658b7->4_4d455a4b322d423d9821fbd74191eb62\n\n\n\n\n\nenergy_lst_c39c096e088c6198246309199a06e31a->create_function_job_81ad14ceddd174cc2129a2d071b8dfeb\n\n\n\n\n" + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "create_function_job_81ad14ceddd174cc2129a2d071b8dfeb\n", + "\n", + "create_function_job=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def64e90>\n", + "\n", + "\n", + "\n", + "volume_lst_7877f4496713e91ee9569a3d39477944\n", + "\n", + "volume_lst=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def64320>\n", + "\n", + "\n", + "\n", + "volume_lst_7877f4496713e91ee9569a3d39477944->create_function_job_81ad14ceddd174cc2129a2d071b8dfeb\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "0_e81e45d48628cffd23c97591d4742381\n", + "\n", + "0=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def46db0>\n", + "\n", + "\n", + "\n", + "0_e81e45d48628cffd23c97591d4742381->volume_lst_7877f4496713e91ee9569a3d39477944\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "input_dict_2104e1cd318f16e37db9c8fc50b44bf7\n", + "\n", + "input_dict=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47f80>\n", + "\n", + "\n", + "\n", + "input_dict_2104e1cd318f16e37db9c8fc50b44bf7->0_e81e45d48628cffd23c97591d4742381\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "0_79d0e65e922efc9f26386930f67b4593\n", + "\n", + "0=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47a70>\n", + "\n", + "\n", + "\n", + "input_dict_2104e1cd318f16e37db9c8fc50b44bf7->0_79d0e65e922efc9f26386930f67b4593\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "energy_lst_c39c096e088c6198246309199a06e31a\n", + "\n", + "energy_lst=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def46c00>\n", + "\n", + "\n", + "\n", + "0_79d0e65e922efc9f26386930f67b4593->energy_lst_c39c096e088c6198246309199a06e31a\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "structure_8ec2a7af77e9d22260dc56b435bba70b\n", + "\n", + "structure=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47cb0>\n", + "\n", + "\n", + "\n", + "structure_8ec2a7af77e9d22260dc56b435bba70b->input_dict_2104e1cd318f16e37db9c8fc50b44bf7\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "structure_a2e153ee6a338726bca4488fd55e61d3\n", + "\n", + "structure=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def46cf0>\n", + "\n", + "\n", + "\n", + "structure_a2e153ee6a338726bca4488fd55e61d3->structure_8ec2a7af77e9d22260dc56b435bba70b\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "structure_c401a7118deb546adf8cacc894a995d4\n", + "\n", + "structure=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47980>\n", + "\n", + "\n", + "\n", + "structure_a2e153ee6a338726bca4488fd55e61d3->structure_c401a7118deb546adf8cacc894a995d4\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "structure_503093210fb645799cb9c53a6111f31d\n", + "\n", + "structure=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47650>\n", + "\n", + "\n", + "\n", + "structure_a2e153ee6a338726bca4488fd55e61d3->structure_503093210fb645799cb9c53a6111f31d\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "structure_feae982cf556b8d382334d6cbdf1cd8d\n", + "\n", + "structure=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47320>\n", + "\n", + "\n", + "\n", + "structure_a2e153ee6a338726bca4488fd55e61d3->structure_feae982cf556b8d382334d6cbdf1cd8d\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "structure_d63e04359ed4866d6c7b37b920475e13\n", + "\n", + "structure=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def46ff0>\n", + "\n", + "\n", + "\n", + "structure_a2e153ee6a338726bca4488fd55e61d3->structure_d63e04359ed4866d6c7b37b920475e13\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "input_dict_b90e408f5e84971a0acbe801ef8e7167\n", + "\n", + "input_dict=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47c20>\n", + "\n", + "\n", + "\n", + "structure_c401a7118deb546adf8cacc894a995d4->input_dict_b90e408f5e84971a0acbe801ef8e7167\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "input_dict_09a5f6ff4398ee33f2c690b496ea0142\n", + "\n", + "input_dict=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def478f0>\n", + "\n", + "\n", + "\n", + "structure_503093210fb645799cb9c53a6111f31d->input_dict_09a5f6ff4398ee33f2c690b496ea0142\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "input_dict_b75fbdc25556c6a295e00bd54557cdf3\n", + "\n", + "input_dict=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def475c0>\n", + "\n", + "\n", + "\n", + "structure_feae982cf556b8d382334d6cbdf1cd8d->input_dict_b75fbdc25556c6a295e00bd54557cdf3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "input_dict_dff830eead42379c139eeb9148710ae8\n", + "\n", + "input_dict=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47290>\n", + "\n", + "\n", + "\n", + "structure_d63e04359ed4866d6c7b37b920475e13->input_dict_dff830eead42379c139eeb9148710ae8\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "input_dict_2f4bdfa637c1310ad67c1dbef51e42fc\n", + "\n", + "input_dict=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def46660>\n", + "\n", + "\n", + "\n", + "input_dict_2f4bdfa637c1310ad67c1dbef51e42fc->structure_a2e153ee6a338726bca4488fd55e61d3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "structure_8a946279df78421b8c6c2efb8df18e00\n", + "\n", + "structure=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def467b0>\n", + "\n", + "\n", + "\n", + "structure_8a946279df78421b8c6c2efb8df18e00->input_dict_2f4bdfa637c1310ad67c1dbef51e42fc\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "element_467734216d9bd2497ffd28d5cd6daba0\n", + "\n", + "element=Al\n", + "\n", + "\n", + "\n", + "element_467734216d9bd2497ffd28d5cd6daba0->structure_8a946279df78421b8c6c2efb8df18e00\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "a_457b6d376c6fce696df148a385afa46d\n", + "\n", + "a=4.04\n", + "\n", + "\n", + "\n", + "a_457b6d376c6fce696df148a385afa46d->structure_8a946279df78421b8c6c2efb8df18e00\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "cubic_bad787c53fa02a5559fe570238fdb23a\n", + "\n", + "cubic=True\n", + "\n", + "\n", + "\n", + "cubic_bad787c53fa02a5559fe570238fdb23a->structure_8a946279df78421b8c6c2efb8df18e00\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "calculation_77b75a01e65d83962d14fa8a882d6c34\n", + "\n", + "calculation=vc-relax\n", + "\n", + "\n", + "\n", + "calculation_77b75a01e65d83962d14fa8a882d6c34->input_dict_2f4bdfa637c1310ad67c1dbef51e42fc\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "kpts_e961a9390797b0f6f8887a402ea3e9aa\n", + "\n", + "kpts=[3, 3, 3]\n", + "\n", + "\n", + "\n", + "kpts_e961a9390797b0f6f8887a402ea3e9aa->input_dict_2104e1cd318f16e37db9c8fc50b44bf7\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "kpts_e961a9390797b0f6f8887a402ea3e9aa->input_dict_2f4bdfa637c1310ad67c1dbef51e42fc\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "kpts_e961a9390797b0f6f8887a402ea3e9aa->input_dict_b90e408f5e84971a0acbe801ef8e7167\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "kpts_e961a9390797b0f6f8887a402ea3e9aa->input_dict_09a5f6ff4398ee33f2c690b496ea0142\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "kpts_e961a9390797b0f6f8887a402ea3e9aa->input_dict_b75fbdc25556c6a295e00bd54557cdf3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "kpts_e961a9390797b0f6f8887a402ea3e9aa->input_dict_dff830eead42379c139eeb9148710ae8\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "1_6ad77da55455ab9aa590aedabc104f68\n", + "\n", + "1=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def648f0>\n", + "\n", + "\n", + "\n", + "input_dict_b90e408f5e84971a0acbe801ef8e7167->1_6ad77da55455ab9aa590aedabc104f68\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "1_f7ad5955f13722bf930d81c2b9e742e9\n", + "\n", + "1=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47a40>\n", + "\n", + "\n", + "\n", + "input_dict_b90e408f5e84971a0acbe801ef8e7167->1_f7ad5955f13722bf930d81c2b9e742e9\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2_e195a45cae0bfce238475e97d9a58cd5\n", + "\n", + "2=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def64c20>\n", + "\n", + "\n", + "\n", + "input_dict_09a5f6ff4398ee33f2c690b496ea0142->2_e195a45cae0bfce238475e97d9a58cd5\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2_112c792629e86543b9cea4a872270624\n", + "\n", + "2=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47350>\n", + "\n", + "\n", + "\n", + "input_dict_09a5f6ff4398ee33f2c690b496ea0142->2_112c792629e86543b9cea4a872270624\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "3_a983b77487f6859f18062f31bb895319\n", + "\n", + "3=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def647a0>\n", + "\n", + "\n", + "\n", + "input_dict_b75fbdc25556c6a295e00bd54557cdf3->3_a983b77487f6859f18062f31bb895319\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "3_f629cc0dcbd5dc353789776418f3701f\n", + "\n", + "3=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def473b0>\n", + "\n", + "\n", + "\n", + "input_dict_b75fbdc25556c6a295e00bd54557cdf3->3_f629cc0dcbd5dc353789776418f3701f\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "4_c9c83b9132566cff0bc7068536ede7ca\n", + "\n", + "4=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def64da0>\n", + "\n", + "\n", + "\n", + "input_dict_dff830eead42379c139eeb9148710ae8->4_c9c83b9132566cff0bc7068536ede7ca\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "4_4d455a4b322d423d9821fbd74191eb62\n", + "\n", + "4=<pyiron_base.project.delayed.DelayedObject object at 0x7b15def47050>\n", + "\n", + "\n", + "\n", + "input_dict_dff830eead42379c139eeb9148710ae8->4_4d455a4b322d423d9821fbd74191eb62\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "pseudopotentials_453cdcc0d627a851e196cd899d956d10\n", + "\n", + "pseudopotentials={'Al': 'Al.pbe-n-kjpaw_psl.1.0.0.UPF'}\n", + "\n", + "\n", + "\n", + "pseudopotentials_453cdcc0d627a851e196cd899d956d10->input_dict_2104e1cd318f16e37db9c8fc50b44bf7\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "pseudopotentials_453cdcc0d627a851e196cd899d956d10->input_dict_2f4bdfa637c1310ad67c1dbef51e42fc\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "pseudopotentials_453cdcc0d627a851e196cd899d956d10->input_dict_b90e408f5e84971a0acbe801ef8e7167\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "pseudopotentials_453cdcc0d627a851e196cd899d956d10->input_dict_09a5f6ff4398ee33f2c690b496ea0142\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "pseudopotentials_453cdcc0d627a851e196cd899d956d10->input_dict_b75fbdc25556c6a295e00bd54557cdf3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "pseudopotentials_453cdcc0d627a851e196cd899d956d10->input_dict_dff830eead42379c139eeb9148710ae8\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "smearing_64a632a7e5bfbb7d0c6face9b82082a9\n", + "\n", + "smearing=0.02\n", + "\n", + "\n", + "\n", + "smearing_64a632a7e5bfbb7d0c6face9b82082a9->input_dict_2104e1cd318f16e37db9c8fc50b44bf7\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "smearing_64a632a7e5bfbb7d0c6face9b82082a9->input_dict_2f4bdfa637c1310ad67c1dbef51e42fc\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "smearing_64a632a7e5bfbb7d0c6face9b82082a9->input_dict_b90e408f5e84971a0acbe801ef8e7167\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "smearing_64a632a7e5bfbb7d0c6face9b82082a9->input_dict_09a5f6ff4398ee33f2c690b496ea0142\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "smearing_64a632a7e5bfbb7d0c6face9b82082a9->input_dict_b75fbdc25556c6a295e00bd54557cdf3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "smearing_64a632a7e5bfbb7d0c6face9b82082a9->input_dict_dff830eead42379c139eeb9148710ae8\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "working_directory_a17ade9a563d8dcadb655fb2e1c743a7\n", + "\n", + "working_directory=mini\n", + "\n", + "\n", + "\n", + "working_directory_a17ade9a563d8dcadb655fb2e1c743a7->structure_a2e153ee6a338726bca4488fd55e61d3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "strain_lst_2d8c38dac8f1aeeeecfa3c0b1cc8a781\n", + "\n", + "strain_lst=[0.9, 0.95, 1.0, 1.05, 1.1]\n", + "\n", + "\n", + "\n", + "strain_lst_2d8c38dac8f1aeeeecfa3c0b1cc8a781->structure_8ec2a7af77e9d22260dc56b435bba70b\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "strain_lst_2d8c38dac8f1aeeeecfa3c0b1cc8a781->structure_c401a7118deb546adf8cacc894a995d4\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "strain_lst_2d8c38dac8f1aeeeecfa3c0b1cc8a781->structure_503093210fb645799cb9c53a6111f31d\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "strain_lst_2d8c38dac8f1aeeeecfa3c0b1cc8a781->structure_feae982cf556b8d382334d6cbdf1cd8d\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "strain_lst_2d8c38dac8f1aeeeecfa3c0b1cc8a781->structure_d63e04359ed4866d6c7b37b920475e13\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "calculation_bc91e0ce7227762f507f47b85f2f0a83\n", + "\n", + "calculation=scf\n", + "\n", + "\n", + "\n", + "calculation_bc91e0ce7227762f507f47b85f2f0a83->input_dict_2104e1cd318f16e37db9c8fc50b44bf7\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "calculation_bc91e0ce7227762f507f47b85f2f0a83->input_dict_b90e408f5e84971a0acbe801ef8e7167\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "calculation_bc91e0ce7227762f507f47b85f2f0a83->input_dict_09a5f6ff4398ee33f2c690b496ea0142\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "calculation_bc91e0ce7227762f507f47b85f2f0a83->input_dict_b75fbdc25556c6a295e00bd54557cdf3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "calculation_bc91e0ce7227762f507f47b85f2f0a83->input_dict_dff830eead42379c139eeb9148710ae8\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "working_directory_2e9abb255f1a31f7d29b4451ad422add\n", + "\n", + "working_directory=strain_0\n", + "\n", + "\n", + "\n", + "working_directory_2e9abb255f1a31f7d29b4451ad422add->0_e81e45d48628cffd23c97591d4742381\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "working_directory_2e9abb255f1a31f7d29b4451ad422add->0_79d0e65e922efc9f26386930f67b4593\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "1_6ad77da55455ab9aa590aedabc104f68->volume_lst_7877f4496713e91ee9569a3d39477944\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "1_f7ad5955f13722bf930d81c2b9e742e9->energy_lst_c39c096e088c6198246309199a06e31a\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "working_directory_5423d2cc67129a6d0383af6f347df5bd\n", + "\n", + "working_directory=strain_1\n", + "\n", + "\n", + "\n", + "working_directory_5423d2cc67129a6d0383af6f347df5bd->1_6ad77da55455ab9aa590aedabc104f68\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "working_directory_5423d2cc67129a6d0383af6f347df5bd->1_f7ad5955f13722bf930d81c2b9e742e9\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2_e195a45cae0bfce238475e97d9a58cd5->volume_lst_7877f4496713e91ee9569a3d39477944\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2_112c792629e86543b9cea4a872270624->energy_lst_c39c096e088c6198246309199a06e31a\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "working_directory_cc646e064ddfc4b2811aba3d86d27992\n", + "\n", + "working_directory=strain_2\n", + "\n", + "\n", + "\n", + "working_directory_cc646e064ddfc4b2811aba3d86d27992->2_e195a45cae0bfce238475e97d9a58cd5\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "working_directory_cc646e064ddfc4b2811aba3d86d27992->2_112c792629e86543b9cea4a872270624\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "3_a983b77487f6859f18062f31bb895319->volume_lst_7877f4496713e91ee9569a3d39477944\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "3_f629cc0dcbd5dc353789776418f3701f->energy_lst_c39c096e088c6198246309199a06e31a\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "working_directory_e27768d53df6cd8dc245c52054ecf31f\n", + "\n", + "working_directory=strain_3\n", + "\n", + "\n", + "\n", + "working_directory_e27768d53df6cd8dc245c52054ecf31f->3_a983b77487f6859f18062f31bb895319\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "working_directory_e27768d53df6cd8dc245c52054ecf31f->3_f629cc0dcbd5dc353789776418f3701f\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "4_c9c83b9132566cff0bc7068536ede7ca->volume_lst_7877f4496713e91ee9569a3d39477944\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "4_4d455a4b322d423d9821fbd74191eb62->energy_lst_c39c096e088c6198246309199a06e31a\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "working_directory_72bba39b22d2b7ce154d37c7e8c658b7\n", + "\n", + "working_directory=strain_4\n", + "\n", + "\n", + "\n", + "working_directory_72bba39b22d2b7ce154d37c7e8c658b7->4_c9c83b9132566cff0bc7068536ede7ca\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "working_directory_72bba39b22d2b7ce154d37c7e8c658b7->4_4d455a4b322d423d9821fbd74191eb62\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "energy_lst_c39c096e088c6198246309199a06e31a->create_function_job_81ad14ceddd174cc2129a2d071b8dfeb\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] }, - "metadata": {} + "metadata": {}, + "output_type": "display_data" } ], - "execution_count": 23 + "source": [ + "delayed_object_lst = load_workflow_json(file_name=workflow_json_filename)\n", + "delayed_object_lst[-1].draw()" + ] }, { "cell_type": "code", - "source": "delayed_object_lst[0].input['a'] = 4.05", + "execution_count": 24, "metadata": { "trusted": true }, "outputs": [], - "execution_count": 24 + "source": [ + "delayed_object_lst[0].input['a'] = 4.05" + ] }, { "cell_type": "code", - "source": "delayed_object_lst[-1].pull()", + "execution_count": 25, "metadata": { "trusted": true }, @@ -405,87 +2092,154 @@ { "name": "stdout", "output_type": "stream", - "text": "The job get_bulk_structure_f1e730ed97e30e5439e855d2ac41396f was saved and received the ID: 1\nThe job get_dict_20400c1655d51731f9f5ffb50c2b401f was saved and received the ID: 2\nThe job calculate_qe_22b5d0934d89d8f08761e744e4612c30 was saved and received the ID: 3\n" + "text": [ + "The job get_bulk_structure_f1e730ed97e30e5439e855d2ac41396f was saved and received the ID: 1\n", + "The job get_dict_20400c1655d51731f9f5ffb50c2b401f was saved and received the ID: 2\n", + "The job calculate_qe_22b5d0934d89d8f08761e744e4612c30 was saved and received the ID: 3\n" + ] }, { "name": "stderr", "output_type": "stream", - "text": "[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01892] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\nNote: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n" + "text": [ + "[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01892] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n", + "Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n" + ] }, { "name": "stdout", "output_type": "stream", - "text": "The job generate_structures_6bbb6b6ae566b035388bec7f6f658394 was saved and received the ID: 4\nThe job get_dict_7fbef1423a72155d480420469f6f0f78 was saved and received the ID: 5\nThe job calculate_qe_35d4282b6beff7c2fc7a850e02ff3f07 was saved and received the ID: 6\n" + "text": [ + "The job generate_structures_6bbb6b6ae566b035388bec7f6f658394 was saved and received the ID: 4\n", + "The job get_dict_7fbef1423a72155d480420469f6f0f78 was saved and received the ID: 5\n", + "The job calculate_qe_35d4282b6beff7c2fc7a850e02ff3f07 was saved and received the ID: 6\n" + ] }, { "name": "stderr", "output_type": "stream", - "text": "[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01908] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\nNote: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n" + "text": [ + "[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01908] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n", + "Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n" + ] }, { "name": "stdout", "output_type": "stream", - "text": "The job get_dict_bcd13fb93bbd4d7a7a99c460c0591b51 was saved and received the ID: 7\nThe job calculate_qe_3159d3281f1fccbf1a91388144a7957f was saved and received the ID: 8\n" + "text": [ + "The job get_dict_bcd13fb93bbd4d7a7a99c460c0591b51 was saved and received the ID: 7\n", + "The job calculate_qe_3159d3281f1fccbf1a91388144a7957f was saved and received the ID: 8\n" + ] }, { "name": "stderr", "output_type": "stream", - "text": "[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01919] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\nNote: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n" + "text": [ + "[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01919] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n", + "Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n" + ] }, { "name": "stdout", "output_type": "stream", - "text": "The job get_dict_5b1eeb4af2f8eb4018b7326f4af63eca was saved and received the ID: 9\nThe job calculate_qe_4d1c131dceca1e8897f7cda47cb24f9e was saved and received the ID: 10\n" + "text": [ + "The job get_dict_5b1eeb4af2f8eb4018b7326f4af63eca was saved and received the ID: 9\n", + "The job calculate_qe_4d1c131dceca1e8897f7cda47cb24f9e was saved and received the ID: 10\n" + ] }, { "name": "stderr", "output_type": "stream", - "text": "[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01930] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\nNote: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n" + "text": [ + "[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01930] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n", + "Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n" + ] }, { "name": "stdout", "output_type": "stream", - "text": "The job get_dict_566acb6c9830b82fd09efc4e8227e6e6 was saved and received the ID: 11\nThe job calculate_qe_e463d009aee35caa551669d8efc7c8cd was saved and received the ID: 12\n" + "text": [ + "The job get_dict_566acb6c9830b82fd09efc4e8227e6e6 was saved and received the ID: 11\n", + "The job calculate_qe_e463d009aee35caa551669d8efc7c8cd was saved and received the ID: 12\n" + ] }, { "name": "stderr", "output_type": "stream", - "text": "[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01941] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\nNote: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n" + "text": [ + "[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01941] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n", + "Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n" + ] }, { "name": "stdout", "output_type": "stream", - "text": "The job get_dict_75499df774616aa1b379a3fa72da90fb was saved and received the ID: 13\nThe job calculate_qe_6ef5649cee1f8db43ecd79d266f477b5 was saved and received the ID: 14\n" + "text": [ + "The job get_dict_75499df774616aa1b379a3fa72da90fb was saved and received the ID: 13\n", + "The job calculate_qe_6ef5649cee1f8db43ecd79d266f477b5 was saved and received the ID: 14\n" + ] }, { "name": "stderr", "output_type": "stream", - "text": "[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01953] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\nNote: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n" + "text": [ + "[jupyter-pyiron-dev-pyth-flow-definition-5x990k36:01953] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n", + "Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n" + ] }, { "name": "stdout", "output_type": "stream", - "text": "The job get_list_5d2e404624b12c3bb1f93528d1b1dddb was saved and received the ID: 15\nThe job get_list_8628ae553e40ba9aab5dde25ea2d7ba2 was saved and received the ID: 16\nThe job plot_energy_volume_curve_d715578098aa2e6221fb76f20377b5cf was saved and received the ID: 17\n" + "text": [ + "The job get_list_5d2e404624b12c3bb1f93528d1b1dddb was saved and received the ID: 15\n", + "The job get_list_8628ae553e40ba9aab5dde25ea2d7ba2 was saved and received the ID: 16\n", + "The job plot_energy_volume_curve_d715578098aa2e6221fb76f20377b5cf was saved and received the ID: 17\n" + ] }, { - "output_type": "display_data", "data": { - "text/plain": "
", - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAksAAAHACAYAAACyIiyEAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAW/BJREFUeJzt3XlcVXXCx/HPZReUi8omgqC5AO5LKmZp5ZpLWpltmFZOzYwtVlb2tDht2t6UbdOUtttoWrZRmtrkgjuuCLjgwubKIsh6z/MHwkQiKsI9XPi+X6/7eh4u51y+98Rcvv5+5/yOxTAMAxERERGplJPZAURERETqMpUlERERkSqoLImIiIhUQWVJREREpAoqSyIiIiJVUFkSERERqYLKkoiIiEgVVJZEREREqqCyJCIiIlIFlSURERGRKqgsmeT555+nX79+eHp64uPjc177GIbBjBkzCAoKolGjRgwcOJAdO3aUfz85ORmLxVLpY/78+We8XkFBAd26dcNisRAXF3dB+d999126dOmCt7c33t7eREVF8dNPP13Qa4iIiDgClSWTFBYWMm7cOP7617+e9z4vvfQSr732GrNnz2b9+vUEBgYyePBgcnJyAAgJCSEtLa3C4x//+AdeXl4MHz78jNd75JFHCAoKqlb+4OBgZs2axYYNG9iwYQNXXXUV1157bYXyJiIiUi8YYqo5c+YYVqv1nNvZbDYjMDDQmDVrVvlz+fn5htVqNd57772z7tetWzfjjjvuOOP5H3/80QgPDzd27NhhAMbmzZsrfH/Hjh3G8OHDDS8vL8Pf39+47bbbjCNHjlSZsWnTpsa///3vc74XERERR6KRJQexb98+0tPTGTJkSPlz7u7uDBgwgNWrV1e6z8aNG4mLi+POO++s8HxGRgaTJ0/m008/xdPT84z90tLSGDBgAN26dWPDhg3ExMSQkZHBjTfeWOnPKSkpYd68eeTm5hIVFXUR71JERKTucTE7gJyf9PR0AAICAio8HxAQwP79+yvd58MPPyQiIoJ+/fqVP2cYBhMnTuSee+6hV69eJCcnn7Hfu+++S48ePXjhhRfKn/voo48ICQkhMTGR9u3bA7Bt2zaioqLIz8+ncePGLFq0iMjIyIt9qyIiInWKRpZq0IwZM856gnXZY8OGDRf1MywWS4WvDcM44zmAU6dO8cUXX5wxqvTWW2+RnZ3N9OnTz/ozNm7cyPLly2ncuHH5Izw8HIA9e/aUb9ehQwfi4uKIjY3lr3/9K7fffjs7d+68mLcnIiJS52hkqQZNmTKFm266qcptwsLCqvXagYGBQOkIU4sWLcqfP3z48BmjTQALFiwgLy+PCRMmVHh+2bJlxMbG4u7uXuH5Xr16ceutt/Lxxx9js9kYNWoUL7744hmv+8ef7ebmRtu2bcv3X79+Pf/85z95//33q/UeRURE6iKVpRrk6+uLr69vrbx269atCQwMZMmSJXTv3h0ovaLut99+q7TUfPjhh4wePRo/P78Kz7/55ps899xz5V+npqYydOhQvvrqK/r06QNAjx49+PrrrwkLC8PF5fx/RQzDoKCgoDpvT0REpM5SWTLJgQMHOH78OAcOHKCkpKR8naO2bdvSuHFjAMLDw5k5cyZjx47FYrHwwAMP8MILL9CuXTvatWvHCy+8gKenJ7fcckuF1969ezf//e9/+fHHH8/4ua1atarwddnPuuSSSwgODgbg73//Ox988AE333wz06ZNw9fXl927dzNv3jw++OADnJ2defzxxxk+fDghISHk5OQwb948VqxYQUxMTE0fKhEREVOpLJnkqaee4uOPPy7/umy0aPny5QwcOBCAhIQEsrKyyrd55JFHOHXqFH/72984ceIEffr04ZdffqFJkyYVXvujjz6iZcuWFa6cuxBBQUGsWrWKRx99lKFDh1JQUEBoaCjDhg3Dyan0NLeMjAyio6NJS0vDarXSpUsXYmJiGDx4cLV+poiISF1lMQzDMDuEiIiISF2lq+FEREREqqCyJCIiIlIFnbNUA2w2G6mpqTRp0qTSNY9ERESk7jEMg5ycHIKCgsrPya2MylINSE1NJSQkxOwYIiIiUg0HDx4svyK8MipLNaDsarSDBw/i7e1tchoRERE5H9nZ2YSEhJxxVfmfqSzVgLKpN29vb5UlERERB3OuU2h0greIiIhIFVSWRERERKqgsiQiIiJSBZUlERERkSqoLImIiIhUQWVJREREpAoqSyIiIiJVUFkSERERqYLKkoiIiEgVVJZEREREqqCyJCIiIlIFlSURERGRKqgs1WGGYbBu33HyCovNjiIiItJgqSzVYX/9bBM3vr+GRZtTzI4iIiLSYKks1WG9wpoCMHdVMoZhmJxGRESkYVJZqsNuvDQELzdnkg6fZNXu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Z2z/xhtvYLHo/k4iIiJSkUOs4B0fH09MTAyxsbH06dMHgA8++ICoqCgSEhLo0KHDGfskJSURGxvL9u3b6dixIwDvvPMO/v7+fPnll9x1113l227ZsoXXXnuN9evX06JFC/u8KREREXEIDjGytGbNGqxWa3lRAujbty9Wq5XVq1dXuk9BQQEAHh4e5c85Ozvj5ubGypUry5/Ly8vj5ptvZvbs2QQGBtbSOxARERFH5RBlKT09HX9//zOe9/f3Jz09vdJ9wsPDCQ0NZfr06Zw4cYLCwkJmzZpFeno6aWlp5dtNnTqVfv36ce211553noKCArKzsys8REREpH4ytSzNmDEDi8VS5WPDhg0AlZ5PZBjGWc8zcnV15euvvyYxMZFmzZrh6enJihUrGD58OM7OzgAsXryYZcuW8cYbb1xQ7pkzZ5afaG61WgkJCbmwNy4iIiIOw9RzlqZMmcJNN91U5TZhYWFs3bqVjIyMM7535MgRAgICzrpvz549iYuLIysri8LCQvz8/OjTpw+9evUCYNmyZezZswcfH58K+11//fVcfvnlrFixotLXnT59Og8++GD519nZ2SpMIiIi9ZTFMAzD7BDnEh8fT2RkJGvXrqV3794ArF27lr59+7Jr165KT/CuTFJSEuHh4fz0008MGTKE9PR0jh49WmGbzp07889//pNRo0bRunXr83rd871rsYiIiNQd5/v32yGuhouIiGDYsGFMnjyZ999/H4C//OUvjBw5skJRCg8PZ+bMmYwdOxaA+fPn4+fnR6tWrdi2bRv3338/Y8aMYciQIQAEBgZWelJ3q1atzrsoQel0IKBzl0RERBxI2d/tc40bOURZAvj888+57777yovO6NGjmT17doVtEhISyMrKKv86LS2NBx98kIyMDFq0aMGECRN48sknazxbTk4OgKbiREREHFBOTg5Wq/Ws33eIabi6zmazkZqaSpMmTerEwpZl51AdPHhQ04LoePyZjseZdEwq0vGoSMejovp0PAzDICcnh6CgIJyczn7Nm8OMLNVlTk5OBAcHmx3jDN7e3g7/i1yTdDwq0vE4k45JRToeFel4VFRfjkdVI0plHGKdJRERERGzqCyJiIiIVEFlqR5yd3fn6aefxt3d3ewodYKOR0U6HmfSMalIx6MiHY+KGuLx0AneIiIiIlXQyJKIiIhIFVSWRERERKqg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WRIRERGpgsqSiIiISBVUlkRERESqoLIkIiIiUgWVJREREZEqqCyJiIiIVEFlSUQatLCwMN544w2zY4hIHaayJCIOa9SoUQwaNKjS761ZswaLxcKmTZvsnEpE6huVJRFxWHfeeSfLli1j//79Z3zvo48+olu3bvTo0cOEZCJSn6gsiYjDGjlyJP7+/sydO7fC83l5eXz11VfceeedfP3113Ts2BF3d3fCwsJ49dVXz/p6ycnJWCwW4uLiyp/LzMzEYrGwYsUKAFasWIHFYuHnn3+me/fuNGrUiKuuuorDhw/z008/ERERgbe3NzfffDN5eXnlr2MYBi+99BJt2rShUaNGdO3alQULFtTk4RCRWqKyJCIOy8XFhQkTJjB37lz+eE/w+fPnU1hYSFRUFDfeeCM33XQT27ZtY8aMGTz55JNnlKvqmDFjBrNnz2b16tUcPHiQG2+8kTfeeIMvvviCH374gSVLlvDWW2+Vb//EE08wZ84c3n33XXbs2MHUqVO57bbb+O233y46i4jULovxx08YEREHs2vXLiIiIli2bBlXXnklAAMGDKBly5ZYLBaOHDnCL7/8Ur79I488wg8//MCOHTuA0hO8H3jgAR544AGSk5Np3bo1mzdvplu3bkDpyFLTpk1Zvnw5AwcOZMWKFVx55ZUsXbqUq6++GoBZs2Yxffp09uzZQ5s2bQC45557SE5OJiYmhtzcXHx9fVm2bBlRUVHlWe666y7y8vL44osv7HGoRKSaNLIkIg4tPDycfv368dFHHwGwZ88efv/9d+644w7i4+O57LLLKmx/2WWXkZSURElJyUX93C5dupT//wEBAXh6epYXpbLnDh8+DMDOnTvJz89n8ODBNG7cuPzxySefsGfPnovKISK1z8XsACIiF+vOO+9kypQpvP3228yZM4fQ0FCuvvpqDMPAYrFU2LaqwXQnJ6cztikqKqp0W1dX1/L/32KxVPi67DmbzQZQ/n9/+OEHWrZsWWE7d3f3c709ETGZRpZExOHdeOONODs788UXX/Dxxx8zadIkLBYLkZGRrFy5ssK2q1evpn379jg7O5/xOn5+fgCkpaWVP/fHk72rKzIyEnd3dw4cOEDbtm0rPEJCQi769UWkdmlkSUQcXuPGjRk/fjyPP/44WVlZTJw4EYCHHnqISy+9lGeffZbx48ezZs0aZs+ezTvvvFPp6zRq1Ii+ffsya9YswsLCOHr0KE888cRF52vSpAkPP/wwU6dOxWaz0b9/f7Kzs1m9ejWNGzfm9ttvv+ifISK1RyNLIlIv3HnnnZw4cYJBgwbRqlUrAHr06MF//vMf5s2bR6dOnXjqqad45plnystUZT766COKioro1asX999/P88991yN5Hv22Wd56qmnmDlzJhEREQwdOpTvvvuO1q1b18jri0jt0dVwIiIiIlXQyJKIiIhIFVSWRERERKqgsiQiIiJSBZUlERERkSqoLImIiIhUQWVJREREpAoqSyIiIiJVUFkSERERqYLKkoiIiEgVVJZEREREqqCyJCIiIlIFlSURERGRKvw/FsCLm/9axZsAAAAASUVORK5CYII=" + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAksAAAHACAYAAACyIiyEAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAW/BJREFUeJzt3XlcVXXCx/HPZReUi8omgqC5AO5LKmZp5ZpLWpltmFZOzYwtVlb2tDht2t6UbdOUtttoWrZRmtrkgjuuCLjgwubKIsh6z/MHwkQiKsI9XPi+X6/7eh4u51y+98Rcvv5+5/yOxTAMAxERERGplJPZAURERETqMpUlERERkSqoLImIiIhUQWVJREREpAoqSyIiIiJVUFkSERERqYLKkoiIiEgVVJZEREREqqCyJCIiIlIFlSURERGRKqgsmeT555+nX79+eHp64uPjc177GIbBjBkzCAoKolGjRgwcOJAdO3aUfz85ORmLxVLpY/78+We8XkFBAd26dcNisRAXF3dB+d999126dOmCt7c33t7eREVF8dNPP13Qa4iIiDgClSWTFBYWMm7cOP7617+e9z4vvfQSr732GrNnz2b9+vUEBgYyePBgcnJyAAgJCSEtLa3C4x//+AdeXl4MHz78jNd75JFHCAoKqlb+4OBgZs2axYYNG9iwYQNXXXUV1157bYXyJiIiUi8YYqo5c+YYVqv1nNvZbDYjMDDQmDVrVvlz+fn5htVqNd57772z7tetWzfjjjvuOOP5H3/80QgPDzd27NhhAMbmzZsrfH/Hjh3G8OHDDS8vL8Pf39+47bbbjCNHjlSZsWnTpsa///3vc74XERERR6KRJQexb98+0tPTGTJkSPlz7u7uDBgwgNWrV1e6z8aNG4mLi+POO++s8HxGRgaTJ0/m008/xdPT84z90tLSGDBgAN26dWPDhg3ExMSQkZHBjTfeWOnPKSkpYd68eeTm5hIVFXUR71JERKTucTE7gJyf9PR0AAICAio8HxAQwP79+yvd58MPPyQiIoJ+/fqVP2cYBhMnTuSee+6hV69eJCcnn7Hfu+++S48ePXjhhRfKn/voo48ICQkhMTGR9u3bA7Bt2zaioqLIz8+ncePGLFq0iMjIyIt9qyIiInWKRpZq0IwZM856gnXZY8OGDRf1MywWS4WvDcM44zmAU6dO8cUXX5wxqvTWW2+RnZ3N9OnTz/ozNm7cyPLly2ncuHH5Izw8HIA9e/aUb9ehQwfi4uKIjY3lr3/9K7fffjs7d+68mLcnIiJS52hkqQZNmTKFm266qcptwsLCqvXagYGBQOkIU4sWLcqfP3z48BmjTQALFiwgLy+PCRMmVHh+2bJlxMbG4u7uXuH5Xr16ceutt/Lxxx9js9kYNWoUL7744hmv+8ef7ebmRtu2bcv3X79+Pf/85z95//33q/UeRURE6iKVpRrk6+uLr69vrbx269atCQwMZMmSJXTv3h0ovaLut99+q7TUfPjhh4wePRo/P78Kz7/55ps899xz5V+npqYydOhQvvrqK/r06QNAjx49+PrrrwkLC8PF5fx/RQzDoKCgoDpvT0REpM5SWTLJgQMHOH78OAcOHKCkpKR8naO2bdvSuHFjAMLDw5k5cyZjx47FYrHwwAMP8MILL9CuXTvatWvHCy+8gKenJ7fcckuF1969ezf//e9/+fHHH8/4ua1atarwddnPuuSSSwgODgbg73//Ox988AE333wz06ZNw9fXl927dzNv3jw++OADnJ2defzxxxk+fDghISHk5OQwb948VqxYQUxMTE0fKhEREVOpLJnkqaee4uOPPy7/umy0aPny5QwcOBCAhIQEsrKyyrd55JFHOHXqFH/72984ceIEffr04ZdffqFJkyYVXvujjz6iZcuWFa6cuxBBQUGsWrWKRx99lKFDh1JQUEBoaCjDhg3Dyan0NLeMjAyio6NJS0vDarXSpUsXYmJiGDx4cLV+poiISF1lMQzDMDuEiIiISF2lq+FEREREqqCyJCIiIlIFnbNUA2w2G6mpqTRp0qTSNY9ERESk7jEMg5ycHIKCgsrPya2MylINSE1NJSQkxOwYIiIiUg0HDx4svyK8MipLNaDsarSDBw/i7e1tchoRERE5H9nZ2YSEhJxxVfmfqSzVgLKpN29vb5UlERERB3OuU2h0greIiIhIFVSWRERERKqgsiQiIiJSBZUlERERkSqoLImIiIhUQWVJREREpAoqSyIiIiJVUFkSERERqYLKkoiIiEgVVJZEREREqqCyJCIiIlIFlSURERGRKqgs1WGGYbBu33HyCovNjiIiItJgqSzVYX/9bBM3vr+GRZtTzI4iIiLSYKks1WG9wpoCMHdVMoZhmJxGRESkYVJZqsNuvDQELzdnkg6fZNXu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Z2z/xhtvYLHo/k4iIiJSkUOs4B0fH09MTAyxsbH06dMHgA8++ICoqCgSEhLo0KHDGfskJSURGxvL9u3b6dixIwDvvPMO/v7+fPnll9x1113l227ZsoXXXnuN9evX06JFC/u8KREREXEIDjGytGbNGqxWa3lRAujbty9Wq5XVq1dXuk9BQQEAHh4e5c85Ozvj5ubGypUry5/Ly8vj5ptvZvbs2QQGBtbSOxARERFH5RBlKT09HX9//zOe9/f3Jz09vdJ9wsPDCQ0NZfr06Zw4cYLCwkJmzZpFeno6aWlp5dtNnTqVfv36ce211553noKCArKzsys8REREpH4ytSzNmDEDi8VS5WPDhg0AlZ5PZBjGWc8zcnV15euvvyYxMZFmzZrh6enJihUrGD58OM7OzgAsXryYZcuW8cYbb1xQ7pkzZ5afaG61WgkJCbmwNy4iIiIOw9RzlqZMmcJNN91U5TZhYWFs3bqVjIyMM7535MgRAgICzrpvz549iYuLIysri8LCQvz8/OjTpw+9evUCYNmyZezZswcfH58K+11//fVcfvnlrFixotLXnT59Og8++GD519nZ2SpMIiIi9ZTFMAzD7BDnEh8fT2RkJGvXrqV3794ArF27lr59+7Jr165KT/CuTFJSEuHh4fz0008MGTKE9PR0jh49WmGbzp07889//pNRo0bRunXr83rd871rsYiIiNQd5/v32yGuhouIiGDYsGFMnjyZ999/H4C//OUvjBw5skJRCg8PZ+bMmYwdOxaA+fPn4+fnR6tWrdi2bRv3338/Y8aMYciQIQAEBgZWelJ3q1atzrsoQel0IKBzl0RERBxI2d/tc40bOURZAvj888+57777yovO6NGjmT17doVtEhISyMrKKv86LS2NBx98kIyMDFq0aMGECRN48sknazxbTk4OgKbiREREHFBOTg5Wq/Ws33eIabi6zmazkZqaSpMmTerEwpZl51AdPHhQ04LoePyZjseZdEwq0vGoSMejovp0PAzDICcnh6CgIJyczn7Nm8OMLNVlTk5OBAcHmx3jDN7e3g7/i1yTdDwq0vE4k45JRToeFel4VFRfjkdVI0plHGKdJRERERGzqCyJiIiIVEFlqR5yd3fn6aefxt3d3ewodYKOR0U6HmfSMalIx6MiHY+KGuLx0AneIiIiIlXQyJKIiIhIFVSWRERERKqgsiQiIiJSBZUlB5aSksJtt91G8+bN8fT0pFu3bmzcuLH8+4ZhMGPGDIKCgmjUqBEDBw5kx44dJiauXVUdj6KiIh599FE6d+6Ml5cXQUFBTJgwgdTUVJNT165z/Y780d13343FYuGNN96wb0g7Op/jER8fz+jRo7FarTRp0oS+ffty4MABkxLXrnMdj5MnTzJlyhSCg4Np1KgRERERvPvuuyYmrj1hYWFYLJYzHn//+9+Bhvd5WtXxaIifpypLDurEiRNcdtlluLq68tNPP7Fz505effVVfHx8yrd56aWXeO2115g9ezbr168nMDCQwYMHl9+epT451/HIy8tj06ZNPPnkk2zatImFCxeSmJjI6NGjzQ1ei87nd6TMN998w9q1awkKCrJ/UDs5n+OxZ88e+vfvT3h4OCtWrGDLli08+eSTeHh4mBe8lpzP8Zg6dSoxMTF89tlnxMfHM3XqVO69916+/fZb84LXkvXr15OWllb+WLJkCQDjxo0DGtbnKVR9PBri5ymGOKRHH33U6N+//1m/b7PZjMDAQGPWrFnlz+Xn5xtWq9V477337BHRrs51PCqzbt06AzD2799fS6nMdb7H5NChQ0bLli2N7du3G6Ghocbrr79e++FMcD7HY/z48cZtt91mp0TmOp/j0bFjR+OZZ56p8FyPHj2MJ554ojaj1Qn333+/cckllxg2m63BfZ5W5o/HozL1/fNUI0sOavHixfTq1Ytx48bh7+9P9+7d+eCDD8q/v2/fPtLT08tvPAyla2MMGDCA1atXmxG5Vp3reFQmKysLi8VS6UhLfXA+x8RmsxEdHc20adPo2LGjSUnt41zHw2az8cMPP9C+fXuGDh2Kv78/ffr04ZtvvjEvdC06n9+P/v37s3jxYlJSUjAMg+XLl5OYmMjQoUNNSm0fhYWFfPbZZ9xxxx1YLJYG93n6Z38+HpWp75+nGllyUO7u7oa7u7sxffp0Y9OmTcZ7771neHh4GB9//LFhGIaxatUqAzBSUlIq7Dd58mRjyJAhZkSuVec6Hn926tQpo2fPnsatt95q56T2cz7H5IUXXjAGDx5c/q/F+jyydK7jkZaWZgCGp6en8dprrxmbN282Zs6caVgsFmPFihUmp6955/P7UVBQYEyYMMEADBcXF8PNzc345JNPTExtH1999ZXh7Oxc/vnZ0D5P/+zPx+PPGsLnqcqSg3J1dTWioqIqPHfvvfcaffv2NQzjf//jTk1NrbDNXXfdZQwdOtRuOe3lXMfjjwoLC41rr73W6N69u5GVlWWviHZ3rmOyYcMGIyAgoMIHYH0uS+c6HikpKQZg3HzzzRW2GTVqlHHTTTfZLae9nM//Zl5++WWjffv2xuLFi40tW7YYb731ltG4cWNjyZIl9o5rV0OGDDFGjhxZ/nVD+zz9sz8fjz9qKJ+nmoZzUC1atCAyMrLCcxEREeVX7QQGBgKQnp5eYZvDhw8TEBBgn5B2dK7jUaaoqIgbb7yRffv2sWTJknpxx+yzOdcx+f333zl8+DCtWrXCxcUFFxcX9u/fz0MPPURYWJgJiWvXuY6Hr68vLi4u5/V7VB+c63icOnWKxx9/nNdee41Ro0bRpUsXpkyZwvjx43nllVfMiGwX+/fvZ+nSpdx1113lzzW0z9M/qux4lGlIn6cqSw7qsssuIyEhocJziYmJhIaGAtC6dWsCAwPLr2CA0nnn3377jX79+tk1qz2c63jA//6HnZSUxNKlS2nevLm9Y9rVuY5JdHQ0W7duJS4urvwRFBTEtGnT+Pnnn82IXKvOdTzc3Ny49NJLz/l7VF+c63gUFRVRVFSEk1PFPxPOzs7YbDa75bS3OXPm4O/vz4gRI8qfa2ifp39U2fGAhvd5qmk4B7Vu3TrDxcXFeP75542kpCTj888/Nzw9PY3PPvusfJtZs2YZVqvVWLhwobFt2zbj5ptvNlq0aGFkZ2ebmLx2nOt4FBUVGaNHjzaCg4ONuLg4Iy0trfxRUFBgcvracT6/I39Wn6fhzud4LFy40HB1dTX+9a9/GUlJScZbb71lODs7G7///ruJyWvH+RyPAQMGGB07djSWL19u7N2715gzZ47h4eFhvPPOOyYmrz0lJSVGq1atjEcfffSM7zWkz9MyZzseDfHzVGXJgX333XdGp06dDHd3dyM8PNz417/+VeH7NpvNePrpp43AwEDD3d3duOKKK4xt27aZlLb2VXU89u3bZwCVPpYvX25e6Fp2rt+RP6vPZckwzu94fPjhh0bbtm0NDw8Po2vXrsY333xjQlL7ONfxSEtLMyZOnGgEBQUZHh4eRocOHYxXX331rJePO7qff/7ZAIyEhIQzvtfQPk8N4+zHoyF+nloMwzDMGNESERERcQQ6Z0lERESkCipLIiIiIlVQWRIRERGpgsqSiIiISBVUlkRERESqoLIkIiIiUgWVJREREZEqqCyJiIiIVEFlSUQatLCwMN544w2zY4hIHaayJCIOa9SoUQwaNKjS761ZswaLxcKmTZvsnEpE6huVJRFxWHfeeSfLli1j//79Z3zvo48+olu3bvTo0cOEZCJSn6gsiYjDGjlyJP7+/sydO7fC83l5eXz11VfceeedfP3113Ts2BF3d3fCwsJ49dVXz/p6ycnJWCwW4uLiyp/LzMzEYrGwYsUKAFasWIHFYuHnn3+me/fuNGrUiKuuuorDhw/z008/ERERgbe3NzfffDN5eXnlr2MYBi+99BJt2rShUaNGdO3alQULFtTk4RCRWqKyJCIOy8XFhQkTJjB37lz+eE/w+fPnU1hYSFRUFDfeeCM33XQT27ZtY8aMGTz55JNnlKvqmDFjBrNnz2b16tUcPHiQG2+8kTfeeIMvvviCH374gSVLlvDWW2+Vb//EE08wZ84c3n33XXbs2MHUqVO57bbb+O233y46i4jULovxx08YEREHs2vXLiIiIli2bBlXXnklAAMGDKBly5ZYLBaOHDnCL7/8Ur79I488wg8//MCOHTuA0hO8H3jgAR544AGSk5Np3bo1mzdvplu3bkDpyFLTpk1Zvnw5AwcOZMWKFVx55ZUsXbqUq6++GoBZs2Yxffp09uzZQ5s2bQC45557SE5OJiYmhtzcXHx9fVm2bBlRUVHlWe666y7y8vL44osv7HGoRKSaNLIkIg4tPDycfv368dFHHwGwZ88efv/9d+644w7i4+O57LLLKmx/2WWXkZSURElJyUX93C5dupT//wEBAXh6epYXpbLnDh8+DMDOnTvJz89n8ODBNG7cuPzxySefsGfPnovKISK1z8XsACIiF+vOO+9kypQpvP3228yZM4fQ0FCuvvpqDMPAYrFU2LaqwXQnJ6cztikqKqp0W1dX1/L/32KxVPi67DmbzQZQ/n9/+OEHWrZsWWE7d3f3c709ETGZRpZExOHdeOONODs788UXX/Dxxx8zadIkLBYLkZGRrFy5ssK2q1evpn379jg7O5/xOn5+fgCkpaWVP/fHk72rKzIyEnd3dw4cOEDbtm0rPEJCQi769UWkdmlkSUQcXuPGjRk/fjyPP/44WVlZTJw4EYCHHnqISy+9lGeffZbx48ezZs0aZs+ezTvvvFPp6zRq1Ii+ffsya9YswsLCOHr0KE888cRF52vSpAkPP/wwU6dOxWaz0b9/f7Kzs1m9ejWNGzfm9ttvv+ifISK1RyNLIlIv3HnnnZw4cYJBgwbRqlUrAHr06MF//vMf5s2bR6dOnXjqqad45plnystUZT766COKioro1asX999/P88991yN5Hv22Wd56qmnmDlzJhEREQwdOpTvvvuO1q1b18jri0jt0dVwIiIiIlXQyJKIiIhIFVSWRERERKqgsiQiIiJSBZUlERERkSqoLImIiIhUQWVJREREpAoqSyIiIiJVUFkSERERqYLKkoiIiEgVVJZEREREqqCyJCIiIlIFlSURERGRKvw/FsCLm/9axZsAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] }, - "metadata": {} + "metadata": {}, + "output_type": "display_data" } ], - "execution_count": 25 + "source": [ + "delayed_object_lst[-1].pull()" + ] }, { "cell_type": "code", - "source": "", + "execution_count": null, "metadata": { "trusted": true }, "outputs": [], - "execution_count": null + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "ADIS", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" } - ] + }, + "nbformat": 4, + "nbformat_minor": 4 } diff --git a/python_workflow_definition/pyproject.toml b/python_workflow_definition/pyproject.toml index 3f12642..736a71d 100644 --- a/python_workflow_definition/pyproject.toml +++ b/python_workflow_definition/pyproject.toml @@ -20,6 +20,8 @@ dependencies = [ "numpy>=1.21,<2", "jobflow>=0.1.18,<=0.1.19", "pyiron_base>=0.11.10,<=0.11.11", + "pydantic", + "rich", ] [project.optional-dependencies] diff --git a/python_workflow_definition/src/python_workflow_definition/aiida.py b/python_workflow_definition/src/python_workflow_definition/aiida.py index c3fbf12..ca605a1 100644 --- a/python_workflow_definition/src/python_workflow_definition/aiida.py +++ b/python_workflow_definition/src/python_workflow_definition/aiida.py @@ -1,138 +1,631 @@ from importlib import import_module -import json -import traceback +from typing import Dict, Any, Union, List, Tuple, Optional +import logging + from aiida import orm -from aiida_pythonjob.data.serializer import general_serializer -from aiida_workgraph import WorkGraph, task +from aiida_workgraph import WorkGraph +from aiida_workgraph.task import Task from aiida_workgraph.socket import TaskSocketNamespace - -from python_workflow_definition.shared import ( - convert_nodes_list_to_dict, - NODES_LABEL, - EDGES_LABEL, - SOURCE_LABEL, - SOURCE_PORT_LABEL, - TARGET_LABEL, - TARGET_PORT_LABEL, +from aiida_pythonjob.data.serializer import general_serializer +from python_workflow_definition.models import ( + PwdWorkflow, + PwdNode, + PwdEdge, + PwdFunctionNode, + PwdInputNode, + PwdOutputNode, + INTERNAL_DEFAULT_HANDLE, ) -def load_workflow_json(file_name: str) -> WorkGraph: - with open(file_name) as f: - data = json.load(f) - - wg = WorkGraph() - task_name_mapping = {} - - for id, identifier in convert_nodes_list_to_dict( - nodes_list=data[NODES_LABEL] - ).items(): - if isinstance(identifier, str) and "." in identifier: - p, m = identifier.rsplit(".", 1) - mod = import_module(p) - func = getattr(mod, m) - wg.add_task(func) - # Remove the default result output, because we will add the outputs later from the data in the link - del wg.tasks[-1].outputs["result"] - task_name_mapping[id] = wg.tasks[-1] - else: - # data task - data_node = general_serializer(identifier) - task_name_mapping[id] = data_node - - # add links - for link in data[EDGES_LABEL]: - to_task = task_name_mapping[str(link[TARGET_LABEL])] - # if the input is not exit, it means we pass the data into to the kwargs - # in this case, we add the input socket - if link[TARGET_PORT_LABEL] not in to_task.inputs: - to_socket = to_task.add_input("workgraph.any", name=link[TARGET_PORT_LABEL]) - else: - to_socket = to_task.inputs[link[TARGET_PORT_LABEL]] - from_task = task_name_mapping[str(link[SOURCE_LABEL])] - if isinstance(from_task, orm.Data): - to_socket.value = from_task - else: +# --- Constants --- +AIIDA_WG_DEFAULT_HANDLE = "result" +ANY_SOCKET_TYPE = "workgraph.any" + + +class AiidaPwdConverter: + """ + Provides methods to convert between AiiDA WorkGraph instances + and PWD workflows as Pydantic models. + """ + + def __init__(self): + """Initializes the converter and sets up logger.""" + self.logger = logging.getLogger(f"{__name__}.{self.__class__.__name__}") + self._reset_state() + + def model_to_workgraph(self, workflow_model: PwdWorkflow) -> WorkGraph: + """ + Converts a PWD Workflow Pydantic model into an AiiDA WorkGraph. + """ + self.logger.info("Starting model to WorkGraph conversion...") + self._reset_state() + self.workflow_model = workflow_model + # Create WG instance, potentially using name from model (if we add that?) + self.wg = WorkGraph(f"wg_{getattr(workflow_model, 'name', 'from_model')}") + + # Call internal helper methods + self._m2w_create_nodes() + self._m2w_link_nodes() + self._m2w_create_group_io() + + self.logger.info("Finished model to WorkGraph conversion.") + return self.wg + + def workgraph_to_model(self, wg: WorkGraph) -> PwdWorkflow: + """ + Converts an AiiDA WorkGraph into a PWD Workflow Pydantic model. + """ + self.logger.info( + f"Starting WorkGraph to model conversion for WG '{wg.name}'..." + ) + self._reset_state() + self.wg = wg + self.wg_protected_outputs = ("_wait", "_outputs", "exit_code") + self.wg_protected_inputs = ( + "_wait", + "metadata", + "function_data", + "process_label", + "function_inputs", + "deserializers", + "serializers", + "handler_overrides", + "metadata_overrides", + "name", + "ctx", + ) + + # Call internal helper methods + self._w2m_create_function_nodes() + self._w2m_create_input_nodes() + self._w2m_create_link_edges() + self._w2m_create_output_nodes() + self._w2m_adjust_node_names() + + # Assemble final Workflow model from instance attributes + # TODO: Ensure Workflow model accepts 'name' field if needed + workflow_model = PwdWorkflow( + nodes=self._pydantic_nodes, edges=self._pydantic_edges + ) + + self.logger.info( + f"Finished WorkGraph to model conversion. Model has {len(self._pydantic_nodes)} nodes, {len(self._pydantic_edges)} edges." + ) + return workflow_model + + @staticmethod + def _extract_aiida_value(data_node: orm.Data) -> Any: + logger_ext = logging.getLogger(f"{__name__}._extract_aiida_value") + node_info = ( + f"PK {getattr(data_node, 'pk', 'Unstored')} (Type: {type(data_node)})" + ) + logger_ext.debug(f"Extracting Python value from {node_info}") + if isinstance(data_node, (orm.Str, orm.Int, orm.Float, orm.Bool)): + return data_node.value + elif isinstance(data_node, orm.List): + return data_node.get_list() + elif isinstance(data_node, orm.Dict): + return data_node.get_dict() + elif isinstance(data_node, orm.ArrayData): try: - if link[SOURCE_PORT_LABEL] is None: - link[SOURCE_PORT_LABEL] = "result" - # because we are not define the outputs explicitly during the pythonjob creation - # we add it here, and assume the output exit - if link[SOURCE_PORT_LABEL] not in from_task.outputs: - # if str(link["sourcePort"]) not in from_task.outputs: - from_socket = from_task.add_output( - "workgraph.any", - name=link[SOURCE_PORT_LABEL], - # name=str(link["sourcePort"]), - metadata={"is_function_output": True}, - ) + array_names = data_node.get_arraynames() + if array_names: + return data_node.get_array(array_names[0]).tolist() else: - from_socket = from_task.outputs[link[SOURCE_PORT_LABEL]] - - wg.add_link(from_socket, to_socket) + logger_ext.warning(f"No arrays in {node_info}") + return [] except Exception as e: - traceback.print_exc() - print("Failed to link", link, "with error:", e) - return wg - - -def write_workflow_json(wg: WorkGraph, file_name: str) -> dict: - data = {NODES_LABEL: [], EDGES_LABEL: []} - node_name_mapping = {} - data_node_name_mapping = {} - i = 0 - for node in wg.tasks: - executor = node.get_executor() - node_name_mapping[node.name] = i - - callable_name = executor["callable_name"] - callable_name = f"{executor['module_path']}.{callable_name}" - data[NODES_LABEL].append({"id": i, "function": callable_name}) - i += 1 - - for link in wg.links: - link_data = link.to_dict() - # if the from socket is the default result, we set it to None - if link_data["from_socket"] == "result": - link_data["from_socket"] = None - link_data[TARGET_LABEL] = node_name_mapping[link_data.pop("to_node")] - link_data[TARGET_PORT_LABEL] = link_data.pop("to_socket") - link_data[SOURCE_LABEL] = node_name_mapping[link_data.pop("from_node")] - link_data[SOURCE_PORT_LABEL] = link_data.pop("from_socket") - data[EDGES_LABEL].append(link_data) - - for node in wg.tasks: - for input in node.inputs: - # assume namespace is not used as input - if isinstance(input, TaskSocketNamespace): + logger_ext.warning(f"Array extraction failed for {node_info}: {e}") + return [] + elif isinstance(data_node, orm.SinglefileData): + return data_node.filename + else: + if hasattr(data_node, "value"): + logger_ext.warning( + f"Attempting basic '.value' access for unhandled {node_info}." + ) + try: + return data_node.value + except Exception: + pass + logger_ext.warning( + f"Unhandled AiiDA type: {node_info}. Returning placeholder." + ) + return f"" + + def _reset_state(self) -> None: + """Resets internal state variables before starting a new conversion.""" + self.logger.debug("Resetting internal converter state.") + # Inputs for conversion + self.workflow_model: Optional[PwdWorkflow] = None + self.wg: Optional[WorkGraph] = None + # Intermediate state for model -> workgraph + self._node_map: Dict[int, Union[Task, orm.Data, PwdNode]] = {} + # Intermediate state for workgraph -> model + self._pydantic_nodes: List[PwdNode] = [] + self._pydantic_edges: List[PwdEdge] = [] + self._aiida_task_name_to_pydantic_id: Dict[str, int] = {} + self._aiida_data_map_key_to_pydantic_id: Dict[int, int] = {} + self._static_input_to_node_id: Dict[Tuple[str, str], int] = {} + self._workflow_output_to_node_id: Dict[Tuple[str, str], int] = {} + self._current_id: int = 0 + + def _m2w_create_nodes(self): + self.logger.info( + f"Starting model to WorkGraph conversion for model '{getattr(self.workflow_model, 'name', 'Unnamed')}'..." + ) + + self.logger.debug( + f"Processing {len(self.workflow_model.nodes)} nodes from model." + ) + for node in self.workflow_model.nodes: + if not isinstance(node, PwdFunctionNode): + node_info = f"node {node.id} (name: {getattr(node, 'name')}, type: {node.type})" + else: + node_info = f"node {node.id} (name: {getattr(node, 'value')}, type: {node.type})" + self.logger.debug(f"Processing {node_info}.") + + if isinstance(node, PwdFunctionNode): + try: + p, m = node.value.rsplit(".", 1) + mod = import_module(p) + func = getattr(mod, m) + task_name = f"{m}_{node.id}" + self.logger.debug( + f"Adding task '{task_name}' for function '{node.value}' from {node_info}." + ) + aiida_task = self.wg.add_task(func, name=task_name) + if "result" in aiida_task.outputs: + self.logger.debug( + f"Removing default 'result' output from task '{task_name}'." + ) + del aiida_task.outputs["result"] + self._node_map[node.id] = aiida_task + except (ImportError, AttributeError, ValueError) as e: + self.logger.error( + f"Failed processing FunctionNode {node.id} ('{node.value}'): {e}", + exc_info=True, + ) + raise AttributeError( + f"Failed processing FunctionNode {node.id}: {e}" + ) from e + except Exception as e: + self.logger.error( + f"Unexpected error creating task for {node_info}: {e}", + exc_info=True, + ) + raise RuntimeError( + f"Error creating task for node {node.id}: {e}" + ) from e + elif isinstance(node, PwdInputNode): + try: + self.logger.debug(f"Serializing value for {node_info}.") + data_node = general_serializer(node.value) + if not isinstance(data_node, orm.Data): + self.logger.debug( + f"Value for {node_info} not an AiiDA node, wrapping with to_aiida_type." + ) + data_node = orm.to_aiida_type(node.value) # Pass original value + self.logger.info( + f"Created AiiDA Data node (PK: {getattr(data_node, 'pk', 'Unstored')}) for {node_info}." + ) + self._node_map[node.id] = data_node + except Exception as e: + self.logger.warning( + f"Could not serialize value for {node_info} (value: {node.value}). Error: {e}", + exc_info=True, + ) + self._node_map[node.id] = None + elif isinstance(node, PwdOutputNode): + self.logger.debug(f"OutputNode {node_info} defines an endpoint.") + self._node_map[node.id] = node + else: + self.logger.warning( + f"Unsupported node type: {type(node)} for node ID {node.id}. Skipping." + ) + + def _m2w_link_nodes(self): + self.logger.debug( + f"Processing {len(self.workflow_model.edges)} edges from model." + ) + for edge_idx, edge in enumerate(self.workflow_model.edges): + edge_info = f"edge {edge_idx} (source: {edge.source}:{edge.sourcePort or 'default'} -> target: {edge.target}:{edge.targetPort or 'default'})" + self.logger.debug(f"Processing {edge_info}.") + source_obj = self._node_map.get(edge.source) + target_obj = self._node_map.get(edge.target) + if source_obj is None: + self.logger.warning( + f"Source obj missing for ID {edge.source}. Skipping {edge_info}." + ) + continue + if target_obj is None: + self.logger.warning( + f"Target obj missing for ID {edge.target}. Skipping {edge_info}." + ) + continue + + # Case 1: Connection *to* an OutputNode model + if isinstance(target_obj, PwdOutputNode): + if not isinstance(source_obj, Task): + self.logger.error( + f"Cannot connect non-Task source ID {edge.source} to OutputNode {target_obj.id}. Skipping." + ) + continue + # This is None or a specific string + model_source_handle = edge.sourcePort + + aiida_source_socket_name = ( + AIIDA_WG_DEFAULT_HANDLE + if model_source_handle == INTERNAL_DEFAULT_HANDLE + else model_source_handle + ) + if aiida_source_socket_name not in source_obj.outputs: + self.logger.info( + f"Adding inferred output socket '{aiida_source_socket_name}' to task '{source_obj.name}'." + ) + source_obj.add_output( + ANY_SOCKET_TYPE, name=aiida_source_socket_name + ) continue - if isinstance(input.value, orm.Data): - if input.value.uuid not in data_node_name_mapping: - if isinstance(input.value, orm.List): - raw_value = input.value.get_list() - elif isinstance(input.value, orm.Dict): - raw_value = input.value.get_dict() - # unknow reason, there is a key "node_type" in the dict - raw_value.pop("node_type", None) + + # Case 2: Connection *to* a Task + if isinstance(target_obj, Task): + to_task_obj = target_obj + # ... (check targetPort, ensure target input socket exists) ... + target_port_name = edge.targetPort + if not target_port_name: + self.logger.error(...) + raise ValueError(...) + if target_port_name not in to_task_obj.inputs: + self.logger.info( + f"Adding inferred input socket '{target_port_name}' to task '{to_task_obj.name}'." + ) + to_socket = to_task_obj.add_input( + ANY_SOCKET_TYPE, name=target_port_name + ) + else: + to_socket = to_task_obj.inputs[target_port_name] + + # Handle the source of the connection + if isinstance(source_obj, orm.Data): + # ... (handle static input linking - no handle mapping needed here) ... + if edge.sourcePort != INTERNAL_DEFAULT_HANDLE: + self.logger.warning( + f"Ignoring non-default sourcePort '{edge.sourcePort}' for Data node source {edge.source}." + ) + elif isinstance(source_obj, Task): + from_task_obj = source_obj + # --- MAP MODEL HANDLE TO AIIDA HANDLE --- + model_source_handle = ( + edge.sourcePort + ) # This is None or a specific string + aiida_source_socket_name = ( + AIIDA_WG_DEFAULT_HANDLE + if model_source_handle == INTERNAL_DEFAULT_HANDLE + else model_source_handle + ) + + # Ensure output socket exists on source task using the AiiDA name + if aiida_source_socket_name not in from_task_obj.outputs: + self.logger.info( + f"Adding inferred output socket '{aiida_source_socket_name}' to task '{from_task_obj.name}'." + ) + from_socket = from_task_obj.add_output( + ANY_SOCKET_TYPE, name=aiida_source_socket_name + ) else: - raw_value = input.value.value - data[NODES_LABEL].append({"id": i, "value": raw_value}) - input_node_name = i - data_node_name_mapping[input.value.uuid] = input_node_name - i += 1 + from_socket = from_task_obj.outputs[aiida_source_socket_name] + + self.logger.info( + f"Linking task output '{from_task_obj.name}.{from_socket._name}' to task input '{to_task_obj.name}.{to_socket._name}'." + ) # Log uses AiiDA names + self.wg.add_link(from_socket, to_socket) + else: - input_node_name = data_node_name_mapping[input.value.uuid] - data[EDGES_LABEL].append( - { - TARGET_LABEL: node_name_mapping[node.name], - TARGET_PORT_LABEL: input._name, - SOURCE_LABEL: input_node_name, - SOURCE_PORT_LABEL: None, + self.logger.error( + f"Unexpected source type {type(source_obj)} for edge {edge_info}. Skipping." + ) + else: + self.logger.error( + f"Unexpected target type {type(target_obj)} for edge {edge_info}. Skipping." + ) + + def _m2w_create_group_io(self): + self.logger.debug( + "Creating group_inputs and group_outputs from model definition." + ) + group_inputs = [] + group_outputs = [] + pydantic_nodes_by_id = {node.id: node for node in self.workflow_model.nodes} + for edge in self.workflow_model.edges: + source_node_model = pydantic_nodes_by_id.get(edge.source) + target_node_model = pydantic_nodes_by_id.get(edge.target) + if isinstance(source_node_model, PwdInputNode): + target_task_obj = self._node_map.get(edge.target) + if isinstance(target_task_obj, Task) and edge.targetPort: + input_entry = { + "name": source_node_model.name, + "to": f"{target_task_obj.name}.{edge.targetPort}", + } + if not any( + gi["name"] == input_entry["name"] for gi in group_inputs + ): + group_inputs.append(input_entry) + self.logger.debug(f"Added group input: {input_entry}") + else: + self.logger.warning( + f"Duplicate group input name '{input_entry['name']}'. Skipping." + ) + + elif isinstance(target_node_model, PwdOutputNode): + source_task_obj = self._node_map.get(edge.source) + if isinstance(source_task_obj, Task): + model_source_handle = edge.sourcePort + aiida_source_socket_name = ( + AIIDA_WG_DEFAULT_HANDLE + if model_source_handle == INTERNAL_DEFAULT_HANDLE + else model_source_handle + ) + output_entry = { + "name": target_node_model.name, + "from": f"{source_task_obj.name}.{aiida_source_socket_name}", } + if not any( + go["name"] == output_entry["name"] for go in group_outputs + ): + group_outputs.append(output_entry) + self.logger.debug(f"Added group output: {output_entry}") + else: + self.logger.warning( + f"Duplicate group output name '{output_entry['name']}'. Skipping." + ) + + self.wg.group_inputs = group_inputs + self.wg.group_outputs = group_outputs + self.logger.info( + f"Assigned {len(self.wg.group_inputs)} group inputs and {len(self.wg.group_outputs)} group outputs." + ) + self.logger.info("Finished model to WorkGraph conversion.") + import ipdb; ipdb.set_trace() + pass + + def _w2m_create_function_nodes(self): + self.logger.debug(f"Processing {len(self.wg.tasks)} tasks.") + for task in self.wg.tasks: + if not isinstance(task, Task): + self.logger.warning(f"Skipping non-Task item: {task}.") + continue + try: + executor_info = task.get_executor() + idf = f"{executor_info.get('module_path', '?')}.{executor_info.get('callable_name', '?')}" + node = PwdFunctionNode(id=self._current_id, type="function", value=idf) + self._pydantic_nodes.append(node) + self._aiida_task_name_to_pydantic_id[task.name] = self._current_id + self.logger.info( + f"Created FunctionNode ID {self._current_id} for task '{task.name}' ({idf})." + ) + self._current_id += 1 + except Exception as e: + self.logger.error( + f"Error processing task '{task.name}': {e}", exc_info=True + ) + + def _w2m_create_input_nodes(self): + self.logger.debug("Processing static inputs.") + for task in self.wg.tasks: + task_name = task.name + target_task_id = self._aiida_task_name_to_pydantic_id.get(task_name) + if target_task_id is None: + continue + for input_socket in task.inputs: + if isinstance(input_socket, TaskSocketNamespace): + continue + input_name = input_socket._name + socket_info = f"'{task_name}.{input_name}'" + if input_name in self.wg_protected_inputs: + continue + input_value = input_socket.value + if isinstance(input_value, orm.Data): + data_node = input_value + assignment_key = (task_name, input_name) + try: + data_pk = data_node.pk + map_key = data_pk if data_pk is not None else id(data_node) + if map_key in self._aiida_data_map_key_to_pydantic_id: + input_node_id = self._aiida_data_map_key_to_pydantic_id[ + map_key + ] + self._static_input_to_node_id[assignment_key] = ( + input_node_id # Still map this connection + ) + self.logger.debug( + f"Reusing InputNode ID {input_node_id} for {socket_info}." + ) + else: + raw_value = AiidaPwdConverter._extract_aiida_value( + data_node + ) + input_node = PwdInputNode( + id=self._current_id, + type="input", + name=input_name, + value=raw_value, + ) + self._pydantic_nodes.append(input_node) + input_node_id = self._current_id + self._aiida_data_map_key_to_pydantic_id[map_key] = ( + input_node_id + ) + self._static_input_to_node_id[assignment_key] = ( + input_node_id + ) + self.logger.info( + f"Created InputNode ID {input_node_id} (default name: {input_name}) for {socket_info}." + ) + self._current_id += 1 + edge = PwdEdge( + source=input_node_id, + sourcePort=None, + target=target_task_id, + targetPort=input_name, + ) + self._pydantic_edges.append(edge) + self.logger.debug( + f"Created edge from InputNode {input_node_id} to {socket_info}." + ) + except Exception as e: + self.logger.error( + f"Error processing static {socket_info}: {e}", exc_info=True + ) + + def _w2m_create_link_edges(self): + self.logger.debug(f"Processing {len(self.wg.links)} links.") + for link in self.wg.links: + if not isinstance(link.from_node, Task) or not isinstance( + link.to_node, Task + ): + continue + try: + from_task_name = link.from_node.name + to_task_name = link.to_node.name + source_id = self._aiida_task_name_to_pydantic_id.get(from_task_name) + target_id = self._aiida_task_name_to_pydantic_id.get(to_task_name) + if source_id is None or target_id is None: + continue + + aiida_from_socket_name = link.from_socket._name + aiida_to_socket_name = link.to_socket._name + + # --- MAP AIIDA HANDLE TO MODEL HANDLE --- + model_source_handle = ( + None + if aiida_from_socket_name == AIIDA_WG_DEFAULT_HANDLE + else aiida_from_socket_name ) - with open(file_name, "w") as f: - # json.dump({"nodes": data[], "edges": edges_new_lst}, f) - json.dump(data, f, indent=2) - return data + model_target_handle = aiida_to_socket_name + + self.logger.debug( + f"Mapping link to Pydantic Edge: source={source_id}, sourcePort='{model_source_handle}', target={target_id}, targetPort='{model_target_handle}'." + ) + + edge = PwdEdge( + source=source_id, + sourcePort=model_source_handle, + target=target_id, + targetPort=model_target_handle, + ) + self._pydantic_edges.append(edge) + except Exception as e: + self.logger.error(f"Error processing link {link}: {e}", exc_info=True) + + def _w2m_create_output_nodes(self): + self.logger.debug("Identifying workflow outputs.") + all_link_sources = set( + (link.from_node.name, link.from_socket._name) + for link in self.wg.links + if isinstance(link.from_node, Task) + ) + for task in self.wg.tasks: + task_name = task.name + source_task_id = self._aiida_task_name_to_pydantic_id.get(task_name) + if source_task_id is None: + continue + for output_socket in task.outputs: + if isinstance(output_socket, TaskSocketNamespace): + continue + output_name = output_socket._name + if output_name in self.wg_protected_outputs: + continue + output_key = (task_name, output_name) + if output_key not in all_link_sources: + try: + value = None + if output_socket.value is not None: + aiida_value_node = output_socket.value + if isinstance(aiida_value_node, orm.Data): + # Use the existing helper to get a JSON-friendly value + value = self._extract_aiida_value(aiida_value_node) + else: + self.warning( + f" Value for output '{task_name}' is not an AiiDA Data node (type: {type(aiida_value_node)}). Skipping value embedding." + ) + + output_node = PwdOutputNode( + id=self._current_id, + type="output", + name=output_name, + value=value, + ) + self._pydantic_nodes.append(output_node) + output_node_id = self._current_id + self._workflow_output_to_node_id[output_key] = output_node_id + self.logger.info( + f"Created OutputNode ID {output_node_id} (default name: {output_name}) for output '{task_name}.{output_name}'." + ) + self._current_id += 1 + ps_port = None if output_name == "result" else output_name + edge = PwdEdge( + source=source_task_id, + sourcePort=ps_port, + target=output_node_id, + targetPort=None, + ) + self._pydantic_edges.append(edge) + self.logger.debug( + f"Created edge from '{task_name}.{output_name}' to OutputNode {output_node_id}." + ) + except Exception as e: + self.logger.error( + f"Error creating OutputNode/Edge for '{task_name}.{output_name}': {e}", + exc_info=True, + ) + + def _w2m_adjust_node_names(self): + self.logger.debug("Attempting to override I/O node names from group lists.") + pydantic_nodes_dict = {node.id: node for node in self._pydantic_nodes} + # Process group_inputs + if hasattr(self.wg, "group_inputs") and isinstance(self.wg.group_inputs, list): + for entry in self.wg.group_inputs: + if isinstance(entry, dict) and "name" in entry and "to" in entry: + try: + tn, sn = entry["to"].split(".", 1) + key = (tn, sn) + if key in self._static_input_to_node_id: + node_id = self._static_input_to_node_id[key] + if node_id in pydantic_nodes_dict and isinstance( + pydantic_nodes_dict[node_id], PwdInputNode + ): + pydantic_nodes_dict[node_id].name = entry["name"] + self.logger.info( + f"Overrode InputNode ID {node_id} name to '{entry['name']}' from group_inputs." + ) + except Exception as e: + self.logger.warning( + f"Failed processing group_input entry {entry}: {e}" + ) + + # Process group_outputs + if hasattr(self.wg, "group_outputs") and isinstance( + self.wg.group_outputs, list + ): + for entry in self.wg.group_outputs: + if isinstance(entry, dict) and "name" in entry and "from" in entry: + try: + tn, sn = entry["from"].split(".", 1) + key = (tn, sn) + if key in self._workflow_output_to_node_id: + node_id = self._workflow_output_to_node_id[key] + if node_id in pydantic_nodes_dict and isinstance( + pydantic_nodes_dict[node_id], PwdOutputNode + ): + pydantic_nodes_dict[node_id].name = entry["name"] + self.logger.info( + f"Overrode OutputNode ID {node_id} name to '{entry['name']}' from group_outputs." + ) + except Exception as e: + self.logger.warning( + f"Failed processing group_output entry {entry}: {e}" + ) diff --git a/python_workflow_definition/src/python_workflow_definition/models.py b/python_workflow_definition/src/python_workflow_definition/models.py new file mode 100644 index 0000000..0f56fc0 --- /dev/null +++ b/python_workflow_definition/src/python_workflow_definition/models.py @@ -0,0 +1,246 @@ +from pathlib import Path +from typing import List, Union, Optional, Literal, Any, Annotated, Type, TypeVar +from pydantic import BaseModel, Field, field_validator, field_serializer +from pydantic import ValidationError +import json +import logging + +logger = logging.getLogger(__name__) + +INTERNAL_DEFAULT_HANDLE = "__result__" +T = TypeVar("T", bound="PwdWorkflow") + +__all__ = ("PwdInputNode", "PwdOutputNode", "PwdFunctionNode", "PwdEdge", "PwdWorkflow") + +# TODO: Check if validation _enforces_ this: +# at the end of page 4, we discuss when sourcePort can be null. Let’s extend to also e.g. say links from functions to outputs, and for inputs to functions, MUST be null (to be validated). And sourcePort can be null only if we want to pass the whole output, and this is equivalent to passing the string `__result__` + + +class PwdBaseNode(BaseModel): + """Base model for all node types, containing common fields.""" + + id: int + # The 'type' field will be overridden in subclasses with Literal types + # to enable discriminated unions. + type: str + + +class PwdInputNode(PwdBaseNode): + """Model for input nodes.""" + + type: Literal["input"] + name: str + value: Optional[Any] = None + + +class PwdOutputNode(PwdBaseNode): + """Model for output nodes.""" + + type: Literal["output"] + name: str + value: Optional[Any] = None + + +class PwdFunctionNode(PwdBaseNode): + """ + Model for function execution nodes. + The 'name' attribute is computed automatically from 'value'. + """ + + type: Literal["function"] + value: str # Expected format: 'module.function' + + @field_validator("value") + @classmethod + def check_value_format(cls, v: str): + if not v or "." not in v or v.startswith(".") or v.endswith("."): + msg = ( + "FunctionNode 'value' must be a non-empty string ", + "in 'module.function' format with at least one period.", + ) + raise ValueError(msg) + return v + + +# Discriminated Union for Nodes +PwdNode = Annotated[ + Union[PwdInputNode, PwdOutputNode, PwdFunctionNode], Field(discriminator="type") +] + + +class PwdEdge(BaseModel): + """Model for edges connecting nodes.""" + + target: int + targetPort: Optional[str] = None + source: int + sourcePort: Optional[str] = None + + @field_validator("sourcePort", mode="before") + @classmethod + def handle_default_source(cls, v: Any) -> Optional[str]: + """ + Transforms incoming None/null for sourcePort to INTERNAL_DEFAULT_HANDLE. + Runs before standard validation. + """ + # Allow not specifying the sourcePort -> null gets resolved to __result__ + if v is None: + return INTERNAL_DEFAULT_HANDLE + elif v == INTERNAL_DEFAULT_HANDLE: + # Disallow explicit use of the internal reserved handle name + msg = ( + f"Explicit use of reserved sourcePort '{INTERNAL_DEFAULT_HANDLE}' " + f"is not allowed. Use null/None for default output." + ) + raise ValueError(msg) + return v + + @field_serializer("sourcePort") + def serialize_source_handle(self, v: Optional[str]) -> Optional[str]: + """ + SERIALIZATION (Output): Converts internal INTERNAL_DEFAULT_HANDLE ("__result__") + back to None. + """ + if v == INTERNAL_DEFAULT_HANDLE: + return None # Map "__result__" back to None for JSON output + return v # Keep other handle names as they are + + +class PwdWorkflow(BaseModel): + """The main workflow model.""" + + nodes: List[PwdNode] + edges: List[PwdEdge] + + def dump_json( + self, + *, + indent: Optional[int] = 2, + **kwargs, + ) -> str: + """ + Dumps the workflow model to a JSON string. + + Args: + indent: JSON indentation level. + exclude_computed_function_names: If True (default), excludes the computed + 'name' field from FunctionNode objects + in the output. + **kwargs: Additional keyword arguments passed to Pydantic's model_dump. + + Returns: + JSON string representation of the workflow. + """ + + # Dump the model to a dictionary first, using mode='json' for compatible types + # Pass any extra kwargs (like custom 'exclude' rules for other fields) + workflow_dict = self.model_dump(mode="json", **kwargs) + + # Dump the dictionary to a JSON string + try: + json_string = json.dumps(workflow_dict, indent=indent) + logger.info("Successfully dumped workflow model to JSON string.") + return json_string + except TypeError as e: + logger.error( + f"Error serializing workflow dictionary to JSON: {e}", exc_info=True + ) + raise # Re-raise after logging + + def dump_json_file( + self, + file_name: Union[str, Path], + *, + indent: Optional[int] = 2, + **kwargs, + ) -> None: + """ + Dumps the workflow model to a JSON file. + + Args: + file_path: Path to the output JSON file. + indent: JSON indentation level. + exclude_computed_function_names: If True, excludes the computed 'name' field + from FunctionNode objects. + **kwargs: Additional keyword arguments passed to Pydantic's model_dump. + """ + logger.info(f"Dumping workflow model to JSON file: {file_name}") + # Pass kwargs to dump_json, which passes them to model_dump + json_string = self.dump_json( + indent=indent, + **kwargs, + ) + try: + with open(file_name, "w", encoding="utf-8") as f: + f.write(json_string) + logger.info(f"Successfully wrote workflow model to {file_name}.") + except IOError as e: + logger.error( + f"Error writing workflow model to file {file_name}: {e}", exc_info=True + ) + raise + + @classmethod + def load_json_str(cls: Type[T], json_data: Union[str, bytes]) -> T: + """ + Loads and validates workflow data from a JSON string or bytes. + + Args: + json_data: The JSON data as a string or bytes. + + Returns: + An instance of PwdWorkflow. + + Raises: + pydantic.ValidationError: If validation fails. + json.JSONDecodeError: If json_data is not valid JSON. + """ + logger.info("Loading workflow model from JSON data...") + try: + # Pydantic v2 method handles bytes or str directly + instance = cls.model_validate_json(json_data) + # Pydantic v1 equivalent: instance = cls.parse_raw(json_data) + logger.info( + "Successfully loaded and validated workflow model from JSON data." + ) + return instance + except ValidationError: # Catch validation errors specifically + logger.error("Workflow model validation failed.", exc_info=True) + raise + except json.JSONDecodeError: # Catch JSON parsing errors specifically + logger.error("Invalid JSON format encountered.", exc_info=True) + raise + except Exception as e: # Catch any other unexpected errors + logger.error( + f"An unexpected error occurred during JSON loading: {e}", exc_info=True + ) + raise + + @classmethod + def load_json_file(cls: Type[T], file_name: Union[str, Path]) -> T: + """ + Loads and validates workflow data from a JSON file. + + Args: + file_path: The path to the JSON file. + + Returns: + An instance of PwdWorkflow. + + Raises: + FileNotFoundError: If the file is not found. + pydantic.ValidationError: If validation fails. + json.JSONDecodeError: If the file is not valid JSON. + IOError: If there are other file reading issues. + """ + logger.info(f"Loading workflow model from JSON file: {file_name}") + try: + file_content = Path(file_name).read_text(encoding="utf-8") + # Delegate validation to the string loading method + return cls.load_json_str(file_content) + except FileNotFoundError: + logger.error(f"JSON file not found: {file_name}", exc_info=True) + raise + except IOError as e: + logger.error(f"Error reading JSON file {file_name}: {e}", exc_info=True) + raise