Skip to content

Commit 52e6e66

Browse files
authored
Release 0.4.0 (#516)
1 parent 2607579 commit 52e6e66

67 files changed

Lines changed: 4341 additions & 2282 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,34 @@ All notable changes to this project will be documented in this file.
44
This project adheres to [Semantic Versioning](http://semver.org/).
55

66
### Types of changes:
7+
78
* **Added** for new features.
89
* **Changed** for changes in existing functionality.
910
* **Fixed** for any bug fixes.
1011
* **Removed** for now removed features.
1112

1213

13-
## [0.3.1] - [ 2025-01-31 ]
14+
## [ 0.4.0 ] - [ 2025-04-28 ]
15+
16+
### Added
17+
18+
- Assembly declaration
19+
- `Rn` unitary instruction
20+
- `SWAP2CZDecomposer` decomposer pass
21+
- `CZDecomposer` decomposer pass
22+
- `ShortestPathRouter` router pass
23+
- `RandomMapper` mapper pass
24+
- `AStarRouter` router pass
25+
26+
### Changed
27+
28+
- libQASM 1.1.0 integrated (updated from 0.6.9)
29+
- Refactor: removed generators
30+
- Changed the `RoutingChecker` pass to a `RoutingValidator` pass
31+
- Changed use of `native` to `primitive`, e.g. `NativeGateValidator` is now `PrimitiveGateValidator`
32+
- Compilation passes accept `kwargs` as input
33+
34+
## [ 0.3.1 ] - [ 2025-01-31 ]
1435

1536
### Fixed
1637

docs/_static/swap2cz.png

160 KB
Loading

docs/tutorial.md

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ _Output_:
207207

208208
qubit[1] q
209209

210-
Anonymous gate: BlochSphereRotation(Qubit[0], axis=[1. 0. 0.], angle=3.14159, phase=0.0)
210+
BlochSphereRotation(qubit=Qubit[0], axis=[1. 0. 0.], angle=3.14159, phase=0.0)
211211

212212
In the above example, OpenSquirrel has merged all the Rx gates together.
213213
Yet, for now, OpenSquirrel does not recognize that this results in a single Rx
@@ -387,6 +387,14 @@ The decomposition is illustrated in the image below.
387387

388388
<p align="center"> <img width="600" src="_static/swap2cnot.png"> </p>
389389

390+
##### _`SWAP` to `CZ` decomposer_
391+
392+
The `SWAP2CZDecomposer` implements the predefined decomposition of the `SWAP` gate into `Ry` rotations and 3 `CZ`
393+
gates.
394+
The decomposition is illustrated in the image below.
395+
396+
<p align="center"> <img width="600" src="_static/swap2cz.png"> </p>
397+
390398

391399
#### 2. Inferred decomposition
392400

@@ -435,9 +443,9 @@ print(ZYZDecomposer().decompose(H(0)))
435443
```
436444
_Output_:
437445

438-
[BlochSphereRotation(Qubit[0], axis=Axis[0. 0. 1.], angle=1.5707963267948966, phase=0.0),
439-
BlochSphereRotation(Qubit[0], axis=Axis[0. 1. 0.], angle=1.5707963267948966, phase=0.0),
440-
BlochSphereRotation(Qubit[0], axis=Axis[0. 0. 1.], angle=1.5707963267948966, phase=0.0)]
446+
[BlochSphereRotation(qubit=Qubit[0], axis=Axis[0. 0. 1.], angle=1.5707963267948966, phase=0.0),
447+
BlochSphereRotation(qubit=Qubit[0], axis=Axis[0. 1. 0.], angle=1.5707963267948966, phase=0.0),
448+
BlochSphereRotation(qubit=Qubit[0], axis=Axis[0. 0. 1.], angle=1.5707963267948966, phase=0.0)]
441449

442450

443451
## Exporting a circuit

example/decompositions.ipynb

Lines changed: 84 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"\n",
1818
"The ABA decomposition (or KAK decomposition) is a decomposition method that uses three consecutive Pauli rotation gates to form any unitary gate. Thus, any arbitrary single qubit gate can be expressed as a product of rotations: a rotation around the A axis, followed by a rotation around the B axis, and then another rotation around the A axis. The mathematical formalism for this rotation can be seen in section 3.1.\n",
1919
"\n",
20-
"In OpenSquirrel, this can be found in the `get_decomposition_angles` method from the `opensquirrel.decomposer.aba_decomposer` module. The ABA Decomposition can be applied to list of gates or a circuit. Below we will first focus on decomposing a circuit.\n",
20+
"In OpenSquirrel, this can be found in the `get_decomposition_angles` method from the `opensquirrel.passes.decomposer.aba_decomposer` module. The ABA Decomposition can be applied to list of gates or a circuit. Below we will first focus on decomposing a circuit.\n",
2121
"\n",
2222
"The circuit chosen is a single qubit circuit with an added Hadamard, Z, Y, and Rx gate. \n",
2323
"\n",
@@ -62,15 +62,14 @@
6262
"source": [
6363
"import math\n",
6464
"\n",
65-
"from opensquirrel import CircuitBuilder\n",
66-
"from opensquirrel.ir import Float, Qubit\n",
65+
"from opensquirrel.circuit_builder import CircuitBuilder\n",
6766
"\n",
6867
"# Build the circuit structure using the CircuitBuilder\n",
6968
"builder = CircuitBuilder(qubit_register_size=1)\n",
70-
"builder.H(Qubit(0))\n",
71-
"builder.Z(Qubit(0))\n",
72-
"builder.Y(Qubit(0))\n",
73-
"builder.Rx(Qubit(0), Float(math.pi / 3))\n",
69+
"builder.H(0)\n",
70+
"builder.Z(0)\n",
71+
"builder.Y(0)\n",
72+
"builder.Rx(0, math.pi / 3)\n",
7473
"\n",
7574
"# Create a new circuit from the constructed structure\n",
7675
"circuit = builder.to_circuit()\n",
@@ -81,7 +80,9 @@
8180
"cell_type": "markdown",
8281
"id": "afe111839ab98b22",
8382
"metadata": {},
84-
"source": "Above we can see the current gates in our circuit. Having created a circuit, we can now use an ABA decomposition in `opensquirrel.decomposer.aba_decomposer` to decompose the gates in the circuit. For this example, we will apply the Z-Y-Z decomposition using the `ZYZDecomposer`. "
83+
"source": [
84+
"Above we can see the current gates in our circuit. Having created a circuit, we can now use an ABA decomposition in `opensquirrel.passes.decomposer.aba_decomposer` to decompose the gates in the circuit. For this example, we will apply the Z-Y-Z decomposition using the `ZYZDecomposer`. "
85+
]
8586
},
8687
{
8788
"cell_type": "code",
@@ -116,7 +117,7 @@
116117
}
117118
],
118119
"source": [
119-
"from opensquirrel.passes.decomposer import ZYZDecomposer\n",
120+
"from opensquirrel.passes.decomposer.aba_decomposer import ZYZDecomposer\n",
120121
"\n",
121122
"# Decompose the circuit using ZYZDecomposer\n",
122123
"circuit.decompose(decomposer=ZYZDecomposer())\n",
@@ -170,9 +171,9 @@
170171
],
171172
"source": [
172173
"from opensquirrel import H\n",
173-
"from opensquirrel.passes.decomposer import XZXDecomposer\n",
174+
"from opensquirrel.passes.decomposer.aba_decomposer import XZXDecomposer\n",
174175
"\n",
175-
"XZXDecomposer().decompose(H(Qubit(0)))"
176+
"XZXDecomposer().decompose(H(0))"
176177
]
177178
},
178179
{
@@ -226,10 +227,10 @@
226227
"source": [
227228
"# Build the circuit structure using the CircuitBuilder\n",
228229
"builder = CircuitBuilder(qubit_register_size=1)\n",
229-
"builder.H(Qubit(0))\n",
230-
"builder.Z(Qubit(0))\n",
231-
"builder.X(Qubit(0))\n",
232-
"builder.Rx(Qubit(0), Float(math.pi / 3))\n",
230+
"builder.H(0)\n",
231+
"builder.Z(0)\n",
232+
"builder.X(0)\n",
233+
"builder.Rx(0, math.pi / 3)\n",
233234
"\n",
234235
"# Create a new circuit from the constructed structure\n",
235236
"circuit = builder.to_circuit()\n",
@@ -240,7 +241,9 @@
240241
"cell_type": "markdown",
241242
"id": "69517d8287c1777d",
242243
"metadata": {},
243-
"source": "The `McKayDecomposer` is called from `opensquirrel.decomposer.mckay_decomposer` and used in a similar method to the `ABADecomposer`."
244+
"source": [
245+
"The `McKayDecomposer` is called from `opensquirrel.passes.decomposer` and used in a similar method to the `ABADecomposer`."
246+
]
244247
},
245248
{
246249
"cell_type": "code",
@@ -358,9 +361,9 @@
358361
"source": [
359362
"# Build the circuit structure using the CircuitBuilder\n",
360363
"builder = CircuitBuilder(qubit_register_size=2)\n",
361-
"builder.CZ(Qubit(0), Qubit(1))\n",
362-
"builder.CR(Qubit(0), Qubit(1), Float(math.pi / 3))\n",
363-
"builder.CR(Qubit(1), Qubit(0), Float(math.pi / 2))\n",
364+
"builder.CZ(0, 1)\n",
365+
"builder.CR(0, 1, math.pi / 3)\n",
366+
"builder.CR(1, 0, math.pi / 2)\n",
364367
"\n",
365368
"# Create a new circuit from the constructed structure\n",
366369
"circuit = builder.to_circuit()\n",
@@ -371,7 +374,9 @@
371374
"cell_type": "markdown",
372375
"id": "8c945ab4572e9f77",
373376
"metadata": {},
374-
"source": "We can import `CNOTDecomposer` from `opensquirrel.decomposer.cnot_decomposer`. The above circuit can then be decomposed using `CNOTDecomposer` as seen below."
377+
"source": [
378+
"We can import `CNOTDecomposer` from `opensquirrel.passes.decomposer`. The above circuit can then be decomposed using `CNOTDecomposer` as seen below."
379+
]
375380
},
376381
{
377382
"cell_type": "code",
@@ -475,7 +480,9 @@
475480
"outputs": [
476481
{
477482
"data": {
478-
"text/latex": "$\\displaystyle \\cos{\\left(\\frac{\\theta_{2}}{2} \\right)} \\cos{\\left(\\frac{\\theta_{1} + \\theta_{3}}{2} \\right)} + - \\sin{\\left(\\frac{\\theta_{2}}{2} \\right)} \\sin{\\left(\\frac{\\theta_{1} - \\theta_{3}}{2} \\right)} i + \\sin{\\left(\\frac{\\theta_{2}}{2} \\right)} \\cos{\\left(\\frac{\\theta_{1} - \\theta_{3}}{2} \\right)} j + \\sin{\\left(\\frac{\\theta_{1} + \\theta_{3}}{2} \\right)} \\cos{\\left(\\frac{\\theta_{2}}{2} \\right)} k$",
483+
"text/latex": [
484+
"$\\displaystyle \\cos{\\left(\\frac{\\theta_{2}}{2} \\right)} \\cos{\\left(\\frac{\\theta_{1} + \\theta_{3}}{2} \\right)} + - \\sin{\\left(\\frac{\\theta_{2}}{2} \\right)} \\sin{\\left(\\frac{\\theta_{1} - \\theta_{3}}{2} \\right)} i + \\sin{\\left(\\frac{\\theta_{2}}{2} \\right)} \\cos{\\left(\\frac{\\theta_{1} - \\theta_{3}}{2} \\right)} j + \\sin{\\left(\\frac{\\theta_{1} + \\theta_{3}}{2} \\right)} \\cos{\\left(\\frac{\\theta_{2}}{2} \\right)} k$"
485+
],
479486
"text/plain": [
480487
"cos(theta_2/2)*cos((theta_1 + theta_3)/2) + (-sin(theta_2/2)*sin((theta_1 - theta_3)/2))*i + sin(theta_2/2)*cos((theta_1 - theta_3)/2)*j + sin((theta_1 + theta_3)/2)*cos(theta_2/2)*k"
481488
]
@@ -502,7 +509,9 @@
502509
"cell_type": "markdown",
503510
"id": "6e776f2cb7cae465",
504511
"metadata": {},
505-
"source": "Let us change variables and define $p\\equiv\\theta_1 + \\theta_3$ and $m\\equiv\\theta_1 - \\theta_3$."
512+
"source": [
513+
"Let us change variables and define $p\\equiv\\theta_1 + \\theta_3$ and $m\\equiv\\theta_1 - \\theta_3$."
514+
]
506515
},
507516
{
508517
"cell_type": "code",
@@ -517,7 +526,9 @@
517526
"outputs": [
518527
{
519528
"data": {
520-
"text/latex": "$\\displaystyle \\cos{\\left(\\frac{p}{2} \\right)} \\cos{\\left(\\frac{\\theta_{2}}{2} \\right)} + - \\sin{\\left(\\frac{m}{2} \\right)} \\sin{\\left(\\frac{\\theta_{2}}{2} \\right)} i + \\sin{\\left(\\frac{\\theta_{2}}{2} \\right)} \\cos{\\left(\\frac{m}{2} \\right)} j + \\sin{\\left(\\frac{p}{2} \\right)} \\cos{\\left(\\frac{\\theta_{2}}{2} \\right)} k$",
529+
"text/latex": [
530+
"$\\displaystyle \\cos{\\left(\\frac{p}{2} \\right)} \\cos{\\left(\\frac{\\theta_{2}}{2} \\right)} + - \\sin{\\left(\\frac{m}{2} \\right)} \\sin{\\left(\\frac{\\theta_{2}}{2} \\right)} i + \\sin{\\left(\\frac{\\theta_{2}}{2} \\right)} \\cos{\\left(\\frac{m}{2} \\right)} j + \\sin{\\left(\\frac{p}{2} \\right)} \\cos{\\left(\\frac{\\theta_{2}}{2} \\right)} k$"
531+
],
521532
"text/plain": [
522533
"cos(p/2)*cos(theta_2/2) + (-sin(m/2)*sin(theta_2/2))*i + sin(theta_2/2)*cos(m/2)*j + sin(p/2)*cos(theta_2/2)*k"
523534
]
@@ -539,7 +550,9 @@
539550
"cell_type": "markdown",
540551
"id": "1ece3d36eb99512b",
541552
"metadata": {},
542-
"source": "The original rotation's quaternion $q$ can be defined in Sympy accordingly:"
553+
"source": [
554+
"The original rotation's quaternion $q$ can be defined in Sympy accordingly:"
555+
]
543556
},
544557
{
545558
"cell_type": "code",
@@ -554,7 +567,9 @@
554567
"outputs": [
555568
{
556569
"data": {
557-
"text/latex": "$\\displaystyle \\cos{\\left(\\frac{\\alpha}{2} \\right)} + n_{x} \\sin{\\left(\\frac{\\alpha}{2} \\right)} i + n_{y} \\sin{\\left(\\frac{\\alpha}{2} \\right)} j + n_{z} \\sin{\\left(\\frac{\\alpha}{2} \\right)} k$",
570+
"text/latex": [
571+
"$\\displaystyle \\cos{\\left(\\frac{\\alpha}{2} \\right)} + n_{x} \\sin{\\left(\\frac{\\alpha}{2} \\right)} i + n_{y} \\sin{\\left(\\frac{\\alpha}{2} \\right)} j + n_{z} \\sin{\\left(\\frac{\\alpha}{2} \\right)} k$"
572+
],
558573
"text/plain": [
559574
"cos(alpha/2) + n_x*sin(alpha/2)*i + n_y*sin(alpha/2)*j + n_z*sin(alpha/2)*k"
560575
]
@@ -577,7 +592,9 @@
577592
"cell_type": "markdown",
578593
"id": "7cb50842c8fa111a",
579594
"metadata": {},
580-
"source": "We get the following system of equations, where the unknowns are $p$, $m$, and $\\theta_2$:\n"
595+
"source": [
596+
"We get the following system of equations, where the unknowns are $p$, $m$, and $\\theta_2$:\n"
597+
]
581598
},
582599
{
583600
"cell_type": "code",
@@ -592,7 +609,9 @@
592609
"outputs": [
593610
{
594611
"data": {
595-
"text/latex": "$\\displaystyle \\cos{\\left(\\frac{p}{2} \\right)} \\cos{\\left(\\frac{\\theta_{2}}{2} \\right)} = \\cos{\\left(\\frac{\\alpha}{2} \\right)}$",
612+
"text/latex": [
613+
"$\\displaystyle \\cos{\\left(\\frac{p}{2} \\right)} \\cos{\\left(\\frac{\\theta_{2}}{2} \\right)} = \\cos{\\left(\\frac{\\alpha}{2} \\right)}$"
614+
],
596615
"text/plain": [
597616
"Eq(cos(p/2)*cos(theta_2/2), cos(alpha/2))"
598617
]
@@ -602,7 +621,9 @@
602621
},
603622
{
604623
"data": {
605-
"text/latex": "$\\displaystyle - \\sin{\\left(\\frac{m}{2} \\right)} \\sin{\\left(\\frac{\\theta_{2}}{2} \\right)} = n_{x} \\sin{\\left(\\frac{\\alpha}{2} \\right)}$",
624+
"text/latex": [
625+
"$\\displaystyle - \\sin{\\left(\\frac{m}{2} \\right)} \\sin{\\left(\\frac{\\theta_{2}}{2} \\right)} = n_{x} \\sin{\\left(\\frac{\\alpha}{2} \\right)}$"
626+
],
606627
"text/plain": [
607628
"Eq(-sin(m/2)*sin(theta_2/2), n_x*sin(alpha/2))"
608629
]
@@ -612,7 +633,9 @@
612633
},
613634
{
614635
"data": {
615-
"text/latex": "$\\displaystyle \\sin{\\left(\\frac{\\theta_{2}}{2} \\right)} \\cos{\\left(\\frac{m}{2} \\right)} = n_{y} \\sin{\\left(\\frac{\\alpha}{2} \\right)}$",
636+
"text/latex": [
637+
"$\\displaystyle \\sin{\\left(\\frac{\\theta_{2}}{2} \\right)} \\cos{\\left(\\frac{m}{2} \\right)} = n_{y} \\sin{\\left(\\frac{\\alpha}{2} \\right)}$"
638+
],
616639
"text/plain": [
617640
"Eq(sin(theta_2/2)*cos(m/2), n_y*sin(alpha/2))"
618641
]
@@ -622,7 +645,9 @@
622645
},
623646
{
624647
"data": {
625-
"text/latex": "$\\displaystyle \\sin{\\left(\\frac{p}{2} \\right)} \\cos{\\left(\\frac{\\theta_{2}}{2} \\right)} = n_{z} \\sin{\\left(\\frac{\\alpha}{2} \\right)}$",
648+
"text/latex": [
649+
"$\\displaystyle \\sin{\\left(\\frac{p}{2} \\right)} \\cos{\\left(\\frac{\\theta_{2}}{2} \\right)} = n_{z} \\sin{\\left(\\frac{\\alpha}{2} \\right)}$"
650+
],
626651
"text/plain": [
627652
"Eq(sin(p/2)*cos(theta_2/2), n_z*sin(alpha/2))"
628653
]
@@ -646,7 +671,9 @@
646671
"cell_type": "markdown",
647672
"id": "e6b34ef9cb46f2e4",
648673
"metadata": {},
649-
"source": "Instead, assume $\\sin(p/2) \\neq 0$, then we can substitute in the first equation $\\cos\\left(\\theta_2/2\\right)$ with its value computed from the last equation. We get:"
674+
"source": [
675+
"Instead, assume $\\sin(p/2) \\neq 0$, then we can substitute in the first equation $\\cos\\left(\\theta_2/2\\right)$ with its value computed from the last equation. We get:"
676+
]
650677
},
651678
{
652679
"cell_type": "code",
@@ -661,7 +688,9 @@
661688
"outputs": [
662689
{
663690
"data": {
664-
"text/latex": "$\\displaystyle \\frac{n_{z} \\sin{\\left(\\frac{\\alpha}{2} \\right)}}{\\tan{\\left(\\frac{p}{2} \\right)}} = \\cos{\\left(\\frac{\\alpha}{2} \\right)}$",
691+
"text/latex": [
692+
"$\\displaystyle \\frac{n_{z} \\sin{\\left(\\frac{\\alpha}{2} \\right)}}{\\tan{\\left(\\frac{p}{2} \\right)}} = \\cos{\\left(\\frac{\\alpha}{2} \\right)}$"
693+
],
665694
"text/plain": [
666695
"Eq(n_z*sin(alpha/2)/tan(p/2), cos(alpha/2))"
667696
]
@@ -718,7 +747,9 @@
718747
"cell_type": "markdown",
719748
"id": "e3fc4cdb6d15dd1",
720749
"metadata": {},
721-
"source": "The terms are similar to the other decompositions, XZX, YXY, ZXZ, XYX and YZY. However, for ZXZ, XYX and YZY, the $i$ term in the quaternion is positive as seen below in the YZY decomposition."
750+
"source": [
751+
"The terms are similar to the other decompositions, XZX, YXY, ZXZ, XYX and YZY. However, for ZXZ, XYX and YZY, the $i$ term in the quaternion is positive as seen below in the YZY decomposition."
752+
]
722753
},
723754
{
724755
"cell_type": "code",
@@ -733,7 +764,9 @@
733764
"outputs": [
734765
{
735766
"data": {
736-
"text/latex": "$\\displaystyle \\cos{\\left(\\frac{\\theta_{2}}{2} \\right)} \\cos{\\left(\\frac{\\theta_{1} + \\theta_{3}}{2} \\right)} + \\sin{\\left(\\frac{\\theta_{2}}{2} \\right)} \\sin{\\left(\\frac{\\theta_{1} - \\theta_{3}}{2} \\right)} i + \\sin{\\left(\\frac{\\theta_{1} + \\theta_{3}}{2} \\right)} \\cos{\\left(\\frac{\\theta_{2}}{2} \\right)} j + \\sin{\\left(\\frac{\\theta_{2}}{2} \\right)} \\cos{\\left(\\frac{\\theta_{1} - \\theta_{3}}{2} \\right)} k$",
767+
"text/latex": [
768+
"$\\displaystyle \\cos{\\left(\\frac{\\theta_{2}}{2} \\right)} \\cos{\\left(\\frac{\\theta_{1} + \\theta_{3}}{2} \\right)} + \\sin{\\left(\\frac{\\theta_{2}}{2} \\right)} \\sin{\\left(\\frac{\\theta_{1} - \\theta_{3}}{2} \\right)} i + \\sin{\\left(\\frac{\\theta_{1} + \\theta_{3}}{2} \\right)} \\cos{\\left(\\frac{\\theta_{2}}{2} \\right)} j + \\sin{\\left(\\frac{\\theta_{2}}{2} \\right)} \\cos{\\left(\\frac{\\theta_{1} - \\theta_{3}}{2} \\right)} k$"
769+
],
737770
"text/plain": [
738771
"cos(theta_2/2)*cos((theta_1 + theta_3)/2) + sin(theta_2/2)*sin((theta_1 - theta_3)/2)*i + sin((theta_1 + theta_3)/2)*cos(theta_2/2)*j + sin(theta_2/2)*cos((theta_1 - theta_3)/2)*k"
739772
]
@@ -758,7 +791,9 @@
758791
"cell_type": "markdown",
759792
"id": "a41b84ed5f3365b2",
760793
"metadata": {},
761-
"source": "Thus, in order to correct for the orientation of the rotation, $\\theta_1$ and $\\theta_3$ are swapped. "
794+
"source": [
795+
"Thus, in order to correct for the orientation of the rotation, $\\theta_1$ and $\\theta_3$ are swapped. "
796+
]
762797
},
763798
{
764799
"cell_type": "markdown",
@@ -793,6 +828,8 @@
793828
},
794829
{
795830
"cell_type": "markdown",
831+
"id": "866e89a24587f0af",
832+
"metadata": {},
796833
"source": [
797834
"### 3.3 ABA Decomposition\n",
798835
"In a two qubit system, the unitary matrix of a controlled operation is seen below,\n",
@@ -844,11 +881,20 @@
844881
"C &= Rz\\bigg(\\frac{1}{2} \\theta_0 - \\frac{1}{2} \\theta_2 \\bigg)\n",
845882
"\\end{split}\n",
846883
"$$"
847-
],
884+
]
885+
},
886+
{
887+
"cell_type": "code",
888+
"execution_count": 28,
889+
"id": "3cc1e9963f3e794d",
848890
"metadata": {
849-
"collapsed": false
891+
"ExecuteTime": {
892+
"end_time": "2024-08-05T11:35:27.882752Z",
893+
"start_time": "2024-08-05T11:35:27.871794Z"
894+
}
850895
},
851-
"id": "c084046b0bb17ec9"
896+
"outputs": [],
897+
"source": []
852898
}
853899
],
854900
"metadata": {

0 commit comments

Comments
 (0)