# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You
# may not use this file except in compliance with the License. A copy of
# the License is located at
#
# http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file is
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
# ANY KIND, either express or implied. See the License for the specific
# language governing permissions and limitations under the License.
import numpy as np
from braket.default_simulator.operation import GateOperation, Observable
[docs]
class Simulation:
"""
This class tracks the evolution of a quantum system with `qubit_count` qubits.
The state of system the evolves by application of `GateOperation`s using the `evolve()` method.
"""
def __init__(self, qubit_count: int, shots: int):
r"""
Args:
qubit_count (int): The number of qubits being simulated.
All the qubits start in the :math:`\ket{\mathbf{0}}` computational basis state.
shots (int): The number of samples to take from the simulation.
If set to 0, only results that do not require sampling, such as density matrix
or expectation, are generated.
"""
self._qubit_count = qubit_count
self._shots = shots
@property
def qubit_count(self) -> int:
"""int: The number of qubits being simulated by the simulation."""
return self._qubit_count
@property
def shots(self) -> int:
"""
int: The number of samples to take from the simulation.
0 means no samples are taken, and results that require sampling
to calculate cannot be returned.
"""
return self._shots
[docs]
def evolve(self, operations: list[GateOperation]) -> None:
"""Evolves the state of the simulation under the action of
the specified gate operations.
Args:
operations (list[GateOperation]): Gate operations to apply for
evolving the state of the simulation.
Note:
This method mutates the state of the simulation.
"""
raise NotImplementedError("evolve has not been implemented.")
[docs]
def expectation(self, observable: Observable) -> float:
"""The expected value of the observable in the given state.
Args:
observable (Observable): The observable to measure.
Returns:
float: The expected value of the observable.
"""
raise NotImplementedError("expectation has not been implemented.")
[docs]
def retrieve_samples(self) -> list[int]:
"""Retrieves samples of states from the state of the simulation,
based on the probabilities.
Returns:
list[int]: List of states sampled according to their probabilities
in the state. Each integer represents the decimal encoding of the
corresponding computational basis state.
"""
raise NotImplementedError("retrieve_samples has not been implemented.")
@property
def probabilities(self) -> np.ndarray:
"""np.ndarray: The probabilities of each computational basis state."""
raise NotImplementedError("probabilities has not been implemented.")