tequila-basic 1.9.7__py3-none-any.whl → 1.9.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tequila/apps/unary_state_prep.py +1 -2
- tequila/hamiltonian/paulis.py +4 -3
- tequila/quantumchemistry/encodings.py +2 -2
- tequila/quantumchemistry/orbital_optimizer.py +9 -2
- tequila/simulators/simulator_api.py +25 -9
- tequila/simulators/simulator_base.py +35 -12
- tequila/simulators/simulator_cirq.py +6 -6
- tequila/simulators/simulator_pyquil.py +3 -3
- tequila/simulators/simulator_qibo.py +14 -16
- tequila/simulators/simulator_qiskit.py +86 -49
- tequila/simulators/simulator_qiskit_gpu.py +9 -0
- tequila/simulators/simulator_qlm.py +3 -3
- tequila/simulators/simulator_qulacs.py +24 -19
- tequila/simulators/simulator_qulacs_gpu.py +6 -4
- tequila/simulators/simulator_symbolic.py +15 -23
- tequila/utils/bitstrings.py +8 -3
- tequila/version.py +1 -1
- tequila/wavefunction/qubit_wavefunction.py +338 -238
- {tequila_basic-1.9.7.dist-info → tequila_basic-1.9.8.dist-info}/METADATA +3 -8
- {tequila_basic-1.9.7.dist-info → tequila_basic-1.9.8.dist-info}/RECORD +23 -22
- {tequila_basic-1.9.7.dist-info → tequila_basic-1.9.8.dist-info}/WHEEL +1 -1
- {tequila_basic-1.9.7.dist-info → tequila_basic-1.9.8.dist-info}/LICENSE +0 -0
- {tequila_basic-1.9.7.dist-info → tequila_basic-1.9.8.dist-info}/top_level.txt +0 -0
tequila/apps/unary_state_prep.py
CHANGED
@@ -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 (
|
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)
|
tequila/hamiltonian/paulis.py
CHANGED
@@ -256,7 +256,7 @@ def Projector(wfn, threshold=0.0, n_qubits=None) -> QubitHamiltonian:
|
|
256
256
|
|
257
257
|
"""
|
258
258
|
|
259
|
-
wfn = QubitWaveFunction(
|
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
|
-
|
308
|
-
|
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():
|
@@ -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.
|
131
|
+
wfn = QubitWaveFunction.from_basis_state(n_qubits, 0)
|
132
132
|
wfn = wfn.apply_qubitoperator(operator=op)
|
133
|
-
assert
|
133
|
+
assert wfn.length() == 1
|
134
134
|
key = list(wfn.keys())[0].array
|
135
135
|
return key
|
136
136
|
|
@@ -208,11 +208,16 @@ 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)
|
216
221
|
elif self.circuit is None:
|
217
222
|
raise Exception("Orbital Optimizer: Either provide a callable vqe_solver or a circuit")
|
218
223
|
else:
|
@@ -233,8 +238,9 @@ class PySCFVQEWrapper:
|
|
233
238
|
# static ansatz
|
234
239
|
U = self.circuit
|
235
240
|
|
236
|
-
rdm1
|
237
|
-
|
241
|
+
if rdm1 is None or rdm2 is None:
|
242
|
+
rdm1, rdm2 = molecule.compute_rdms(U=U, variables=result.variables, spin_free=True, get_rdm1=True, get_rdm2=True, use_hcb=restrict_to_hcb)
|
243
|
+
rdm2 = self.reorder(rdm2, 'dirac', 'mulliken')
|
238
244
|
if not self.silent:
|
239
245
|
print("{:20} : {}".format("energy", result.energy))
|
240
246
|
if len(self.history) > 0:
|
@@ -259,3 +265,4 @@ class PySCFVQEWrapper:
|
|
259
265
|
else:
|
260
266
|
result += "{:30} : {}\n".format(k, v)
|
261
267
|
return result
|
268
|
+
|
@@ -9,9 +9,10 @@ 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 = ["
|
14
|
-
SUPPORTED_NOISE_BACKENDS = ["qiskit",
|
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
|
15
16
|
BackendTypes = namedtuple('BackendTypes', 'CircType ExpValueType')
|
16
17
|
INSTALLED_SIMULATORS = {}
|
17
18
|
INSTALLED_SAMPLERS = {}
|
@@ -22,7 +23,6 @@ if typing.TYPE_CHECKING:
|
|
22
23
|
from tequila.objective import Objective, Variable
|
23
24
|
from tequila.circuit.gates import QCircuit
|
24
25
|
import numbers.Real as RealNumber
|
25
|
-
from tequila.wavefunction.qubit_wavefunction import QubitWaveFunction
|
26
26
|
|
27
27
|
"""
|
28
28
|
Check which simulators are installed
|
@@ -43,6 +43,19 @@ except ImportError:
|
|
43
43
|
HAS_QISKIT = False
|
44
44
|
HAS_QISKIT_NOISE = False
|
45
45
|
|
46
|
+
try:
|
47
|
+
pkg_resources.require("qiskit-aer-gpu")
|
48
|
+
from tequila.simulators.simulator_qiskit_gpu import BackendCircuitQiskitGpu, BackendExpectationValueQiskitGpu
|
49
|
+
HAS_QISKIT_GPU = True
|
50
|
+
INSTALLED_SIMULATORS["qiskit_gpu"] = BackendTypes(BackendCircuitQiskitGpu, BackendExpectationValueQiskitGpu)
|
51
|
+
INSTALLED_SAMPLERS["qiskit_gpu"] = BackendTypes(BackendCircuitQiskitGpu, BackendExpectationValueQiskitGpu)
|
52
|
+
from tequila.simulators.simulator_qiskit import HAS_NOISE as HAS_QISKIT_GPU_NOISE
|
53
|
+
if HAS_QISKIT_GPU_NOISE:
|
54
|
+
INSTALLED_NOISE_SAMPLERS["qiskit_gpu"] = BackendTypes(BackendCircuitQiskitGpu, BackendExpectationValueQiskitGpu)
|
55
|
+
except (ImportError, DistributionNotFound):
|
56
|
+
HAS_QISKIT_GPU = False
|
57
|
+
HAS_QISKIT_GPU_NOISE = False
|
58
|
+
|
46
59
|
HAS_QIBO = True
|
47
60
|
try:
|
48
61
|
from tequila.simulators.simulator_qibo import BackendCircuitQibo, BackendExpectationValueQibo
|
@@ -82,8 +95,8 @@ except (ImportError, DistributionNotFound):
|
|
82
95
|
HAS_QULACS = False
|
83
96
|
|
84
97
|
try:
|
85
|
-
pkg_resources.require("qulacs-gpu")
|
86
|
-
import
|
98
|
+
# pkg_resources.require("qulacs-gpu")
|
99
|
+
from qulacs import QuantumStateGpu
|
87
100
|
from tequila.simulators.simulator_qulacs_gpu import BackendCircuitQulacsGpu, BackendExpectationValueQulacsGpu
|
88
101
|
|
89
102
|
HAS_QULACS_GPU = True
|
@@ -350,14 +363,15 @@ def compile_circuit(abstract_circuit: 'QCircuit',
|
|
350
363
|
return CircType(abstract_circuit=abstract_circuit, variables=variables, noise=noise, device=device, *args, **kwargs)
|
351
364
|
|
352
365
|
|
353
|
-
def simulate(objective: typing.Union['Objective', 'QCircuit','QTensor'],
|
366
|
+
def simulate(objective: typing.Union['Objective', 'QCircuit', 'QTensor'],
|
354
367
|
variables: Dict[Union[Variable, Hashable], RealNumber] = None,
|
355
368
|
samples: int = None,
|
356
369
|
backend: str = None,
|
357
370
|
noise: NoiseModel = None,
|
358
371
|
device: str = None,
|
372
|
+
initial_state: Union[int, QubitWaveFunction] = 0,
|
359
373
|
*args,
|
360
|
-
**kwargs) -> Union[RealNumber,
|
374
|
+
**kwargs) -> Union[RealNumber, QubitWaveFunction]:
|
361
375
|
"""Simulate a tequila objective or circuit
|
362
376
|
|
363
377
|
Parameters
|
@@ -375,6 +389,8 @@ def simulate(objective: typing.Union['Objective', 'QCircuit','QTensor'],
|
|
375
389
|
specify a noise model to apply to simulation/sampling
|
376
390
|
device:
|
377
391
|
a device upon which (or in emulation of which) to sample
|
392
|
+
initial_state: int or QubitWaveFunction:
|
393
|
+
the initial state of the circuit
|
378
394
|
*args :
|
379
395
|
|
380
396
|
**kwargs :
|
@@ -394,9 +410,9 @@ def simulate(objective: typing.Union['Objective', 'QCircuit','QTensor'],
|
|
394
410
|
objective.extract_variables()))
|
395
411
|
|
396
412
|
compiled_objective = compile(objective=objective, samples=samples, variables=variables, backend=backend,
|
397
|
-
noise=noise,device=device, *args, **kwargs)
|
413
|
+
noise=noise, device=device, *args, **kwargs)
|
398
414
|
|
399
|
-
return compiled_objective(variables=variables, samples=samples, *args, **kwargs)
|
415
|
+
return compiled_objective(variables=variables, samples=samples, initial_state=initial_state, *args, **kwargs)
|
400
416
|
|
401
417
|
|
402
418
|
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
|
-
|
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.
|
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,7 +427,9 @@ 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
|
-
|
430
|
+
|
431
|
+
return self.do_sample(samples=samples, circuit=circuit, read_out_qubits=read_out_qubits,
|
432
|
+
initial_state=initial_state, *args, **kwargs)
|
410
433
|
|
411
434
|
def sample_all_z_hamiltonian(self, samples: int, hamiltonian, variables, *args, **kwargs):
|
412
435
|
"""
|
@@ -511,7 +534,7 @@ class BackendCircuit():
|
|
511
534
|
E = E / samples * paulistring.coeff
|
512
535
|
return E
|
513
536
|
|
514
|
-
def do_sample(self, samples, circuit, noise, abstract_qubits=None, *args, **kwargs) -> QubitWaveFunction:
|
537
|
+
def do_sample(self, samples, circuit, noise, abstract_qubits=None, initial_state=0, *args, **kwargs) -> QubitWaveFunction:
|
515
538
|
"""
|
516
539
|
helper function for sampling. MUST be overwritten by inheritors.
|
517
540
|
|
@@ -777,7 +800,7 @@ class BackendExpectationValue:
|
|
777
800
|
raise TequilaException(
|
778
801
|
"BackendExpectationValue received not all variables. Circuit depends on variables {}, you gave {}".format(
|
779
802
|
self._variables, variables))
|
780
|
-
|
803
|
+
|
781
804
|
if samples is None:
|
782
805
|
data = self.simulate(variables=variables, *args, **kwargs)
|
783
806
|
else:
|
@@ -856,7 +879,7 @@ class BackendExpectationValue:
|
|
856
879
|
samples = max(1, int(self.abstract_expectationvalue.samples * total_samples))
|
857
880
|
suggested = samples
|
858
881
|
# samples are not necessarily set (either the user has to set it or some functions like optimize_measurements)
|
859
|
-
|
882
|
+
|
860
883
|
if suggested is not None and suggested != samples:
|
861
884
|
warnings.warn("simulating with samples={}, but expectationvalue carries suggested samples={}\nTry calling with samples='auto-total#ofsamples'".format(samples, suggested), TequilaWarning)
|
862
885
|
|
@@ -173,7 +173,7 @@ class BackendCircuitCirq(BackendCircuit):
|
|
173
173
|
simulator = cirq.Simulator()
|
174
174
|
backend_result = simulator.simulate(program=self.circuit, param_resolver=self.resolver,
|
175
175
|
initial_state=initial_state)
|
176
|
-
return QubitWaveFunction.from_array(
|
176
|
+
return QubitWaveFunction.from_array(array=backend_result.final_state_vector, numbering=self.numbering)
|
177
177
|
|
178
178
|
def convert_measurements(self, backend_result: cirq.Result) -> QubitWaveFunction:
|
179
179
|
"""
|
@@ -186,18 +186,18 @@ class BackendCircuitCirq(BackendCircuit):
|
|
186
186
|
Returns
|
187
187
|
-------
|
188
188
|
QubitWaveFunction:
|
189
|
-
the result of sampling, as a tequila
|
189
|
+
the result of sampling, as a tequila QubitWaveFunction.
|
190
190
|
|
191
191
|
"""
|
192
192
|
assert (len(backend_result.measurements) == 1)
|
193
193
|
for key, value in backend_result.measurements.items():
|
194
|
-
counter = QubitWaveFunction()
|
194
|
+
counter = QubitWaveFunction(self.n_qubits, self.numbering)
|
195
195
|
for sample in value:
|
196
196
|
binary = BitString.from_array(array=sample.astype(int))
|
197
|
-
if binary in counter.
|
198
|
-
counter
|
197
|
+
if binary in counter.keys():
|
198
|
+
counter[binary] += 1
|
199
199
|
else:
|
200
|
-
counter
|
200
|
+
counter[binary] = 1
|
201
201
|
return counter
|
202
202
|
|
203
203
|
def do_sample(self, samples, circuit, *args, **kwargs) -> QubitWaveFunction:
|
@@ -439,7 +439,7 @@ class BackendCircuitPyquil(BackendCircuit):
|
|
439
439
|
if val > 0:
|
440
440
|
iprep += pyquil.gates.X(i)
|
441
441
|
backend_result = simulator.wavefunction(iprep + self.circuit, memory_map=self.resolver)
|
442
|
-
return QubitWaveFunction.from_array(
|
442
|
+
return QubitWaveFunction.from_array(array=backend_result.amplitudes, numbering=self.numbering)
|
443
443
|
|
444
444
|
def do_sample(self, samples, circuit, *args, **kwargs) -> QubitWaveFunction:
|
445
445
|
"""
|
@@ -495,7 +495,7 @@ class BackendCircuitPyquil(BackendCircuit):
|
|
495
495
|
listing.append(int(letter))
|
496
496
|
return listing
|
497
497
|
|
498
|
-
result = QubitWaveFunction()
|
498
|
+
result = QubitWaveFunction(self.n_qubits, self.numbering)
|
499
499
|
bit_dict = {}
|
500
500
|
for b in backend_result:
|
501
501
|
try:
|
@@ -505,7 +505,7 @@ class BackendCircuitPyquil(BackendCircuit):
|
|
505
505
|
|
506
506
|
for k, v in bit_dict.items():
|
507
507
|
arr = string_to_array(k)
|
508
|
-
result
|
508
|
+
result[BitString.from_array(arr)] = v
|
509
509
|
return result
|
510
510
|
|
511
511
|
def no_translation(self, abstract_circuit):
|
@@ -356,20 +356,20 @@ class BackendCircuitQibo(BackendCircuit):
|
|
356
356
|
n_qubits = max(self.highest_qubit + 1, self.n_qubits, self.abstract_circuit.max_qubit() + 1)
|
357
357
|
if initial_state is not None:
|
358
358
|
if isinstance(initial_state, (int, np.int64)):
|
359
|
-
wave = QubitWaveFunction.
|
359
|
+
wave = QubitWaveFunction.from_basis_state(n_qubits, initial_state, self.numbering)
|
360
360
|
elif isinstance(initial_state, str):
|
361
|
-
wave = QubitWaveFunction.from_string(
|
361
|
+
wave = QubitWaveFunction.from_string(initial_state, self.numbering).to_array()
|
362
362
|
elif isinstance(initial_state, QubitWaveFunction):
|
363
363
|
wave = initial_state
|
364
364
|
elif isinstance(initial_state,np.ndarray):
|
365
|
-
wave = QubitWaveFunction.from_array(initial_state)
|
365
|
+
wave = QubitWaveFunction.from_array(initial_state, self.numbering)
|
366
366
|
else:
|
367
367
|
raise TequilaQiboException('could not understand initial state of type {}'.format(type(initial_state)))
|
368
368
|
state = wave.to_array()
|
369
369
|
result = self.circuit(state)
|
370
370
|
else:
|
371
371
|
result = self.circuit()
|
372
|
-
back= QubitWaveFunction.from_array(
|
372
|
+
back= QubitWaveFunction.from_array(result.numpy(), self.numbering)
|
373
373
|
return back
|
374
374
|
|
375
375
|
def simulate(self, variables, initial_state=0, *args, **kwargs) -> QubitWaveFunction:
|
@@ -398,7 +398,7 @@ class BackendCircuitQibo(BackendCircuit):
|
|
398
398
|
if isinstance(initial_state, BitString):
|
399
399
|
initial_state = initial_state.integer
|
400
400
|
if isinstance(initial_state, QubitWaveFunction):
|
401
|
-
if
|
401
|
+
if initial_state.length() != 1:
|
402
402
|
return self.do_simulate(variables=variables,initial_state=initial_state, *args, **kwargs)
|
403
403
|
initial_state = list(initial_state.keys())[0].integer
|
404
404
|
if isinstance(initial_state,np.ndarray):
|
@@ -426,19 +426,18 @@ class BackendCircuitQibo(BackendCircuit):
|
|
426
426
|
results transformed to tequila native QubitWaveFunction
|
427
427
|
"""
|
428
428
|
|
429
|
-
result = QubitWaveFunction()
|
429
|
+
result = QubitWaveFunction(self.n_qubits, self.numbering)
|
430
430
|
# todo there are faster ways
|
431
431
|
|
432
432
|
for k, v in backend_result.frequencies(binary=True).items():
|
433
433
|
converted_key = BitString.from_bitstring(other=BitString.from_binary(binary=k))
|
434
|
-
result
|
435
|
-
|
434
|
+
result[converted_key] = v
|
436
435
|
|
437
436
|
if target_qubits is not None:
|
438
437
|
mapped_target = [self.qubit_map[q].number for q in target_qubits]
|
439
438
|
mapped_full = [self.qubit_map[q].number for q in self.abstract_qubits]
|
440
439
|
keymap = KeyMapRegisterToSubregister(subregister=mapped_target, register=mapped_full)
|
441
|
-
result =
|
440
|
+
result = QubitWaveFunction.from_wavefunction(result, keymap, len(mapped_target))
|
442
441
|
|
443
442
|
return result
|
444
443
|
|
@@ -521,21 +520,20 @@ class BackendCircuitQibo(BackendCircuit):
|
|
521
520
|
n_qubits = max(self.highest_qubit + 1, self.n_qubits, self.abstract_circuit.max_qubit() + 1)
|
522
521
|
if initial_state is not None:
|
523
522
|
if isinstance(initial_state, int):
|
524
|
-
wave=QubitWaveFunction.
|
523
|
+
wave = QubitWaveFunction.from_basis_state(n_qubits, initial_state, self.numbering)
|
525
524
|
elif isinstance(initial_state, str):
|
526
|
-
wave = QubitWaveFunction.from_string(
|
525
|
+
wave = QubitWaveFunction.from_string(initial_state, self.numbering).to_array()
|
527
526
|
elif isinstance(initial_state, QubitWaveFunction):
|
528
527
|
wave = initial_state
|
529
|
-
elif isinstance(initial_state,np.ndarray):
|
530
|
-
wave = QubitWaveFunction.from_array(
|
528
|
+
elif isinstance(initial_state, np.ndarray):
|
529
|
+
wave = QubitWaveFunction.from_array(initial_state, self.numbering) # silly but necessary
|
531
530
|
else:
|
532
531
|
raise TequilaQiboException('received an unusable initial state of type {}'.format(type(initial_state)))
|
533
|
-
state=wave.to_array()
|
534
|
-
result = circuit(state,nshots=samples)
|
532
|
+
state = wave.to_array()
|
533
|
+
result = circuit(state, nshots=samples)
|
535
534
|
else:
|
536
535
|
result = circuit(nshots=samples)
|
537
536
|
|
538
|
-
|
539
537
|
back = self.convert_measurements(backend_result=result)
|
540
538
|
return back
|
541
539
|
|