def from_layout_dict(layout_dict): physical_list = [] keys = layout_dict.keys() values = layout_dict.values() if all(isinstanceint(elem) for elem in keys): return list(keys) elif all(isinstanceint(elem) for elem in values): return list(values) else: raise EvaluateDelayError( "The initial_layout keys or values should be int type")
def order_based_on_type(value1, value2): """decides which one is physical/virtual based on the type. Returns (virtual, physical)""" if isinstanceint(value1) and isinstance(value2, (Qubit, type(None))): physical = int(value1) virtual = value2 elif isinstanceint(value2) and isinstance(value1, (Qubit, type(None))): physical = int(value2) virtual = value1 else: raise LayoutError('The map (%s -> %s) has to be a (Bit -> integer)' ' or the other way around.' % (type(value1), type(value2))) return virtual, physical
def from_intlist(int_list, *qregs): """Converts a list of integers to a Layout mapping virtual qubits (index of the list) to physical qubits (the list values). Args: int_list (list): A list of integers. *qregs (QuantumRegisters): The quantum registers to apply the layout to. Returns: Layout: The corresponding Layout object. Raises: LayoutError: Invalid input layout. """ if not all(isinstanceint(i) for i in int_list): raise LayoutError('Expected a list of ints') if len(int_list) != len(set(int_list)): raise LayoutError( 'Duplicate values not permitted; Layout is bijective.') n_qubits = sum(reg.size for reg in qregs) # Check if list is too short to cover all qubits if len(int_list) < n_qubits: err_msg = 'Integer list length must equal number of qubits in circuit.' raise LayoutError(err_msg) out = Layout() main_idx = 0 for qreg in qregs: for idx in range(qreg.size): out[qreg[idx]] = int_list[main_idx] main_idx += 1 if main_idx != len(int_list): for int_item in int_list[main_idx:]: out[int_item] = None return out
def _layout_from_raw(initial_layout, circuit): if initial_layout is None or isinstance(initial_layout, Layout): return initial_layout elif isinstancelist(initial_layout): if all(isinstanceint(elem) for elem in initial_layout): initial_layout = Layout.from_intlist(initial_layout, *circuit.qregs) elif all(elem is None or isinstance(elem, Qubit) for elem in initial_layout): initial_layout = Layout.from_qubit_list(initial_layout) elif isinstance(initial_layout, dict): initial_layout = Layout(initial_layout) else: raise TranspilerError("The initial_layout parameter could not be parsed") return initial_layout
def parse_initial_layout(self): new_il_list = [] for il in self.initial_layout: if isinstancelist(il): if all(isinstanceint(elem) for elem in il): new_il_list.append(il) elif all(isinstance(elem, Qubit) for elem in il): new_il_list.append(from_qubit_list(il)) elif isinstance(il, dict): new_il_list(from_layout_dict(il)) else: raise EvaluateDelayError( "The initial_layout parameter could not be parsed") return new_il_list