# 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. from typing import List import numpy as np from braket.default_simulator.operation import GateOperation, Observable 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 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.") 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.") 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.")