diff --git a/environment.yml b/environment.yml index 5f7edb0..ee30024 100644 --- a/environment.yml +++ b/environment.yml @@ -7,3 +7,4 @@ dependencies: - pygraphviz=1.14 - aiida-workgraph=0.5.1 - conda_subprocess =0.0.6 +- networkx=3.4.2 diff --git a/python_workflow_definition/src/python_workflow_definition/plot.py b/python_workflow_definition/src/python_workflow_definition/plot.py new file mode 100644 index 0000000..94853d5 --- /dev/null +++ b/python_workflow_definition/src/python_workflow_definition/plot.py @@ -0,0 +1,43 @@ +import json + +from IPython.display import SVG, display +import networkx as nx + + +from python_workflow_definition.purepython import group_edges +from python_workflow_definition.shared import ( + get_kwargs, + convert_nodes_list_to_dict, + NODES_LABEL, + EDGES_LABEL, + SOURCE_LABEL, + SOURCE_PORT_LABEL, +) + + +def plot(file_name): + with open(file_name, "r") as f: + content = json.load(f) + + graph = nx.DiGraph() + node_dict = convert_nodes_list_to_dict(nodes_list=content[NODES_LABEL]) + total_lst = group_edges(edges_lst=content[EDGES_LABEL]) + + for node_id, node_name in node_dict.items(): + graph.add_node(node_id, name=str(node_name), label=str(node_name)) + + for edge_tuple in total_lst: + target_node, edge_dict = edge_tuple + edge_label_dict = {} + for k, v in edge_dict.items(): + if v[SOURCE_LABEL] not in edge_label_dict: + edge_label_dict[v[SOURCE_LABEL]] = [] + if v[SOURCE_PORT_LABEL] is None: + edge_label_dict[v[SOURCE_LABEL]].append(k) + else: + edge_label_dict[v[SOURCE_LABEL]].append(v[SOURCE_PORT_LABEL] + "=" + k) + for k, v in edge_label_dict.items(): + graph.add_edge(str(k), str(target_node), label=", ".join(v)) + + svg = nx.nx_agraph.to_agraph(graph).draw(prog="dot", format="svg") + display(SVG(svg)) diff --git a/universal_workflow_nfdi.ipynb b/universal_workflow_nfdi.ipynb index 2ae6836..894bb02 100644 --- a/universal_workflow_nfdi.ipynb +++ b/universal_workflow_nfdi.ipynb @@ -7,6 +7,25 @@ "# Load Simple Workflow" ] }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Plot" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "from python_workflow_definition.plot import plot" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "plot(file_name='workflow_nfdi.json')" + }, { "cell_type": "markdown", "metadata": {}, diff --git a/universal_workflow_qe.ipynb b/universal_workflow_qe.ipynb index b0fde02..182229d 100644 --- a/universal_workflow_qe.ipynb +++ b/universal_workflow_qe.ipynb @@ -7,6 +7,25 @@ "# Load Quantum Espresso Energy Volume Curve Workflow" ] }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Plot" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "from python_workflow_definition.plot import plot" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "plot(file_name='workflow_qe.json')" + }, { "cell_type": "markdown", "metadata": {}, diff --git a/universal_workflow_simple.ipynb b/universal_workflow_simple.ipynb index 5e011c3..aaf8d2e 100644 --- a/universal_workflow_simple.ipynb +++ b/universal_workflow_simple.ipynb @@ -7,6 +7,25 @@ "# Load Simple Workflow" ] }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Plot" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "from python_workflow_definition.plot import plot" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "plot(file_name='workflow_simple.json')" + }, { "cell_type": "markdown", "metadata": {},