{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Running PyZFS with Quantum ESPRESSO" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This tutorial assumes that a density functional theory calculation with Quantum ESPRESSO has already been completed." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/pyzfs/examples/o2_qe_hdf5\n" ] } ], "source": [ "%cd ../../examples/o2_qe_hdf5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1 Command line interface" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", "PyZFS code 2.3\n", "2026-03-14 22:45:43\n", "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", "pyzfs.run: setting working directory as \".\"...\n", "\n", "QEHDF5WavefunctionLoader: scanning current working directory \"/Soft/pyzfs/examples/o2_qe_hdf5\"...\n", "\n", " nuwfcs = 7, ndwfcs = 5, nwfcs = 12\n", " spin = up band = 1 file = wfcup1.hdf5\n", " spin = up band = 2 file = wfcup1.hdf5\n", " spin = up band = 3 file = wfcup1.hdf5\n", " spin = up band = 4 file = wfcup1.hdf5\n", " spin = up band = 5 file = wfcup1.hdf5\n", " spin = up band = 6 file = wfcup1.hdf5\n", " spin = up band = 7 file = wfcup1.hdf5\n", " spin = down band = 1 file = wfcdw1.hdf5\n", " spin = down band = 2 file = wfcdw1.hdf5\n", " spin = down band = 3 file = wfcdw1.hdf5\n", " spin = down band = 4 file = wfcdw1.hdf5\n", " spin = down band = 5 file = wfcdw1.hdf5\n", "\n", "System Overview:\n", " Cell: \n", "{ 'G1': array([0.6649793, 0. , 0. ]),\n", " 'G2': array([0. , 0.6649793, 0. ]),\n", " 'G3': array([0. , 0. , 0.6649793]),\n", " 'R1': array([9.44869303, 0. , 0. ]),\n", " 'R2': array([0. , 9.44869303, 0. ]),\n", " 'R3': array([0. , 0. , 9.44869303]),\n", " 'ase_cell': Atoms(symbols='', pbc=True, cell=[5.000059375176199, 5.000059375176199, 5.000059375176199]),\n", " 'omega': 843.5585251245784}\n", " FFT Grid: \n", "{'N': 2197, 'n1': 13, 'n2': 13, 'n3': 13}\n", "\n", "\n", "pyzfs.run: instantializing ZFSCalculation with following arguments...\n", "{ 'ae': False,\n", " 'ae_reduce': 4,\n", " 'comm': ,\n", " 'memory': 'critical',\n", " 'wfcloader': }\n", " \n", " \n", " Zero Field Splitting Calculation Created...\n", " \n", " \n", " ProcessGrid (square) info:\n", " rank -> (irow, icol) mapping:\n", " [[0 0]]\n", " (irow, icol) -> rank mapping:\n", " [[0]]\n", " rank onroot nrow ncol size irow icol is_active rowcomm_rank colcomm_rank\n", " 0 True 1 1 1 0 0 True 0 0\n", " \n", " Creating I array...\n", " \n", " DistributedMatrix info: I\n", " irow icol nrow ncol m mloc mstart mend n nloc nstart nend val.shape\n", " 0 0 1 1 12 12 0 12 12 12 0 12 (12, 12, 6)\n", " Index map:\n", " [[[ 0 12 12 0 12 12]]]\n", " \n", " Memory usage (on process 0):\n", " iorb_psir_map 0.00 MB\n", " iorb_rhog_map 0.00 MB\n", " I 0.01 MB\n", " \n", " Total memory usage (on process 0): 71.33 MB\n", " Total memory usage (all processes): 71.33 MB\n", " \n", " QEHDF5WavefunctionLoader: loading orbitals into memory... (memory mode: \"critical\")\n", " \n", " (process 0) 2 orbitals (16%) loaded in 0.000457s...\n", " (process 0) 4 orbitals (33%) loaded in 0.000009s...\n", " (process 0) 6 orbitals (50%) loaded in 0.000006s...\n", " (process 0) 8 orbitals (66%) loaded in 0.000550s...\n", " (process 0) 10 orbitals (83%) loaded in 0.000011s...\n", " (process 0) 12 orbitals (100%) loaded in 0.000006s...\n", " QEHDF5WavefunctionLoader: root -> first column scattering\n", " QEHDF5WavefunctionLoader: first column -> other column bcast\n", " QEHDF5WavefunctionLoader: root -> first row scattering\n", " QEHDF5WavefunctionLoader: first row -> other row bcast\n", " \n", " Memory usage (on process 0):\n", " iorb_psir_map 0.00 MB\n", " iorb_rhog_map 0.00 MB\n", " I 0.01 MB\n", " \n", " Total memory usage (on process 0): 73.97 MB\n", " Total memory usage (all processes): 73.97 MB\n", " Time elapsed for loading wfc: 0s\n", " \n", " Computing dipole-dipole interaction tensor in G space...\n", " \n", " \n", " Memory usage (on process 0):\n", " iorb_psir_map 0.00 MB\n", " iorb_rhog_map 0.00 MB\n", " ddig 0.10 MB\n", " I 0.01 MB\n", " \n", " Total memory usage (on process 0): 74.19 MB\n", " Total memory usage (all processes): 74.19 MB\n", " \n", " Iterating over pairs...\n", " \n", " (process 0) 1 pairs (1%) computed in 0.000018s...\n", " (process 0) 2 pairs (2%) computed in 0.001202s...\n", " (process 0) 3 pairs (3%) computed in 0.000985s...\n", " (process 0) 4 pairs (5%) computed in 0.000961s...\n", " (process 0) 5 pairs (6%) computed in 0.000953s...\n", " (process 0) 6 pairs (7%) computed in 0.000947s...\n", " (process 0) 7 pairs (8%) computed in 0.000950s...\n", " (process 0) 8 pairs (10%) computed in 0.000947s...\n", " (process 0) 9 pairs (11%) computed in 0.000952s...\n", " (process 0) 10 pairs (12%) computed in 0.000942s...\n", " (process 0) 11 pairs (14%) computed in 0.000946s...\n", " (process 0) 12 pairs (15%) computed in 0.000945s...\n", " (process 0) 13 pairs (16%) computed in 0.000003s...\n", " (process 0) 14 pairs (17%) computed in 0.004230s...\n", " (process 0) 15 pairs (19%) computed in 0.001041s...\n", " (process 0) 16 pairs (20%) computed in 0.000952s...\n", " (process 0) 17 pairs (21%) computed in 0.000946s...\n", " (process 0) 18 pairs (23%) computed in 0.000938s...\n", " (process 0) 19 pairs (24%) computed in 0.000943s...\n", " (process 0) 20 pairs (25%) computed in 0.000928s...\n", " (process 0) 21 pairs (26%) computed in 0.000927s...\n", " (process 0) 22 pairs (28%) computed in 0.000928s...\n", " (process 0) 23 pairs (29%) computed in 0.000921s...\n", " (process 0) 24 pairs (30%) computed in 0.000003s...\n", " (process 0) 25 pairs (32%) computed in 0.000922s...\n", " (process 0) 26 pairs (33%) computed in 0.000921s...\n", " (process 0) 27 pairs (34%) computed in 0.000926s...\n", " (process 0) 28 pairs (35%) computed in 0.000926s...\n", " (process 0) 29 pairs (37%) computed in 0.000926s...\n", " (process 0) 30 pairs (38%) computed in 0.000921s...\n", " (process 0) 31 pairs (39%) computed in 0.002386s...\n", " (process 0) 32 pairs (41%) computed in 0.002148s...\n", " (process 0) 33 pairs (42%) computed in 0.002111s...\n", " (process 0) 34 pairs (43%) computed in 0.000006s...\n", " (process 0) 35 pairs (44%) computed in 0.002117s...\n", " (process 0) 36 pairs (46%) computed in 0.001665s...\n", " (process 0) 37 pairs (47%) computed in 0.000928s...\n", " (process 0) 38 pairs (48%) computed in 0.000926s...\n", " (process 0) 39 pairs (50%) computed in 0.000924s...\n", " (process 0) 40 pairs (51%) computed in 0.000921s...\n", " (process 0) 41 pairs (52%) computed in 0.000920s...\n", " (process 0) 42 pairs (53%) computed in 0.000918s...\n", " (process 0) 43 pairs (55%) computed in 0.000002s...\n", " (process 0) 44 pairs (56%) computed in 0.000919s...\n", " (process 0) 45 pairs (57%) computed in 0.000918s...\n", " (process 0) 46 pairs (58%) computed in 0.000920s...\n", " (process 0) 47 pairs (60%) computed in 0.000919s...\n", " (process 0) 48 pairs (61%) computed in 0.000927s...\n", " (process 0) 49 pairs (62%) computed in 0.000919s...\n", " (process 0) 50 pairs (64%) computed in 0.000919s...\n", " (process 0) 51 pairs (65%) computed in 0.000002s...\n", " (process 0) 52 pairs (66%) computed in 0.002188s...\n", " (process 0) 53 pairs (67%) computed in 0.002234s...\n", " (process 0) 54 pairs (69%) computed in 0.002291s...\n", " (process 0) 55 pairs (70%) computed in 0.002171s...\n", " (process 0) 56 pairs (71%) computed in 0.001795s...\n", " (process 0) 57 pairs (73%) computed in 0.000951s...\n", " (process 0) 58 pairs (74%) computed in 0.000003s...\n", " (process 0) 59 pairs (75%) computed in 0.000942s...\n", " (process 0) 60 pairs (76%) computed in 0.000937s...\n", " (process 0) 61 pairs (78%) computed in 0.000935s...\n", " (process 0) 62 pairs (79%) computed in 0.000934s...\n", " (process 0) 63 pairs (80%) computed in 0.000938s...\n", " (process 0) 64 pairs (82%) computed in 0.000002s...\n", " (process 0) 65 pairs (83%) computed in 0.000934s...\n", " (process 0) 66 pairs (84%) computed in 0.000941s...\n", " (process 0) 67 pairs (85%) computed in 0.000937s...\n", " (process 0) 68 pairs (87%) computed in 0.000937s...\n", " (process 0) 69 pairs (88%) computed in 0.000002s...\n", " (process 0) 70 pairs (89%) computed in 0.001776s...\n", " (process 0) 71 pairs (91%) computed in 0.002149s...\n", " (process 0) 72 pairs (92%) computed in 0.002127s...\n", " (process 0) 73 pairs (93%) computed in 0.000005s...\n", " (process 0) 74 pairs (94%) computed in 0.002114s...\n", " (process 0) 75 pairs (96%) computed in 0.002120s...\n", " (process 0) 76 pairs (97%) computed in 0.000005s...\n", " (process 0) 77 pairs (98%) computed in 0.001114s...\n", " (process 0) 78 pairs (100%) computed in 0.000005s...\n", " \n", " \n", " Total D tensor (MHz): \n", " [[-8.12869282e+03 -1.13306984e-02 -9.48395672e-02]\n", " [-1.13306984e-02 -8.12864850e+03 6.11415721e-02]\n", " [-9.48395672e-02 6.11415721e-02 1.62573413e+04]]\n", " D eigenvalues (MHz): \n", " [16257.34132152 -8128.69554578 -8128.64577574]\n", " D eigenvectors: \n", " [ 3.88909468e-06 -2.50724357e-06 -1.00000000e+00]\n", " [9.72196405e-01 2.34166928e-01 3.19385034e-06]\n", " [-2.34166928e-01 9.72196405e-01 -3.34823054e-06]\n", " Dx, Dy, Dz (|Dz| > |Dx| > |Dy|) (MHz): \n", " -8128.695545782452 -8128.645775741561 16257.341321523892\n", " Scalar D = 24386.01 MHz, E = -0.02 MHz\n", " Time elapsed for pair iteration: 0s\n" ] } ], "source": [ "%%bash\n", "pyzfs --wfcfmt qeh5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2 Python library interface\n", "### 2.1 Load PyZFS" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from pyzfs.common.wfc.qeh5loader import QEHDF5WavefunctionLoader\n", "from pyzfs.zfs.main import ZFSCalculation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.2 Construct wavefunction loader" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "QEHDF5WavefunctionLoader: scanning current working directory \"/Soft/pyzfs/examples/o2_qe_hdf5\"...\n", "\n", " nuwfcs = 7, ndwfcs = 5, nwfcs = 12\n", " spin = up band = 1 file = wfcup1.hdf5\n", " spin = up band = 2 file = wfcup1.hdf5\n", " spin = up band = 3 file = wfcup1.hdf5\n", " spin = up band = 4 file = wfcup1.hdf5\n", " spin = up band = 5 file = wfcup1.hdf5\n", " spin = up band = 6 file = wfcup1.hdf5\n", " spin = up band = 7 file = wfcup1.hdf5\n", " spin = down band = 1 file = wfcdw1.hdf5\n", " spin = down band = 2 file = wfcdw1.hdf5\n", " spin = down band = 3 file = wfcdw1.hdf5\n", " spin = down band = 4 file = wfcdw1.hdf5\n", " spin = down band = 5 file = wfcdw1.hdf5\n", "\n", "System Overview:\n", " Cell: \n", "{ 'G1': array([0.6649793, 0. , 0. ]),\n", " 'G2': array([0. , 0.6649793, 0. ]),\n", " 'G3': array([0. , 0. , 0.6649793]),\n", " 'R1': array([9.44869303, 0. , 0. ]),\n", " 'R2': array([0. , 9.44869303, 0. ]),\n", " 'R3': array([0. , 0. , 9.44869303]),\n", " 'ase_cell': Atoms(symbols='', pbc=True, cell=[5.000059375176199, 5.000059375176199, 5.000059375176199]),\n", " 'omega': 843.5585251245784}\n", " FFT Grid: \n", "{'N': 2197, 'n1': 13, 'n2': 13, 'n3': 13}\n" ] } ], "source": [ "wfcloader = QEHDF5WavefunctionLoader(fftgrid=\"wave\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.3 Construct ZFSCalculation" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " \n", " \n", " Zero Field Splitting Calculation Created...\n", " \n", " \n", " ProcessGrid (square) info:\n", " rank -> (irow, icol) mapping:\n", " [[0 0]]\n", " (irow, icol) -> rank mapping:\n", " [[0]]\n", " rank onroot nrow ncol size irow icol is_active rowcomm_rank colcomm_rank\n", " 0 True 1 1 1 0 0 True 0 0\n", " \n", " Creating I array...\n", " \n", " DistributedMatrix info: I\n", " irow icol nrow ncol m mloc mstart mend n nloc nstart nend val.shape\n", " 0 0 1 1 12 12 0 12 12 12 0 12 (12, 12, 6)\n", " Index map:\n", " [[[ 0 12 12 0 12 12]]]\n", " \n", " Memory usage (on process 0):\n", " iorb_psir_map 0.00 MB\n", " iorb_rhog_map 0.00 MB\n", " I 0.01 MB\n", " \n", " Total memory usage (on process 0): 175.22 MB\n", " Total memory usage (all processes): 175.22 MB\n" ] } ], "source": [ "zfscalc = ZFSCalculation(wfcloader=wfcloader)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.4 Perform ZFS calculation" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " \n", " QEHDF5WavefunctionLoader: loading orbitals into memory... (memory mode: \"critical\")\n", " \n", " (process 0) 2 orbitals (16%) loaded in 0.001204s...\n", " (process 0) 4 orbitals (33%) loaded in 0.000067s...\n", " (process 0) 6 orbitals (50%) loaded in 0.000026s...\n", " (process 0) 8 orbitals (66%) loaded in 0.001220s...\n", " (process 0) 10 orbitals (83%) loaded in 0.000043s...\n", " (process 0) 12 orbitals (100%) loaded in 0.000023s...\n", " QEHDF5WavefunctionLoader: root -> first column scattering\n", " QEHDF5WavefunctionLoader: first column -> other column bcast\n", " QEHDF5WavefunctionLoader: root -> first row scattering\n", " QEHDF5WavefunctionLoader: first row -> other row bcast\n", " \n", " Memory usage (on process 0):\n", " iorb_psir_map 0.00 MB\n", " iorb_rhog_map 0.00 MB\n", " I 0.01 MB\n", " \n", " Total memory usage (on process 0): 177.41 MB\n", " Total memory usage (all processes): 177.41 MB\n", " Time elapsed for loading wfc: 0s\n", " \n", " Computing dipole-dipole interaction tensor in G space...\n", " \n", " \n", " Memory usage (on process 0):\n", " iorb_psir_map 0.00 MB\n", " iorb_rhog_map 0.00 MB\n", " ddig 0.10 MB\n", " I 0.01 MB\n", " \n", " Total memory usage (on process 0): 177.44 MB\n", " Total memory usage (all processes): 177.44 MB\n", " \n", " Iterating over pairs...\n", " \n", " (process 0) 1 pairs (1%) computed in 0.000070s...\n", " (process 0) 2 pairs (2%) computed in 0.005600s...\n", " (process 0) 3 pairs (3%) computed in 0.007995s...\n", " (process 0) 4 pairs (5%) computed in 0.002362s...\n", " (process 0) 5 pairs (6%) computed in 0.002402s...\n", " (process 0) 6 pairs (7%) computed in 0.001789s...\n", " (process 0) 7 pairs (8%) computed in 0.001507s...\n", " (process 0) 8 pairs (10%) computed in 0.008006s...\n", " (process 0) 9 pairs (11%) computed in 0.001806s...\n", " (process 0) 10 pairs (12%) computed in 0.001392s...\n", " (process 0) 11 pairs (14%) computed in 0.001427s...\n", " (process 0) 12 pairs (15%) computed in 0.004495s...\n", " (process 0) 13 pairs (16%) computed in 0.000048s...\n", " (process 0) 14 pairs (17%) computed in 0.001733s...\n", " (process 0) 15 pairs (19%) computed in 0.005424s...\n", " (process 0) 16 pairs (20%) computed in 0.003515s...\n", " (process 0) 17 pairs (21%) computed in 0.001599s...\n", " (process 0) 18 pairs (23%) computed in 0.001585s...\n", " (process 0) 19 pairs (24%) computed in 0.002625s...\n", " (process 0) 20 pairs (25%) computed in 0.002453s...\n", " (process 0) 21 pairs (26%) computed in 0.002372s...\n", " (process 0) 22 pairs (28%) computed in 0.002324s...\n", " (process 0) 23 pairs (29%) computed in 0.002390s...\n", " (process 0) 24 pairs (30%) computed in 0.000021s...\n", " (process 0) 25 pairs (32%) computed in 0.001504s...\n", " (process 0) 26 pairs (33%) computed in 0.001189s...\n", " (process 0) 27 pairs (34%) computed in 0.001152s...\n", " (process 0) 28 pairs (35%) computed in 0.001214s...\n", " (process 0) 29 pairs (37%) computed in 0.001169s...\n", " (process 0) 30 pairs (38%) computed in 0.001128s...\n", " (process 0) 31 pairs (39%) computed in 0.001117s...\n", " (process 0) 32 pairs (41%) computed in 0.001123s...\n", " (process 0) 33 pairs (42%) computed in 0.001074s...\n", " (process 0) 34 pairs (43%) computed in 0.000007s...\n", " (process 0) 35 pairs (44%) computed in 0.001060s...\n", " (process 0) 36 pairs (46%) computed in 0.001057s...\n", " (process 0) 37 pairs (47%) computed in 0.001052s...\n", " (process 0) 38 pairs (48%) computed in 0.001047s...\n", " (process 0) 39 pairs (50%) computed in 0.001106s...\n", " (process 0) 40 pairs (51%) computed in 0.001048s...\n", " (process 0) 41 pairs (52%) computed in 0.001047s...\n", " (process 0) 42 pairs (53%) computed in 0.001049s...\n", " (process 0) 43 pairs (55%) computed in 0.000007s...\n", " (process 0) 44 pairs (56%) computed in 0.001077s...\n", " (process 0) 45 pairs (57%) computed in 0.001062s...\n", " (process 0) 46 pairs (58%) computed in 0.001073s...\n", " (process 0) 47 pairs (60%) computed in 0.001053s...\n", " (process 0) 48 pairs (61%) computed in 0.001055s...\n", " (process 0) 49 pairs (62%) computed in 0.001094s...\n", " (process 0) 50 pairs (64%) computed in 0.001064s...\n", " (process 0) 51 pairs (65%) computed in 0.000007s...\n", " (process 0) 52 pairs (66%) computed in 0.001061s...\n", " (process 0) 53 pairs (67%) computed in 0.001059s...\n", " (process 0) 54 pairs (69%) computed in 0.001089s...\n", " (process 0) 55 pairs (70%) computed in 0.001707s...\n", " (process 0) 56 pairs (71%) computed in 0.001053s...\n", " (process 0) 57 pairs (73%) computed in 0.001042s...\n", " (process 0) 58 pairs (74%) computed in 0.000007s...\n", " (process 0) 59 pairs (75%) computed in 0.001043s...\n", " (process 0) 60 pairs (76%) computed in 0.001707s...\n", " (process 0) 61 pairs (78%) computed in 0.002411s...\n", " (process 0) 62 pairs (79%) computed in 0.002365s...\n", " (process 0) 63 pairs (80%) computed in 0.002350s...\n", " (process 0) 64 pairs (82%) computed in 0.000015s...\n", " (process 0) 65 pairs (83%) computed in 0.002495s...\n", " (process 0) 66 pairs (84%) computed in 0.001052s...\n", " (process 0) 67 pairs (85%) computed in 0.001035s...\n", " (process 0) 68 pairs (87%) computed in 0.001096s...\n", " (process 0) 69 pairs (88%) computed in 0.000007s...\n", " (process 0) 70 pairs (89%) computed in 0.002327s...\n", " (process 0) 71 pairs (91%) computed in 0.002350s...\n", " (process 0) 72 pairs (92%) computed in 0.001077s...\n", " (process 0) 73 pairs (93%) computed in 0.000006s...\n", " (process 0) 74 pairs (94%) computed in 0.001041s...\n", " (process 0) 75 pairs (96%) computed in 0.001046s...\n", " (process 0) 76 pairs (97%) computed in 0.000007s...\n", " (process 0) 77 pairs (98%) computed in 0.005601s...\n", " (process 0) 78 pairs (100%) computed in 0.000041s...\n", " \n", " \n", " Total D tensor (MHz): \n", " [[-8.12869282e+03 -1.13306984e-02 -9.48395672e-02]\n", " [-1.13306984e-02 -8.12864850e+03 6.11415721e-02]\n", " [-9.48395672e-02 6.11415721e-02 1.62573413e+04]]\n", " D eigenvalues (MHz): \n", " [16257.34132152 -8128.69554578 -8128.64577574]\n", " D eigenvectors: \n", " [ 3.88909468e-06 -2.50724357e-06 -1.00000000e+00]\n", " [9.72196405e-01 2.34166928e-01 3.19385034e-06]\n", " [-2.34166928e-01 9.72196405e-01 -3.34823054e-06]\n", " Dx, Dy, Dz (|Dz| > |Dx| > |Dy|) (MHz): \n", " -8128.695545782452 -8128.645775741561 16257.341321523892\n", " Scalar D = 24386.01 MHz, E = -0.02 MHz\n", " Time elapsed for pair iteration: 0s\n" ] } ], "source": [ "zfscalc.solve()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.12" } }, "nbformat": 4, "nbformat_minor": 4 }