예제 #1
0
def test_timeout_no_result_terminal_state(aws_session):
    _mock_metadata(aws_session, "RUNNING")
    _mock_s3(aws_session, MockS3.MOCK_S3_RESULT_GATE_MODEL)

    # Setup the poll timing such that the timeout will occur after one API poll
    quantum_task = AwsQuantumTask(
        "foo:bar:arn", aws_session, poll_timeout_seconds=0.5, poll_interval_seconds=1
    )
    assert quantum_task.result() is None

    _mock_metadata(aws_session, "FAILED")
    assert quantum_task.result() is None
예제 #2
0
def test_timeout_completed(aws_session):
    _mock_metadata(aws_session, "RUNNING")
    _mock_s3(aws_session, MockS3.MOCK_S3_RESULT_GATE_MODEL)

    # Setup the poll timing such that the timeout will occur after one API poll
    quantum_task = AwsQuantumTask(
        "foo:bar:arn", aws_session, poll_timeout_seconds=0.5, poll_interval_seconds=1
    )
    assert quantum_task.result() is None
    _mock_metadata(aws_session, "COMPLETED")
    assert quantum_task.state() == "COMPLETED"
    assert quantum_task.result() == GateModelQuantumTaskResult.from_string(
        MockS3.MOCK_S3_RESULT_GATE_MODEL
    )
예제 #3
0
def test_timeout_completed(aws_session):
    _mock_metadata(aws_session, "RUNNING")
    _mock_s3(aws_session, MockS3.MOCK_S3_RESULT_GATE_MODEL)

    # Setup the poll timing such that the timeout will occur after one API poll
    quantum_task = AwsQuantumTask(
        "foo:bar:arn",
        aws_session,
        poll_timeout_seconds=0.5,
        poll_interval_seconds=1,
        poll_outside_execution_window=True,
    )
    assert quantum_task.result() is None
    _mock_metadata(aws_session, "COMPLETED")
    assert quantum_task.state() == "COMPLETED"
    assert quantum_task.result() == GateModelQuantumTaskResult.from_string(
        MockS3.MOCK_S3_RESULT_GATE_MODEL)
    # Cached status is still COMPLETED, so result should be fetched
    _mock_metadata(aws_session, "RUNNING")
    quantum_task._result = None
    assert quantum_task.result() == GateModelQuantumTaskResult.from_string(
        MockS3.MOCK_S3_RESULT_GATE_MODEL)
예제 #4
0
class AmazonCloudPromise(AmazonPromiseBase):
    """
    AWS Cloud Promise
    """

    try:
        S3_BUCKET = (open(
            os.path.join(os.path.dirname(__file__), "../../s3_location.txt"),
            "r").read().strip())
    except FileNotFoundError:
        S3_BUCKET = None

    def __init__(self,
                 circuit: braket.circuits.Circuit,
                 device,
                 num_shots: int,
                 *,
                 s3_bucket: str = S3_BUCKET,
                 s3_bucket_folder: str = "benchmarks"):
        super().__init__()

        self.s3_path = (s3_bucket, s3_bucket_folder)
        self.task = device.run(circuit,
                               self.s3_path,
                               shots=num_shots,
                               poll_timeout_seconds=5 * 24 * 60 * 60)

    def job_id(self):
        """
        Return a job id.
        """
        return self.task.id

    def status(self):
        """
        Return the status.
        """
        state = self.task.state()
        if state == "COMPLETED":
            return "DONE"
        elif state == "CREATED" or state == "QUEUED" or state == "RUNNING":
            return "PENDING"
        else:
            return "FAILURE"

    def freeze(self):
        """
        Since promises that resolve immediately will never be pickled, we can just pass self.
        The real promise can return a separate frozen instance if necessary.
        """
        if not isinstance(self.task, str):
            self.task = self.job_id()
        return self

    def thaw(self):
        """
        No thawing necessary.
        The real promise should probably have this method in the frozen instance class.
        """
        from braket.aws import AwsQuantumTask

        if isinstance(self.task, str):
            self.task = AwsQuantumTask(arn=self.task)
        return self

    def result(self):
        if self.status() == "DONE":
            return self.task.result()
        else:
            return None