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.
Files changed (127) hide show
  1. {tequila_basic-1.9.8/src/tequila_basic.egg-info → tequila_basic-1.9.9}/PKG-INFO +11 -2
  2. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/circuit/circuit.py +20 -15
  3. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/objective/objective.py +5 -2
  4. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/chemistry_tools.py +8 -1
  5. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/orbital_optimizer.py +2 -1
  6. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_api.py +12 -2
  7. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_base.py +23 -16
  8. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_qiskit.py +5 -7
  9. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_qulacs.py +13 -9
  10. tequila_basic-1.9.9/src/tequila/simulators/simulator_spex.py +429 -0
  11. tequila_basic-1.9.9/src/tequila/simulators/test_spex_simulator.py +211 -0
  12. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/utils/bitstrings.py +6 -0
  13. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/version.py +1 -1
  14. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/wavefunction/qubit_wavefunction.py +5 -2
  15. {tequila_basic-1.9.8 → tequila_basic-1.9.9/src/tequila_basic.egg-info}/PKG-INFO +11 -2
  16. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila_basic.egg-info/SOURCES.txt +2 -0
  17. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_chemistry.py +1 -1
  18. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_gradient.py +1 -1
  19. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_simulator_backends.py +13 -2
  20. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/LICENSE +0 -0
  21. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/MANIFEST.in +0 -0
  22. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/README.md +0 -0
  23. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/requirements.txt +0 -0
  24. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/setup.cfg +0 -0
  25. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/setup.py +0 -0
  26. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/__init__.py +0 -0
  27. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/apps/__init__.py +0 -0
  28. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/apps/_unary_state_prep_impl.py +0 -0
  29. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/apps/adapt/__init__.py +0 -0
  30. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/apps/adapt/adapt.py +0 -0
  31. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/apps/krylov/__init__.py +0 -0
  32. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/apps/krylov/krylov.py +0 -0
  33. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/apps/robustness/__init__.py +0 -0
  34. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/apps/robustness/helpers.py +0 -0
  35. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/apps/robustness/interval.py +0 -0
  36. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/apps/unary_state_prep.py +0 -0
  37. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/autograd_imports.py +0 -0
  38. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/circuit/__init__.py +0 -0
  39. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/circuit/_gates_impl.py +0 -0
  40. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/circuit/compiler.py +0 -0
  41. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/circuit/gates.py +0 -0
  42. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/circuit/gradient.py +0 -0
  43. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/circuit/noise.py +0 -0
  44. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/circuit/pyzx.py +0 -0
  45. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/circuit/qasm.py +0 -0
  46. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/circuit/qpic.py +0 -0
  47. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/grouping/__init__.py +0 -0
  48. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/grouping/binary_rep.py +0 -0
  49. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/grouping/binary_utils.py +0 -0
  50. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/grouping/compile_groups.py +0 -0
  51. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/grouping/ev_utils.py +0 -0
  52. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/grouping/fermionic_functions.py +0 -0
  53. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/grouping/fermionic_methods.py +0 -0
  54. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/grouping/overlapping_methods.py +0 -0
  55. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/hamiltonian/__init__.py +0 -0
  56. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/hamiltonian/paulis.py +0 -0
  57. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/hamiltonian/paulistring.py +0 -0
  58. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/hamiltonian/qubit_hamiltonian.py +0 -0
  59. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/ml/__init__.py +0 -0
  60. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/ml/interface_torch.py +0 -0
  61. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/ml/ml_api.py +0 -0
  62. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/ml/utils_ml.py +0 -0
  63. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/objective/__init__.py +0 -0
  64. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/objective/braket.py +0 -0
  65. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/objective/qtensor.py +0 -0
  66. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/optimizers/__init__.py +0 -0
  67. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/optimizers/_containers.py +0 -0
  68. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/optimizers/optimizer_base.py +0 -0
  69. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/optimizers/optimizer_gd.py +0 -0
  70. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/optimizers/optimizer_gpyopt.py +0 -0
  71. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/optimizers/optimizer_scipy.py +0 -0
  72. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/__init__.py +0 -0
  73. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/encodings.py +0 -0
  74. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/madness_interface.py +0 -0
  75. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/psi4_interface.py +0 -0
  76. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/pyscf_interface.py +0 -0
  77. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/qc_base.py +0 -0
  78. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/__init__.py +0 -0
  79. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_cirq.py +0 -0
  80. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_pyquil.py +0 -0
  81. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_qibo.py +0 -0
  82. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_qiskit_gpu.py +0 -0
  83. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_qlm.py +0 -0
  84. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_qulacs_gpu.py +0 -0
  85. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_symbolic.py +0 -0
  86. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/tools/__init__.py +0 -0
  87. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/tools/convenience.py +0 -0
  88. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/tools/qng.py +0 -0
  89. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/tools/random_generators.py +0 -0
  90. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/utils/__init__.py +0 -0
  91. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/utils/exceptions.py +0 -0
  92. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/utils/joined_transformation.py +0 -0
  93. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/utils/keymap.py +0 -0
  94. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/utils/misc.py +0 -0
  95. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila/wavefunction/__init__.py +0 -0
  96. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila_basic.egg-info/dependency_links.txt +0 -0
  97. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila_basic.egg-info/requires.txt +0 -0
  98. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/src/tequila_basic.egg-info/top_level.txt +0 -0
  99. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_TrotErr.py +0 -0
  100. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_adapt.py +0 -0
  101. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_array.py +0 -0
  102. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_binary_pauli.py +0 -0
  103. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_binary_utils.py +0 -0
  104. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_bitstrings.py +0 -0
  105. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_braket.py +0 -0
  106. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_chemistry_f12.py +0 -0
  107. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_chemistry_madness.py +0 -0
  108. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_circuits.py +0 -0
  109. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_fermionic_meas.py +0 -0
  110. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_gd_optimizer.py +0 -0
  111. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_gpyopt.py +0 -0
  112. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_hamiltonian_arithmetic.py +0 -0
  113. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_krylov.py +0 -0
  114. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_mappings.py +0 -0
  115. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_noise.py +0 -0
  116. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_noise_opt.py +0 -0
  117. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_objectives.py +0 -0
  118. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_pyzx.py +0 -0
  119. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_qasm.py +0 -0
  120. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_qtensor.py +0 -0
  121. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_recompilation_routines.py +0 -0
  122. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_scipy.py +0 -0
  123. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_symbolic_simulator.py +0 -0
  124. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_torch_interface.py +0 -0
  125. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_unary_state_prep.py +0 -0
  126. {tequila_basic-1.9.8 → tequila_basic-1.9.9}/tests/test_variable.py +0 -0
  127. {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
1
+ Metadata-Version: 2.4
2
2
  Name: tequila-basic
3
- Version: 1.9.8
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
  [![License: MIT](https://img.shields.io/badge/License-MIT-lightgrey.svg)](LICENCE) [![DOI](https://zenodo.org/badge/259718912.svg)](https://zenodo.org/badge/latestdoi/259718912) [![PyPI version](https://badge.fury.io/py/tequila-basic.svg)](https://badge.fury.io/py/tequila-basic) ![CI](https://github.com/tequilahub/tequila/actions/workflows/ci_basic.yml/badge.svg)
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 replaces or if the new parts shall be inserted without replacement
258
- if replace[i] = true: gate at position [i] will be replaces by gates[i]
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
- offset = 0
275
- new_gatelist = self.gates
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
- pos = idx + offset
287
- if do_replace:
288
- new_gatelist = new_gatelist[:pos] + gatelist + new_gatelist[pos + 1:]
289
- offset += len(gatelist) - 1
290
- else:
291
- new_gatelist = new_gatelist[:pos] + gatelist + new_gatelist[pos:]
292
- offset += len(gatelist)
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 += copy.deepcopy(other.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'Some of the controls {control} were already included '
614
- f'in the control of a gate {gate}.')
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:
@@ -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, rdm2 = self.vqe_solver.compute_rdms(U=self.circuit, variables=result.variables, molecule=molecule, use_hcb=restrict_to_hcb)
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
- SUPPORTED_NOISE_BACKENDS = ["qiskit", "qiskit_gpu", "cirq", "pyquil"] # qulacs removed in v.1.9
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, *args, **kwargs):
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, *args,
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, *args,
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, *args,
895
- **kwargs)
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, *args,
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('aer_simulator')
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('aer_simulator')
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: # those are the hamiltonians which where non-used qubits are already traced out
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 # assert that the hamiltonian was really reduced
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))