Beispiel #1
0
def test_set_program_labels(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    grpc_client.get_quantum_program.return_value = qtypes.QuantumProgram(
        labels={
            'color': 'red',
            'weather': 'sun',
            'run': '1'
        },
        label_fingerprint='hash')
    result = qtypes.QuantumProgram(name='projects/proj/programs/prog')
    grpc_client.update_quantum_program.return_value = result

    client = EngineClient()
    labels = {'hello': 'world', 'color': 'blue', 'run': '1'}
    assert client.set_program_labels('proj', 'prog', labels) == result
    assert grpc_client.update_quantum_program.call_args[0] == (
        'projects/proj/programs/prog',
        qtypes.QuantumProgram(name='projects/proj/programs/prog',
                              labels=labels,
                              label_fingerprint='hash'),
        qtypes.field_mask_pb2.FieldMask(paths=['labels']))

    assert client.set_program_labels('proj', 'prog', {}) == result
    assert grpc_client.update_quantum_program.call_args[0] == (
        'projects/proj/programs/prog',
        qtypes.QuantumProgram(name='projects/proj/programs/prog',
                              label_fingerprint='hash'),
        qtypes.field_mask_pb2.FieldMask(paths=['labels']))
Beispiel #2
0
def test_get_batch_size(get_program):
    # Has to fetch from engine if not _program specified.
    program = cg.EngineProgram('a',
                               'b',
                               EngineContext(),
                               result_type=ResultType.Batch)
    get_program.return_value = qtypes.QuantumProgram(code=_BATCH_PROGRAM_V2)
    assert program.batch_size() == 1

    # If _program specified, uses that value.
    program = cg.EngineProgram(
        'a',
        'b',
        EngineContext(),
        _program=qtypes.QuantumProgram(code=_BATCH_PROGRAM_V2),
        result_type=ResultType.Batch)
    assert program.batch_size() == 1

    with pytest.raises(ValueError, match='ResultType.Program'):
        program = cg.EngineProgram('a',
                                   'b',
                                   EngineContext(),
                                   result_type=ResultType.Program)
        _ = program.batch_size()

    with pytest.raises(ValueError, match='cirq.google.api.v2.Program'):
        get_program.return_value = qtypes.QuantumProgram(code=_PROGRAM_V2)
        program = cg.EngineProgram('a',
                                   'b',
                                   EngineContext(),
                                   result_type=ResultType.Batch)
        _ = program.batch_size()
Beispiel #3
0
def test_add_labels(add_program_labels):
    program = cg.EngineProgram('a',
                               'b',
                               EngineContext(),
                               _program=qtypes.QuantumProgram(labels={}))
    assert program.labels() == {}

    add_program_labels.return_value = qtypes.QuantumProgram(labels={
        'a': '1',
    })
    assert program.add_labels({'a': '1'}).labels() == {'a': '1'}
    add_program_labels.assert_called_with('a', 'b', {'a': '1'})

    add_program_labels.return_value = qtypes.QuantumProgram(labels={
        'a': '2',
        'b': '1'
    })
    assert program.add_labels({
        'a': '2',
        'b': '1'
    }).labels() == {
        'a': '2',
        'b': '1'
    }
    add_program_labels.assert_called_with('a', 'b', {'a': '2', 'b': '1'})
def test_description(get_program):
    program = cg.EngineProgram(
        'a', 'b', EngineContext(), _program=qtypes.QuantumProgram(description='hello')
    )
    assert program.description() == 'hello'

    get_program.return_value = qtypes.QuantumProgram(description='hello')
    assert cg.EngineProgram('a', 'b', EngineContext()).description() == 'hello'
    get_program.assert_called_once_with('a', 'b', False)
def test_set_labels(set_program_labels):
    program = cg.EngineProgram('a', 'b', EngineContext())
    set_program_labels.return_value = qtypes.QuantumProgram(labels={'a': '1', 'b': '1'})
    assert program.set_labels({'a': '1', 'b': '1'}).labels() == {'a': '1', 'b': '1'}
    set_program_labels.assert_called_with('a', 'b', {'a': '1', 'b': '1'})

    set_program_labels.return_value = qtypes.QuantumProgram()
    assert program.set_labels({}).labels() == {}
    set_program_labels.assert_called_with('a', 'b', {})
def test_set_description(set_program_description):
    program = cg.EngineProgram('a', 'b', EngineContext())
    set_program_description.return_value = qtypes.QuantumProgram(description='world')
    assert program.set_description('world').description() == 'world'
    set_program_description.assert_called_with('a', 'b', 'world')

    set_program_description.return_value = qtypes.QuantumProgram(description='')
    assert program.set_description('').description() == ''
    set_program_description.assert_called_with('a', 'b', '')
Beispiel #7
0
def test_list_programs(list_programs):
    prog1 = qtypes.QuantumProgram(name='projects/proj/programs/prog-YBGR48THF3JHERZW200804')
    prog2 = qtypes.QuantumProgram(name='projects/otherproj/programs/prog-V3ZRTV6TTAFNTYJV200804')
    list_programs.return_value = [prog1, prog2]

    result = cg.Engine(project_id='proj').list_programs()
    list_programs.assert_called_once_with(
        'proj', created_after=None, created_before=None, has_labels=None
    )
    assert [(p.program_id, p.project_id, p._program) for p in result] == [
        ('prog-YBGR48THF3JHERZW200804', 'proj', prog1),
        ('prog-V3ZRTV6TTAFNTYJV200804', 'otherproj', prog2),
    ]
Beispiel #8
0
def test_list_program(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    results = [
        qtypes.QuantumProgram(name='projects/proj/programs/prog1'),
        qtypes.QuantumProgram(name='projects/proj/programs/prog2')
    ]
    grpc_client.list_quantum_programs.return_value = results

    client = EngineClient()
    assert client.list_programs(project_id='proj') == results
    assert grpc_client.list_quantum_programs.call_args[0] == ('projects/proj',)
    assert grpc_client.list_quantum_programs.call_args[1] == {
        'filter_': '',
    }
def test_get_circuit_unsupported_program_type(get_program):
    program = cg.EngineProgram('a', 'b', EngineContext())
    get_program.return_value = qtypes.QuantumProgram(code=qtypes.any_pb2.Any(
        type_url='type.googleapis.com/unknown.proto'))

    with pytest.raises(ValueError, match='unknown.proto'):
        program.get_circuit()
Beispiel #10
0
def test_create_program(client):
    client().create_program.return_value = ('prog', qtypes.QuantumProgram())
    result = cg.Engine(project_id='proj').create_program(_CIRCUIT,
                                                         'prog',
                                                         gate_set=cg.XMON)
    client().create_program.assert_called_once()
    assert result.program_id == 'prog'
Beispiel #11
0
def test_run_circuit_failed_missing_processor_name(client):
    client().create_program.return_value = (
        'prog',
        qtypes.QuantumProgram(name='projects/proj/programs/prog'),
    )
    client().create_job.return_value = (
        'job-id',
        qtypes.QuantumJob(name='projects/proj/programs/prog/jobs/job-id',
                          execution_status={'state': 'READY'}),
    )
    client().get_job.return_value = qtypes.QuantumJob(
        name='projects/proj/programs/prog/jobs/job-id',
        execution_status={
            'state': 'FAILURE',
            'failure': {
                'error_code': 'SYSTEM_ERROR',
                'error_message': 'Not good'
            },
        },
    )

    engine = cg.Engine(project_id='proj')
    with pytest.raises(
            RuntimeError,
            match='Job projects/proj/programs/prog/jobs/job-id on processor'
            ' UNKNOWN failed. SYSTEM_ERROR: Not good',
    ):
        engine.run(program=_CIRCUIT, gate_set=cg.XMON)
def test_update_time(get_program):
    program = cg.EngineProgram('a', 'b', EngineContext())
    get_program.return_value = qtypes.QuantumProgram(
        update_time=qtypes.timestamp_pb2.Timestamp(seconds=1581515101)
    )
    assert program.update_time() == datetime.datetime(2020, 2, 12, 13, 45, 1)
    get_program.assert_called_once_with('a', 'b', False)
Beispiel #13
0
def test_get_circuit_v1(get_program):
    program = cg.EngineProgram('a', 'b', EngineContext())
    get_program.return_value = qtypes.QuantumProgram(
        code=_to_any(v1.program_pb2.Program()))

    with pytest.raises(ValueError, match='v1 Program is not supported'):
        program.get_circuit()
Beispiel #14
0
def test_labels():
    program = cg.EngineProgram(
        'a',
        'b',
        EngineContext(),
        _program=qtypes.QuantumProgram(labels={'t': '1'}))
    assert program.labels() == {'t': '1'}
Beispiel #15
0
def test_create_time():
    program = cg.EngineProgram(
        'a',
        'b',
        EngineContext(),
        _program=qtypes.QuantumProgram(
            create_time=qtypes.timestamp_pb2.Timestamp(seconds=1581515101)))
    assert program.create_time() == datetime.datetime(2020, 2, 12, 13, 45, 1)
def test_remove_labels(remove_program_labels):
    program = cg.EngineProgram(
        'a', 'b', EngineContext(), _program=qtypes.QuantumProgram(labels={'a': '1', 'b': '1'})
    )
    assert program.labels() == {'a': '1', 'b': '1'}

    remove_program_labels.return_value = qtypes.QuantumProgram(
        labels={
            'b': '1',
        }
    )
    assert program.remove_labels(['a']).labels() == {'b': '1'}
    remove_program_labels.assert_called_with('a', 'b', ['a'])

    remove_program_labels.return_value = qtypes.QuantumProgram(labels={})
    assert program.remove_labels(['a', 'b', 'c']).labels() == {}
    remove_program_labels.assert_called_with('a', 'b', ['a', 'b', 'c'])
Beispiel #17
0
def test_get_circuit_v2_unknown_gateset(get_program):
    program = cg.EngineProgram('a', 'b', EngineContext())
    get_program.return_value = qtypes.QuantumProgram(code=_to_any(
        v2.program_pb2.Program(language=v2.program_pb2.Language(
            gate_set="BAD_GATESET"))))

    with pytest.raises(ValueError, match='unsupported gateset: BAD_GATESET'):
        program.get_circuit()
Beispiel #18
0
def test_program_labels(client_constructor):
    client = mock.Mock()
    client_constructor.return_value = client

    program_name = 'projects/my-proj/programs/my-prog'
    engine = cg.Engine(project_id='project-id')

    client.get_quantum_program.return_value = qtypes.QuantumProgram(labels={
        'a': '1',
        'b': '1'
    })
    engine.add_program_labels(program_name, {'b': '1'})
    engine.remove_program_labels(program_name, ['c'])

    assert client.update_quantum_program.call_count == 0

    def update():
        return client.update_quantum_program.call_args[0][1]

    client.get_quantum_program.return_value = qtypes.QuantumProgram(labels={
        'a': '1',
        'b': '1'
    })
    engine.add_program_labels(program_name, {'a': '2', 'c': '1'})

    assert update().labels == {'a': '2', 'b': '1', 'c': '1'}
    assert update().label_fingerprint == ''

    client.get_quantum_program.return_value = qtypes.QuantumProgram(
        labels={
            'a': '1',
            'b': '1'
        }, label_fingerprint='abcdef')
    engine.set_program_labels(program_name, {'s': '1', 'p': '1'})
    assert update().labels == {'s': '1', 'p': '1'}
    assert update().label_fingerprint == 'abcdef'

    client.get_quantum_program.return_value = qtypes.QuantumProgram(
        labels={
            'a': '1',
            'b': '1'
        }, label_fingerprint='abcdef')
    engine.remove_program_labels(program_name, ['a', 'c'])
    assert update().labels == {'b': '1'}
    assert update().label_fingerprint == 'abcdef'
def test_get_circuit_v2(get_program):
    circuit = cirq.Circuit(
        cirq.X(cirq.GridQubit(5, 2)) ** 0.5, cirq.measure(cirq.GridQubit(5, 2), key='result')
    )

    program = cg.EngineProgram('a', 'b', EngineContext())
    get_program.return_value = qtypes.QuantumProgram(code=_PROGRAM_V2)
    assert program.get_circuit() == circuit
    get_program.assert_called_once_with('a', 'b', True)
Beispiel #20
0
def test_create_program(client_constructor):
    client = mock.Mock()
    client_constructor.return_value = client

    fake_result = qtypes.QuantumProgram(name='project/my-project/program/foo')
    client.create_quantum_program.return_value = fake_result
    result = cg.Engine(project_id='my-project').create_program(_CIRCUIT, 'foo')
    assert client.create_quantum_program.call_args[0][
        1].name == 'projects/my-project/programs/foo'
    assert result.resource_name == fake_result.name
Beispiel #21
0
def test_set_program_description(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    result = qtypes.QuantumProgram(name='projects/proj/programs/prog')
    grpc_client.update_quantum_program.return_value = result

    client = EngineClient()
    assert client.set_program_description('proj', 'prog', 'A program') == result
    assert grpc_client.update_quantum_program.call_args[0] == (
        'projects/proj/programs/prog',
        qtypes.QuantumProgram(name='projects/proj/programs/prog',
                              description='A program'),
        qtypes.field_mask_pb2.FieldMask(paths=['description']))

    assert client.set_program_description('proj', 'prog', '') == result
    assert grpc_client.update_quantum_program.call_args[0] == (
        'projects/proj/programs/prog',
        qtypes.QuantumProgram(name='projects/proj/programs/prog'),
        qtypes.field_mask_pb2.FieldMask(paths=['description']))
Beispiel #22
0
def test_get_program(client_constructor):
    client = mock.Mock()
    client_constructor.return_value = client

    fake_result = qtypes.QuantumProgram(name='project/my-project/program/foo')
    client.get_quantum_program.return_value = fake_result
    result = cg.Engine(project_id='my-project').get_program('foo')
    assert client.get_quantum_program.call_args[0][
        0] == 'projects/my-project/programs/foo'
    assert result == fake_result
Beispiel #23
0
def setup_run_circuit_with_result_(client, result):
    client().create_program.return_value = (
        'prog', qtypes.QuantumProgram(name='projects/proj/programs/prog'))
    client().create_job.return_value = (
        'job-id',
        qtypes.QuantumJob(name='projects/proj/programs/prog/jobs/job-id',
                          execution_status={'state': 'READY'}))
    client().get_job.return_value = qtypes.QuantumJob(
        execution_status={'state': 'SUCCESS'})
    client().get_job_results.return_value = qtypes.QuantumResult(result=result)
Beispiel #24
0
def test_bad_priority(client_constructor):
    client = mock.Mock()
    client_constructor.return_value = client

    client.create_quantum_program.return_value = qtypes.QuantumProgram(
        name='projects/project-id/programs/test')
    engine = cg.Engine(project_id='project-id',
                       proto_version=cg.engine.engine.ProtoVersion.V2)
    with pytest.raises(ValueError, match='priority must be'):
        engine.run(program=_CIRCUIT, priority=1001)
Beispiel #25
0
def setup_run_circuit_with_job_state_(client_constructor, job_return_value):
    client = mock.Mock()
    client_constructor.return_value = client

    client.create_quantum_program.return_value = qtypes.QuantumProgram(
        name='projects/project-id/programs/test')
    client.create_quantum_job.return_value = qtypes.QuantumJob(
        name='projects/project-id/programs/test/jobs/test',
        execution_status={'state': 'READY'})
    client.get_quantum_job.return_value = job_return_value
    return client
def test_get_circuit_batch(get_program):
    circuit = cirq.Circuit(
        cirq.X(cirq.GridQubit(5, 2)) ** 0.5, cirq.measure(cirq.GridQubit(5, 2), key='result')
    )

    program = cg.EngineProgram('a', 'b', EngineContext())
    get_program.return_value = qtypes.QuantumProgram(code=_BATCH_PROGRAM_V2)
    with pytest.raises(ValueError, match='A program number must be specified'):
        program.get_circuit()
    with pytest.raises(ValueError, match='Only 1 in the batch but index 1 was specified'):
        program.get_circuit(1)
    assert program.get_circuit(0) == circuit
    get_program.assert_called_once_with('a', 'b', True)
Beispiel #27
0
def test_get_program(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    result = qtypes.QuantumProgram(name='projects/proj/programs/prog')
    grpc_client.get_quantum_program.return_value = result

    client = EngineClient()
    assert client.get_program('proj', 'prog', False) == result
    assert grpc_client.get_quantum_program.call_args[0] == (
        'projects/proj/programs/prog', False)

    assert client.get_program('proj', 'prog', True) == result
    assert grpc_client.get_quantum_program.call_args[0] == (
        'projects/proj/programs/prog', True)
Beispiel #28
0
def test_remove_program_labels(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    existing = qtypes.QuantumProgram(labels={
        'color': 'red',
        'weather': 'sun',
        'run': '1'
    },
                                     label_fingerprint='hash')
    grpc_client.get_quantum_program.return_value = existing
    result = qtypes.QuantumProgram(name='projects/proj/programs/prog')
    grpc_client.update_quantum_program.return_value = result

    client = EngineClient()
    assert client.remove_program_labels('proj', 'prog', ['other']) == existing
    assert grpc_client.update_quantum_program.call_count == 0

    assert client.remove_program_labels('proj', 'prog',
                                        ['hello', 'weather']) == result
    assert grpc_client.update_quantum_program.call_args[0] == (
        'projects/proj/programs/prog',
        qtypes.QuantumProgram(name='projects/proj/programs/prog',
                              labels={
                                  'color': 'red',
                                  'run': '1',
                              },
                              label_fingerprint='hash'),
        qtypes.field_mask_pb2.FieldMask(paths=['labels']))

    assert client.remove_program_labels('proj', 'prog',
                                        ['color', 'weather', 'run']) == result
    assert grpc_client.update_quantum_program.call_args[0] == (
        'projects/proj/programs/prog',
        qtypes.QuantumProgram(name='projects/proj/programs/prog',
                              label_fingerprint='hash'),
        qtypes.field_mask_pb2.FieldMask(paths=['labels']))
Beispiel #29
0
def test_calibration_from_job_with_no_calibration(client_constructor):
    client = mock.Mock()
    client_constructor.return_value = client

    client.create_quantum_program.return_value = qtypes.QuantumProgram(
        name='projects/project-id/programs/test')
    client.create_quantum_job.return_value = qtypes.QuantumJob(
        name='projects/project-id/programs/test/jobs/test',
        execution_status={'state': 'SUCCESS'})

    engine = cg.Engine(project_id='project-id')
    job = engine.run_sweep(program=cirq.Circuit())

    calibration = job.get_calibration()
    assert not calibration
    assert not client.get_quantum_calibration.called
def test_run_batch_no_sweeps(create_job):
    # Running with no sweeps is fine. Uses program's batch size to create
    # proper empty sweeps.
    create_job.return_value = ('kittens', qtypes.QuantumJob())
    program = cg.EngineProgram(
        'my-meow',
        'my-meow',
        _program=qtypes.QuantumProgram(code=_BATCH_PROGRAM_V2),
        context=EngineContext(),
        result_type=ResultType.Batch,
    )
    job = program.run_batch(job_id='steve', repetitions=10, processor_ids=['lazykitty'])
    assert job._job == qtypes.QuantumJob()
    batch_run_context = v2.batch_pb2.BatchRunContext()
    create_job.call_args[1]['run_context'].Unpack(batch_run_context)
    assert len(batch_run_context.run_contexts) == 1