From 0d23ac1cecb9e2adde97c3181af31103b7754b03 Mon Sep 17 00:00:00 2001 From: Abe Coull <85974725+math411@users.noreply.github.com> Date: Mon, 19 Feb 2024 12:27:21 -0800 Subject: [PATCH] infra: reuse AWS calls across integ tests (#797) --- .gitignore | 1 + test/integ_tests/conftest.py | 88 ++++++++++++ .../gate_model_device_testing_utils.py | 10 +- test/integ_tests/job_test_script.py | 4 +- .../test_create_local_quantum_job.py | 1 + test/integ_tests/test_create_quantum_job.py | 47 +++---- .../test_density_matrix_simulator.py | 2 +- test/integ_tests/test_device_creation.py | 33 +++-- test/integ_tests/test_queue_information.py | 17 +-- .../test_simulator_quantum_task.py | 126 +++++++++++------- .../test_tensor_network_simulator.py | 2 +- tox.ini | 7 + 12 files changed, 223 insertions(+), 115 deletions(-) diff --git a/.gitignore b/.gitignore index d91f4d305..bca0430b0 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ __pycache__/ /build /venv /dist +/model.tar.gz diff --git a/test/integ_tests/conftest.py b/test/integ_tests/conftest.py index 3c9edd2f8..656353c67 100644 --- a/test/integ_tests/conftest.py +++ b/test/integ_tests/conftest.py @@ -12,13 +12,62 @@ # language governing permissions and limitations under the License. import os +import random +import string import boto3 import pytest from botocore.exceptions import ClientError +from braket.aws.aws_device import AwsDevice +from braket.aws.aws_quantum_job import AwsQuantumJob from braket.aws.aws_session import AwsSession +SV1_ARN = "arn:aws:braket:::device/quantum-simulator/amazon/sv1" +DM1_ARN = "arn:aws:braket:::device/quantum-simulator/amazon/dm1" +TN1_ARN = "arn:aws:braket:::device/quantum-simulator/amazon/tn1" +SIMULATOR_ARNS = [SV1_ARN, DM1_ARN, TN1_ARN] + +job_complete_name = "".join(random.choices(string.ascii_lowercase + string.digits, k=12)) +job_fail_name = "".join(random.choices(string.ascii_lowercase + string.digits, k=12)) + + +def pytest_configure_node(node): + """xdist hook""" + node.workerinput["JOB_COMPLETED_NAME"] = job_complete_name + node.workerinput["JOB_FAILED_NAME"] = job_fail_name + + +def pytest_xdist_node_collection_finished(ids): + """Uses the pytest xdist hook to check whether tests with jobs are to be ran. + If they are, the first reporting worker sets a flag that it created the tests + to avoid concurrency limits. This is the first time in the pytest setup the + controller has all the tests to be ran from the worker nodes. + """ + run_jobs = any("job" in test for test in ids) + profile_name = os.environ["AWS_PROFILE"] + aws_session = AwsSession(boto3.session.Session(profile_name=profile_name)) + if run_jobs and os.getenv("JOBS_STARTED") is None: + AwsQuantumJob.create( + "arn:aws:braket:::device/quantum-simulator/amazon/sv1", + job_name=job_fail_name, + source_module="test/integ_tests/job_test_script.py", + entry_point="job_test_script:start_here", + aws_session=aws_session, + wait_until_complete=False, + hyperparameters={"test_case": "failed"}, + ) + AwsQuantumJob.create( + "arn:aws:braket:::device/quantum-simulator/amazon/sv1", + job_name=job_complete_name, + source_module="test/integ_tests/job_test_script.py", + entry_point="job_test_script:start_here", + aws_session=aws_session, + wait_until_complete=False, + hyperparameters={"test_case": "completed"}, + ) + os.environ["JOBS_STARTED"] = "True" + @pytest.fixture(scope="session") def boto_session(): @@ -82,3 +131,42 @@ def s3_prefix(): @pytest.fixture(scope="module") def s3_destination_folder(s3_bucket, s3_prefix): return AwsSession.S3DestinationFolder(s3_bucket, s3_prefix) + + +@pytest.fixture(scope="session") +def braket_simulators(aws_session): + return { + simulator_arn: AwsDevice(simulator_arn, aws_session) for simulator_arn in SIMULATOR_ARNS + } + + +@pytest.fixture(scope="session") +def braket_devices(): + return AwsDevice.get_devices(statuses=["RETIRED", "ONLINE", "OFFLINE"]) + + +@pytest.fixture(scope="session", autouse=True) +def created_braket_devices(aws_session, braket_devices): + return {device.arn: device for device in braket_devices} + + +@pytest.fixture(scope="session") +def job_completed_name(request): + return request.config.workerinput["JOB_COMPLETED_NAME"] + + +@pytest.fixture(scope="session") +def job_failed_name(request): + return request.config.workerinput["JOB_FAILED_NAME"] + + +@pytest.fixture(scope="session", autouse=True) +def completed_quantum_job(aws_session, job_completed_name): + job = AwsQuantumJob(arn=f"arn:aws:braket:us-west-2:046073650652:job/{job_completed_name}") + return job + + +@pytest.fixture(scope="session", autouse=True) +def failed_quantum_job(aws_session, job_failed_name): + job = AwsQuantumJob(arn=f"arn:aws:braket:us-west-2:046073650652:job/{job_failed_name}") + return job diff --git a/test/integ_tests/gate_model_device_testing_utils.py b/test/integ_tests/gate_model_device_testing_utils.py index 63b03bfd6..191084145 100644 --- a/test/integ_tests/gate_model_device_testing_utils.py +++ b/test/integ_tests/gate_model_device_testing_utils.py @@ -81,8 +81,8 @@ def result_types_observable_not_in_instructions(device: Device, run_kwargs: Dict .variance(observable=Observable.Y(), target=[3]) ) bell_qasm = bell.to_ir(ir_type=IRType.OPENQASM) - for task in (bell, bell_qasm): - result = device.run(task, **run_kwargs).result() + results = device.run_batch([bell, bell_qasm], **run_kwargs).results() + for result in results: assert np.allclose(result.values[0], 0, **tol) assert np.allclose(result.values[1], 1, **tol) @@ -103,9 +103,9 @@ def result_types_zero_shots_bell_pair_testing( circuit.amplitude(["01", "10", "00", "11"]) if include_state_vector: circuit.state_vector() - tasks = (circuit, circuit.to_ir(ir_type=IRType.OPENQASM)) - for task in tasks: - result = device.run(task, **run_kwargs).result() + tasks = [circuit, circuit.to_ir(ir_type=IRType.OPENQASM)] + results = device.run_batch(tasks, **run_kwargs).results() + for result in results: assert len(result.result_types) == 3 if include_state_vector else 2 assert np.allclose( result.get_value_by_result_type( diff --git a/test/integ_tests/job_test_script.py b/test/integ_tests/job_test_script.py index 95b890d60..42303465e 100644 --- a/test/integ_tests/job_test_script.py +++ b/test/integ_tests/job_test_script.py @@ -43,8 +43,8 @@ def completed_job_script(): device = AwsDevice(get_job_device_arn()) bell = Circuit().h(0).cnot(0, 1) - for count in range(5): - task = device.run(bell, shots=100) + for count in range(3): + task = device.run(bell, shots=10) print(task.result().measurement_counts) save_job_result({"converged": True, "energy": -0.2}) save_job_checkpoint({"some_data": "abc"}, checkpoint_file_suffix="plain_data") diff --git a/test/integ_tests/test_create_local_quantum_job.py b/test/integ_tests/test_create_local_quantum_job.py index ad91d0a03..8ceae35cd 100644 --- a/test/integ_tests/test_create_local_quantum_job.py +++ b/test/integ_tests/test_create_local_quantum_job.py @@ -99,6 +99,7 @@ def test_completed_local_job(aws_session, capsys): for data in logs_to_validate: assert data in log_data + finally: os.chdir(current_dir) diff --git a/test/integ_tests/test_create_quantum_job.py b/test/integ_tests/test_create_quantum_job.py index 02c16313b..8b2eae758 100644 --- a/test/integ_tests/test_create_quantum_job.py +++ b/test/integ_tests/test_create_quantum_job.py @@ -16,6 +16,7 @@ import re import sys import tempfile +import time from pathlib import Path import job_test_script @@ -36,27 +37,24 @@ def decorator_python_version(): return int(major_version), int(minor_version) -def test_failed_quantum_job(aws_session, capsys): +def test_failed_quantum_job(aws_session, capsys, failed_quantum_job): """Asserts the hybrid job is failed with the output, checkpoints, quantum tasks not created in bucket and only input is uploaded to s3. Validate the results/download results have the response raising RuntimeError. Also, check if the logs displays the Assertion Error. """ - - job = AwsQuantumJob.create( - "arn:aws:braket:::device/quantum-simulator/amazon/sv1", - source_module="test/integ_tests/job_test_script.py", - entry_point="job_test_script:start_here", - aws_session=aws_session, - wait_until_complete=True, - hyperparameters={"test_case": "failed"}, - ) + job = failed_quantum_job + job_name = job.name pattern = f"^arn:aws:braket:{aws_session.region}:\\d{{12}}:job/[a-z0-9-]+$" assert re.match(pattern=pattern, string=job.arn) # Check job is in failed state. - assert job.state() == "FAILED" + while True: + time.sleep(5) + if job.state() in AwsQuantumJob.TERMINAL_STATES: + break + assert job.state(use_cached_value=True) == "FAILED" # Check whether the respective folder with files are created for script, # output, tasks and checkpoints. @@ -97,27 +95,22 @@ def test_failed_quantum_job(aws_session, capsys): ) -def test_completed_quantum_job(aws_session, capsys): +def test_completed_quantum_job(aws_session, capsys, completed_quantum_job): """Asserts the hybrid job is completed with the output, checkpoints, quantum tasks and script folder created in S3 for respective hybrid job. Validate the results are downloaded and results are what we expect. Also, assert that logs contains all the necessary steps for setup and running the hybrid job and is displayed to the user. """ - job = AwsQuantumJob.create( - "arn:aws:braket:::device/quantum-simulator/amazon/sv1", - source_module="test/integ_tests/job_test_script.py", - entry_point="job_test_script:start_here", - wait_until_complete=True, - aws_session=aws_session, - hyperparameters={"test_case": "completed"}, - ) - + job = completed_quantum_job + job_name = job.name pattern = f"^arn:aws:braket:{aws_session.region}:\\d{{12}}:job/[a-z0-9-]+$" assert re.match(pattern=pattern, string=job.arn) - # check job is in completed state. - assert job.state() == "COMPLETED" + # Check the job has completed + job.result() + + assert job.state(use_cached_value=True) == "COMPLETED" # Check whether the respective folder with files are created for script, # output, tasks and checkpoints. @@ -179,19 +172,11 @@ def test_completed_quantum_job(aws_session, capsys): == expected_data ) - # Check downloaded results exists in the file system after the call. - downloaded_result = f"{job_name}/{AwsQuantumJob.RESULTS_FILENAME}" current_dir = Path.cwd() with tempfile.TemporaryDirectory() as temp_dir: os.chdir(temp_dir) try: - job.download_result() - assert ( - Path(AwsQuantumJob.RESULTS_TAR_FILENAME).exists() - and Path(downloaded_result).exists() - ) - # Check results match the expectations. assert job.result() == {"converged": True, "energy": -0.2} finally: diff --git a/test/integ_tests/test_density_matrix_simulator.py b/test/integ_tests/test_density_matrix_simulator.py index b377bdebe..1fba5ebcb 100644 --- a/test/integ_tests/test_density_matrix_simulator.py +++ b/test/integ_tests/test_density_matrix_simulator.py @@ -7,7 +7,7 @@ from braket.aws import AwsDevice from braket.circuits import Circuit, Noise, Observable -SHOTS = 1000 +SHOTS = 500 DM1_ARN = "arn:aws:braket:::device/quantum-simulator/amazon/dm1" SIMULATOR_ARNS = [DM1_ARN] diff --git a/test/integ_tests/test_device_creation.py b/test/integ_tests/test_device_creation.py index 4cb7de2b1..74b40afb6 100644 --- a/test/integ_tests/test_device_creation.py +++ b/test/integ_tests/test_device_creation.py @@ -28,8 +28,8 @@ @pytest.mark.parametrize( "arn", [(RIGETTI_ARN), (IONQ_ARN), (OQC_ARN), (SIMULATOR_ARN), (PULSE_ARN)] ) -def test_device_creation(arn, aws_session): - device = AwsDevice(arn, aws_session=aws_session) +def test_device_creation(arn, created_braket_devices): + device = created_braket_devices[arn] assert device.arn == arn assert device.name assert device.status @@ -39,17 +39,17 @@ def test_device_creation(arn, aws_session): @pytest.mark.parametrize("arn", [(PULSE_ARN)]) -def test_device_pulse_properties(arn, aws_session): - device = AwsDevice(arn, aws_session=aws_session) +def test_device_pulse_properties(arn, aws_session, created_braket_devices): + device = created_braket_devices[arn] assert device.ports assert device.frames -def test_device_across_regions(aws_session): +def test_device_across_regions(aws_session, created_braket_devices): # assert QPUs across different regions can be created using the same aws_session - AwsDevice(RIGETTI_ARN, aws_session) - AwsDevice(IONQ_ARN, aws_session) - AwsDevice(OQC_ARN, aws_session) + created_braket_devices[RIGETTI_ARN] + created_braket_devices[IONQ_ARN] + created_braket_devices[OQC_ARN] @pytest.mark.parametrize("arn", [(RIGETTI_ARN), (IONQ_ARN), (OQC_ARN), (SIMULATOR_ARN)]) @@ -59,8 +59,8 @@ def test_get_devices_arn(arn): @pytest.mark.parametrize("arn", [(PULSE_ARN)]) -def test_device_gate_calibrations(arn, aws_session): - device = AwsDevice(arn, aws_session=aws_session) +def test_device_gate_calibrations(arn, aws_session, created_braket_devices): + device = created_braket_devices[arn] assert device.gate_calibrations @@ -76,8 +76,8 @@ def test_get_devices_others(): assert result.status in statuses -def test_get_devices_all(): - result_arns = [result.arn for result in AwsDevice.get_devices()] +def test_get_devices_all(braket_devices): + result_arns = [result.arn for result in braket_devices] for arn in [RIGETTI_ARN, IONQ_ARN, SIMULATOR_ARN, OQC_ARN]: assert arn in result_arns @@ -127,17 +127,16 @@ def _validate_device(device: AwsDevice, active_providers: Set[str]): assert getattr(getattr(Devices, provider_name), device_name) == device.arn -def test_device_enum(): - aws_devices = AwsDevice.get_devices() - active_providers = _get_active_providers(aws_devices) +def test_device_enum(braket_devices, created_braket_devices): + active_providers = _get_active_providers(braket_devices) # validate all devices in API - for device in aws_devices: + for device in braket_devices: _validate_device(device, active_providers) # validate all devices in enum providers = [getattr(Devices, attr) for attr in dir(Devices) if not attr.startswith("__")] for provider in providers: for device_arn in provider: - device = AwsDevice(device_arn) + device = created_braket_devices[device_arn] _validate_device(device, active_providers) diff --git a/test/integ_tests/test_queue_information.py b/test/integ_tests/test_queue_information.py index 3398fde40..7e7590a80 100644 --- a/test/integ_tests/test_queue_information.py +++ b/test/integ_tests/test_queue_information.py @@ -11,7 +11,8 @@ # ANY KIND, either express or implied. See the License for the specific # language governing permissions and limitations under the License. -from braket.aws import AwsDevice, AwsQuantumJob + +from braket.aws import AwsDevice from braket.aws.queue_information import ( HybridJobQueueInfo, QuantumTaskQueueInfo, @@ -47,15 +48,11 @@ def test_task_queue_position(): assert queue_information.message is None -def test_job_queue_position(aws_session): - job = AwsQuantumJob.create( - device=Devices.Amazon.SV1, - source_module="test/integ_tests/job_test_script.py", - entry_point="job_test_script:start_here", - aws_session=aws_session, - wait_until_complete=True, - hyperparameters={"test_case": "completed"}, - ) +def test_job_queue_position(aws_session, completed_quantum_job): + job = completed_quantum_job + + # Check the job is complete + job.result() # call the queue_position method. queue_information = job.queue_position() diff --git a/test/integ_tests/test_simulator_quantum_task.py b/test/integ_tests/test_simulator_quantum_task.py index 7b9e7d208..0dd4f3f30 100644 --- a/test/integ_tests/test_simulator_quantum_task.py +++ b/test/integ_tests/test_simulator_quantum_task.py @@ -46,7 +46,7 @@ # shots-based tests in this file have the capacity to fail rarely due to probabilistic checks. # this parameter can be adjusted if we find tests regularly failing. -SHOTS = 9000 +SHOTS = 5000 SV1_ARN = "arn:aws:braket:::device/quantum-simulator/amazon/sv1" DM1_ARN = "arn:aws:braket:::device/quantum-simulator/amazon/dm1" SIMULATOR_ARNS = [SV1_ARN, DM1_ARN] @@ -54,16 +54,18 @@ @pytest.mark.parametrize("simulator_arn", SIMULATOR_ARNS) -def test_no_result_types_bell_pair(simulator_arn, aws_session, s3_destination_folder): - device = AwsDevice(simulator_arn, aws_session) +def test_no_result_types_bell_pair( + simulator_arn, aws_session, s3_destination_folder, braket_simulators +): + device = braket_simulators[simulator_arn] no_result_types_bell_pair_testing( device, {"shots": SHOTS, "s3_destination_folder": s3_destination_folder} ) @pytest.mark.parametrize("simulator_arn", SIMULATOR_ARNS) -def test_qubit_ordering(simulator_arn, aws_session, s3_destination_folder): - device = AwsDevice(simulator_arn, aws_session) +def test_qubit_ordering(simulator_arn, aws_session, s3_destination_folder, braket_simulators): + device = braket_simulators[simulator_arn] qubit_ordering_testing(device, {"shots": SHOTS, "s3_destination_folder": s3_destination_folder}) @@ -71,9 +73,9 @@ def test_qubit_ordering(simulator_arn, aws_session, s3_destination_folder): "simulator_arn, include_amplitude", list(zip(SIMULATOR_ARNS, [True, False])) ) def test_result_types_no_shots( - simulator_arn, include_amplitude, aws_session, s3_destination_folder + simulator_arn, include_amplitude, aws_session, s3_destination_folder, braket_simulators ): - device = AwsDevice(simulator_arn, aws_session) + device = braket_simulators[simulator_arn] result_types_zero_shots_bell_pair_testing( device, False, @@ -83,16 +85,20 @@ def test_result_types_no_shots( @pytest.mark.parametrize("simulator_arn", SIMULATOR_ARNS) -def test_result_types_nonzero_shots_bell_pair(simulator_arn, aws_session, s3_destination_folder): - device = AwsDevice(simulator_arn, aws_session) +def test_result_types_nonzero_shots_bell_pair( + simulator_arn, aws_session, s3_destination_folder, braket_simulators +): + device = braket_simulators[simulator_arn] result_types_nonzero_shots_bell_pair_testing( device, {"shots": SHOTS, "s3_destination_folder": s3_destination_folder} ) @pytest.mark.parametrize("simulator_arn", SIMULATOR_ARNS) -def test_result_types_bell_pair_full_probability(simulator_arn, aws_session, s3_destination_folder): - device = AwsDevice(simulator_arn, aws_session) +def test_result_types_bell_pair_full_probability( + simulator_arn, aws_session, s3_destination_folder, braket_simulators +): + device = braket_simulators[simulator_arn] result_types_bell_pair_full_probability_testing( device, {"shots": SHOTS, "s3_destination_folder": s3_destination_folder} ) @@ -100,41 +106,49 @@ def test_result_types_bell_pair_full_probability(simulator_arn, aws_session, s3_ @pytest.mark.parametrize("simulator_arn", SIMULATOR_ARNS) def test_result_types_bell_pair_marginal_probability( - simulator_arn, aws_session, s3_destination_folder + simulator_arn, aws_session, s3_destination_folder, braket_simulators ): - device = AwsDevice(simulator_arn, aws_session) + device = braket_simulators[simulator_arn] result_types_bell_pair_marginal_probability_testing( device, {"shots": SHOTS, "s3_destination_folder": s3_destination_folder} ) @pytest.mark.parametrize("simulator_arn,shots", ARNS_WITH_SHOTS) -def test_result_types_tensor_x_y(simulator_arn, shots, aws_session, s3_destination_folder): - device = AwsDevice(simulator_arn, aws_session) +def test_result_types_tensor_x_y( + simulator_arn, shots, aws_session, s3_destination_folder, braket_simulators +): + device = braket_simulators[simulator_arn] result_types_tensor_x_y_testing( device, {"shots": shots, "s3_destination_folder": s3_destination_folder} ) @pytest.mark.parametrize("simulator_arn,shots", ARNS_WITH_SHOTS) -def test_result_types_tensor_z_h_y(simulator_arn, shots, aws_session, s3_destination_folder): - device = AwsDevice(simulator_arn, aws_session) +def test_result_types_tensor_z_h_y( + simulator_arn, shots, aws_session, s3_destination_folder, braket_simulators +): + device = braket_simulators[simulator_arn] result_types_tensor_z_h_y_testing( device, {"shots": shots, "s3_destination_folder": s3_destination_folder} ) @pytest.mark.parametrize("simulator_arn,shots", ARNS_WITH_SHOTS) -def test_result_types_hermitian(simulator_arn, shots, aws_session, s3_destination_folder): - device = AwsDevice(simulator_arn, aws_session) +def test_result_types_hermitian( + simulator_arn, shots, aws_session, s3_destination_folder, braket_simulators +): + device = braket_simulators[simulator_arn] result_types_hermitian_testing( device, {"shots": shots, "s3_destination_folder": s3_destination_folder} ) @pytest.mark.parametrize("simulator_arn,shots", ARNS_WITH_SHOTS) -def test_result_types_tensor_z_z(simulator_arn, shots, aws_session, s3_destination_folder): - device = AwsDevice(simulator_arn, aws_session) +def test_result_types_tensor_z_z( + simulator_arn, shots, aws_session, s3_destination_folder, braket_simulators +): + device = braket_simulators[simulator_arn] result_types_tensor_z_z_testing( device, {"shots": shots, "s3_destination_folder": s3_destination_folder} ) @@ -142,103 +156,117 @@ def test_result_types_tensor_z_z(simulator_arn, shots, aws_session, s3_destinati @pytest.mark.parametrize("simulator_arn,shots", ARNS_WITH_SHOTS) def test_result_types_tensor_hermitian_hermitian( - simulator_arn, shots, aws_session, s3_destination_folder + simulator_arn, shots, aws_session, s3_destination_folder, braket_simulators ): - device = AwsDevice(simulator_arn, aws_session) + device = braket_simulators[simulator_arn] result_types_tensor_hermitian_hermitian_testing( device, {"shots": shots, "s3_destination_folder": s3_destination_folder} ) @pytest.mark.parametrize("simulator_arn,shots", ARNS_WITH_SHOTS) -def test_result_types_tensor_y_hermitian(simulator_arn, shots, aws_session, s3_destination_folder): - device = AwsDevice(simulator_arn, aws_session) +def test_result_types_tensor_y_hermitian( + simulator_arn, shots, aws_session, s3_destination_folder, braket_simulators +): + device = braket_simulators[simulator_arn] result_types_tensor_y_hermitian_testing( device, {"shots": shots, "s3_destination_folder": s3_destination_folder} ) @pytest.mark.parametrize("simulator_arn,shots", ARNS_WITH_SHOTS) -def test_result_types_tensor_z_hermitian(simulator_arn, shots, aws_session, s3_destination_folder): - device = AwsDevice(simulator_arn, aws_session) +def test_result_types_tensor_z_hermitian( + simulator_arn, shots, aws_session, s3_destination_folder, braket_simulators +): + device = braket_simulators[simulator_arn] result_types_tensor_z_hermitian_testing( device, {"shots": shots, "s3_destination_folder": s3_destination_folder} ) @pytest.mark.parametrize("simulator_arn,shots", ARNS_WITH_SHOTS) -def test_result_types_all_selected(simulator_arn, shots, aws_session, s3_destination_folder): - device = AwsDevice(simulator_arn, aws_session) +def test_result_types_all_selected( + simulator_arn, shots, aws_session, s3_destination_folder, braket_simulators +): + device = braket_simulators[simulator_arn] result_types_all_selected_testing( device, {"shots": shots, "s3_destination_folder": s3_destination_folder} ) @pytest.mark.parametrize("simulator_arn", SIMULATOR_ARNS) -def test_result_types_noncommuting(simulator_arn, aws_session, s3_destination_folder): - device = AwsDevice(simulator_arn, aws_session) +def test_result_types_noncommuting( + simulator_arn, aws_session, s3_destination_folder, braket_simulators +): + device = braket_simulators[simulator_arn] result_types_noncommuting_testing(device, {"s3_destination_folder": s3_destination_folder}) @pytest.mark.parametrize("simulator_arn", SIMULATOR_ARNS) def test_result_types_noncommuting_flipped_targets( - simulator_arn, aws_session, s3_destination_folder + simulator_arn, aws_session, s3_destination_folder, braket_simulators ): - device = AwsDevice(simulator_arn, aws_session) + device = braket_simulators[simulator_arn] result_types_noncommuting_flipped_targets_testing( device, {"s3_destination_folder": s3_destination_folder} ) @pytest.mark.parametrize("simulator_arn", SIMULATOR_ARNS) -def test_result_types_noncommuting_all(simulator_arn, aws_session, s3_destination_folder): - device = AwsDevice(simulator_arn, aws_session) +def test_result_types_noncommuting_all( + simulator_arn, aws_session, s3_destination_folder, braket_simulators +): + device = braket_simulators[simulator_arn] result_types_noncommuting_all(device, {"s3_destination_folder": s3_destination_folder}) @pytest.mark.parametrize("simulator_arn,shots", ARNS_WITH_SHOTS) def test_result_types_observable_not_in_instructions( - simulator_arn, shots, aws_session, s3_destination_folder + simulator_arn, shots, aws_session, s3_destination_folder, braket_simulators ): - device = AwsDevice(simulator_arn, aws_session) + device = braket_simulators[simulator_arn] result_types_observable_not_in_instructions( device, {"shots": shots, "s3_destination_folder": s3_destination_folder} ) @pytest.mark.parametrize("simulator_arn", SIMULATOR_ARNS) -def test_multithreaded_bell_pair(simulator_arn, aws_session, s3_destination_folder): - device = AwsDevice(simulator_arn, aws_session) +def test_multithreaded_bell_pair( + simulator_arn, aws_session, s3_destination_folder, braket_simulators +): + device = braket_simulators[simulator_arn] multithreaded_bell_pair_testing( device, {"shots": SHOTS, "s3_destination_folder": s3_destination_folder} ) @pytest.mark.parametrize("simulator_arn", SIMULATOR_ARNS) -def test_batch_bell_pair(simulator_arn, aws_session, s3_destination_folder): - device = AwsDevice(simulator_arn, aws_session) +def test_batch_bell_pair(simulator_arn, aws_session, s3_destination_folder, braket_simulators): + device = braket_simulators[simulator_arn] batch_bell_pair_testing( device, {"shots": SHOTS, "s3_destination_folder": s3_destination_folder} ) @pytest.mark.parametrize("simulator_arn", SIMULATOR_ARNS) -def test_bell_pair_openqasm(simulator_arn, aws_session, s3_destination_folder): - device = AwsDevice(simulator_arn, aws_session) +def test_bell_pair_openqasm(simulator_arn, aws_session, s3_destination_folder, braket_simulators): + device = braket_simulators[simulator_arn] bell_pair_openqasm_testing( device, {"shots": SHOTS, "s3_destination_folder": s3_destination_folder} ) @pytest.mark.parametrize("simulator_arn", SIMULATOR_ARNS) -def test_bell_pair_openqasm_results(simulator_arn, aws_session, s3_destination_folder): - device = AwsDevice(simulator_arn, aws_session) +def test_bell_pair_openqasm_results( + simulator_arn, aws_session, s3_destination_folder, braket_simulators +): + device = braket_simulators[simulator_arn] openqasm_result_types_bell_pair_testing( device, {"shots": SHOTS, "s3_destination_folder": s3_destination_folder} ) -def test_openqasm_probability_results(aws_session, s3_destination_folder): +def test_openqasm_probability_results(aws_session, s3_destination_folder, braket_simulators): device = AwsDevice("arn:aws:braket:::device/quantum-simulator/amazon/dm1", aws_session) openqasm_noisy_circuit_1qubit_noise_full_probability( device, {"shots": SHOTS, "s3_destination_folder": s3_destination_folder} @@ -247,10 +275,12 @@ def test_openqasm_probability_results(aws_session, s3_destination_folder): @pytest.mark.parametrize("simulator_arn", SIMULATOR_ARNS) @pytest.mark.parametrize("num_layers", [50, 100, 500, 1000]) -def test_many_layers(simulator_arn, num_layers, aws_session, s3_destination_folder): +def test_many_layers( + simulator_arn, num_layers, aws_session, s3_destination_folder, braket_simulators +): num_qubits = 10 circuit = many_layers(num_qubits, num_layers) - device = AwsDevice(simulator_arn, aws_session) + device = braket_simulators[simulator_arn] tol = get_tol(SHOTS) result = device.run(circuit, shots=SHOTS, s3_destination_folder=s3_destination_folder).result() diff --git a/test/integ_tests/test_tensor_network_simulator.py b/test/integ_tests/test_tensor_network_simulator.py index 093781b62..5c406eadd 100644 --- a/test/integ_tests/test_tensor_network_simulator.py +++ b/test/integ_tests/test_tensor_network_simulator.py @@ -20,7 +20,7 @@ from braket.aws import AwsDevice from braket.circuits import Circuit -SHOTS = 1000 +SHOTS = 100 TN1_ARN = "arn:aws:braket:::device/quantum-simulator/amazon/tn1" SIMULATOR_ARNS = [TN1_ARN] diff --git a/tox.ini b/tox.ini index 467b9ab84..98a9b30e3 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,12 @@ [tox] envlist = clean,linters,docs,unit-tests + +[testenv] +parallel_show_output = true +package = wheel +wheel_build_env = .pkg + [testenv:clean] deps = coverage skip_install = true @@ -18,6 +24,7 @@ extras = test [testenv:integ-tests] basepython = python3 +usedevelop=True # {posargs} contains additional arguments specified when invoking tox. e.g. tox -- -s -k test_foo.py deps = {[test-deps]deps}