tequila-basic 1.9.7__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 (128) hide show
  1. {tequila_basic-1.9.7/src/tequila_basic.egg-info → tequila_basic-1.9.9}/PKG-INFO +13 -9
  2. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/README.md +2 -7
  3. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/apps/unary_state_prep.py +1 -2
  4. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/circuit/circuit.py +20 -15
  5. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/hamiltonian/paulis.py +4 -3
  6. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/objective/objective.py +5 -2
  7. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/chemistry_tools.py +8 -1
  8. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/encodings.py +2 -2
  9. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/orbital_optimizer.py +10 -2
  10. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_api.py +35 -9
  11. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_base.py +58 -28
  12. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_cirq.py +6 -6
  13. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_pyquil.py +3 -3
  14. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_qibo.py +14 -16
  15. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_qiskit.py +88 -53
  16. tequila_basic-1.9.9/src/tequila/simulators/simulator_qiskit_gpu.py +9 -0
  17. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_qlm.py +3 -3
  18. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_qulacs.py +37 -28
  19. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_qulacs_gpu.py +6 -4
  20. tequila_basic-1.9.9/src/tequila/simulators/simulator_spex.py +429 -0
  21. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/simulators/simulator_symbolic.py +15 -23
  22. tequila_basic-1.9.9/src/tequila/simulators/test_spex_simulator.py +211 -0
  23. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/utils/bitstrings.py +14 -3
  24. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/version.py +1 -1
  25. tequila_basic-1.9.9/src/tequila/wavefunction/qubit_wavefunction.py +425 -0
  26. {tequila_basic-1.9.7 → tequila_basic-1.9.9/src/tequila_basic.egg-info}/PKG-INFO +13 -9
  27. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila_basic.egg-info/SOURCES.txt +3 -0
  28. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_binary_pauli.py +1 -1
  29. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_chemistry.py +1 -1
  30. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_circuits.py +14 -7
  31. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_gradient.py +1 -1
  32. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_hamiltonian_arithmetic.py +8 -8
  33. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_mappings.py +13 -11
  34. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_simulator_backends.py +39 -7
  35. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_symbolic_simulator.py +9 -12
  36. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_unary_state_prep.py +1 -1
  37. tequila_basic-1.9.7/src/tequila/wavefunction/qubit_wavefunction.py +0 -322
  38. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/LICENSE +0 -0
  39. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/MANIFEST.in +0 -0
  40. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/requirements.txt +0 -0
  41. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/setup.cfg +0 -0
  42. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/setup.py +0 -0
  43. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/__init__.py +0 -0
  44. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/apps/__init__.py +0 -0
  45. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/apps/_unary_state_prep_impl.py +0 -0
  46. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/apps/adapt/__init__.py +0 -0
  47. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/apps/adapt/adapt.py +0 -0
  48. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/apps/krylov/__init__.py +0 -0
  49. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/apps/krylov/krylov.py +0 -0
  50. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/apps/robustness/__init__.py +0 -0
  51. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/apps/robustness/helpers.py +0 -0
  52. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/apps/robustness/interval.py +0 -0
  53. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/autograd_imports.py +0 -0
  54. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/circuit/__init__.py +0 -0
  55. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/circuit/_gates_impl.py +0 -0
  56. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/circuit/compiler.py +0 -0
  57. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/circuit/gates.py +0 -0
  58. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/circuit/gradient.py +0 -0
  59. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/circuit/noise.py +0 -0
  60. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/circuit/pyzx.py +0 -0
  61. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/circuit/qasm.py +0 -0
  62. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/circuit/qpic.py +0 -0
  63. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/grouping/__init__.py +0 -0
  64. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/grouping/binary_rep.py +0 -0
  65. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/grouping/binary_utils.py +0 -0
  66. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/grouping/compile_groups.py +0 -0
  67. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/grouping/ev_utils.py +0 -0
  68. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/grouping/fermionic_functions.py +0 -0
  69. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/grouping/fermionic_methods.py +0 -0
  70. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/grouping/overlapping_methods.py +0 -0
  71. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/hamiltonian/__init__.py +0 -0
  72. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/hamiltonian/paulistring.py +0 -0
  73. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/hamiltonian/qubit_hamiltonian.py +0 -0
  74. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/ml/__init__.py +0 -0
  75. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/ml/interface_torch.py +0 -0
  76. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/ml/ml_api.py +0 -0
  77. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/ml/utils_ml.py +0 -0
  78. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/objective/__init__.py +0 -0
  79. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/objective/braket.py +0 -0
  80. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/objective/qtensor.py +0 -0
  81. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/optimizers/__init__.py +0 -0
  82. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/optimizers/_containers.py +0 -0
  83. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/optimizers/optimizer_base.py +0 -0
  84. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/optimizers/optimizer_gd.py +0 -0
  85. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/optimizers/optimizer_gpyopt.py +0 -0
  86. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/optimizers/optimizer_scipy.py +0 -0
  87. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/__init__.py +0 -0
  88. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/madness_interface.py +0 -0
  89. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/psi4_interface.py +0 -0
  90. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/pyscf_interface.py +0 -0
  91. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/quantumchemistry/qc_base.py +0 -0
  92. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/simulators/__init__.py +0 -0
  93. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/tools/__init__.py +0 -0
  94. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/tools/convenience.py +0 -0
  95. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/tools/qng.py +0 -0
  96. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/tools/random_generators.py +0 -0
  97. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/utils/__init__.py +0 -0
  98. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/utils/exceptions.py +0 -0
  99. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/utils/joined_transformation.py +0 -0
  100. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/utils/keymap.py +0 -0
  101. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/utils/misc.py +0 -0
  102. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila/wavefunction/__init__.py +0 -0
  103. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila_basic.egg-info/dependency_links.txt +0 -0
  104. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila_basic.egg-info/requires.txt +0 -0
  105. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/src/tequila_basic.egg-info/top_level.txt +0 -0
  106. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_TrotErr.py +0 -0
  107. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_adapt.py +0 -0
  108. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_array.py +0 -0
  109. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_binary_utils.py +0 -0
  110. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_bitstrings.py +0 -0
  111. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_braket.py +0 -0
  112. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_chemistry_f12.py +0 -0
  113. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_chemistry_madness.py +0 -0
  114. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_fermionic_meas.py +0 -0
  115. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_gd_optimizer.py +0 -0
  116. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_gpyopt.py +0 -0
  117. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_krylov.py +0 -0
  118. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_noise.py +0 -0
  119. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_noise_opt.py +0 -0
  120. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_objectives.py +0 -0
  121. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_pyzx.py +0 -0
  122. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_qasm.py +0 -0
  123. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_qtensor.py +0 -0
  124. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_recompilation_routines.py +0 -0
  125. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_scipy.py +0 -0
  126. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_torch_interface.py +0 -0
  127. {tequila_basic-1.9.7 → tequila_basic-1.9.9}/tests/test_variable.py +0 -0
  128. {tequila_basic-1.9.7 → 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.7
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
 
@@ -27,7 +36,7 @@ Tequila can execute the underlying quantum expectation values on state of the ar
27
36
  # Getting Started
28
37
 
29
38
  Get started with our collection of
30
- - *[Tutorials](https://thuytr18.github.io/tequila-tutorials-beta/tutorials.html)*
39
+ - *[Tutorials](https://tequilahub.github.io/tequila-tutorials/)*
31
40
 
32
41
  Further sources:
33
42
  - [overview article](https://arxiv.org/abs/2011.03057)
@@ -360,12 +369,7 @@ You can avoid it by downgrading cirq and openfermion
360
369
  ```bash
361
370
  pip install --upgrade "openfermion<=1.0.0"
362
371
  pip install --upgrade "cirq<=0.9.1"
363
- ```
364
-
365
-
366
- ## Qiskit backend
367
- Qiskit version 0.25 is not yet supported.
368
- `pip install --upgrade qiskit<0.25` fixes potential issues. If not: Please let us know.
372
+ ```
369
373
 
370
374
  ## Circuit drawing
371
375
  Standard graphical circuit representation within a Jupyter environment is often done using `tq.draw`.
@@ -9,7 +9,7 @@ Tequila can execute the underlying quantum expectation values on state of the ar
9
9
  # Getting Started
10
10
 
11
11
  Get started with our collection of
12
- - *[Tutorials](https://thuytr18.github.io/tequila-tutorials-beta/tutorials.html)*
12
+ - *[Tutorials](https://tequilahub.github.io/tequila-tutorials/)*
13
13
 
14
14
  Further sources:
15
15
  - [overview article](https://arxiv.org/abs/2011.03057)
@@ -342,12 +342,7 @@ You can avoid it by downgrading cirq and openfermion
342
342
  ```bash
343
343
  pip install --upgrade "openfermion<=1.0.0"
344
344
  pip install --upgrade "cirq<=0.9.1"
345
- ```
346
-
347
-
348
- ## Qiskit backend
349
- Qiskit version 0.25 is not yet supported.
350
- `pip install --upgrade qiskit<0.25` fixes potential issues. If not: Please let us know.
345
+ ```
351
346
 
352
347
  ## Circuit drawing
353
348
  Standard graphical circuit representation within a Jupyter environment is often done using `tq.draw`.
@@ -89,7 +89,6 @@ class UnaryStatePrep:
89
89
  simulator.convert_to_numpy = False
90
90
  variables = None # {k:k.name.evalf() for k in self._abstract_circuit.extract_variables()}
91
91
  wfn = simulator.simulate(initial_state=BitString.from_int(0, nbits=self.n_qubits), variables=variables)
92
- wfn.n_qubits = self._n_qubits
93
92
  equations = []
94
93
  for k in target_space:
95
94
  equations.append(wfn[k] - abstract_coefficients[k])
@@ -174,7 +173,7 @@ class UnaryStatePrep:
174
173
  :return:
175
174
  """
176
175
  try:
177
- assert (len(wfn) == len(self._target_space))
176
+ assert wfn.length() == len(self._target_space)
178
177
  for key in wfn.keys():
179
178
  try:
180
179
  assert (key in self._target_space)
@@ -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
 
@@ -256,7 +256,7 @@ def Projector(wfn, threshold=0.0, n_qubits=None) -> QubitHamiltonian:
256
256
 
257
257
  """
258
258
 
259
- wfn = QubitWaveFunction(state=wfn, n_qubits=n_qubits)
259
+ wfn = QubitWaveFunction.convert_from(n_qubits, wfn)
260
260
 
261
261
  H = QubitHamiltonian.zero()
262
262
  for k1, v1 in wfn.items():
@@ -304,8 +304,9 @@ def KetBra(ket: QubitWaveFunction, bra: QubitWaveFunction, hermitian: bool = Fal
304
304
 
305
305
  """
306
306
  H = QubitHamiltonian.zero()
307
- ket = QubitWaveFunction(state=ket, n_qubits=n_qubits)
308
- bra = QubitWaveFunction(state=bra, n_qubits=n_qubits)
307
+
308
+ ket = QubitWaveFunction.convert_from(n_qubits, ket)
309
+ bra = QubitWaveFunction.convert_from(n_qubits, bra)
309
310
 
310
311
  for k1, v1 in bra.items():
311
312
  for k2, v2 in ket.items():
@@ -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:
@@ -128,9 +128,9 @@ class EncodingBase(metaclass=abc.ABCMeta):
128
128
  fop = openfermion.FermionOperator(string, 1.0)
129
129
  op = self(fop)
130
130
  from tequila.wavefunction.qubit_wavefunction import QubitWaveFunction
131
- wfn = QubitWaveFunction.from_int(0, n_qubits=n_qubits)
131
+ wfn = QubitWaveFunction.from_basis_state(n_qubits, 0)
132
132
  wfn = wfn.apply_qubitoperator(operator=op)
133
- assert (len(wfn.keys()) == 1)
133
+ assert wfn.length() == 1
134
134
  key = list(wfn.keys())[0].array
135
135
  return key
136
136
 
@@ -208,11 +208,17 @@ class PySCFVQEWrapper:
208
208
  H = molecule.make_hardcore_boson_hamiltonian()
209
209
  else:
210
210
  H = molecule.make_hamiltonian()
211
+
212
+ rdm1 = None
213
+ rdm2 = None
211
214
  if self.vqe_solver is not None:
212
215
  vqe_solver_arguments = {}
213
216
  if self.vqe_solver_arguments is not None:
214
217
  vqe_solver_arguments = self.vqe_solver_arguments
215
218
  result = self.vqe_solver(H=H, circuit=self.circuit, molecule=molecule, **vqe_solver_arguments)
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)
221
+ rdm2 = self.reorder(rdm2, 'dirac', 'mulliken')
216
222
  elif self.circuit is None:
217
223
  raise Exception("Orbital Optimizer: Either provide a callable vqe_solver or a circuit")
218
224
  else:
@@ -233,8 +239,9 @@ class PySCFVQEWrapper:
233
239
  # static ansatz
234
240
  U = self.circuit
235
241
 
236
- rdm1, rdm2 = molecule.compute_rdms(U=U, variables=result.variables, spin_free=True, get_rdm1=True, get_rdm2=True, use_hcb=restrict_to_hcb)
237
- rdm2 = self.reorder(rdm2, 'dirac', 'mulliken')
242
+ if rdm1 is None or rdm2 is None:
243
+ rdm1, rdm2 = molecule.compute_rdms(U=U, variables=result.variables, spin_free=True, get_rdm1=True, get_rdm2=True, use_hcb=restrict_to_hcb)
244
+ rdm2 = self.reorder(rdm2, 'dirac', 'mulliken')
238
245
  if not self.silent:
239
246
  print("{:20} : {}".format("energy", result.energy))
240
247
  if len(self.history) > 0:
@@ -259,3 +266,4 @@ class PySCFVQEWrapper:
259
266
  else:
260
267
  result += "{:30} : {}\n".format(k, v)
261
268
  return result
269
+
@@ -9,9 +9,11 @@ from tequila.objective import Objective, Variable, assign_variable, format_varia
9
9
  from tequila.utils.exceptions import TequilaException, TequilaWarning
10
10
  from tequila.simulators.simulator_base import BackendCircuit, BackendExpectationValue
11
11
  from tequila.circuit.noise import NoiseModel
12
+ from tequila.wavefunction.qubit_wavefunction import QubitWaveFunction
12
13
 
13
- SUPPORTED_BACKENDS = ["qulacs_gpu", "qulacs",'qibo', "qiskit", "cirq", "pyquil", "symbolic", "qlm"]
14
- SUPPORTED_NOISE_BACKENDS = ["qiskit", '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
15
17
  BackendTypes = namedtuple('BackendTypes', 'CircType ExpValueType')
16
18
  INSTALLED_SIMULATORS = {}
17
19
  INSTALLED_SAMPLERS = {}
@@ -22,7 +24,6 @@ if typing.TYPE_CHECKING:
22
24
  from tequila.objective import Objective, Variable
23
25
  from tequila.circuit.gates import QCircuit
24
26
  import numbers.Real as RealNumber
25
- from tequila.wavefunction.qubit_wavefunction import QubitWaveFunction
26
27
 
27
28
  """
28
29
  Check which simulators are installed
@@ -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
@@ -43,6 +53,19 @@ except ImportError:
43
53
  HAS_QISKIT = False
44
54
  HAS_QISKIT_NOISE = False
45
55
 
56
+ try:
57
+ pkg_resources.require("qiskit-aer-gpu")
58
+ from tequila.simulators.simulator_qiskit_gpu import BackendCircuitQiskitGpu, BackendExpectationValueQiskitGpu
59
+ HAS_QISKIT_GPU = True
60
+ INSTALLED_SIMULATORS["qiskit_gpu"] = BackendTypes(BackendCircuitQiskitGpu, BackendExpectationValueQiskitGpu)
61
+ INSTALLED_SAMPLERS["qiskit_gpu"] = BackendTypes(BackendCircuitQiskitGpu, BackendExpectationValueQiskitGpu)
62
+ from tequila.simulators.simulator_qiskit import HAS_NOISE as HAS_QISKIT_GPU_NOISE
63
+ if HAS_QISKIT_GPU_NOISE:
64
+ INSTALLED_NOISE_SAMPLERS["qiskit_gpu"] = BackendTypes(BackendCircuitQiskitGpu, BackendExpectationValueQiskitGpu)
65
+ except (ImportError, DistributionNotFound):
66
+ HAS_QISKIT_GPU = False
67
+ HAS_QISKIT_GPU_NOISE = False
68
+
46
69
  HAS_QIBO = True
47
70
  try:
48
71
  from tequila.simulators.simulator_qibo import BackendCircuitQibo, BackendExpectationValueQibo
@@ -82,8 +105,8 @@ except (ImportError, DistributionNotFound):
82
105
  HAS_QULACS = False
83
106
 
84
107
  try:
85
- pkg_resources.require("qulacs-gpu")
86
- import qulacs
108
+ # pkg_resources.require("qulacs-gpu")
109
+ from qulacs import QuantumStateGpu
87
110
  from tequila.simulators.simulator_qulacs_gpu import BackendCircuitQulacsGpu, BackendExpectationValueQulacsGpu
88
111
 
89
112
  HAS_QULACS_GPU = True
@@ -350,14 +373,15 @@ def compile_circuit(abstract_circuit: 'QCircuit',
350
373
  return CircType(abstract_circuit=abstract_circuit, variables=variables, noise=noise, device=device, *args, **kwargs)
351
374
 
352
375
 
353
- def simulate(objective: typing.Union['Objective', 'QCircuit','QTensor'],
376
+ def simulate(objective: typing.Union['Objective', 'QCircuit', 'QTensor'],
354
377
  variables: Dict[Union[Variable, Hashable], RealNumber] = None,
355
378
  samples: int = None,
356
379
  backend: str = None,
357
380
  noise: NoiseModel = None,
358
381
  device: str = None,
382
+ initial_state: Union[int, QubitWaveFunction] = 0,
359
383
  *args,
360
- **kwargs) -> Union[RealNumber, 'QubitWaveFunction']:
384
+ **kwargs) -> Union[RealNumber, QubitWaveFunction]:
361
385
  """Simulate a tequila objective or circuit
362
386
 
363
387
  Parameters
@@ -375,6 +399,8 @@ def simulate(objective: typing.Union['Objective', 'QCircuit','QTensor'],
375
399
  specify a noise model to apply to simulation/sampling
376
400
  device:
377
401
  a device upon which (or in emulation of which) to sample
402
+ initial_state: int or QubitWaveFunction:
403
+ the initial state of the circuit
378
404
  *args :
379
405
 
380
406
  **kwargs :
@@ -394,9 +420,9 @@ def simulate(objective: typing.Union['Objective', 'QCircuit','QTensor'],
394
420
  objective.extract_variables()))
395
421
 
396
422
  compiled_objective = compile(objective=objective, samples=samples, variables=variables, backend=backend,
397
- noise=noise,device=device, *args, **kwargs)
423
+ noise=noise, device=device, *args, **kwargs)
398
424
 
399
- return compiled_objective(variables=variables, samples=samples, *args, **kwargs)
425
+ return compiled_objective(variables=variables, samples=samples, initial_state=initial_state, *args, **kwargs)
400
426
 
401
427
 
402
428
  def draw(objective, variables=None, backend: str = None, name=None, *args, **kwargs):
@@ -7,6 +7,7 @@ from tequila.circuit.compiler import change_basis
7
7
  from tequila import BitString
8
8
  from tequila.objective.objective import Variable, format_variable_dictionary
9
9
  from tequila.circuit import compiler
10
+ from typing import Union
10
11
 
11
12
  import numbers, typing, numpy, copy, warnings
12
13
 
@@ -107,6 +108,11 @@ class BackendCircuit():
107
108
  "cc_max": True
108
109
  }
109
110
 
111
+ # Can be overwritten by backends that allow basis state initialization when sampling
112
+ supports_sampling_initialization: bool = False
113
+ # Can be overwritten by backends that allow initializing arbitrary states
114
+ supports_generic_initialization: bool = False
115
+
110
116
  @property
111
117
  def n_qubits(self) -> numbers.Integral:
112
118
  return len(self.qubit_map)
@@ -328,7 +334,7 @@ class BackendCircuit():
328
334
  """
329
335
  self.circuit = self.create_circuit(abstract_circuit=self.abstract_circuit, variables=variables)
330
336
 
331
- def simulate(self, variables, initial_state=0, *args, **kwargs) -> QubitWaveFunction:
337
+ def simulate(self, variables, initial_state: Union[int, QubitWaveFunction] = 0, *args, **kwargs) -> QubitWaveFunction:
332
338
  """
333
339
  simulate the circuit via the backend.
334
340
 
@@ -348,13 +354,12 @@ class BackendCircuit():
348
354
  the wavefunction of the system produced by the action of the circuit on the initial state.
349
355
 
350
356
  """
357
+ if isinstance(initial_state, QubitWaveFunction) and not self.supports_generic_initialization:
358
+ raise TequilaException("Backend does not support arbitrary initial states")
359
+
351
360
  self.update_variables(variables)
352
361
  if isinstance(initial_state, BitString):
353
362
  initial_state = initial_state.integer
354
- if isinstance(initial_state, QubitWaveFunction):
355
- if len(initial_state.keys()) != 1:
356
- raise TequilaException("only product states as initial states accepted")
357
- initial_state = list(initial_state.keys())[0].integer
358
363
 
359
364
  all_qubits = list(range(self.abstract_circuit.n_qubits))
360
365
  active_qubits = self.qubit_map.keys()
@@ -362,20 +367,30 @@ class BackendCircuit():
362
367
  # Keymap is only necessary if not all qubits are active
363
368
  keymap_required = sorted(active_qubits) != all_qubits
364
369
 
370
+ # Combining keymap and general initial states is awkward, because it's not clear what should happen with
371
+ # different states on non-active qubits. For now, this is simply not allowed.
372
+ # A better solution might be to check if all components of the initial state differ only on the active qubits.
373
+ if keymap_required and isinstance(initial_state, QubitWaveFunction):
374
+ raise TequilaException("Can only set non-basis initial state if all qubits are used")
375
+
365
376
  if keymap_required:
366
377
  # maps from reduced register to full register
367
378
  keymap = KeyMapSubregisterToRegister(subregister=active_qubits, register=all_qubits)
368
379
 
369
- mapped_initial_state = keymap.inverted(initial_state).integer if keymap_required else int(initial_state)
380
+ if not isinstance(initial_state, QubitWaveFunction):
381
+ mapped_initial_state = keymap.inverted(initial_state).integer if keymap_required else int(initial_state)
382
+ else:
383
+ mapped_initial_state = initial_state
384
+
370
385
  result = self.do_simulate(variables=variables, initial_state=mapped_initial_state, *args,
371
386
  **kwargs)
372
387
 
373
388
  if keymap_required:
374
- result.apply_keymap(keymap=keymap, initial_state=initial_state)
389
+ result = QubitWaveFunction.from_wavefunction(result, keymap, n_qubits=len(all_qubits), initial_state=initial_state)
375
390
 
376
391
  return result
377
392
 
378
- def sample(self, variables, samples, read_out_qubits=None, circuit=None, *args, **kwargs):
393
+ def sample(self, variables, samples, read_out_qubits=None, circuit=None, initial_state=0, *args, **kwargs):
379
394
  """
380
395
  Sample the circuit. If circuit natively equips paulistrings, sample therefrom.
381
396
  Parameters
@@ -395,6 +410,12 @@ class BackendCircuit():
395
410
  The result of sampling, a recreated QubitWaveFunction in the sampled basis.
396
411
 
397
412
  """
413
+ if initial_state != 0 and not self.supports_sampling_initialization:
414
+ raise TequilaException("Backend does not support initial states for sampling")
415
+
416
+ if isinstance(initial_state, QubitWaveFunction) and not self.supports_generic_initialization:
417
+ raise TequilaException("Backend does not support arbitrary initial states")
418
+
398
419
  self.update_variables(variables)
399
420
  if read_out_qubits is None:
400
421
  read_out_qubits = self.abstract_qubits
@@ -406,9 +427,12 @@ class BackendCircuit():
406
427
  circuit = self.add_measurement(circuit=self.circuit, target_qubits=read_out_qubits)
407
428
  else:
408
429
  circuit = self.add_measurement(circuit=circuit, target_qubits=read_out_qubits)
409
- return self.do_sample(samples=samples, circuit=circuit, read_out_qubits=read_out_qubits, *args, **kwargs)
410
430
 
411
- def sample_all_z_hamiltonian(self, samples: int, hamiltonian, variables, *args, **kwargs):
431
+ return self.do_sample(samples=samples, circuit=circuit, read_out_qubits=read_out_qubits,
432
+ initial_state=initial_state, *args, **kwargs)
433
+
434
+ def sample_all_z_hamiltonian(self, samples: int, hamiltonian, variables,
435
+ initial_state: Union[int, QubitWaveFunction] = 0, *args, **kwargs):
412
436
  """
413
437
  Sample from a Hamiltonian which only consists of Pauli-Z and unit operators
414
438
  Parameters
@@ -417,6 +441,8 @@ class BackendCircuit():
417
441
  number of samples to take
418
442
  hamiltonian
419
443
  the tequila hamiltonian
444
+ initial_state
445
+ the initial state of the circuit
420
446
  args
421
447
  arguments for do_sample
422
448
  kwargs
@@ -435,7 +461,7 @@ class BackendCircuit():
435
461
  self.n_qubits))
436
462
 
437
463
  # run simulators
438
- 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)
439
465
  read_out_map = {q: i for i, q in enumerate(abstract_qubits_H)}
440
466
 
441
467
  # compute energy
@@ -458,8 +484,8 @@ class BackendCircuit():
458
484
  assert n_samples == samples
459
485
  return E
460
486
 
461
- def sample_paulistring(self, samples: int, paulistring, variables, *args,
462
- **kwargs) -> numbers.Real:
487
+ def sample_paulistring(self, samples: int, paulistring, variables, initial_state: Union[int, QubitWaveFunction] = 0,
488
+ *args, **kwargs) -> numbers.Real:
463
489
  """
464
490
  Sample an individual pauli word (pauli string) and return the average result thereof.
465
491
  Parameters
@@ -497,8 +523,8 @@ class BackendCircuit():
497
523
  # on construction: tq.ExpectationValue(H=H, U=U, optimize_measurements=True)
498
524
  circuit = self.create_circuit(circuit=copy.deepcopy(self.circuit), abstract_circuit=basis_change)
499
525
  # run simulators
500
- counts = self.sample(samples=samples, circuit=circuit, read_out_qubits=qubits, variables=variables, *args,
501
- **kwargs)
526
+ counts = self.sample(samples=samples, circuit=circuit, read_out_qubits=qubits, variables=variables,
527
+ initial_state=initial_state, *args, **kwargs)
502
528
  # compute energy
503
529
  E = 0.0
504
530
  n_samples = 0
@@ -511,7 +537,7 @@ class BackendCircuit():
511
537
  E = E / samples * paulistring.coeff
512
538
  return E
513
539
 
514
- def do_sample(self, samples, circuit, noise, abstract_qubits=None, *args, **kwargs) -> QubitWaveFunction:
540
+ def do_sample(self, samples, circuit, noise, abstract_qubits=None, initial_state=0, *args, **kwargs) -> QubitWaveFunction:
515
541
  """
516
542
  helper function for sampling. MUST be overwritten by inheritors.
517
543
 
@@ -769,7 +795,7 @@ class BackendExpectationValue:
769
795
  def __deepcopy__(self, memodict={}):
770
796
  return type(self)(self.abstract_expectationvalue, **self._input_args)
771
797
 
772
- 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):
773
799
 
774
800
  variables = format_variable_dictionary(variables=variables)
775
801
  if self._variables is not None and len(self._variables) > 0:
@@ -777,11 +803,11 @@ class BackendExpectationValue:
777
803
  raise TequilaException(
778
804
  "BackendExpectationValue received not all variables. Circuit depends on variables {}, you gave {}".format(
779
805
  self._variables, variables))
780
-
806
+
781
807
  if samples is None:
782
- data = self.simulate(variables=variables, *args, **kwargs)
808
+ data = self.simulate(variables=variables, initial_state=initial_state, *args, **kwargs)
783
809
  else:
784
- data = self.sample(variables=variables, samples=samples, *args, **kwargs)
810
+ data = self.sample(variables=variables, samples=samples, initial_state=initial_state, *args, **kwargs)
785
811
 
786
812
  if self._shape is None and self._contraction is None:
787
813
  # this is the default
@@ -829,7 +855,7 @@ class BackendExpectationValue:
829
855
  """wrapper over circuit update_variables"""
830
856
  self._U.update_variables(variables=variables)
831
857
 
832
- 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:
833
859
  """
834
860
  sample the expectationvalue.
835
861
 
@@ -839,6 +865,8 @@ class BackendExpectationValue:
839
865
  variables to supply to the unitary.
840
866
  samples: int:
841
867
  number of samples to perform.
868
+ initial_state: int or QubitWaveFunction:
869
+ the initial state of the circuit
842
870
  args
843
871
  kwargs
844
872
 
@@ -856,7 +884,7 @@ class BackendExpectationValue:
856
884
  samples = max(1, int(self.abstract_expectationvalue.samples * total_samples))
857
885
  suggested = samples
858
886
  # samples are not necessarily set (either the user has to set it or some functions like optimize_measurements)
859
-
887
+
860
888
  if suggested is not None and suggested != samples:
861
889
  warnings.warn("simulating with samples={}, but expectationvalue carries suggested samples={}\nTry calling with samples='auto-total#ofsamples'".format(samples, suggested), TequilaWarning)
862
890
 
@@ -868,16 +896,16 @@ class BackendExpectationValue:
868
896
  if len(H.qubits) == 0:
869
897
  E = sum([ps.coeff for ps in H.paulistrings])
870
898
  elif H.is_all_z():
871
- E = self.U.sample_all_z_hamiltonian(samples=samples, hamiltonian=H, variables=variables, *args,
872
- **kwargs)
899
+ E = self.U.sample_all_z_hamiltonian(samples=samples, hamiltonian=H, variables=variables, initial_state=initial_state,
900
+ *args, **kwargs)
873
901
  else:
874
902
  for ps in H.paulistrings:
875
- E += self.U.sample_paulistring(samples=samples, paulistring=ps, variables=variables, *args,
876
- **kwargs)
903
+ E += self.U.sample_paulistring(samples=samples, paulistring=ps, variables=variables, initial_state=initial_state,
904
+ *args, **kwargs)
877
905
  result.append(to_float(E))
878
906
  return numpy.asarray(result)
879
907
 
880
- def simulate(self, variables, *args, **kwargs):
908
+ def simulate(self, variables, initial_state: Union[int, QubitWaveFunction], *args, **kwargs):
881
909
  """
882
910
  Simulate the expectationvalue.
883
911
 
@@ -885,6 +913,8 @@ class BackendExpectationValue:
885
913
  ----------
886
914
  variables:
887
915
  variables to supply to the unitary.
916
+ initial_state: int or QubitWaveFunction:
917
+ the initial state of the circuit
888
918
  args
889
919
  kwargs
890
920
 
@@ -899,7 +929,7 @@ class BackendExpectationValue:
899
929
  final_E = 0.0
900
930
  # TODO inefficient,
901
931
  # Always better to overwrite this function
902
- wfn = self.U.simulate(variables=variables, *args, **kwargs)
932
+ wfn = self.U.simulate(variables=variables, initial_state=initial_state, *args, **kwargs)
903
933
  final_E += wfn.compute_expectationvalue(operator=H)
904
934
  result.append(to_float(final_E))
905
935
  return numpy.asarray(result)