Exemplo n.º 1
0
def test_sweep_to_proto_points():
    proto = v2.sweep_to_proto(cirq.Points('foo', [-1, 0, 1, 1.5]))
    assert isinstance(proto, run_context_pb2.Sweep)
    assert proto.HasField('single_sweep')
    assert proto.single_sweep.parameter_key == 'foo'
    assert proto.single_sweep.WhichOneof('sweep') == 'points'
    assert list(proto.single_sweep.points.points) == [-1, 0, 1, 1.5]
Exemplo n.º 2
0
def test_run_multiple_times(client):
    setup_run_circuit_with_result_(client, _RESULTS)

    engine = cg.Engine(project_id='proj',
                       proto_version=cg.engine.engine.ProtoVersion.V1)
    program = engine.create_program(program=_CIRCUIT)
    program.run(param_resolver=cirq.ParamResolver({'a': 1}))
    run_context = v1.program_pb2.RunContext()
    client().create_job.call_args[1]['run_context'].Unpack(run_context)
    sweeps1 = run_context.parameter_sweeps
    job2 = program.run_sweep(repetitions=2, params=cirq.Points('a', [3, 4]))
    client().create_job.call_args[1]['run_context'].Unpack(run_context)
    sweeps2 = run_context.parameter_sweeps
    results = job2.results()
    assert engine.context.proto_version == cg.engine.engine.ProtoVersion.V1
    assert len(results) == 2
    for i, v in enumerate([1, 2]):
        assert results[i].repetitions == 1
        assert results[i].params.param_dict == {'a': v}
        assert results[i].measurements == {'q': np.array([[0]], dtype='uint8')}
    assert len(sweeps1) == 1
    assert sweeps1[0].repetitions == 1
    assert sweeps1[0].sweep.factors[0].sweeps[0].points.points == [1]
    assert len(sweeps2) == 1
    assert sweeps2[0].repetitions == 2
    assert sweeps2[0].sweep.factors[0].sweeps[0].points.points == [3, 4]
    assert client().get_job.call_count == 2
    assert client().get_job_results.call_count == 2
Exemplo n.º 3
0
def test_run_sweep_v2(client):
    setup_run_circuit_with_result_(client, _RESULTS_V2)

    engine = cg.Engine(
        project_id='proj',
        proto_version=cg.engine.engine.ProtoVersion.V2,
    )
    job = engine.run_sweep(program=_CIRCUIT,
                           job_id='job-id',
                           params=cirq.Points('a', [1, 2]))
    results = job.results()
    assert len(results) == 2
    for i, v in enumerate([1, 2]):
        assert results[i].repetitions == 1
        assert results[i].params.param_dict == {'a': v}
        assert results[i].measurements == {'q': np.array([[0]], dtype='uint8')}
    client().create_program.assert_called_once()
    client().create_job.assert_called_once()
    run_context = v2.run_context_pb2.RunContext()
    client().create_job.call_args[1]['run_context'].Unpack(run_context)
    sweeps = run_context.parameter_sweeps
    assert len(sweeps) == 1
    assert sweeps[0].repetitions == 1
    assert sweeps[0].sweep.single_sweep.points.points == [1, 2]
    client().get_job.assert_called_once()
    client().get_job_results.assert_called_once()
Exemplo n.º 4
0
def test_gen_sweep_points():
    points = [0.5, 1.0, 1.5, 2.0, 2.5]
    sweep = params_pb2.SingleSweep(
        parameter_key='foo', points=params_pb2.Points(points=list(points))
    )
    out = params._sweep_from_single_param_sweep_proto(sweep)
    assert out == cirq.Points('foo', [0.5, 1.0, 1.5, 2.0, 2.5])
def test_custom_delay_sweep(experiment_type):
    pulses = [1] if experiment_type == t2.ExperimentType.CPMG else None
    results = t2.t2_decay(
        sampler=cirq.DensityMatrixSimulator(noise=cirq.amplitude_damp(1)),
        qubit=cirq.GridQubit(0, 0),
        num_points=4,
        repetitions=10,
        min_delay=cirq.Duration(nanos=100),
        max_delay=cirq.Duration(micros=1),
        experiment_type=experiment_type,
        num_pulses=pulses,
        delay_sweep=cirq.Points('delay_ns',
                                [1.0, 10.0, 100.0, 1000.0, 10000.0]))
    assert results == cirq.experiments.T2DecayResult(
        x_basis_data=pd.DataFrame(columns=['delay_ns', 0, 1],
                                  index=range(5),
                                  data=[
                                      [1.0, 10, 0],
                                      [10.0, 10, 0],
                                      [100.0, 10, 0],
                                      [1000.0, 10, 0],
                                      [10000.0, 10, 0],
                                  ]),
        y_basis_data=pd.DataFrame(columns=['delay_ns', 0, 1],
                                  index=range(5),
                                  data=[
                                      [1.0, 10, 0],
                                      [10.0, 10, 0],
                                      [100.0, 10, 0],
                                      [1000.0, 10, 0],
                                      [10000.0, 10, 0],
                                  ]),
    )
Exemplo n.º 6
0
def test_bad_result_proto(build):
    service = mock.Mock()
    build.return_value = service
    programs = service.projects().programs()
    jobs = programs.jobs()
    programs.create().execute.return_value = {
        'name': 'projects/project-id/programs/test'
    }
    jobs.create().execute.return_value = {
        'name': 'projects/project-id/programs/test/jobs/test',
        'executionStatus': {
            'state': 'READY'
        }
    }
    jobs.get().execute.return_value = {
        'name': 'projects/project-id/programs/test/jobs/test',
        'executionStatus': {
            'state': 'SUCCESS'
        }
    }
    result = _RESULTS_V2.copy()
    result['@type'] = 'type.googleapis.com/unknown'
    jobs.getResult().execute.return_value = {'result': result}

    engine = cg.Engine(project_id='project-id',
                       proto_version=cg.engine.engine.ProtoVersion.V2)
    job = engine.run_sweep(program=_SCHEDULE,
                           job_config=cg.JobConfig(
                               'project-id', gcs_prefix='gs://bucket/folder'),
                           params=cirq.Points('a', [1, 2]))
    with pytest.raises(ValueError, match='invalid result proto version'):
        job.results()
Exemplo n.º 7
0
def sweep_from_proto(msg: run_context_pb2.Sweep) -> cirq.Sweep:
    """Creates a Sweep from a v2 protobuf message."""
    which = msg.WhichOneof('sweep')
    if which is None:
        return cirq.UnitSweep
    if which == 'sweep_function':
        factors = [sweep_from_proto(m) for m in msg.sweep_function.sweeps]
        func_type = msg.sweep_function.function_type
        if func_type == run_context_pb2.SweepFunction.PRODUCT:
            return cirq.Product(*factors)
        if func_type == run_context_pb2.SweepFunction.ZIP:
            return cirq.Zip(*factors)

        raise ValueError(f'invalid sweep function type: {func_type}')
    if which == 'single_sweep':
        key = msg.single_sweep.parameter_key
        if msg.single_sweep.WhichOneof('sweep') == 'linspace':
            return cirq.Linspace(
                key=key,
                start=msg.single_sweep.linspace.first_point,
                stop=msg.single_sweep.linspace.last_point,
                length=msg.single_sweep.linspace.num_points,
            )
        if msg.single_sweep.WhichOneof('sweep') == 'points':
            return cirq.Points(key=key, points=msg.single_sweep.points.points)

        raise ValueError(f'single sweep type not set: {msg}')

    # coverage: ignore
    raise ValueError(f'sweep type not set: {msg}')
def test_run_sweep():
    proc = SimulatedLocalProcessor(processor_id='test_proc')
    q = cirq.GridQubit(5, 4)
    circuit = cirq.Circuit(
        cirq.X(q)**sympy.Symbol('t'), cirq.measure(q, key='m'))
    sweep = cirq.Points(key='t', points=[1, 0])
    job = proc.run_sweep(circuit,
                         params=sweep,
                         repetitions=100,
                         program_id='abc',
                         job_id='def')
    assert proc.get_program('abc') == job.program()
    assert proc.get_program('abc').get_job('def') == job
    assert job.execution_status() == quantum.enums.ExecutionStatus.State.READY
    assert len(job) == 2
    assert np.all(job[0].measurements['m'] == 1)
    assert np.all(job[1].measurements['m'] == 0)

    # Test iteration
    for idx, result in enumerate(job):
        assert np.all(result.measurements['m'] == 1 - idx)

    assert job.execution_status(
    ) == quantum.enums.ExecutionStatus.State.SUCCESS

    # with default program_id and job_id
    job = proc.run_sweep(circuit, params=sweep, repetitions=100)
    assert job.execution_status() == quantum.enums.ExecutionStatus.State.READY
    results = job.results()
    assert np.all(results[0].measurements['m'] == 1)
    assert np.all(results[1].measurements['m'] == 0)
    assert job.execution_status(
    ) == quantum.enums.ExecutionStatus.State.SUCCESS
Exemplo n.º 9
0
def test_run_sweep_v2(client_constructor):
    client = setup_run_circuit_with_result_(client_constructor, _RESULTS_V2)

    engine = cg.Engine(
        project_id='project-id',
        proto_version=cg.engine.engine.ProtoVersion.V2,
    )
    job = engine.run_sweep(program=_CIRCUIT,
                           job_config=cg.JobConfig('project-id'),
                           params=cirq.Points('a', [1, 2]))
    results = job.results()
    assert engine.proto_version == cg.engine.engine.ProtoVersion.V2
    assert len(results) == 2
    for i, v in enumerate([1, 2]):
        assert results[i].repetitions == 1
        assert results[i].params.param_dict == {'a': v}
        assert results[i].measurements == {'q': np.array([[0]], dtype='uint8')}
    assert client.create_quantum_program.call_args[0][
        0] == 'projects/project-id'
    assert client.create_quantum_job.call_args[0][
        0] == 'projects/project-id/programs/test'
    run_context = v2.run_context_pb2.RunContext()
    client.create_quantum_job.call_args[0][1].run_context.Unpack(run_context)
    sweeps = run_context.parameter_sweeps
    assert len(sweeps) == 1
    assert sweeps[0].repetitions == 1
    assert sweeps[0].sweep.single_sweep.points.points == [1, 2]
    assert client.get_quantum_job.call_count == 1
    assert client.get_quantum_result.call_count == 1
Exemplo n.º 10
0
def test_run_batch(client):
    client().create_program.return_value = (
        'prog',
        quantum.QuantumProgram(name='projects/proj/programs/prog'),
    )
    client().create_job.return_value = (
        'job-id',
        quantum.QuantumJob(name='projects/proj/programs/prog/jobs/job-id',
                           execution_status={'state': 'READY'}),
    )
    client().get_job.return_value = quantum.QuantumJob(
        execution_status={'state': 'SUCCESS'},
        update_time=_to_timestamp('2019-07-09T23:39:59Z'))
    client().get_job_results.return_value = quantum.QuantumResult(
        result=_BATCH_RESULTS_V2)

    processor = cg.EngineProcessor('a', 'p', EngineContext())
    job = processor.run_batch(
        programs=[_CIRCUIT, _CIRCUIT],
        job_id='job-id',
        params_list=[cirq.Points('a', [1, 2]),
                     cirq.Points('a', [3, 4])],
    )
    results = job.results()
    assert len(results) == 4
    for i, v in enumerate([1, 2, 3, 4]):
        assert results[i].repetitions == 1
        assert results[i].params.param_dict == {'a': v}
        assert results[i].measurements == {'q': np.array([[0]], dtype='uint8')}
    for result in results:
        assert result.job_id == job.id()
    client().create_program.assert_called_once()
    client().create_job.assert_called_once()
    run_context = v2.batch_pb2.BatchRunContext()
    client().create_job.call_args[1]['run_context'].Unpack(run_context)
    assert len(run_context.run_contexts) == 2
    for idx, rc in enumerate(run_context.run_contexts):
        sweeps = rc.parameter_sweeps
        assert len(sweeps) == 1
        assert sweeps[0].repetitions == 1
        if idx == 0:
            assert sweeps[0].sweep.single_sweep.points.points == [1.0, 2.0]
        if idx == 1:
            assert sweeps[0].sweep.single_sweep.points.points == [3.0, 4.0]
    client().get_job.assert_called_once()
    client().get_job_results.assert_called_once()
Exemplo n.º 11
0
def test_run_batch(simulation_type):
    program = ParentProgram(
        [
            cirq.Circuit(
                cirq.X(Q)**sympy.Symbol('t'), cirq.measure(Q, key='m')),
            cirq.Circuit(
                cirq.X(Q)**sympy.Symbol('x'), cirq.measure(Q, key='m2')),
        ],
        None,
    )
    job = SimulatedLocalJob(
        job_id='test_job',
        processor_id='test1',
        parent_program=program,
        simulation_type=simulation_type,
        repetitions=100,
        sweeps=[
            cirq.Points(key='t', points=[1, 0]),
            cirq.Points(key='x', points=[0, 1])
        ],
    )
    if simulation_type == LocalSimulationType.ASYNCHRONOUS:
        # Note: The simulation could have finished already
        assert (job.execution_status() == quantum.ExecutionStatus.State.RUNNING
                or job.execution_status()
                == quantum.ExecutionStatus.State.SUCCESS)
    else:
        assert job.execution_status() == quantum.ExecutionStatus.State.READY
    results = job.batched_results()
    assert np.all(results[0][0].measurements['m'] == 1)
    assert np.all(results[0][1].measurements['m'] == 0)
    assert np.all(results[1][0].measurements['m2'] == 0)
    assert np.all(results[1][1].measurements['m2'] == 1)
    assert job.execution_status() == quantum.ExecutionStatus.State.SUCCESS
    # Using flattened results
    results = job.results()
    assert np.all(results[0].measurements['m'] == 1)
    assert np.all(results[1].measurements['m'] == 0)
    assert np.all(results[2].measurements['m2'] == 0)
    assert np.all(results[3].measurements['m2'] == 1)

    for result in results:
        assert result.job_id == 'test_job'
        assert result.job_finished_time is not None
    assert results == cirq.read_json(json_text=cirq.to_json(results))
Exemplo n.º 12
0
def test_batch_size_validation_fails():
    engine = cg.Engine(
        project_id='proj',
        proto_version=cg.engine.engine.ProtoVersion.V2,
    )

    with pytest.raises(ValueError, match='Number of circuits and sweeps'):
        _ = engine.run_batch(programs=[_CIRCUIT, _CIRCUIT2],
                             gate_set=cg.XMON,
                             job_id='job-id',
                             params_list=[
                                 cirq.Points('a', [1, 2]),
                                 cirq.Points('a', [3, 4]),
                                 cirq.Points('a', [5, 6])
                             ],
                             processor_ids=['mysim'])

    with pytest.raises(ValueError, match='Processor id must be specified'):
        _ = engine.run_batch(
            programs=[_CIRCUIT, _CIRCUIT2],
            gate_set=cg.XMON,
            job_id='job-id',
            params_list=[cirq.Points('a', [1, 2]),
                         cirq.Points('a', [3, 4])])

    with pytest.raises(ValueError, match='Gate set must be specified'):
        _ = engine.run_batch(
            programs=[_CIRCUIT, _CIRCUIT2],
            job_id='job-id',
            params_list=[cirq.Points('a', [1, 2]),
                         cirq.Points('a', [3, 4])],
            processor_ids=['mysim'])
Exemplo n.º 13
0
def test_run_in_batch_mode():
    program = cg.EngineProgram('no-meow',
                               'no-meow',
                               EngineContext(),
                               result_type=ResultType.Batch)
    with pytest.raises(ValueError, match='Please use run_batch'):
        _ = program.run_sweep(repetitions=1,
                              processor_ids=['lazykitty'],
                              params=cirq.Points('cats', [1.0, 2.0, 3.0]))
Exemplo n.º 14
0
def sweep_to_proto(
        sweep: cirq.Sweep,
        *,
        out: Optional[run_context_pb2.Sweep] = None) -> run_context_pb2.Sweep:
    """Converts a Sweep to v2 protobuf message.

    Args:
        sweep: The sweep to convert.
        out: Optional message to be populated. If not given, a new message will
            be created.

    Returns:
        Populated sweep protobuf message.

    Raises:
        ValueError: If the conversion cannot be completed successfully.
    """
    if out is None:
        out = run_context_pb2.Sweep()
    if sweep is cirq.UnitSweep:
        pass
    elif isinstance(sweep, cirq.Product):
        out.sweep_function.function_type = run_context_pb2.SweepFunction.PRODUCT
        for factor in sweep.factors:
            sweep_to_proto(factor, out=out.sweep_function.sweeps.add())
    elif isinstance(sweep, cirq.Zip):
        out.sweep_function.function_type = run_context_pb2.SweepFunction.ZIP
        for s in sweep.sweeps:
            sweep_to_proto(s, out=out.sweep_function.sweeps.add())
    elif isinstance(sweep,
                    cirq.Linspace) and not isinstance(sweep.key, sympy.Expr):
        out.single_sweep.parameter_key = sweep.key
        out.single_sweep.linspace.first_point = sweep.start
        out.single_sweep.linspace.last_point = sweep.stop
        out.single_sweep.linspace.num_points = sweep.length
    elif isinstance(sweep,
                    cirq.Points) and not isinstance(sweep.key, sympy.Expr):
        out.single_sweep.parameter_key = sweep.key
        out.single_sweep.points.points.extend(sweep.points)
    elif isinstance(sweep, cirq.ListSweep):
        sweep_dict: Dict[str, List[float]] = {}
        for param_resolver in sweep:
            for key in param_resolver:
                if isinstance(key, sympy.Expr):
                    raise ValueError(
                        f'cannot convert to v2 Sweep proto: {sweep}')
                if key not in sweep_dict:
                    sweep_dict[key] = []
                sweep_dict[key].append(
                    cast(float, param_resolver.value_of(key)))
        out.sweep_function.function_type = run_context_pb2.SweepFunction.ZIP
        for key in sweep_dict:
            sweep_to_proto(cirq.Points(key, sweep_dict[key]),
                           out=out.sweep_function.sweeps.add())
    else:
        raise ValueError(f'cannot convert to v2 Sweep proto: {sweep}')
    return out
Exemplo n.º 15
0
def test_run_sweep_v2_new_proto(build):
    service = mock.Mock()
    build.return_value = service
    programs = service.projects().programs()
    jobs = programs.jobs()
    programs.create().execute.return_value = {
        'name': 'projects/project-id/programs/test'
    }
    jobs.create().execute.return_value = {
        'name': 'projects/project-id/programs/test/jobs/test',
        'executionStatus': {
            'state': 'READY'
        }
    }
    jobs.get().execute.return_value = {
        'name': 'projects/project-id/programs/test/jobs/test',
        'executionStatus': {
            'state': 'SUCCESS'
        }
    }
    results_new_proto = copy.deepcopy(_RESULTS_V2)
    results_new_proto[
        '@type'] = 'type.googleapis.com/cirq.google.api.v2.Result'
    jobs.getResult().execute.return_value = {'result': results_new_proto}

    engine = cg.Engine(
        project_id='project-id',
        proto_version=cg.engine.engine.ProtoVersion.V2,
    )
    job = engine.run_sweep(program=_SCHEDULE,
                           job_config=cg.JobConfig(
                               'project-id', gcs_prefix='gs://bucket/folder'),
                           params=cirq.Points('a', [1, 2]))
    results = job.results()
    assert engine.proto_version == cg.engine.engine.ProtoVersion.V2
    assert len(results) == 2
    for i, v in enumerate([1, 2]):
        assert results[i].repetitions == 1
        assert results[i].params.param_dict == {'a': v}
        assert results[i].measurements == {'q': np.array([[0]], dtype='uint8')}
    build.assert_called_with(
        'quantum',
        'v1alpha1',
        discoveryServiceUrl=('https://{api}.googleapis.com'
                             '/$discovery/rest?version='
                             '{apiVersion}'),
        requestBuilder=mock.ANY)
    assert programs.create.call_args[1]['parent'] == 'projects/project-id'
    sweeps = jobs.create.call_args[1]['body']['run_context']['parameterSweeps']
    assert len(sweeps) == 1
    assert sweeps[0]['repetitions'] == 1
    assert sweeps[0]['sweep']['singleSweep']['points']['points'] == [1, 2]
    assert jobs.create.call_args[1][
        'parent'] == 'projects/project-id/programs/test'
    assert jobs.get().execute.call_count == 1
    assert jobs.getResult().execute.call_count == 1
Exemplo n.º 16
0
def test_slice_access_error():
    sweep = cirq.Points('a', [1, 2, 3])
    with pytest.raises(TypeError, match='<class \'str\'>'):
        _ = sweep['junk']

    with pytest.raises(IndexError):
        _ = sweep[4]

    with pytest.raises(IndexError):
        _ = sweep[-4]
Exemplo n.º 17
0
def test_run_batch():
    q = cirq.GridQubit(5, 4)
    proc = SimulatedLocalProcessor(processor_id='test_proc')
    circuits = [
        cirq.Circuit(cirq.X(q)**sympy.Symbol('t'), cirq.measure(q, key='m')),
        cirq.Circuit(cirq.X(q)**sympy.Symbol('x'), cirq.measure(q, key='m2')),
    ]
    sweeps = [
        cirq.Points(key='t', points=[1, 0]),
        cirq.Points(key='x', points=[0, 1])
    ]
    job = proc.run_batch(circuits, params_list=sweeps, repetitions=100)
    assert job.execution_status() == quantum.ExecutionStatus.State.READY
    results = job.batched_results()
    assert np.all(results[0][0].measurements['m'] == 1)
    assert np.all(results[0][1].measurements['m'] == 0)
    assert np.all(results[1][0].measurements['m2'] == 0)
    assert np.all(results[1][1].measurements['m2'] == 1)
    assert job.execution_status() == quantum.ExecutionStatus.State.SUCCESS
Exemplo n.º 18
0
def test_depolarizer_multiple_realizations():
    q1 = cirq.NamedQubit('q1')
    q2 = cirq.NamedQubit('q2')
    cnot = Job(cirq.Circuit([
        cirq.Moment([cirq.CNOT(q1, q2)]),
    ]))
    all_errors3 = DepolarizerChannel(probability=1.0, realizations=3)
    p0 = cirq.Symbol(DepolarizerChannel._parameter_name + '0')
    p1 = cirq.Symbol(DepolarizerChannel._parameter_name + '1')

    error_sweep = (cirq.Points(p0.name, [1.0, 1.0, 1.0]) +
                   cirq.Points(p1.name, [1.0, 1.0, 1.0]))

    cnot_then_z3 = Job(
        cirq.Circuit([
            cirq.Moment([cirq.CNOT(q1, q2)]),
            cirq.Moment([cirq.Z(q1)**p0, cirq.Z(q2)**p1])
        ]), cnot.sweep * error_sweep)
    assert all_errors3.transform_job(cnot) == cnot_then_z3
Exemplo n.º 19
0
def test_equality():
    et = cirq.testing.EqualsTester()

    et.add_equality_group(cirq.UnitSweep, cirq.UnitSweep)

    # Simple sweeps with the same key are equal to themselves, but different
    # from each other even if they happen to contain the same points.
    et.make_equality_group(lambda: cirq.Linspace('a', 0, 10, 11))
    et.make_equality_group(lambda: cirq.Linspace('b', 0, 10, 11))
    et.make_equality_group(lambda: cirq.Points('a', list(range(11))))
    et.make_equality_group(lambda: cirq.Points('b', list(range(11))))

    # Product and Zip sweeps can also be equated.
    et.make_equality_group(
        lambda: cirq.Linspace('a', 0, 5, 6) * cirq.Linspace('b', 10, 15, 6))
    et.make_equality_group(
        lambda: cirq.Linspace('a', 0, 5, 6) + cirq.Linspace('b', 10, 15, 6))
    et.make_equality_group(lambda: cirq.Points('a', [1, 2]) * (cirq.Linspace(
        'b', 0, 5, 6) + cirq.Linspace('c', 10, 15, 6)))
Exemplo n.º 20
0
def test_run_multiple_times(build):
    service = mock.Mock()
    build.return_value = service
    programs = service.projects().programs()
    jobs = programs.jobs()
    programs.create().execute.return_value = {
        'name': 'projects/project-id/programs/test'
    }
    jobs.create().execute.return_value = {
        'name': 'projects/project-id/programs/test/jobs/test',
        'executionStatus': {
            'state': 'READY'
        }
    }
    jobs.get().execute.return_value = {
        'name': 'projects/project-id/programs/test/jobs/test',
        'executionStatus': {
            'state': 'SUCCESS'
        }
    }
    jobs.getResult().execute.return_value = {'result': _RESULTS}

    engine = cg.Engine(project_id='project-id')
    program = engine.create_program(program=_SCHEDULE)
    program.run(param_resolver=cirq.ParamResolver({'a': 1}))
    sweeps1 = jobs.create.call_args[1]['body']['run_context'][
        'parameter_sweeps']
    job2 = program.run_sweep(repetitions=2, params=cirq.Points('a', [3, 4]))
    sweeps2 = jobs.create.call_args[1]['body']['run_context'][
        'parameter_sweeps']
    results = job2.results()
    assert engine.proto_version == cg.engine.engine.ProtoVersion.V1
    assert len(results) == 2
    for i, v in enumerate([1, 2]):
        assert results[i].repetitions == 1
        assert results[i].params.param_dict == {'a': v}
        assert results[i].measurements == {'q': np.array([[0]], dtype='uint8')}
    build.assert_called_with(
        'quantum',
        'v1alpha1',
        discoveryServiceUrl=('https://{api}.googleapis.com'
                             '/$discovery/rest?version='
                             '{apiVersion}'),
        requestBuilder=mock.ANY)
    assert len(sweeps1) == 1
    assert sweeps1[0]['repetitions'] == 1
    assert sweeps1[0]['sweep']['factors'][0]['sweeps'][0]['points'][
        'points'] == [1]
    assert len(sweeps2) == 1
    assert sweeps2[0]['repetitions'] == 2
    assert sweeps2[0]['sweep']['factors'][0]['sweeps'][0]['points'][
        'points'] == [3, 4]
    assert jobs.get().execute.call_count == 2
    assert jobs.getResult().execute.call_count == 2
Exemplo n.º 21
0
def test_sampler_run_batch():
    sampler = cirq.ZerosSampler()
    a = cirq.LineQubit(0)
    circuit1 = cirq.Circuit(cirq.X(a) ** sympy.Symbol('t'), cirq.measure(a, key='m'))
    circuit2 = cirq.Circuit(cirq.Y(a) ** sympy.Symbol('t'), cirq.measure(a, key='m'))
    params1 = cirq.Points('t', [0.3, 0.7])
    params2 = cirq.Points('t', [0.4, 0.6])
    results = sampler.run_batch(
        [circuit1, circuit2], params_list=[params1, params2], repetitions=[1, 2]
    )
    assert len(results) == 2
    for result, param in zip(results[0], [0.3, 0.7]):
        assert result.repetitions == 1
        assert result.params.param_dict == {'t': param}
        assert result.measurements == {'m': np.array([[0]], dtype='uint8')}
    for result, param in zip(results[1], [0.4, 0.6]):
        assert result.repetitions == 2
        assert result.params.param_dict == {'t': param}
        assert len(result.measurements) == 1
        assert np.array_equal(result.measurements['m'], np.array([[0], [0]], dtype='uint8'))
Exemplo n.º 22
0
def _sweep_from_single_param_sweep_proto(
    single_param_sweep: params_pb2.SingleSweep, ) -> cirq.Sweep:
    key = single_param_sweep.parameter_key
    if single_param_sweep.HasField('points'):
        points = single_param_sweep.points
        return cirq.Points(key, list(points.points))
    if single_param_sweep.HasField('linspace'):
        sl = single_param_sweep.linspace
        return cirq.Linspace(key, sl.first_point, sl.last_point, sl.num_points)

    raise ValueError('Single param sweep type undefined')
Exemplo n.º 23
0
def test_depolarizer_parameterized_gates():
    q1 = cirq.NamedQubit('q1')
    q2 = cirq.NamedQubit('q2')
    cnot_param = cirq.Symbol('cnot_turns')
    cnot_gate = cirq.CZ(q1, q2)**cnot_param

    job_sweep = cirq.Points('cnot_turns', [0.5])

    cnot = Job(cirq.Circuit([cirq.Moment([cnot_gate])]), job_sweep)
    all_errors = DepolarizerChannel(probability=1.0)
    p0 = cirq.Symbol(DepolarizerChannel._parameter_name + '0')
    p1 = cirq.Symbol(DepolarizerChannel._parameter_name + '1')

    error_sweep = cirq.Points(p0.name, [1.0]) + cirq.Points(p1.name, [1.0])
    cnot_then_z = Job(
        cirq.Circuit([
            cirq.Moment([cnot_gate]),
            cirq.Moment([cirq.Z(q1)**p0, cirq.Z(q2)**p1])
        ]), job_sweep * error_sweep)
    assert all_errors.transform_job(cnot) == cnot_then_z
def test_sampler():
    engine = SimulatedLocalEngine(
        [SimulatedLocalProcessor(processor_id='tester')])
    q = cirq.GridQubit(5, 4)
    circuit = cirq.Circuit(
        cirq.X(q)**sympy.Symbol('t'), cirq.measure(q, key='m'))
    sweep = cirq.Points(key='t', points=[1, 0])
    results = engine.get_sampler('tester').run_sweep(circuit,
                                                     params=sweep,
                                                     repetitions=100)
    assert np.all(results[0].measurements['m'] == 1)
    assert np.all(results[1].measurements['m'] == 0)
Exemplo n.º 25
0
def test_repr():
    cirq.testing.assert_equivalent_repr(
        cirq.study.sweeps.Product(cirq.UnitSweep),
        setup_code='import cirq\nfrom collections import OrderedDict')
    cirq.testing.assert_equivalent_repr(
        cirq.study.sweeps.Zip(cirq.UnitSweep),
        setup_code='import cirq\nfrom collections import OrderedDict')
    cirq.testing.assert_equivalent_repr(
        cirq.ListSweep(cirq.Linspace('a', start=0, stop=3, length=4)),
        setup_code='import cirq\nfrom collections import OrderedDict')
    cirq.testing.assert_equivalent_repr(cirq.Points('zero&pi', [0, 3.14159]))
    cirq.testing.assert_equivalent_repr(cirq.Linspace('I/10', 0, 1, 10))
Exemplo n.º 26
0
def test_bad_result_proto(client):
    result = any_pb2.Any()
    result.CopyFrom(_RESULTS_V2)
    result.type_url = 'type.googleapis.com/unknown'
    setup_run_circuit_with_result_(client, result)

    engine = cg.Engine(project_id='project-id', proto_version=cg.engine.engine.ProtoVersion.V2)
    job = engine.run_sweep(
        program=_CIRCUIT, job_id='job-id', params=cirq.Points('a', [1, 2]), gate_set=cg.XMON
    )
    with pytest.raises(ValueError, match='invalid result proto version'):
        job.results()
Exemplo n.º 27
0
def test_run_sweep_v1(build):
    service = mock.Mock()
    build.return_value = service
    programs = service.projects().programs()
    jobs = programs.jobs()
    programs.create().execute.return_value = {
        'name': 'projects/project-id/programs/test'
    }
    jobs.create().execute.return_value = {
        'name': 'projects/project-id/programs/test/jobs/test',
        'executionStatus': {
            'state': 'READY'
        }
    }
    jobs.get().execute.return_value = {
        'name': 'projects/project-id/programs/test/jobs/test',
        'executionStatus': {
            'state': 'SUCCESS'
        }
    }
    jobs.getResult().execute.return_value = {'result': _RESULTS}

    engine = cg.Engine(project_id='project-id')
    job = engine.run_sweep(
        program=cirq.moment_by_moment_schedule(cirq.UnconstrainedDevice,
                                               cirq.Circuit()),
        job_config=cg.JobConfig('project-id', gcs_prefix='gs://bucket/folder'),
        params=cirq.Points('a', [1, 2]))
    results = job.results()
    assert engine.proto_version == cg.engine.engine.ProtoVersion.V1
    assert len(results) == 2
    for i, v in enumerate([1, 2]):
        assert results[i].repetitions == 1
        assert results[i].params.param_dict == {'a': v}
        assert results[i].measurements == {'q': np.array([[0]], dtype='uint8')}
    build.assert_called_with(
        'quantum',
        'v1alpha1',
        discoveryServiceUrl=('https://{api}.googleapis.com'
                             '/$discovery/rest?version='
                             '{apiVersion}'),
        requestBuilder=mock.ANY)
    assert programs.create.call_args[1]['parent'] == 'projects/project-id'
    sweeps = jobs.create.call_args[1]['body']['run_context'][
        'parameter_sweeps']
    assert len(sweeps) == 1
    assert sweeps[0]['repetitions'] == 1
    assert sweeps[0]['sweep']['factors'][0]['sweeps'][0]['points'][
        'points'] == [1, 2]
    assert jobs.create.call_args[1][
        'parent'] == 'projects/project-id/programs/test'
    assert jobs.get().execute.call_count == 1
    assert jobs.getResult().execute.call_count == 1
Exemplo n.º 28
0
def test_depolarizer_multiple_realizations():
    q1 = cirq.QubitId()
    q2 = cirq.QubitId()
    cnot = Job(cirq.Circuit([
        cirq.Moment([cirq.CNOT(q1, q2)]),
        ]))
    all_errors3 = DepolarizerChannel(probability=1.0, realizations=3)
    p0 = cirq.Symbol(DepolarizerChannel._parameter_name + '0')
    p1 = cirq.Symbol(DepolarizerChannel._parameter_name + '1')

    error_sweep = (cirq.Points(p0.name, [1.0, 1.0, 1.0]) +
                   cirq.Points(p1.name, [1.0, 1.0, 1.0]))

    cnot_then_z3 = Job(
        cirq.Circuit([
            cirq.Moment([cirq.CNOT(q1, q2)]),
            cirq.Moment([xmon_gates.ExpZGate(half_turns=p0).on(q1),
                             xmon_gates.ExpZGate(half_turns=p1).on(q2)])
        ]),
        cnot.sweep * error_sweep)
    assert all_errors3.transform_job(cnot) == cnot_then_z3
Exemplo n.º 29
0
def test_sampler_sample_expectation_values_complex_param():
    a = cirq.LineQubit(0)
    t = sympy.Symbol('t')
    sampler = cirq.Simulator(seed=1)
    circuit = cirq.Circuit(cirq.global_phase_operation(t))
    obs = cirq.Z(a)
    results = sampler.sample_expectation_values(
        circuit, [obs],
        num_samples=5,
        params=cirq.Points('t', [1, 1j, (1 + 1j) / np.sqrt(2)]))

    assert np.allclose(results, [[1], [1], [1]])
Exemplo n.º 30
0
def test_depolarizer_parameterized_gates():
    q1 = cirq.QubitId()
    q2 = cirq.QubitId()
    cnot_param = cirq.Symbol('cnot_turns')
    cnot_gate = xmon_gates.Exp11Gate(half_turns=cnot_param).on(q1, q2)

    job_sweep = cirq.Points('cnot_turns', [0.5])

    cnot = Job(cirq.Circuit([cirq.Moment([cnot_gate])]), job_sweep)
    all_errors = DepolarizerChannel(probability=1.0)
    p0 = cirq.Symbol(DepolarizerChannel._parameter_name + '0')
    p1 = cirq.Symbol(DepolarizerChannel._parameter_name + '1')

    error_sweep = cirq.Points(p0.name, [1.0]) + cirq.Points(p1.name, [1.0])
    cnot_then_z = Job(
        cirq.Circuit([
            cirq.Moment([cnot_gate]),
            cirq.Moment([xmon_gates.ExpZGate(half_turns=p0).on(q1),
                             xmon_gates.ExpZGate(half_turns=p1).on(q2)])
        ]),
        job_sweep * error_sweep)
    assert all_errors.transform_job(cnot) == cnot_then_z