Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Integrate optimizers into compiling XXZ code #53

Merged
merged 150 commits into from
Jun 26, 2024
Merged
Changes from 1 commit
Commits
Show all changes
150 commits
Select commit Hold shift + click to select a range
74b01fd
feat: Add load_vqe notebook
andrea-pasquale May 29, 2024
c192413
results: four big arch results
MatteoRobbiati May 30, 2024
30d0cdf
added a notebook where it's possible to use GCI to improve the vqe en…
marekgluza May 30, 2024
0788ef4
adding preliminary compiling structure
marekgluza May 30, 2024
5504ff9
feat: load vqe and apply dbi but as script
MatteoRobbiati May 30, 2024
b13fb04
feat: add 11q and 20l with 0.005 learning rate
MatteoRobbiati May 30, 2024
f9a86f6
2-qubit XXZ
jeongrak-son May 31, 2024
e683f33
for arbitrary delta
jeongrak-son May 31, 2024
fcd6fdf
Create Compiling XXZ_multiqubits.ipynb
jeongrak-son May 31, 2024
53288ed
odd number of qubits
jeongrak-son May 31, 2024
a3b7b7a
odd number of qubits included
jeongrak-son May 31, 2024
7981d52
results: add BFGS results with 8 qubits
MatteoRobbiati May 31, 2024
1281006
results: add more data with Adam sgd and 10-11 qubits
MatteoRobbiati May 31, 2024
c2f7287
refactor: renaming data folder
MatteoRobbiati May 31, 2024
8614fb1
Neater version to create the circuit
khanhuyengiang May 31, 2024
ffe4278
.py instead of jupyter notebook
jeongrak-son May 31, 2024
4010638
results: Adagrad and various seeds
MatteoRobbiati May 31, 2024
cccb9d2
small modifications
MatteoRobbiati May 31, 2024
203d445
results: lr hyperopt 10q and 20l
MatteoRobbiati Jun 2, 2024
fdc8d3e
Added compiling_XXZ.py with documentation
khanhuyengiang Jun 3, 2024
d064be5
Minor changes for readability purposes
khanhuyengiang Jun 3, 2024
f0f1341
moved compiling file
khanhuyengiang Jun 3, 2024
eca636f
refactoring
khanhuyengiang Jun 3, 2024
bf80878
Merge branch 'results' of https://github.com/qiboteam/boostvqe into c…
Sam-XiaoyueLi Jun 3, 2024
84d73ec
refactoring
khanhuyengiang Jun 3, 2024
bf28529
Merge branch 'compiling_XXZ' of https://github.com/qiboteam/boostvqe …
khanhuyengiang Jun 3, 2024
7d772de
results: scanning nlayers for 10q architecture
MatteoRobbiati Jun 3, 2024
77386ed
fix: Speed up rotate_with_vqe by fusing circuit
andrea-pasquale Jun 3, 2024
eaf0b15
refactor: adapt load_vqe to new params storage
MatteoRobbiati Jun 3, 2024
6a07f24
results: first results with params
MatteoRobbiati Jun 3, 2024
b024d9b
Merge remote-tracking branch 'origin/speed' into results
MatteoRobbiati Jun 3, 2024
92cb06a
introduce second order formula
shangtai Jun 3, 2024
ebfe359
set version of python to be less than 3.13 to be compatible with Qibo…
shangtai Jun 3, 2024
62f711b
results: add some further results with params
MatteoRobbiati Jun 4, 2024
0c3872f
Revert "introduce second order formula"
shangtai Jun 5, 2024
0988ab1
revert back previous version, not touching toml file.
shangtai Jun 5, 2024
1606fb7
refactor my code
shangtai Jun 5, 2024
4f54832
updated documentation
shangtai Jun 5, 2024
806d39e
Marek trying to load and run
marekgluza Jun 6, 2024
59af10b
:q
marekgluza Jun 6, 2024
e534ff4
Update pyproject.toml
shangtai Jun 6, 2024
d3072d1
Update poetry.lock
shangtai Jun 6, 2024
de18faa
unfinished notebook
marekgluza Jun 6, 2024
bdea60a
adding a sketch of a roadmap notebook
marekgluza Jun 6, 2024
6502fcf
Update compiling_XXZ.py documentation
shangtai Jun 6, 2024
566c2aa
moving dbi model with branches from qibo
marekgluza Jun 7, 2024
1c55f3b
version after discussion
marekgluza Jun 7, 2024
18faa40
the roadmap notebook showing a functioning 10q -.17 decrease from 3l …
marekgluza Jun 7, 2024
0114a9d
visual studio forgot to save after running
marekgluza Jun 7, 2024
7b0d2bd
dics: add module docstring
khanhuyengiang Jun 10, 2024
1df26a0
chore: tested higher order TS decomposition, cf not working
khanhuyengiang Jun 10, 2024
0397a85
Merge branch 'compiling_XXZ' of https://github.com/qiboteam/boostvqe …
khanhuyengiang Jun 10, 2024
7060f8e
tutorials: added tutorial on VW circuit
khanhuyengiang Jun 10, 2024
7790d37
feat: added compiling XXZ for unitary in SO4
khanhuyengiang Jun 10, 2024
c8f965f
improvements and corrections
marekgluza Jun 10, 2024
57349be
using transpiler example; next make it give improvement like the roadmap
marekgluza Jun 10, 2024
22cba21
bug: mistake in schmidt decomposition
khanhuyengiang Jun 10, 2024
87426f9
There are bugs that will be checked jointly with first order
marekgluza Jun 10, 2024
513c4d7
phase tests
marekgluza Jun 10, 2024
c766f67
merge by hand
marekgluza Jun 10, 2024
2c54fa3
can you believe it! u2_circ = deepcopy(d).circuit( -step * (np.sqrt(5…
marekgluza Jun 10, 2024
bfe9799
added function to estimate optimal s
wrightjandrew Jun 10, 2024
49cee2b
notebook should run now
marekgluza Jun 11, 2024
d5d888c
Merge pull request #48 from qiboteam/energy_expectation_poly
marekgluza Jun 11, 2024
737acb7
current state; not tidy
marekgluza Jun 11, 2024
209ad23
adding a notebook exemplifying circuits and transpiler class for comp…
marekgluza Jun 12, 2024
a32427d
Merge branch 'compiling_XXZ' of github.com:qiboteam/boostvqe into com…
marekgluza Jun 12, 2024
a3af1a7
sorted the notebook a bit more
marekgluza Jun 12, 2024
03b22b7
moved notebooks around for focus; I kept the tinkering notebooks beca…
marekgluza Jun 12, 2024
997e491
adding some gradient descent tests but only marginal improvements ove…
marekgluza Jun 12, 2024
6592e03
updating the loss getting 14.8 out of 15.2
marekgluza Jun 12, 2024
fb5d9d5
gate counting functionalities in GCI transpiler
marekgluza Jun 13, 2024
a076544
notebook in progress how to run gradient descent from circuits
marekgluza Jun 13, 2024
9b689c7
example of gate count for 7l boosting with both GC and GC3 circuits a…
marekgluza Jun 13, 2024
5946320
added helper functions and fixes
marekgluza Jun 13, 2024
0ec6cb8
adding what I have...
marekgluza Jun 14, 2024
b12d702
running more steps with also the Ising strategy
marekgluza Jun 14, 2024
73457b4
-15.06 in about 1k layers...
marekgluza Jun 14, 2024
4b4f741
Gradient descent 3 steps in new notebook gci_ISING_gd.ipynb
Sam-XiaoyueLi Jun 14, 2024
2efc262
adding tutorial: the by hand guiding example and how it's all wrapped…
marekgluza Jun 14, 2024
45ae41c
sorted the circuit tutorial files
marekgluza Jun 14, 2024
1ba6318
still tinkering with the settings; Sam's notebook gave the best boost…
marekgluza Jun 14, 2024
cf35b18
moving the gd simple functions into a file
marekgluza Jun 15, 2024
ad54fdd
cleaning up
marekgluza Jun 15, 2024
82f4ee1
adding some dephasing init checks
marekgluza Jun 18, 2024
d450daf
added more systematized loading of vqe
marekgluza Jun 18, 2024
08eb78e
marek'schanges from today
marekgluza Jun 18, 2024
63c0152
small changes in notebook
marekgluza Jun 18, 2024
c2151b9
adding the simplified way to initialize and start gradients
marekgluza Jun 18, 2024
a6fda51
adding simplified uils vqe init notebook
marekgluza Jun 18, 2024
7decc38
refactoring code - some notebooks will be broken but example_utils_lo…
marekgluza Jun 19, 2024
8f064ee
small refactor
marekgluza Jun 19, 2024
5953bfc
adding back in the compiling testing nb
marekgluza Jun 19, 2024
e3f9936
added checks of other strategies
marekgluza Jun 19, 2024
a26a0c0
updating the contents of the ising gci notebook and showing how to us…
marekgluza Jun 19, 2024
b78a3e6
saved nb
marekgluza Jun 19, 2024
69346bd
adaptive grid search
Sam-XiaoyueLi Jun 19, 2024
5eb9a72
Merge branch 'compiling_XXZ' of https://github.com/qiboteam/boostvqe …
Sam-XiaoyueLi Jun 19, 2024
39b4ef7
integrate gradient descent in select_recursion_step
Sam-XiaoyueLi Jun 19, 2024
9918bca
optimizing compiling
MatteoRobbiati Jun 19, 2024
b6b2a08
doc string edited
marekgluza Jun 20, 2024
2c02177
adding reference data so that at least one boost runs out of the box
marekgluza Jun 20, 2024
be18271
Pseudo code for binary search
Sam-XiaoyueLi Jun 20, 2024
e1811e0
Merge branch 'compiling_XXZ' of https://github.com/qiboteam/boostvqe …
Sam-XiaoyueLi Jun 20, 2024
ae4cf5a
Binary search notebook
Sam-XiaoyueLi Jun 20, 2024
a7af4d7
minimum finding
marekgluza Jun 20, 2024
f3fd0ef
adding small changes in notebooks
marekgluza Jun 21, 2024
d73bbd3
adding small changes in notebooks saved
marekgluza Jun 21, 2024
2a0fe98
Combine binary search with gradient descent
Sam-XiaoyueLi Jun 21, 2024
8b8fc64
Merge branch 'compiling_XXZ' of https://github.com/qiboteam/boostvqe …
Sam-XiaoyueLi Jun 21, 2024
68d8e11
adding the notebook showcasing the systematic running structuring
marekgluza Jun 21, 2024
d3fe1de
Merge branch 'compiling_XXZ' of github.com:qiboteam/boostvqe into com…
marekgluza Jun 21, 2024
8a7d881
how to run the boosting of VQE more automatically
marekgluza Jun 21, 2024
a327ec3
sorted notebooks
marekgluza Jun 21, 2024
1f5be39
Thanks - merging because Sam is away and I will onboard Andrew later
marekgluza Jun 21, 2024
53ec013
running Sam's gd but some issue passing values because plot achieves …
marekgluza Jun 21, 2024
3db8a2c
pushing a setting which in 13 min computes 80% fidelity boost
marekgluza Jun 21, 2024
dca034c
fix: parameters in optimizaztion
MatteoRobbiati Jun 21, 2024
4a7c78a
fixing bug eigenvector via Issue #51, thanks Andrea. Additionally imp…
marekgluza Jun 24, 2024
9862d48
Merge branch 'compiling_XXZ' of github.com:qiboteam/boostvqe into com…
marekgluza Jun 24, 2024
5246a87
better printing finished
marekgluza Jun 24, 2024
9207348
fix: Remove results
andrea-pasquale Jun 24, 2024
850e1dc
Merge branch 'main' into compiling_no_results
andrea-pasquale Jun 24, 2024
67588c5
adding collection of outputs refactoring
marekgluza Jun 24, 2024
dc380ab
Merge branch 'compiling_XXZ' into compiling_no_results
andrea-pasquale Jun 24, 2024
b859742
two more simple things to store
marekgluza Jun 24, 2024
79c412a
removing some notebooks
marekgluza Jun 24, 2024
0e28215
pushing notebook with suggested configurations to evaluate
marekgluza Jun 24, 2024
e4a0d77
Merge branch 'compiling_XXZ' into compiling_no_results
andrea-pasquale Jun 24, 2024
1c2f9a0
feat: add optimizers together with old sgd
MatteoRobbiati Jun 24, 2024
0e22522
doc: add gci optimization notebook
MatteoRobbiati Jun 24, 2024
bf2cdc6
feat: Example of python script
andrea-pasquale Jun 24, 2024
7882746
merge compiling branch
MatteoRobbiati Jun 24, 2024
306b432
changing typo so that fidelity witness gives correct value in print
marekgluza Jun 25, 2024
faed97e
feat: Trying to clean up
andrea-pasquale Jun 25, 2024
dfcfdc9
feat: Script working with Matteo's data (for sgd)
andrea-pasquale Jun 25, 2024
e38d37a
feat: Store b list
andrea-pasquale Jun 25, 2024
4f7d483
refactor: Start refactoring (not working)
andrea-pasquale Jun 25, 2024
a4d83d8
cleanup: Clean up the code
andrea-pasquale Jun 25, 2024
72ff0c3
fix: Make dbr for argparse simpler
andrea-pasquale Jun 26, 2024
38fbbe6
fix: Minor fixes
andrea-pasquale Jun 26, 2024
1df73d2
feat: Store boosting results in separate folder
andrea-pasquale Jun 26, 2024
61568c9
feat: add optimizer options and shellscript
MatteoRobbiati Jun 26, 2024
7fae4d0
feat: shellscript to run compiling.py
MatteoRobbiati Jun 26, 2024
23bf157
fix: dumping results after GCI action and pretty logs
MatteoRobbiati Jun 26, 2024
6687994
fix: rm useless file
MatteoRobbiati Jun 26, 2024
688cae3
Update compiling.py
MatteoRobbiati Jun 26, 2024
e108ee4
Merge pull request #56 from qiboteam/opts
andrea-pasquale Jun 26, 2024
ed6d4b4
Merge pull request #55 from qiboteam/refactor
andrea-pasquale Jun 26, 2024
9692e3f
Merge pull request #52 from qiboteam/compiling_no_results
andrea-pasquale Jun 26, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
adding some dephasing init checks
marekgluza committed Jun 18, 2024
commit 82f4ee168819a2d216d14a27166b2e60c05004d7
2 changes: 1 addition & 1 deletion extras/load_vqe.py
Original file line number Diff line number Diff line change
@@ -19,7 +19,7 @@
path = "../results/vqe_data/with_params/10q3l/sgd_10q_3l_42/"

# set the target epoch to which apply DBQA and the number of steps
target_epoch = 20
target_epoch = 2000
dbi_steps = 1

# upload system configuration and parameters for all the training
298 changes: 298 additions & 0 deletions notebooks/check_canonical_bracket_init.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,298 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### This notebook showcases how to use gradient descent helper functions\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import time\n",
"from pathlib import Path\n",
"\n",
"import numpy as np\n",
"import qibo\n",
"from qibo import hamiltonians, set_backend\n",
"from boostvqe.models.dbi.double_bracket import (\n",
" DoubleBracketGeneratorType,\n",
" DoubleBracketIteration,\n",
")\n",
"\n",
"from boostvqe.ansatze import VQE, build_circuit\n",
"from boostvqe.utils import apply_dbi_steps, rotate_h_with_vqe\n",
"from qibo import symbols, hamiltonians\n",
"from copy import deepcopy\n",
"from boostvqe.compiling_XXZ import *\n",
"\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. Loading VQE results"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"[Qibo 0.2.9|INFO|2024-06-18 10:15:40]: Using numpy backend on /CPU:0\n",
"INFO:qibo.config:Using numpy backend on /CPU:0\n",
"[Qibo 0.2.9|INFO|2024-06-18 10:15:41]: Using numpy backend on /CPU:0\n",
"INFO:qibo.config:Using numpy backend on /CPU:0\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"In the VQE numpy\n"
]
}
],
"source": [
"\n",
"qibo.set_backend(\"numpy\")\n",
"\n",
"# set the path string which define the results\n",
"path = \"../results/vqe_data/with_params/10q7l/sgd_10q_7l_42/\"\n",
"\n",
"# set the target epoch to which apply DBQA and the number of steps\n",
"target_epoch = 2000\n",
"dbi_steps = 1\n",
"\n",
"# upload system configuration and parameters for all the training\n",
"with open(path + \"optimization_results.json\") as file:\n",
" config = json.load(file)\n",
"\n",
"losses = dict(np.load(path + \"energies.npz\"))[\"0\"]\n",
"params = np.load(path + f\"parameters/params_ite{target_epoch}.npy\")\n",
"\n",
"nqubits = config[\"nqubits\"]\n",
"# build circuit, hamiltonian and VQE\n",
"hamiltonian = hamiltonians.XXZ(nqubits=nqubits, delta=0.5)\n",
"circuit = build_circuit(nqubits, config[\"nlayers\"], \"numpy\")\n",
"vqe = VQE(circuit, hamiltonian)\n",
"zero_state = hamiltonian.backend.zero_state(nqubits)\n",
"zero_state_t = np.transpose([zero_state])\n",
"target_energy = np.min(hamiltonian.eigenvalues())\n",
"\n",
"\n",
"# set target parameters into the VQE\n",
"vqe.circuit.set_parameters(params)\n",
"vqe_state = vqe.circuit().state()\n",
"\n",
"ene1 = hamiltonian.expectation(vqe_state)\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"VQE energy is -14.856898957126564. \n",
"The target energy is -15.276131122065795 which means the difference is 0.4192321649392312.\n",
"The relative difference is 0.02744360869838739%.\n"
]
}
],
"source": [
"print(f\"VQE energy is {ene1}. \\n\\\n",
"The target energy is {target_energy} which means the difference is {ene1-target_energy}.\\n\\\n",
"The relative difference is {abs(ene1-target_energy)/abs(target_energy)}%.\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 2. GCI vs GCI3 steps\n",
"$D= \\sum_i B_i Z_i$\n",
"and Group commutator"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"\n",
"\n",
"from boostvqe.models.dbi.group_commutator_iteration_transpiler import *\n",
"from boostvqe.models.dbi.double_bracket_evolution_oracles import *\n",
"\n",
"\n",
"eo_xxz = XXZ_EvolutionOracle(nqubits, steps = 1, order = 2)\n",
"\n",
"# implement the rotate by VQE on the level of circuits\n",
"fsoe = VQERotatedEvolutionOracle(eo_xxz, vqe)\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# init gci with the vqe-rotated hamiltonian\n",
"gci = GroupCommutatorIterationWithEvolutionOracles(input_hamiltonian_evolution_oracle=fsoe, \n",
" mode_double_bracket_rotation=DoubleBracketRotationType.group_commutator_third_order_reduced)\n",
"\n",
"#from boostvqe.models.dbi.utils_gci_optimization import *\n"
]
},
{
"cell_type": "code",
"execution_count": 102,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"<>:22: SyntaxWarning: invalid escape sequence '\\D'\n",
"<>:32: SyntaxWarning: invalid escape sequence '\\D'\n",
"<>:22: SyntaxWarning: invalid escape sequence '\\D'\n",
"<>:32: SyntaxWarning: invalid escape sequence '\\D'\n",
"/tmp/ipykernel_40742/4203059886.py:22: SyntaxWarning: invalid escape sequence '\\D'\n",
" \"\"\"finds the decomposition of hamiltonian `$\\Delta(h_matrix)$` into Pauli-Z operators\"\"\"\n",
"/tmp/ipykernel_40742/4203059886.py:32: SyntaxWarning: invalid escape sequence '\\D'\n",
" \"\"\"finds the decomposition of hamiltonian `$\\Delta(h_matrix)$` into Pauli-Z operators\"\"\"\n"
]
}
],
"source": [
"def diagonal_1_pauli_z(i,n):\n",
" \"\"\"See Eq. 3 in https://arxiv.org/abs/1707.05181\"\"\"\n",
" i += 1\n",
"\n",
" block_size = 2**(n-i)\n",
"\n",
" plus_block = [1]*block_size\n",
" minus_block = [-1]*block_size\n",
" block = plus_block + minus_block\n",
"\n",
" return np.array(block * (2**(i-1)))\n",
"\n",
"def diagonal_product_pauli_z(i_list,n):\n",
" \"\"\"See Eq. 3 in https://arxiv.org/abs/1707.05181\"\"\"\n",
"\n",
" diagonals = []\n",
" for i in i_list:\n",
" diagonals.append(diagonal_1_pauli_z(i%n,n))\n",
" return np.prod(np.array(diagonals), axis = 0) \n",
"\n",
"def dephasing_approximation(h_matrix: np.array, order = 1):\n",
" \"\"\"finds the decomposition of hamiltonian `$\\Delta(h_matrix)$` into Pauli-Z operators\"\"\"\n",
" nqubits = int(np.log2(h_matrix.shape[0]))\n",
"\n",
" diagonal = np.diag(h_matrix)\n",
"\n",
" order_1 = [ diagonal.T @ diagonal_1_pauli_z(i,nqubits) / 2**nqubits for i in range(nqubits)]\n",
" order_2 = [ diagonal.T @ diagonal_product_pauli_z([i,j],nqubits) / 2**nqubits for i,j in itertools.product(range(nqubits),range(nqubits))]\n",
" return {1: order_1, 2: order_2}\n",
"\n",
"def nn_dephasing_approximation(h_matrix: np.array, order = 1):\n",
" \"\"\"finds the decomposition of hamiltonian `$\\Delta(h_matrix)$` into Pauli-Z operators\"\"\"\n",
" nqubits = int(np.log2(h_matrix.shape[0]))\n",
"\n",
" diagonal = np.diag(h_matrix)\n",
"\n",
" order_1 = [ diagonal.T @ diagonal_1_pauli_z(i,nqubits) / 2**nqubits for i in range(nqubits)]\n",
" order_2 = [ diagonal.T @ diagonal_product_pauli_z([i,i+1],nqubits) / 2**nqubits for i in range(nqubits)]\n",
" return {1: order_1, 2: order_2}"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {},
"outputs": [],
"source": [
"rhv = rotate_h_with_vqe(hamiltonian=hamiltonian, vqe=vqe)"
]
},
{
"cell_type": "code",
"execution_count": 103,
"metadata": {},
"outputs": [],
"source": [
"da = nn_dephasing_approximation(rhv)\n",
"b_list2 = da[1]\n",
"j_list2 = da[2]\n"
]
},
{
"cell_type": "code",
"execution_count": 108,
"metadata": {},
"outputs": [],
"source": [
"times = np.linspace(0.01,0.02,10)\n",
"eo_d = IsingNNEvolutionOracle(b_list2,j_list2,name = \"D(linear)\")\n",
"s,l, ls = gci.choose_step(d = eo_d,max_evals=34,step_min = 0.0081,step_max = 0.009)\n"
]
},
{
"cell_type": "code",
"execution_count": 109,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"-14.937939340738193"
]
},
"execution_count": 109,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"l"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 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": 2
}
Loading