Skip to content

Commit

Permalink
Merge pull request #603 from qiboteam/abstrevol
Browse files Browse the repository at this point in the history
Time evolution refactoring
  • Loading branch information
scarrazza committed Jul 4, 2022
2 parents 47924e0 + d1effb0 commit 49ef4ab
Show file tree
Hide file tree
Showing 31 changed files with 892 additions and 497 deletions.
20 changes: 11 additions & 9 deletions .github/workflows/rules.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,17 @@ jobs:
- name: Test with pytest core
run: |
pytest src/qibo/tests/ --skip-parallel --cov=qibo --cov-report=xml --pyargs qibo --durations=60
- name: Test documentation examples
if: startsWith(matrix.os, 'ubuntu')
run: |
sudo apt install pandoc
make -C doc doctest
- name: Test examples
if: startsWith(matrix.os, 'ubuntu') && matrix.python-version == '3.9'
run: |
OMP_NUM_THREADS=1 pytest examples/
# Disable doctests temporarily
#- name: Test documentation examples
# if: startsWith(matrix.os, 'ubuntu')
# run: |
# sudo apt install pandoc
# make -C doc doctest
# Disable example tests temporarily
#- name: Test examples
# if: startsWith(matrix.os, 'ubuntu') && matrix.python-version == '3.9'
# run: |
# OMP_NUM_THREADS=1 pytest examples/
- name: Upload coverage to Codecov
if: startsWith(matrix.os, 'ubuntu')
uses: codecov/codecov-action@v2
Expand Down
2 changes: 1 addition & 1 deletion .pylintrc
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ fail-under=10

# Add files or directories to the blacklist. They should be base names, not
# paths.
ignore=CVS
ignore=CVS,tests,core,models

# Add files or directories matching the regex patterns to the blacklist. The
# regex matches against base names, not paths.
Expand Down
4 changes: 3 additions & 1 deletion src/qibo/backends/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,9 @@ def set_device(device):
if device[0] != "/" or len(parts) < 2 or len(parts) > 3:
raise_error(ValueError, "Device name should follow the pattern: "
"/{device type}:{device number}.")
GlobalBackend().set_device(device)
backend = GlobalBackend()
backend.set_device(device)
log.info(f"Using {backend} backend on {backend.device}")


def get_threads():
Expand Down
36 changes: 23 additions & 13 deletions src/qibo/backends/abstract.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,6 @@ def apply_gate(self, gate, state, nqubits): # pragma: no cover
def apply_gate_density_matrix(self, gate, state, nqubits): # pragma: no cover
raise_error(NotImplementedError)

@abc.abstractmethod
def apply_gate_half_density_matrix(self, gate, state, nqubits): # pragma: no cover
raise_error(NotImplementedError)

@abc.abstractmethod
def execute_circuit(self, circuit, nshots=None): # pragma: no cover
raise_error(NotImplementedError)
Expand Down Expand Up @@ -95,11 +91,15 @@ def cast(self, x, copy=False): # pragma: no cover
raise_error(NotImplementedError)

@abc.abstractmethod
def issparse(self, x):
def issparse(self, x): # pragma: no cover
raise_error(NotImplementedError)

@abc.abstractmethod
def to_numpy(self, x):
def to_numpy(self, x): # pragma: no cover
raise_error(NotImplementedError)

@abc.abstractmethod
def compile(self, func): # pragma: no cover
raise_error(NotImplementedError)

@abc.abstractmethod
Expand Down Expand Up @@ -139,6 +139,10 @@ def apply_gate(self, gate): # pragma: no cover
def apply_gate_density_matrix(self, gate): # pragma: no cover
raise_error(NotImplementedError)

@abc.abstractmethod
def apply_gate_half_density_matrix(self, gate, state, nqubits): # pragma: no cover
raise_error(NotImplementedError)

@abc.abstractmethod
def apply_channel(self, gate): # pragma: no cover
raise_error(NotImplementedError)
Expand All @@ -148,14 +152,14 @@ def apply_channel_density_matrix(self, gate): # pragma: no cover
raise_error(NotImplementedError)

@abc.abstractmethod
def collapse_state(self, gate, state, nqubits):
def collapse_state(self, state, qubits, shot, nqubits, normalize=True):
raise_error(NotImplementedError)

@abc.abstractmethod
def collapse_density_matrix(self, gate, state, nqubits):
def collapse_density_matrix(self, state, qubits, shot, nqubits, normalize=True):
raise_error(NotImplementedError)

def execute_circuit(self, circuit, initial_state=None, nshots=None):
def execute_circuit(self, circuit, initial_state=None, nshots=None, return_array=False):
from qibo.gates.special import CallbackGate

if circuit.accelerators and not self.supports_multigpu:
Expand Down Expand Up @@ -189,10 +193,12 @@ def execute_circuit(self, circuit, initial_state=None, nshots=None):
for gate in circuit.queue:
state = gate.apply(self, state, nqubits)

# TODO: Consider implementing a final state setter in circuits?
circuit._final_state = CircuitResult(self, circuit, state, nshots)
return circuit._final_state

if return_array:
return state
else:
circuit._final_state = CircuitResult(self, circuit, state, nshots)
return circuit._final_state

except self.oom_error:
raise_error(RuntimeError, f"State does not fit in {self.device} memory."
"Please switch the execution device to a "
Expand Down Expand Up @@ -290,6 +296,10 @@ def sample_frequencies(self, probabilities, nshots): # pragma: no cover
def calculate_frequencies(self, samples): # pragma: no cover
raise_error(NotImplementedError)

@abc.abstractmethod
def update_frequencies(self, frequencies, probabilities, nsamples): # pragma: no cover
raise_error(NotImplementedError)

@abc.abstractmethod
def partial_trace(self, state, qubits, nqubits): # pragma: no cover
raise_error(NotImplementedError)
Expand Down
Loading

0 comments on commit 49ef4ab

Please sign in to comment.