tequila-basic 1.9.0__tar.gz → 1.9.1__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 (126) hide show
  1. {tequila-basic-1.9.0/src/tequila_basic.egg-info → tequila-basic-1.9.1}/PKG-INFO +9 -1
  2. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/circuit/gates.py +8 -3
  3. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/optimizers/optimizer_gd.py +2 -1
  4. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/quantumchemistry/pyscf_interface.py +9 -1
  5. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/version.py +1 -1
  6. {tequila-basic-1.9.0 → tequila-basic-1.9.1/src/tequila_basic.egg-info}/PKG-INFO +9 -1
  7. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila_basic.egg-info/SOURCES.txt +34 -1
  8. tequila-basic-1.9.1/tests/test_TrotErr.py +118 -0
  9. tequila-basic-1.9.1/tests/test_adapt.py +72 -0
  10. tequila-basic-1.9.1/tests/test_array.py +39 -0
  11. tequila-basic-1.9.1/tests/test_binary_pauli.py +330 -0
  12. tequila-basic-1.9.1/tests/test_binary_utils.py +134 -0
  13. tequila-basic-1.9.1/tests/test_bitstrings.py +91 -0
  14. tequila-basic-1.9.1/tests/test_braket.py +277 -0
  15. tequila-basic-1.9.1/tests/test_chemistry.py +727 -0
  16. tequila-basic-1.9.1/tests/test_chemistry_f12.py +56 -0
  17. tequila-basic-1.9.1/tests/test_chemistry_madness.py +259 -0
  18. tequila-basic-1.9.1/tests/test_circuits.py +392 -0
  19. tequila-basic-1.9.1/tests/test_fermionic_meas.py +115 -0
  20. tequila-basic-1.9.1/tests/test_gd_optimizer.py +98 -0
  21. tequila-basic-1.9.1/tests/test_gpyopt.py +80 -0
  22. tequila-basic-1.9.1/tests/test_gradient.py +532 -0
  23. tequila-basic-1.9.1/tests/test_hamiltonian_arithmetic.py +342 -0
  24. tequila-basic-1.9.1/tests/test_krylov.py +43 -0
  25. tequila-basic-1.9.1/tests/test_mappings.py +104 -0
  26. tequila-basic-1.9.1/tests/test_noise.py +210 -0
  27. tequila-basic-1.9.1/tests/test_noise_opt.py +88 -0
  28. tequila-basic-1.9.1/tests/test_objectives.py +738 -0
  29. tequila-basic-1.9.1/tests/test_phoenics.py +68 -0
  30. tequila-basic-1.9.1/tests/test_pyzx.py +178 -0
  31. tequila-basic-1.9.1/tests/test_qasm.py +234 -0
  32. tequila-basic-1.9.1/tests/test_qtensor.py +80 -0
  33. tequila-basic-1.9.1/tests/test_recompilation_routines.py +160 -0
  34. tequila-basic-1.9.1/tests/test_scipy.py +151 -0
  35. tequila-basic-1.9.1/tests/test_simulator_backends.py +438 -0
  36. tequila-basic-1.9.1/tests/test_symbolic_simulator.py +57 -0
  37. tequila-basic-1.9.1/tests/test_torch_interface.py +59 -0
  38. tequila-basic-1.9.1/tests/test_unary_state_prep.py +83 -0
  39. tequila-basic-1.9.1/tests/test_variable.py +72 -0
  40. tequila-basic-1.9.1/tests/test_zzz_cleanup.py +10 -0
  41. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/LICENSE +0 -0
  42. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/MANIFEST.in +0 -0
  43. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/README.md +0 -0
  44. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/requirements.txt +0 -0
  45. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/setup.cfg +0 -0
  46. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/setup.py +0 -0
  47. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/__init__.py +0 -0
  48. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/apps/__init__.py +0 -0
  49. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/apps/_unary_state_prep_impl.py +0 -0
  50. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/apps/adapt/__init__.py +0 -0
  51. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/apps/adapt/adapt.py +0 -0
  52. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/apps/krylov/__init__.py +0 -0
  53. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/apps/krylov/krylov.py +0 -0
  54. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/apps/robustness/__init__.py +0 -0
  55. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/apps/robustness/helpers.py +0 -0
  56. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/apps/robustness/interval.py +0 -0
  57. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/apps/unary_state_prep.py +0 -0
  58. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/autograd_imports.py +0 -0
  59. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/circuit/__init__.py +0 -0
  60. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/circuit/_gates_impl.py +0 -0
  61. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/circuit/circuit.py +0 -0
  62. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/circuit/compiler.py +0 -0
  63. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/circuit/gradient.py +0 -0
  64. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/circuit/noise.py +0 -0
  65. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/circuit/pyzx.py +0 -0
  66. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/circuit/qasm.py +0 -0
  67. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/circuit/qpic.py +0 -0
  68. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/grouping/__init__.py +0 -0
  69. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/grouping/binary_rep.py +0 -0
  70. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/grouping/binary_utils.py +0 -0
  71. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/grouping/compile_groups.py +0 -0
  72. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/grouping/ev_utils.py +0 -0
  73. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/grouping/fermionic_functions.py +0 -0
  74. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/grouping/fermionic_methods.py +0 -0
  75. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/grouping/overlapping_methods.py +0 -0
  76. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/hamiltonian/__init__.py +0 -0
  77. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/hamiltonian/paulis.py +0 -0
  78. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/hamiltonian/paulistring.py +0 -0
  79. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/hamiltonian/qubit_hamiltonian.py +0 -0
  80. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/ml/__init__.py +0 -0
  81. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/ml/interface_torch.py +0 -0
  82. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/ml/ml_api.py +0 -0
  83. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/ml/utils_ml.py +0 -0
  84. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/objective/__init__.py +0 -0
  85. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/objective/braket.py +0 -0
  86. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/objective/objective.py +0 -0
  87. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/objective/qtensor.py +0 -0
  88. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/optimizers/__init__.py +0 -0
  89. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/optimizers/_containers.py +0 -0
  90. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/optimizers/optimizer_base.py +0 -0
  91. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/optimizers/optimizer_gpyopt.py +0 -0
  92. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/optimizers/optimizer_phoenics.py +0 -0
  93. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/optimizers/optimizer_scipy.py +0 -0
  94. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/quantumchemistry/__init__.py +0 -0
  95. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/quantumchemistry/chemistry_tools.py +0 -0
  96. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/quantumchemistry/encodings.py +0 -0
  97. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/quantumchemistry/madness_interface.py +0 -0
  98. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/quantumchemistry/orbital_optimizer.py +0 -0
  99. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/quantumchemistry/psi4_interface.py +0 -0
  100. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/quantumchemistry/qc_base.py +0 -0
  101. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/simulators/__init__.py +0 -0
  102. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/simulators/simulator_api.py +0 -0
  103. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/simulators/simulator_base.py +0 -0
  104. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/simulators/simulator_cirq.py +0 -0
  105. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/simulators/simulator_pyquil.py +0 -0
  106. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/simulators/simulator_qibo.py +0 -0
  107. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/simulators/simulator_qiskit.py +0 -0
  108. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/simulators/simulator_qlm.py +0 -0
  109. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/simulators/simulator_qulacs.py +0 -0
  110. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/simulators/simulator_qulacs_gpu.py +0 -0
  111. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/simulators/simulator_symbolic.py +0 -0
  112. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/tools/__init__.py +0 -0
  113. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/tools/convenience.py +0 -0
  114. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/tools/qng.py +0 -0
  115. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/tools/random_generators.py +0 -0
  116. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/utils/__init__.py +0 -0
  117. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/utils/bitstrings.py +0 -0
  118. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/utils/exceptions.py +0 -0
  119. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/utils/joined_transformation.py +0 -0
  120. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/utils/keymap.py +0 -0
  121. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/utils/misc.py +0 -0
  122. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/wavefunction/__init__.py +0 -0
  123. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila/wavefunction/qubit_wavefunction.py +0 -0
  124. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila_basic.egg-info/dependency_links.txt +0 -0
  125. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila_basic.egg-info/requires.txt +0 -0
  126. {tequila-basic-1.9.0 → tequila-basic-1.9.1}/src/tequila_basic.egg-info/top_level.txt +0 -0
@@ -1,12 +1,20 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tequila-basic
3
- Version: 1.9.0
3
+ Version: 1.9.1
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
7
7
  Author-email: jakob.kottmann@gmail.com
8
8
  Description-Content-Type: text/markdown
9
9
  License-File: LICENSE
10
+ Requires-Dist: numpy
11
+ Requires-Dist: scipy<1.11
12
+ Requires-Dist: sympy
13
+ Requires-Dist: autograd
14
+ Requires-Dist: setuptools
15
+ Requires-Dist: pytest
16
+ Requires-Dist: openfermion~=1.0
17
+ Requires-Dist: dataclasses; python_version < "3.7"
10
18
 
11
19
  [![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)
12
20
 
@@ -1081,10 +1081,14 @@ class QubitExcitationImpl(impl.GeneralizedRotationImpl):
1081
1081
  def compile(self, exponential_pauli=False, *args, **kwargs):
1082
1082
  # optimized compiling for single and double qubit excitaitons following arxiv:2005.14475
1083
1083
  # Alternative representation in arxiv:2104.05695 (not implemented -> could be added and controlled with optional compile keywords)
1084
+ if self.is_controlled():
1085
+ control = list(self.control)
1086
+ else:
1087
+ control = []
1084
1088
  if self.compile_options == "optimize" and len(self.target) == 2 and exponential_pauli:
1085
1089
  p,q = self.target
1086
1090
  U0 = X(target=p, control=q)
1087
- U1 = Ry(angle=self.parameter, target=q, control=p)
1091
+ U1 = Ry(angle=self.parameter, target=q, control=[p]+control)
1088
1092
  return U0 + U1 + U0
1089
1093
  elif self.compile_options == "optimize" and len(self.target) == 4 and exponential_pauli:
1090
1094
  p,r,q,s = self.target
@@ -1093,10 +1097,11 @@ class QubitExcitationImpl(impl.GeneralizedRotationImpl):
1093
1097
  U0 += X(target=r, control=p)
1094
1098
  U0 += X(target=q)
1095
1099
  U0 += X(target=s)
1096
- U1 = Ry(angle=-self.parameter, target=p, control=[q,r,s])
1100
+ U1 = Ry(angle=-self.parameter, target=p, control=[q,r,s]+control)
1097
1101
  return U0 + U1 + U0.dagger()
1098
1102
  else:
1099
- return Trotterized(angle=self.parameter, generator=self.generator, steps=1)
1103
+ return Trotterized(angle=self.parameter, generator=self.generator, steps=1, control=self.control)
1104
+
1100
1105
 
1101
1106
  def _convert_Paulistring(paulistring: typing.Union[PauliString, str, dict]) -> PauliString:
1102
1107
  '''
@@ -334,11 +334,12 @@ class OptimizerGD(Optimizer):
334
334
 
335
335
 
336
336
  if not self.silent:
337
+ self.__dx = numpy.asarray(self.__dx)
337
338
  print("%3i %+15.8f %+7.2e %7.3e %7.3e %s"
338
339
  % (step,
339
340
  e,
340
341
  e-last,
341
- numpy.max(abs(self.__dx)),
342
+ numpy.max([abs(x) for x in self.__dx]),
342
343
  numpy.sqrt(numpy.average(self.__dx**2)),
343
344
  comment))
344
345
 
@@ -46,7 +46,15 @@ class QuantumChemistryPySCF(QuantumChemistryBase):
46
46
  # solve restricted HF
47
47
  mf = pyscf.scf.RHF(mol)
48
48
  mf.kernel()
49
- self.irreps = mf.get_irrep_nelec()
49
+
50
+ # only works if point_group is not C1
51
+ # otherwise PySCF uses a different SCF object
52
+ # irrep information is however not critical to tequila
53
+ if hasattr(mf, "get_irrep_nelec"):
54
+ self.irreps = mf.get_irrep_nelec()
55
+ else:
56
+ self.irreps = None
57
+
50
58
  orbital_energies = mf.mo_energy
51
59
 
52
60
  # compute mo integrals
@@ -1,2 +1,2 @@
1
- __version__ = "1.9.0"
1
+ __version__ = "1.9.1"
2
2
  __author__ = "Tequila Developers "
@@ -1,12 +1,20 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tequila-basic
3
- Version: 1.9.0
3
+ Version: 1.9.1
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
7
7
  Author-email: jakob.kottmann@gmail.com
8
8
  Description-Content-Type: text/markdown
9
9
  License-File: LICENSE
10
+ Requires-Dist: numpy
11
+ Requires-Dist: scipy<1.11
12
+ Requires-Dist: sympy
13
+ Requires-Dist: autograd
14
+ Requires-Dist: setuptools
15
+ Requires-Dist: pytest
16
+ Requires-Dist: openfermion~=1.0
17
+ Requires-Dist: dataclasses; python_version < "3.7"
10
18
 
11
19
  [![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)
12
20
 
@@ -88,4 +88,37 @@ src/tequila_basic.egg-info/PKG-INFO
88
88
  src/tequila_basic.egg-info/SOURCES.txt
89
89
  src/tequila_basic.egg-info/dependency_links.txt
90
90
  src/tequila_basic.egg-info/requires.txt
91
- src/tequila_basic.egg-info/top_level.txt
91
+ src/tequila_basic.egg-info/top_level.txt
92
+ tests/test_TrotErr.py
93
+ tests/test_adapt.py
94
+ tests/test_array.py
95
+ tests/test_binary_pauli.py
96
+ tests/test_binary_utils.py
97
+ tests/test_bitstrings.py
98
+ tests/test_braket.py
99
+ tests/test_chemistry.py
100
+ tests/test_chemistry_f12.py
101
+ tests/test_chemistry_madness.py
102
+ tests/test_circuits.py
103
+ tests/test_fermionic_meas.py
104
+ tests/test_gd_optimizer.py
105
+ tests/test_gpyopt.py
106
+ tests/test_gradient.py
107
+ tests/test_hamiltonian_arithmetic.py
108
+ tests/test_krylov.py
109
+ tests/test_mappings.py
110
+ tests/test_noise.py
111
+ tests/test_noise_opt.py
112
+ tests/test_objectives.py
113
+ tests/test_phoenics.py
114
+ tests/test_pyzx.py
115
+ tests/test_qasm.py
116
+ tests/test_qtensor.py
117
+ tests/test_recompilation_routines.py
118
+ tests/test_scipy.py
119
+ tests/test_simulator_backends.py
120
+ tests/test_symbolic_simulator.py
121
+ tests/test_torch_interface.py
122
+ tests/test_unary_state_prep.py
123
+ tests/test_variable.py
124
+ tests/test_zzz_cleanup.py
@@ -0,0 +1,118 @@
1
+ from tequila.trotter_err.main_trot import EstTrotErr
2
+ import numpy as np
3
+ import tequila as tq
4
+ from tequila.hamiltonian import QubitHamiltonian, PauliString
5
+ from tequila.grouping.binary_rep import BinaryPauliString, BinaryHamiltonian
6
+ from tequila.grouping.fermionic_methods import do_svd
7
+ from tequila.grouping.fermionic_functions import obt_to_ferm, convert_tbts_to_frags
8
+ from tequila.grouping.fermionic_functions import n_elec
9
+ import openfermion
10
+ import pytest
11
+
12
+ HAS_PYSCF = "pyscf" in tq.quantumchemistry.INSTALLED_QCHEMISTRY_BACKENDS
13
+
14
+ def build_toymol():
15
+ '''
16
+ Build the qubit Hamiltonian with Jordan Wigner encoding for H2 at a particular geometry.
17
+ '''
18
+
19
+ trafo = "JordanWigner"
20
+ mol = tq.chemistry.Molecule(
21
+ geometry="H 0.0 0.0 0.0 \n H 0.0 0.0 1.0",
22
+ basis_set="sto3g",
23
+ transformation=trafo,
24
+ backend='pyscf'
25
+ )
26
+ H = mol.make_hamiltonian()
27
+
28
+ Hferm = mol.make_molecular_hamiltonian()
29
+
30
+ return H,openfermion.get_fermion_operator(Hferm)
31
+
32
+ def get_fclf(H):
33
+ '''
34
+ Get the Hamiltonian fragments under the qubit FC-LF partition method, as explained in JCTC 16, 2400 (2020))
35
+ '''
36
+
37
+ Hbin = BinaryHamiltonian.init_from_qubit_hamiltonian(H)
38
+ options={"method":"lf", "condition": "fc"}
39
+
40
+ commuting_parts, _ = Hbin.commuting_groups(options=options)
41
+ print("Number of FC-LF groups: {}".format(len(commuting_parts)))
42
+
43
+ ListFrags=[]
44
+
45
+ for i in range(len(commuting_parts)):
46
+ tqqubFrag=commuting_parts[i].to_qubit_hamiltonian()
47
+ ListFrags.append(tqqubFrag.to_openfermion())
48
+
49
+ return ListFrags
50
+
51
+ def get_fcsi(H):
52
+ '''
53
+ Get the Hamiltonian fragments under the qubit FC-SI partition method, as explained in JCTC 16, 2400 (2020))
54
+ '''
55
+
56
+ Hbin = BinaryHamiltonian.init_from_qubit_hamiltonian(H)
57
+ options={"method":"si", "condition": "fc"}
58
+
59
+ commuting_parts, _ = Hbin.commuting_groups(options=options)
60
+ print("Number of FC-SI groups: {}".format(len(commuting_parts)))
61
+
62
+ ListFrags=[]
63
+
64
+ for i in range(len(commuting_parts)):
65
+ tqqubFrag=commuting_parts[i].to_qubit_hamiltonian()
66
+ ListFrags.append(tqqubFrag.to_openfermion())
67
+
68
+ return ListFrags
69
+
70
+ #set opf routines to get LR fragments...
71
+ def cartan_to_fermionic_operator(cobt, ctbts, orb_rot):
72
+ '''
73
+ Turn Hamiltonian fragments in their diagonal form into OpenFermion's FermionOperator.
74
+ '''
75
+ obt = np.einsum("pa, qb, ab", orb_rot[0], orb_rot[0], cobt)
76
+ tbts = np.einsum("ipa, iqb, irc, isd, iabcd -> ipqrs",
77
+ orb_rot[1:], orb_rot[1:], orb_rot[1:], orb_rot[1:], ctbts)
78
+ ferm_ops = [obt_to_ferm(obt,True)] + convert_tbts_to_frags(tbts, True)
79
+ return ferm_ops
80
+
81
+ def get_LR(Hferm,name="h2"):
82
+ '''
83
+ Get Low-Rank Hamiltonian fragments, according to the technique outlined in npj Quantum Information 7, 83 (2021)
84
+ '''
85
+
86
+ orb_rots, cartan_obt, cartan_tbts, meas_alloc = do_svd(Hferm, n_elec(name))
87
+
88
+ ferm_ops = cartan_to_fermionic_operator(cartan_obt, cartan_tbts, orb_rots)
89
+
90
+ return ferm_ops
91
+
92
+ #####Testing functions.....
93
+ @pytest.mark.skipif(condition=not HAS_PYSCF, reason="you don't have pyscf")
94
+ def test_FCLF():
95
+ Hq,Hferm=build_toymol()
96
+ FCLFFrags=get_fclf(Hq)
97
+ nqubs=openfermion.count_qubits(Hferm)
98
+ alpha=EstTrotErr(FCLFFrags,nqubs)
99
+
100
+ assert np.isclose(alpha, 0.42117695296, atol=1.e-4)
101
+
102
+ @pytest.mark.skipif(condition=not HAS_PYSCF, reason="you don't have pyscf")
103
+ def test_FCSI():
104
+ Hq,Hferm=build_toymol()
105
+ FCSIFrags=get_fcsi(Hq)
106
+ nqubs=openfermion.count_qubits(Hferm)
107
+ alpha=EstTrotErr(FCSIFrags,nqubs)
108
+
109
+ assert np.isclose(alpha, 0.42117695296, atol=1.e-4)
110
+
111
+ @pytest.mark.skipif(condition=not HAS_PYSCF, reason="you don't have pyscf")
112
+ def test_LR():
113
+ Hq,Hferm=build_toymol()
114
+ LRFrags=get_LR(Hferm)
115
+ nqubs=openfermion.count_qubits(Hferm)
116
+ alpha=EstTrotErr(LRFrags,nqubs)
117
+
118
+ assert np.isclose(alpha, 0.42178077369, atol=1.e-4)
@@ -0,0 +1,72 @@
1
+ import tequila as tq
2
+ import numpy
3
+
4
+
5
+ def test_simple_example():
6
+ H = tq.paulis.X(0)
7
+ Upre = tq.gates.X(0)
8
+ Upost = tq.gates.Y(0)
9
+ generators = [tq.paulis.Y(0), tq.paulis.Z(0), tq.paulis.X(0)]
10
+ operator_pool = tq.adapt.AdaptPoolBase(generators=generators)
11
+ solver = tq.adapt.Adapt(H=H, operator_pool=operator_pool, Upre=Upre, UPost=Upost)
12
+ result = solver()
13
+ assert numpy.isclose(result.energy, -1.0, atol=1.e-4)
14
+
15
+
16
+ def make_test_molecule():
17
+ one = numpy.array([[-1.94102524, -0.31651552],
18
+ [-0.31651552, -0.0887454]])
19
+ two = numpy.array([[[[1.02689005, 0.31648659],
20
+ [0.31648659, 0.22767214]],
21
+
22
+ [[0.31648659, 0.22767214],
23
+ [0.85813498, 0.25556095]]],
24
+
25
+ [[[0.31648659, 0.85813498],
26
+ [0.22767214, 0.25556095]],
27
+
28
+ [[0.22767214, 0.25556095],
29
+ [0.25556095, 0.76637672]]]])
30
+
31
+ return tq.Molecule(geometry="He 0.0 0.0 0.0", backend="base", one_body_integrals=one, two_body_integrals=two)
32
+
33
+
34
+ def test_molecular_example():
35
+ mol = make_test_molecule()
36
+ Upost = mol.make_excitation_gate(angle="a", indices=[(0, 2)])
37
+ Upost += mol.make_excitation_gate(angle="a", indices=[(1, 3)])
38
+ operator_pool = tq.adapt.MolecularPool(molecule=mol, indices="UpCCSD")
39
+ solver = tq.adapt.Adapt(H=mol.make_hamiltonian(), Upre=mol.prepare_reference(),Upost=Upost, operator_pool=operator_pool)
40
+ result = solver(operator_pool=operator_pool, label=0)
41
+ energy = numpy.linalg.eigvalsh(mol.make_hamiltonian().to_matrix())[0]
42
+ assert numpy.isclose(result.energy, energy, atol=1.e-4)
43
+
44
+ def test_molecular_excited_example():
45
+ mol = make_test_molecule()
46
+
47
+ H = mol.make_hamiltonian()
48
+ eigenvalues, eigenvectors = numpy.linalg.eigh(H.to_matrix())
49
+ n_qubits = H.n_qubits
50
+ reference_basis_state = 2 ** (n_qubits - 1) + 2 ** (n_qubits - 2)
51
+ energies = []
52
+ for i in range(len(eigenvalues)):
53
+ if not numpy.isclose(eigenvectors[:, i][reference_basis_state], 0.0, atol=1.e-4):
54
+ energies.append(eigenvalues[i])
55
+
56
+ operator_pool = tq.adapt.MolecularPool(molecule=mol, indices="UpCCSD")
57
+
58
+ circuits = []
59
+ variables = {}
60
+ for state in range(3):
61
+ Upre = mol.prepare_reference()
62
+ objective_factory = tq.adapt.ObjectiveFactorySequentialExcitedState(Upre=mol.prepare_reference(),
63
+ H=mol.make_hamiltonian(), circuits=circuits,
64
+ factors=[100.0] * len(circuits))
65
+ solver = tq.adapt.Adapt(objective_factory=objective_factory,
66
+ Upre=mol.prepare_reference(),
67
+ operator_pool=operator_pool)
68
+ result = solver(operator_pool=operator_pool, label=state, static_variables=variables)
69
+ U = Upre + result.U
70
+ circuits.append(U)
71
+ variables = {**variables, **result.variables}
72
+ assert numpy.isclose(result.energy, energies[state], atol=1.e-4)
@@ -0,0 +1,39 @@
1
+ import tequila as tq
2
+ import pytest, numpy
3
+
4
+ # Backends
5
+ import select_backends
6
+ backends = select_backends.get()
7
+
8
+
9
+ @pytest.mark.parametrize("backend", backends)
10
+ def test_array_computation(backend):
11
+ U = tq.gates.X(target=0)
12
+ hamiltonians = [tq.paulis.I(), tq.paulis.X(0), tq.paulis.Y(0), tq.paulis.Z(0)]
13
+ E = tq.ExpectationValue(H=hamiltonians, U=U, shape=[4])
14
+ result = tq.simulate(E, backend=backend)
15
+ assert all(result == numpy.asarray([1.0, 0.0, 0.0, -1.0]))
16
+
17
+ @pytest.mark.parametrize("backend", backends)
18
+ @pytest.mark.parametrize("shape", [(4,),(2,2)])
19
+ def test_array_shape(backend, shape):
20
+ expected = numpy.asarray([1.0, 0.0, 0.0, -1.0]).reshape(shape)
21
+ U = tq.gates.X(target=0)
22
+ hamiltonians = [tq.paulis.I(), tq.paulis.X(0), tq.paulis.Y(0), tq.paulis.Z(0)]
23
+ E = tq.ExpectationValue(H=hamiltonians, U=U, shape=shape)
24
+ result = tq.simulate(E, backend=backend)
25
+ assert (result == expected).all()
26
+
27
+ @pytest.mark.parametrize("backend", backends)
28
+ @pytest.mark.parametrize("shape", [(2,2)])
29
+ def test_array_contraction(backend, shape):
30
+ def contraction(array):
31
+ bra = numpy.asarray([1.0, 1.0, 1.0, -1.0]).reshape(shape)
32
+ return numpy.trace(bra.dot(array))
33
+
34
+ expected = numpy.asarray([1.0, 0.0, 0.0, -1.0]).reshape(shape)
35
+ U = tq.gates.X(target=0)
36
+ hamiltonians = [tq.paulis.I(), tq.paulis.X(0), tq.paulis.Y(0), tq.paulis.Z(0)]
37
+ E = tq.ExpectationValue(H=hamiltonians, U=U, shape=shape, contraction=contraction)
38
+ result = tq.simulate(E, backend=backend)
39
+ assert result == contraction(expected)