def test_moment_by_moment_schedule_empty_moment(): device = _TestDevice() circuit = Circuit([ Moment(), ]) schedule = moment_by_moment_schedule(device, circuit) assert len(schedule.scheduled_operations) == 0
def test_moment_by_moment_schedule_validate_operation_fails(): device = _TestDevice() qubits = device.qubits circuit = Circuit() circuit.append(ops.CNOT(qubits[0], qubits[1])) with pytest.raises(ValueError, match="CNOT"): _ = moment_by_moment_schedule(device, circuit)
def test_moment_by_moment_schedule_device_validation_fails(): device = _TestDevice() qubits = device.qubits circuit = Circuit( [Moment([ops.CZ(qubits[0], qubits[1]), ops.CZ(qubits[2], qubits[3])])]) with pytest.raises(ValueError, match="Adjacent CZ"): _ = moment_by_moment_schedule(device, circuit)
def test_protobuf_round_trip(): device = cg.Foxtail circuit = cirq.Circuit.from_ops([cirq.X(q)**0.5 for q in device.qubits], [ cirq.CZ(q, q2) for q in [cirq.GridQubit(0, 0)] for q2 in device.neighbors_of(q) ]) s1 = moment_by_moment_schedule(device, circuit) protos = list(cg.schedule_to_proto_dicts(s1)) s2 = cg.schedule_from_proto_dicts(device, protos) assert s2 == s1
def program_as_schedule(self, program: TProgram) -> schedules.Schedule: if isinstance(program, circuits.Circuit): device = program.device circuit_copy = program.copy() optimizers.DropEmptyMoments().optimize_circuit(circuit_copy) device.validate_circuit(circuit_copy) return schedules.moment_by_moment_schedule(device, circuit_copy) if isinstance(program, schedules.Schedule): return program raise TypeError('Unexpected program type.')
def test_moment_by_moment_schedule_moment_of_two_qubit_ops(): device = _TestDevice() qubits = device.qubits circuit = Circuit( [Moment((ops.CZ(qubits[i], qubits[i + 1]) for i in range(0, 9, 3)))]) schedule = moment_by_moment_schedule(device, circuit) zero_ns = cirq.Timestamp() expected = set( ScheduledOperation.op_at_on(ops.CZ(qubits[i], qubits[i + 1]), zero_ns, device) for i in range(0, 9, 3)) assert set(schedule.scheduled_operations) == expected
def test_protobuf_round_trip(): device = Foxtail circuit = cirq.Circuit.from_ops( [cirq.google.ExpWGate(half_turns=0.5).on(q) for q in device.qubits], [ cirq.google.Exp11Gate().on(q, q2) for q in [cirq.GridQubit(0, 0)] for q2 in device.neighbors_of(q) ]) s1 = moment_by_moment_schedule(device, circuit) protos = list(programs.schedule_to_proto(s1)) s2 = programs.schedule_from_proto(device, protos) assert s2 == s1
def test_moment_by_moment_schedule_moment_of_single_qubit_ops(): device = _TestDevice() qubits = device.qubits circuit = Circuit([ Moment(ops.H(q) for q in qubits), ]) schedule = moment_by_moment_schedule(device, circuit) zero_ns = cirq.Timestamp() assert set(schedule.scheduled_operations) == { ScheduledOperation.op_at_on(ops.H(q), zero_ns, device) for q in qubits }
def program_as_schedule( self, program: Union[circuits.Circuit, Schedule]) -> Schedule: if isinstance(program, circuits.Circuit): device = program.device circuit_copy = program.copy() ConvertToXmonGates().optimize_circuit(circuit_copy) optimizers.DropEmptyMoments().optimize_circuit(circuit_copy) device.validate_circuit(circuit_copy) return moment_by_moment_schedule(device, circuit_copy) if isinstance(program, Schedule): return program raise TypeError('Unexpected program type.')
def test_moment_by_moment_schedule_empty_moment_ignored(): device = _TestDevice() qubits = device.qubits circuit = Circuit( [Moment([ops.H(qubits[0])]), Moment([]), Moment([ops.H(qubits[0])])]) schedule = moment_by_moment_schedule(device, circuit) zero_ns = cirq.Timestamp() twenty_ns = cirq.Timestamp(nanos=20) assert set(schedule.scheduled_operations) == { ScheduledOperation.op_at_on(ops.H(qubits[0]), zero_ns, device), ScheduledOperation.op_at_on(ops.H(qubits[0]), twenty_ns, device), }
def program_as_schedule(self, program: Union[Circuit, Schedule], device: Device = None) -> Schedule: if isinstance(program, Circuit): device = device or UnconstrainedDevice circuit_copy = Circuit(program.moments) ConvertToXmonGates().optimize_circuit(circuit_copy) DropEmptyMoments().optimize_circuit(circuit_copy) device.validate_circuit(circuit_copy) return moment_by_moment_schedule(device, circuit_copy) elif isinstance(program, Schedule): if device: raise ValueError( 'Device can not be provided when running a schedule.') return program else: raise TypeError('Unexpected program type.')
def test_moment_by_moment_schedule_max_duration(): device = _TestDevice() qubits = device.qubits circuit = Circuit([ Moment([ops.H(qubits[0]), ops.CZ(qubits[1], qubits[2])]), Moment([ops.H(qubits[0])]) ]) schedule = moment_by_moment_schedule(device, circuit) zero_ns = cirq.Timestamp() fourty_ns = cirq.Timestamp(nanos=40) assert set(schedule.scheduled_operations) == { ScheduledOperation.op_at_on(ops.H(qubits[0]), zero_ns, device), ScheduledOperation.op_at_on(ops.CZ(qubits[1], qubits[2]), zero_ns, device), ScheduledOperation.op_at_on(ops.H(qubits[0]), fourty_ns, device), }
def test_moment_by_moment_schedule_two_moments(): device = _TestDevice() qubits = device.qubits circuit = Circuit([ Moment(ops.H(q) for q in qubits), Moment((ops.CZ(qubits[i], qubits[i + 1]) for i in range(0, 9, 3))) ]) schedule = moment_by_moment_schedule(device, circuit) zero_ns = cirq.Timestamp() twenty_ns = cirq.Timestamp(nanos=20) expected_one_qubit = set( ScheduledOperation.op_at_on(ops.H(q), zero_ns, device) for q in qubits) expected_two_qubit = set( ScheduledOperation.op_at_on(ops.CZ(qubits[i], qubits[i + 1]), twenty_ns, device) for i in range(0, 9, 3)) expected = expected_one_qubit.union(expected_two_qubit) assert set(schedule.scheduled_operations) == expected
def test_protobuf_round_trip(): device = Foxtail circuit = cirq.Circuit.from_ops( [ cirq.google.ExpWGate(half_turns=0.5).on(q) for q in device.qubits ], [ cirq.google.Exp11Gate().on(q, q2) for q in [cirq.GridQubit(0, 0)] for q2 in device.neighbors_of(q) ] ) s1 = moment_by_moment_schedule(device, circuit) protos = list(programs.schedule_to_proto(s1)) s2 = programs.schedule_from_proto(device, protos) assert s2 == s1