tequila-basic 1.9.8__tar.gz → 1.9.9__tar.gz
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.
- {tequila_basic-1.9.8/src/tequila_basic.egg-info → tequila_basic-1.9.9}/PKG-INFO +11 -2
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/circuit/circuit.py +20 -15
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/objective/objective.py +5 -2
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/chemistry_tools.py +8 -1
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/orbital_optimizer.py +2 -1
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_api.py +12 -2
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_base.py +23 -16
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_qiskit.py +5 -7
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_qulacs.py +13 -9
- tequila_basic-1.9.9/src/tequila/simulators/simulator_spex.py +429 -0
- tequila_basic-1.9.9/src/tequila/simulators/test_spex_simulator.py +211 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/utils/bitstrings.py +6 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/version.py +1 -1
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/wavefunction/qubit_wavefunction.py +5 -2
- {tequila_basic-1.9.8 → tequila_basic-1.9.9/src/tequila_basic.egg-info}/PKG-INFO +11 -2
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila_basic.egg-info/SOURCES.txt +2 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_chemistry.py +1 -1
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_gradient.py +1 -1
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_simulator_backends.py +13 -2
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/LICENSE +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/MANIFEST.in +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/README.md +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/requirements.txt +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/setup.cfg +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/setup.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/__init__.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/apps/__init__.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/apps/_unary_state_prep_impl.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/apps/adapt/__init__.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/apps/adapt/adapt.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/apps/krylov/__init__.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/apps/krylov/krylov.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/apps/robustness/__init__.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/apps/robustness/helpers.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/apps/robustness/interval.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/apps/unary_state_prep.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/autograd_imports.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/circuit/__init__.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/circuit/_gates_impl.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/circuit/compiler.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/circuit/gates.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/circuit/gradient.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/circuit/noise.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/circuit/pyzx.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/circuit/qasm.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/circuit/qpic.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/grouping/__init__.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/grouping/binary_rep.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/grouping/binary_utils.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/grouping/compile_groups.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/grouping/ev_utils.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/grouping/fermionic_functions.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/grouping/fermionic_methods.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/grouping/overlapping_methods.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/hamiltonian/__init__.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/hamiltonian/paulis.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/hamiltonian/paulistring.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/hamiltonian/qubit_hamiltonian.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/ml/__init__.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/ml/interface_torch.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/ml/ml_api.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/ml/utils_ml.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/objective/__init__.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/objective/braket.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/objective/qtensor.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/optimizers/__init__.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/optimizers/_containers.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/optimizers/optimizer_base.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/optimizers/optimizer_gd.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/optimizers/optimizer_gpyopt.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/optimizers/optimizer_scipy.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/__init__.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/encodings.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/madness_interface.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/psi4_interface.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/pyscf_interface.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/qc_base.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/__init__.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_cirq.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_pyquil.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_qibo.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_qiskit_gpu.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_qlm.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_qulacs_gpu.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_symbolic.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/tools/__init__.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/tools/convenience.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/tools/qng.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/tools/random_generators.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/utils/__init__.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/utils/exceptions.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/utils/joined_transformation.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/utils/keymap.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/utils/misc.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/wavefunction/__init__.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila_basic.egg-info/dependency_links.txt +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila_basic.egg-info/requires.txt +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila_basic.egg-info/top_level.txt +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_TrotErr.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_adapt.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_array.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_binary_pauli.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_binary_utils.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_bitstrings.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_braket.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_chemistry_f12.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_chemistry_madness.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_circuits.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_fermionic_meas.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_gd_optimizer.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_gpyopt.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_hamiltonian_arithmetic.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_krylov.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_mappings.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_noise.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_noise_opt.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_objectives.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_pyzx.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_qasm.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_qtensor.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_recompilation_routines.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_scipy.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_symbolic_simulator.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_torch_interface.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_unary_state_prep.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_variable.py +0 -0
- {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_zzz_cleanup.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: tequila-basic
|
3
|
-
Version: 1.9.
|
3
|
+
Version: 1.9.9
|
4
4
|
Summary: A High-Level Abstraction Framework for Quantum Algorithms
|
5
5
|
Home-page: https://github.com/tequilahub/tequila
|
6
6
|
Author: Tequila Developers
|
@@ -15,6 +15,15 @@ Requires-Dist: setuptools
|
|
15
15
|
Requires-Dist: pytest
|
16
16
|
Requires-Dist: openfermion~=1.0
|
17
17
|
Requires-Dist: dataclasses; python_version < "3.7"
|
18
|
+
Dynamic: author
|
19
|
+
Dynamic: author-email
|
20
|
+
Dynamic: description
|
21
|
+
Dynamic: description-content-type
|
22
|
+
Dynamic: home-page
|
23
|
+
Dynamic: license-file
|
24
|
+
Dynamic: provides-extra
|
25
|
+
Dynamic: requires-dist
|
26
|
+
Dynamic: summary
|
18
27
|
|
19
28
|
[](LICENCE) [](https://zenodo.org/badge/latestdoi/259718912) [](https://badge.fury.io/py/tequila-basic) 
|
20
29
|
|
@@ -9,6 +9,7 @@ import warnings
|
|
9
9
|
|
10
10
|
from .qpic import export_to
|
11
11
|
|
12
|
+
|
12
13
|
class QCircuit():
|
13
14
|
"""
|
14
15
|
Fundamental class representing an abstract circuit.
|
@@ -254,8 +255,8 @@ class QCircuit():
|
|
254
255
|
the gates to add at the corresponding positions
|
255
256
|
replace: list of bool: (Default value: None)
|
256
257
|
Default is None which corresponds to all true
|
257
|
-
decide if gates shall be
|
258
|
-
if replace[i] = true: gate at position [i] will be
|
258
|
+
decide if gates shall be replaced or if the new parts shall be inserted without replacement
|
259
|
+
if replace[i] = true: gate at position [i] will be replaced by gates[i]
|
259
260
|
if replace[i] = false: gates[i] circuit will be inserted at position [i] (beaming before gate previously at position [i])
|
260
261
|
Returns
|
261
262
|
-------
|
@@ -271,8 +272,9 @@ class QCircuit():
|
|
271
272
|
dataset = zip(positions, circuits, replace)
|
272
273
|
dataset = sorted(dataset, key=lambda x: x[0])
|
273
274
|
|
274
|
-
|
275
|
-
|
275
|
+
new_gatelist = []
|
276
|
+
last_idx = -1
|
277
|
+
|
276
278
|
for idx, circuit, do_replace in dataset:
|
277
279
|
|
278
280
|
# failsafe
|
@@ -283,13 +285,14 @@ class QCircuit():
|
|
283
285
|
else:
|
284
286
|
gatelist = [circuit]
|
285
287
|
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
288
|
+
new_gatelist += self.gates[last_idx + 1:idx]
|
289
|
+
new_gatelist += gatelist
|
290
|
+
if not do_replace:
|
291
|
+
new_gatelist.append(self.gates[idx])
|
292
|
+
|
293
|
+
last_idx = idx
|
294
|
+
|
295
|
+
new_gatelist += self.gates[last_idx + 1:]
|
293
296
|
|
294
297
|
result = QCircuit(gates=new_gatelist)
|
295
298
|
result.n_qubits = max(result.n_qubits, self.n_qubits)
|
@@ -386,7 +389,7 @@ class QCircuit():
|
|
386
389
|
for k, v in other._parameter_map.items():
|
387
390
|
self._parameter_map[k] += [(x[0] + offset, x[1]) for x in v]
|
388
391
|
|
389
|
-
self._gates +=
|
392
|
+
self._gates += other.gates
|
390
393
|
self._min_n_qubits = max(self._min_n_qubits, other._min_n_qubits)
|
391
394
|
|
392
395
|
return self
|
@@ -593,7 +596,7 @@ class QCircuit():
|
|
593
596
|
|
594
597
|
This is an in-place method, so it mutates self and doesn't return any value.
|
595
598
|
|
596
|
-
Raise TequilaWarning if there any qubits in common between self and control.
|
599
|
+
Raise TequilaWarning if there are any qubits in common between self and control.
|
597
600
|
"""
|
598
601
|
gates = self.gates
|
599
602
|
control = list_assignment(control)
|
@@ -610,8 +613,10 @@ class QCircuit():
|
|
610
613
|
if len(control_lst) < len(gate.control) + len(control):
|
611
614
|
# warnings.warn("Some of the controls {} were already included in the control "
|
612
615
|
# "of a gate {}.".format(control, gate), TequilaWarning)
|
613
|
-
raise TequilaWarning(f
|
614
|
-
f
|
616
|
+
raise TequilaWarning(f"Some of the controls {control} were already included "
|
617
|
+
f"in the control of a gate {gate}. "
|
618
|
+
f"This might be because the same instance of a gate is used in multiple places, "
|
619
|
+
f"e.g. because the same circuit was appended twice.")
|
615
620
|
else:
|
616
621
|
control_lst, not_control = list(control), list()
|
617
622
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import typing, copy, numbers
|
2
|
+
from typing import Union
|
2
3
|
from tequila.grouping.compile_groups import compile_commuting_parts
|
3
4
|
from tequila import TequilaException
|
4
5
|
from tequila.utils import JoinedTransformation
|
@@ -545,7 +546,7 @@ class Objective:
|
|
545
546
|
"variables = {}\n" \
|
546
547
|
"types = {}".format(unique, measurements, variables, types)
|
547
548
|
|
548
|
-
def __call__(self, variables=None, *args, **kwargs):
|
549
|
+
def __call__(self, variables=None, initial_state = 0, *args, **kwargs):
|
549
550
|
"""
|
550
551
|
Return the output of the calculation the objective represents.
|
551
552
|
|
@@ -553,6 +554,8 @@ class Objective:
|
|
553
554
|
----------
|
554
555
|
variables: dict:
|
555
556
|
dictionary instantiating all variables that may appear within the objective.
|
557
|
+
initial_state: int or QubitWaveFunction:
|
558
|
+
the initial state of the circuit
|
556
559
|
args
|
557
560
|
kwargs
|
558
561
|
|
@@ -579,7 +582,7 @@ class Objective:
|
|
579
582
|
ev_array = []
|
580
583
|
for E in self.args:
|
581
584
|
if E not in evaluated: #
|
582
|
-
expval_result = E(variables=variables, *args, **kwargs)
|
585
|
+
expval_result = E(variables=variables, initial_state=initial_state, *args, **kwargs)
|
583
586
|
evaluated[E] = expval_result
|
584
587
|
else:
|
585
588
|
expval_result = evaluated[E]
|
@@ -442,7 +442,14 @@ class ParametersQC:
|
|
442
442
|
for i in range(natoms):
|
443
443
|
coord += content[2 + i]
|
444
444
|
return coord, comment
|
445
|
-
|
445
|
+
def get_xyz(self)->str:
|
446
|
+
geom = self.parameters.get_geometry()
|
447
|
+
f = ''
|
448
|
+
f += f'{len(geom)}\n'
|
449
|
+
f += f'{self.parameters.name}\n'
|
450
|
+
for at in geom:
|
451
|
+
f += f'{at[0]} {at[1][0]} {at[1][1]} {at[1][2]}\n'
|
452
|
+
return f
|
446
453
|
|
447
454
|
@dataclass
|
448
455
|
class ClosedShellAmplitudes:
|
{tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/orbital_optimizer.py
RENAMED
@@ -217,7 +217,8 @@ class PySCFVQEWrapper:
|
|
217
217
|
vqe_solver_arguments = self.vqe_solver_arguments
|
218
218
|
result = self.vqe_solver(H=H, circuit=self.circuit, molecule=molecule, **vqe_solver_arguments)
|
219
219
|
if hasattr(self.vqe_solver, "compute_rdms"):
|
220
|
-
rdm1,
|
220
|
+
rdm1,rdm2 = self.vqe_solver.compute_rdms(U=self.circuit, variables=result.variables, molecule=molecule, use_hcb=restrict_to_hcb)
|
221
|
+
rdm2 = self.reorder(rdm2, 'dirac', 'mulliken')
|
221
222
|
elif self.circuit is None:
|
222
223
|
raise Exception("Orbital Optimizer: Either provide a callable vqe_solver or a circuit")
|
223
224
|
else:
|
@@ -11,8 +11,9 @@ from tequila.simulators.simulator_base import BackendCircuit, BackendExpectation
|
|
11
11
|
from tequila.circuit.noise import NoiseModel
|
12
12
|
from tequila.wavefunction.qubit_wavefunction import QubitWaveFunction
|
13
13
|
|
14
|
-
SUPPORTED_BACKENDS = ["qulacs", "qulacs_gpu", "qibo", "qiskit", "qiskit_gpu", "cirq", "pyquil", "symbolic", "qlm"]
|
15
|
-
|
14
|
+
SUPPORTED_BACKENDS = ["qulacs", "qulacs_gpu", "qibo", "qiskit", "qiskit_gpu", "cirq", "pyquil", "symbolic", "qlm", "spex"]
|
15
|
+
# TODO: Reenable noise for Qiskit
|
16
|
+
SUPPORTED_NOISE_BACKENDS = ["cirq", "pyquil"] # qulacs removed in v.1.9
|
16
17
|
BackendTypes = namedtuple('BackendTypes', 'CircType ExpValueType')
|
17
18
|
INSTALLED_SIMULATORS = {}
|
18
19
|
INSTALLED_SAMPLERS = {}
|
@@ -30,6 +31,15 @@ We are distinguishing two classes of simulators: Samplers and full wavefunction
|
|
30
31
|
"""
|
31
32
|
|
32
33
|
|
34
|
+
HAS_SPEX = True
|
35
|
+
try:
|
36
|
+
from tequila.simulators.simulator_spex import BackendCircuitSpex, BackendExpectationValueSpex
|
37
|
+
|
38
|
+
INSTALLED_SIMULATORS["spex"] = BackendTypes(BackendCircuitSpex, BackendExpectationValueSpex)
|
39
|
+
except ImportError:
|
40
|
+
HAS_SPEX = False
|
41
|
+
|
42
|
+
|
33
43
|
HAS_QISKIT = True
|
34
44
|
try:
|
35
45
|
from tequila.simulators.simulator_qiskit import BackendCircuitQiskit, BackendExpectationValueQiskit
|
@@ -431,7 +431,8 @@ class BackendCircuit():
|
|
431
431
|
return self.do_sample(samples=samples, circuit=circuit, read_out_qubits=read_out_qubits,
|
432
432
|
initial_state=initial_state, *args, **kwargs)
|
433
433
|
|
434
|
-
def sample_all_z_hamiltonian(self, samples: int, hamiltonian, variables,
|
434
|
+
def sample_all_z_hamiltonian(self, samples: int, hamiltonian, variables,
|
435
|
+
initial_state: Union[int, QubitWaveFunction] = 0, *args, **kwargs):
|
435
436
|
"""
|
436
437
|
Sample from a Hamiltonian which only consists of Pauli-Z and unit operators
|
437
438
|
Parameters
|
@@ -440,6 +441,8 @@ class BackendCircuit():
|
|
440
441
|
number of samples to take
|
441
442
|
hamiltonian
|
442
443
|
the tequila hamiltonian
|
444
|
+
initial_state
|
445
|
+
the initial state of the circuit
|
443
446
|
args
|
444
447
|
arguments for do_sample
|
445
448
|
kwargs
|
@@ -458,7 +461,7 @@ class BackendCircuit():
|
|
458
461
|
self.n_qubits))
|
459
462
|
|
460
463
|
# run simulators
|
461
|
-
counts = self.sample(samples=samples, read_out_qubits=abstract_qubits_H, variables=variables, *args, **kwargs)
|
464
|
+
counts = self.sample(samples=samples, read_out_qubits=abstract_qubits_H, variables=variables, initial_state=initial_state, *args, **kwargs)
|
462
465
|
read_out_map = {q: i for i, q in enumerate(abstract_qubits_H)}
|
463
466
|
|
464
467
|
# compute energy
|
@@ -481,8 +484,8 @@ class BackendCircuit():
|
|
481
484
|
assert n_samples == samples
|
482
485
|
return E
|
483
486
|
|
484
|
-
def sample_paulistring(self, samples: int, paulistring, variables,
|
485
|
-
**kwargs) -> numbers.Real:
|
487
|
+
def sample_paulistring(self, samples: int, paulistring, variables, initial_state: Union[int, QubitWaveFunction] = 0,
|
488
|
+
*args, **kwargs) -> numbers.Real:
|
486
489
|
"""
|
487
490
|
Sample an individual pauli word (pauli string) and return the average result thereof.
|
488
491
|
Parameters
|
@@ -520,8 +523,8 @@ class BackendCircuit():
|
|
520
523
|
# on construction: tq.ExpectationValue(H=H, U=U, optimize_measurements=True)
|
521
524
|
circuit = self.create_circuit(circuit=copy.deepcopy(self.circuit), abstract_circuit=basis_change)
|
522
525
|
# run simulators
|
523
|
-
counts = self.sample(samples=samples, circuit=circuit, read_out_qubits=qubits, variables=variables,
|
524
|
-
**kwargs)
|
526
|
+
counts = self.sample(samples=samples, circuit=circuit, read_out_qubits=qubits, variables=variables,
|
527
|
+
initial_state=initial_state, *args, **kwargs)
|
525
528
|
# compute energy
|
526
529
|
E = 0.0
|
527
530
|
n_samples = 0
|
@@ -792,7 +795,7 @@ class BackendExpectationValue:
|
|
792
795
|
def __deepcopy__(self, memodict={}):
|
793
796
|
return type(self)(self.abstract_expectationvalue, **self._input_args)
|
794
797
|
|
795
|
-
def __call__(self, variables, samples: int = None, *args, **kwargs):
|
798
|
+
def __call__(self, variables, samples: int = None, initial_state: Union[int, QubitWaveFunction] = 0, *args, **kwargs):
|
796
799
|
|
797
800
|
variables = format_variable_dictionary(variables=variables)
|
798
801
|
if self._variables is not None and len(self._variables) > 0:
|
@@ -802,9 +805,9 @@ class BackendExpectationValue:
|
|
802
805
|
self._variables, variables))
|
803
806
|
|
804
807
|
if samples is None:
|
805
|
-
data = self.simulate(variables=variables, *args, **kwargs)
|
808
|
+
data = self.simulate(variables=variables, initial_state=initial_state, *args, **kwargs)
|
806
809
|
else:
|
807
|
-
data = self.sample(variables=variables, samples=samples, *args, **kwargs)
|
810
|
+
data = self.sample(variables=variables, samples=samples, initial_state=initial_state, *args, **kwargs)
|
808
811
|
|
809
812
|
if self._shape is None and self._contraction is None:
|
810
813
|
# this is the default
|
@@ -852,7 +855,7 @@ class BackendExpectationValue:
|
|
852
855
|
"""wrapper over circuit update_variables"""
|
853
856
|
self._U.update_variables(variables=variables)
|
854
857
|
|
855
|
-
def sample(self, variables, samples, *args, **kwargs) -> numpy.array:
|
858
|
+
def sample(self, variables, samples, initial_state: Union[int, QubitWaveFunction] = 0, *args, **kwargs) -> numpy.array:
|
856
859
|
"""
|
857
860
|
sample the expectationvalue.
|
858
861
|
|
@@ -862,6 +865,8 @@ class BackendExpectationValue:
|
|
862
865
|
variables to supply to the unitary.
|
863
866
|
samples: int:
|
864
867
|
number of samples to perform.
|
868
|
+
initial_state: int or QubitWaveFunction:
|
869
|
+
the initial state of the circuit
|
865
870
|
args
|
866
871
|
kwargs
|
867
872
|
|
@@ -891,16 +896,16 @@ class BackendExpectationValue:
|
|
891
896
|
if len(H.qubits) == 0:
|
892
897
|
E = sum([ps.coeff for ps in H.paulistrings])
|
893
898
|
elif H.is_all_z():
|
894
|
-
E = self.U.sample_all_z_hamiltonian(samples=samples, hamiltonian=H, variables=variables,
|
895
|
-
|
899
|
+
E = self.U.sample_all_z_hamiltonian(samples=samples, hamiltonian=H, variables=variables, initial_state=initial_state,
|
900
|
+
*args, **kwargs)
|
896
901
|
else:
|
897
902
|
for ps in H.paulistrings:
|
898
|
-
E += self.U.sample_paulistring(samples=samples, paulistring=ps, variables=variables,
|
899
|
-
**kwargs)
|
903
|
+
E += self.U.sample_paulistring(samples=samples, paulistring=ps, variables=variables, initial_state=initial_state,
|
904
|
+
*args, **kwargs)
|
900
905
|
result.append(to_float(E))
|
901
906
|
return numpy.asarray(result)
|
902
907
|
|
903
|
-
def simulate(self, variables, *args, **kwargs):
|
908
|
+
def simulate(self, variables, initial_state: Union[int, QubitWaveFunction], *args, **kwargs):
|
904
909
|
"""
|
905
910
|
Simulate the expectationvalue.
|
906
911
|
|
@@ -908,6 +913,8 @@ class BackendExpectationValue:
|
|
908
913
|
----------
|
909
914
|
variables:
|
910
915
|
variables to supply to the unitary.
|
916
|
+
initial_state: int or QubitWaveFunction:
|
917
|
+
the initial state of the circuit
|
911
918
|
args
|
912
919
|
kwargs
|
913
920
|
|
@@ -922,7 +929,7 @@ class BackendExpectationValue:
|
|
922
929
|
final_E = 0.0
|
923
930
|
# TODO inefficient,
|
924
931
|
# Always better to overwrite this function
|
925
|
-
wfn = self.U.simulate(variables=variables, *args, **kwargs)
|
932
|
+
wfn = self.U.simulate(variables=variables, initial_state=initial_state, *args, **kwargs)
|
926
933
|
final_E += wfn.compute_expectationvalue(operator=H)
|
927
934
|
result.append(to_float(final_E))
|
928
935
|
return numpy.asarray(result)
|
@@ -9,7 +9,7 @@ from typing import Union
|
|
9
9
|
import warnings
|
10
10
|
import numpy as np
|
11
11
|
import qiskit, qiskit_aer, qiskit.providers.fake_provider
|
12
|
-
from qiskit import QuantumCircuit
|
12
|
+
from qiskit import QuantumCircuit, transpile
|
13
13
|
|
14
14
|
HAS_NOISE = True
|
15
15
|
try:
|
@@ -316,11 +316,9 @@ class BackendCircuitQiskit(BackendCircuit):
|
|
316
316
|
optimization_level = kwargs['optimization_level']
|
317
317
|
|
318
318
|
circuit = self.circuit.assign_parameters(self.resolver)
|
319
|
-
|
320
319
|
circuit = self.add_state_init(circuit, initial_state)
|
321
|
-
|
322
320
|
circuit.save_statevector()
|
323
|
-
|
321
|
+
circuit = transpile(circuit, qiskit_backend)
|
324
322
|
backend_result = qiskit_backend.run(circuit, optimization_level=optimization_level).result()
|
325
323
|
|
326
324
|
return QubitWaveFunction.from_array(array=backend_result.get_statevector(circuit).data, numbering=self.numbering)
|
@@ -349,11 +347,11 @@ class BackendCircuitQiskit(BackendCircuit):
|
|
349
347
|
if 'optimization_level' in kwargs:
|
350
348
|
optimization_level = kwargs['optimization_level']
|
351
349
|
if self.device is None:
|
352
|
-
qiskit_backend = self.retrieve_device(
|
350
|
+
qiskit_backend = self.retrieve_device(self.STATEVECTOR_DEVICE_NAME)
|
353
351
|
else:
|
354
352
|
qiskit_backend = self.retrieve_device(self.device)
|
355
353
|
|
356
|
-
if isinstance(qiskit_backend, IBMBackend):
|
354
|
+
if HAS_IBMQ and isinstance(qiskit_backend, IBMBackend):
|
357
355
|
if self.noise_model is not None:
|
358
356
|
raise TequilaException(
|
359
357
|
'Cannot combine backend {} with custom noise models.'.format(str(qiskit_backend)))
|
@@ -370,7 +368,7 @@ class BackendCircuitQiskit(BackendCircuit):
|
|
370
368
|
if self.noise_model is not None:
|
371
369
|
from_back = self.noise_model
|
372
370
|
basis = from_back.basis_gates
|
373
|
-
use_backend = self.retrieve_device(
|
371
|
+
use_backend = self.retrieve_device(self.STATEVECTOR_DEVICE_NAME)
|
374
372
|
use_backend.set_options(noise_model=from_back)
|
375
373
|
circuit = qiskit.transpile(circuit, backend=use_backend,
|
376
374
|
basis_gates=basis,
|
@@ -429,13 +429,15 @@ class BackendExpectationValueQulacs(BackendExpectationValue):
|
|
429
429
|
use_mapping = True
|
430
430
|
BackendCircuitType = BackendCircuitQulacs
|
431
431
|
|
432
|
-
def simulate(self, variables, *args, **kwargs) -> numpy.array:
|
432
|
+
def simulate(self, variables, initial_state: Union[int, QubitWaveFunction] = 0, *args, **kwargs) -> numpy.array:
|
433
433
|
"""
|
434
434
|
Perform simulation of this expectationvalue.
|
435
435
|
Parameters
|
436
436
|
----------
|
437
437
|
variables:
|
438
438
|
variables, to be supplied to the underlying circuit.
|
439
|
+
initial_state: int or QubitWaveFunction:
|
440
|
+
the initial state of the circuit
|
439
441
|
args
|
440
442
|
kwargs
|
441
443
|
|
@@ -453,7 +455,7 @@ class BackendExpectationValueQulacs(BackendExpectationValue):
|
|
453
455
|
return numpy.asarray[self.H]
|
454
456
|
|
455
457
|
self.U.update_variables(variables)
|
456
|
-
state = self.U.initialize_state(self.n_qubits)
|
458
|
+
state = self.U.initialize_state(self.n_qubits, initial_state)
|
457
459
|
self.U.circuit.update_quantum_state(state)
|
458
460
|
result = []
|
459
461
|
for H in self.H:
|
@@ -495,7 +497,7 @@ class BackendExpectationValueQulacs(BackendExpectationValue):
|
|
495
497
|
result.append(qulacs_H)
|
496
498
|
return result
|
497
499
|
|
498
|
-
def sample(self, variables, samples, *args, **kwargs) -> numpy.array:
|
500
|
+
def sample(self, variables, samples, initial_state: Union[int, QubitWaveFunction] = 0, *args, **kwargs) -> numpy.array:
|
499
501
|
"""
|
500
502
|
Sample this Expectation Value.
|
501
503
|
Parameters
|
@@ -504,6 +506,8 @@ class BackendExpectationValueQulacs(BackendExpectationValue):
|
|
504
506
|
variables, to supply to the underlying circuit.
|
505
507
|
samples: int:
|
506
508
|
the number of samples to take.
|
509
|
+
initial_state: int or QubitWaveFunction:
|
510
|
+
the initial state of the circuit
|
507
511
|
args
|
508
512
|
kwargs
|
509
513
|
|
@@ -513,13 +517,13 @@ class BackendExpectationValueQulacs(BackendExpectationValue):
|
|
513
517
|
the result of sampling as a number.
|
514
518
|
"""
|
515
519
|
self.update_variables(variables)
|
516
|
-
state = self.U.initialize_state(self.n_qubits)
|
520
|
+
state = self.U.initialize_state(self.n_qubits, initial_state)
|
517
521
|
self.U.circuit.update_quantum_state(state)
|
518
522
|
result = []
|
519
|
-
for H in self._reduced_hamiltonians:
|
523
|
+
for H in self._reduced_hamiltonians: # those are the hamiltonians which where non-used qubits are already traced out
|
520
524
|
E = 0.0
|
521
525
|
if H.is_all_z() and not self.U.has_noise:
|
522
|
-
E = super().sample(samples=samples, variables=variables, *args, **kwargs)
|
526
|
+
E = super().sample(samples=samples, variables=variables, initial_state=initial_state, *args, **kwargs)
|
523
527
|
else:
|
524
528
|
for ps in H.paulistrings:
|
525
529
|
# change basis, measurement is destructive so the state will be copied
|
@@ -530,8 +534,8 @@ class BackendExpectationValueQulacs(BackendExpectationValue):
|
|
530
534
|
qbc = self.U.create_circuit(abstract_circuit=bc, variables=None)
|
531
535
|
Esamples = []
|
532
536
|
for sample in range(samples):
|
533
|
-
if self.U.has_noise and sample>0:
|
534
|
-
state = self.U.initialize_state(self.n_qubits)
|
537
|
+
if self.U.has_noise and sample > 0:
|
538
|
+
state = self.U.initialize_state(self.n_qubits, initial_state)
|
535
539
|
self.U.circuit.update_quantum_state(state)
|
536
540
|
state_tmp = state
|
537
541
|
else:
|
@@ -540,7 +544,7 @@ class BackendExpectationValueQulacs(BackendExpectationValue):
|
|
540
544
|
qbc.update_quantum_state(state_tmp)
|
541
545
|
ps_measure = 1.0
|
542
546
|
for idx in ps.keys():
|
543
|
-
assert idx in self.U.abstract_qubits
|
547
|
+
assert idx in self.U.abstract_qubits # assert that the hamiltonian was really reduced
|
544
548
|
M = qulacs.gate.Measurement(self.U.qubit(idx), self.U.qubit(idx))
|
545
549
|
M.update_quantum_state(state_tmp)
|
546
550
|
measured = state_tmp.get_classical_value(self.U.qubit(idx))
|