qadence 1.7.8__py3-none-any.whl → 1.8.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qadence/analog/device.py +1 -1
- qadence/backend.py +3 -3
- qadence/backends/horqrux/backend.py +3 -3
- qadence/backends/pulser/backend.py +16 -17
- qadence/backends/pulser/convert_ops.py +2 -2
- qadence/backends/pyqtorch/backend.py +7 -7
- qadence/backends/pyqtorch/convert_ops.py +191 -240
- qadence/backends/utils.py +9 -1
- qadence/blocks/abstract.py +1 -1
- qadence/blocks/embedding.py +21 -11
- qadence/blocks/matrix.py +3 -1
- qadence/blocks/primitive.py +36 -11
- qadence/circuit.py +1 -1
- qadence/constructors/__init__.py +2 -1
- qadence/constructors/ansatze.py +176 -0
- qadence/engines/differentiable_backend.py +3 -3
- qadence/engines/jax/differentiable_backend.py +2 -2
- qadence/engines/jax/differentiable_expectation.py +2 -2
- qadence/engines/torch/differentiable_backend.py +2 -2
- qadence/engines/torch/differentiable_expectation.py +2 -2
- qadence/execution.py +14 -14
- qadence/extensions.py +1 -1
- qadence/measurements/shadow.py +4 -5
- qadence/measurements/tomography.py +2 -2
- qadence/measurements/utils.py +2 -2
- qadence/mitigations/analog_zne.py +8 -7
- qadence/mitigations/protocols.py +2 -2
- qadence/mitigations/readout.py +8 -5
- qadence/ml_tools/constructors.py +2 -2
- qadence/ml_tools/models.py +7 -7
- qadence/ml_tools/printing.py +2 -1
- qadence/model.py +5 -5
- qadence/noise/__init__.py +2 -2
- qadence/noise/protocols.py +216 -29
- qadence/operations/control_ops.py +37 -22
- qadence/operations/ham_evo.py +1 -0
- qadence/operations/parametric.py +32 -10
- qadence/operations/primitive.py +61 -29
- qadence/overlap.py +0 -6
- qadence/parameters.py +3 -2
- qadence/transpile/__init__.py +2 -1
- qadence/transpile/noise.py +46 -0
- qadence/types.py +26 -2
- {qadence-1.7.8.dist-info → qadence-1.8.0.dist-info}/METADATA +5 -8
- {qadence-1.7.8.dist-info → qadence-1.8.0.dist-info}/RECORD +47 -50
- qadence/backends/braket/__init__.py +0 -4
- qadence/backends/braket/backend.py +0 -234
- qadence/backends/braket/config.py +0 -22
- qadence/backends/braket/convert_ops.py +0 -116
- {qadence-1.7.8.dist-info → qadence-1.8.0.dist-info}/WHEEL +0 -0
- {qadence-1.7.8.dist-info → qadence-1.8.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: qadence
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.8.0
|
4
4
|
Summary: Pasqal interface for circuit-based quantum computing SDKs
|
5
5
|
Author-email: Aleksander Wennersteen <aleksander.wennersteen@pasqal.com>, Gert-Jan Both <gert-jan.both@pasqal.com>, Niklas Heim <niklas.heim@pasqal.com>, Mario Dagrada <mario.dagrada@pasqal.com>, Vincent Elfving <vincent.elfving@pasqal.com>, Dominik Seitz <dominik.seitz@pasqal.com>, Roland Guichard <roland.guichard@pasqal.com>, "Joao P. Moutinho" <joao.moutinho@pasqal.com>, Vytautas Abramavicius <vytautas.abramavicius@pasqal.com>, Gergana Velikova <gergana.velikova@pasqal.com>, Eduardo Maschio <eduardo.maschio@pasqal.com>, Smit Chaudhary <smit.chaudhary@pasqal.com>, Ignacio Fernández Graña <ignacio.fernandez-grana@pasqal.com>, Charles Moussa <charles.moussa@pasqal.com>, Giorgio Tosti Balducci <giorgio.tosti-balducci@pasqal.com>, Daniele Cucurachi <daniele.cucurachi@pasqal.com>
|
6
6
|
License: Apache 2.0
|
@@ -22,7 +22,7 @@ Requires-Dist: matplotlib
|
|
22
22
|
Requires-Dist: nevergrad
|
23
23
|
Requires-Dist: numpy
|
24
24
|
Requires-Dist: openfermion
|
25
|
-
Requires-Dist: pyqtorch==1.
|
25
|
+
Requires-Dist: pyqtorch==1.5.1
|
26
26
|
Requires-Dist: pyyaml
|
27
27
|
Requires-Dist: rich
|
28
28
|
Requires-Dist: scipy
|
@@ -31,14 +31,11 @@ Requires-Dist: sympytorch>=0.1.2
|
|
31
31
|
Requires-Dist: tensorboard>=2.12.0
|
32
32
|
Requires-Dist: torch
|
33
33
|
Provides-Extra: all
|
34
|
-
Requires-Dist: braket; extra == 'all'
|
35
34
|
Requires-Dist: libs; extra == 'all'
|
36
35
|
Requires-Dist: mlflow; extra == 'all'
|
37
36
|
Requires-Dist: protocols; extra == 'all'
|
38
37
|
Requires-Dist: pulser; extra == 'all'
|
39
38
|
Requires-Dist: visualization; extra == 'all'
|
40
|
-
Provides-Extra: braket
|
41
|
-
Requires-Dist: amazon-braket-sdk<1.71.2; extra == 'braket'
|
42
39
|
Provides-Extra: dlprof
|
43
40
|
Requires-Dist: nvidia-dlprof[pytorch]; extra == 'dlprof'
|
44
41
|
Requires-Dist: nvidia-pyindex; extra == 'dlprof'
|
@@ -57,9 +54,9 @@ Requires-Dist: mlflow; extra == 'mlflow'
|
|
57
54
|
Provides-Extra: protocols
|
58
55
|
Requires-Dist: qadence-protocols; extra == 'protocols'
|
59
56
|
Provides-Extra: pulser
|
60
|
-
Requires-Dist: pasqal-cloud==0.12.
|
61
|
-
Requires-Dist: pulser-core==
|
62
|
-
Requires-Dist: pulser-simulation==
|
57
|
+
Requires-Dist: pasqal-cloud==0.12.4; extra == 'pulser'
|
58
|
+
Requires-Dist: pulser-core==1.1.1; extra == 'pulser'
|
59
|
+
Requires-Dist: pulser-simulation==1.1.1; extra == 'pulser'
|
63
60
|
Provides-Extra: visualization
|
64
61
|
Requires-Dist: graphviz; extra == 'visualization'
|
65
62
|
Description-Content-Type: text/markdown
|
@@ -1,16 +1,16 @@
|
|
1
1
|
qadence/__init__.py,sha256=0SFU1_XZ-3WlSU1rA4W1Y0edxpZLO_sNg-YnpjlD77w,2638
|
2
|
-
qadence/backend.py,sha256=
|
3
|
-
qadence/circuit.py,sha256=
|
2
|
+
qadence/backend.py,sha256=MigWAAroh_STGLg2qoQED9tDHmTo15uBbvFNz_oHy7A,13372
|
3
|
+
qadence/circuit.py,sha256=r8QvzLWHvavqLOlNstq8aHg6UpKmPClEDoZVBkk-tzY,6970
|
4
4
|
qadence/decompose.py,sha256=C4LYia_GcC9Rx3QO0ZLWTI9dN63a8WTEAXO0ZVQWuiE,5221
|
5
5
|
qadence/divergences.py,sha256=JhpELhWSnuDvQxa9hJp_DE3EQg2Ban-Ta0mHZ_fVrHg,1832
|
6
|
-
qadence/execution.py,sha256=
|
7
|
-
qadence/extensions.py,sha256=
|
6
|
+
qadence/execution.py,sha256=rYOKNQyOL6xM5qkqe9rYU823U7OYBnTnCWNdwteGAw8,9742
|
7
|
+
qadence/extensions.py,sha256=Fyj8WweDNbtZc6snZ2y7zLL-jBOvi7InMYElbC2gNmQ,6084
|
8
8
|
qadence/libs.py,sha256=HetkKO8TCTlVCViQdVQJvxwBekrhd-y_iMox4UJMY1M,410
|
9
9
|
qadence/log_config.yaml,sha256=WwSpxqMSXgPJ7wO_wh46UnFzXdgX9NVA4MbN3TcJFyE,485
|
10
10
|
qadence/logger.py,sha256=Hb76pK3VyQjVjJb4_NqFlOJgjYJVa8t7DHJFlzOM86M,407
|
11
|
-
qadence/model.py,sha256=
|
12
|
-
qadence/overlap.py,sha256=
|
13
|
-
qadence/parameters.py,sha256=
|
11
|
+
qadence/model.py,sha256=qmB_IFnjNjcl_p_EaECXDTwnyQSy1LY9HiB8DzUnqPg,21613
|
12
|
+
qadence/overlap.py,sha256=ekaUnIcQWdF4hSFuUWpRjaxo43JyDGFOayP7vMXCZpw,16821
|
13
|
+
qadence/parameters.py,sha256=RDYklyW5EQZTjsAazEXa4lLGDOdmUUU53hLj385uSaI,12687
|
14
14
|
qadence/protocols.py,sha256=bcYTxSjgMPV-a-D6yv90jCpnGik8myzaNpFv9z1gzJ0,442
|
15
15
|
qadence/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
16
16
|
qadence/qubit_support.py,sha256=Nkn1Q01RVViTcggSIom7EFKdWpAuM4TMGwBZ5feCUxA,2120
|
@@ -18,52 +18,48 @@ qadence/register.py,sha256=mwmvS6PcTY0F9cIhTUXG3NT73FIagfMCwVqYa4DrQrk,13001
|
|
18
18
|
qadence/serial_expr_grammar.peg,sha256=z5ytL7do9kO8o4h-V5GrsDuLdso0KsRcMuIYURFfmAY,328
|
19
19
|
qadence/serialization.py,sha256=qEET6Gu9u2aSibPve3bJrqDzK2_gO3RPDJjt4ZY8GbE,15596
|
20
20
|
qadence/states.py,sha256=5QIOBBYs8e2uLFiMa8iMYZ-MvWIFEqkZAjNYx0SyYPI,14843
|
21
|
-
qadence/types.py,sha256=
|
21
|
+
qadence/types.py,sha256=dYcn3hlFkzqFs29xaF2f17mg-NfBNN6dyzfpaqZ8GoA,11576
|
22
22
|
qadence/utils.py,sha256=zb2j7wURfy8kazaS84r4t35vAeDpo4Tpm4HbmPH-kFA,9865
|
23
23
|
qadence/analog/__init__.py,sha256=BCyS9R4KUjzUXN0Ax3b0eMo8ZAuSkGoJQVtZ4_pvAFs,279
|
24
24
|
qadence/analog/addressing.py,sha256=GSt4heEmRkBmoQIgdgkTclEFxZY-jjuAd77_SsZtGdI,6513
|
25
25
|
qadence/analog/constants.py,sha256=B2phQoN1ASL8CwM-Dsa1rbraYwGwwPSeiB3HbVe-MPA,1243
|
26
|
-
qadence/analog/device.py,sha256=
|
26
|
+
qadence/analog/device.py,sha256=LK8rQYBiK_PWHezLfTL0Ig83yc5wQPmZ3rBZF-gWgYw,2416
|
27
27
|
qadence/analog/hamiltonian_terms.py,sha256=9LKidqqEMJTTdXeaxkxP_otTmcv9i4yeJ-JKCLOCK3Y,3421
|
28
28
|
qadence/analog/parse_analog.py,sha256=ppvMZtsKXOIkIehCgjbdmG9n232DIycSanyuyVth5Wg,4223
|
29
29
|
qadence/backends/__init__.py,sha256=ibm7wmZxuIoMYAQxgAx0MsfLYWOVHNWgLwyS1HjMuuI,215
|
30
30
|
qadence/backends/api.py,sha256=NPrvtZQ4klUBabUWJ5hbTUCVoaoW9-sHVbiXxAnTt3A,2643
|
31
31
|
qadence/backends/gpsr.py,sha256=3lcOHgt0soCiDXAyZ8DVyS8dMgUypIPwkDADds2boSE,5371
|
32
32
|
qadence/backends/jax_utils.py,sha256=VfKhqCKknHDWZO21UFipWH_Lkiq175Z5GkP49gWjbyw,5038
|
33
|
-
qadence/backends/utils.py,sha256=
|
34
|
-
qadence/backends/braket/__init__.py,sha256=eruyDZKMqkh1LE7eJ980vcrLJbia35uUX6krAP78clI,121
|
35
|
-
qadence/backends/braket/backend.py,sha256=HNqs4ASB1wgIaInBNifC83GDsXOfz8s6FIIvP4aY9IM,8481
|
36
|
-
qadence/backends/braket/config.py,sha256=7cu22dmYdp48Fu760HPfxBHinaUnGmzx9MkE_EPhVN8,594
|
37
|
-
qadence/backends/braket/convert_ops.py,sha256=DVXV7sT9sX_yGOgPKclD9KIGgmbBRuDy_e39i1Z8I1s,3417
|
33
|
+
qadence/backends/utils.py,sha256=SdeAf6BDayc-W9hPI271PKtJ_ROOzRry9Jw72wUGmm4,8565
|
38
34
|
qadence/backends/horqrux/__init__.py,sha256=0OdVy6cq0oQggV48LO1WXdaZuSkDkz7OYNEPIkNAmfk,140
|
39
|
-
qadence/backends/horqrux/backend.py,sha256=
|
35
|
+
qadence/backends/horqrux/backend.py,sha256=KNFFGN9dsgB9QKtNXiP3LyMY9DQ-7W7ScyE6k29fHJY,8842
|
40
36
|
qadence/backends/horqrux/config.py,sha256=xz7JlUcwW_4JAbvProbSI9hA1SXZRRAN0Hr2bvmLzfg,892
|
41
37
|
qadence/backends/horqrux/convert_ops.py,sha256=3uG3yLq5wjfrWzFHDs0HEnd8kER91ZHVX3HCpYjOdjk,8565
|
42
38
|
qadence/backends/pulser/__init__.py,sha256=capQ-eHqwtOeLf4mWsI0BIseAHhiLGie5cFD4-iVhUo,116
|
43
|
-
qadence/backends/pulser/backend.py,sha256=
|
39
|
+
qadence/backends/pulser/backend.py,sha256=U2VcHUMtMXpCe470OfrGCzOjJ28SA6rx40LhkIkZqC4,15582
|
44
40
|
qadence/backends/pulser/channels.py,sha256=ZF0yEXUFHAmi3IdeXjzdTNGR5NzaRRFTiUpUGVg2sO4,329
|
45
41
|
qadence/backends/pulser/cloud.py,sha256=0uUluvbFV9sOuCPraE-9uiVtC3Q8QaDY1IJMDi8grDM,2057
|
46
42
|
qadence/backends/pulser/config.py,sha256=aoHDmtgq5i0Zryxenw_p3uARY0B1w-UaYvfqDmrWHM0,2175
|
47
|
-
qadence/backends/pulser/convert_ops.py,sha256=
|
43
|
+
qadence/backends/pulser/convert_ops.py,sha256=wyttkkjPimI0OOYERS4S4w1F2j270v5iRuV1cm6Siu0,1814
|
48
44
|
qadence/backends/pulser/devices.py,sha256=DermLZNfmCB3SqteKVW4uhg4jp6ya1G6ptnXbBnJogI,2448
|
49
45
|
qadence/backends/pulser/pulses.py,sha256=F4fExIRAhLPMtVg1bhNtDihUYHxu5RExGjovk8-CQIo,11884
|
50
46
|
qadence/backends/pulser/waveforms.py,sha256=0uz95b7rUaUUtN0tuHBZmJ0H6UBmfHST_59ozwsRCzg,2227
|
51
47
|
qadence/backends/pyqtorch/__init__.py,sha256=0OdVy6cq0oQggV48LO1WXdaZuSkDkz7OYNEPIkNAmfk,140
|
52
|
-
qadence/backends/pyqtorch/backend.py,sha256=
|
48
|
+
qadence/backends/pyqtorch/backend.py,sha256=Cn-hXzEz-iqrOC87m_xI7MIapRielQH26nAjhCFbWas,8958
|
53
49
|
qadence/backends/pyqtorch/config.py,sha256=jK-if0OF6L_inP-oZhWI4-b8wcrOiK8-EVv3NYDOfBM,2056
|
54
|
-
qadence/backends/pyqtorch/convert_ops.py,sha256=
|
50
|
+
qadence/backends/pyqtorch/convert_ops.py,sha256=y17_ECCXFke2HCFzBwYDtuFC_RXwMEKyZRplpFhFsyU,11231
|
55
51
|
qadence/blocks/__init__.py,sha256=H6jEA_CptkE-eoB4UfSbUiDszbxxhZwECV_TgoZWXoU,960
|
56
|
-
qadence/blocks/abstract.py,sha256=
|
52
|
+
qadence/blocks/abstract.py,sha256=DSQUE71rMyRBwAP--4Tx1WQC_LCXaNlftjd7goGyrpQ,12027
|
57
53
|
qadence/blocks/analog.py,sha256=ymnnlSVoW1XL05ZvnnHCqRTHuOXIEY_7E9M0PNKJZy4,10812
|
58
54
|
qadence/blocks/block_to_tensor.py,sha256=Sg7YGKUoPUUHKvyB8Khztrk7UYnV5SD451_3I00n84w,17367
|
59
55
|
qadence/blocks/composite.py,sha256=f9D8L3u5Ktu_-xDBWsWiPlY8I-YW5YFgU18BtqwFHK0,8937
|
60
|
-
qadence/blocks/embedding.py,sha256=
|
56
|
+
qadence/blocks/embedding.py,sha256=MA3vRt659A828ZnH-6q7SpFdzS8Cf0oTtA2DJIDHmx4,7043
|
61
57
|
qadence/blocks/manipulate.py,sha256=kPmzej7mnWFoqTJA2CkGulT7hcPha0GGPARC8rjZltg,2387
|
62
|
-
qadence/blocks/matrix.py,sha256=
|
63
|
-
qadence/blocks/primitive.py,sha256=
|
58
|
+
qadence/blocks/matrix.py,sha256=unE8mVWBTTcmSLX4le2fHqHFu4fbGeMTK8MrGoPsVRY,4036
|
59
|
+
qadence/blocks/primitive.py,sha256=ezIx3GdO9Yc_cFjnKZSdHOL5C9BvO3K_pDJdOqfDlq0,17622
|
64
60
|
qadence/blocks/utils.py,sha256=_ggOmIesfmTtIeldUyiZrKyS5HT5i_R3ZS8ihBCw73E,17700
|
65
|
-
qadence/constructors/__init__.py,sha256=
|
66
|
-
qadence/constructors/ansatze.py,sha256=
|
61
|
+
qadence/constructors/__init__.py,sha256=HTVulUFol_RxdCI3Gn2CBKjJ6ue0ALOB6GUuibP0ONE,1000
|
62
|
+
qadence/constructors/ansatze.py,sha256=a7ZTYhfOat7fme_w_NFEUbZrMLSDMrkpu5RrablkeUU,14856
|
67
63
|
qadence/constructors/feature_maps.py,sha256=BaAxFi6fSKwjsfFjqZ8T7lyZfjotcgH2OW3b0j67YVk,8644
|
68
64
|
qadence/constructors/hamiltonians.py,sha256=u9feuuLmgQ7tX0TcP8tsbCefvBSVjkY7k4fMT5vp12Q,10054
|
69
65
|
qadence/constructors/iia.py,sha256=z-4AA9Oj-j2oZ0QDkLYNk4duS3UHY_98Qwt9VO_ZDDU,7001
|
@@ -84,56 +80,57 @@ qadence/draw/assets/dark/measurement.svg,sha256=6ALGjaCX3xZ1NqB6RW6yzOchzZV-j8uk
|
|
84
80
|
qadence/draw/assets/light/measurement.png,sha256=q6AMI7Lmb1O42sEzvSiK9ZtyTpXOGj-zIAh4FiPbhsk,278
|
85
81
|
qadence/draw/assets/light/measurement.svg,sha256=kL424wtIEU7ihxecZnthyYnvHhNW_F75daoO9pBHNiw,7282
|
86
82
|
qadence/engines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
87
|
-
qadence/engines/differentiable_backend.py,sha256=
|
83
|
+
qadence/engines/differentiable_backend.py,sha256=o9fuXapvoWB4Rr0QsQP3YRFe1Wdq-Fhww0NUvWR7oqA,5896
|
88
84
|
qadence/engines/jax/__init__.py,sha256=qcW09lcnblwRVQM6mDmW9su5kDVPe--buWCCuvPbOVM,223
|
89
|
-
qadence/engines/jax/differentiable_backend.py,sha256=
|
90
|
-
qadence/engines/jax/differentiable_expectation.py,sha256=
|
85
|
+
qadence/engines/jax/differentiable_backend.py,sha256=FcSrzzjzb0zfXC0-4mUJ6UB-wGO5RnNjQOGPAsM25zs,3076
|
86
|
+
qadence/engines/jax/differentiable_expectation.py,sha256=rn_l7IH-S4IvuAcyAIgyEuMZOIqswu5Nsfz0JffXjaE,3694
|
91
87
|
qadence/engines/torch/__init__.py,sha256=iZFdD32ot0B0CVyC-f5dVViOBnqoalxa6M9Lj4WQuPE,160
|
92
|
-
qadence/engines/torch/differentiable_backend.py,sha256=
|
93
|
-
qadence/engines/torch/differentiable_expectation.py,sha256=
|
88
|
+
qadence/engines/torch/differentiable_backend.py,sha256=uQfyGg-25MAc0soK1FyvJ2FJakRuv5_5DOy7OPiZYg8,3567
|
89
|
+
qadence/engines/torch/differentiable_expectation.py,sha256=AXb1nLG1WuJXUOH02OhRVKASXst12d1b8Y2eUMmPt5M,10304
|
94
90
|
qadence/exceptions/__init__.py,sha256=BU6vWrI9mshzr1aTPm1Ticr_o_42GjTrWI4OZXhThsI,203
|
95
91
|
qadence/exceptions/exceptions.py,sha256=4j_VJpx2sZ2Mir5BJUWu4nwb131FY1ygO4q8-XlyfRc,190
|
96
92
|
qadence/measurements/__init__.py,sha256=RIjG9tVJMqhNzyj7maZI250Um0KgHl2PizDcKJag-JU,161
|
97
93
|
qadence/measurements/protocols.py,sha256=mD50R9yPs5bIYH7Efd0BsR0503apiyrsZydi_Q6BJag,1161
|
98
94
|
qadence/measurements/samples.py,sha256=AVvszDwgfKnZ_ooATyTA3270vGeg1V3WO94jsfrTk-8,1200
|
99
|
-
qadence/measurements/shadow.py,sha256=
|
100
|
-
qadence/measurements/tomography.py,sha256=
|
101
|
-
qadence/measurements/utils.py,sha256=
|
95
|
+
qadence/measurements/shadow.py,sha256=uV0qHflf2jV_X2Rk-0v4sqH64O5RFjJic6tHHpbUnI0,12290
|
96
|
+
qadence/measurements/tomography.py,sha256=Xz_sw-Vo1LOAHFgTiUsEmIn77j__4uuJNwWZz3KmTgE,2679
|
97
|
+
qadence/measurements/utils.py,sha256=pdEs7pvLvGmMeaevNp3saKebCivCcrXSL1D-cYqPR7Y,6548
|
102
98
|
qadence/mitigations/__init__.py,sha256=RzaxYJftePFMloGhBVSixZ8fSe-ps_Jc-EyPm6xz-bs,159
|
103
|
-
qadence/mitigations/analog_zne.py,sha256=
|
104
|
-
qadence/mitigations/protocols.py,sha256=
|
105
|
-
qadence/mitigations/readout.py,sha256=
|
99
|
+
qadence/mitigations/analog_zne.py,sha256=5n1ffjGM1I5sd9TATsB90pKdDh32UTFJ-ZyOHKdM5z0,7821
|
100
|
+
qadence/mitigations/protocols.py,sha256=0TeHvlGTN8_88XNEwrjA97C5BUlrh34wYmx0w6-5Tyw,1622
|
101
|
+
qadence/mitigations/readout.py,sha256=Lj7D-1J4W8Y8xKy9ieo7AOl9R-uebpxDzJ8UMD1iBig,6472
|
106
102
|
qadence/ml_tools/__init__.py,sha256=nTXcVpfSnMBWwHjU18ASIbvqfht5TIY9Zt9Wu1DATUg,1118
|
107
103
|
qadence/ml_tools/config.py,sha256=b6pFoluE0YxrjDLG-a2ZL8Z0fZKSHoUqpySTB2lkzvg,25316
|
108
|
-
qadence/ml_tools/constructors.py,sha256=
|
104
|
+
qadence/ml_tools/constructors.py,sha256=gPfU-ICudfsByilYK-rFjax3HeTjtf_CqnR8axDy0F0,28081
|
109
105
|
qadence/ml_tools/data.py,sha256=ubwtkNvoBf0ZTGQm2M2Lgaim2tBAiAsa9VoTRR_MWks,5175
|
110
|
-
qadence/ml_tools/models.py,sha256=
|
106
|
+
qadence/ml_tools/models.py,sha256=DKSVFNC-Iq0-AmBrCZ1kqUpTBHQh_pX_1MqYT8eCG08,17045
|
111
107
|
qadence/ml_tools/optimize_step.py,sha256=L92-kNILrmwz20d_Xd_FIQw6SDGJYIEbFN3tSRz9eno,1835
|
112
108
|
qadence/ml_tools/parameters.py,sha256=gew2Kq_5-RgRpaTvs8eauVhgo0sTqqDQEV6WHFEiLGM,1301
|
113
|
-
qadence/ml_tools/printing.py,sha256=
|
109
|
+
qadence/ml_tools/printing.py,sha256=MpKU9PJYo_nPWdOeHuZToKohPZ7SJDcszhBLugkGZ60,4830
|
114
110
|
qadence/ml_tools/saveload.py,sha256=B6709ZdqHkg6kCZJmlZhCoWaNJ4ZynJe_W2IoaexLTs,5945
|
115
111
|
qadence/ml_tools/tensors.py,sha256=xZ9ZRzOqEaMgLUGWQf1najDmL6iLuN1ojCGVFs1Tm94,1337
|
116
112
|
qadence/ml_tools/train_grad.py,sha256=dJuNK8Gq1dLbK23TIeE6ynlYUoj0KQH9iPPDx7ZMNPU,14682
|
117
113
|
qadence/ml_tools/train_no_grad.py,sha256=jUjnsxvWMrAa-7NV1bewpAo6mV9grF02gwBHy0SVTws,7249
|
118
114
|
qadence/ml_tools/utils.py,sha256=PW8FyoV0mG_DtN1U8njTDV5qxZ0EK4mnFwMAsLBArfk,1410
|
119
|
-
qadence/noise/__init__.py,sha256=
|
120
|
-
qadence/noise/protocols.py,sha256
|
115
|
+
qadence/noise/__init__.py,sha256=_24vp6Busn4LGby_aGzriPpagV8yImOiB95GXuANF1w,205
|
116
|
+
qadence/noise/protocols.py,sha256=BZUDjQI76-aej2f7t0XPBmwph74VifzHIkTPgA1pmgU,9629
|
121
117
|
qadence/noise/readout.py,sha256=UpUdxaGu09SmqKXn0O7RYfF7b7UcRZiNMfDlpY0weV0,6726
|
122
118
|
qadence/operations/__init__.py,sha256=HAAo9VZUTq2H7kcEarChTgTWCIq7LT25-xBxkwE0F9c,1922
|
123
119
|
qadence/operations/analog.py,sha256=v11DSrg-XUbwIAWAWM43y3VQbYKsx2ynx-HimUoC-x0,7435
|
124
|
-
qadence/operations/control_ops.py,sha256=
|
125
|
-
qadence/operations/ham_evo.py,sha256=
|
126
|
-
qadence/operations/parametric.py,sha256=
|
127
|
-
qadence/operations/primitive.py,sha256=
|
128
|
-
qadence/transpile/__init__.py,sha256=
|
120
|
+
qadence/operations/control_ops.py,sha256=2ABP8fuf2mpJqRooDiBd2p-J-AL1yx3NDRF2TZf3K-c,10253
|
121
|
+
qadence/operations/ham_evo.py,sha256=tomOxTX6htgk23tvSno07_by3WThwBSyaNfnVbR6lA8,7850
|
122
|
+
qadence/operations/parametric.py,sha256=kV5d-diaQAoRlqKqoo0CGCbPej6eAxHQXniqfFKff3g,5394
|
123
|
+
qadence/operations/primitive.py,sha256=hDuwWndfPWqchM_98mOMf40qpkuPuwh39DIwHAbzGRo,9944
|
124
|
+
qadence/transpile/__init__.py,sha256=JrrQ4Osc4nNRWWjRGmVn57fWc8WwF92MokhKLRZ1vVA,499
|
129
125
|
qadence/transpile/apply_fn.py,sha256=glZo2_wMOjw7_KgWKYbqg8j-9SDs-RefWIfxWgdQK8I,1336
|
130
126
|
qadence/transpile/block.py,sha256=jV-EyatrwwdL2ahjF3wyEhC3PKMBPLaL5sQN1VNFc_w,11582
|
131
127
|
qadence/transpile/circuit.py,sha256=KTh6Gv1czZddFuA1JhNNszheZbwViVixiGh4rGvIgTM,451
|
132
128
|
qadence/transpile/digitalize.py,sha256=iWRwYAYQsD2INHj0HNbGJriv_3fRCuBW1nDBrwtKSuI,1523
|
133
129
|
qadence/transpile/flatten.py,sha256=EdhSG5WyF56nbnxINNLqrHgY84MRM1YFjT3fR4aph5Q,3427
|
134
130
|
qadence/transpile/invert.py,sha256=KAefHTG2AWr39aengVhXrzCtJPhrZC-ZnL6vYvmbnY0,4867
|
131
|
+
qadence/transpile/noise.py,sha256=-gb72Ko-w5nhm3FmJAh73XlUe0Q9ckYIme6sBXwxYF0,1448
|
135
132
|
qadence/transpile/transpile.py,sha256=6MRRkk1OS279L1fwUQjazA6qlfpbd-T_EJMKT8hAhOU,2721
|
136
|
-
qadence-1.
|
137
|
-
qadence-1.
|
138
|
-
qadence-1.
|
139
|
-
qadence-1.
|
133
|
+
qadence-1.8.0.dist-info/METADATA,sha256=BQNMO785SPR2sZNiYPrXEOZHvO6eaCHDFUMh2-ZhF2g,9864
|
134
|
+
qadence-1.8.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
|
135
|
+
qadence-1.8.0.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
136
|
+
qadence-1.8.0.dist-info/RECORD,,
|
@@ -1,234 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
from collections import Counter
|
4
|
-
from dataclasses import dataclass, field
|
5
|
-
from logging import getLogger
|
6
|
-
from typing import Any
|
7
|
-
|
8
|
-
import numpy as np
|
9
|
-
import torch
|
10
|
-
from braket.circuits import Circuit as BraketCircuit
|
11
|
-
from braket.devices import LocalSimulator
|
12
|
-
from torch import Tensor
|
13
|
-
|
14
|
-
from qadence.backend import Backend as BackendInterface
|
15
|
-
from qadence.backend import ConvertedCircuit, ConvertedObservable
|
16
|
-
from qadence.backends.utils import to_list_of_dicts
|
17
|
-
from qadence.blocks import AbstractBlock, block_to_tensor
|
18
|
-
from qadence.circuit import QuantumCircuit
|
19
|
-
from qadence.measurements import Measurements
|
20
|
-
from qadence.mitigations import Mitigations
|
21
|
-
from qadence.mitigations.protocols import apply_mitigation
|
22
|
-
from qadence.noise import Noise
|
23
|
-
from qadence.noise.protocols import apply_noise
|
24
|
-
from qadence.overlap import overlap_exact
|
25
|
-
from qadence.transpile import transpile
|
26
|
-
from qadence.types import BackendName, Engine
|
27
|
-
from qadence.utils import Endianness
|
28
|
-
|
29
|
-
from .config import Configuration, default_passes
|
30
|
-
from .convert_ops import convert_block
|
31
|
-
|
32
|
-
logger = getLogger(__name__)
|
33
|
-
|
34
|
-
|
35
|
-
def promote_parameters(parameters: dict[str, Tensor | float]) -> dict[str, float]:
|
36
|
-
float_params = {}
|
37
|
-
for name, value in parameters.items():
|
38
|
-
try:
|
39
|
-
v = value if isinstance(value, float) else value.item()
|
40
|
-
float_params[name] = v
|
41
|
-
except ValueError:
|
42
|
-
raise ValueError("Currently batching is not supported with Braket digital")
|
43
|
-
return float_params
|
44
|
-
|
45
|
-
|
46
|
-
@dataclass(frozen=True, eq=True)
|
47
|
-
class Backend(BackendInterface):
|
48
|
-
name: BackendName = BackendName.BRAKET
|
49
|
-
supports_ad: bool = False
|
50
|
-
supports_adjoint: bool = False
|
51
|
-
# TODO Use native braket adjoint differentiation.
|
52
|
-
support_bp: bool = False
|
53
|
-
is_remote: bool = False
|
54
|
-
with_measurements: bool = True
|
55
|
-
with_noise: bool = False
|
56
|
-
native_endianness: Endianness = Endianness.BIG
|
57
|
-
config: Configuration = field(default_factory=Configuration)
|
58
|
-
engine: Engine = Engine.TORCH
|
59
|
-
logger.debug("Initialised")
|
60
|
-
|
61
|
-
# braket specifics
|
62
|
-
# TODO: include it in the configuration?
|
63
|
-
_device: LocalSimulator = field(default_factory=LocalSimulator)
|
64
|
-
|
65
|
-
def __post_init__(self) -> None:
|
66
|
-
if self.is_remote:
|
67
|
-
raise NotImplementedError("Braket backend does not support cloud execution yet")
|
68
|
-
|
69
|
-
def circuit(self, circuit: QuantumCircuit) -> ConvertedCircuit:
|
70
|
-
passes = self.config.transpilation_passes
|
71
|
-
if passes is None:
|
72
|
-
passes = default_passes
|
73
|
-
|
74
|
-
original_circ = circuit
|
75
|
-
if len(passes) > 0:
|
76
|
-
circuit = transpile(*passes)(circuit)
|
77
|
-
|
78
|
-
native = BraketCircuit(convert_block(circuit.block))
|
79
|
-
return ConvertedCircuit(native=native, abstract=circuit, original=original_circ)
|
80
|
-
|
81
|
-
def observable(self, obs: AbstractBlock, n_qubits: int = None) -> Any:
|
82
|
-
if n_qubits is None:
|
83
|
-
n_qubits = obs.n_qubits
|
84
|
-
native = block_to_tensor(
|
85
|
-
block=obs,
|
86
|
-
values={},
|
87
|
-
qubit_support=tuple([i for i in range(n_qubits)]),
|
88
|
-
endianness=Endianness.BIG,
|
89
|
-
).squeeze(0)
|
90
|
-
return ConvertedObservable(native=native, abstract=obs, original=obs)
|
91
|
-
|
92
|
-
def run(
|
93
|
-
self,
|
94
|
-
circuit: ConvertedCircuit,
|
95
|
-
param_values: dict[str, Tensor] = {},
|
96
|
-
state: Tensor | None = None,
|
97
|
-
endianness: Endianness = Endianness.BIG,
|
98
|
-
) -> Tensor:
|
99
|
-
"""
|
100
|
-
Execute the circuit and return a wavefunction in form of a statevector.
|
101
|
-
|
102
|
-
Arguments:
|
103
|
-
circuit: The circuit that is executed.
|
104
|
-
param_values: Parameters of the circuit (after calling the embedding
|
105
|
-
function on the user-facing parameters).
|
106
|
-
state: Initial state.
|
107
|
-
endianness: The endianness of the wave function.
|
108
|
-
"""
|
109
|
-
|
110
|
-
if state is not None:
|
111
|
-
raise NotImplementedError
|
112
|
-
|
113
|
-
if self.is_remote:
|
114
|
-
# handle here, or different backends?
|
115
|
-
raise NotImplementedError
|
116
|
-
|
117
|
-
# loop over all values in the batch
|
118
|
-
results = []
|
119
|
-
for vals in to_list_of_dicts(param_values):
|
120
|
-
final_circuit = self.assign_parameters(circuit, vals)
|
121
|
-
|
122
|
-
final_circuit.state_vector() # set simulation type
|
123
|
-
task = self._device.run(final_circuit, 0)
|
124
|
-
results.append(task.result().values[0])
|
125
|
-
states = torch.tensor(np.array(results))
|
126
|
-
|
127
|
-
n_qubits = circuit.abstract.n_qubits
|
128
|
-
if endianness != self.native_endianness and n_qubits > 1:
|
129
|
-
from qadence.transpile import invert_endianness
|
130
|
-
|
131
|
-
states = invert_endianness(states)
|
132
|
-
return states
|
133
|
-
|
134
|
-
def sample(
|
135
|
-
self,
|
136
|
-
circuit: ConvertedCircuit,
|
137
|
-
param_values: dict[str, Tensor] = {},
|
138
|
-
n_shots: int = 1,
|
139
|
-
state: Tensor | None = None,
|
140
|
-
noise: Noise | None = None,
|
141
|
-
mitigation: Mitigations | None = None,
|
142
|
-
endianness: Endianness = Endianness.BIG,
|
143
|
-
) -> list[Counter]:
|
144
|
-
"""Execute the circuit and return samples of the resulting wavefunction."""
|
145
|
-
if state is not None:
|
146
|
-
raise NotImplementedError("Braket cannot handle a custom initial state.")
|
147
|
-
|
148
|
-
if n_shots < 1:
|
149
|
-
raise ValueError("You can only call sample with n_shots>0.")
|
150
|
-
|
151
|
-
if self.is_remote:
|
152
|
-
# handle here, or different backends?
|
153
|
-
raise NotImplementedError
|
154
|
-
|
155
|
-
# loop over all values in the batch
|
156
|
-
|
157
|
-
samples = []
|
158
|
-
for vals in to_list_of_dicts(param_values):
|
159
|
-
final_circuit = self.assign_parameters(circuit, vals)
|
160
|
-
task = self._device.run(final_circuit, n_shots)
|
161
|
-
samples.append(task.result().measurement_counts)
|
162
|
-
if endianness != self.native_endianness:
|
163
|
-
from qadence.transpile import invert_endianness
|
164
|
-
|
165
|
-
samples = invert_endianness(samples)
|
166
|
-
if noise is not None:
|
167
|
-
samples = apply_noise(noise=noise, samples=samples)
|
168
|
-
if mitigation is not None:
|
169
|
-
logger.warning(
|
170
|
-
"Mitigation protocol is deprecated. Use qadence-protocols instead.",
|
171
|
-
)
|
172
|
-
assert noise
|
173
|
-
samples = apply_mitigation(noise=noise, mitigation=mitigation, samples=samples)
|
174
|
-
return samples
|
175
|
-
|
176
|
-
def expectation(
|
177
|
-
self,
|
178
|
-
circuit: ConvertedCircuit,
|
179
|
-
observable: list[ConvertedObservable] | ConvertedObservable,
|
180
|
-
param_values: dict[str, Tensor] = {},
|
181
|
-
state: Tensor | None = None,
|
182
|
-
measurement: Measurements | None = None,
|
183
|
-
noise: Noise | None = None,
|
184
|
-
mitigation: Mitigations | None = None,
|
185
|
-
endianness: Endianness = Endianness.BIG,
|
186
|
-
) -> Tensor:
|
187
|
-
# Noise is ignored if measurement protocol is not provided.
|
188
|
-
if noise is not None and measurement is None:
|
189
|
-
logger.warning(
|
190
|
-
f"Errors of type {noise} are not implemented for exact expectation yet. "
|
191
|
-
"This is ignored for now."
|
192
|
-
)
|
193
|
-
# Do not flip endianness here because then we would have to reverse the observable
|
194
|
-
wfs = self.run(circuit, param_values, state=state, endianness=Endianness.BIG)
|
195
|
-
|
196
|
-
# TODO: Handle batching
|
197
|
-
res = []
|
198
|
-
observable = observable if isinstance(observable, list) else [observable]
|
199
|
-
for wf in wfs:
|
200
|
-
res.append([torch.vdot(wf, obs.native @ wf).real for obs in observable])
|
201
|
-
|
202
|
-
return torch.tensor(res)
|
203
|
-
|
204
|
-
def assign_parameters(
|
205
|
-
self, circuit: ConvertedCircuit, param_values: dict[str, Tensor | float]
|
206
|
-
) -> BraketCircuit:
|
207
|
-
"""Assign numerical values to the circuit parameters."""
|
208
|
-
if param_values is None:
|
209
|
-
return circuit.native()
|
210
|
-
|
211
|
-
params_copy = param_values.copy()
|
212
|
-
pnames = [p.name for p in circuit.native.parameters]
|
213
|
-
|
214
|
-
# account for fixed parameters
|
215
|
-
for name in param_values.keys():
|
216
|
-
if name not in pnames:
|
217
|
-
params_copy.pop(name)
|
218
|
-
|
219
|
-
# make sure that all the parameters are single floats
|
220
|
-
# otherwise it won't be accepted by Braket
|
221
|
-
native_params = promote_parameters(params_copy)
|
222
|
-
|
223
|
-
# assign the parameters to the circuit
|
224
|
-
assigned_circuit = circuit.native(**native_params)
|
225
|
-
|
226
|
-
return assigned_circuit
|
227
|
-
|
228
|
-
@staticmethod
|
229
|
-
def _overlap(bras: Tensor, kets: Tensor) -> Tensor:
|
230
|
-
return overlap_exact(bras, kets)
|
231
|
-
|
232
|
-
@staticmethod
|
233
|
-
def default_configuration() -> Configuration:
|
234
|
-
return Configuration()
|
@@ -1,22 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
from dataclasses import dataclass, field
|
4
|
-
from logging import getLogger
|
5
|
-
from typing import Callable
|
6
|
-
|
7
|
-
from qadence.backend import BackendConfiguration
|
8
|
-
from qadence.transpile import digitalize, fill_identities
|
9
|
-
|
10
|
-
logger = getLogger(__name__)
|
11
|
-
|
12
|
-
default_passes: list[Callable] = [fill_identities, digitalize]
|
13
|
-
|
14
|
-
|
15
|
-
@dataclass
|
16
|
-
class Configuration(BackendConfiguration):
|
17
|
-
# FIXME: currently not used
|
18
|
-
cloud_credentials: dict = field(default_factory=dict)
|
19
|
-
"""Credentials for connecting to the cloud.
|
20
|
-
|
21
|
-
Execution on the QPUs available on Amazon Braket.
|
22
|
-
"""
|
@@ -1,116 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
from itertools import chain as flatten
|
4
|
-
from typing import Callable, Dict, List
|
5
|
-
|
6
|
-
from braket.circuits.gates import (
|
7
|
-
CZ,
|
8
|
-
CNot,
|
9
|
-
CPhaseShift,
|
10
|
-
CSwap,
|
11
|
-
H,
|
12
|
-
I,
|
13
|
-
Rx,
|
14
|
-
Ry,
|
15
|
-
Rz,
|
16
|
-
S,
|
17
|
-
Swap,
|
18
|
-
T,
|
19
|
-
X,
|
20
|
-
Y,
|
21
|
-
Z,
|
22
|
-
)
|
23
|
-
from braket.circuits.instruction import Instruction
|
24
|
-
from braket.parametric import FreeParameter
|
25
|
-
|
26
|
-
from qadence.blocks import AbstractBlock, CompositeBlock, PrimitiveBlock
|
27
|
-
from qadence.exceptions import NotSupportedError
|
28
|
-
from qadence.parameters import evaluate
|
29
|
-
from qadence.types import OpName
|
30
|
-
|
31
|
-
single_qubit: Dict[str, Callable] = {
|
32
|
-
OpName.I: I.i,
|
33
|
-
OpName.H: H.h,
|
34
|
-
OpName.X: X.x,
|
35
|
-
OpName.Y: Y.y,
|
36
|
-
OpName.Z: Z.z,
|
37
|
-
OpName.S: S.s,
|
38
|
-
OpName.T: T.t,
|
39
|
-
}
|
40
|
-
single_qubit_parameterized: Dict[str, Callable] = {
|
41
|
-
OpName.RX: Rx.rx,
|
42
|
-
OpName.RY: Ry.ry,
|
43
|
-
OpName.RZ: Rz.rz,
|
44
|
-
}
|
45
|
-
two_qubit: Dict[str, Callable] = {OpName.CNOT: CNot.cnot, OpName.SWAP: Swap.swap, OpName.CZ: CZ.cz}
|
46
|
-
three_qubit: Dict[str, Callable] = {OpName.CSWAP: CSwap.cswap}
|
47
|
-
two_qubit_parametrized: Dict[str, Callable] = {
|
48
|
-
OpName.CPHASE: CPhaseShift.cphaseshift,
|
49
|
-
}
|
50
|
-
|
51
|
-
ops_map = {
|
52
|
-
**single_qubit,
|
53
|
-
**single_qubit_parameterized,
|
54
|
-
**two_qubit,
|
55
|
-
**two_qubit_parametrized,
|
56
|
-
**three_qubit,
|
57
|
-
}
|
58
|
-
|
59
|
-
supported_gates = list(ops_map.keys())
|
60
|
-
|
61
|
-
|
62
|
-
def BraketOperation(block: PrimitiveBlock) -> Instruction:
|
63
|
-
operation = block.name
|
64
|
-
|
65
|
-
if operation in single_qubit:
|
66
|
-
return single_qubit[operation](target=block.qubit_support)
|
67
|
-
|
68
|
-
elif operation in single_qubit_parameterized:
|
69
|
-
((uuid, expr),) = block.parameters.items() # type: ignore [attr-defined]
|
70
|
-
if expr.is_number:
|
71
|
-
return single_qubit_parameterized[operation](
|
72
|
-
target=block.qubit_support, angle=evaluate(expr) # type: ignore
|
73
|
-
)
|
74
|
-
else:
|
75
|
-
return single_qubit_parameterized[operation](
|
76
|
-
target=block.qubit_support,
|
77
|
-
angle=FreeParameter(uuid), # type: ignore
|
78
|
-
)
|
79
|
-
|
80
|
-
elif operation in two_qubit:
|
81
|
-
return two_qubit[operation](block.qubit_support[0], block.qubit_support[1])
|
82
|
-
|
83
|
-
elif operation in two_qubit_parametrized:
|
84
|
-
((uuid, expr),) = block.parameters.items() # type: ignore [attr-defined]
|
85
|
-
if expr.is_number:
|
86
|
-
return two_qubit_parametrized[operation](
|
87
|
-
control=block.qubit_support[0],
|
88
|
-
target=block.qubit_support[1],
|
89
|
-
angle=evaluate(expr),
|
90
|
-
)
|
91
|
-
else:
|
92
|
-
return two_qubit_parametrized[operation](
|
93
|
-
control=block.qubit_support[0],
|
94
|
-
target=block.qubit_support[1],
|
95
|
-
angle=FreeParameter(uuid),
|
96
|
-
)
|
97
|
-
elif operation in three_qubit:
|
98
|
-
return three_qubit[operation](
|
99
|
-
block.qubit_support[0], block.qubit_support[1], block.qubit_support[2]
|
100
|
-
)
|
101
|
-
else:
|
102
|
-
raise NotSupportedError(
|
103
|
-
"Operation type {} is not supported for Braket backend.".format(type(block))
|
104
|
-
)
|
105
|
-
|
106
|
-
|
107
|
-
def convert_block(block: AbstractBlock) -> List[Instruction]:
|
108
|
-
if isinstance(block, PrimitiveBlock):
|
109
|
-
ops = [BraketOperation(block=block)]
|
110
|
-
elif isinstance(block, CompositeBlock):
|
111
|
-
ops = list(flatten(convert_block(b) for b in block.blocks))
|
112
|
-
else:
|
113
|
-
raise NotSupportedError(
|
114
|
-
"Operation type {} is not supported for Braket backend.".format(type(block))
|
115
|
-
)
|
116
|
-
return ops
|
File without changes
|
File without changes
|