def __init__(self): super().__init__( None, name="FakeSimpleV2", description="A fake simple BackendV2 example", online_date=datetime.datetime.utcnow(), backend_version="0.0.1", ) self._lam = Parameter("lambda") self._target = Target(num_qubits=20) self._target.add_instruction(SXGate()) self._target.add_instruction(XGate()) self._target.add_instruction(RZGate(self._lam)) self._target.add_instruction(CXGate()) self._target.add_instruction(Measure()) self._runner = QasmSimulatorPy()
def test_instruction_supported_multiple_parameters(self): target = Target(1) target.add_instruction( UGate(self.theta, self.phi, self.lam), {(0, ): InstructionProperties(duration=270.22e-9, error=0.00713)}, ) self.assertFalse( target.instruction_supported("u", parameters=[math.pi])) self.assertTrue( target.instruction_supported( "u", parameters=[math.pi, math.pi, math.pi])) self.assertTrue( target.instruction_supported( operation_class=UGate, parameters=[math.pi, math.pi, math.pi])) self.assertFalse( target.instruction_supported(operation_class=UGate, parameters=[Parameter("x")]))
def test_evolutiongate_param_expr_time(self): """Test loading a circuit with an evolution gate that has a parameter for time.""" synthesis = LieTrotter(reps=2) time = Parameter("t") evo = PauliEvolutionGate((Z ^ I) + (I ^ Z), time=time * time, synthesis=synthesis) qc = QuantumCircuit(2) qc.append(evo, range(2)) qpy_file = io.BytesIO() dump(qc, qpy_file) qpy_file.seek(0) new_circ = load(qpy_file)[0] self.assertEqual(qc, new_circ) self.assertEqual([x[0].label for x in qc.data], [x[0].label for x in new_circ.data]) new_evo = new_circ.data[0][0] self.assertIsInstance(new_evo, PauliEvolutionGate)
def test_schedule_generator_supports_parameter_expressions(self): """Test expression-based schedule generator functionalty.""" t_param = Parameter('t') amp = 1.0 def test_func(dur: ParameterExpression, t_val: int): dur_bound = dur.bind({t_param: t_val}) sched = Schedule() sched += Play(library.constant(int(float(dur_bound)), amp), DriveChannel(0)) return sched expected_sched = Schedule() expected_sched += Play(library.constant(10, amp), DriveChannel(0)) inst_map = InstructionScheduleMap() inst_map.add('f', (0,), test_func) self.assertEqual(inst_map.get('f', (0,), dur=2*t_param, t_val=5), expected_sched) self.assertEqual(inst_map.get_parameters('f', (0,)), ('dur', 't_val',))
def test_bound_parameter(self): """Test a circuit with a bound parameter is correctly serialized.""" theta = Parameter("theta") qc = QuantumCircuit(5, 1) qc.h(0) for i in range(4): qc.cx(i, i + 1) qc.barrier() qc.rz(theta, range(5)) qc.barrier() for i in reversed(range(4)): qc.cx(i, i + 1) qc.h(0) qc.measure(0, 0) qc.assign_parameters({theta: 3.14}) qpy_file = io.BytesIO() dump(qc, qpy_file) qpy_file.seek(0) new_circ = load(qpy_file)[0] self.assertEqual(qc, new_circ)
def params(self, parameters): self._params = [] for single_param in parameters: # example: u2(pi/2, sin(pi/4)) if isinstance(single_param, (ParameterExpression)): self._params.append(single_param) # example: OpenQASM parsed instruction elif isinstance(single_param, node.Node): warnings.warn( 'Using qasm ast node as a circuit.Instruction ' 'parameter is deprecated as of the 0.11.0, and ' 'will be removed no earlier than 3 months after ' 'that release date. You should convert the qasm ' 'node to a supported type int, float, complex, ' 'str, circuit.ParameterExpression, or ndarray ' 'before setting Instruction.parameters', DeprecationWarning, stacklevel=3) self._params.append(single_param.sym()) # example: u3(0.1, 0.2, 0.3) elif isinstance(single_param, (int, float)): self._params.append(single_param) # example: Initialize([complex(0,1), complex(0,0)]) elif isinstance(single_param, complex): self._params.append(single_param) # example: snapshot('label') elif isinstance(single_param, str): self._params.append(Parameter(single_param)) # example: numpy.array([[1, 0], [0, 1]]) elif isinstance(single_param, numpy.ndarray): self._params.append(single_param) elif isinstance(single_param, numpy.number): self._params.append(single_param.item()) elif 'sympy' in str(type(single_param)): import sympy if isinstance(single_param, sympy.Basic): warnings.warn( 'Parameters of sympy.Basic is deprecated ' 'as of the 0.11.0, and will be removed no ' 'earlier than 3 months after that release ' 'date. You should convert this to a ' 'supported type prior to using it as a ' 'a parameter.', DeprecationWarning, stacklevel=3) self._params.append(single_param) elif isinstance(single_param, sympy.Matrix): warnings.warn( 'Parameters of sympy.Matrix is deprecated ' 'as of the 0.11.0, and will be removed no ' 'earlier than 3 months after that release ' 'date. You should convert the sympy Matrix ' 'to a numpy matrix with sympy.matrix2numpy ' 'prior to using it as a parameter.', DeprecationWarning, stacklevel=3) matrix = sympy.matrix2numpy(single_param, dtype=complex) self._params.append(matrix) elif isinstance(single_param, sympy.Expr): warnings.warn( 'Parameters of sympy.Expr is deprecated ' 'as of the 0.11.0, and will be removed no ' 'earlier than 3 months after that release ' 'date. You should convert the sympy Expr ' 'to a supported type prior to using it as ' 'a parameter.', DeprecationWarning, stacklevel=3) self._params.append(single_param) else: raise CircuitError("invalid param type {0} in instruction " "{1}".format(type(single_param), self.name)) else: raise CircuitError("invalid param type {0} in instruction " "{1}".format(type(single_param), self.name))
def test_instruction_supported_parameters(self): mumbai = FakeMumbaiFractionalCX() self.assertTrue( mumbai.target.instruction_supported(qargs=(0, 1), operation_class=RZXGate, parameters=[math.pi / 4])) self.assertTrue( mumbai.target.instruction_supported(qargs=(0, 1), operation_class=RZXGate)) self.assertTrue( mumbai.target.instruction_supported(operation_class=RZXGate, parameters=[math.pi / 4])) self.assertFalse( mumbai.target.instruction_supported("rzx", parameters=[math.pi / 4])) self.assertTrue( mumbai.target.instruction_supported( "rz", parameters=[Parameter("angle")])) self.assertTrue( mumbai.target.instruction_supported("rzx_45", qargs=(0, 1), parameters=[math.pi / 4])) self.assertTrue( mumbai.target.instruction_supported("rzx_45", qargs=(0, 1))) self.assertTrue( mumbai.target.instruction_supported("rzx_45", parameters=[math.pi / 4])) self.assertFalse( mumbai.target.instruction_supported("rzx_45", parameters=[math.pi / 6])) self.assertFalse( mumbai.target.instruction_supported( "rzx_45", parameters=[Parameter("angle")])) self.assertTrue( self.ideal_sim_target.instruction_supported( qargs=(0, ), operation_class=RXGate, parameters=[Parameter("angle")])) self.assertTrue( self.ideal_sim_target.instruction_supported(qargs=(0, ), operation_class=RXGate, parameters=[math.pi])) self.assertTrue( self.ideal_sim_target.instruction_supported(operation_class=RXGate, parameters=[math.pi])) self.assertTrue( self.ideal_sim_target.instruction_supported( operation_class=RXGate, parameters=[Parameter("angle")])) self.assertTrue( self.ideal_sim_target.instruction_supported( "rx", qargs=(0, ), parameters=[Parameter("angle")])) self.assertTrue( self.ideal_sim_target.instruction_supported("rx", qargs=(0, ), parameters=[math.pi])) self.assertTrue( self.ideal_sim_target.instruction_supported("rx", parameters=[math.pi])) self.assertTrue( self.ideal_sim_target.instruction_supported( "rx", parameters=[Parameter("angle")]))
def setUp(self): super().setUp() self.fake_backend = FakeBackendV2() self.fake_backend_target = self.fake_backend.target self.theta = Parameter("theta") self.phi = Parameter("phi") self.ibm_target = Target() i_props = { (0, ): InstructionProperties(duration=35.5e-9, error=0.000413), (1, ): InstructionProperties(duration=35.5e-9, error=0.000502), (2, ): InstructionProperties(duration=35.5e-9, error=0.0004003), (3, ): InstructionProperties(duration=35.5e-9, error=0.000614), (4, ): InstructionProperties(duration=35.5e-9, error=0.006149), } self.ibm_target.add_instruction(IGate(), i_props) rz_props = { (0, ): InstructionProperties(duration=0, error=0), (1, ): InstructionProperties(duration=0, error=0), (2, ): InstructionProperties(duration=0, error=0), (3, ): InstructionProperties(duration=0, error=0), (4, ): InstructionProperties(duration=0, error=0), } self.ibm_target.add_instruction(RZGate(self.theta), rz_props) sx_props = { (0, ): InstructionProperties(duration=35.5e-9, error=0.000413), (1, ): InstructionProperties(duration=35.5e-9, error=0.000502), (2, ): InstructionProperties(duration=35.5e-9, error=0.0004003), (3, ): InstructionProperties(duration=35.5e-9, error=0.000614), (4, ): InstructionProperties(duration=35.5e-9, error=0.006149), } self.ibm_target.add_instruction(SXGate(), sx_props) x_props = { (0, ): InstructionProperties(duration=35.5e-9, error=0.000413), (1, ): InstructionProperties(duration=35.5e-9, error=0.000502), (2, ): InstructionProperties(duration=35.5e-9, error=0.0004003), (3, ): InstructionProperties(duration=35.5e-9, error=0.000614), (4, ): InstructionProperties(duration=35.5e-9, error=0.006149), } self.ibm_target.add_instruction(XGate(), x_props) cx_props = { (3, 4): InstructionProperties(duration=270.22e-9, error=0.00713), (4, 3): InstructionProperties(duration=305.77e-9, error=0.00713), (3, 1): InstructionProperties(duration=462.22e-9, error=0.00929), (1, 3): InstructionProperties(duration=497.77e-9, error=0.00929), (1, 2): InstructionProperties(duration=227.55e-9, error=0.00659), (2, 1): InstructionProperties(duration=263.11e-9, error=0.00659), (0, 1): InstructionProperties(duration=519.11e-9, error=0.01201), (1, 0): InstructionProperties(duration=554.66e-9, error=0.01201), } self.ibm_target.add_instruction(CXGate(), cx_props) measure_props = { (0, ): InstructionProperties(duration=5.813e-6, error=0.0751), (1, ): InstructionProperties(duration=5.813e-6, error=0.0225), (2, ): InstructionProperties(duration=5.813e-6, error=0.0146), (3, ): InstructionProperties(duration=5.813e-6, error=0.0215), (4, ): InstructionProperties(duration=5.813e-6, error=0.0333), } self.ibm_target.add_instruction(Measure(), measure_props) self.aqt_target = Target(description="AQT Target") rx_props = { (0, ): None, (1, ): None, (2, ): None, (3, ): None, (4, ): None, } self.aqt_target.add_instruction(RXGate(self.theta), rx_props) ry_props = { (0, ): None, (1, ): None, (2, ): None, (3, ): None, (4, ): None, } self.aqt_target.add_instruction(RYGate(self.theta), ry_props) rz_props = { (0, ): None, (1, ): None, (2, ): None, (3, ): None, (4, ): None, } self.aqt_target.add_instruction(RZGate(self.theta), rz_props) r_props = { (0, ): None, (1, ): None, (2, ): None, (3, ): None, (4, ): None, } self.aqt_target.add_instruction(RGate(self.theta, self.phi), r_props) rxx_props = { (0, 1): None, (0, 2): None, (0, 3): None, (0, 4): None, (1, 0): None, (2, 0): None, (3, 0): None, (4, 0): None, (1, 2): None, (1, 3): None, (1, 4): None, (2, 1): None, (3, 1): None, (4, 1): None, (2, 3): None, (2, 4): None, (3, 2): None, (4, 2): None, (3, 4): None, (4, 3): None, } self.aqt_target.add_instruction(RXXGate(self.theta), rxx_props) measure_props = { (0, ): None, (1, ): None, (2, ): None, (3, ): None, (4, ): None, } self.aqt_target.add_instruction(Measure(), measure_props) self.empty_target = Target() self.ideal_sim_target = Target(num_qubits=3, description="Ideal Simulator") self.lam = Parameter("lam") for inst in [ UGate(self.theta, self.phi, self.lam), RXGate(self.theta), RYGate(self.theta), RZGate(self.theta), CXGate(), ECRGate(), CCXGate(), Measure(), ]: self.ideal_sim_target.add_instruction(inst, {None: None})
def convert_to_target(conf_dict: dict, props_dict: dict = None, defs_dict: dict = None) -> Target: """Uses configuration, properties and pulse defaults dicts to construct and return Target class. """ name_mapping = { "id": IGate(), "sx": SXGate(), "x": XGate(), "cx": CXGate(), "rz": RZGate(Parameter("λ")), "reset": Reset(), } custom_gates = {} qubit_props = None if props_dict: qubit_props = qubit_props_from_props(props_dict) target = Target(qubit_properties=qubit_props) # Parse from properties if it exsits if props_dict is not None: # Parse instructions gates = {} for gate in props_dict["gates"]: name = gate["gate"] if name in name_mapping: if name not in gates: gates[name] = {} elif name not in custom_gates: custom_gate = Gate(name, len(gate["qubits"]), []) custom_gates[name] = custom_gate gates[name] = {} qubits = tuple(gate["qubits"]) gate_props = {} for param in gate["parameters"]: if param["name"] == "gate_error": gate_props["error"] = param["value"] if param["name"] == "gate_length": gate_props["duration"] = apply_prefix( param["value"], param["unit"]) gates[name][qubits] = InstructionProperties(**gate_props) for gate, props in gates.items(): if gate in name_mapping: inst = name_mapping.get(gate) else: inst = custom_gates[gate] target.add_instruction(inst, props) # Create measurement instructions: measure_props = {} count = 0 for qubit in props_dict["qubits"]: qubit_prop = {} for prop in qubit: if prop["name"] == "readout_length": qubit_prop["duration"] = apply_prefix( prop["value"], prop["unit"]) if prop["name"] == "readout_error": qubit_prop["error"] = prop["value"] measure_props[(count, )] = InstructionProperties(**qubit_prop) count += 1 target.add_instruction(Measure(), measure_props) # Parse from configuration because properties doesn't exist else: for gate in conf_dict["gates"]: name = gate["name"] gate_props = {tuple(x): None for x in gate["coupling_map"]} if name in name_mapping: target.add_instruction(name_mapping[name], gate_props) else: custom_gate = Gate(name, len(gate["coupling_map"][0]), []) target.add_instruction(custom_gate, gate_props) measure_props = {(n, ): None for n in range(conf_dict["n_qubits"])} target.add_instruction(Measure(), measure_props) # parse global configuration properties dt = conf_dict.get("dt") if dt: target.dt = dt * 1e-9 if "timing_constraints" in conf_dict: target.granularity = conf_dict["timing_constraints"].get("granularity") target.min_length = conf_dict["timing_constraints"].get("min_length") target.pulse_alignment = conf_dict["timing_constraints"].get( "pulse_alignment") target.aquire_alignment = conf_dict["timing_constraints"].get( "acquire_alignment") # If pulse defaults exists use that as the source of truth if defs_dict is not None: # TODO remove the usage of PulseDefaults as it will be deprecated in the future pulse_defs = PulseDefaults.from_dict(defs_dict) inst_map = pulse_defs.instruction_schedule_map for inst in inst_map.instructions: for qarg in inst_map.qubits_with_instruction(inst): sched = inst_map.get(inst, qarg) if inst in target: try: qarg = tuple(qarg) except TypeError: qarg = (qarg, ) if inst == "measure": for qubit in qarg: target[inst][(qubit, )].calibration = sched else: target[inst][qarg].calibration = sched target.add_instruction(Delay(Parameter("t")), {(bit, ): None for bit in range(target.num_qubits)}) return target
def __init__(self): super().__init__( name="FakeMumbaiV2", description="A fake BackendV2 example based on IBM Mumbai", online_date=datetime.datetime.utcnow(), backend_version="0.0.1", ) dt = 0.2222222222222222e-9 self._target = Target(dt=dt) self._phi = Parameter("phi") rz_props = { (0, ): InstructionProperties(duration=0.0, error=0), (1, ): InstructionProperties(duration=0.0, error=0), (2, ): InstructionProperties(duration=0.0, error=0), (3, ): InstructionProperties(duration=0.0, error=0), (4, ): InstructionProperties(duration=0.0, error=0), (5, ): InstructionProperties(duration=0.0, error=0), (6, ): InstructionProperties(duration=0.0, error=0), (7, ): InstructionProperties(duration=0.0, error=0), (8, ): InstructionProperties(duration=0.0, error=0), (9, ): InstructionProperties(duration=0.0, error=0), (10, ): InstructionProperties(duration=0.0, error=0), (11, ): InstructionProperties(duration=0.0, error=0), (12, ): InstructionProperties(duration=0.0, error=0), (13, ): InstructionProperties(duration=0.0, error=0), (14, ): InstructionProperties(duration=0.0, error=0), (15, ): InstructionProperties(duration=0.0, error=0), (16, ): InstructionProperties(duration=0.0, error=0), (17, ): InstructionProperties(duration=0.0, error=0), (18, ): InstructionProperties(duration=0.0, error=0), (19, ): InstructionProperties(duration=0.0, error=0), (20, ): InstructionProperties(duration=0.0, error=0), (21, ): InstructionProperties(duration=0.0, error=0), (22, ): InstructionProperties(duration=0.0, error=0), (23, ): InstructionProperties(duration=0.0, error=0), (24, ): InstructionProperties(duration=0.0, error=0), (25, ): InstructionProperties(duration=0.0, error=0), (26, ): InstructionProperties(duration=0.0, error=0), } self._target.add_instruction(RZGate(self._phi), rz_props) x_props = { (0, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00020056469709026198), (1, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.0004387432040599484), (2, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.0002196765027963209), (3, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.0003065541555566093), (4, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.0002402026686478811), (5, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.0002162777062721698), (6, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00021981280474256117), (7, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00018585647396926756), (8, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00027053333211825124), (9, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.0002603116226593832), (10, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00023827406030798066), (11, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00024856063217108685), (12, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.0002065075637361354), (13, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00024898181450337464), (14, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00017758796319636606), (15, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00016530893922883836), (16, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.0003213658218204255), (17, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00024068450432012685), (18, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00026676441863976344), (19, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00017090891698571018), (20, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00021057196071004095), (21, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00030445404779882887), (22, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00019322295843406375), (23, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00030966037392287727), (24, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00023570754161126), (25, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00018367783963229033), (26, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00019630609928571516), } self._target.add_instruction(XGate(), x_props) sx_props = { (0, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00020056469709026198), (1, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.0004387432040599484), (2, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.0002196765027963209), (3, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.0003065541555566093), (4, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.0002402026686478811), (5, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.0002162777062721698), (6, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00021981280474256117), (7, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00018585647396926756), (8, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00027053333211825124), (9, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.0002603116226593832), (10, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00023827406030798066), (11, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00024856063217108685), (12, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.0002065075637361354), (13, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00024898181450337464), (14, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00017758796319636606), (15, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00016530893922883836), (16, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.0003213658218204255), (17, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00024068450432012685), (18, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00026676441863976344), (19, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00017090891698571018), (20, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00021057196071004095), (21, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00030445404779882887), (22, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00019322295843406375), (23, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00030966037392287727), (24, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00023570754161126), (25, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00018367783963229033), (26, ): InstructionProperties(duration=3.5555555555555554e-08, error=0.00019630609928571516), } self._target.add_instruction(SXGate(), sx_props) chunk_size = 16 cx_props = { (0, 1): InstructionProperties(duration=101 * chunk_size * dt, error=0.030671121181161276), (4, 1): InstructionProperties(duration=70 * chunk_size * dt, error=0.014041986073052737), (4, 7): InstructionProperties(duration=74 * chunk_size * dt, error=0.0052040275323747), (10, 7): InstructionProperties(duration=92 * chunk_size * dt, error=0.005625282141655502), (10, 12): InstructionProperties(duration=84 * chunk_size * dt, error=0.005771827440726435), (15, 12): InstructionProperties(duration=84 * chunk_size * dt, error=0.0050335609425562755), (15, 18): InstructionProperties(duration=64 * chunk_size * dt, error=0.0051374141171115495), (12, 13): InstructionProperties(duration=70 * chunk_size * dt, error=0.011361175954064051), (13, 14): InstructionProperties(duration=101 * chunk_size * dt, error=0.005231334872256355), # From FakeMumbai: (1, 0): InstructionProperties(duration=4.551111111111111e-07, error=0.030671121181161276), (1, 2): InstructionProperties(duration=7.395555555555556e-07, error=0.03420291964205785), (1, 4): InstructionProperties(duration=3.6266666666666663e-07, error=0.014041986073052737), (2, 1): InstructionProperties(duration=7.04e-07, error=0.03420291964205785), (2, 3): InstructionProperties(duration=4.266666666666666e-07, error=0.005618162036535312), (3, 2): InstructionProperties(duration=3.911111111111111e-07, error=0.005618162036535312), (3, 5): InstructionProperties(duration=3.5555555555555553e-07, error=0.006954580732294352), (5, 3): InstructionProperties(duration=3.911111111111111e-07, error=0.006954580732294352), (5, 8): InstructionProperties(duration=1.3155555555555553e-06, error=0.021905829471073668), (6, 7): InstructionProperties(duration=2.4177777777777775e-07, error=0.011018069718028878), (7, 4): InstructionProperties(duration=3.7688888888888884e-07, error=0.0052040275323747), (7, 6): InstructionProperties(duration=2.7733333333333333e-07, error=0.011018069718028878), (7, 10): InstructionProperties(duration=4.337777777777778e-07, error=0.005625282141655502), (8, 5): InstructionProperties(duration=1.351111111111111e-06, error=0.021905829471073668), (8, 9): InstructionProperties(duration=6.897777777777777e-07, error=0.011889378687341773), (8, 11): InstructionProperties(duration=5.902222222222222e-07, error=0.009523844852027258), (9, 8): InstructionProperties(duration=6.542222222222222e-07, error=0.011889378687341773), (11, 8): InstructionProperties(duration=6.257777777777777e-07, error=0.009523844852027258), (11, 14): InstructionProperties(duration=4.053333333333333e-07, error=0.004685421425282804), (12, 10): InstructionProperties(duration=3.9822222222222215e-07, error=0.005771827440726435), (12, 15): InstructionProperties(duration=4.053333333333333e-07, error=0.0050335609425562755), (13, 12): InstructionProperties(duration=5.831111111111111e-07, error=0.011361175954064051), (14, 11): InstructionProperties(duration=3.697777777777778e-07, error=0.004685421425282804), (14, 13): InstructionProperties(duration=3.5555555555555553e-07, error=0.005231334872256355), (14, 16): InstructionProperties(duration=3.484444444444444e-07, error=0.0051117141032224755), (16, 14): InstructionProperties(duration=3.1288888888888885e-07, error=0.0051117141032224755), (16, 19): InstructionProperties(duration=7.537777777777777e-07, error=0.013736796355458464), (17, 18): InstructionProperties(duration=2.488888888888889e-07, error=0.007267536233537236), (18, 15): InstructionProperties(duration=3.413333333333333e-07, error=0.0051374141171115495), (18, 17): InstructionProperties(duration=2.8444444444444443e-07, error=0.007267536233537236), (18, 21): InstructionProperties(duration=4.977777777777778e-07, error=0.007718304749257138), (19, 16): InstructionProperties(duration=7.182222222222222e-07, error=0.013736796355458464), (19, 20): InstructionProperties(duration=4.266666666666666e-07, error=0.005757038521092134), (19, 22): InstructionProperties(duration=3.6266666666666663e-07, error=0.004661878013991871), (20, 19): InstructionProperties(duration=3.911111111111111e-07, error=0.005757038521092134), (21, 18): InstructionProperties(duration=5.333333333333332e-07, error=0.007718304749257138), (21, 23): InstructionProperties(duration=3.911111111111111e-07, error=0.007542515578725928), (22, 19): InstructionProperties(duration=3.271111111111111e-07, error=0.004661878013991871), (22, 25): InstructionProperties(duration=4.835555555555555e-07, error=0.005536735115231589), (23, 21): InstructionProperties(duration=4.266666666666666e-07, error=0.007542515578725928), (23, 24): InstructionProperties(duration=6.613333333333332e-07, error=0.010797784688907186), (24, 23): InstructionProperties(duration=6.257777777777777e-07, error=0.010797784688907186), (24, 25): InstructionProperties(duration=4.337777777777778e-07, error=0.006127506135155392), (25, 22): InstructionProperties(duration=4.48e-07, error=0.005536735115231589), (25, 24): InstructionProperties(duration=4.693333333333333e-07, error=0.006127506135155392), (25, 26): InstructionProperties(duration=3.484444444444444e-07, error=0.0048451525929122385), (26, 25): InstructionProperties(duration=3.1288888888888885e-07, error=0.0048451525929122385), } self.target.add_instruction(CXGate(), cx_props) # Error and duration the same as CX rzx_90_props = { (0, 1): InstructionProperties(duration=101 * chunk_size * dt, error=0.030671121181161276), (4, 1): InstructionProperties(duration=70 * chunk_size * dt, error=0.014041986073052737), (4, 7): InstructionProperties(duration=74 * chunk_size * dt, error=0.0052040275323747), (10, 7): InstructionProperties(duration=92 * chunk_size * dt, error=0.005625282141655502), (10, 12): InstructionProperties(duration=84 * chunk_size * dt, error=0.005771827440726435), (15, 12): InstructionProperties(duration=84 * chunk_size * dt, error=0.0050335609425562755), (15, 18): InstructionProperties(duration=64 * chunk_size * dt, error=0.0051374141171115495), (12, 13): InstructionProperties(duration=70 * chunk_size * dt, error=0.011361175954064051), (13, 14): InstructionProperties(duration=101 * chunk_size * dt, error=0.005231334872256355), } self.target.add_instruction(RZXGate(np.pi / 2), rzx_90_props, name="rzx_90") rzx_45_props = { (0, 1): InstructionProperties(duration=52 * chunk_size * dt, error=0.030671121181161276 / 2), (4, 1): InstructionProperties(duration=37 * chunk_size * dt, error=0.014041986073052737 / 2), (4, 7): InstructionProperties(duration=40 * chunk_size * dt, error=0.0052040275323747 / 2), (10, 7): InstructionProperties(duration=46 * chunk_size * dt, error=0.005625282141655502 / 2), (10, 12): InstructionProperties(duration=45 * chunk_size * dt, error=0.005771827440726435 / 2), (15, 12): InstructionProperties(duration=42 * chunk_size * dt, error=0.0050335609425562755 / 2), (15, 18): InstructionProperties(duration=34 * chunk_size * dt, error=0.0051374141171115495 / 2), (12, 13): InstructionProperties(duration=37 * chunk_size * dt, error=0.011361175954064051 / 2), (13, 14): InstructionProperties(duration=52 * chunk_size * dt, error=0.005231334872256355 / 2), } self.target.add_instruction(RZXGate(np.pi / 4), rzx_45_props, name="rzx_45") rzx_30_props = { (0, 1): InstructionProperties(duration=37 * chunk_size * dt, error=0.030671121181161276 / 3), (4, 1): InstructionProperties(duration=24 * chunk_size * dt, error=0.014041986073052737 / 3), (4, 7): InstructionProperties(duration=29 * chunk_size * dt, error=0.0052040275323747 / 3), (10, 7): InstructionProperties(duration=32 * chunk_size * dt, error=0.005625282141655502 / 3), (10, 12): InstructionProperties(duration=32 * chunk_size * dt, error=0.005771827440726435 / 3), (15, 12): InstructionProperties(duration=29 * chunk_size * dt, error=0.0050335609425562755 / 3), (15, 18): InstructionProperties(duration=26 * chunk_size * dt, error=0.0051374141171115495 / 3), (12, 13): InstructionProperties(duration=24 * chunk_size * dt, error=0.011361175954064051 / 3), (13, 14): InstructionProperties(duration=377 * chunk_size * dt, error=0.005231334872256355 / 3), } self.target.add_instruction(RZXGate(np.pi / 6), rzx_30_props, name="rzx_30") reset_props = {(i, ): InstructionProperties(duration=3676.4444444444443) for i in range(27)} self._target.add_instruction(Reset(), reset_props) meas_props = { (0, ): InstructionProperties(duration=3.552e-06, error=0.02089999999999992), (1, ): InstructionProperties(duration=3.552e-06, error=0.020199999999999996), (2, ): InstructionProperties(duration=3.552e-06, error=0.014100000000000001), (3, ): InstructionProperties(duration=3.552e-06, error=0.03710000000000002), (4, ): InstructionProperties(duration=3.552e-06, error=0.015100000000000002), (5, ): InstructionProperties(duration=3.552e-06, error=0.01869999999999994), (6, ): InstructionProperties(duration=3.552e-06, error=0.013000000000000012), (7, ): InstructionProperties(duration=3.552e-06, error=0.02059999999999995), (8, ): InstructionProperties(duration=3.552e-06, error=0.06099999999999994), (9, ): InstructionProperties(duration=3.552e-06, error=0.02950000000000008), (10, ): InstructionProperties(duration=3.552e-06, error=0.040000000000000036), (11, ): InstructionProperties(duration=3.552e-06, error=0.017299999999999982), (12, ): InstructionProperties(duration=3.552e-06, error=0.04410000000000003), (13, ): InstructionProperties(duration=3.552e-06, error=0.017199999999999993), (14, ): InstructionProperties(duration=3.552e-06, error=0.10119999999999996), (15, ): InstructionProperties(duration=3.552e-06, error=0.07840000000000003), (16, ): InstructionProperties(duration=3.552e-06, error=0.014499999999999957), (17, ): InstructionProperties(duration=3.552e-06, error=0.021299999999999986), (18, ): InstructionProperties(duration=3.552e-06, error=0.022399999999999975), (19, ): InstructionProperties(duration=3.552e-06, error=0.01859999999999995), (20, ): InstructionProperties(duration=3.552e-06, error=0.02859999999999996), (21, ): InstructionProperties(duration=3.552e-06, error=0.021600000000000064), (22, ): InstructionProperties(duration=3.552e-06, error=0.030200000000000005), (23, ): InstructionProperties(duration=3.552e-06, error=0.01970000000000005), (24, ): InstructionProperties(duration=3.552e-06, error=0.03079999999999994), (25, ): InstructionProperties(duration=3.552e-06, error=0.04400000000000004), (26, ): InstructionProperties(duration=3.552e-06, error=0.026800000000000046), } self.target.add_instruction(Measure(), meas_props) self._qubit_properties = { 0: QubitProperties(t1=0.00015987993124584417, t2=0.00016123516590787283, frequency=5073462814.921423), 1: QubitProperties(t1=0.00017271188343294773, t2=3.653713654834547e-05, frequency=4943844681.620448), 2: QubitProperties(t1=7.179635917914033e-05, t2=0.00012399765778639733, frequency=4668157502.363186), 3: QubitProperties(t1=0.0001124203171256432, t2=0.0001879954854434302, frequency=4887315883.214115), 4: QubitProperties(t1=9.568769051084652e-05, t2=6.9955557231525e-05, frequency=5016355075.77537), 5: QubitProperties(t1=9.361326963775646e-05, t2=0.00012561361411231962, frequency=4950539585.866738), 6: QubitProperties(t1=9.735672898365994e-05, t2=0.00012522003396944046, frequency=4970622491.726983), 7: QubitProperties(t1=0.00012117839009784141, t2=0.0001492370106539427, frequency=4889863864.167805), 8: QubitProperties(t1=8.394707006435891e-05, t2=5.5194256398727296e-05, frequency=4769852625.405966), 9: QubitProperties(t1=0.00012392229685657686, t2=5.97129502818714e-05, frequency=4948868138.885028), 10: QubitProperties(t1=0.00011193014813922708, t2=0.00014091085124119432, frequency=4966294754.357908), 11: QubitProperties(t1=0.000124426408667364, t2=9.561432905002298e-05, frequency=4664636564.282378), 12: QubitProperties(t1=0.00012469120424014884, t2=7.1792446286313e-05, frequency=4741461907.952719), 13: QubitProperties(t1=0.00010010942474357871, t2=9.260751861141544e-05, frequency=4879064835.799635), 14: QubitProperties(t1=0.00010793367069728063, t2=0.00020462601085738193, frequency=4774809501.962878), 15: QubitProperties(t1=0.00010814279470918582, t2=0.00014052616328020083, frequency=4860834948.367331), 16: QubitProperties(t1=9.889617874757627e-05, t2=0.00012160357011388956, frequency=4978318747.333388), 17: QubitProperties(t1=8.435212562619916e-05, t2=4.43587633824445e-05, frequency=5000300619.491221), 18: QubitProperties(t1=0.00011719166507869474, t2=5.461866556148401e-05, frequency=4772460318.985625), 19: QubitProperties(t1=0.00013321880066203932, t2=0.0001704632622810825, frequency=4807707035.998121), 20: QubitProperties(t1=9.14192211953385e-05, t2=0.00014298332288799443, frequency=5045028334.669125), 21: QubitProperties(t1=5.548103716494676e-05, t2=9.328101902519704e-05, frequency=4941029753.792485), 22: QubitProperties(t1=0.00017109481586484562, t2=0.00019209594920551097, frequency=4906801587.246266), 23: QubitProperties(t1=0.00010975552427765991, t2=0.00015616813868639905, frequency=4891601685.652732), 24: QubitProperties(t1=0.0001612962696960434, t2=6.940808472789023e-05, frequency=4664347869.784967), 25: QubitProperties(t1=0.00015414506978323392, t2=8.382170181880107e-05, frequency=4742061753.511209), 26: QubitProperties(t1=0.00011828557676958944, t2=0.00016963640893557827, frequency=4961661099.733828), }
def convert_to_target( configuration: BackendConfiguration, properties: BackendProperties = None, defaults: PulseDefaults = None, ) -> Target: """Uses configuration, properties and pulse defaults to construct and return Target class. """ name_mapping = { "id": IGate(), "sx": SXGate(), "x": XGate(), "cx": CXGate(), "rz": RZGate(Parameter("λ")), "reset": Reset(), } custom_gates = {} target = None # Parse from properties if it exsits if properties is not None: qubit_properties = qubit_props_list_from_props(properties=properties) target = Target( num_qubits=configuration.n_qubits, qubit_properties=qubit_properties ) # Parse instructions gates: Dict[str, Any] = {} for gate in properties.gates: name = gate.gate if name in name_mapping: if name not in gates: gates[name] = {} elif name not in custom_gates: custom_gate = Gate(name, len(gate.qubits), []) custom_gates[name] = custom_gate gates[name] = {} qubits = tuple(gate.qubits) gate_props = {} for param in gate.parameters: if param.name == "gate_error": gate_props["error"] = param.value if param.name == "gate_length": gate_props["duration"] = apply_prefix(param.value, param.unit) gates[name][qubits] = InstructionProperties(**gate_props) for gate, props in gates.items(): if gate in name_mapping: inst = name_mapping.get(gate) else: inst = custom_gates[gate] target.add_instruction(inst, props) # Create measurement instructions: measure_props = {} for qubit, _ in enumerate(properties.qubits): measure_props[(qubit,)] = InstructionProperties( duration=properties.readout_length(qubit), error=properties.readout_error(qubit), ) target.add_instruction(Measure(), measure_props) # Parse from configuration because properties doesn't exist else: target = Target(num_qubits=configuration.n_qubits) for gate in configuration.gates: name = gate.name gate_props = ( {tuple(x): None for x in gate.coupling_map} # type: ignore[misc] if hasattr(gate, "coupling_map") else {None: None} ) gate_len = len(gate.coupling_map[0]) if hasattr(gate, "coupling_map") else 0 if name in name_mapping: target.add_instruction(name_mapping[name], gate_props) else: custom_gate = Gate(name, gate_len, []) target.add_instruction(custom_gate, gate_props) target.add_instruction(Measure()) # parse global configuration properties if hasattr(configuration, "dt"): target.dt = configuration.dt if hasattr(configuration, "timing_constraints"): target.granularity = configuration.timing_constraints.get("granularity") target.min_length = configuration.timing_constraints.get("min_length") target.pulse_alignment = configuration.timing_constraints.get("pulse_alignment") target.aquire_alignment = configuration.timing_constraints.get( "acquire_alignment" ) # If a pulse defaults exists use that as the source of truth if defaults is not None: inst_map = defaults.instruction_schedule_map for inst in inst_map.instructions: for qarg in inst_map.qubits_with_instruction(inst): sched = inst_map.get(inst, qarg) if inst in target: try: qarg = tuple(qarg) except TypeError: qarg = (qarg,) if inst == "measure": for qubit in qarg: target[inst][(qubit,)].calibration = sched else: target[inst][qarg].calibration = sched if "delay" not in target: target.add_instruction( Delay(Parameter("t")), {(bit,): None for bit in range(target.num_qubits)} ) return target
def __init__(self, bidirectional=True): super().__init__( None, name="Fake5QV2", description="A fake BackendV2 example", online_date=datetime.datetime.utcnow(), backend_version="0.0.1", ) self._target = Target() self._theta = Parameter("theta") self._phi = Parameter("phi") self._lam = Parameter("lambda") u_props = { (0, ): InstructionProperties(duration=5.23e-8, error=0.00038115), (1, ): InstructionProperties(duration=4.52e-8, error=0.00032115), (2, ): InstructionProperties(duration=5.23e-8, error=0.00038115), (3, ): InstructionProperties(duration=4.52e-8, error=0.00032115), (4, ): InstructionProperties(duration=4.52e-8, error=0.00032115), } self._target.add_instruction(UGate(self._theta, self._phi, self._lam), u_props) cx_props = { (0, 1): InstructionProperties(duration=5.23e-7, error=0.00098115), (3, 4): InstructionProperties(duration=5.23e-7, error=0.00098115), } if bidirectional: cx_props[(1, 0)] = InstructionProperties(duration=6.23e-7, error=0.00099115) cx_props[(4, 3)] = InstructionProperties(duration=7.23e-7, error=0.00099115) self._target.add_instruction(CXGate(), cx_props) measure_props = { (0, ): InstructionProperties(duration=6e-6, error=5e-6), (1, ): InstructionProperties(duration=1e-6, error=9e-6), (2, ): InstructionProperties(duration=6e-6, error=5e-6), (3, ): InstructionProperties(duration=1e-6, error=9e-6), (4, ): InstructionProperties(duration=1e-6, error=9e-6), } self._target.add_instruction(Measure(), measure_props) ecr_props = { (1, 2): InstructionProperties(duration=4.52e-9, error=0.0000132115), (2, 3): InstructionProperties(duration=4.52e-9, error=0.0000132115), } if bidirectional: ecr_props[(2, 1)] = InstructionProperties(duration=5.52e-9, error=0.0000232115) ecr_props[(3, 2)] = InstructionProperties(duration=5.52e-9, error=0.0000232115) self._target.add_instruction(ECRGate(), ecr_props) self.options.set_validator("shots", (1, 4096)) self._qubit_properties = { 0: QubitProperties(t1=63.48783e-6, t2=112.23246e-6, frequency=5.17538e9), 1: QubitProperties(t1=73.09352e-6, t2=126.83382e-6, frequency=5.26722e9), 2: QubitProperties(t1=73.09352e-6, t2=126.83382e-6, frequency=5.26722e9), 3: QubitProperties(t1=73.09352e-6, t2=126.83382e-6, frequency=5.26722e9), 4: QubitProperties(t1=73.09352e-6, t2=126.83382e-6, frequency=5.26722e9), }