From 8e49cb6e0a5abfab02572a8564f5a6da6fd68a82 Mon Sep 17 00:00:00 2001 From: Muhammad Mohsin Date: Mon, 17 Nov 2025 11:43:07 +0000 Subject: [PATCH 01/15] Add EOS task --- .../tutorials/workgraphs/EOS_workgraph.ipynb | 939 ++++++++++++++++++ 1 file changed, 939 insertions(+) create mode 100644 examples/tutorials/workgraphs/EOS_workgraph.ipynb diff --git a/examples/tutorials/workgraphs/EOS_workgraph.ipynb b/examples/tutorials/workgraphs/EOS_workgraph.ipynb new file mode 100644 index 00000000..3d6bb929 --- /dev/null +++ b/examples/tutorials/workgraphs/EOS_workgraph.ipynb @@ -0,0 +1,939 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "233a4da4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Profile" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from aiida import load_profile \n", + "load_profile()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a3ca17e8", + "metadata": {}, + "outputs": [], + "source": [ + "from aiida.orm import load_code\n", + "\n", + "qe_code = load_code(\"qe@scarf\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "9c433338", + "metadata": {}, + "outputs": [], + "source": [ + "from aiida_workgraph import WorkGraph, task\n", + "from pathlib import Path\n", + "from ase.io import read, write, iread\n", + "import numpy as np\n", + "from aiida.orm import SinglefileData, Float, InstalledCode, List, Dict, KpointsData, StructureData, load_group\n", + "from aiida_quantumespresso.calculations.pw import PwCalculation\n", + "from aiida_workgraph.manager import get_current_graph\n", + "from ase import units\n", + "import tempfile\n", + "\n", + "@task.calcfunction(outputs=[\"scaled_file\"])\n", + "def create_scales(\n", + " structure_path,\n", + " min_v: Float,\n", + " max_v:Float,\n", + " num_structs: int\n", + "): \n", + "\n", + " atoms = read(structure_path.value)\n", + " cell = atoms.get_cell()\n", + "\n", + " lattice_scalars = np.cbrt(np.linspace(min_v.value, max_v.value, num_structs.value))\n", + " for i,s in enumerate(lattice_scalars):\n", + " b = atoms.copy()\n", + " b.set_cell(cell * s, scale_atoms=True)\n", + " write(\"scaled.extxyz\",b,append=i>0)\n", + "\n", + " return {\n", + " \"scaled_file\": SinglefileData(Path(\"scaled.extxyz\").resolve())\n", + " }\n", + "\n", + "@task.graph(outputs = [\"structures\"])\n", + "def qe(\n", + " code: InstalledCode,\n", + " kpoints_mesh: List,\n", + " task_metadata: Dict,\n", + " scaled_file: SinglefileData,\n", + " ):\n", + "\n", + " wg = get_current_graph()\n", + "\n", + " kpoints = KpointsData()\n", + " kpoints.set_kpoints_mesh(kpoints_mesh)\n", + "\n", + " pseudo_family = load_group('SSSP/1.3/PBE/efficiency')\n", + " \n", + " with scaled_file.as_path() as path:\n", + " for i, structs in enumerate(iread(path, format=\"extxyz\")):\n", + " \n", + " structure = StructureData(ase=structs)\n", + " pseudos = pseudo_family.get_pseudos(structure=structure)\n", + "\n", + " ecutwfc, ecutrho = pseudo_family.get_recommended_cutoffs(\n", + " structure=structure,\n", + " unit='Ry',\n", + " )\n", + "\n", + " pw_params = {\n", + " \"CONTROL\": {\n", + " \"calculation\": \"scf\",\n", + " 'tprnfor': True,\n", + " 'tstress': True,\n", + " },\n", + " \"SYSTEM\": {\n", + " \"ecutwfc\": ecutwfc,\n", + " \"ecutrho\": ecutrho,\n", + " },\n", + " }\n", + " \n", + " qe_task = wg.add_task(\n", + " PwCalculation,\n", + " code=code,\n", + " parameters=pw_params,\n", + " kpoints=kpoints,\n", + " pseudos=pseudos,\n", + " metadata=task_metadata.value,\n", + " structure=structure,\n", + " )\n", + "\n", + " wg.update_ctx({\n", + " f\"struct.{i}\" :{\n", + " \"trajectory\":qe_task.outputs.output_trajectory,\n", + " \"parameters\": qe_task.outputs.output_parameters\n", + " }\n", + " })\n", + "\n", + " return {\n", + " \"structures\": wg.ctx.struct,\n", + " }\n", + "\n", + "# @task.calcfunction(outputs = [\"test_file\", \"train_file\", \"valid_file\"])\n", + "# def create_train_file(**structures):\n", + "\n", + "# training_files = {}\n", + " \n", + "# for i, structs in structures.items():\n", + "# path = Path(f\"qe.extxyz\")\n", + "\n", + "# for struct_out_params in structs.values():\n", + " \n", + "# trajectory = struct_out_params[\"trajectory\"]\n", + "\n", + "# fileStructure = trajectory.get_structure(index=0)\n", + "# fileAtoms = fileStructure.get_ase()\n", + "\n", + "# stress = trajectory.arrays[\"stress\"][0]\n", + "# converted_stress = stress * units.GPa\n", + "# fileAtoms.info[\"qe_stress\"] = converted_stress\n", + "\n", + "# fileAtoms.info[\"units\"] = {\"energy\": \"eV\",\"forces\": \"ev/Ang\",\"stress\": \"ev/Ang^3\"}\n", + "# fileAtoms.set_array(\"qe_forces\", trajectory.arrays[\"forces\"][0])\n", + "\n", + "# parameters = struct_out_params[\"parameters\"]\n", + "# fileParams = parameters.get_dict()\n", + "# fileAtoms.info[\"qe_energy\"] = fileParams[\"energy\"]\n", + "# write(path, fileAtoms, append=True)\n", + "\n", + "# training_files[file_name] = str(path.resolve())\n", + "\n", + "# with open(\"JanusConfigfile.yml\", \"a\") as f:\n", + "# yaml.safe_dump(training_files, f, sort_keys=False)\n", + "\n", + "# return{'JanusConfigfile': JanusConfigfile(Path(\"JanusConfigfile.yml\").resolve())}" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "a35e9ed6", + "metadata": {}, + "outputs": [], + "source": [ + "scales_inputs = {\n", + " \"min_v\": 0.95,\n", + " \"max_v\": 1.05,\n", + " \"num_structs\": 12\n", + "}\n", + "\n", + "qe_inputs = {\n", + " \"task_metadata\": Dict({\n", + " \"options\": {\n", + " \"resources\": {\n", + " \"num_machines\": 1,\n", + " \"num_mpiprocs_per_machine\": 32,\n", + " },\n", + " \"max_wallclock_seconds\": 3600,\n", + " \"queue_name\": \"scarf\",\n", + " \"qos\": \"scarf\",\n", + " \"environment_variables\": {},\n", + " \"withmpi\": True,\n", + " \"prepend_text\": \"\"\"\n", + " module purge\n", + " module use /work4/scd/scarf562/eb-common/modules/all\n", + " module load amd-modules\n", + " module load QuantumESPRESSO/7.2-foss-2023a\n", + " \"\"\",\n", + " \"append_text\": \"\",\n", + " },\n", + " }),\n", + " \"kpoints_mesh\": List([1, 1, 1]),\n", + " \"code\": qe_code,\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "9074302a", + "metadata": {}, + "outputs": [], + "source": [ + "with WorkGraph(\"EOS_workflow\") as wg:\n", + "\n", + " initial_structure = str(Path(\"../structures/NaCl-traj.xyz\").resolve())\n", + " \n", + " scales_task = wg.add_task(\n", + " create_scales,\n", + " structure_path=initial_structure,\n", + " **scales_inputs\n", + " )\n", + "\n", + " qe_task = wg.add_task(\n", + " qe,\n", + " scaled_file=scales_task.outputs.scaled_file,\n", + " **qe_inputs\n", + " )\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "f230babb", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11/17/2025 11:33:10 AM <2672899> aiida.broker.rabbitmq: [WARNING] RabbitMQ v3.12.1 is not supported and will cause unexpected problems!\n", + "11/17/2025 11:33:10 AM <2672899> aiida.broker.rabbitmq: [WARNING] It can cause long-running workflows to crash and jobs to be submitted multiple times.\n", + "11/17/2025 11:33:10 AM <2672899> aiida.broker.rabbitmq: [WARNING] See https://github.com/aiidateam/aiida-core/wiki/RabbitMQ-version-to-use for details.\n", + "11/17/2025 11:33:10 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15464|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_scales\n", + "11/17/2025 11:33:11 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15464|WorkGraphEngine|update_task_state]: Task: create_scales, type: CALCFUNCTION, finished.\n", + "11/17/2025 11:33:11 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15464|WorkGraphEngine|continue_workgraph]: tasks ready to run: qe\n", + "11/17/2025 11:33:13 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15464|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 15484\n", + "11/17/2025 11:33:13 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|continue_workgraph]: tasks ready to run: PwCalculation,PwCalculation1,PwCalculation2,PwCalculation3,PwCalculation4,PwCalculation5,PwCalculation6,PwCalculation7,PwCalculation8,PwCalculation9,PwCalculation10,PwCalculation11\n", + "11/17/2025 11:33:16 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 15486, 15488, 15490, 15492, 15494, 15496, 15498, 15500, 15502, 15504, 15506, 15508\n", + "11/17/2025 11:36:00 AM <2672899> aiida.transport.SshTransport: [ERROR] Error connecting to 'ui1.scarf.rl.ac.uk' through SSH: [SshTransport] [Errno 110] Connection timed out, connect_args were: {'username': 'scarf1480', 'port': 22, 'look_for_keys': True, 'key_filename': '/home/mtr46585/.ssh/scarf', 'timeout': 3600, 'allow_agent': True, 'proxy_jump': '', 'proxy_command': '', 'compress': True, 'gss_auth': False, 'gss_kex': False, 'gss_deleg_creds': False, 'gss_host': 'ui1.scarf.rl.ac.uk'}\n", + "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] exception occurred while trying to open transport:\n", + " [Errno 110] Connection timed out\n", + "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", + " yield transport_request.future\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "\n", + "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", + " result = await coro()\n", + " ^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", + " yield transport_request.future\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "\n", + "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", + " result = await coro()\n", + " ^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", + " yield transport_request.future\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "\n", + "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", + " result = await coro()\n", + " ^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", + " yield transport_request.future\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "\n", + "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", + " result = await coro()\n", + " ^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", + " yield transport_request.future\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "\n", + "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", + " result = await coro()\n", + " ^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", + " yield transport_request.future\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "\n", + "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", + " result = await coro()\n", + " ^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", + " yield transport_request.future\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "\n", + "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", + " result = await coro()\n", + " ^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", + " yield transport_request.future\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "\n", + "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", + " result = await coro()\n", + " ^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", + " yield transport_request.future\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "\n", + "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", + " result = await coro()\n", + " ^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", + " yield transport_request.future\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "\n", + "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", + " result = await coro()\n", + " ^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", + " yield transport_request.future\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "\n", + "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", + " result = await coro()\n", + " ^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", + " yield transport_request.future\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "\n", + "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", + "Traceback (most recent call last):\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", + " result = await coro()\n", + " ^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", + " transport = await cancellable.with_interrupt(request)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", + " result = await next(wait_iter)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", + " return f.result() # May raise f.exception().\n", + " ^^^^^^^^^^\n", + " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", + " raise self._exception.with_traceback(self._exception_tb)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", + " transport.open()\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", + " self._client.connect(self._machine, **connection_arguments)\n", + " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", + " sock.connect(addr)\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", + " warn_deprecation(\n", + "11/17/2025 11:38:40 AM <2672899> aiida.parser.PwParser: [ERROR] ERROR_OUTPUT_STDOUT_INCOMPLETE\n", + "11/17/2025 11:38:40 AM <2672899> aiida.parser.PwParser: [ERROR] Both the stdout and XML output files could not be read or parsed.\n", + "11/17/2025 11:38:40 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [WARNING] output parser returned exit code<305>: Both the stdout and XML output files could not be read or parsed.\n", + "11/17/2025 11:38:47 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation, type: CALCJOB, finished.\n", + "11/17/2025 11:38:47 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation1, type: CALCJOB, finished.\n", + "11/17/2025 11:38:47 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|on_task_failed]: Task, PwCalculation2, type: CALCJOB, failed. Error message: Both the stdout and XML output files could not be read or parsed.\n", + "11/17/2025 11:38:47 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|run_error_handlers]: Run error handlers for PwCalculation2\n", + "11/17/2025 11:38:47 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation3, type: CALCJOB, finished.\n", + "11/17/2025 11:38:47 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation4, type: CALCJOB, finished.\n", + "11/17/2025 11:38:47 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation5, type: CALCJOB, finished.\n", + "11/17/2025 11:38:48 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation6, type: CALCJOB, finished.\n", + "11/17/2025 11:38:48 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation7, type: CALCJOB, finished.\n", + "11/17/2025 11:38:48 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation8, type: CALCJOB, finished.\n", + "11/17/2025 11:38:48 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation9, type: CALCJOB, finished.\n", + "11/17/2025 11:38:48 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation10, type: CALCJOB, finished.\n", + "11/17/2025 11:38:48 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation11, type: CALCJOB, finished.\n", + "11/17/2025 11:38:49 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "11/17/2025 11:38:49 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|is_workgraph_finished]: WorkGraph finished, but tasks: ['PwCalculation2'] failed. Thus all their child tasks are skipped.\n", + "11/17/2025 11:38:49 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15464|WorkGraphEngine|on_task_failed]: Task, qe, type: GRAPH, failed. Error message: WorkGraph finished, but tasks: ['PwCalculation2'] failed. Thus all their child tasks are skipped.\n", + "11/17/2025 11:38:49 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15464|WorkGraphEngine|run_error_handlers]: Run error handlers for qe\n", + "11/17/2025 11:38:49 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15464|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "11/17/2025 11:38:50 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15464|WorkGraphEngine|is_workgraph_finished]: WorkGraph finished, but tasks: ['qe'] failed. Thus all their child tasks are skipped.\n" + ] + }, + { + "data": { + "text/plain": [ + "{}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wg.run()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "1ed6868c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "SocketAny(name='structures', value=None)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wg.tasks.qe.outputs.structures" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "aiida-mlip (3.12.3)", + "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.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 59406e47b2977df05f41a6c581213725b4e77886 Mon Sep 17 00:00:00 2001 From: Muhammad Mohsin Date: Mon, 17 Nov 2025 12:31:15 +0000 Subject: [PATCH 02/15] testing --- .../tutorials/workgraphs/EOS_workgraph.ipynb | 810 +++--------------- 1 file changed, 121 insertions(+), 689 deletions(-) diff --git a/examples/tutorials/workgraphs/EOS_workgraph.ipynb b/examples/tutorials/workgraphs/EOS_workgraph.ipynb index 3d6bb929..1238ebf9 100644 --- a/examples/tutorials/workgraphs/EOS_workgraph.ipynb +++ b/examples/tutorials/workgraphs/EOS_workgraph.ipynb @@ -9,7 +9,7 @@ { "data": { "text/plain": [ - "Profile" + "Profile" ] }, "execution_count": 1, @@ -31,7 +31,7 @@ "source": [ "from aiida.orm import load_code\n", "\n", - "qe_code = load_code(\"qe@scarf\")" + "qe_code = load_code(\"qe@localhost\")" ] }, { @@ -131,39 +131,33 @@ " \"structures\": wg.ctx.struct,\n", " }\n", "\n", - "# @task.calcfunction(outputs = [\"test_file\", \"train_file\", \"valid_file\"])\n", - "# def create_train_file(**structures):\n", + "@task.calcfunction(outputs = [\"test_file\", \"train_file\", \"valid_file\"])\n", + "def create_train_files(structures):\n", "\n", - "# training_files = {}\n", + " training_files = {}\n", " \n", - "# for i, structs in structures.items():\n", - "# path = Path(f\"qe.extxyz\")\n", + " for i, structs in structures.items():\n", + " tmpfile = \"mlip.extxyz\"\n", "\n", - "# for struct_out_params in structs.values():\n", + " for struct_out_params in structs.values():\n", " \n", - "# trajectory = struct_out_params[\"trajectory\"]\n", + " trajectory = struct_out_params[\"trajectory\"]\n", "\n", - "# fileStructure = trajectory.get_structure(index=0)\n", - "# fileAtoms = fileStructure.get_ase()\n", + " fileStructure = trajectory.get_structure(index=0)\n", + " fileAtoms = fileStructure.get_ase()\n", "\n", - "# stress = trajectory.arrays[\"stress\"][0]\n", - "# converted_stress = stress * units.GPa\n", - "# fileAtoms.info[\"qe_stress\"] = converted_stress\n", + " stress = trajectory.arrays[\"stress\"][0]\n", + " converted_stress = stress * units.GPa\n", + " fileAtoms.info[\"qe_stress\"] = converted_stress\n", "\n", - "# fileAtoms.info[\"units\"] = {\"energy\": \"eV\",\"forces\": \"ev/Ang\",\"stress\": \"ev/Ang^3\"}\n", - "# fileAtoms.set_array(\"qe_forces\", trajectory.arrays[\"forces\"][0])\n", + " fileAtoms.info[\"units\"] = {\"energy\": \"eV\",\"forces\": \"ev/Ang\",\"stress\": \"ev/Ang^3\"}\n", + " fileAtoms.set_array(\"qe_forces\", trajectory.arrays[\"forces\"][0])\n", "\n", - "# parameters = struct_out_params[\"parameters\"]\n", - "# fileParams = parameters.get_dict()\n", - "# fileAtoms.info[\"qe_energy\"] = fileParams[\"energy\"]\n", - "# write(path, fileAtoms, append=True)\n", - "\n", - "# training_files[file_name] = str(path.resolve())\n", - "\n", - "# with open(\"JanusConfigfile.yml\", \"a\") as f:\n", - "# yaml.safe_dump(training_files, f, sort_keys=False)\n", - "\n", - "# return{'JanusConfigfile': JanusConfigfile(Path(\"JanusConfigfile.yml\").resolve())}" + " parameters = struct_out_params[\"parameters\"]\n", + " fileParams = parameters.get_dict()\n", + " fileAtoms.info[\"qe_energy\"] = fileParams[\"energy\"]\n", + " write(tmpfile, fileAtoms, append=True)\n", + "\n" ] }, { @@ -184,7 +178,6 @@ " \"options\": {\n", " \"resources\": {\n", " \"num_machines\": 1,\n", - " \"num_mpiprocs_per_machine\": 32,\n", " },\n", " \"max_wallclock_seconds\": 3600,\n", " \"queue_name\": \"scarf\",\n", @@ -192,10 +185,6 @@ " \"environment_variables\": {},\n", " \"withmpi\": True,\n", " \"prepend_text\": \"\"\"\n", - " module purge\n", - " module use /work4/scd/scarf562/eb-common/modules/all\n", - " module load amd-modules\n", - " module load QuantumESPRESSO/7.2-foss-2023a\n", " \"\"\",\n", " \"append_text\": \"\",\n", " },\n", @@ -227,7 +216,12 @@ " scaled_file=scales_task.outputs.scaled_file,\n", " **qe_inputs\n", " )\n", - "\n" + "\n", + " train_task = wg.add_task(\n", + " create_train_files,\n", + " structures=qe_task.outputs.structures\n", + " )\n", + " " ] }, { @@ -240,642 +234,101 @@ "name": "stderr", "output_type": "stream", "text": [ - "11/17/2025 11:33:10 AM <2672899> aiida.broker.rabbitmq: [WARNING] RabbitMQ v3.12.1 is not supported and will cause unexpected problems!\n", - "11/17/2025 11:33:10 AM <2672899> aiida.broker.rabbitmq: [WARNING] It can cause long-running workflows to crash and jobs to be submitted multiple times.\n", - "11/17/2025 11:33:10 AM <2672899> aiida.broker.rabbitmq: [WARNING] See https://github.com/aiidateam/aiida-core/wiki/RabbitMQ-version-to-use for details.\n", - "11/17/2025 11:33:10 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15464|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_scales\n", - "11/17/2025 11:33:11 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15464|WorkGraphEngine|update_task_state]: Task: create_scales, type: CALCFUNCTION, finished.\n", - "11/17/2025 11:33:11 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15464|WorkGraphEngine|continue_workgraph]: tasks ready to run: qe\n", - "11/17/2025 11:33:13 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15464|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 15484\n", - "11/17/2025 11:33:13 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|continue_workgraph]: tasks ready to run: PwCalculation,PwCalculation1,PwCalculation2,PwCalculation3,PwCalculation4,PwCalculation5,PwCalculation6,PwCalculation7,PwCalculation8,PwCalculation9,PwCalculation10,PwCalculation11\n", - "11/17/2025 11:33:16 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 15486, 15488, 15490, 15492, 15494, 15496, 15498, 15500, 15502, 15504, 15506, 15508\n", - "11/17/2025 11:36:00 AM <2672899> aiida.transport.SshTransport: [ERROR] Error connecting to 'ui1.scarf.rl.ac.uk' through SSH: [SshTransport] [Errno 110] Connection timed out, connect_args were: {'username': 'scarf1480', 'port': 22, 'look_for_keys': True, 'key_filename': '/home/mtr46585/.ssh/scarf', 'timeout': 3600, 'allow_agent': True, 'proxy_jump': '', 'proxy_command': '', 'compress': True, 'gss_auth': False, 'gss_kex': False, 'gss_deleg_creds': False, 'gss_host': 'ui1.scarf.rl.ac.uk'}\n", - "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] exception occurred while trying to open transport:\n", - " [Errno 110] Connection timed out\n", - "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", + "11/17/2025 12:30:15 PM <33412> aiida.broker.rabbitmq: [WARNING] RabbitMQ v3.12.1 is not supported and will cause unexpected problems!\n", + "11/17/2025 12:30:15 PM <33412> aiida.broker.rabbitmq: [WARNING] It can cause long-running workflows to crash and jobs to be submitted multiple times.\n", + "11/17/2025 12:30:15 PM <33412> aiida.broker.rabbitmq: [WARNING] See https://github.com/aiidateam/aiida-core/wiki/RabbitMQ-version-to-use for details.\n", + "11/17/2025 12:30:15 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1246|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_scales\n", + "11/17/2025 12:30:16 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1246|WorkGraphEngine|update_task_state]: Task: create_scales, type: CALCFUNCTION, finished.\n", + "11/17/2025 12:30:16 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1246|WorkGraphEngine|continue_workgraph]: tasks ready to run: qe\n", + "11/17/2025 12:30:17 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1246|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 1266\n", + "11/17/2025 12:30:17 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|continue_workgraph]: tasks ready to run: PwCalculation,PwCalculation1,PwCalculation2,PwCalculation3,PwCalculation4,PwCalculation5,PwCalculation6,PwCalculation7,PwCalculation8,PwCalculation9,PwCalculation10,PwCalculation11\n", + "11/17/2025 12:30:18 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 1268, 1270, 1272, 1274, 1276, 1278, 1280, 1282, 1284, 1286, 1288, 1290\n", + "11/17/2025 12:30:40 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation, type: CALCJOB, finished.\n", + "11/17/2025 12:30:40 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation1, type: CALCJOB, finished.\n", + "11/17/2025 12:30:40 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation2, type: CALCJOB, finished.\n", + "11/17/2025 12:30:40 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation4, type: CALCJOB, finished.\n", + "11/17/2025 12:30:40 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation5, type: CALCJOB, finished.\n", + "11/17/2025 12:30:40 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation6, type: CALCJOB, finished.\n", + "11/17/2025 12:30:40 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation10, type: CALCJOB, finished.\n", + "11/17/2025 12:30:41 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "11/17/2025 12:30:41 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 1274, 1282, 1284, 1286, 1290\n", + "11/17/2025 12:30:43 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation3, type: CALCJOB, finished.\n", + "11/17/2025 12:30:43 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation7, type: CALCJOB, finished.\n", + "11/17/2025 12:30:43 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation8, type: CALCJOB, finished.\n", + "11/17/2025 12:30:43 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation9, type: CALCJOB, finished.\n", + "11/17/2025 12:30:43 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation11, type: CALCJOB, finished.\n", + "11/17/2025 12:30:44 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "11/17/2025 12:30:44 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "11/17/2025 12:30:44 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1246|WorkGraphEngine|update_task_state]: Task: qe, type: GRAPH, finished.\n", + "11/17/2025 12:30:44 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1246|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_train_files\n", + "11/17/2025 12:30:44 PM <33412> plumpy.processes: [ERROR] Error in task create_train_files: type `` is not supported as it is not json-serializable\n", "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", - " yield transport_request.future\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_workgraph/engine/task_manager.py\", line 202, in execute_function_task\n", + " process, _ = task.execute(args, kwargs, var_kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_workgraph/tasks/aiida.py\", line 33, in execute\n", + " _, process = run_get_node(executor, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/launch.py\", line 65, in run_get_node\n", + " return runner.run_get_node(process, inputs, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/runners.py\", line 291, in run_get_node\n", + " result, node = self._run(process, inputs, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/runners.py\", line 241, in _run\n", + " result, node = process.run_get_node(**inputs) # type: ignore[union-attr]\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/functions.py\", line 225, in run_get_node\n", + " process: Process = process_class(inputs=inputs, runner=runner)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/base/state_machine.py\", line 205, in __call__\n", + " inst.transition_to(inst.create_initial_state())\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/base/state_machine.py\", line 357, in transition_to\n", + " self.transition_failed(initial_state_label, label, *sys.exc_info()[1:])\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/processes.py\", line 1095, in transition_failed\n", + " raise exception.with_traceback(trace)\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/base/state_machine.py\", line 343, in transition_to\n", + " self._enter_next_state(new_state)\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/base/state_machine.py\", line 410, in _enter_next_state\n", + " self._fire_state_event(StateEventHook.ENTERING_STATE, next_state)\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/base/state_machine.py\", line 311, in _fire_state_event\n", + " callback(self, hook, state)\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/processes.py\", line 358, in \n", + " state_machine.StateEventHook.ENTERING_STATE: lambda _s, _h, state: self.on_entering(\n", + " ^^^^^^^^^^^^^^^^^\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/processes.py\", line 725, in on_entering\n", + " call_with_super_check(self.on_create)\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/base/utils.py\", line 31, in call_with_super_check\n", + " wrapped(*args, **kwargs)\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/process.py\", line 459, in on_create\n", + " self._pid = self._create_and_setup_db_record()\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/process.py\", line 660, in _create_and_setup_db_record\n", + " self.node.store_all()\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/orm/nodes/node.py\", line 551, in store_all\n", + " link_triple.node.store()\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/orm/nodes/node.py\", line 574, in store\n", + " self._backend_entity.clean_values()\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/storage/psql_dos/orm/nodes.py\", line 207, in clean_values\n", + " self.model.attributes = clean_value(self.model.attributes)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/orm/implementation/utils.py\", line 102, in clean_value\n", + " return {k: clean_value(v) for k, v in value.items()}\n", + " ^^^^^^^^^^^^^^\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/orm/implementation/utils.py\", line 102, in clean_value\n", + " return {k: clean_value(v) for k, v in value.items()}\n", + " ^^^^^^^^^^^^^^\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/orm/implementation/utils.py\", line 115, in clean_value\n", + " return clean_builtin(value)\n", + " ^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/orm/implementation/utils.py\", line 95, in clean_builtin\n", + " raise exceptions.ValidationError(f'type `{type(val)}` is not supported as it is not json-serializable')\n", + "aiida.common.exceptions.ValidationError: type `` is not supported as it is not json-serializable\n", "\n", - "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", - " result = await coro()\n", - " ^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", - " yield transport_request.future\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "\n", - "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", - " result = await coro()\n", - " ^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", - " yield transport_request.future\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "\n", - "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", - " result = await coro()\n", - " ^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", - " yield transport_request.future\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "\n", - "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", - " result = await coro()\n", - " ^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", - " yield transport_request.future\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "\n", - "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", - " result = await coro()\n", - " ^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", - " yield transport_request.future\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "\n", - "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", - " result = await coro()\n", - " ^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", - " yield transport_request.future\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "\n", - "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", - " result = await coro()\n", - " ^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", - " yield transport_request.future\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "\n", - "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", - " result = await coro()\n", - " ^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", - " yield transport_request.future\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "\n", - "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", - " result = await coro()\n", - " ^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", - " yield transport_request.future\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "\n", - "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", - " result = await coro()\n", - " ^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", - " yield transport_request.future\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "\n", - "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", - " result = await coro()\n", - " ^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "11/17/2025 11:36:00 AM <2672899> aiida.engine.transports: [ERROR] Exception whilst using transport:\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 106, in request_transport\n", - " yield transport_request.future\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "\n", - "11/17/2025 11:36:00 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [ERROR] iteration 1 of do_upload excepted, retrying after 20 seconds\n", - "Traceback (most recent call last):\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 205, in exponential_backoff_retry\n", - " result = await coro()\n", - " ^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/calcjobs/tasks.py\", line 87, in do_upload\n", - " transport = await cancellable.with_interrupt(request)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/utils.py\", line 115, in with_interrupt\n", - " result = await next(wait_iter)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/tasks.py\", line 631, in _wait_for_one\n", - " return f.result() # May raise f.exception().\n", - " ^^^^^^^^^^\n", - " File \"/usr/lib/python3.12/asyncio/futures.py\", line 203, in result\n", - " raise self._exception.with_traceback(self._exception_tb)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/transports.py\", line 87, in do_open\n", - " transport.open()\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py\", line 499, in open\n", - " self._client.connect(self._machine, **connection_arguments)\n", - " File \"/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/paramiko/client.py\", line 386, in connect\n", - " sock.connect(addr)\n", - "TimeoutError: [Errno 110] Connection timed out\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "/home/mtr46585/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/transports/plugins/ssh.py:674: AiidaDeprecationWarning: `chdir()` is deprecated and will be removed in the next major version. Use absolute paths instead. (this will be removed in v3)\n", - " warn_deprecation(\n", - "11/17/2025 11:38:40 AM <2672899> aiida.parser.PwParser: [ERROR] ERROR_OUTPUT_STDOUT_INCOMPLETE\n", - "11/17/2025 11:38:40 AM <2672899> aiida.parser.PwParser: [ERROR] Both the stdout and XML output files could not be read or parsed.\n", - "11/17/2025 11:38:40 AM <2672899> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [WARNING] output parser returned exit code<305>: Both the stdout and XML output files could not be read or parsed.\n", - "11/17/2025 11:38:47 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation, type: CALCJOB, finished.\n", - "11/17/2025 11:38:47 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation1, type: CALCJOB, finished.\n", - "11/17/2025 11:38:47 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|on_task_failed]: Task, PwCalculation2, type: CALCJOB, failed. Error message: Both the stdout and XML output files could not be read or parsed.\n", - "11/17/2025 11:38:47 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|run_error_handlers]: Run error handlers for PwCalculation2\n", - "11/17/2025 11:38:47 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation3, type: CALCJOB, finished.\n", - "11/17/2025 11:38:47 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation4, type: CALCJOB, finished.\n", - "11/17/2025 11:38:47 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation5, type: CALCJOB, finished.\n", - "11/17/2025 11:38:48 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation6, type: CALCJOB, finished.\n", - "11/17/2025 11:38:48 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation7, type: CALCJOB, finished.\n", - "11/17/2025 11:38:48 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation8, type: CALCJOB, finished.\n", - "11/17/2025 11:38:48 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation9, type: CALCJOB, finished.\n", - "11/17/2025 11:38:48 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation10, type: CALCJOB, finished.\n", - "11/17/2025 11:38:48 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|update_task_state]: Task: PwCalculation11, type: CALCJOB, finished.\n", - "11/17/2025 11:38:49 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "11/17/2025 11:38:49 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15484|WorkGraphEngine|is_workgraph_finished]: WorkGraph finished, but tasks: ['PwCalculation2'] failed. Thus all their child tasks are skipped.\n", - "11/17/2025 11:38:49 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15464|WorkGraphEngine|on_task_failed]: Task, qe, type: GRAPH, failed. Error message: WorkGraph finished, but tasks: ['PwCalculation2'] failed. Thus all their child tasks are skipped.\n", - "11/17/2025 11:38:49 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15464|WorkGraphEngine|run_error_handlers]: Run error handlers for qe\n", - "11/17/2025 11:38:49 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15464|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "11/17/2025 11:38:50 AM <2672899> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [15464|WorkGraphEngine|is_workgraph_finished]: WorkGraph finished, but tasks: ['qe'] failed. Thus all their child tasks are skipped.\n" + "11/17/2025 12:30:44 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1246|WorkGraphEngine|on_task_failed]: Task, create_train_files, type: CALCFUNCTION, failed.\n", + "11/17/2025 12:30:44 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1246|WorkGraphEngine|run_error_handlers]: Run error handlers for create_train_files\n", + "11/17/2025 12:30:44 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1246|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "11/17/2025 12:30:44 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1246|WorkGraphEngine|is_workgraph_finished]: WorkGraph finished, but tasks: ['create_train_files'] failed. Thus all their child tasks are skipped.\n" ] }, { @@ -892,32 +345,11 @@ "source": [ "wg.run()" ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "1ed6868c", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "SocketAny(name='structures', value=None)" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "wg.tasks.qe.outputs.structures" - ] } ], "metadata": { "kernelspec": { - "display_name": "aiida-mlip (3.12.3)", + "display_name": "aiida-mlip", "language": "python", "name": "python3" }, From adc5918424315532c1f4cbc685eb1a2cc7ea8aaa Mon Sep 17 00:00:00 2001 From: Muhammad Mohsin Date: Mon, 17 Nov 2025 16:20:05 +0000 Subject: [PATCH 03/15] Add train task --- .../tutorials/workgraphs/EOS_workgraph.ipynb | 356 +++++++++++------- 1 file changed, 230 insertions(+), 126 deletions(-) diff --git a/examples/tutorials/workgraphs/EOS_workgraph.ipynb b/examples/tutorials/workgraphs/EOS_workgraph.ipynb index 1238ebf9..00194c22 100644 --- a/examples/tutorials/workgraphs/EOS_workgraph.ipynb +++ b/examples/tutorials/workgraphs/EOS_workgraph.ipynb @@ -30,13 +30,29 @@ "outputs": [], "source": [ "from aiida.orm import load_code\n", + "from aiida_mlip.data.model import ModelData\n", "\n", + "uri = \"https://github.com/stfc/janus-core/raw/main/tests/models/mace_mp_small.model\"\n", + "model = ModelData.from_uri(uri, architecture=\"mace_mp\")\n", + "\n", + "janus_code = load_code(\"janus@localhost\")\n", "qe_code = load_code(\"qe@localhost\")" ] }, { "cell_type": "code", "execution_count": 3, + "id": "14451078", + "metadata": {}, + "outputs": [], + "source": [ + "from aiida.plugins import CalculationFactory\n", + "descriptorsCalc = CalculationFactory(\"mlip.descriptors\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, "id": "9c433338", "metadata": {}, "outputs": [], @@ -44,29 +60,34 @@ "from aiida_workgraph import WorkGraph, task\n", "from pathlib import Path\n", "from ase.io import read, write, iread\n", + "from ase import Atoms\n", "import numpy as np\n", - "from aiida.orm import SinglefileData, Float, InstalledCode, List, Dict, KpointsData, StructureData, load_group\n", + "from aiida.orm import SinglefileData, Float, InstalledCode, List, Dict, KpointsData, StructureData, load_group, Str, Bool, Int\n", "from aiida_quantumespresso.calculations.pw import PwCalculation\n", "from aiida_workgraph.manager import get_current_graph\n", "from ase import units\n", "import tempfile\n", + "from pathlib import Path\n", + "from sample_split import process_and_split_data\n", "\n", "@task.calcfunction(outputs=[\"scaled_file\"])\n", "def create_scales(\n", - " structure_path,\n", " min_v: Float,\n", " max_v:Float,\n", - " num_structs: int\n", + " num_structs: int,\n", + " **structures\n", "): \n", - "\n", - " atoms = read(structure_path.value)\n", - " cell = atoms.get_cell()\n", + " \n", + " atoms = []\n", + " for i, struct in structures.items():\n", + " with struct.as_path() as path:\n", + " atoms.append(read(path))\n", "\n", " lattice_scalars = np.cbrt(np.linspace(min_v.value, max_v.value, num_structs.value))\n", - " for i,s in enumerate(lattice_scalars):\n", - " b = atoms.copy()\n", - " b.set_cell(cell * s, scale_atoms=True)\n", - " write(\"scaled.extxyz\",b,append=i>0)\n", + " b = atoms.copy()\n", + " for i, s in enumerate(lattice_scalars):\n", + " b[i].set_cell((atoms[i].get_cell()) * s, scale_atoms=True)\n", + " write(\"scaled.extxyz\",b[i],append=i>0)\n", "\n", " return {\n", " \"scaled_file\": SinglefileData(Path(\"scaled.extxyz\").resolve())\n", @@ -87,6 +108,8 @@ "\n", " pseudo_family = load_group('SSSP/1.3/PBE/efficiency')\n", " \n", + " output_structures = {}\n", + "\n", " with scaled_file.as_path() as path:\n", " for i, structs in enumerate(iread(path, format=\"extxyz\")):\n", " \n", @@ -120,53 +143,80 @@ " structure=structure,\n", " )\n", "\n", - " wg.update_ctx({\n", - " f\"struct.{i}\" :{\n", + " output_structures[f\"struct{i}\"] = {\n", " \"trajectory\":qe_task.outputs.output_trajectory,\n", " \"parameters\": qe_task.outputs.output_parameters\n", " }\n", - " })\n", + " \n", + " wg.update_ctx({\n", + " \"structures\": output_structures\n", + " })\n", + " # wg.update_ctx({\n", + " # f\"struct{i}\" :{\n", + " # \"trajectory\":qe_task.outputs.output_trajectory,\n", + " # \"parameters\": qe_task.outputs.output_parameters\n", + " # }\n", + " # })\n", "\n", " return {\n", - " \"structures\": wg.ctx.struct,\n", + " \"structures\": wg.ctx.structures,\n", " }\n", "\n", - "@task.calcfunction(outputs = [\"test_file\", \"train_file\", \"valid_file\"])\n", - "def create_train_files(structures):\n", + "@task.calcfunction(outputs=[\"test_file\"])\n", + "def create_train_files(**structures):\n", "\n", - " training_files = {}\n", + " tmpfile = tempfile.NamedTemporaryFile(suffix=\".extxyz\")\n", " \n", - " for i, structs in structures.items():\n", - " tmpfile = \"mlip.extxyz\"\n", + " for structs in structures.values(): \n", "\n", - " for struct_out_params in structs.values():\n", - " \n", - " trajectory = struct_out_params[\"trajectory\"]\n", + " trajectory = structs[\"trajectory\"]\n", + "\n", + " fileStructure = trajectory.get_structure(index=0)\n", + " fileAtoms = fileStructure.get_ase()\n", "\n", - " fileStructure = trajectory.get_structure(index=0)\n", - " fileAtoms = fileStructure.get_ase()\n", + " stress = trajectory.arrays[\"stress\"][0]\n", + " converted_stress = stress * units.GPa\n", + " fileAtoms.info[\"qe_stress\"] = converted_stress\n", "\n", - " stress = trajectory.arrays[\"stress\"][0]\n", - " converted_stress = stress * units.GPa\n", - " fileAtoms.info[\"qe_stress\"] = converted_stress\n", + " fileAtoms.info[\"units\"] = {\"energy\": \"eV\",\"forces\": \"ev/Ang\",\"stress\": \"ev/Ang^3\"}\n", + " fileAtoms.set_array(\"qe_forces\", trajectory.arrays[\"forces\"][0])\n", "\n", - " fileAtoms.info[\"units\"] = {\"energy\": \"eV\",\"forces\": \"ev/Ang\",\"stress\": \"ev/Ang^3\"}\n", - " fileAtoms.set_array(\"qe_forces\", trajectory.arrays[\"forces\"][0])\n", + " parameters = structs[\"parameters\"]\n", + " fileParams = parameters.get_dict()\n", + " fileAtoms.info[\"qe_energy\"] = fileParams[\"energy\"]\n", + " write(Path(tmpfile.name), fileAtoms, append=True)\n", + "\n", + " process_inputs = {\n", + " \"config_types\": Str(\"\"),\n", + " \"prefix\": Str(\"\"),\n", + " \"scale\": Float(1.0e5),\n", + " \"append_mode\": Bool(False),\n", + " \"n_samples\": Int(len(structures)),\n", + " \"trajectory_data\": tmpfile.name\n", + " }\n", "\n", - " parameters = struct_out_params[\"parameters\"]\n", - " fileParams = parameters.get_dict()\n", - " fileAtoms.info[\"qe_energy\"] = fileParams[\"energy\"]\n", - " write(tmpfile, fileAtoms, append=True)\n", - "\n" + " process_and_split_data(**process_inputs)\n", + " \n", + " return{\n", + " \"test_file\": SinglefileData(tmpfile)\n", + " }\n" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "id": "a35e9ed6", "metadata": {}, "outputs": [], "source": [ + "calc_inputs = {\n", + " \"code\": janus_code,\n", + " \"model\": model,\n", + " \"arch\": Str(model.architecture),\n", + " \"device\": Str(\"cuda\"),\n", + " \"metadata\": {\"options\": {\"resources\": {\"num_machines\": 1}}},\n", + "}\n", + "\n", "scales_inputs = {\n", " \"min_v\": 0.95,\n", " \"max_v\": 1.05,\n", @@ -177,7 +227,9 @@ " \"task_metadata\": Dict({\n", " \"options\": {\n", " \"resources\": {\n", - " \"num_machines\": 1,\n", + " \"tot_num_mpiprocs\":1,\n", + " 'num_mpiprocs_per_machine':1,\n", + " 'num_cores_per_mpiproc':8,\n", " },\n", " \"max_wallclock_seconds\": 3600,\n", " \"queue_name\": \"scarf\",\n", @@ -196,19 +248,42 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "id": "9074302a", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "defining outputnode\n" + ] + } + ], "source": [ "with WorkGraph(\"EOS_workflow\") as wg:\n", "\n", - " initial_structure = str(Path(\"../structures/NaCl-traj.xyz\").resolve())\n", - " \n", + " initial_structure = Path(\"../structures/NaCl-traj.xyz\").resolve()\n", + "\n", + "\n", + " final_structures = {}\n", + "\n", + " for i, struct in enumerate(iread(initial_structure)):\n", + " structure = StructureData(ase=struct)\n", + " \n", + " descriptors_calc = wg.add_task(\n", + " descriptorsCalc,\n", + " **calc_inputs,\n", + " struct=structure,\n", + " calc_per_element=True,\n", + " )\n", + "\n", + " final_structures[f\"structs{i}\"] = descriptors_calc.outputs.xyz_output\n", + " \n", " scales_task = wg.add_task(\n", " create_scales,\n", - " structure_path=initial_structure,\n", - " **scales_inputs\n", + " **scales_inputs,\n", + " structures=final_structures\n", " )\n", "\n", " qe_task = wg.add_task(\n", @@ -216,7 +291,7 @@ " scaled_file=scales_task.outputs.scaled_file,\n", " **qe_inputs\n", " )\n", - "\n", + " \n", " train_task = wg.add_task(\n", " create_train_files,\n", " structures=qe_task.outputs.structures\n", @@ -226,7 +301,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "id": "f230babb", "metadata": {}, "outputs": [ @@ -234,41 +309,71 @@ "name": "stderr", "output_type": "stream", "text": [ - "11/17/2025 12:30:15 PM <33412> aiida.broker.rabbitmq: [WARNING] RabbitMQ v3.12.1 is not supported and will cause unexpected problems!\n", - "11/17/2025 12:30:15 PM <33412> aiida.broker.rabbitmq: [WARNING] It can cause long-running workflows to crash and jobs to be submitted multiple times.\n", - "11/17/2025 12:30:15 PM <33412> aiida.broker.rabbitmq: [WARNING] See https://github.com/aiidateam/aiida-core/wiki/RabbitMQ-version-to-use for details.\n", - "11/17/2025 12:30:15 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1246|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_scales\n", - "11/17/2025 12:30:16 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1246|WorkGraphEngine|update_task_state]: Task: create_scales, type: CALCFUNCTION, finished.\n", - "11/17/2025 12:30:16 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1246|WorkGraphEngine|continue_workgraph]: tasks ready to run: qe\n", - "11/17/2025 12:30:17 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1246|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 1266\n", - "11/17/2025 12:30:17 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|continue_workgraph]: tasks ready to run: PwCalculation,PwCalculation1,PwCalculation2,PwCalculation3,PwCalculation4,PwCalculation5,PwCalculation6,PwCalculation7,PwCalculation8,PwCalculation9,PwCalculation10,PwCalculation11\n", - "11/17/2025 12:30:18 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 1268, 1270, 1272, 1274, 1276, 1278, 1280, 1282, 1284, 1286, 1288, 1290\n", - "11/17/2025 12:30:40 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation, type: CALCJOB, finished.\n", - "11/17/2025 12:30:40 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation1, type: CALCJOB, finished.\n", - "11/17/2025 12:30:40 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation2, type: CALCJOB, finished.\n", - "11/17/2025 12:30:40 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation4, type: CALCJOB, finished.\n", - "11/17/2025 12:30:40 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation5, type: CALCJOB, finished.\n", - "11/17/2025 12:30:40 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation6, type: CALCJOB, finished.\n", - "11/17/2025 12:30:40 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation10, type: CALCJOB, finished.\n", - "11/17/2025 12:30:41 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "11/17/2025 12:30:41 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 1274, 1282, 1284, 1286, 1290\n", - "11/17/2025 12:30:43 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation3, type: CALCJOB, finished.\n", - "11/17/2025 12:30:43 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation7, type: CALCJOB, finished.\n", - "11/17/2025 12:30:43 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation8, type: CALCJOB, finished.\n", - "11/17/2025 12:30:43 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation9, type: CALCJOB, finished.\n", - "11/17/2025 12:30:43 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|update_task_state]: Task: PwCalculation11, type: CALCJOB, finished.\n", - "11/17/2025 12:30:44 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "11/17/2025 12:30:44 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1266|WorkGraphEngine|finalize]: Finalize workgraph.\n", - "11/17/2025 12:30:44 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1246|WorkGraphEngine|update_task_state]: Task: qe, type: GRAPH, finished.\n", - "11/17/2025 12:30:44 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1246|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_train_files\n", - "11/17/2025 12:30:44 PM <33412> plumpy.processes: [ERROR] Error in task create_train_files: type `` is not supported as it is not json-serializable\n", + "11/17/2025 04:14:57 PM <165050> aiida.broker.rabbitmq: [WARNING] RabbitMQ v3.12.1 is not supported and will cause unexpected problems!\n", + "11/17/2025 04:14:57 PM <165050> aiida.broker.rabbitmq: [WARNING] It can cause long-running workflows to crash and jobs to be submitted multiple times.\n", + "11/17/2025 04:14:57 PM <165050> aiida.broker.rabbitmq: [WARNING] See https://github.com/aiidateam/aiida-core/wiki/RabbitMQ-version-to-use for details.\n", + "11/17/2025 04:14:58 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|continue_workgraph]: tasks ready to run: Descriptors,Descriptors1,Descriptors2,Descriptors3,Descriptors4,Descriptors5,Descriptors6,Descriptors7,Descriptors8,Descriptors9,Descriptors10,Descriptors11\n", + "11/17/2025 04:15:00 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 10138, 10143, 10148, 10153, 10158, 10163, 10168, 10173, 10178, 10183, 10188, 10193\n", + "11/17/2025 04:15:13 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors, type: CALCJOB, finished.\n", + "11/17/2025 04:15:13 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors1, type: CALCJOB, finished.\n", + "11/17/2025 04:15:13 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors2, type: CALCJOB, finished.\n", + "11/17/2025 04:15:14 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors3, type: CALCJOB, finished.\n", + "11/17/2025 04:15:14 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors4, type: CALCJOB, finished.\n", + "11/17/2025 04:15:14 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors5, type: CALCJOB, finished.\n", + "11/17/2025 04:15:14 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors6, type: CALCJOB, finished.\n", + "11/17/2025 04:15:14 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors7, type: CALCJOB, finished.\n", + "11/17/2025 04:15:14 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors8, type: CALCJOB, finished.\n", + "11/17/2025 04:15:14 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors9, type: CALCJOB, finished.\n", + "11/17/2025 04:15:14 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors10, type: CALCJOB, finished.\n", + "11/17/2025 04:15:14 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors11, type: CALCJOB, finished.\n", + "11/17/2025 04:15:15 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_scales\n", + "11/17/2025 04:15:15 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: create_scales, type: CALCFUNCTION, finished.\n", + "11/17/2025 04:15:15 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|continue_workgraph]: tasks ready to run: qe\n", + "11/17/2025 04:15:16 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 10284\n", + "11/17/2025 04:15:17 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|continue_workgraph]: tasks ready to run: PwCalculation,PwCalculation1,PwCalculation2,PwCalculation3,PwCalculation4,PwCalculation5,PwCalculation6,PwCalculation7,PwCalculation8,PwCalculation9,PwCalculation10,PwCalculation11\n", + "11/17/2025 04:15:21 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 10286, 10288, 10290, 10292, 10294, 10296, 10298, 10300, 10302, 10304, 10306, 10308\n", + "11/17/2025 04:15:37 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation, type: CALCJOB, finished.\n", + "11/17/2025 04:15:37 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "11/17/2025 04:15:37 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 10288, 10290, 10292, 10294, 10296, 10298, 10300, 10302, 10304, 10306, 10308\n", + "11/17/2025 04:15:40 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation1, type: CALCJOB, finished.\n", + "11/17/2025 04:15:40 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation2, type: CALCJOB, finished.\n", + "11/17/2025 04:15:40 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation3, type: CALCJOB, finished.\n", + "11/17/2025 04:15:41 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation4, type: CALCJOB, finished.\n", + "11/17/2025 04:15:41 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation5, type: CALCJOB, finished.\n", + "11/17/2025 04:15:41 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation7, type: CALCJOB, finished.\n", + "11/17/2025 04:15:41 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "11/17/2025 04:15:41 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 10298, 10302, 10304, 10306, 10308\n", + "11/17/2025 04:15:44 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation6, type: CALCJOB, finished.\n", + "11/17/2025 04:15:44 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation8, type: CALCJOB, finished.\n", + "11/17/2025 04:15:44 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation9, type: CALCJOB, finished.\n", + "11/17/2025 04:15:44 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation10, type: CALCJOB, finished.\n", + "11/17/2025 04:15:44 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation11, type: CALCJOB, finished.\n", + "11/17/2025 04:15:44 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "11/17/2025 04:15:44 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "11/17/2025 04:15:45 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: qe, type: GRAPH, finished.\n", + "11/17/2025 04:15:45 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_train_files\n", + "11/17/2025 04:15:46 PM <165050> aiida.orm.nodes.process.calculation.calcfunction.CalcFunctionNode: [REPORT] [10369|create_train_files|on_except]: Traceback (most recent call last):\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/process_states.py\", line 250, in execute\n", + " result = await self.run_fn(*self.args, **self.kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/functions.py\", line 603, in run\n", + " result = self._func(*args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/tmp/ipykernel_165050/2840419190.py\", line 139, in create_train_files\n", + " process_and_split_data(**process_inputs)\n", + " File \"/home/strix/aiida-mlip/examples/tutorials/workgraphs/sample_split.py\", line 134, in process_and_split_data\n", + " [atoms[x].info[f\"mace_mp_{s}_descriptor\"] * scale for s in specs]\n", + " ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + "KeyError: 'mace_mp_Cl_descriptor'\n", + "\n", + "11/17/2025 04:15:46 PM <165050> plumpy.processes: [ERROR] Error in task create_train_files: 'mace_mp_Cl_descriptor'\n", "Traceback (most recent call last):\n", " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_workgraph/engine/task_manager.py\", line 202, in execute_function_task\n", " process, _ = task.execute(args, kwargs, var_kwargs)\n", " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_workgraph/tasks/aiida.py\", line 33, in execute\n", - " _, process = run_get_node(executor, **kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_workgraph/tasks/aiida.py\", line 35, in execute\n", + " _, process = run_get_node(executor, **kwargs, **var_kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/launch.py\", line 65, in run_get_node\n", " return runner.run_get_node(process, inputs, **kwargs)\n", " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", @@ -278,57 +383,46 @@ " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/runners.py\", line 241, in _run\n", " result, node = process.run_get_node(**inputs) # type: ignore[union-attr]\n", " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/functions.py\", line 225, in run_get_node\n", - " process: Process = process_class(inputs=inputs, runner=runner)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/base/state_machine.py\", line 205, in __call__\n", - " inst.transition_to(inst.create_initial_state())\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/base/state_machine.py\", line 357, in transition_to\n", - " self.transition_failed(initial_state_label, label, *sys.exc_info()[1:])\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/processes.py\", line 1095, in transition_failed\n", - " raise exception.with_traceback(trace)\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/base/state_machine.py\", line 343, in transition_to\n", - " self._enter_next_state(new_state)\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/base/state_machine.py\", line 410, in _enter_next_state\n", - " self._fire_state_event(StateEventHook.ENTERING_STATE, next_state)\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/base/state_machine.py\", line 311, in _fire_state_event\n", - " callback(self, hook, state)\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/processes.py\", line 358, in \n", - " state_machine.StateEventHook.ENTERING_STATE: lambda _s, _h, state: self.on_entering(\n", - " ^^^^^^^^^^^^^^^^^\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/processes.py\", line 725, in on_entering\n", - " call_with_super_check(self.on_create)\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/base/utils.py\", line 31, in call_with_super_check\n", - " wrapped(*args, **kwargs)\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/process.py\", line 459, in on_create\n", - " self._pid = self._create_and_setup_db_record()\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/process.py\", line 660, in _create_and_setup_db_record\n", - " self.node.store_all()\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/orm/nodes/node.py\", line 551, in store_all\n", - " link_triple.node.store()\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/orm/nodes/node.py\", line 574, in store\n", - " self._backend_entity.clean_values()\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/storage/psql_dos/orm/nodes.py\", line 207, in clean_values\n", - " self.model.attributes = clean_value(self.model.attributes)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/orm/implementation/utils.py\", line 102, in clean_value\n", - " return {k: clean_value(v) for k, v in value.items()}\n", - " ^^^^^^^^^^^^^^\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/orm/implementation/utils.py\", line 102, in clean_value\n", - " return {k: clean_value(v) for k, v in value.items()}\n", - " ^^^^^^^^^^^^^^\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/orm/implementation/utils.py\", line 115, in clean_value\n", - " return clean_builtin(value)\n", - " ^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/orm/implementation/utils.py\", line 95, in clean_builtin\n", - " raise exceptions.ValidationError(f'type `{type(val)}` is not supported as it is not json-serializable')\n", - "aiida.common.exceptions.ValidationError: type `` is not supported as it is not json-serializable\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/functions.py\", line 246, in run_get_node\n", + " result = process.execute()\n", + " ^^^^^^^^^^^^^^^^^\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/functions.py\", line 555, in execute\n", + " result = super().execute()\n", + " ^^^^^^^^^^^^^^^^^\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/processes.py\", line 101, in func_wrapper\n", + " return func(self, *args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/processes.py\", line 1313, in execute\n", + " return self.future().result()\n", + " ^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/process_states.py\", line 250, in execute\n", + " result = await self.run_fn(*self.args, **self.kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/functions.py\", line 603, in run\n", + " result = self._func(*args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/tmp/ipykernel_165050/2840419190.py\", line 139, in create_train_files\n", + " process_and_split_data(**process_inputs)\n", + " File \"/home/strix/aiida-mlip/examples/tutorials/workgraphs/sample_split.py\", line 134, in process_and_split_data\n", + " [atoms[x].info[f\"mace_mp_{s}_descriptor\"] * scale for s in specs]\n", + " ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + "KeyError: 'mace_mp_Cl_descriptor'\n", "\n", - "11/17/2025 12:30:44 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1246|WorkGraphEngine|on_task_failed]: Task, create_train_files, type: CALCFUNCTION, failed.\n", - "11/17/2025 12:30:44 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1246|WorkGraphEngine|run_error_handlers]: Run error handlers for create_train_files\n", - "11/17/2025 12:30:44 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1246|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "11/17/2025 12:30:44 PM <33412> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [1246|WorkGraphEngine|is_workgraph_finished]: WorkGraph finished, but tasks: ['create_train_files'] failed. Thus all their child tasks are skipped.\n" + "11/17/2025 04:15:46 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|on_task_failed]: Task, create_train_files, type: CALCFUNCTION, failed.\n", + "11/17/2025 04:15:46 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|run_error_handlers]: Run error handlers for create_train_files\n", + "11/17/2025 04:15:46 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "11/17/2025 04:15:46 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|is_workgraph_finished]: WorkGraph finished, but tasks: ['create_train_files'] failed. Thus all their child tasks are skipped.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'qe_stress': array([[ 1.86398131e-01, 5.97281145e-17, -1.99093715e-17],\n", + " [ 5.97281145e-17, 1.86398131e-01, -5.97281145e-17],\n", + " [-5.97281145e-17, -1.99093715e-17, 1.86398131e-01]]), 'units': {'energy': 'eV', 'forces': 'ev/Ang', 'stress': 'ev/Ang^3'}, 'qe_energy': -1748.7982484694}\n", + "create files: train_file=PosixPath('train.xyz'), valid_file=PosixPath('valid.xyz') and test_file=PosixPath('test.xyz')\n", + "Processing: ('all', 'unknown_system'), 12 frames\n" ] }, { @@ -337,7 +431,7 @@ "{}" ] }, - "execution_count": 6, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -345,6 +439,16 @@ "source": [ "wg.run()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a0d82d6a", + "metadata": {}, + "outputs": [], + "source": [ + "#QE task is not appending decriptor so it causes creat_train_to fail" + ] } ], "metadata": { From e07acd09ae66fe802c158a168444b74e4744fa98 Mon Sep 17 00:00:00 2001 From: Muhammad Mohsin Date: Thu, 20 Nov 2025 15:06:48 +0000 Subject: [PATCH 04/15] finish wg --- .../tutorials/workgraphs/EOS_workgraph.ipynb | 299 +++++++----------- 1 file changed, 110 insertions(+), 189 deletions(-) diff --git a/examples/tutorials/workgraphs/EOS_workgraph.ipynb b/examples/tutorials/workgraphs/EOS_workgraph.ipynb index 00194c22..7700714e 100644 --- a/examples/tutorials/workgraphs/EOS_workgraph.ipynb +++ b/examples/tutorials/workgraphs/EOS_workgraph.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 9, "id": "233a4da4", "metadata": {}, "outputs": [ @@ -12,7 +12,7 @@ "Profile" ] }, - "execution_count": 1, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 10, "id": "a3ca17e8", "metadata": {}, "outputs": [], @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 11, "id": "14451078", "metadata": {}, "outputs": [], @@ -52,7 +52,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "9c433338", "metadata": {}, "outputs": [], @@ -68,29 +68,28 @@ "from ase import units\n", "import tempfile\n", "from pathlib import Path\n", - "from sample_split import process_and_split_data\n", + "from random import shuffle\n", "\n", "@task.calcfunction(outputs=[\"scaled_file\"])\n", "def create_scales(\n", " min_v: Float,\n", " max_v:Float,\n", " num_structs: int,\n", - " **structures\n", + " structures_path\n", "): \n", - " \n", - " atoms = []\n", - " for i, struct in structures.items():\n", - " with struct.as_path() as path:\n", - " atoms.append(read(path))\n", + " tmpfile = tempfile.NamedTemporaryFile(suffix=\".extxyz\")\n", + "\n", + " atoms = read(structures_path.value, index=\":\")\n", + " cell = atoms[0].get_cell()\n", "\n", " lattice_scalars = np.cbrt(np.linspace(min_v.value, max_v.value, num_structs.value))\n", " b = atoms.copy()\n", " for i, s in enumerate(lattice_scalars):\n", - " b[i].set_cell((atoms[i].get_cell()) * s, scale_atoms=True)\n", - " write(\"scaled.extxyz\",b[i],append=i>0)\n", + " b[i].set_cell(cell * s, scale_atoms=True)\n", + " write(tmpfile.name,b[i],append=i>0)\n", "\n", " return {\n", - " \"scaled_file\": SinglefileData(Path(\"scaled.extxyz\").resolve())\n", + " \"scaled_file\": SinglefileData(tmpfile.name)\n", " }\n", "\n", "@task.graph(outputs = [\"structures\"])\n", @@ -151,12 +150,6 @@ " wg.update_ctx({\n", " \"structures\": output_structures\n", " })\n", - " # wg.update_ctx({\n", - " # f\"struct{i}\" :{\n", - " # \"trajectory\":qe_task.outputs.output_trajectory,\n", - " # \"parameters\": qe_task.outputs.output_parameters\n", - " # }\n", - " # })\n", "\n", " return {\n", " \"structures\": wg.ctx.structures,\n", @@ -165,46 +158,49 @@ "@task.calcfunction(outputs=[\"test_file\"])\n", "def create_train_files(**structures):\n", "\n", - " tmpfile = tempfile.NamedTemporaryFile(suffix=\".extxyz\")\n", + " # tmpfile = tempfile.NamedTemporaryFile(suffix=\".extxyz\")\n", " \n", - " for structs in structures.values(): \n", + " structures_stack = list(structures.keys())\n", + " shuffle(structures_stack)\n", + " \n", + " n = len(structures_stack)\n", + " i1 = int(n*0.7)\n", + " i2 = int(n*0.9)\n", + "\n", + " test_list = structures_stack[:i1]\n", + " train_list = structures_stack[i1:i2]\n", + " valid_list = structures_stack[i2:]\n", "\n", - " trajectory = structs[\"trajectory\"]\n", + " for structs in test_list: \n", + " \n", + " trajectory = structures[structs][\"trajectory\"]\n", "\n", - " fileStructure = trajectory.get_structure(index=0)\n", - " fileAtoms = fileStructure.get_ase()\n", + " print(trajectory)\n", "\n", - " stress = trajectory.arrays[\"stress\"][0]\n", - " converted_stress = stress * units.GPa\n", - " fileAtoms.info[\"qe_stress\"] = converted_stress\n", + " # fileStructure = trajectory.get_structure(index=0)\n", + " # fileAtoms = fileStructure.get_ase()\n", "\n", - " fileAtoms.info[\"units\"] = {\"energy\": \"eV\",\"forces\": \"ev/Ang\",\"stress\": \"ev/Ang^3\"}\n", - " fileAtoms.set_array(\"qe_forces\", trajectory.arrays[\"forces\"][0])\n", + " # stress = trajectory.arrays[\"stress\"][0]\n", + " # converted_stress = stress * units.GPa\n", + " # fileAtoms.info[\"qe_stress\"] = converted_stress\n", "\n", - " parameters = structs[\"parameters\"]\n", - " fileParams = parameters.get_dict()\n", - " fileAtoms.info[\"qe_energy\"] = fileParams[\"energy\"]\n", - " write(Path(tmpfile.name), fileAtoms, append=True)\n", + " # fileAtoms.info[\"units\"] = {\"energy\": \"eV\",\"forces\": \"ev/Ang\",\"stress\": \"ev/Ang^3\"}\n", + " # fileAtoms.set_array(\"qe_forces\", trajectory.arrays[\"forces\"][0])\n", "\n", - " process_inputs = {\n", - " \"config_types\": Str(\"\"),\n", - " \"prefix\": Str(\"\"),\n", - " \"scale\": Float(1.0e5),\n", - " \"append_mode\": Bool(False),\n", - " \"n_samples\": Int(len(structures)),\n", - " \"trajectory_data\": tmpfile.name\n", - " }\n", + " # parameters = structs[\"parameters\"]\n", + " # fileParams = parameters.get_dict()\n", + " # fileAtoms.info[\"qe_energy\"] = fileParams[\"energy\"]\n", + " # write(Path(tmpfile.name), fileAtoms, append=True)\n", "\n", - " process_and_split_data(**process_inputs)\n", " \n", - " return{\n", - " \"test_file\": SinglefileData(tmpfile)\n", - " }\n" + " # return{\n", + " # \"test_file\": SinglefileData(tmpfile)\n", + " # }\n" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 13, "id": "a35e9ed6", "metadata": {}, "outputs": [], @@ -248,42 +244,19 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 14, "id": "9074302a", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "defining outputnode\n" - ] - } - ], + "outputs": [], "source": [ "with WorkGraph(\"EOS_workflow\") as wg:\n", "\n", - " initial_structure = Path(\"../structures/NaCl-traj.xyz\").resolve()\n", + " initial_structure = str(Path(\"../structures/NaCl-traj.xyz\").resolve())\n", "\n", - "\n", - " final_structures = {}\n", - "\n", - " for i, struct in enumerate(iread(initial_structure)):\n", - " structure = StructureData(ase=struct)\n", - " \n", - " descriptors_calc = wg.add_task(\n", - " descriptorsCalc,\n", - " **calc_inputs,\n", - " struct=structure,\n", - " calc_per_element=True,\n", - " )\n", - "\n", - " final_structures[f\"structs{i}\"] = descriptors_calc.outputs.xyz_output\n", - " \n", " scales_task = wg.add_task(\n", " create_scales,\n", " **scales_inputs,\n", - " structures=final_structures\n", + " structures_path=initial_structure\n", " )\n", "\n", " qe_task = wg.add_task(\n", @@ -301,7 +274,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 15, "id": "f230babb", "metadata": {}, "outputs": [ @@ -309,120 +282,39 @@ "name": "stderr", "output_type": "stream", "text": [ - "11/17/2025 04:14:57 PM <165050> aiida.broker.rabbitmq: [WARNING] RabbitMQ v3.12.1 is not supported and will cause unexpected problems!\n", - "11/17/2025 04:14:57 PM <165050> aiida.broker.rabbitmq: [WARNING] It can cause long-running workflows to crash and jobs to be submitted multiple times.\n", - "11/17/2025 04:14:57 PM <165050> aiida.broker.rabbitmq: [WARNING] See https://github.com/aiidateam/aiida-core/wiki/RabbitMQ-version-to-use for details.\n", - "11/17/2025 04:14:58 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|continue_workgraph]: tasks ready to run: Descriptors,Descriptors1,Descriptors2,Descriptors3,Descriptors4,Descriptors5,Descriptors6,Descriptors7,Descriptors8,Descriptors9,Descriptors10,Descriptors11\n", - "11/17/2025 04:15:00 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 10138, 10143, 10148, 10153, 10158, 10163, 10168, 10173, 10178, 10183, 10188, 10193\n", - "11/17/2025 04:15:13 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors, type: CALCJOB, finished.\n", - "11/17/2025 04:15:13 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors1, type: CALCJOB, finished.\n", - "11/17/2025 04:15:13 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors2, type: CALCJOB, finished.\n", - "11/17/2025 04:15:14 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors3, type: CALCJOB, finished.\n", - "11/17/2025 04:15:14 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors4, type: CALCJOB, finished.\n", - "11/17/2025 04:15:14 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors5, type: CALCJOB, finished.\n", - "11/17/2025 04:15:14 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors6, type: CALCJOB, finished.\n", - "11/17/2025 04:15:14 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors7, type: CALCJOB, finished.\n", - "11/17/2025 04:15:14 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors8, type: CALCJOB, finished.\n", - "11/17/2025 04:15:14 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors9, type: CALCJOB, finished.\n", - "11/17/2025 04:15:14 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors10, type: CALCJOB, finished.\n", - "11/17/2025 04:15:14 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: Descriptors11, type: CALCJOB, finished.\n", - "11/17/2025 04:15:15 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_scales\n", - "11/17/2025 04:15:15 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: create_scales, type: CALCFUNCTION, finished.\n", - "11/17/2025 04:15:15 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|continue_workgraph]: tasks ready to run: qe\n", - "11/17/2025 04:15:16 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 10284\n", - "11/17/2025 04:15:17 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|continue_workgraph]: tasks ready to run: PwCalculation,PwCalculation1,PwCalculation2,PwCalculation3,PwCalculation4,PwCalculation5,PwCalculation6,PwCalculation7,PwCalculation8,PwCalculation9,PwCalculation10,PwCalculation11\n", - "11/17/2025 04:15:21 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 10286, 10288, 10290, 10292, 10294, 10296, 10298, 10300, 10302, 10304, 10306, 10308\n", - "11/17/2025 04:15:37 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation, type: CALCJOB, finished.\n", - "11/17/2025 04:15:37 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "11/17/2025 04:15:37 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 10288, 10290, 10292, 10294, 10296, 10298, 10300, 10302, 10304, 10306, 10308\n", - "11/17/2025 04:15:40 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation1, type: CALCJOB, finished.\n", - "11/17/2025 04:15:40 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation2, type: CALCJOB, finished.\n", - "11/17/2025 04:15:40 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation3, type: CALCJOB, finished.\n", - "11/17/2025 04:15:41 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation4, type: CALCJOB, finished.\n", - "11/17/2025 04:15:41 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation5, type: CALCJOB, finished.\n", - "11/17/2025 04:15:41 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation7, type: CALCJOB, finished.\n", - "11/17/2025 04:15:41 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "11/17/2025 04:15:41 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 10298, 10302, 10304, 10306, 10308\n", - "11/17/2025 04:15:44 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation6, type: CALCJOB, finished.\n", - "11/17/2025 04:15:44 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation8, type: CALCJOB, finished.\n", - "11/17/2025 04:15:44 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation9, type: CALCJOB, finished.\n", - "11/17/2025 04:15:44 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation10, type: CALCJOB, finished.\n", - "11/17/2025 04:15:44 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|update_task_state]: Task: PwCalculation11, type: CALCJOB, finished.\n", - "11/17/2025 04:15:44 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "11/17/2025 04:15:44 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10284|WorkGraphEngine|finalize]: Finalize workgraph.\n", - "11/17/2025 04:15:45 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|update_task_state]: Task: qe, type: GRAPH, finished.\n", - "11/17/2025 04:15:45 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_train_files\n", - "11/17/2025 04:15:46 PM <165050> aiida.orm.nodes.process.calculation.calcfunction.CalcFunctionNode: [REPORT] [10369|create_train_files|on_except]: Traceback (most recent call last):\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/process_states.py\", line 250, in execute\n", - " result = await self.run_fn(*self.args, **self.kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/functions.py\", line 603, in run\n", - " result = self._func(*args, **kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/tmp/ipykernel_165050/2840419190.py\", line 139, in create_train_files\n", - " process_and_split_data(**process_inputs)\n", - " File \"/home/strix/aiida-mlip/examples/tutorials/workgraphs/sample_split.py\", line 134, in process_and_split_data\n", - " [atoms[x].info[f\"mace_mp_{s}_descriptor\"] * scale for s in specs]\n", - " ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - "KeyError: 'mace_mp_Cl_descriptor'\n", - "\n", - "11/17/2025 04:15:46 PM <165050> plumpy.processes: [ERROR] Error in task create_train_files: 'mace_mp_Cl_descriptor'\n", - "Traceback (most recent call last):\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_workgraph/engine/task_manager.py\", line 202, in execute_function_task\n", - " process, _ = task.execute(args, kwargs, var_kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_workgraph/tasks/aiida.py\", line 35, in execute\n", - " _, process = run_get_node(executor, **kwargs, **var_kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/launch.py\", line 65, in run_get_node\n", - " return runner.run_get_node(process, inputs, **kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/runners.py\", line 291, in run_get_node\n", - " result, node = self._run(process, inputs, **kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/runners.py\", line 241, in _run\n", - " result, node = process.run_get_node(**inputs) # type: ignore[union-attr]\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/functions.py\", line 246, in run_get_node\n", - " result = process.execute()\n", - " ^^^^^^^^^^^^^^^^^\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/functions.py\", line 555, in execute\n", - " result = super().execute()\n", - " ^^^^^^^^^^^^^^^^^\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/processes.py\", line 101, in func_wrapper\n", - " return func(self, *args, **kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/processes.py\", line 1313, in execute\n", - " return self.future().result()\n", - " ^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/plumpy/process_states.py\", line 250, in execute\n", - " result = await self.run_fn(*self.args, **self.kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida/engine/processes/functions.py\", line 603, in run\n", - " result = self._func(*args, **kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/tmp/ipykernel_165050/2840419190.py\", line 139, in create_train_files\n", - " process_and_split_data(**process_inputs)\n", - " File \"/home/strix/aiida-mlip/examples/tutorials/workgraphs/sample_split.py\", line 134, in process_and_split_data\n", - " [atoms[x].info[f\"mace_mp_{s}_descriptor\"] * scale for s in specs]\n", - " ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - "KeyError: 'mace_mp_Cl_descriptor'\n", - "\n", - "11/17/2025 04:15:46 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|on_task_failed]: Task, create_train_files, type: CALCFUNCTION, failed.\n", - "11/17/2025 04:15:46 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|run_error_handlers]: Run error handlers for create_train_files\n", - "11/17/2025 04:15:46 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "11/17/2025 04:15:46 PM <165050> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [10133|WorkGraphEngine|is_workgraph_finished]: WorkGraph finished, but tasks: ['create_train_files'] failed. Thus all their child tasks are skipped.\n" + "11/20/2025 01:31:13 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12663|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_scales\n", + "11/20/2025 01:31:13 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12663|WorkGraphEngine|update_task_state]: Task: create_scales, type: CALCFUNCTION, finished.\n", + "11/20/2025 01:31:13 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12663|WorkGraphEngine|continue_workgraph]: tasks ready to run: qe\n", + "11/20/2025 01:31:14 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12663|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 12683\n", + "11/20/2025 01:31:14 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12683|WorkGraphEngine|continue_workgraph]: tasks ready to run: PwCalculation,PwCalculation1,PwCalculation2,PwCalculation3,PwCalculation4,PwCalculation5,PwCalculation6,PwCalculation7,PwCalculation8,PwCalculation9,PwCalculation10,PwCalculation11\n", + "11/20/2025 01:31:16 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12683|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 12685, 12687, 12689, 12691, 12693, 12695, 12697, 12699, 12701, 12703, 12705, 12707\n", + "11/20/2025 01:31:35 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12683|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "11/20/2025 01:31:35 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12683|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 12687, 12693, 12695, 12697, 12699, 12701, 12703, 12705, 12707\n", + "11/20/2025 01:31:42 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12683|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "11/20/2025 01:31:42 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12683|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "11/20/2025 01:31:43 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12663|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_train_files\n", + "11/20/2025 01:31:43 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12663|WorkGraphEngine|update_task_state]: Task: create_train_files, type: CALCFUNCTION, finished.\n", + "11/20/2025 01:31:43 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12663|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "11/20/2025 01:31:43 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12663|WorkGraphEngine|finalize]: Finalize workgraph.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "{'qe_stress': array([[ 1.86398131e-01, 5.97281145e-17, -1.99093715e-17],\n", - " [ 5.97281145e-17, 1.86398131e-01, -5.97281145e-17],\n", - " [-5.97281145e-17, -1.99093715e-17, 1.86398131e-01]]), 'units': {'energy': 'eV', 'forces': 'ev/Ang', 'stress': 'ev/Ang^3'}, 'qe_energy': -1748.7982484694}\n", - "create files: train_file=PosixPath('train.xyz'), valid_file=PosixPath('valid.xyz') and test_file=PosixPath('test.xyz')\n", - "Processing: ('all', 'unknown_system'), 12 frames\n" + "12\n", + "uuid: 4a81eacb-6e65-4ad4-9d99-a9f1a770c31e (pk: 12742)\n", + "uuid: 707d3078-abdf-4053-942c-c47ce1764683 (pk: 12763)\n", + "uuid: 448c1dd7-a6dc-4dbb-bd9c-78126b130e74 (pk: 12757)\n", + "uuid: 03d7e72b-c18a-40c8-8f04-0fff7f3a9f3b (pk: 12751)\n", + "uuid: 776bd872-a378-435c-b5ec-f13e07cb3f34 (pk: 12730)\n", + "uuid: c34c2b59-00d3-4a9d-ae66-f4ca75640ef2 (pk: 12727)\n", + "uuid: 3eb5dee6-c9b2-4c30-8d55-2854a68a6bb1 (pk: 12760)\n", + "uuid: 01329bd0-c3e2-4244-895b-9be9d7b0d915 (pk: 12724)\n", + "uuid: 038c4e04-9dbc-46dd-8d21-3c3bd5ed4cac (pk: 12766)\n", + "uuid: cf2594a4-e174-4164-a52e-03263cb7f06e (pk: 12745)\n", + "uuid: 19821317-6782-44c5-bc87-46bf1a031149 (pk: 12748)\n", + "uuid: 0ffa128c-a447-4768-9c17-5c7c495e36d2 (pk: 12754)\n" ] }, { @@ -431,7 +323,7 @@ "{}" ] }, - "execution_count": 7, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -442,12 +334,41 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "a0d82d6a", + "execution_count": 22, + "id": "58e90f01", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "6\n", + "7\n" + ] + } + ], "source": [ - "#QE task is not appending decriptor so it causes creat_train_to fail" + "from random import shuffle\n", + "\n", + "dict_T = {\n", + " \"struct0\":\n", + " {\"traj\":\"traj0\", \"param\":\"param0\"},\n", + " \"struct1\":\n", + " {\"traj\":\"traj1\", \"param\":\"param1\"},\n", + " \"struct2\":\n", + " {\"traj\":\"traj2\", \"param\":\"param2\"},\n", + "}\n", + "\n", + "list_t = [1,2,3,4,5,6,7,8,9,10,11,12]\n", + "\n", + "for i in range(round(len(list_t)*0.7)):\n", + " print(i)\n" ] } ], From 68f2f59924ac4011f6647b7ca4e685eb895d3946 Mon Sep 17 00:00:00 2001 From: Muhammad Mohsin Date: Thu, 20 Nov 2025 15:08:20 +0000 Subject: [PATCH 05/15] finish wg --- .../tutorials/workgraphs/EOS_workgraph.ipynb | 172 +++++------------- 1 file changed, 47 insertions(+), 125 deletions(-) diff --git a/examples/tutorials/workgraphs/EOS_workgraph.ipynb b/examples/tutorials/workgraphs/EOS_workgraph.ipynb index 7700714e..598abd54 100644 --- a/examples/tutorials/workgraphs/EOS_workgraph.ipynb +++ b/examples/tutorials/workgraphs/EOS_workgraph.ipynb @@ -2,21 +2,10 @@ "cells": [ { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "233a4da4", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Profile" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "from aiida import load_profile \n", "load_profile()" @@ -24,7 +13,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "a3ca17e8", "metadata": {}, "outputs": [], @@ -41,7 +30,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "14451078", "metadata": {}, "outputs": [], @@ -155,7 +144,7 @@ " \"structures\": wg.ctx.structures,\n", " }\n", "\n", - "@task.calcfunction(outputs=[\"test_file\"])\n", + "@task.calcfunction(outputs=[\"test_file\", \"train_file\", \"valid_file\"])\n", "def create_train_files(**structures):\n", "\n", " # tmpfile = tempfile.NamedTemporaryFile(suffix=\".extxyz\")\n", @@ -167,40 +156,52 @@ " i1 = int(n*0.7)\n", " i2 = int(n*0.9)\n", "\n", - " test_list = structures_stack[:i1]\n", - " train_list = structures_stack[i1:i2]\n", - " valid_list = structures_stack[i2:]\n", + " training_split = {\n", + " \"test\":structures_stack[:i1],\n", + " \"train\":structures_stack[i1:i2],\n", + " \"valid\":structures_stack[i2:]\n", + " }\n", "\n", - " for structs in test_list: \n", - " \n", - " trajectory = structures[structs][\"trajectory\"]\n", + " files = {}\n", "\n", - " print(trajectory)\n", + " for split, split_structures in training_split.items():\n", + " tmpfile = tempfile.NamedTemporaryFile(suffix=f\"{split}.extxyz\")\n", + " for struct in split_structures:\n", "\n", - " # fileStructure = trajectory.get_structure(index=0)\n", - " # fileAtoms = fileStructure.get_ase()\n", + " trajectory = structures[struct][\"trajectory\"]\n", + " fileStructure = trajectory.get_structure(index=0)\n", + " fileAtoms = fileStructure.get_ase()\n", "\n", - " # stress = trajectory.arrays[\"stress\"][0]\n", - " # converted_stress = stress * units.GPa\n", - " # fileAtoms.info[\"qe_stress\"] = converted_stress\n", + " stress = trajectory.arrays[\"stress\"][0]\n", + " converted_stress = stress * units.GPa\n", + " fileAtoms.info[\"qe_stress\"] = converted_stress\n", "\n", - " # fileAtoms.info[\"units\"] = {\"energy\": \"eV\",\"forces\": \"ev/Ang\",\"stress\": \"ev/Ang^3\"}\n", - " # fileAtoms.set_array(\"qe_forces\", trajectory.arrays[\"forces\"][0])\n", + " fileAtoms.info[\"units\"] = {\"energy\": \"eV\",\"forces\": \"ev/Ang\",\"stress\": \"ev/Ang^3\"}\n", + " fileAtoms.set_array(\"qe_forces\", trajectory.arrays[\"forces\"][0])\n", "\n", - " # parameters = structs[\"parameters\"]\n", - " # fileParams = parameters.get_dict()\n", - " # fileAtoms.info[\"qe_energy\"] = fileParams[\"energy\"]\n", - " # write(Path(tmpfile.name), fileAtoms, append=True)\n", + " parameters = structures[struct][\"parameters\"]\n", + " fileParams = parameters.get_dict()\n", + " fileAtoms.info[\"qe_energy\"] = fileParams[\"energy\"]\n", + " \n", + " write(Path(tmpfile.name), fileAtoms, append=True)\n", "\n", - " \n", - " # return{\n", - " # \"test_file\": SinglefileData(tmpfile)\n", - " # }\n" + " files[f\"{split}_file\"] = SinglefileData(tmpfile)\n", + " \n", + " for filename, file in files.items():\n", + " with file.as_path() as path:\n", + " num_structs = len(read(path, index=\":\"))\n", + " print(f\"{filename} has {num_structs} structures\")\n", + "\n", + " return{\n", + " \"test_file\": files[\"test_file\"],\n", + " \"train_file\": files[\"train_file\"],\n", + " \"valid_file\": files[\"valid_file\"]\n", + " }\n" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "a35e9ed6", "metadata": {}, "outputs": [], @@ -244,7 +245,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "9074302a", "metadata": {}, "outputs": [], @@ -274,101 +275,22 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "id": "f230babb", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11/20/2025 01:31:13 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12663|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_scales\n", - "11/20/2025 01:31:13 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12663|WorkGraphEngine|update_task_state]: Task: create_scales, type: CALCFUNCTION, finished.\n", - "11/20/2025 01:31:13 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12663|WorkGraphEngine|continue_workgraph]: tasks ready to run: qe\n", - "11/20/2025 01:31:14 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12663|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 12683\n", - "11/20/2025 01:31:14 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12683|WorkGraphEngine|continue_workgraph]: tasks ready to run: PwCalculation,PwCalculation1,PwCalculation2,PwCalculation3,PwCalculation4,PwCalculation5,PwCalculation6,PwCalculation7,PwCalculation8,PwCalculation9,PwCalculation10,PwCalculation11\n", - "11/20/2025 01:31:16 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12683|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 12685, 12687, 12689, 12691, 12693, 12695, 12697, 12699, 12701, 12703, 12705, 12707\n", - "11/20/2025 01:31:35 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12683|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "11/20/2025 01:31:35 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12683|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 12687, 12693, 12695, 12697, 12699, 12701, 12703, 12705, 12707\n", - "11/20/2025 01:31:42 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12683|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "11/20/2025 01:31:42 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12683|WorkGraphEngine|finalize]: Finalize workgraph.\n", - "11/20/2025 01:31:43 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12663|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_train_files\n", - "11/20/2025 01:31:43 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12663|WorkGraphEngine|update_task_state]: Task: create_train_files, type: CALCFUNCTION, finished.\n", - "11/20/2025 01:31:43 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12663|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "11/20/2025 01:31:43 PM <53514> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [12663|WorkGraphEngine|finalize]: Finalize workgraph.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "12\n", - "uuid: 4a81eacb-6e65-4ad4-9d99-a9f1a770c31e (pk: 12742)\n", - "uuid: 707d3078-abdf-4053-942c-c47ce1764683 (pk: 12763)\n", - "uuid: 448c1dd7-a6dc-4dbb-bd9c-78126b130e74 (pk: 12757)\n", - "uuid: 03d7e72b-c18a-40c8-8f04-0fff7f3a9f3b (pk: 12751)\n", - "uuid: 776bd872-a378-435c-b5ec-f13e07cb3f34 (pk: 12730)\n", - "uuid: c34c2b59-00d3-4a9d-ae66-f4ca75640ef2 (pk: 12727)\n", - "uuid: 3eb5dee6-c9b2-4c30-8d55-2854a68a6bb1 (pk: 12760)\n", - "uuid: 01329bd0-c3e2-4244-895b-9be9d7b0d915 (pk: 12724)\n", - "uuid: 038c4e04-9dbc-46dd-8d21-3c3bd5ed4cac (pk: 12766)\n", - "uuid: cf2594a4-e174-4164-a52e-03263cb7f06e (pk: 12745)\n", - "uuid: 19821317-6782-44c5-bc87-46bf1a031149 (pk: 12748)\n", - "uuid: 0ffa128c-a447-4768-9c17-5c7c495e36d2 (pk: 12754)\n" - ] - }, - { - "data": { - "text/plain": [ - "{}" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "wg.run()" ] }, { "cell_type": "code", - "execution_count": 22, - "id": "58e90f01", + "execution_count": null, + "id": "a3145225", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n", - "1\n", - "2\n", - "3\n", - "4\n", - "5\n", - "6\n", - "7\n" - ] - } - ], + "outputs": [], "source": [ - "from random import shuffle\n", - "\n", - "dict_T = {\n", - " \"struct0\":\n", - " {\"traj\":\"traj0\", \"param\":\"param0\"},\n", - " \"struct1\":\n", - " {\"traj\":\"traj1\", \"param\":\"param1\"},\n", - " \"struct2\":\n", - " {\"traj\":\"traj2\", \"param\":\"param2\"},\n", - "}\n", - "\n", - "list_t = [1,2,3,4,5,6,7,8,9,10,11,12]\n", - "\n", - "for i in range(round(len(list_t)*0.7)):\n", - " print(i)\n" + "print(wg.tasks.create_train_files.outputs.test_file.value.get_content())" ] } ], From 5d464c58d615d91bf24e665515d2d8fc0a61037f Mon Sep 17 00:00:00 2001 From: Muhammad Mohsin Date: Fri, 21 Nov 2025 12:09:18 +0000 Subject: [PATCH 06/15] Refactor create_scales task, return StructureData --- .../tutorials/workgraphs/EOS_workgraph.ipynb | 241 ++++++++++++------ 1 file changed, 164 insertions(+), 77 deletions(-) diff --git a/examples/tutorials/workgraphs/EOS_workgraph.ipynb b/examples/tutorials/workgraphs/EOS_workgraph.ipynb index 598abd54..8781ffb0 100644 --- a/examples/tutorials/workgraphs/EOS_workgraph.ipynb +++ b/examples/tutorials/workgraphs/EOS_workgraph.ipynb @@ -2,10 +2,21 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "233a4da4", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Profile" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from aiida import load_profile \n", "load_profile()" @@ -13,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "a3ca17e8", "metadata": {}, "outputs": [], @@ -30,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "14451078", "metadata": {}, "outputs": [], @@ -59,34 +70,39 @@ "from pathlib import Path\n", "from random import shuffle\n", "\n", - "@task.calcfunction(outputs=[\"scaled_file\"])\n", + "@task.calcfunction(outputs=[\"scaled_structures\"])\n", "def create_scales(\n", " min_v: Float,\n", " max_v:Float,\n", " num_structs: int,\n", - " structures_path\n", + " **structures\n", "): \n", - " tmpfile = tempfile.NamedTemporaryFile(suffix=\".extxyz\")\n", + " lattice_scalars = np.cbrt(np.linspace(min_v.value, max_v.value, num_structs.value))\n", + " scaled_structures = {}\n", "\n", - " atoms = read(structures_path.value, index=\":\")\n", - " cell = atoms[0].get_cell()\n", + " for structure in structures.values():\n", "\n", - " lattice_scalars = np.cbrt(np.linspace(min_v.value, max_v.value, num_structs.value))\n", - " b = atoms.copy()\n", - " for i, s in enumerate(lattice_scalars):\n", - " b[i].set_cell(cell * s, scale_atoms=True)\n", - " write(tmpfile.name,b[i],append=i>0)\n", + " atom = structure.get_ase()\n", + " cell = atom.get_cell()\n", + "\n", + " for i, s in enumerate(lattice_scalars):\n", + " scaled_atom = atom.copy()\n", + " scaled_atom.set_cell(cell * s, scale_atoms=True)\n", + " struct_data = f\"struct{i}\"\n", + " scaled_structures[struct_data] = StructureData(ase=scaled_atom)\n", + " \n", + " print(scaled_structures)\n", "\n", " return {\n", - " \"scaled_file\": SinglefileData(tmpfile.name)\n", + " \"scaled_structures\": scaled_structures\n", " }\n", "\n", - "@task.graph(outputs = [\"structures\"])\n", + "@task.graph()\n", "def qe(\n", " code: InstalledCode,\n", " kpoints_mesh: List,\n", " task_metadata: Dict,\n", - " scaled_file: SinglefileData,\n", + " **scaled_structures,\n", " ):\n", "\n", " wg = get_current_graph()\n", @@ -98,51 +114,52 @@ " \n", " output_structures = {}\n", "\n", - " with scaled_file.as_path() as path:\n", - " for i, structs in enumerate(iread(path, format=\"extxyz\")):\n", + " for i, structs in scaled_structures:\n", + " print(i)\n", + " print(structs)\n", " \n", - " structure = StructureData(ase=structs)\n", - " pseudos = pseudo_family.get_pseudos(structure=structure)\n", - "\n", - " ecutwfc, ecutrho = pseudo_family.get_recommended_cutoffs(\n", - " structure=structure,\n", - " unit='Ry',\n", - " )\n", - "\n", - " pw_params = {\n", - " \"CONTROL\": {\n", - " \"calculation\": \"scf\",\n", - " 'tprnfor': True,\n", - " 'tstress': True,\n", - " },\n", - " \"SYSTEM\": {\n", - " \"ecutwfc\": ecutwfc,\n", - " \"ecutrho\": ecutrho,\n", - " },\n", - " }\n", + " # structure = StructureData(ase=structs)\n", + " # pseudos = pseudo_family.get_pseudos(structure=structure)\n", + "\n", + " # ecutwfc, ecutrho = pseudo_family.get_recommended_cutoffs(\n", + " # structure=structure,\n", + " # unit='Ry',\n", + " # )\n", + "\n", + " # pw_params = {\n", + " # \"CONTROL\": {\n", + " # \"calculation\": \"scf\",\n", + " # 'tprnfor': True,\n", + " # 'tstress': True,\n", + " # },\n", + " # \"SYSTEM\": {\n", + " # \"ecutwfc\": ecutwfc,\n", + " # \"ecutrho\": ecutrho,\n", + " # },\n", + " # }\n", " \n", - " qe_task = wg.add_task(\n", - " PwCalculation,\n", - " code=code,\n", - " parameters=pw_params,\n", - " kpoints=kpoints,\n", - " pseudos=pseudos,\n", - " metadata=task_metadata.value,\n", - " structure=structure,\n", - " )\n", - "\n", - " output_structures[f\"struct{i}\"] = {\n", - " \"trajectory\":qe_task.outputs.output_trajectory,\n", - " \"parameters\": qe_task.outputs.output_parameters\n", - " }\n", + " # qe_task = wg.add_task(\n", + " # PwCalculation,\n", + " # code=code,\n", + " # parameters=pw_params,\n", + " # kpoints=kpoints,\n", + " # pseudos=pseudos,\n", + " # metadata=task_metadata.value,\n", + " # structure=structure,\n", + " # )\n", + "\n", + " # output_structures[f\"struct{i}\"] = {\n", + " # \"trajectory\":qe_task.outputs.output_trajectory,\n", + " # \"parameters\": qe_task.outputs.output_parameters\n", + " # }\n", " \n", - " wg.update_ctx({\n", - " \"structures\": output_structures\n", - " })\n", + " # wg.update_ctx({\n", + " # \"structures\": output_structures\n", + " # })\n", "\n", - " return {\n", - " \"structures\": wg.ctx.structures,\n", - " }\n", + " # return {\n", + " # \"structures\": wg.ctx.structures,\n", + " # }\n", "\n", "@task.calcfunction(outputs=[\"test_file\", \"train_file\", \"valid_file\"])\n", "def create_train_files(**structures):\n", @@ -201,7 +218,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "a35e9ed6", "metadata": {}, "outputs": [], @@ -215,9 +232,7 @@ "}\n", "\n", "scales_inputs = {\n", - " \"min_v\": 0.95,\n", - " \"max_v\": 1.05,\n", - " \"num_structs\": 12\n", + "\n", "}\n", "\n", "qe_inputs = {\n", @@ -245,7 +260,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "9074302a", "metadata": {}, "outputs": [], @@ -254,43 +269,115 @@ "\n", " initial_structure = str(Path(\"../structures/NaCl-traj.xyz\").resolve())\n", "\n", + " structures = {}\n", + " for i, struct in enumerate(iread(initial_structure)):\n", + " structures[f\"structs{i}\"] = StructureData(ase=struct)\n", + "\n", " scales_task = wg.add_task(\n", " create_scales,\n", - " **scales_inputs,\n", - " structures_path=initial_structure\n", + " min_v= 0.95,\n", + " max_v= 1.05,\n", + " num_structs= 12,\n", + " **structures\n", " )\n", "\n", " qe_task = wg.add_task(\n", " qe,\n", - " scaled_file=scales_task.outputs.scaled_file,\n", - " **qe_inputs\n", + " **qe_inputs,\n", + " scaled_structures=scales_task.outputs.scaled_structures\n", " )\n", " \n", - " train_task = wg.add_task(\n", - " create_train_files,\n", - " structures=qe_task.outputs.structures\n", - " )\n", + " # train_task = wg.add_task(\n", + " # create_train_files,\n", + " # structures=qe_task.outputs.structures\n", + " # )\n", " " ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "f230babb", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11/21/2025 11:53:51 AM <97822> aiida.broker.rabbitmq: [WARNING] RabbitMQ v3.12.1 is not supported and will cause unexpected problems!\n", + "11/21/2025 11:53:51 AM <97822> aiida.broker.rabbitmq: [WARNING] It can cause long-running workflows to crash and jobs to be submitted multiple times.\n", + "11/21/2025 11:53:51 AM <97822> aiida.broker.rabbitmq: [WARNING] See https://github.com/aiidateam/aiida-core/wiki/RabbitMQ-version-to-use for details.\n", + "11/21/2025 11:53:52 AM <97822> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [16387|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_scales\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'struct0': , 'struct1': , 'struct2': , 'struct3': , 'struct4': , 'struct5': , 'struct6': , 'struct7': , 'struct8': , 'struct9': , 'struct10': , 'struct11': }\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11/21/2025 11:53:52 AM <97822> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [16387|WorkGraphEngine|update_task_state]: Task: create_scales, type: CALCFUNCTION, finished.\n", + "11/21/2025 11:53:52 AM <97822> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [16387|WorkGraphEngine|continue_workgraph]: tasks ready to run: qe\n", + "11/21/2025 11:53:52 AM <97822> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [16387|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 16404\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11/21/2025 11:53:53 AM <97822> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [16404|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "11/21/2025 11:53:53 AM <97822> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [16404|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "11/21/2025 11:53:53 AM <97822> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [16387|WorkGraphEngine|update_task_state]: Task: qe, type: GRAPH, finished.\n", + "11/21/2025 11:53:53 AM <97822> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [16387|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "11/21/2025 11:53:53 AM <97822> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [16387|WorkGraphEngine|finalize]: Finalize workgraph.\n" + ] + }, + { + "data": { + "text/plain": [ + "{}" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "wg.run()" ] }, { "cell_type": "code", - "execution_count": null, - "id": "a3145225", + "execution_count": 8, + "id": "f5396929", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "TaskSocketNamespace(name='scaled_structures', sockets=[])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "print(wg.tasks.create_train_files.outputs.test_file.value.get_content())" + "wg.tasks.qe.inputs.scaled_structures" ] } ], From c4d57ae12a23bffe4583bf009cab7e2faccaa855 Mon Sep 17 00:00:00 2001 From: Muhammad Mohsin Date: Tue, 25 Nov 2025 13:57:45 +0000 Subject: [PATCH 07/15] Address PR comments and rename notebook --- .../tutorials/workgraphs/EOS_workgraph.ipynb | 405 ------------ .../workgraphs/scales_workgraph.ipynb | 595 ++++++++++++++++++ 2 files changed, 595 insertions(+), 405 deletions(-) delete mode 100644 examples/tutorials/workgraphs/EOS_workgraph.ipynb create mode 100644 examples/tutorials/workgraphs/scales_workgraph.ipynb diff --git a/examples/tutorials/workgraphs/EOS_workgraph.ipynb b/examples/tutorials/workgraphs/EOS_workgraph.ipynb deleted file mode 100644 index 8781ffb0..00000000 --- a/examples/tutorials/workgraphs/EOS_workgraph.ipynb +++ /dev/null @@ -1,405 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "233a4da4", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Profile" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from aiida import load_profile \n", - "load_profile()" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "a3ca17e8", - "metadata": {}, - "outputs": [], - "source": [ - "from aiida.orm import load_code\n", - "from aiida_mlip.data.model import ModelData\n", - "\n", - "uri = \"https://github.com/stfc/janus-core/raw/main/tests/models/mace_mp_small.model\"\n", - "model = ModelData.from_uri(uri, architecture=\"mace_mp\")\n", - "\n", - "janus_code = load_code(\"janus@localhost\")\n", - "qe_code = load_code(\"qe@localhost\")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "14451078", - "metadata": {}, - "outputs": [], - "source": [ - "from aiida.plugins import CalculationFactory\n", - "descriptorsCalc = CalculationFactory(\"mlip.descriptors\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9c433338", - "metadata": {}, - "outputs": [], - "source": [ - "from aiida_workgraph import WorkGraph, task\n", - "from pathlib import Path\n", - "from ase.io import read, write, iread\n", - "from ase import Atoms\n", - "import numpy as np\n", - "from aiida.orm import SinglefileData, Float, InstalledCode, List, Dict, KpointsData, StructureData, load_group, Str, Bool, Int\n", - "from aiida_quantumespresso.calculations.pw import PwCalculation\n", - "from aiida_workgraph.manager import get_current_graph\n", - "from ase import units\n", - "import tempfile\n", - "from pathlib import Path\n", - "from random import shuffle\n", - "\n", - "@task.calcfunction(outputs=[\"scaled_structures\"])\n", - "def create_scales(\n", - " min_v: Float,\n", - " max_v:Float,\n", - " num_structs: int,\n", - " **structures\n", - "): \n", - " lattice_scalars = np.cbrt(np.linspace(min_v.value, max_v.value, num_structs.value))\n", - " scaled_structures = {}\n", - "\n", - " for structure in structures.values():\n", - "\n", - " atom = structure.get_ase()\n", - " cell = atom.get_cell()\n", - "\n", - " for i, s in enumerate(lattice_scalars):\n", - " scaled_atom = atom.copy()\n", - " scaled_atom.set_cell(cell * s, scale_atoms=True)\n", - " struct_data = f\"struct{i}\"\n", - " scaled_structures[struct_data] = StructureData(ase=scaled_atom)\n", - " \n", - " print(scaled_structures)\n", - "\n", - " return {\n", - " \"scaled_structures\": scaled_structures\n", - " }\n", - "\n", - "@task.graph()\n", - "def qe(\n", - " code: InstalledCode,\n", - " kpoints_mesh: List,\n", - " task_metadata: Dict,\n", - " **scaled_structures,\n", - " ):\n", - "\n", - " wg = get_current_graph()\n", - "\n", - " kpoints = KpointsData()\n", - " kpoints.set_kpoints_mesh(kpoints_mesh)\n", - "\n", - " pseudo_family = load_group('SSSP/1.3/PBE/efficiency')\n", - " \n", - " output_structures = {}\n", - "\n", - " for i, structs in scaled_structures:\n", - " print(i)\n", - " print(structs)\n", - " \n", - " # structure = StructureData(ase=structs)\n", - " # pseudos = pseudo_family.get_pseudos(structure=structure)\n", - "\n", - " # ecutwfc, ecutrho = pseudo_family.get_recommended_cutoffs(\n", - " # structure=structure,\n", - " # unit='Ry',\n", - " # )\n", - "\n", - " # pw_params = {\n", - " # \"CONTROL\": {\n", - " # \"calculation\": \"scf\",\n", - " # 'tprnfor': True,\n", - " # 'tstress': True,\n", - " # },\n", - " # \"SYSTEM\": {\n", - " # \"ecutwfc\": ecutwfc,\n", - " # \"ecutrho\": ecutrho,\n", - " # },\n", - " # }\n", - " \n", - " # qe_task = wg.add_task(\n", - " # PwCalculation,\n", - " # code=code,\n", - " # parameters=pw_params,\n", - " # kpoints=kpoints,\n", - " # pseudos=pseudos,\n", - " # metadata=task_metadata.value,\n", - " # structure=structure,\n", - " # )\n", - "\n", - " # output_structures[f\"struct{i}\"] = {\n", - " # \"trajectory\":qe_task.outputs.output_trajectory,\n", - " # \"parameters\": qe_task.outputs.output_parameters\n", - " # }\n", - " \n", - " # wg.update_ctx({\n", - " # \"structures\": output_structures\n", - " # })\n", - "\n", - " # return {\n", - " # \"structures\": wg.ctx.structures,\n", - " # }\n", - "\n", - "@task.calcfunction(outputs=[\"test_file\", \"train_file\", \"valid_file\"])\n", - "def create_train_files(**structures):\n", - "\n", - " # tmpfile = tempfile.NamedTemporaryFile(suffix=\".extxyz\")\n", - " \n", - " structures_stack = list(structures.keys())\n", - " shuffle(structures_stack)\n", - " \n", - " n = len(structures_stack)\n", - " i1 = int(n*0.7)\n", - " i2 = int(n*0.9)\n", - "\n", - " training_split = {\n", - " \"test\":structures_stack[:i1],\n", - " \"train\":structures_stack[i1:i2],\n", - " \"valid\":structures_stack[i2:]\n", - " }\n", - "\n", - " files = {}\n", - "\n", - " for split, split_structures in training_split.items():\n", - " tmpfile = tempfile.NamedTemporaryFile(suffix=f\"{split}.extxyz\")\n", - " for struct in split_structures:\n", - "\n", - " trajectory = structures[struct][\"trajectory\"]\n", - " fileStructure = trajectory.get_structure(index=0)\n", - " fileAtoms = fileStructure.get_ase()\n", - "\n", - " stress = trajectory.arrays[\"stress\"][0]\n", - " converted_stress = stress * units.GPa\n", - " fileAtoms.info[\"qe_stress\"] = converted_stress\n", - "\n", - " fileAtoms.info[\"units\"] = {\"energy\": \"eV\",\"forces\": \"ev/Ang\",\"stress\": \"ev/Ang^3\"}\n", - " fileAtoms.set_array(\"qe_forces\", trajectory.arrays[\"forces\"][0])\n", - "\n", - " parameters = structures[struct][\"parameters\"]\n", - " fileParams = parameters.get_dict()\n", - " fileAtoms.info[\"qe_energy\"] = fileParams[\"energy\"]\n", - " \n", - " write(Path(tmpfile.name), fileAtoms, append=True)\n", - "\n", - " files[f\"{split}_file\"] = SinglefileData(tmpfile)\n", - " \n", - " for filename, file in files.items():\n", - " with file.as_path() as path:\n", - " num_structs = len(read(path, index=\":\"))\n", - " print(f\"{filename} has {num_structs} structures\")\n", - "\n", - " return{\n", - " \"test_file\": files[\"test_file\"],\n", - " \"train_file\": files[\"train_file\"],\n", - " \"valid_file\": files[\"valid_file\"]\n", - " }\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "a35e9ed6", - "metadata": {}, - "outputs": [], - "source": [ - "calc_inputs = {\n", - " \"code\": janus_code,\n", - " \"model\": model,\n", - " \"arch\": Str(model.architecture),\n", - " \"device\": Str(\"cuda\"),\n", - " \"metadata\": {\"options\": {\"resources\": {\"num_machines\": 1}}},\n", - "}\n", - "\n", - "scales_inputs = {\n", - "\n", - "}\n", - "\n", - "qe_inputs = {\n", - " \"task_metadata\": Dict({\n", - " \"options\": {\n", - " \"resources\": {\n", - " \"tot_num_mpiprocs\":1,\n", - " 'num_mpiprocs_per_machine':1,\n", - " 'num_cores_per_mpiproc':8,\n", - " },\n", - " \"max_wallclock_seconds\": 3600,\n", - " \"queue_name\": \"scarf\",\n", - " \"qos\": \"scarf\",\n", - " \"environment_variables\": {},\n", - " \"withmpi\": True,\n", - " \"prepend_text\": \"\"\"\n", - " \"\"\",\n", - " \"append_text\": \"\",\n", - " },\n", - " }),\n", - " \"kpoints_mesh\": List([1, 1, 1]),\n", - " \"code\": qe_code,\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "9074302a", - "metadata": {}, - "outputs": [], - "source": [ - "with WorkGraph(\"EOS_workflow\") as wg:\n", - "\n", - " initial_structure = str(Path(\"../structures/NaCl-traj.xyz\").resolve())\n", - "\n", - " structures = {}\n", - " for i, struct in enumerate(iread(initial_structure)):\n", - " structures[f\"structs{i}\"] = StructureData(ase=struct)\n", - "\n", - " scales_task = wg.add_task(\n", - " create_scales,\n", - " min_v= 0.95,\n", - " max_v= 1.05,\n", - " num_structs= 12,\n", - " **structures\n", - " )\n", - "\n", - " qe_task = wg.add_task(\n", - " qe,\n", - " **qe_inputs,\n", - " scaled_structures=scales_task.outputs.scaled_structures\n", - " )\n", - " \n", - " # train_task = wg.add_task(\n", - " # create_train_files,\n", - " # structures=qe_task.outputs.structures\n", - " # )\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "f230babb", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11/21/2025 11:53:51 AM <97822> aiida.broker.rabbitmq: [WARNING] RabbitMQ v3.12.1 is not supported and will cause unexpected problems!\n", - "11/21/2025 11:53:51 AM <97822> aiida.broker.rabbitmq: [WARNING] It can cause long-running workflows to crash and jobs to be submitted multiple times.\n", - "11/21/2025 11:53:51 AM <97822> aiida.broker.rabbitmq: [WARNING] See https://github.com/aiidateam/aiida-core/wiki/RabbitMQ-version-to-use for details.\n", - "11/21/2025 11:53:52 AM <97822> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [16387|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_scales\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'struct0': , 'struct1': , 'struct2': , 'struct3': , 'struct4': , 'struct5': , 'struct6': , 'struct7': , 'struct8': , 'struct9': , 'struct10': , 'struct11': }\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11/21/2025 11:53:52 AM <97822> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [16387|WorkGraphEngine|update_task_state]: Task: create_scales, type: CALCFUNCTION, finished.\n", - "11/21/2025 11:53:52 AM <97822> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [16387|WorkGraphEngine|continue_workgraph]: tasks ready to run: qe\n", - "11/21/2025 11:53:52 AM <97822> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [16387|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 16404\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11/21/2025 11:53:53 AM <97822> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [16404|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "11/21/2025 11:53:53 AM <97822> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [16404|WorkGraphEngine|finalize]: Finalize workgraph.\n", - "11/21/2025 11:53:53 AM <97822> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [16387|WorkGraphEngine|update_task_state]: Task: qe, type: GRAPH, finished.\n", - "11/21/2025 11:53:53 AM <97822> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [16387|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "11/21/2025 11:53:53 AM <97822> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [16387|WorkGraphEngine|finalize]: Finalize workgraph.\n" - ] - }, - { - "data": { - "text/plain": [ - "{}" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "wg.run()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "f5396929", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "TaskSocketNamespace(name='scaled_structures', sockets=[])" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "wg.tasks.qe.inputs.scaled_structures" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "aiida-mlip", - "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.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/tutorials/workgraphs/scales_workgraph.ipynb b/examples/tutorials/workgraphs/scales_workgraph.ipynb new file mode 100644 index 00000000..1edafa66 --- /dev/null +++ b/examples/tutorials/workgraphs/scales_workgraph.ipynb @@ -0,0 +1,595 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "75afa95b", + "metadata": {}, + "source": [ + "# Running a Multi-Step Workflow on a Remote System " + ] + }, + { + "cell_type": "markdown", + "id": "e5c9a2fb", + "metadata": {}, + "source": [ + "## Aim\n", + "\n", + "This notebook demonstrates how we can connect and execute tasks in a workflow. In this example; we get an initail structure, generate scaled structures, run `Quantum Espresso` and then split structures into `test`, `train` and `valid` files." + ] + }, + { + "cell_type": "markdown", + "id": "3ae9b9ce", + "metadata": {}, + "source": [ + "### Setup\n", + "\n", + "For this tutorial we will assume you have: \n", + "
    \n", + "
  • An AiiDA profile setup
  • \n", + "
  • An external computer setup in AiiDA with a quantum espresso code
  • \n", + " \n", + "
  • The aiida-quantumespresso, aiida-pseudo and fpsample extra dependancies installed
  • \n", + "
  • Pseudopotentails SSSP installed
  • \n", + "
      \n", + "
    • They can be installed with: aiida-pseudo install sssp
    • \n", + "
    \n", + "\n", + "
\n", + "\n", + "The initial setup is very similar to the other tutorials, such as `singlepoint.ipynb`, which goes into more detail about what each step is doing" + ] + }, + { + "cell_type": "markdown", + "id": "83b3068d", + "metadata": {}, + "source": [ + "Load the aiida profile, model and code:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "233a4da4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Profile" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from aiida import load_profile \n", + "load_profile()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a3ca17e8", + "metadata": {}, + "outputs": [], + "source": [ + "from aiida.orm import load_code\n", + "from aiida_mlip.data.model import ModelData\n", + "\n", + "uri = \"https://github.com/stfc/janus-core/raw/main/tests/models/mace_mp_small.model\"\n", + "model = ModelData.from_uri(uri, architecture=\"mace_mp\")\n", + "\n", + "janus_code = load_code(\"janus@localhost\")\n", + "qe_code = load_code(\"qe@localhost\")" + ] + }, + { + "cell_type": "markdown", + "id": "2e85ae56", + "metadata": {}, + "source": [ + "First, we set up the scaling task. It takes a `StructureData` object as input and produces scaled `atoms`. The number of generated atomic structures is determined by the `num_structs` parameter. The task returns a dictionary containing these structures." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "9c433338", + "metadata": {}, + "outputs": [], + "source": [ + "from aiida_workgraph import WorkGraph, task\n", + "import numpy as np\n", + "from aiida.orm import Int, Float, List, Dict, SinglefileData,InstalledCode, KpointsData, StructureData, load_group\n", + "\n", + "from random import shuffle\n", + "\n", + "@task.calcfunction(outputs=[\"scaled_structures\"])\n", + "def create_scales(\n", + " min_v: Float,\n", + " max_v:Float,\n", + " num_structs: Int,\n", + " structure: StructureData\n", + "): \n", + " lattice_scalars = np.cbrt(np.linspace(min_v.value, max_v.value, num_structs.value))\n", + " scaled_structures = {}\n", + "\n", + " atom = structure.get_ase()\n", + " cell = atom.get_cell()\n", + "\n", + " for i, s in enumerate(lattice_scalars):\n", + " scaled_atom = atom.copy()\n", + " scaled_atom.set_cell(cell * s, scale_atoms=True)\n", + " struct_data = f\"struct{i}\"\n", + " scaled_structures[struct_data] = StructureData(ase=scaled_atom)\n", + "\n", + "\n", + " return {\n", + " \"scaled_structures\": scaled_structures\n", + " }" + ] + }, + { + "cell_type": "markdown", + "id": "8806101d", + "metadata": {}, + "source": [ + "Before setting up the work graph, we first configure the `Quantum Espresso (QE)` task by defining the code and input parameters. Since we need to run QE on multiple structures, we create multiple `PwCalculation` tasks dynamically within the same task using `get_current_graph()`. This allows us to run QE for each structure and return the corresponding `TrajectoryData` and parameters for each." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "661c4051", + "metadata": {}, + "outputs": [], + "source": [ + "from aiida_quantumespresso.calculations.pw import PwCalculation\n", + "from aiida_workgraph.manager import get_current_graph\n", + "\n", + "@task.graph(outputs=[\"structures\"])\n", + "def qe(\n", + " code: InstalledCode,\n", + " kpoints_mesh: List,\n", + " task_metadata: Dict,\n", + " **scaled_structures,\n", + " ):\n", + "\n", + " wg = get_current_graph()\n", + "\n", + " kpoints = KpointsData()\n", + " kpoints.set_kpoints_mesh(kpoints_mesh)\n", + "\n", + " pseudo_family = load_group('SSSP/1.3/PBE/efficiency')\n", + " \n", + " output_structures = {}\n", + "\n", + " for i, structs in scaled_structures.items():\n", + " \n", + " structure = StructureData(ase=structs.get_ase())\n", + " pseudos = pseudo_family.get_pseudos(structure=structure)\n", + "\n", + " ecutwfc, ecutrho = pseudo_family.get_recommended_cutoffs(\n", + " structure=structure,\n", + " unit='Ry',\n", + " )\n", + "\n", + " pw_params = {\n", + " \"CONTROL\": {\n", + " \"calculation\": \"scf\",\n", + " 'tprnfor': True,\n", + " 'tstress': True,\n", + " },\n", + " \"SYSTEM\": {\n", + " \"ecutwfc\": ecutwfc,\n", + " \"ecutrho\": ecutrho,\n", + " },\n", + " }\n", + " \n", + " qe_task = wg.add_task(\n", + " PwCalculation,\n", + " code=code,\n", + " parameters=pw_params,\n", + " kpoints=kpoints,\n", + " pseudos=pseudos,\n", + " metadata=task_metadata.value,\n", + " structure=structure,\n", + " )\n", + "\n", + " output_structures[f\"struct{i}\"] = {\n", + " \"trajectory\":qe_task.outputs.output_trajectory,\n", + " \"parameters\": qe_task.outputs.output_parameters\n", + " }\n", + " \n", + " wg.update_ctx({\n", + " \"structures\": output_structures\n", + " })\n", + "\n", + " return {\n", + " \"structures\": wg.ctx.structures,\n", + " }" + ] + }, + { + "cell_type": "markdown", + "id": "869158e0", + "metadata": {}, + "source": [ + "The `create_train_files` extracts the attributes needed from each structure and splits structures into random test, train and validation files. This task returns `SinglefileData` instances of `test_file`, `train_file` and `valid_file`." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "44674a29", + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "from ase.io import read, write\n", + "from ase import units\n", + "import tempfile\n", + "\n", + "@task.calcfunction(outputs=[\"test_file\", \"train_file\", \"valid_file\"])\n", + "def create_train_files(**structures):\n", + " \n", + " structures_stack = list(structures.keys())\n", + " shuffle(structures_stack)\n", + " \n", + " n = len(structures_stack)\n", + " i1 = int(n*0.7)\n", + " i2 = int(n*0.9)\n", + "\n", + " training_split = {\n", + " \"test\":structures_stack[:i1],\n", + " \"train\":structures_stack[i1:i2],\n", + " \"valid\":structures_stack[i2:]\n", + " }\n", + "\n", + " files = {}\n", + "\n", + " for split, split_structures in training_split.items():\n", + " tmpfile = tempfile.NamedTemporaryFile(suffix=f\"{split}.extxyz\")\n", + " for struct in split_structures:\n", + "\n", + " trajectory = structures[struct][\"trajectory\"]\n", + " fileStructure = trajectory.get_structure(index=0)\n", + " fileAtoms = fileStructure.get_ase()\n", + "\n", + " stress = trajectory.arrays[\"stress\"][0]\n", + " converted_stress = stress * units.GPa\n", + " fileAtoms.info[\"qe_stress\"] = converted_stress\n", + "\n", + " fileAtoms.info[\"units\"] = {\"energy\": \"eV\",\"forces\": \"ev/Ang\",\"stress\": \"ev/Ang^3\"}\n", + " fileAtoms.set_array(\"qe_forces\", trajectory.arrays[\"forces\"][0])\n", + "\n", + " parameters = structures[struct][\"parameters\"]\n", + " fileParams = parameters.get_dict()\n", + " fileAtoms.info[\"qe_energy\"] = fileParams[\"energy\"]\n", + " \n", + " write(Path(tmpfile.name), fileAtoms, append=True)\n", + "\n", + " files[f\"{split}_file\"] = SinglefileData(tmpfile)\n", + " \n", + " for filename, file in files.items():\n", + " with file.as_path() as path:\n", + " num_structs = len(read(path, index=\":\"))\n", + " print(f\"{filename} has {num_structs} structures\")\n", + "\n", + " return{\n", + " \"test_file\": files[\"test_file\"],\n", + " \"train_file\": files[\"train_file\"],\n", + " \"valid_file\": files[\"valid_file\"]\n", + " }\n" + ] + }, + { + "cell_type": "markdown", + "id": "d3396d54", + "metadata": {}, + "source": [ + "Setup the QE inputs these variables can be changed to your configuration." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "a35e9ed6", + "metadata": {}, + "outputs": [], + "source": [ + "qe_inputs = {\n", + " \"task_metadata\": Dict({\n", + " \"options\": {\n", + " \"resources\": {\n", + " \"tot_num_mpiprocs\":1,\n", + " 'num_mpiprocs_per_machine':1,\n", + " 'num_cores_per_mpiproc':8,\n", + " },\n", + " \"max_wallclock_seconds\": 3600,\n", + " \"queue_name\": \"scarf\",\n", + " \"qos\": \"scarf\",\n", + " \"environment_variables\": {},\n", + " \"withmpi\": True,\n", + " \"prepend_text\": \"\"\"\n", + " \"\"\",\n", + " \"append_text\": \"\",\n", + " },\n", + " }),\n", + " \"kpoints_mesh\": List([1, 1, 1]),\n", + " \"code\": qe_code,\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "9074302a", + "metadata": {}, + "outputs": [], + "source": [ + "from ase.build import bulk\n", + "\n", + "with WorkGraph(\"EOS_workflow\") as wg:\n", + "\n", + " initial_structure = StructureData(ase=bulk(\"NaCl\", \"rocksalt\", 5.63))\n", + "\n", + " scales_task = wg.add_task(\n", + " create_scales,\n", + " min_v=0.95,\n", + " max_v=1.05,\n", + " num_structs=12,\n", + " structure=initial_structure\n", + " )\n", + "\n", + " qe_task = wg.add_task(\n", + " qe,\n", + " **qe_inputs,\n", + " scaled_structures=scales_task.outputs.scaled_structures\n", + " )\n", + " \n", + " train_task = wg.add_task(\n", + " create_train_files,\n", + " structures=qe_task.outputs.structures\n", + " )\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "59425796", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ff2411710f3045419df6bd9b58202b9c", + "version_major": 2, + "version_minor": 1 + }, + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wg" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "f230babb", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11/25/2025 01:48:47 PM <37567> aiida.broker.rabbitmq: [WARNING] RabbitMQ v3.12.1 is not supported and will cause unexpected problems!\n", + "11/25/2025 01:48:47 PM <37567> aiida.broker.rabbitmq: [WARNING] It can cause long-running workflows to crash and jobs to be submitted multiple times.\n", + "11/25/2025 01:48:47 PM <37567> aiida.broker.rabbitmq: [WARNING] See https://github.com/aiidateam/aiida-core/wiki/RabbitMQ-version-to-use for details.\n", + "11/25/2025 01:48:47 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2255|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_scales\n", + "11/25/2025 01:48:47 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2255|WorkGraphEngine|update_task_state]: Task: create_scales, type: CALCFUNCTION, finished.\n", + "11/25/2025 01:48:47 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2255|WorkGraphEngine|continue_workgraph]: tasks ready to run: qe\n", + "11/25/2025 01:48:48 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2255|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 2285\n", + "11/25/2025 01:48:49 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|continue_workgraph]: tasks ready to run: PwCalculation,PwCalculation1,PwCalculation2,PwCalculation3,PwCalculation4,PwCalculation5,PwCalculation6,PwCalculation7,PwCalculation8,PwCalculation9,PwCalculation10,PwCalculation11\n", + "11/25/2025 01:48:50 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 2287, 2289, 2291, 2293, 2295, 2297, 2299, 2301, 2303, 2305, 2307, 2309\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:15: AiidaDeprecationWarning: The parse_xml.versions module is deprecated and will be removed in aiida-quantumespresso v5.0.\n", + "Use get_schema_filepath() from parse_xml.parse instead.\n", + " from aiida_quantumespresso.parsers.parse_xml.versions import QeXmlVersion, get_xml_file_version\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/legacy.py:18: AiidaDeprecationWarning: This module has been deprecated and will be removed in aiida-quantumespresso v5.0.\n", + "If you are seeing this warning, you will have to update your Quantum ESPRESSO version (v6.6 or above).\n", + " warnings.warn(\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/legacy.py:27: AiidaDeprecationWarning: This module has been deprecated and will be removed in aiida-quantumespresso v5.0.\n", + "If you are seeing this warning, you will have to update your Quantum ESPRESSO version (v6.6 or above).\n", + " warnings.warn(\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:19: AiidaDeprecationWarning: The parse_xml.pw.parse module has been deprecated and will be removed in aiida-quantumespresso v5.0.\n", + "Use parse_xml() from parse_xml.parse directly. Legacy XML format support will be dropped.\n", + " warnings.warn(\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "11/25/2025 01:49:09 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation, type: CALCJOB, finished.\n", + "11/25/2025 01:49:09 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation2, type: CALCJOB, finished.\n", + "11/25/2025 01:49:10 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation10, type: CALCJOB, finished.\n", + "11/25/2025 01:49:10 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "11/25/2025 01:49:10 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 2289, 2293, 2295, 2297, 2299, 2301, 2303, 2305, 2309\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "11/25/2025 01:49:14 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation1, type: CALCJOB, finished.\n", + "11/25/2025 01:49:14 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation3, type: CALCJOB, finished.\n", + "11/25/2025 01:49:14 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation4, type: CALCJOB, finished.\n", + "11/25/2025 01:49:15 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation5, type: CALCJOB, finished.\n", + "11/25/2025 01:49:15 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation6, type: CALCJOB, finished.\n", + "11/25/2025 01:49:15 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation7, type: CALCJOB, finished.\n", + "11/25/2025 01:49:15 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation8, type: CALCJOB, finished.\n", + "11/25/2025 01:49:15 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation9, type: CALCJOB, finished.\n", + "11/25/2025 01:49:15 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation11, type: CALCJOB, finished.\n", + "11/25/2025 01:49:15 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "11/25/2025 01:49:15 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "11/25/2025 01:49:16 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2255|WorkGraphEngine|update_task_state]: Task: qe, type: GRAPH, finished.\n", + "11/25/2025 01:49:16 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2255|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_train_files\n", + "11/25/2025 01:49:17 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2255|WorkGraphEngine|update_task_state]: Task: create_train_files, type: CALCFUNCTION, finished.\n", + "11/25/2025 01:49:17 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2255|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "11/25/2025 01:49:17 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2255|WorkGraphEngine|finalize]: Finalize workgraph.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "test_file has 8 structures\n", + "train_file has 2 structures\n", + "valid_file has 2 structures\n" + ] + }, + { + "data": { + "text/plain": [ + "{}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wg.run()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "b96d1ae5", + "metadata": {}, + "outputs": [], + "source": [ + "test_file = wg.tasks.create_train_files.outputs.test_file.value\n", + "train_file = wg.tasks.create_train_files.outputs.train_file.value\n", + "valid_file = wg.tasks.create_train_files.outputs.valid_file.value" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f5396929", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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9tpruvXWW11dCqDTp0/rzjvvlKenpz744AN99dVXWrRokVq2bOnq0tCMLViwQK+88oqWLVum/Px8LViwQAsXLtTvf/97V5eGZubMmTO67bbb9PLLL1e7feHChVq6dKleffVV/eMf/5Cvr6+io6N17tw5gysFao9f30OT0b9/f91+++1atmyZJKmyslJhYWH6+c9/roSEBBdXB1xy8uRJhYSE6JNPPtHdd9/t6nLQzJWXl6tPnz5avny55s+fr4iICC1ZssTVZaEZS0hI0M6dO7V9+3ZXlwLYPfDAA2rdurXS09PtbaNHj5bZbNbq1atdWBmaM5PJpD/96U966KGHJF16Sio0NFRPPfWUnn76aUlSaWmpWrdurczMTI0bN86F1QI140kpNAkXLlzQZ599pqFDh9rb3NzcNHToUOXk5LiwMsBRaWmpJKlVq1YurgSQ5syZoxEjRjh8dwKu9Oc//1n9+vXT2LFjFRISosjISP3hD39wdVlo5qKiorRlyxYdPHhQkvTFF19ox44dGj58uIsrA644evSovv/+e4f/Tw8MDFT//v359xAaNA9XFwA4w7///W9ZrVa1bt3aob1169bav3+/i6oCHFVWVio+Pl533nmnevXq5epy0My9+eab+vzzz7V7925XlwLYHTlyRK+88oqefPJJ/epXv9Lu3bv1+OOPq0WLFpo8ebKry0MzlZCQIIvFoh49esjd3V1Wq1Wpqal65JFHXF0aYPf9999LUrX/Hrq8DWiICKUAwCBz5szRvn37tGPHDleXgmbu2LFj+sUvfqHNmzfL29vb1eUAdpWVlerXr59eeOEFSVJkZKT27dunV199lVAKLrN+/XqtWbNGa9eu1S233KK8vDzFx8crNDSU+xIArhOv76FJ+J//+R+5u7vrxIkTDu0nTpxQmzZtXFQVcMVjjz2mv/71r9q2bZvat2/v6nLQzH322WcqKipSnz595OHhIQ8PD33yySdaunSpPDw8ZLVaXV0imqm2bdvq5ptvdmjr2bOnCgoKXFQRID3zzDNKSEjQuHHj1Lt3b02cOFFPPPGE0tLSXF0aYHf53zz8ewiNDaEUmoQWLVqob9++2rJli72tsrJSW7Zs0YABA1xYGZo7m82mxx57TH/605+0detWhYeHu7okQEOGDNHevXuVl5dnX/r166dHHnlEeXl5cnd3d3WJaKbuvPNOHThwwKHt4MGD6tixo4sqAqSzZ8/Kzc3xn03u7u6qrKx0UUVAVeHh4WrTpo3Dv4csFov+8Y9/8O8hNGi8vocm48knn9TkyZPVr18/3XHHHVqyZInOnDmjqVOnuro0NGNz5szR2rVr9e6778rf39/+Tn9gYKDMZrOLq0Nz5e/vX2VeM19fX/3oRz9ivjO41BNPPKGoqCi98MILevjhh7Vr1y69/vrrev31111dGpqxkSNHKjU1VR06dNAtt9yi3NxcLV68WNOmTXN1aWhmysvLdfjwYfv60aNHlZeXp1atWqlDhw6Kj4/X/Pnz1a1bN4WHh2vu3LkKDQ21/0If0BCZbDabzdVFAM6ybNky/eY3v9H333+viIgILV26VP3793d1WWjGTCZTte0ZGRmaMmWKscUAVzFo0CBFRERoyZIlri4Fzdxf//pXJSYm6tChQwoPD9eTTz6pGTNmuLosNGNlZWWaO3eu/vSnP6moqEihoaEaP368kpKS1KJFC1eXh2bk448/1j333FOlffLkycrMzJTNZlNycrJef/11lZSU6K677tLy5cvVvXt3F1QL1A6hFAAAAAAAAAzHnFIAAAAAAAAwHKEUAAAAAAAADEcoBQAAAAAAAMMRSgEAAAAAAMBwhFIAAAAAAAAwHKEUAAAAAAAADEcoBQAAAAAAAMMRSgEAAAAAAMBwhFIAAACok0GDBik+Pv66jvHNN9/IZDIpLy/PKTUBAIDGh1AKAADgKk6ePKnZs2erQ4cO8vLyUps2bRQdHa2dO3fa+5hMJm3cuNGQejIzMxUUFGTIuWryzjvvaN68eS6tAQAANH4eri4AAACgIRs9erQuXLiglStXqnPnzjpx4oS2bNmiU6dO1ek4Fy5cUIsWLW5QlfVz8eJFeXp61nm/Vq1a3YBqAABAc8OTUgAAADUoKSnR9u3btWDBAt1zzz3q2LGj7rjjDiUmJuonP/mJJKlTp06SpJ/+9KcymUz29eeff14RERFasWKFwsPD5e3tbe+/ZMkSh/NERETo+eefdzjvzJkz1bp1a3l7e6tXr17661//qo8//lhTp05VaWmpTCaTTCaTfb/qntYKCgpSZmampCuvy61bt04DBw6Ut7e31qxZI0lasWKFevbsKW9vb/Xo0UPLly+/6rj89+t7nTp10gsvvKBp06bJ399fHTp00Ouvv+6wz65duxQZGSlvb2/169dPubm5VY67b98+DR8+XH5+fmrdurUmTpyof//735Kkjz/+WC1atND27dvt/RcuXKiQkBCdOHHiqvUCAICGiVAKAACgBn5+fvLz89PGjRt1/vz5avvs3r1bkpSRkaHCwkL7uiQdPnxYb7/9tt55551az51UWVmp4cOHa+fOnVq9erW++uorvfjii3J3d1dUVJSWLFmigIAAFRYWqrCwUE8//XSdrikhIUG/+MUvlJ+fr+joaK1Zs0ZJSUlKTU1Vfn6+XnjhBc2dO1crV66s03EXLVpkD5seffRRzZ49WwcOHJAklZeX64EHHtDNN9+szz77TM8//3yVuktKSjR48GBFRkZqz549+vDDD3XixAk9/PDDkq4EYRMnTlRpaalyc3M1d+5crVixQq1bt65TrQAAoGHg9T0AAIAaeHh4KDMzUzNmzNCrr76qPn36aODAgRo3bpxuvfVWSVJwcLCkS08ltWnTxmH/CxcuKCsry96nNj766CPt2rVL+fn56t69uySpc+fO9u2BgYEymUxVzlVb8fHxGjVqlH09OTlZixYtsreFh4frq6++0muvvabJkyfX+rj333+/Hn30UUnSs88+q9/+9rfatm2bbrrpJq1du1aVlZVKT0+Xt7e3brnlFn377beaPXu2ff9ly5YpMjJSL7zwgr3tj3/8o8LCwnTw4EF1795d8+fP1+bNm/Wzn/1M+/bt0+TJk+1PrAEAgMaHJ6UAAACuYvTo0fruu+/05z//WcOGDdPHH3+sPn362F+Lu5qOHTvWKZCSpLy8PLVv394eSDlbv3797P995swZff3114qLi7M/Febn56f58+fr66+/rtNxL4d0kuyhWVFRkSQpPz9ft956q/0VRkkaMGCAw/5ffPGFtm3b5lBHjx49JMleS4sWLbRmzRq9/fbbOnfunH7729/W7eIBAECDwpNSAAAA1+Dt7a17771X9957r+bOnavp06crOTlZU6ZMuep+vr6+Vdrc3Nxks9kc2i5evGj/b7PZXK8aTSbTVY9bXU3l5eWSpD/84Q/q37+/Qz93d/c6nf+/J0w3mUyqrKys9f7l5eUaOXKkFixYUGVb27Zt7f/96aefSpKKi4tVXFxc7RgDAIDGgSelAAAA6ujmm2/WmTNn7Ouenp6yWq212jc4OFiFhYX2dYvFoqNHj9rXb731Vn377bc6ePBgtfu3aNGi2nP993EPHTqks2fPXrWW1q1bKzQ0VEeOHFHXrl0dlvDw8FpdT2307NlTX375pc6dO2dv+/vf/+7Qp0+fPvrnP/+pTp06VanlcvD09ddf64knnrCHaJMnT65T8AUAABoWQikAAIAanDp1SoMHD9bq1av15Zdf6ujRo3rrrbe0cOFCPfjgg/Z+nTp10pYtW/T999/r9OnTVz3m4MGDtWrVKm3fvl179+7V5MmTHZ5KGjhwoO6++26NHj1amzdv1tGjR/XBBx/oww8/tJ+rvLxcW7Zs0b///W978DR48GAtW7ZMubm52rNnj2bNmlXl6aXqpKSkKC0tTUuXLtXBgwe1d+9eZWRkaPHixfUZsmrFxsbKZDJpxowZ+uqrr/T+++/rpZdecugzZ84cFRcXa/z48dq9e7e+/vprZWdna+rUqbJarbJarZowYYKio6M1depUZWRk6Msvv9SiRYucVicAADAWoRQAAEAN/Pz81L9/f/32t7/V3XffrV69emnu3LmaMWOGli1bZu+3aNEibd68WWFhYYqMjLzqMRMTEzVw4EA98MADGjFihB566CF16dLFoc/bb7+t22+/XePHj9fNN9+sX/7yl/ano6KiojRr1izFxMQoODhYCxcutNcQFhamH//4x4qNjdXTTz8tHx+fa17j9OnTtWLFCmVkZKh3794aOHCgMjMznfqklJ+fn/7yl79o7969ioyM1HPPPVflNb3Q0FDt3LlTVqtV9913n3r37q34+HgFBQXJzc1Nqamp+te//qXXXntN0qVX+l5//XX9+te/1hdffOG0WgEAgHFMtv+efAAAAAAAAAC4wXhSCgAAAAAAAIYjlAIAAAAAAIDhCKUAAAAAAABgOEIpAAAAAAAAGI5QCgAAAAAAAIYjlAIAAAAAAIDhCKUAAAAAAABgOEIpAAAAAAAAGI5QCgAAAAAAAIYjlAIAAAAAAIDhCKUAAAAAAABgOEIpAAAAAAAAGO7/A2fc2sMGMRgpAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from ase.io import iread\n", + "import matplotlib.pyplot as plt\n", + "\n", + "\n", + "with test_file.as_path() as path:\n", + " test_energy = np.array([struct.info['qe_energy'] for struct in iread(path, index=':')])\n", + "with train_file.as_path() as path:\n", + " train_energy = np.array([struct.info['qe_energy'] for struct in iread(path, index=':')])\n", + "with valid_file.as_path() as path:\n", + " valid_energy = np.array([struct.info['qe_energy'] for struct in iread(path, index=':')])\n", + "\n", + "train_x = np.arange(len(train_energy))\n", + "valid_x = np.arange(len(valid_energy)) + len(train_energy)\n", + "test_x = np.arange(len(test_energy)) + len(train_energy) + len(valid_energy)\n", + "\n", + "# Create plot\n", + "fig, ax = plt.subplots(figsize=(12, 5))\n", + "ax.bar(test_x, test_energy, color=\"red\", label=\"Test\")\n", + "ax.bar(train_x, train_energy, color=\"blue\", label=\"Train\")\n", + "ax.bar(valid_x, valid_energy, color=\"green\", label=\"Valid\")\n", + "\n", + "\n", + "# Compute zoom window\n", + "y_min = min(train_energy.min(), valid_energy.min(), test_energy.min())\n", + "y_max = max(train_energy.max(), valid_energy.max(), test_energy.max())\n", + "\n", + "# Shrink range by ~95% so differences are visible\n", + "padding = 0.02 * (y_max - y_min)\n", + "ax.set_ylim(y_min - padding, y_max + padding)\n", + "\n", + "ax.set_ylabel(\"Energy\")\n", + "ax.set_xlabel(\"Structures\")\n", + "ax.legend()\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "aiida-mlip", + "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.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 69ef067bf6458b47538a6fcbba42b99399b55c07 Mon Sep 17 00:00:00 2001 From: Muhammad Mohsin Date: Tue, 25 Nov 2025 14:32:55 +0000 Subject: [PATCH 08/15] Add markdowns to notebook --- .../workgraphs/scales_workgraph.ipynb | 186 +++--------------- 1 file changed, 30 insertions(+), 156 deletions(-) diff --git a/examples/tutorials/workgraphs/scales_workgraph.ipynb b/examples/tutorials/workgraphs/scales_workgraph.ipynb index 1edafa66..dd82f886 100644 --- a/examples/tutorials/workgraphs/scales_workgraph.ipynb +++ b/examples/tutorials/workgraphs/scales_workgraph.ipynb @@ -53,21 +53,10 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "233a4da4", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Profile" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "from aiida import load_profile \n", "load_profile()" @@ -75,7 +64,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "a3ca17e8", "metadata": {}, "outputs": [], @@ -100,7 +89,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "9c433338", "metadata": {}, "outputs": [], @@ -146,7 +135,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "661c4051", "metadata": {}, "outputs": [], @@ -227,7 +216,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "44674a29", "metadata": {}, "outputs": [], @@ -300,7 +289,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "a35e9ed6", "metadata": {}, "outputs": [], @@ -330,7 +319,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "9074302a", "metadata": {}, "outputs": [], @@ -362,149 +351,45 @@ " " ] }, + { + "cell_type": "markdown", + "id": "f97d4126", + "metadata": {}, + "source": [ + "Visualise and run `WorkGraph`:" + ] + }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "59425796", "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "ff2411710f3045419df6bd9b58202b9c", - "version_major": 2, - "version_minor": 1 - }, - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "wg" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "f230babb", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11/25/2025 01:48:47 PM <37567> aiida.broker.rabbitmq: [WARNING] RabbitMQ v3.12.1 is not supported and will cause unexpected problems!\n", - "11/25/2025 01:48:47 PM <37567> aiida.broker.rabbitmq: [WARNING] It can cause long-running workflows to crash and jobs to be submitted multiple times.\n", - "11/25/2025 01:48:47 PM <37567> aiida.broker.rabbitmq: [WARNING] See https://github.com/aiidateam/aiida-core/wiki/RabbitMQ-version-to-use for details.\n", - "11/25/2025 01:48:47 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2255|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_scales\n", - "11/25/2025 01:48:47 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2255|WorkGraphEngine|update_task_state]: Task: create_scales, type: CALCFUNCTION, finished.\n", - "11/25/2025 01:48:47 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2255|WorkGraphEngine|continue_workgraph]: tasks ready to run: qe\n", - "11/25/2025 01:48:48 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2255|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 2285\n", - "11/25/2025 01:48:49 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|continue_workgraph]: tasks ready to run: PwCalculation,PwCalculation1,PwCalculation2,PwCalculation3,PwCalculation4,PwCalculation5,PwCalculation6,PwCalculation7,PwCalculation8,PwCalculation9,PwCalculation10,PwCalculation11\n", - "11/25/2025 01:48:50 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 2287, 2289, 2291, 2293, 2295, 2297, 2299, 2301, 2303, 2305, 2307, 2309\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:15: AiidaDeprecationWarning: The parse_xml.versions module is deprecated and will be removed in aiida-quantumespresso v5.0.\n", - "Use get_schema_filepath() from parse_xml.parse instead.\n", - " from aiida_quantumespresso.parsers.parse_xml.versions import QeXmlVersion, get_xml_file_version\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/legacy.py:18: AiidaDeprecationWarning: This module has been deprecated and will be removed in aiida-quantumespresso v5.0.\n", - "If you are seeing this warning, you will have to update your Quantum ESPRESSO version (v6.6 or above).\n", - " warnings.warn(\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/legacy.py:27: AiidaDeprecationWarning: This module has been deprecated and will be removed in aiida-quantumespresso v5.0.\n", - "If you are seeing this warning, you will have to update your Quantum ESPRESSO version (v6.6 or above).\n", - " warnings.warn(\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:19: AiidaDeprecationWarning: The parse_xml.pw.parse module has been deprecated and will be removed in aiida-quantumespresso v5.0.\n", - "Use parse_xml() from parse_xml.parse directly. Legacy XML format support will be dropped.\n", - " warnings.warn(\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "11/25/2025 01:49:09 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation, type: CALCJOB, finished.\n", - "11/25/2025 01:49:09 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation2, type: CALCJOB, finished.\n", - "11/25/2025 01:49:10 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation10, type: CALCJOB, finished.\n", - "11/25/2025 01:49:10 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "11/25/2025 01:49:10 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 2289, 2293, 2295, 2297, 2299, 2301, 2303, 2305, 2309\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "11/25/2025 01:49:14 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation1, type: CALCJOB, finished.\n", - "11/25/2025 01:49:14 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation3, type: CALCJOB, finished.\n", - "11/25/2025 01:49:14 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation4, type: CALCJOB, finished.\n", - "11/25/2025 01:49:15 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation5, type: CALCJOB, finished.\n", - "11/25/2025 01:49:15 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation6, type: CALCJOB, finished.\n", - "11/25/2025 01:49:15 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation7, type: CALCJOB, finished.\n", - "11/25/2025 01:49:15 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation8, type: CALCJOB, finished.\n", - "11/25/2025 01:49:15 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation9, type: CALCJOB, finished.\n", - "11/25/2025 01:49:15 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|update_task_state]: Task: PwCalculation11, type: CALCJOB, finished.\n", - "11/25/2025 01:49:15 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "11/25/2025 01:49:15 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2285|WorkGraphEngine|finalize]: Finalize workgraph.\n", - "11/25/2025 01:49:16 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2255|WorkGraphEngine|update_task_state]: Task: qe, type: GRAPH, finished.\n", - "11/25/2025 01:49:16 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2255|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_train_files\n", - "11/25/2025 01:49:17 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2255|WorkGraphEngine|update_task_state]: Task: create_train_files, type: CALCFUNCTION, finished.\n", - "11/25/2025 01:49:17 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2255|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "11/25/2025 01:49:17 PM <37567> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [2255|WorkGraphEngine|finalize]: Finalize workgraph.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "test_file has 8 structures\n", - "train_file has 2 structures\n", - "valid_file has 2 structures\n" - ] - }, - { - "data": { - "text/plain": [ - "{}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "wg.run()" ] }, + { + "cell_type": "markdown", + "id": "f8a6b9ee", + "metadata": {}, + "source": [ + "We can can use the outputs to viusualise the data, in this example we will print a simple bar chart of the energies:" + ] + }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "b96d1ae5", "metadata": {}, "outputs": [], @@ -519,18 +404,7 @@ "execution_count": null, "id": "f5396929", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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9tpruvXWW11dCqDTp0/rzjvvlKenpz744AN99dVXWrRokVq2bOnq0tCMLViwQK+88oqWLVum/Px8LViwQAsXLtTvf/97V5eGZubMmTO67bbb9PLLL1e7feHChVq6dKleffVV/eMf/5Cvr6+io6N17tw5gysFao9f30OT0b9/f91+++1atmyZJKmyslJhYWH6+c9/roSEBBdXB1xy8uRJhYSE6JNPPtHdd9/t6nLQzJWXl6tPnz5avny55s+fr4iICC1ZssTVZaEZS0hI0M6dO7V9+3ZXlwLYPfDAA2rdurXS09PtbaNHj5bZbNbq1atdWBmaM5PJpD/96U966KGHJF16Sio0NFRPPfWUnn76aUlSaWmpWrdurczMTI0bN86F1QI140kpNAkXLlzQZ599pqFDh9rb3NzcNHToUOXk5LiwMsBRaWmpJKlVq1YurgSQ5syZoxEjRjh8dwKu9Oc//1n9+vXT2LFjFRISosjISP3hD39wdVlo5qKiorRlyxYdPHhQkvTFF19ox44dGj58uIsrA644evSovv/+e4f/Tw8MDFT//v359xAaNA9XFwA4w7///W9ZrVa1bt3aob1169bav3+/i6oCHFVWVio+Pl533nmnevXq5epy0My9+eab+vzzz7V7925XlwLYHTlyRK+88oqefPJJ/epXv9Lu3bv1+OOPq0WLFpo8ebKry0MzlZCQIIvFoh49esjd3V1Wq1Wpqal65JFHXF0aYPf9999LUrX/Hrq8DWiICKUAwCBz5szRvn37tGPHDleXgmbu2LFj+sUvfqHNmzfL29vb1eUAdpWVlerXr59eeOEFSVJkZKT27dunV199lVAKLrN+/XqtWbNGa9eu1S233KK8vDzFx8crNDSU+xIArhOv76FJ+J//+R+5u7vrxIkTDu0nTpxQmzZtXFQVcMVjjz2mv/71r9q2bZvat2/v6nLQzH322WcqKipSnz595OHhIQ8PD33yySdaunSpPDw8ZLVaXV0imqm2bdvq5ptvdmjr2bOnCgoKXFQRID3zzDNKSEjQuHHj1Lt3b02cOFFPPPGE0tLSXF0aYHf53zz8ewiNDaEUmoQWLVqob9++2rJli72tsrJSW7Zs0YABA1xYGZo7m82mxx57TH/605+0detWhYeHu7okQEOGDNHevXuVl5dnX/r166dHHnlEeXl5cnd3d3WJaKbuvPNOHThwwKHt4MGD6tixo4sqAqSzZ8/Kzc3xn03u7u6qrKx0UUVAVeHh4WrTpo3Dv4csFov+8Y9/8O8hNGi8vocm48knn9TkyZPVr18/3XHHHVqyZInOnDmjqVOnuro0NGNz5szR2rVr9e6778rf39/+Tn9gYKDMZrOLq0Nz5e/vX2VeM19fX/3oRz9ivjO41BNPPKGoqCi98MILevjhh7Vr1y69/vrrev31111dGpqxkSNHKjU1VR06dNAtt9yi3NxcLV68WNOmTXN1aWhmysvLdfjwYfv60aNHlZeXp1atWqlDhw6Kj4/X/Pnz1a1bN4WHh2vu3LkKDQ21/0If0BCZbDabzdVFAM6ybNky/eY3v9H333+viIgILV26VP3793d1WWjGTCZTte0ZGRmaMmWKscUAVzFo0CBFRERoyZIlri4Fzdxf//pXJSYm6tChQwoPD9eTTz6pGTNmuLosNGNlZWWaO3eu/vSnP6moqEihoaEaP368kpKS1KJFC1eXh2bk448/1j333FOlffLkycrMzJTNZlNycrJef/11lZSU6K677tLy5cvVvXt3F1QL1A6hFAAAAAAAAAzHnFIAAAAAAAAwHKEUAAAAAAAADEcoBQAAAAAAAMMRSgEAAAAAAMBwhFIAAAAAAAAwHKEUAAAAAAAADEcoBQAAAAAAAMMRSgEAAAAAAMBwhFIAAACok0GDBik+Pv66jvHNN9/IZDIpLy/PKTUBAIDGh1AKAADgKk6ePKnZs2erQ4cO8vLyUps2bRQdHa2dO3fa+5hMJm3cuNGQejIzMxUUFGTIuWryzjvvaN68eS6tAQAANH4eri4AAACgIRs9erQuXLiglStXqnPnzjpx4oS2bNmiU6dO1ek4Fy5cUIsWLW5QlfVz8eJFeXp61nm/Vq1a3YBqAABAc8OTUgAAADUoKSnR9u3btWDBAt1zzz3q2LGj7rjjDiUmJuonP/mJJKlTp06SpJ/+9KcymUz29eeff14RERFasWKFwsPD5e3tbe+/ZMkSh/NERETo+eefdzjvzJkz1bp1a3l7e6tXr17661//qo8//lhTp05VaWmpTCaTTCaTfb/qntYKCgpSZmampCuvy61bt04DBw6Ut7e31qxZI0lasWKFevbsKW9vb/Xo0UPLly+/6rj89+t7nTp10gsvvKBp06bJ399fHTp00Ouvv+6wz65duxQZGSlvb2/169dPubm5VY67b98+DR8+XH5+fmrdurUmTpyof//735Kkjz/+WC1atND27dvt/RcuXKiQkBCdOHHiqvUCAICGiVAKAACgBn5+fvLz89PGjRt1/vz5avvs3r1bkpSRkaHCwkL7uiQdPnxYb7/9tt55551az51UWVmp4cOHa+fOnVq9erW++uorvfjii3J3d1dUVJSWLFmigIAAFRYWqrCwUE8//XSdrikhIUG/+MUvlJ+fr+joaK1Zs0ZJSUlKTU1Vfn6+XnjhBc2dO1crV66s03EXLVpkD5seffRRzZ49WwcOHJAklZeX64EHHtDNN9+szz77TM8//3yVuktKSjR48GBFRkZqz549+vDDD3XixAk9/PDDkq4EYRMnTlRpaalyc3M1d+5crVixQq1bt65TrQAAoGHg9T0AAIAaeHh4KDMzUzNmzNCrr76qPn36aODAgRo3bpxuvfVWSVJwcLCkS08ltWnTxmH/CxcuKCsry96nNj766CPt2rVL+fn56t69uySpc+fO9u2BgYEymUxVzlVb8fHxGjVqlH09OTlZixYtsreFh4frq6++0muvvabJkyfX+rj333+/Hn30UUnSs88+q9/+9rfatm2bbrrpJq1du1aVlZVKT0+Xt7e3brnlFn377beaPXu2ff9ly5YpMjJSL7zwgr3tj3/8o8LCwnTw4EF1795d8+fP1+bNm/Wzn/1M+/bt0+TJk+1PrAEAgMaHJ6UAAACuYvTo0fruu+/05z//WcOGDdPHH3+sPn362F+Lu5qOHTvWKZCSpLy8PLVv394eSDlbv3797P995swZff3114qLi7M/Febn56f58+fr66+/rtNxL4d0kuyhWVFRkSQpPz9ft956q/0VRkkaMGCAw/5ffPGFtm3b5lBHjx49JMleS4sWLbRmzRq9/fbbOnfunH7729/W7eIBAECDwpNSAAAA1+Dt7a17771X9957r+bOnavp06crOTlZU6ZMuep+vr6+Vdrc3Nxks9kc2i5evGj/b7PZXK8aTSbTVY9bXU3l5eWSpD/84Q/q37+/Qz93d/c6nf+/J0w3mUyqrKys9f7l5eUaOXKkFixYUGVb27Zt7f/96aefSpKKi4tVXFxc7RgDAIDGgSelAAAA6ujmm2/WmTNn7Ouenp6yWq212jc4OFiFhYX2dYvFoqNHj9rXb731Vn377bc6ePBgtfu3aNGi2nP993EPHTqks2fPXrWW1q1bKzQ0VEeOHFHXrl0dlvDw8FpdT2307NlTX375pc6dO2dv+/vf/+7Qp0+fPvrnP/+pTp06VanlcvD09ddf64knnrCHaJMnT65T8AUAABoWQikAAIAanDp1SoMHD9bq1av15Zdf6ujRo3rrrbe0cOFCPfjgg/Z+nTp10pYtW/T999/r9OnTVz3m4MGDtWrVKm3fvl179+7V5MmTHZ5KGjhwoO6++26NHj1amzdv1tGjR/XBBx/oww8/tJ+rvLxcW7Zs0b///W978DR48GAtW7ZMubm52rNnj2bNmlXl6aXqpKSkKC0tTUuXLtXBgwe1d+9eZWRkaPHixfUZsmrFxsbKZDJpxowZ+uqrr/T+++/rpZdecugzZ84cFRcXa/z48dq9e7e+/vprZWdna+rUqbJarbJarZowYYKio6M1depUZWRk6Msvv9SiRYucVicAADAWoRQAAEAN/Pz81L9/f/32t7/V3XffrV69emnu3LmaMWOGli1bZu+3aNEibd68WWFhYYqMjLzqMRMTEzVw4EA98MADGjFihB566CF16dLFoc/bb7+t22+/XePHj9fNN9+sX/7yl/ano6KiojRr1izFxMQoODhYCxcutNcQFhamH//4x4qNjdXTTz8tHx+fa17j9OnTtWLFCmVkZKh3794aOHCgMjMznfqklJ+fn/7yl79o7969ioyM1HPPPVflNb3Q0FDt3LlTVqtV9913n3r37q34+HgFBQXJzc1Nqamp+te//qXXXntN0qVX+l5//XX9+te/1hdffOG0WgEAgHFMtv+efAAAAAAAAAC4wXhSCgAAAAAAAIYjlAIAAAAAAIDhCKUAAAAAAABgOEIpAAAAAAAAGI5QCgAAAAAAAIYjlAIAAAAAAIDhCKUAAAAAAABgOEIpAAAAAAAAGI5QCgAAAAAAAIYjlAIAAAAAAIDhCKUAAAAAAABgOEIpAAAAAAAAGO7/A2fc2sMGMRgpAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "from ase.io import iread\n", "import matplotlib.pyplot as plt\n", From 7dc1672a1d0a88730327eaef3cc4041ac41d5610 Mon Sep 17 00:00:00 2001 From: Muhammad Mohsin Date: Thu, 27 Nov 2025 13:43:31 +0000 Subject: [PATCH 09/15] Address PR comments --- ..._workgraph.ipynb => eos_fine_tuning.ipynb} | 89 ++++++++++--------- 1 file changed, 48 insertions(+), 41 deletions(-) rename examples/tutorials/workgraphs/{scales_workgraph.ipynb => eos_fine_tuning.ipynb} (79%) diff --git a/examples/tutorials/workgraphs/scales_workgraph.ipynb b/examples/tutorials/workgraphs/eos_fine_tuning.ipynb similarity index 79% rename from examples/tutorials/workgraphs/scales_workgraph.ipynb rename to examples/tutorials/workgraphs/eos_fine_tuning.ipynb index dd82f886..01495b9a 100644 --- a/examples/tutorials/workgraphs/scales_workgraph.ipynb +++ b/examples/tutorials/workgraphs/eos_fine_tuning.ipynb @@ -5,7 +5,7 @@ "id": "75afa95b", "metadata": {}, "source": [ - "# Running a Multi-Step Workflow on a Remote System " + "# Running Equation of State with Quantum Espresso Workgraph" ] }, { @@ -15,7 +15,7 @@ "source": [ "## Aim\n", "\n", - "This notebook demonstrates how we can connect and execute tasks in a workflow. In this example; we get an initail structure, generate scaled structures, run `Quantum Espresso` and then split structures into `test`, `train` and `valid` files." + "This notebook demonstrates how we can connect and execute tasks in a workflow. In this example; we get an initial structure, generate scaled structures, run `Quantum Espresso` and then split structures into `test`, `train` and `valid` files." ] }, { @@ -28,19 +28,19 @@ "For this tutorial we will assume you have: \n", "
    \n", "
  • An AiiDA profile setup
  • \n", - "
  • An external computer setup in AiiDA with a quantum espresso code
  • \n", + "
  • An external computer setup in AiiDA with quantum espresso configured
  • \n", " \n", - "
  • The aiida-quantumespresso, aiida-pseudo and fpsample extra dependancies installed
  • \n", - "
  • Pseudopotentails SSSP installed
  • \n", + "
  • The aiida-quantumespresso, aiida-pseudo and fpsample extra dependencies installed
  • \n", + "
  • Pseudopotentials SSSP installed
  • \n", "
      \n", "
    • They can be installed with: aiida-pseudo install sssp
    • \n", "
    \n", "\n", "
\n", "\n", - "The initial setup is very similar to the other tutorials, such as `singlepoint.ipynb`, which goes into more detail about what each step is doing" + "The initial setup is very similar to the other tutorials, such as ../calculations/singlepoint.ipynb, which goes into more detail about what each step is doing" ] }, { @@ -76,7 +76,7 @@ "model = ModelData.from_uri(uri, architecture=\"mace_mp\")\n", "\n", "janus_code = load_code(\"janus@localhost\")\n", - "qe_code = load_code(\"qe@localhost\")" + "qe_code = load_code(\"qe@scarf\")" ] }, { @@ -84,7 +84,7 @@ "id": "2e85ae56", "metadata": {}, "source": [ - "First, we set up the scaling task. It takes a `StructureData` object as input and produces scaled `atoms`. The number of generated atomic structures is determined by the `num_structs` parameter. The task returns a dictionary containing these structures." + "First, we set up the scaling task. It takes a `StructureData` object as input and produces atoms in fractional coordinates. The number of generated atomic structures is determined by the `num_structs` parameter. The task returns a dictionary containing these structures." ] }, { @@ -103,7 +103,7 @@ "@task.calcfunction(outputs=[\"scaled_structures\"])\n", "def create_scales(\n", " min_v: Float,\n", - " max_v:Float,\n", + " max_v: Float,\n", " num_structs: Int,\n", " structure: StructureData\n", "): \n", @@ -113,9 +113,9 @@ " atom = structure.get_ase()\n", " cell = atom.get_cell()\n", "\n", - " for i, s in enumerate(lattice_scalars):\n", + " for i, scalars in enumerate(lattice_scalars):\n", " scaled_atom = atom.copy()\n", - " scaled_atom.set_cell(cell * s, scale_atoms=True)\n", + " scaled_atom.set_cell(cell * scalars, scale_atoms=True)\n", " struct_data = f\"struct{i}\"\n", " scaled_structures[struct_data] = StructureData(ase=scaled_atom)\n", "\n", @@ -149,7 +149,7 @@ " kpoints_mesh: List,\n", " task_metadata: Dict,\n", " **scaled_structures,\n", - " ):\n", + "):\n", "\n", " wg = get_current_graph()\n", "\n", @@ -211,7 +211,7 @@ "id": "869158e0", "metadata": {}, "source": [ - "The `create_train_files` extracts the attributes needed from each structure and splits structures into random test, train and validation files. This task returns `SinglefileData` instances of `test_file`, `train_file` and `valid_file`." + "The `create_train_files` task extracts the attributes needed from each structure and splits structures into random test, train and validation files. This task returns `SinglefileData` instances of `test_file`, `train_file` and `valid_file`. This task differes from `descriptors_filter_qe.ipynb` `create_train_file` as in this task we split up the training files within the task as oppose to having them passed in and this task returns `SinglefileData` objects of the structures split up into `test_file`, `train_file` and `valid_file`." ] }, { @@ -222,7 +222,7 @@ "outputs": [], "source": [ "from pathlib import Path\n", - "from ase.io import read, write\n", + "from ase.io import iread, write\n", "from ase import units\n", "import tempfile\n", "\n", @@ -237,15 +237,16 @@ " i2 = int(n*0.9)\n", "\n", " training_split = {\n", - " \"test\":structures_stack[:i1],\n", - " \"train\":structures_stack[i1:i2],\n", - " \"valid\":structures_stack[i2:]\n", + " \"test\": structures_stack[:i1],\n", + " \"train\": structures_stack[i1:i2],\n", + " \"valid\": structures_stack[i2:]\n", " }\n", "\n", " files = {}\n", "\n", " for split, split_structures in training_split.items():\n", " tmpfile = tempfile.NamedTemporaryFile(suffix=f\"{split}.extxyz\")\n", + "\n", " for struct in split_structures:\n", "\n", " trajectory = structures[struct][\"trajectory\"]\n", @@ -266,10 +267,11 @@ " write(Path(tmpfile.name), fileAtoms, append=True)\n", "\n", " files[f\"{split}_file\"] = SinglefileData(tmpfile)\n", + " tmpfile.close()\n", " \n", " for filename, file in files.items():\n", " with file.as_path() as path:\n", - " num_structs = len(read(path, index=\":\"))\n", + " num_structs = sum(1 for _ in iread(path))\n", " print(f\"{filename} has {num_structs} structures\")\n", "\n", " return{\n", @@ -298,9 +300,8 @@ " \"task_metadata\": Dict({\n", " \"options\": {\n", " \"resources\": {\n", - " \"tot_num_mpiprocs\":1,\n", - " 'num_mpiprocs_per_machine':1,\n", - " 'num_cores_per_mpiproc':8,\n", + " \"num_machines\": 1,\n", + " \"num_mpiprocs_per_machine\": 32,\n", " },\n", " \"max_wallclock_seconds\": 3600,\n", " \"queue_name\": \"scarf\",\n", @@ -308,6 +309,10 @@ " \"environment_variables\": {},\n", " \"withmpi\": True,\n", " \"prepend_text\": \"\"\"\n", + " module purge\n", + " module use /work4/scd/scarf562/eb-common/modules/all\n", + " module load amd-modules\n", + " module load QuantumESPRESSO/7.2-foss-2023a\n", " \"\"\",\n", " \"append_text\": \"\",\n", " },\n", @@ -394,9 +399,11 @@ "metadata": {}, "outputs": [], "source": [ - "test_file = wg.tasks.create_train_files.outputs.test_file.value\n", - "train_file = wg.tasks.create_train_files.outputs.train_file.value\n", - "valid_file = wg.tasks.create_train_files.outputs.valid_file.value" + "output_files = {\n", + " \"test_file\": wg.tasks.create_train_files.outputs.test_file.value,\n", + " \"train_file\": wg.tasks.create_train_files.outputs.train_file.value,\n", + " \"valid_file\": wg.tasks.create_train_files.outputs.valid_file.value\n", + "}\n" ] }, { @@ -409,28 +416,28 @@ "from ase.io import iread\n", "import matplotlib.pyplot as plt\n", "\n", + "energies = {}\n", + "for key, file in output_files.items():\n", + " with file.as_path() as path:\n", + " energies[key]= np.array([struct.info['qe_energy'] \n", + " for struct in iread(path, index=':')])\n", "\n", - "with test_file.as_path() as path:\n", - " test_energy = np.array([struct.info['qe_energy'] for struct in iread(path, index=':')])\n", - "with train_file.as_path() as path:\n", - " train_energy = np.array([struct.info['qe_energy'] for struct in iread(path, index=':')])\n", - "with valid_file.as_path() as path:\n", - " valid_energy = np.array([struct.info['qe_energy'] for struct in iread(path, index=':')])\n", - "\n", - "train_x = np.arange(len(train_energy))\n", - "valid_x = np.arange(len(valid_energy)) + len(train_energy)\n", - "test_x = np.arange(len(test_energy)) + len(train_energy) + len(valid_energy)\n", + "lens = np.cumsum([len(x) for x in energies.values()])\n", + "axes = {key: np.arange(n) for key, n in zip(energies, lens)}\n", "\n", - "# Create plot\n", + "# # Create plot\n", "fig, ax = plt.subplots(figsize=(12, 5))\n", - "ax.bar(test_x, test_energy, color=\"red\", label=\"Test\")\n", - "ax.bar(train_x, train_energy, color=\"blue\", label=\"Train\")\n", - "ax.bar(valid_x, valid_energy, color=\"green\", label=\"Valid\")\n", + "x_length = []\n", "\n", + "for (key, x_axis), energy in zip(axes.items(), energies.values(), strict=True):\n", + "\n", + " x_length = [i for i in range((max(x_length)+1) if x_length else 0 ,len(x_axis))]\n", + " ax.bar(x_length, energy, label=key.capitalize())\n", + " \n", "\n", - "# Compute zoom window\n", - "y_min = min(train_energy.min(), valid_energy.min(), test_energy.min())\n", - "y_max = max(train_energy.max(), valid_energy.max(), test_energy.max())\n", + "#Compute zoom window\n", + "y_min = min(map(np.min, energies.values()))\n", + "y_max = max(map(np.max, energies.values()))\n", "\n", "# Shrink range by ~95% so differences are visible\n", "padding = 0.02 * (y_max - y_min)\n", From ed7d7a19bd41e23b19bfbe334a74e27c930c6c7b Mon Sep 17 00:00:00 2001 From: Muhammad Mohsin Date: Thu, 27 Nov 2025 13:58:49 +0000 Subject: [PATCH 10/15] address PR comments --- examples/tutorials/workgraphs/eos_fine_tuning.ipynb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/tutorials/workgraphs/eos_fine_tuning.ipynb b/examples/tutorials/workgraphs/eos_fine_tuning.ipynb index 01495b9a..4080c6f2 100644 --- a/examples/tutorials/workgraphs/eos_fine_tuning.ipynb +++ b/examples/tutorials/workgraphs/eos_fine_tuning.ipynb @@ -15,7 +15,7 @@ "source": [ "## Aim\n", "\n", - "This notebook demonstrates how we can connect and execute tasks in a workflow. In this example; we get an initial structure, generate scaled structures, run `Quantum Espresso` and then split structures into `test`, `train` and `valid` files." + "This notebook demonstrates how we can connect and execute tasks in a workflow. In this example; we get an initial structure, generate structures like we would do to fit an equation of state. Then as we want to use the structures for fine tuning we run DFT calculations like `Quantum Espresso` to get the reference energies and forces. Then split structures into `test`, `train` and `valid` files. This workgraph asuumed an initail structure and has a task which creates atoms in fractional coordinates, this time we do not run geometry optimisation or descriptors calculation tasks." ] }, { @@ -71,12 +71,15 @@ "source": [ "from aiida.orm import load_code\n", "from aiida_mlip.data.model import ModelData\n", + "from ase.build import bulk\n", "\n", "uri = \"https://github.com/stfc/janus-core/raw/main/tests/models/mace_mp_small.model\"\n", "model = ModelData.from_uri(uri, architecture=\"mace_mp\")\n", "\n", "janus_code = load_code(\"janus@localhost\")\n", - "qe_code = load_code(\"qe@scarf\")" + "qe_code = load_code(\"qe@scarf\")\n", + "\n", + "initial_atoms = bulk(\"NaCl\", \"rocksalt\", 5.63)" ] }, { @@ -333,7 +336,7 @@ "\n", "with WorkGraph(\"EOS_workflow\") as wg:\n", "\n", - " initial_structure = StructureData(ase=bulk(\"NaCl\", \"rocksalt\", 5.63))\n", + " initial_structure = StructureData(ase=initial_atoms)\n", "\n", " scales_task = wg.add_task(\n", " create_scales,\n", From dc054291bf2386bf6103265e9573f3e1c337a83d Mon Sep 17 00:00:00 2001 From: Muhammad Mohsin Date: Fri, 28 Nov 2025 11:50:01 +0000 Subject: [PATCH 11/15] Add scatter plot --- .../workgraphs/eos_fine_tuning.ipynb | 42 ++++++------------- 1 file changed, 12 insertions(+), 30 deletions(-) diff --git a/examples/tutorials/workgraphs/eos_fine_tuning.ipynb b/examples/tutorials/workgraphs/eos_fine_tuning.ipynb index 4080c6f2..15b41d26 100644 --- a/examples/tutorials/workgraphs/eos_fine_tuning.ipynb +++ b/examples/tutorials/workgraphs/eos_fine_tuning.ipynb @@ -77,7 +77,7 @@ "model = ModelData.from_uri(uri, architecture=\"mace_mp\")\n", "\n", "janus_code = load_code(\"janus@localhost\")\n", - "qe_code = load_code(\"qe@scarf\")\n", + "qe_code = load_code(\"qe@localhost\")\n", "\n", "initial_atoms = bulk(\"NaCl\", \"rocksalt\", 5.63)" ] @@ -304,7 +304,6 @@ " \"options\": {\n", " \"resources\": {\n", " \"num_machines\": 1,\n", - " \"num_mpiprocs_per_machine\": 32,\n", " },\n", " \"max_wallclock_seconds\": 3600,\n", " \"queue_name\": \"scarf\",\n", @@ -312,10 +311,6 @@ " \"environment_variables\": {},\n", " \"withmpi\": True,\n", " \"prepend_text\": \"\"\"\n", - " module purge\n", - " module use /work4/scd/scarf562/eb-common/modules/all\n", - " module load amd-modules\n", - " module load QuantumESPRESSO/7.2-foss-2023a\n", " \"\"\",\n", " \"append_text\": \"\",\n", " },\n", @@ -342,7 +337,7 @@ " create_scales,\n", " min_v=0.95,\n", " max_v=1.05,\n", - " num_structs=12,\n", + " num_structs=15,\n", " structure=initial_structure\n", " )\n", "\n", @@ -412,7 +407,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f5396929", + "id": "9b17b6dd", "metadata": {}, "outputs": [], "source": [ @@ -420,38 +415,25 @@ "import matplotlib.pyplot as plt\n", "\n", "energies = {}\n", + "volumes = {}\n", "for key, file in output_files.items():\n", " with file.as_path() as path:\n", - " energies[key]= np.array([struct.info['qe_energy'] \n", + " energies[key]= np.array([struct.info['qe_energy']\n", " for struct in iread(path, index=':')])\n", - "\n", + " volumes[key]= np.array([struct.get_volume() \n", + " for struct in iread(path, index=':')])\n", + " \n", "lens = np.cumsum([len(x) for x in energies.values()])\n", - "axes = {key: np.arange(n) for key, n in zip(energies, lens)}\n", "\n", - "# # Create plot\n", "fig, ax = plt.subplots(figsize=(12, 5))\n", - "x_length = []\n", - "\n", - "for (key, x_axis), energy in zip(axes.items(), energies.values(), strict=True):\n", - "\n", - " x_length = [i for i in range((max(x_length)+1) if x_length else 0 ,len(x_axis))]\n", - " ax.bar(x_length, energy, label=key.capitalize())\n", - " \n", - "\n", - "#Compute zoom window\n", - "y_min = min(map(np.min, energies.values()))\n", - "y_max = max(map(np.max, energies.values()))\n", - "\n", - "# Shrink range by ~95% so differences are visible\n", - "padding = 0.02 * (y_max - y_min)\n", - "ax.set_ylim(y_min - padding, y_max + padding)\n", + "for (key, energy), volume in zip(energies.items(), volumes.values(), strict=True):\n", + " ax.scatter(volume, energy, label=key.capitalize())\n", "\n", "ax.set_ylabel(\"Energy\")\n", - "ax.set_xlabel(\"Structures\")\n", + "ax.set_xlabel(\"Volume\")\n", "ax.legend()\n", "\n", - "plt.tight_layout()\n", - "plt.show()" + "plt.show()\n" ] } ], From 06fc57853b63ebe5ad3640416c372493617ad18e Mon Sep 17 00:00:00 2001 From: Muhammad Mohsin Date: Fri, 28 Nov 2025 12:08:28 +0000 Subject: [PATCH 12/15] address pr comments --- .../workgraphs/eos_fine_tuning.ipynb | 229 +++++++++++++++--- 1 file changed, 197 insertions(+), 32 deletions(-) diff --git a/examples/tutorials/workgraphs/eos_fine_tuning.ipynb b/examples/tutorials/workgraphs/eos_fine_tuning.ipynb index 15b41d26..e1ad5083 100644 --- a/examples/tutorials/workgraphs/eos_fine_tuning.ipynb +++ b/examples/tutorials/workgraphs/eos_fine_tuning.ipynb @@ -53,10 +53,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "233a4da4", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Profile" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from aiida import load_profile \n", "load_profile()" @@ -64,7 +75,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "a3ca17e8", "metadata": {}, "outputs": [], @@ -92,7 +103,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "9c433338", "metadata": {}, "outputs": [], @@ -138,7 +149,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "661c4051", "metadata": {}, "outputs": [], @@ -227,7 +238,7 @@ "from pathlib import Path\n", "from ase.io import iread, write\n", "from ase import units\n", - "import tempfile\n", + "from tempfile import NamedTemporaryFile\n", "\n", "@task.calcfunction(outputs=[\"test_file\", \"train_file\", \"valid_file\"])\n", "def create_train_files(**structures):\n", @@ -248,29 +259,30 @@ " files = {}\n", "\n", " for split, split_structures in training_split.items():\n", - " tmpfile = tempfile.NamedTemporaryFile(suffix=f\"{split}.extxyz\")\n", + " \n", + " with NamedTemporaryFile(suffix=f\"{split}.extxyz\") as tmp:\n", "\n", - " for struct in split_structures:\n", + " for struct in split_structures:\n", "\n", - " trajectory = structures[struct][\"trajectory\"]\n", - " fileStructure = trajectory.get_structure(index=0)\n", - " fileAtoms = fileStructure.get_ase()\n", + " trajectory = structures[struct][\"trajectory\"]\n", + " fileStructure = trajectory.get_structure(index=0)\n", + " fileAtoms = fileStructure.get_ase()\n", "\n", - " stress = trajectory.arrays[\"stress\"][0]\n", - " converted_stress = stress * units.GPa\n", - " fileAtoms.info[\"qe_stress\"] = converted_stress\n", + " stress = trajectory.arrays[\"stress\"][0]\n", + " converted_stress = stress * units.GPa\n", + " fileAtoms.info[\"qe_stress\"] = converted_stress\n", "\n", - " fileAtoms.info[\"units\"] = {\"energy\": \"eV\",\"forces\": \"ev/Ang\",\"stress\": \"ev/Ang^3\"}\n", - " fileAtoms.set_array(\"qe_forces\", trajectory.arrays[\"forces\"][0])\n", + " fileAtoms.info[\"units\"] = {\"energy\": \"eV\",\"forces\": \"ev/Ang\",\"stress\": \"ev/Ang^3\"}\n", + " fileAtoms.set_array(\"qe_forces\", trajectory.arrays[\"forces\"][0])\n", "\n", - " parameters = structures[struct][\"parameters\"]\n", - " fileParams = parameters.get_dict()\n", - " fileAtoms.info[\"qe_energy\"] = fileParams[\"energy\"]\n", - " \n", - " write(Path(tmpfile.name), fileAtoms, append=True)\n", + " parameters = structures[struct][\"parameters\"]\n", + " fileParams = parameters.get_dict()\n", + " fileAtoms.info[\"qe_energy\"] = fileParams[\"energy\"]\n", + " \n", + " write(Path(tmp.name), fileAtoms, append=True)\n", + "\n", + " files[f\"{split}_file\"] = SinglefileData(tmp)\n", "\n", - " files[f\"{split}_file\"] = SinglefileData(tmpfile)\n", - " tmpfile.close()\n", " \n", " for filename, file in files.items():\n", " with file.as_path() as path:\n", @@ -294,7 +306,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "a35e9ed6", "metadata": {}, "outputs": [], @@ -322,7 +334,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "9074302a", "metadata": {}, "outputs": [], @@ -364,20 +376,152 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "59425796", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "db8fc054cf62485e9763c45d9038bff9", + "version_major": 2, + "version_minor": 1 + }, + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "wg" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "f230babb", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11/28/2025 11:50:54 AM <28924> aiida.broker.rabbitmq: [WARNING] RabbitMQ v3.12.1 is not supported and will cause unexpected problems!\n", + "11/28/2025 11:50:54 AM <28924> aiida.broker.rabbitmq: [WARNING] It can cause long-running workflows to crash and jobs to be submitted multiple times.\n", + "11/28/2025 11:50:54 AM <28924> aiida.broker.rabbitmq: [WARNING] See https://github.com/aiidateam/aiida-core/wiki/RabbitMQ-version-to-use for details.\n", + "11/28/2025 11:50:54 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5484|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_scales\n", + "11/28/2025 11:50:55 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5484|WorkGraphEngine|update_task_state]: Task: create_scales, type: CALCFUNCTION, finished.\n", + "11/28/2025 11:50:55 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5484|WorkGraphEngine|continue_workgraph]: tasks ready to run: qe\n", + "11/28/2025 11:50:56 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5484|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 5520\n", + "11/28/2025 11:50:56 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|continue_workgraph]: tasks ready to run: PwCalculation,PwCalculation1,PwCalculation2,PwCalculation3,PwCalculation4,PwCalculation5,PwCalculation6,PwCalculation7,PwCalculation8,PwCalculation9,PwCalculation10,PwCalculation11,PwCalculation12,PwCalculation13,PwCalculation14\n", + "11/28/2025 11:50:58 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 5522, 5524, 5526, 5528, 5530, 5532, 5534, 5536, 5538, 5540, 5542, 5544, 5546, 5548, 5550\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:15: AiidaDeprecationWarning: The parse_xml.versions module is deprecated and will be removed in aiida-quantumespresso v5.0.\n", + "Use get_schema_filepath() from parse_xml.parse instead.\n", + " from aiida_quantumespresso.parsers.parse_xml.versions import QeXmlVersion, get_xml_file_version\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/legacy.py:18: AiidaDeprecationWarning: This module has been deprecated and will be removed in aiida-quantumespresso v5.0.\n", + "If you are seeing this warning, you will have to update your Quantum ESPRESSO version (v6.6 or above).\n", + " warnings.warn(\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/legacy.py:27: AiidaDeprecationWarning: This module has been deprecated and will be removed in aiida-quantumespresso v5.0.\n", + "If you are seeing this warning, you will have to update your Quantum ESPRESSO version (v6.6 or above).\n", + " warnings.warn(\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:19: AiidaDeprecationWarning: The parse_xml.pw.parse module has been deprecated and will be removed in aiida-quantumespresso v5.0.\n", + "Use parse_xml() from parse_xml.parse directly. Legacy XML format support will be dropped.\n", + " warnings.warn(\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "11/28/2025 11:51:21 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation1, type: CALCJOB, finished.\n", + "11/28/2025 11:51:21 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation3, type: CALCJOB, finished.\n", + "11/28/2025 11:51:21 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "11/28/2025 11:51:21 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 5522, 5526, 5530, 5532, 5534, 5536, 5538, 5540, 5542, 5544, 5546, 5548, 5550\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", + "This function will be removed in aiida-quantumespresso v5.0.\n", + " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", + "11/28/2025 11:51:28 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation, type: CALCJOB, finished.\n", + "11/28/2025 11:51:28 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation2, type: CALCJOB, finished.\n", + "11/28/2025 11:51:28 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation4, type: CALCJOB, finished.\n", + "11/28/2025 11:51:28 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation5, type: CALCJOB, finished.\n", + "11/28/2025 11:51:28 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation6, type: CALCJOB, finished.\n", + "11/28/2025 11:51:28 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation7, type: CALCJOB, finished.\n", + "11/28/2025 11:51:29 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation8, type: CALCJOB, finished.\n", + "11/28/2025 11:51:29 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation9, type: CALCJOB, finished.\n", + "11/28/2025 11:51:29 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation10, type: CALCJOB, finished.\n", + "11/28/2025 11:51:29 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation11, type: CALCJOB, finished.\n", + "11/28/2025 11:51:29 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation12, type: CALCJOB, finished.\n", + "11/28/2025 11:51:29 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation13, type: CALCJOB, finished.\n", + "11/28/2025 11:51:29 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation14, type: CALCJOB, finished.\n", + "11/28/2025 11:51:30 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "11/28/2025 11:51:30 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "11/28/2025 11:51:30 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5484|WorkGraphEngine|update_task_state]: Task: qe, type: GRAPH, finished.\n", + "11/28/2025 11:51:30 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5484|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_train_files\n", + "11/28/2025 11:51:32 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5484|WorkGraphEngine|update_task_state]: Task: create_train_files, type: CALCFUNCTION, finished.\n", + "11/28/2025 11:51:32 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5484|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "11/28/2025 11:51:32 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5484|WorkGraphEngine|finalize]: Finalize workgraph.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "test_file has 10 structures\n", + "train_file has 3 structures\n", + "valid_file has 2 structures\n" + ] + }, + { + "data": { + "text/plain": [ + "{}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "wg.run()" ] @@ -392,7 +536,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "b96d1ae5", "metadata": {}, "outputs": [], @@ -406,10 +550,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "9b17b6dd", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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Du2lpaWaNGmSRowYodOnTzscmzZtmvbt26fly5era9euysnJ0ciRI7V//35169at1tp8fX311FNP6ZZbbpGvr6+2bdum6dOny9fXV08++WQTnxwAAADXu7yCkhojDq5mk2Quq1JeQYmG9ryh5QoDgP9lsNlsbSq+zMrKUnJyskpLS532Ky4uVrdu3ZSZmamf/exnDsceeeQR9e7dWyaTSWvWrNGePXskSefPn5e/v78++ugjjR071t5/8ODBGjNmjObPn1/vOseNGydfX18tX768Xv3Ly8sVGBiosrIyBQQE1Ps+AAAAaPs+2nNKz7y/55r9/vDIQD04sPa/0AKAhmrI99A2M22hobKzs+Xj46Px48c7tC9dulRHjx5VWlpajXMuX74si8UiLy8vh3Zvb29t27at3vfevXu3duzYobvvvrvOPhcuXFB5ebnDBgAAgPYpxN/r2p0a0A8AXO26DQ8yMzOVmJgob29ve9vhw4eVkpKinJwceXjUnLHh7++voUOHat68efrmm29ksViUk5Oj3Nxcmc3XXqDmxhtvlKenp374wx/qF7/4haZNm1Zn34yMDAUGBtq38PDwxj0oAAAA2rwhkZ0VFuilul7IaFD1WxeGRHZuybIAwM6t4UFKSkqdixxe2Q4ePNjg6+bm5urAgQNKSkqyt1ksFiUmJio9PV19+vSp89zly5fLZrOpW7du8vT01Ouvv65HH31URuO1f1Rbt27Vrl279Oabb2rRokV677336uybmpqqsrIy+3bixImGPSQAAACuGyajQWnxUZJUI0C4sp8WHyWTsa54AQCal1vXPCguLtZ3333ntE+PHj3UsWNH+3591jxISkpSfn6+du/ebW8rLS1Vp06dZDKZ7G1Wq1U2m00mk0kbN27U8OHD7cfOnj2r8vJyhYWFKSEhQZWVlVq3bl29n23+/Plavny5Dh06VK/+rHkAAACA9fvMSl+732HxxLBAL6XFRykuOsyNlQG4HjXke6hb37YQHBys4OBgl16zsrJSq1atUkZGhkN7QECA9u7d69C2ePFibdmyRatXr1ZkZKTDMV9fX/n6+urMmTPasGGDXn755QbVYbVadeHChcY9BAAAANqluOgwjYoKVV5BiYoqqhTiXz1VgREHANytzbyqsbCwUCUlJSosLJTFYrG/IaFXr17y8/Oz91u5cqUuX76siRMn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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "from ase.io import iread\n", "import matplotlib.pyplot as plt\n", @@ -435,6 +590,16 @@ "\n", "plt.show()\n" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1cf2f89b", + "metadata": {}, + "outputs": [], + "source": [ + "from workgraph_collections.cp2k.eos import eos_workgraph" + ] } ], "metadata": { From edc159feec2ff2072f12dbc2324d9d8ef31333b4 Mon Sep 17 00:00:00 2001 From: Muhammad Mohsin Date: Fri, 28 Nov 2025 12:10:02 +0000 Subject: [PATCH 13/15] Push unsaved changes --- .../workgraphs/eos_fine_tuning.ipynb | 207 ++---------------- 1 file changed, 23 insertions(+), 184 deletions(-) diff --git a/examples/tutorials/workgraphs/eos_fine_tuning.ipynb b/examples/tutorials/workgraphs/eos_fine_tuning.ipynb index e1ad5083..b329e2ae 100644 --- a/examples/tutorials/workgraphs/eos_fine_tuning.ipynb +++ b/examples/tutorials/workgraphs/eos_fine_tuning.ipynb @@ -53,21 +53,10 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "233a4da4", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Profile" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "from aiida import load_profile \n", "load_profile()" @@ -75,7 +64,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "a3ca17e8", "metadata": {}, "outputs": [], @@ -103,7 +92,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "9c433338", "metadata": {}, "outputs": [], @@ -149,7 +138,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "661c4051", "metadata": {}, "outputs": [], @@ -282,7 +271,6 @@ " write(Path(tmp.name), fileAtoms, append=True)\n", "\n", " files[f\"{split}_file\"] = SinglefileData(tmp)\n", - "\n", " \n", " for filename, file in files.items():\n", " with file.as_path() as path:\n", @@ -293,7 +281,7 @@ " \"test_file\": files[\"test_file\"],\n", " \"train_file\": files[\"train_file\"],\n", " \"valid_file\": files[\"valid_file\"]\n", - " }\n" + " }" ] }, { @@ -306,7 +294,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "a35e9ed6", "metadata": {}, "outputs": [], @@ -316,6 +304,7 @@ " \"options\": {\n", " \"resources\": {\n", " \"num_machines\": 1,\n", + " \"num_mpiprocs_per_machine\": 32,\n", " },\n", " \"max_wallclock_seconds\": 3600,\n", " \"queue_name\": \"scarf\",\n", @@ -323,6 +312,10 @@ " \"environment_variables\": {},\n", " \"withmpi\": True,\n", " \"prepend_text\": \"\"\"\n", + " module purge\n", + " module use /work4/scd/scarf562/eb-common/modules/all\n", + " module load amd-modules\n", + " module load QuantumESPRESSO/7.2-foss-2023a\n", " \"\"\",\n", " \"append_text\": \"\",\n", " },\n", @@ -334,7 +327,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "9074302a", "metadata": {}, "outputs": [], @@ -362,8 +355,7 @@ " train_task = wg.add_task(\n", " create_train_files,\n", " structures=qe_task.outputs.structures\n", - " )\n", - " " + " )" ] }, { @@ -376,152 +368,20 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "59425796", "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "db8fc054cf62485e9763c45d9038bff9", - "version_major": 2, - "version_minor": 1 - }, - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "wg" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "f230babb", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11/28/2025 11:50:54 AM <28924> aiida.broker.rabbitmq: [WARNING] RabbitMQ v3.12.1 is not supported and will cause unexpected problems!\n", - "11/28/2025 11:50:54 AM <28924> aiida.broker.rabbitmq: [WARNING] It can cause long-running workflows to crash and jobs to be submitted multiple times.\n", - "11/28/2025 11:50:54 AM <28924> aiida.broker.rabbitmq: [WARNING] See https://github.com/aiidateam/aiida-core/wiki/RabbitMQ-version-to-use for details.\n", - "11/28/2025 11:50:54 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5484|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_scales\n", - "11/28/2025 11:50:55 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5484|WorkGraphEngine|update_task_state]: Task: create_scales, type: CALCFUNCTION, finished.\n", - "11/28/2025 11:50:55 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5484|WorkGraphEngine|continue_workgraph]: tasks ready to run: qe\n", - "11/28/2025 11:50:56 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5484|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 5520\n", - "11/28/2025 11:50:56 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|continue_workgraph]: tasks ready to run: PwCalculation,PwCalculation1,PwCalculation2,PwCalculation3,PwCalculation4,PwCalculation5,PwCalculation6,PwCalculation7,PwCalculation8,PwCalculation9,PwCalculation10,PwCalculation11,PwCalculation12,PwCalculation13,PwCalculation14\n", - "11/28/2025 11:50:58 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 5522, 5524, 5526, 5528, 5530, 5532, 5534, 5536, 5538, 5540, 5542, 5544, 5546, 5548, 5550\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:15: AiidaDeprecationWarning: The parse_xml.versions module is deprecated and will be removed in aiida-quantumespresso v5.0.\n", - "Use get_schema_filepath() from parse_xml.parse instead.\n", - " from aiida_quantumespresso.parsers.parse_xml.versions import QeXmlVersion, get_xml_file_version\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/legacy.py:18: AiidaDeprecationWarning: This module has been deprecated and will be removed in aiida-quantumespresso v5.0.\n", - "If you are seeing this warning, you will have to update your Quantum ESPRESSO version (v6.6 or above).\n", - " warnings.warn(\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/legacy.py:27: AiidaDeprecationWarning: This module has been deprecated and will be removed in aiida-quantumespresso v5.0.\n", - "If you are seeing this warning, you will have to update your Quantum ESPRESSO version (v6.6 or above).\n", - " warnings.warn(\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:19: AiidaDeprecationWarning: The parse_xml.pw.parse module has been deprecated and will be removed in aiida-quantumespresso v5.0.\n", - "Use parse_xml() from parse_xml.parse directly. Legacy XML format support will be dropped.\n", - " warnings.warn(\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "11/28/2025 11:51:21 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation1, type: CALCJOB, finished.\n", - "11/28/2025 11:51:21 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation3, type: CALCJOB, finished.\n", - "11/28/2025 11:51:21 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "11/28/2025 11:51:21 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 5522, 5526, 5530, 5532, 5534, 5536, 5538, 5540, 5542, 5544, 5546, 5548, 5550\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "/home/strix/aiida-mlip/.venv/lib/python3.12/site-packages/aiida_quantumespresso/parsers/parse_xml/pw/parse.py:35: AiidaDeprecationWarning: parse_xml_post_6_2() is deprecated. Use parse_xml() instead which takes a file-like object.\n", - "This function will be removed in aiida-quantumespresso v5.0.\n", - " parsed_data, logs = parse_xml_post_6_2(xml_parsed)\n", - "11/28/2025 11:51:28 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation, type: CALCJOB, finished.\n", - "11/28/2025 11:51:28 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation2, type: CALCJOB, finished.\n", - "11/28/2025 11:51:28 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation4, type: CALCJOB, finished.\n", - "11/28/2025 11:51:28 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation5, type: CALCJOB, finished.\n", - "11/28/2025 11:51:28 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation6, type: CALCJOB, finished.\n", - "11/28/2025 11:51:28 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation7, type: CALCJOB, finished.\n", - "11/28/2025 11:51:29 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation8, type: CALCJOB, finished.\n", - "11/28/2025 11:51:29 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation9, type: CALCJOB, finished.\n", - "11/28/2025 11:51:29 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation10, type: CALCJOB, finished.\n", - "11/28/2025 11:51:29 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation11, type: CALCJOB, finished.\n", - "11/28/2025 11:51:29 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation12, type: CALCJOB, finished.\n", - "11/28/2025 11:51:29 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation13, type: CALCJOB, finished.\n", - "11/28/2025 11:51:29 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|update_task_state]: Task: PwCalculation14, type: CALCJOB, finished.\n", - "11/28/2025 11:51:30 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "11/28/2025 11:51:30 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5520|WorkGraphEngine|finalize]: Finalize workgraph.\n", - "11/28/2025 11:51:30 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5484|WorkGraphEngine|update_task_state]: Task: qe, type: GRAPH, finished.\n", - "11/28/2025 11:51:30 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5484|WorkGraphEngine|continue_workgraph]: tasks ready to run: create_train_files\n", - "11/28/2025 11:51:32 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5484|WorkGraphEngine|update_task_state]: Task: create_train_files, type: CALCFUNCTION, finished.\n", - "11/28/2025 11:51:32 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5484|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "11/28/2025 11:51:32 AM <28924> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [5484|WorkGraphEngine|finalize]: Finalize workgraph.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "test_file has 10 structures\n", - "train_file has 3 structures\n", - "valid_file has 2 structures\n" - ] - }, - { - "data": { - "text/plain": [ - "{}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "wg.run()" ] @@ -536,7 +396,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "b96d1ae5", "metadata": {}, "outputs": [], @@ -545,26 +405,15 @@ " \"test_file\": wg.tasks.create_train_files.outputs.test_file.value,\n", " \"train_file\": wg.tasks.create_train_files.outputs.train_file.value,\n", " \"valid_file\": wg.tasks.create_train_files.outputs.valid_file.value\n", - "}\n" + "}" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "9b17b6dd", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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Du2lpaWaNGmSRowYodOnTzscmzZtmvbt26fly5era9euysnJ0ciRI7V//35169at1tp8fX311FNP6ZZbbpGvr6+2bdum6dOny9fXV08++WQTnxwAAADXu7yCkhojDq5mk2Quq1JeQYmG9ryh5QoDgP9lsNlsbSq+zMrKUnJyskpLS532Ky4uVrdu3ZSZmamf/exnDsceeeQR9e7dWyaTSWvWrNGePXskSefPn5e/v78++ugjjR071t5/8ODBGjNmjObPn1/vOseNGydfX18tX768Xv3Ly8sVGBiosrIyBQQE1Ps+AAAAaPs+2nNKz7y/55r9/vDIQD04sPa/0AKAhmrI99A2M22hobKzs+Xj46Px48c7tC9dulRHjx5VWlpajXMuX74si8UiLy8vh3Zvb29t27at3vfevXu3duzYobvvvrvOPhcuXFB5ebnDBgAAgPYpxN/r2p0a0A8AXO26DQ8yMzOVmJgob29ve9vhw4eVkpKinJwceXjUnLHh7++voUOHat68efrmm29ksViUk5Oj3Nxcmc3XXqDmxhtvlKenp374wx/qF7/4haZNm1Zn34yMDAUGBtq38PDwxj0oAAAA2rwhkZ0VFuilul7IaFD1WxeGRHZuybIAwM6t4UFKSkqdixxe2Q4ePNjg6+bm5urAgQNKSkqyt1ksFiUmJio9PV19+vSp89zly5fLZrOpW7du8vT01Ouvv65HH31URuO1f1Rbt27Vrl279Oabb2rRokV677336uybmpqqsrIy+3bixImGPSQAAACuGyajQWnxUZJUI0C4sp8WHyWTsa54AQCal1vXPCguLtZ3333ntE+PHj3UsWNH+3591jxISkpSfn6+du/ebW8rLS1Vp06dZDKZ7G1Wq1U2m00mk0kbN27U8OHD7cfOnj2r8vJyhYWFKSEhQZWVlVq3bl29n23+/Plavny5Dh06VK/+rHkAAACA9fvMSl+732HxxLBAL6XFRykuOsyNlQG4HjXke6hb37YQHBys4OBgl16zsrJSq1atUkZGhkN7QECA9u7d69C2ePFibdmyRatXr1ZkZKTDMV9fX/n6+urMmTPasGGDXn755QbVYbVadeHChcY9BAAAANqluOgwjYoKVV5BiYoqqhTiXz1VgREHANytzbyqsbCwUCUlJSosLJTFYrG/IaFXr17y8/Oz91u5cqUuX76siRMn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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "from ase.io import iread\n", "import matplotlib.pyplot as plt\n", @@ -588,17 +437,7 @@ "ax.set_xlabel(\"Volume\")\n", "ax.legend()\n", "\n", - "plt.show()\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1cf2f89b", - "metadata": {}, - "outputs": [], - "source": [ - "from workgraph_collections.cp2k.eos import eos_workgraph" + "plt.show()" ] } ], From 68b397e7e9d333da9efebbe009af3d9d2b29700c Mon Sep 17 00:00:00 2001 From: Muhammad Mohsin Date: Fri, 28 Nov 2025 16:36:18 +0000 Subject: [PATCH 14/15] Update examples/tutorials/workgraphs/eos_fine_tuning.ipynb Co-authored-by: Elliott Kasoar <45317199+ElliottKasoar@users.noreply.github.com> --- examples/tutorials/workgraphs/eos_fine_tuning.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/tutorials/workgraphs/eos_fine_tuning.ipynb b/examples/tutorials/workgraphs/eos_fine_tuning.ipynb index b329e2ae..46ea215c 100644 --- a/examples/tutorials/workgraphs/eos_fine_tuning.ipynb +++ b/examples/tutorials/workgraphs/eos_fine_tuning.ipynb @@ -5,7 +5,7 @@ "id": "75afa95b", "metadata": {}, "source": [ - "# Running Equation of State with Quantum Espresso Workgraph" + "# Equation of State Fine-tuning" ] }, { From 639740e74a511298f232e40c0dfcc44149e7f727 Mon Sep 17 00:00:00 2001 From: Muhammad Mohsin Date: Fri, 28 Nov 2025 16:43:11 +0000 Subject: [PATCH 15/15] Fix eos notebook issue --- examples/tutorials/workgraphs/eos_fine_tuning.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/tutorials/workgraphs/eos_fine_tuning.ipynb b/examples/tutorials/workgraphs/eos_fine_tuning.ipynb index 46ea215c..2dc1467d 100644 --- a/examples/tutorials/workgraphs/eos_fine_tuning.ipynb +++ b/examples/tutorials/workgraphs/eos_fine_tuning.ipynb @@ -15,7 +15,7 @@ "source": [ "## Aim\n", "\n", - "This notebook demonstrates how we can connect and execute tasks in a workflow. In this example; we get an initial structure, generate structures like we would do to fit an equation of state. Then as we want to use the structures for fine tuning we run DFT calculations like `Quantum Espresso` to get the reference energies and forces. Then split structures into `test`, `train` and `valid` files. This workgraph asuumed an initail structure and has a task which creates atoms in fractional coordinates, this time we do not run geometry optimisation or descriptors calculation tasks." + "This notebook demonstrates how we can connect and execute tasks with an example fine-tuning workflow, using structures from an equation of state calculation. As in descriptors_filter_qe.ipynb, reference energies and forces are calculated using `Quantum Espresso` on an external computer, but we more directly pass this `StructureData`, as we do not filter the structures to be used in fine-tuning." ] }, { @@ -77,7 +77,7 @@ "model = ModelData.from_uri(uri, architecture=\"mace_mp\")\n", "\n", "janus_code = load_code(\"janus@localhost\")\n", - "qe_code = load_code(\"qe@localhost\")\n", + "qe_code = load_code(\"qe@scarf\")\n", "\n", "initial_atoms = bulk(\"NaCl\", \"rocksalt\", 5.63)" ]