def test_get_device_specification(): processor = cg.EngineProcessor('a', 'p', EngineContext(), _processor=quantum.QuantumProcessor()) assert processor.get_device_specification() is None # Construct expected device proto based on example expected = v2.device_pb2.DeviceSpecification() gs = expected.valid_gate_sets.add() gs.name = 'test_set' gates = gs.valid_gates.add() gates.id = 'x' gates.number_of_qubits = 1 gates.gate_duration_picos = 1000 gates.valid_targets.extend(['1q_targets']) expected.valid_qubits.extend(['0_0', '1_1']) target = expected.valid_targets.add() target.name = '1q_targets' target.target_ordering = v2.device_pb2.TargetSet.SYMMETRIC new_target = target.targets.add() new_target.ids.extend(['0_0']) processor = cg.EngineProcessor( 'a', 'p', EngineContext(), _processor=quantum.QuantumProcessor(device_spec=_DEVICE_SPEC)) assert processor.get_device_specification() == expected
def test_health(get_processor): get_processor.return_value = quantum.QuantumProcessor(health=quantum.QuantumProcessor.Health.OK) processor = cg.EngineProcessor( 'a', 'p', EngineContext(), _processor=quantum.QuantumProcessor(health=quantum.QuantumProcessor.Health.DOWN), ) assert processor.health() == 'OK'
def test_list_processors(list_processors): processor1 = quantum.QuantumProcessor( name='projects/proj/processors/xmonsim') processor2 = quantum.QuantumProcessor( name='projects/proj/processors/gmonsim') list_processors.return_value = [processor1, processor2] result = cg.Engine(project_id='proj').list_processors() list_processors.assert_called_once_with('proj') assert [p.processor_id for p in result] == ['xmonsim', 'gmonsim']
def test_supported_languages(): processor = cg.EngineProcessor('a', 'p', EngineContext(), _processor=quantum.QuantumProcessor()) assert processor.supported_languages() == [] processor = cg.EngineProcessor( 'a', 'p', EngineContext(), _processor=quantum.QuantumProcessor(supported_languages=['lang1', 'lang2']), ) assert processor.supported_languages() == ['lang1', 'lang2']
def test_expected_recovery_time(): processor = cg.EngineProcessor('a', 'p', EngineContext(), _processor=quantum.QuantumProcessor()) assert not processor.expected_recovery_time() processor = cg.EngineProcessor( 'a', 'p', EngineContext(), _processor=quantum.QuantumProcessor(expected_recovery_time=Timestamp(seconds=1581515101)), ) assert processor.expected_recovery_time() == datetime.datetime( 2020, 2, 12, 13, 45, 1, tzinfo=datetime.timezone.utc )
def test_expected_down_time(get_processor): processor = cg.EngineProcessor('a', 'p', EngineContext(), _processor=quantum.QuantumProcessor()) assert not processor.expected_down_time() get_processor.return_value = quantum.QuantumProcessor( expected_down_time=Timestamp(seconds=1581515101) ) assert cg.EngineProcessor('a', 'p', EngineContext()).expected_down_time() == datetime.datetime( 2020, 2, 12, 13, 45, 1, tzinfo=datetime.timezone.utc ) get_processor.assert_called_once()
def test_list_processors(client_constructor): grpc_client = setup_mock_(client_constructor) results = [ quantum.QuantumProcessor(name='projects/proj/processor/processor0'), quantum.QuantumProcessor(name='projects/proj/processor/processor1'), ] grpc_client.list_quantum_processors.return_value = Pager(results) client = EngineClient() assert client.list_processors('proj') == results grpc_client.list_quantum_processors.assert_called_with( quantum.ListQuantumProcessorsRequest(parent='projects/proj') )
def test_get_missing_device(): processor = cg.EngineProcessor('a', 'p', EngineContext(), _processor=quantum.QuantumProcessor()) with pytest.raises(ValueError, match='device specification'): _ = processor.get_device(gate_sets=[_GATE_SET])
def test_remove_reservation_not_found(get_reservation): get_reservation.return_value = None processor = cg.EngineProcessor( 'proj', 'p0', EngineContext(), quantum.QuantumProcessor(schedule_frozen_period=Duration(seconds=10000)), ) with pytest.raises(ValueError): processor.remove_reservation('rid')
def test_default_gate_sets(): # Sycamore should have valid gate sets with default processor = cg.EngineProcessor( 'a', 'p', EngineContext(), _processor=quantum.QuantumProcessor( device_spec=util.pack_any(known_devices.SYCAMORE_PROTO)), ) device = processor.get_device() device.validate_operation(cirq.X(cirq.GridQubit(5, 4))) # Test that a device with no standard gatesets doesn't blow up processor = cg.EngineProcessor( 'a', 'p', EngineContext(), _processor=quantum.QuantumProcessor(device_spec=_DEVICE_SPEC)) device = processor.get_device() assert device.qubits == [cirq.GridQubit(0, 0), cirq.GridQubit(1, 1)]
def test_get_processor(client_constructor): grpc_client = setup_mock_(client_constructor) result = quantum.QuantumProcessor(name='projects/proj/processors/processor0') grpc_client.get_quantum_processor.return_value = result client = EngineClient() assert client.get_processor('proj', 'processor0') == result grpc_client.get_quantum_processor.assert_called_with( quantum.GetQuantumProcessorRequest(name='projects/proj/processors/processor0') )
def test_get_device_specification(): processor = cg.EngineProcessor('a', 'p', EngineContext(), _processor=quantum.QuantumProcessor()) assert processor.get_device_specification() is None # Construct expected device proto based on example expected = v2.device_pb2.DeviceSpecification() expected.valid_qubits.extend(['0_0', '1_1', '2_2']) target = expected.valid_targets.add() target.name = '2_qubit_targets' target.target_ordering = v2.device_pb2.TargetSet.SYMMETRIC new_target = target.targets.add() new_target.ids.extend(['0_0', '1_1']) gate = expected.valid_gates.add() gate.cz.SetInParent() gate.gate_duration_picos = 1000 gate = expected.valid_gates.add() gate.phased_xz.SetInParent() processor = cg.EngineProcessor( 'a', 'p', EngineContext(), _processor=quantum.QuantumProcessor(device_spec=_DEVICE_SPEC) ) assert processor.get_device_specification() == expected
def test_get_engine_device(get_processor): device_spec = util.pack_any( Merge( """ valid_gate_sets: [{ name: 'test_set', valid_gates: [{ id: 'x', number_of_qubits: 1, gate_duration_picos: 1000, valid_targets: ['1q_targets'] }] }], valid_qubits: ['0_0', '1_1'], valid_targets: [{ name: '1q_targets', target_ordering: SYMMETRIC, targets: [{ ids: ['0_0'] }] }] """, v2.device_pb2.DeviceSpecification(), )) gate_set = cg.SerializableGateSet( gate_set_name='x_gate_set', serializers=[ cg.GateOpSerializer(gate_type=cirq.XPowGate, serialized_gate_id='x', args=[]) ], deserializers=[ cg.GateOpDeserializer(serialized_gate_id='x', gate_constructor=cirq.XPowGate, args=[]) ], ) get_processor.return_value = quantum.QuantumProcessor( device_spec=device_spec) device = cirq_google.get_engine_device('rainbow', 'project', gatesets=[gate_set]) assert set(device.qubits) == {cirq.GridQubit(0, 0), cirq.GridQubit(1, 1)} device.validate_operation(cirq.X(cirq.GridQubit(0, 0))) with pytest.raises(ValueError): device.validate_operation(cirq.X(cirq.GridQubit(1, 2))) with pytest.raises(ValueError): device.validate_operation(cirq.Y(cirq.GridQubit(0, 0)))
def test_get_device(): processor = cg.EngineProcessor( 'a', 'p', EngineContext(), _processor=quantum.QuantumProcessor(device_spec=_DEVICE_SPEC)) device = processor.get_device(gate_sets=[_GATE_SET]) assert device.qubits == [cirq.GridQubit(0, 0), cirq.GridQubit(1, 1)] device.validate_operation(cirq.X(cirq.GridQubit(0, 0))) with pytest.raises(ValueError): device.validate_operation(cirq.X(cirq.GridQubit(1, 2))) with pytest.raises(ValueError): device.validate_operation(cirq.Y(cirq.GridQubit(0, 0))) with pytest.raises(ValueError, match='must be SerializableGateSet'): processor.get_device( gate_sets=[cg.serialization.circuit_serializer.CIRCUIT_SERIALIZER])
def test_get_device(): processor = cg.EngineProcessor( 'a', 'p', EngineContext(), _processor=quantum.QuantumProcessor(device_spec=_DEVICE_SPEC) ) device = processor.get_device() assert device.metadata.qubit_set == frozenset( [cirq.GridQubit(0, 0), cirq.GridQubit(1, 1), cirq.GridQubit(2, 2)] ) device.validate_operation(cirq.X(cirq.GridQubit(2, 2))) device.validate_operation(cirq.CZ(cirq.GridQubit(0, 0), cirq.GridQubit(1, 1))) with pytest.raises(ValueError): device.validate_operation(cirq.X(cirq.GridQubit(1, 2))) with pytest.raises(ValueError): device.validate_operation(cirq.H(cirq.GridQubit(0, 0))) with pytest.raises(ValueError): device.validate_operation(cirq.CZ(cirq.GridQubit(1, 1), cirq.GridQubit(2, 2)))
def test_get_engine_device(get_processor): device_spec = util.pack_any( Merge( """ valid_qubits: "0_0" valid_qubits: "1_1" valid_qubits: "2_2" valid_targets { name: "2_qubit_targets" target_ordering: SYMMETRIC targets { ids: "0_0" ids: "1_1" } } valid_gates { gate_duration_picos: 1000 cz { } } valid_gates { phased_xz { } } """, v2.device_pb2.DeviceSpecification(), )) get_processor.return_value = quantum.QuantumProcessor( device_spec=device_spec) device = cirq_google.get_engine_device('rainbow', 'project') assert device.metadata.qubit_set == frozenset( [cirq.GridQubit(0, 0), cirq.GridQubit(1, 1), cirq.GridQubit(2, 2)]) device.validate_operation(cirq.X(cirq.GridQubit(2, 2))) device.validate_operation( cirq.CZ(cirq.GridQubit(0, 0), cirq.GridQubit(1, 1))) with pytest.raises(ValueError): device.validate_operation(cirq.X(cirq.GridQubit(1, 2))) with pytest.raises(ValueError): device.validate_operation(cirq.H(cirq.GridQubit(0, 0))) with pytest.raises(ValueError): device.validate_operation( cirq.CZ(cirq.GridQubit(1, 1), cirq.GridQubit(2, 2)))
def test_remove_reservation_cancel(cancel_reservation, get_reservation): name = 'projects/proj/processors/p0/reservations/rid' now = int(datetime.datetime.now().timestamp()) result = quantum.QuantumReservation( name=name, start_time=Timestamp(seconds=now + 10), end_time=Timestamp(seconds=now + 3610), whitelisted_users=['*****@*****.**'], ) get_reservation.return_value = result cancel_reservation.return_value = result processor = cg.EngineProcessor( 'proj', 'p0', EngineContext(), quantum.QuantumProcessor(schedule_frozen_period=Duration(seconds=10000)), ) assert processor.remove_reservation('rid') == result cancel_reservation.assert_called_once_with('proj', 'p0', 'rid')
def test_remove_reservation_failures(get_reservation, get_processor): name = 'projects/proj/processors/p0/reservations/rid' now = int(datetime.datetime.now().timestamp()) result = quantum.QuantumReservation( name=name, start_time=Timestamp(seconds=now + 10), end_time=Timestamp(seconds=now + 3610), whitelisted_users=['*****@*****.**'], ) get_reservation.return_value = result get_processor.return_value = None # no processor processor = cg.EngineProcessor('proj', 'p0', EngineContext()) with pytest.raises(ValueError): processor.remove_reservation('rid') # No freeze period defined processor = cg.EngineProcessor('proj', 'p0', EngineContext(), quantum.QuantumProcessor()) with pytest.raises(ValueError): processor.remove_reservation('rid')
def _set_get_processor_return(get_processor): # from engine_test.py from google.protobuf.text_format import Merge from cirq_google.api import v2 from cirq_google.engine import util from cirq_google.cloud import quantum device_spec = util.pack_any( Merge( """ valid_gate_sets: [{ name: 'test_set', valid_gates: [{ id: 'x', number_of_qubits: 1, gate_duration_picos: 1000, valid_targets: ['1q_targets'] }] }], valid_qubits: ['0_0', '1_1'], valid_targets: [{ name: '1q_targets', target_ordering: SYMMETRIC, targets: [{ ids: ['0_0'] }] }] """, v2.device_pb2.DeviceSpecification(), )) get_processor.return_value = quantum.QuantumProcessor( device_spec=device_spec) return get_processor