Latest commit

History

History
121 lines (106 loc) · 10.6 KB

File metadata and controls

121 lines (106 loc) · 10.6 KB

Python Workflow Definition

PipelinecodecovBinderDOI

Definition

In the Python Workflow Definition (PWD) each node represents a Python function, with the edges defining the connection between input and output of the different Python functions.

Published in: J. Janssen, J. George, J. Geiger, M. Bercx, X. Wang, C. Ertural, J. Schaarschmidt, A.M. Ganose, G. Pizzi, T. Hickel and J. Neugebauer. A python workflow definition for computational materials design. Digital Discovery, 2025

Format

Each workflow consists of three files, a Python module which defines the individual Pythons, a JSON file which defines the connections between the different Python functions and a conda environment file to define the software dependencies. The files are not intended to be human readable, but rather interact as a machine readable exchange format between the different workflow engines to enable interoperability.

Installation

The Python Workflow Definition can either be installed via pypi or via conda. For the pypi installation use:

pip install python-workflow-definition

For the conda installation via the conda-forge community channel use:

conda install conda-forge::python-workflow-definition

Examples

Simple Example

As a first example we define two Python functions which add multiple inputs:

defget_sum(x, y):
returnx+ydefget_prod_and_div(x: float, y: float) ->dict:
return {"prod": x*y, "div": x/y}

These two Python functions are combined in the following example workflow:

defcombined_workflow(x=1, y=2):
tmp_dict=get_prod_and_div(x=x, y=y)
returnget_sum(x=tmp_dict["prod"], y=tmp_dict["div"])

For the workflow representation of these Python functions the Python functions are stored in the example_workflows/arithmetic/workflow.py Python module. The connection of the Python functions are stored in the example_workflows/arithmetic/workflow.json JSON file:

{
"nodes": [
{"id": 0, "type": "function", "value": "workflow.get_prod_and_div"},
{"id": 1, "type": "function", "value": "workflow.get_sum"},
{"id": 2, "type": "input", "value": 1, "name": "x"},
{"id": 3, "type": "input", "value": 2, "name": "y"},
{"id": 4, "type": "output", "name": "result"}
],
"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": 4, "targetPort": null, "source": 1, "sourcePort": null}
]
}

The abbreviations in the definition of the edges are:

  • target - target node
  • targetPort - target port - for a node with multiple input parameters the target port specifies which input parameter to use.
  • source - source node
  • sourcePort - source port - for a node with multiple output parameters the source port specifies which output parameter to use.

As the workflow does not require any additional resources, as it is only using built-in functionality of the Python standard library.

The corresponding Jupyter notebooks demonstrate this functionality:

ExampleExplanation
example_workflows/arithmetic/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/arithmetic/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/arithmetic/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/arithmetic/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.

Quantum Espresso Workflow

The second workflow example is the calculation of an energy volume curve with Quantum Espresso. In the first step the initial structure is relaxed, afterward it is strained and the total energy is calculated.

ExampleExplanation
example_workflows/quantum_espresso/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/quantum_espresso/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/quantum_espresso/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/quantum_espresso/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.

NFDI4Ing Scientific Workflow Requirements

To demonstrate the compatibility of the Python Workflow Definition to file based workflows, the workflow benchmark developed as part of NFDI4Ing is implemented for all three simulation codes based on a shared workflow definition.

Additional source files provided with the workflow benchmark:

ExampleExplanation
example_workflows/nfdi/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/nfdi/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/nfdi/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/nfdi/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

History
121 lines (106 loc) · 10.6 KB

File metadata and controls

121 lines (106 loc) · 10.6 KB

Python Workflow Definition

PipelinecodecovBinderDOI

Definition

In the Python Workflow Definition (PWD) each node represents a Python function, with the edges defining the connection between input and output of the different Python functions.

Published in: J. Janssen, J. George, J. Geiger, M. Bercx, X. Wang, C. Ertural, J. Schaarschmidt, A.M. Ganose, G. Pizzi, T. Hickel and J. Neugebauer. A python workflow definition for computational materials design. Digital Discovery, 2025

Format

Each workflow consists of three files, a Python module which defines the individual Pythons, a JSON file which defines the connections between the different Python functions and a conda environment file to define the software dependencies. The files are not intended to be human readable, but rather interact as a machine readable exchange format between the different workflow engines to enable interoperability.

Installation

The Python Workflow Definition can either be installed via pypi or via conda. For the pypi installation use:

pip install python-workflow-definition

For the conda installation via the conda-forge community channel use:

conda install conda-forge::python-workflow-definition

Examples

Simple Example

As a first example we define two Python functions which add multiple inputs:

defget_sum(x, y):
returnx+ydefget_prod_and_div(x: float, y: float) ->dict:
return {"prod": x*y, "div": x/y}

These two Python functions are combined in the following example workflow:

defcombined_workflow(x=1, y=2):
tmp_dict=get_prod_and_div(x=x, y=y)
returnget_sum(x=tmp_dict["prod"], y=tmp_dict["div"])

For the workflow representation of these Python functions the Python functions are stored in the example_workflows/arithmetic/workflow.py Python module. The connection of the Python functions are stored in the example_workflows/arithmetic/workflow.json JSON file:

{
"nodes": [
{"id": 0, "type": "function", "value": "workflow.get_prod_and_div"},
{"id": 1, "type": "function", "value": "workflow.get_sum"},
{"id": 2, "type": "input", "value": 1, "name": "x"},
{"id": 3, "type": "input", "value": 2, "name": "y"},
{"id": 4, "type": "output", "name": "result"}
],
"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": 4, "targetPort": null, "source": 1, "sourcePort": null}
]
}

The abbreviations in the definition of the edges are:

  • target - target node
  • targetPort - target port - for a node with multiple input parameters the target port specifies which input parameter to use.
  • source - source node
  • sourcePort - source port - for a node with multiple output parameters the source port specifies which output parameter to use.

As the workflow does not require any additional resources, as it is only using built-in functionality of the Python standard library.

The corresponding Jupyter notebooks demonstrate this functionality:

ExampleExplanation
example_workflows/arithmetic/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/arithmetic/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/arithmetic/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/arithmetic/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.

Quantum Espresso Workflow

The second workflow example is the calculation of an energy volume curve with Quantum Espresso. In the first step the initial structure is relaxed, afterward it is strained and the total energy is calculated.

ExampleExplanation
example_workflows/quantum_espresso/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/quantum_espresso/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/quantum_espresso/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/quantum_espresso/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.

NFDI4Ing Scientific Workflow Requirements

To demonstrate the compatibility of the Python Workflow Definition to file based workflows, the workflow benchmark developed as part of NFDI4Ing is implemented for all three simulation codes based on a shared workflow definition.

Additional source files provided with the workflow benchmark:

ExampleExplanation
example_workflows/nfdi/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/nfdi/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/nfdi/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/nfdi/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
121 lines (106 loc) · 10.6 KB

File metadata and controls

121 lines (106 loc) · 10.6 KB

Python Workflow Definition

PipelinecodecovBinderDOI

Definition

In the Python Workflow Definition (PWD) each node represents a Python function, with the edges defining the connection between input and output of the different Python functions.

Published in: J. Janssen, J. George, J. Geiger, M. Bercx, X. Wang, C. Ertural, J. Schaarschmidt, A.M. Ganose, G. Pizzi, T. Hickel and J. Neugebauer. A python workflow definition for computational materials design. Digital Discovery, 2025

Format

Each workflow consists of three files, a Python module which defines the individual Pythons, a JSON file which defines the connections between the different Python functions and a conda environment file to define the software dependencies. The files are not intended to be human readable, but rather interact as a machine readable exchange format between the different workflow engines to enable interoperability.

Installation

The Python Workflow Definition can either be installed via pypi or via conda. For the pypi installation use:

pip install python-workflow-definition

For the conda installation via the conda-forge community channel use:

conda install conda-forge::python-workflow-definition

Examples

Simple Example

As a first example we define two Python functions which add multiple inputs:

defget_sum(x, y):
returnx+ydefget_prod_and_div(x: float, y: float) ->dict:
return {"prod": x*y, "div": x/y}

These two Python functions are combined in the following example workflow:

defcombined_workflow(x=1, y=2):
tmp_dict=get_prod_and_div(x=x, y=y)
returnget_sum(x=tmp_dict["prod"], y=tmp_dict["div"])

For the workflow representation of these Python functions the Python functions are stored in the example_workflows/arithmetic/workflow.py Python module. The connection of the Python functions are stored in the example_workflows/arithmetic/workflow.json JSON file:

{
"nodes": [
{"id": 0, "type": "function", "value": "workflow.get_prod_and_div"},
{"id": 1, "type": "function", "value": "workflow.get_sum"},
{"id": 2, "type": "input", "value": 1, "name": "x"},
{"id": 3, "type": "input", "value": 2, "name": "y"},
{"id": 4, "type": "output", "name": "result"}
],
"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": 4, "targetPort": null, "source": 1, "sourcePort": null}
]
}

The abbreviations in the definition of the edges are:

  • target - target node
  • targetPort - target port - for a node with multiple input parameters the target port specifies which input parameter to use.
  • source - source node
  • sourcePort - source port - for a node with multiple output parameters the source port specifies which output parameter to use.

As the workflow does not require any additional resources, as it is only using built-in functionality of the Python standard library.

The corresponding Jupyter notebooks demonstrate this functionality:

ExampleExplanation
example_workflows/arithmetic/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/arithmetic/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/arithmetic/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/arithmetic/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.

Quantum Espresso Workflow

The second workflow example is the calculation of an energy volume curve with Quantum Espresso. In the first step the initial structure is relaxed, afterward it is strained and the total energy is calculated.

ExampleExplanation
example_workflows/quantum_espresso/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/quantum_espresso/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/quantum_espresso/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/quantum_espresso/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.

NFDI4Ing Scientific Workflow Requirements

To demonstrate the compatibility of the Python Workflow Definition to file based workflows, the workflow benchmark developed as part of NFDI4Ing is implemented for all three simulation codes based on a shared workflow definition.

Additional source files provided with the workflow benchmark:

ExampleExplanation
example_workflows/nfdi/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/nfdi/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/nfdi/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/nfdi/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
121 lines (106 loc) · 10.6 KB

File metadata and controls

121 lines (106 loc) · 10.6 KB

Python Workflow Definition

PipelinecodecovBinderDOI

Definition

In the Python Workflow Definition (PWD) each node represents a Python function, with the edges defining the connection between input and output of the different Python functions.

Published in: J. Janssen, J. George, J. Geiger, M. Bercx, X. Wang, C. Ertural, J. Schaarschmidt, A.M. Ganose, G. Pizzi, T. Hickel and J. Neugebauer. A python workflow definition for computational materials design. Digital Discovery, 2025

Format

Each workflow consists of three files, a Python module which defines the individual Pythons, a JSON file which defines the connections between the different Python functions and a conda environment file to define the software dependencies. The files are not intended to be human readable, but rather interact as a machine readable exchange format between the different workflow engines to enable interoperability.

Installation

The Python Workflow Definition can either be installed via pypi or via conda. For the pypi installation use:

pip install python-workflow-definition

For the conda installation via the conda-forge community channel use:

conda install conda-forge::python-workflow-definition

Examples

Simple Example

As a first example we define two Python functions which add multiple inputs:

defget_sum(x, y):
returnx+ydefget_prod_and_div(x: float, y: float) ->dict:
return {"prod": x*y, "div": x/y}

These two Python functions are combined in the following example workflow:

defcombined_workflow(x=1, y=2):
tmp_dict=get_prod_and_div(x=x, y=y)
returnget_sum(x=tmp_dict["prod"], y=tmp_dict["div"])

For the workflow representation of these Python functions the Python functions are stored in the example_workflows/arithmetic/workflow.py Python module. The connection of the Python functions are stored in the example_workflows/arithmetic/workflow.json JSON file:

{
"nodes": [
{"id": 0, "type": "function", "value": "workflow.get_prod_and_div"},
{"id": 1, "type": "function", "value": "workflow.get_sum"},
{"id": 2, "type": "input", "value": 1, "name": "x"},
{"id": 3, "type": "input", "value": 2, "name": "y"},
{"id": 4, "type": "output", "name": "result"}
],
"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": 4, "targetPort": null, "source": 1, "sourcePort": null}
]
}

The abbreviations in the definition of the edges are:

  • target - target node
  • targetPort - target port - for a node with multiple input parameters the target port specifies which input parameter to use.
  • source - source node
  • sourcePort - source port - for a node with multiple output parameters the source port specifies which output parameter to use.

As the workflow does not require any additional resources, as it is only using built-in functionality of the Python standard library.

The corresponding Jupyter notebooks demonstrate this functionality:

ExampleExplanation
example_workflows/arithmetic/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/arithmetic/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/arithmetic/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/arithmetic/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.

Quantum Espresso Workflow

The second workflow example is the calculation of an energy volume curve with Quantum Espresso. In the first step the initial structure is relaxed, afterward it is strained and the total energy is calculated.

ExampleExplanation
example_workflows/quantum_espresso/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/quantum_espresso/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/quantum_espresso/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/quantum_espresso/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.

NFDI4Ing Scientific Workflow Requirements

To demonstrate the compatibility of the Python Workflow Definition to file based workflows, the workflow benchmark developed as part of NFDI4Ing is implemented for all three simulation codes based on a shared workflow definition.

Additional source files provided with the workflow benchmark:

ExampleExplanation
example_workflows/nfdi/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/nfdi/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/nfdi/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/nfdi/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

History
121 lines (106 loc) · 10.6 KB

File metadata and controls

121 lines (106 loc) · 10.6 KB

Python Workflow Definition

PipelinecodecovBinderDOI

Definition

In the Python Workflow Definition (PWD) each node represents a Python function, with the edges defining the connection between input and output of the different Python functions.

Published in: J. Janssen, J. George, J. Geiger, M. Bercx, X. Wang, C. Ertural, J. Schaarschmidt, A.M. Ganose, G. Pizzi, T. Hickel and J. Neugebauer. A python workflow definition for computational materials design. Digital Discovery, 2025

Format

Each workflow consists of three files, a Python module which defines the individual Pythons, a JSON file which defines the connections between the different Python functions and a conda environment file to define the software dependencies. The files are not intended to be human readable, but rather interact as a machine readable exchange format between the different workflow engines to enable interoperability.

Installation

The Python Workflow Definition can either be installed via pypi or via conda. For the pypi installation use:

pip install python-workflow-definition

For the conda installation via the conda-forge community channel use:

conda install conda-forge::python-workflow-definition

Examples

Simple Example

As a first example we define two Python functions which add multiple inputs:

defget_sum(x, y):
returnx+ydefget_prod_and_div(x: float, y: float) ->dict:
return {"prod": x*y, "div": x/y}

These two Python functions are combined in the following example workflow:

defcombined_workflow(x=1, y=2):
tmp_dict=get_prod_and_div(x=x, y=y)
returnget_sum(x=tmp_dict["prod"], y=tmp_dict["div"])

For the workflow representation of these Python functions the Python functions are stored in the example_workflows/arithmetic/workflow.py Python module. The connection of the Python functions are stored in the example_workflows/arithmetic/workflow.json JSON file:

{
"nodes": [
{"id": 0, "type": "function", "value": "workflow.get_prod_and_div"},
{"id": 1, "type": "function", "value": "workflow.get_sum"},
{"id": 2, "type": "input", "value": 1, "name": "x"},
{"id": 3, "type": "input", "value": 2, "name": "y"},
{"id": 4, "type": "output", "name": "result"}
],
"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": 4, "targetPort": null, "source": 1, "sourcePort": null}
]
}

The abbreviations in the definition of the edges are:

  • target - target node
  • targetPort - target port - for a node with multiple input parameters the target port specifies which input parameter to use.
  • source - source node
  • sourcePort - source port - for a node with multiple output parameters the source port specifies which output parameter to use.

As the workflow does not require any additional resources, as it is only using built-in functionality of the Python standard library.

The corresponding Jupyter notebooks demonstrate this functionality:

ExampleExplanation
example_workflows/arithmetic/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/arithmetic/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/arithmetic/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/arithmetic/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.

Quantum Espresso Workflow

The second workflow example is the calculation of an energy volume curve with Quantum Espresso. In the first step the initial structure is relaxed, afterward it is strained and the total energy is calculated.

ExampleExplanation
example_workflows/quantum_espresso/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/quantum_espresso/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/quantum_espresso/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/quantum_espresso/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.

NFDI4Ing Scientific Workflow Requirements

To demonstrate the compatibility of the Python Workflow Definition to file based workflows, the workflow benchmark developed as part of NFDI4Ing is implemented for all three simulation codes based on a shared workflow definition.

Additional source files provided with the workflow benchmark:

ExampleExplanation
example_workflows/nfdi/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/nfdi/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/nfdi/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/nfdi/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
121 lines (106 loc) · 10.6 KB

File metadata and controls

121 lines (106 loc) · 10.6 KB

Python Workflow Definition

PipelinecodecovBinderDOI

Definition

In the Python Workflow Definition (PWD) each node represents a Python function, with the edges defining the connection between input and output of the different Python functions.

Published in: J. Janssen, J. George, J. Geiger, M. Bercx, X. Wang, C. Ertural, J. Schaarschmidt, A.M. Ganose, G. Pizzi, T. Hickel and J. Neugebauer. A python workflow definition for computational materials design. Digital Discovery, 2025

Format

Each workflow consists of three files, a Python module which defines the individual Pythons, a JSON file which defines the connections between the different Python functions and a conda environment file to define the software dependencies. The files are not intended to be human readable, but rather interact as a machine readable exchange format between the different workflow engines to enable interoperability.

Installation

The Python Workflow Definition can either be installed via pypi or via conda. For the pypi installation use:

pip install python-workflow-definition

For the conda installation via the conda-forge community channel use:

conda install conda-forge::python-workflow-definition

Examples

Simple Example

As a first example we define two Python functions which add multiple inputs:

defget_sum(x, y):
returnx+ydefget_prod_and_div(x: float, y: float) ->dict:
return {"prod": x*y, "div": x/y}

These two Python functions are combined in the following example workflow:

defcombined_workflow(x=1, y=2):
tmp_dict=get_prod_and_div(x=x, y=y)
returnget_sum(x=tmp_dict["prod"], y=tmp_dict["div"])

For the workflow representation of these Python functions the Python functions are stored in the example_workflows/arithmetic/workflow.py Python module. The connection of the Python functions are stored in the example_workflows/arithmetic/workflow.json JSON file:

{
"nodes": [
{"id": 0, "type": "function", "value": "workflow.get_prod_and_div"},
{"id": 1, "type": "function", "value": "workflow.get_sum"},
{"id": 2, "type": "input", "value": 1, "name": "x"},
{"id": 3, "type": "input", "value": 2, "name": "y"},
{"id": 4, "type": "output", "name": "result"}
],
"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": 4, "targetPort": null, "source": 1, "sourcePort": null}
]
}

The abbreviations in the definition of the edges are:

  • target - target node
  • targetPort - target port - for a node with multiple input parameters the target port specifies which input parameter to use.
  • source - source node
  • sourcePort - source port - for a node with multiple output parameters the source port specifies which output parameter to use.

As the workflow does not require any additional resources, as it is only using built-in functionality of the Python standard library.

The corresponding Jupyter notebooks demonstrate this functionality:

ExampleExplanation
example_workflows/arithmetic/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/arithmetic/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/arithmetic/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/arithmetic/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.

Quantum Espresso Workflow

The second workflow example is the calculation of an energy volume curve with Quantum Espresso. In the first step the initial structure is relaxed, afterward it is strained and the total energy is calculated.

ExampleExplanation
example_workflows/quantum_espresso/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/quantum_espresso/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/quantum_espresso/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/quantum_espresso/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.

NFDI4Ing Scientific Workflow Requirements

To demonstrate the compatibility of the Python Workflow Definition to file based workflows, the workflow benchmark developed as part of NFDI4Ing is implemented for all three simulation codes based on a shared workflow definition.

Additional source files provided with the workflow benchmark:

ExampleExplanation
example_workflows/nfdi/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/nfdi/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/nfdi/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/nfdi/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
121 lines (106 loc) · 10.6 KB

File metadata and controls

121 lines (106 loc) · 10.6 KB

Python Workflow Definition

PipelinecodecovBinderDOI

Definition

In the Python Workflow Definition (PWD) each node represents a Python function, with the edges defining the connection between input and output of the different Python functions.

Published in: J. Janssen, J. George, J. Geiger, M. Bercx, X. Wang, C. Ertural, J. Schaarschmidt, A.M. Ganose, G. Pizzi, T. Hickel and J. Neugebauer. A python workflow definition for computational materials design. Digital Discovery, 2025

Format

Each workflow consists of three files, a Python module which defines the individual Pythons, a JSON file which defines the connections between the different Python functions and a conda environment file to define the software dependencies. The files are not intended to be human readable, but rather interact as a machine readable exchange format between the different workflow engines to enable interoperability.

Installation

The Python Workflow Definition can either be installed via pypi or via conda. For the pypi installation use:

pip install python-workflow-definition

For the conda installation via the conda-forge community channel use:

conda install conda-forge::python-workflow-definition

Examples

Simple Example

As a first example we define two Python functions which add multiple inputs:

defget_sum(x, y):
returnx+ydefget_prod_and_div(x: float, y: float) ->dict:
return {"prod": x*y, "div": x/y}

These two Python functions are combined in the following example workflow:

defcombined_workflow(x=1, y=2):
tmp_dict=get_prod_and_div(x=x, y=y)
returnget_sum(x=tmp_dict["prod"], y=tmp_dict["div"])

For the workflow representation of these Python functions the Python functions are stored in the example_workflows/arithmetic/workflow.py Python module. The connection of the Python functions are stored in the example_workflows/arithmetic/workflow.json JSON file:

{
"nodes": [
{"id": 0, "type": "function", "value": "workflow.get_prod_and_div"},
{"id": 1, "type": "function", "value": "workflow.get_sum"},
{"id": 2, "type": "input", "value": 1, "name": "x"},
{"id": 3, "type": "input", "value": 2, "name": "y"},
{"id": 4, "type": "output", "name": "result"}
],
"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": 4, "targetPort": null, "source": 1, "sourcePort": null}
]
}

The abbreviations in the definition of the edges are:

  • target - target node
  • targetPort - target port - for a node with multiple input parameters the target port specifies which input parameter to use.
  • source - source node
  • sourcePort - source port - for a node with multiple output parameters the source port specifies which output parameter to use.

As the workflow does not require any additional resources, as it is only using built-in functionality of the Python standard library.

The corresponding Jupyter notebooks demonstrate this functionality:

ExampleExplanation
example_workflows/arithmetic/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/arithmetic/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/arithmetic/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/arithmetic/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.

Quantum Espresso Workflow

The second workflow example is the calculation of an energy volume curve with Quantum Espresso. In the first step the initial structure is relaxed, afterward it is strained and the total energy is calculated.

ExampleExplanation
example_workflows/quantum_espresso/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/quantum_espresso/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/quantum_espresso/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/quantum_espresso/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.

NFDI4Ing Scientific Workflow Requirements

To demonstrate the compatibility of the Python Workflow Definition to file based workflows, the workflow benchmark developed as part of NFDI4Ing is implemented for all three simulation codes based on a shared workflow definition.

Additional source files provided with the workflow benchmark:

ExampleExplanation
example_workflows/nfdi/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/nfdi/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/nfdi/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/nfdi/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

History
121 lines (106 loc) · 10.6 KB

File metadata and controls

121 lines (106 loc) · 10.6 KB

Python Workflow Definition

PipelinecodecovBinderDOI

Definition

In the Python Workflow Definition (PWD) each node represents a Python function, with the edges defining the connection between input and output of the different Python functions.

Published in: J. Janssen, J. George, J. Geiger, M. Bercx, X. Wang, C. Ertural, J. Schaarschmidt, A.M. Ganose, G. Pizzi, T. Hickel and J. Neugebauer. A python workflow definition for computational materials design. Digital Discovery, 2025

Format

Each workflow consists of three files, a Python module which defines the individual Pythons, a JSON file which defines the connections between the different Python functions and a conda environment file to define the software dependencies. The files are not intended to be human readable, but rather interact as a machine readable exchange format between the different workflow engines to enable interoperability.

Installation

The Python Workflow Definition can either be installed via pypi or via conda. For the pypi installation use:

pip install python-workflow-definition

For the conda installation via the conda-forge community channel use:

conda install conda-forge::python-workflow-definition

Examples

Simple Example

As a first example we define two Python functions which add multiple inputs:

defget_sum(x, y):
returnx+ydefget_prod_and_div(x: float, y: float) ->dict:
return {"prod": x*y, "div": x/y}

These two Python functions are combined in the following example workflow:

defcombined_workflow(x=1, y=2):
tmp_dict=get_prod_and_div(x=x, y=y)
returnget_sum(x=tmp_dict["prod"], y=tmp_dict["div"])

For the workflow representation of these Python functions the Python functions are stored in the example_workflows/arithmetic/workflow.py Python module. The connection of the Python functions are stored in the example_workflows/arithmetic/workflow.json JSON file:

{
"nodes": [
{"id": 0, "type": "function", "value": "workflow.get_prod_and_div"},
{"id": 1, "type": "function", "value": "workflow.get_sum"},
{"id": 2, "type": "input", "value": 1, "name": "x"},
{"id": 3, "type": "input", "value": 2, "name": "y"},
{"id": 4, "type": "output", "name": "result"}
],
"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": 4, "targetPort": null, "source": 1, "sourcePort": null}
]
}

The abbreviations in the definition of the edges are:

  • target - target node
  • targetPort - target port - for a node with multiple input parameters the target port specifies which input parameter to use.
  • source - source node
  • sourcePort - source port - for a node with multiple output parameters the source port specifies which output parameter to use.

As the workflow does not require any additional resources, as it is only using built-in functionality of the Python standard library.

The corresponding Jupyter notebooks demonstrate this functionality:

ExampleExplanation
example_workflows/arithmetic/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/arithmetic/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/arithmetic/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/arithmetic/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.

Quantum Espresso Workflow

The second workflow example is the calculation of an energy volume curve with Quantum Espresso. In the first step the initial structure is relaxed, afterward it is strained and the total energy is calculated.

ExampleExplanation
example_workflows/quantum_espresso/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/quantum_espresso/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/quantum_espresso/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/quantum_espresso/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.

NFDI4Ing Scientific Workflow Requirements

To demonstrate the compatibility of the Python Workflow Definition to file based workflows, the workflow benchmark developed as part of NFDI4Ing is implemented for all three simulation codes based on a shared workflow definition.

Additional source files provided with the workflow benchmark:

ExampleExplanation
example_workflows/nfdi/aiida.ipynbDefine Workflow with aiida and execute it with jobflow and pyiron_base.
example_workflows/nfdi/jobflow.ipynbDefine Workflow with jobflow and execute it with aiida and pyiron_base.
example_workflows/nfdi/pyiron_base.ipynbDefine Workflow with pyiron_base and execute it with aiida and jobflow.
example_workflows/nfdi/universal_workflow.ipynbExecute workflow defined in the Python Workflow Definition with aiida, executorlib, jobflow, pyiron_base and pure Python.