Skip to content

Commit

Permalink
Generalize probability calculation
Browse files Browse the repository at this point in the history
  • Loading branch information
stavros11 committed Jul 12, 2022
1 parent 63625fc commit 487c8fb
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 10 deletions.
11 changes: 11 additions & 0 deletions src/qibo/backends/abstract.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,17 @@ def circuit_result_tensor(self, result): # pragma: no cover
"""
raise_error(NotImplementedError)

@abc.abstractmethod
def circuit_result_probabilities(self, result, qubits=None): # pragma: no cover
"""Calculates measurement probabilities by tracing out qubits.
Args:
result (:class:`qibo.states.CircuitResult`): Result object that contains
the data required to represent the state.
qubits (list, set): Set of qubits that are measured.
"""
raise_error(NotImplementedError)

@abc.abstractmethod
def calculate_symbolic(self, state, nqubits, decimals=5, cutoff=1e-10, max_terms=20): # pragma: no cover
"""Dirac representation of a state vector."""
Expand Down
10 changes: 10 additions & 0 deletions src/qibo/backends/numpy.py
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,16 @@ def circuit_result_representation(self, result):
def circuit_result_tensor(self, result):
return result.execution_result

def circuit_result_probabilities(self, result, qubits=None):
if qubits is None: # pragma: no cover
qubits = result.circuit.measurement_gate.qubits

state = self.circuit_result_tensor(result)
if result.density_matrix:
return self.calculate_probabilities_density_matrix(state, qubits, result.nqubits)
else:
return self.calculate_probabilities(state, qubits, result.nqubits)

def calculate_symbolic(self, state, nqubits, decimals=5, cutoff=1e-10, max_terms=20):
state = self.to_numpy(state)
terms = []
Expand Down
11 changes: 1 addition & 10 deletions src/qibo/states.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,19 +80,10 @@ def __array__(self):
def probabilities(self, qubits=None):
"""Calculates measurement probabilities by tracing out qubits.
Exactly one of the following arguments should be given.
Args:
qubits (list, set): Set of qubits that are measured.
"""
if qubits is None: # pragma: no cover
qubits = self.circuit.measurement_gate.qubits

state = self.backend.circuit_result_tensor(self)
if self.density_matrix:
return self.backend.calculate_probabilities_density_matrix(state, qubits, self.nqubits)
else:
return self.backend.calculate_probabilities(state, qubits, self.nqubits)
return self.backend.circuit_result_probabilities(self, qubits)

def samples(self, binary=True, registers=False):
"""Returns raw measurement samples.
Expand Down

0 comments on commit 487c8fb

Please sign in to comment.