def add_result_type( self, result_type: ResultType, target: QubitSetInput = None, target_mapping: Dict[QubitInput, QubitInput] = {}, ) -> Circuit: """ Add a requested result type to `self`, returns `self` for chaining ability. Args: result_type (ResultType): `ResultType` to add into `self`. target (int, Qubit, or iterable of int / Qubit, optional): Target qubits for the `result_type`. Default = `None`. target_mapping (dictionary[int or Qubit, int or Qubit], optional): A dictionary of qubit mappings to apply to the `result_type.target`. Key is the qubit in `result_type.target` and the value is what the key will be changed to. Default = `{}`. Note: target and target_mapping will only be applied to those requested result types with the attribute `target`. The result_type will be appended to the end of the list of `circuit.result_types` only if it does not already exist in `circuit.result_types` Returns: Circuit: self Raises: TypeError: If both `target_mapping` and `target` are supplied. ValueError: If the observable specified for a qubit is different from what is specified by the result types already added to the circuit. Only one observable is allowed for a qubit. Examples: >>> result_type = ResultType.Probability(target=[0, 1]) >>> circ = Circuit().add_result_type(result_type) >>> print(circ.result_types[0]) Probability(target=QubitSet([Qubit(0), Qubit(1)])) >>> result_type = ResultType.Probability(target=[0, 1]) >>> circ = Circuit().add_result_type(result_type, target_mapping={0: 10, 1: 11}) >>> print(circ.result_types[0]) Probability(target=QubitSet([Qubit(10), Qubit(11)])) >>> result_type = ResultType.Probability(target=[0, 1]) >>> circ = Circuit().add_result_type(result_type, target=[10, 11]) >>> print(circ.result_types[0]) Probability(target=QubitSet([Qubit(10), Qubit(11)])) >>> result_type = ResultType.StateVector() >>> circ = Circuit().add_result_type(result_type) >>> print(circ.result_types[0]) StateVector() """ if target_mapping and target is not None: raise TypeError("Only one of 'target_mapping' or 'target' can be supplied.") if not target_mapping and not target: # Nothing has been supplied, add result_type result_type_to_add = result_type elif target_mapping: # Target mapping has been supplied, copy result_type result_type_to_add = result_type.copy(target_mapping=target_mapping) else: # ResultType with target result_type_to_add = result_type.copy(target=target) if result_type_to_add not in self._result_types: self._add_to_qubit_observable_mapping(result_type_to_add) self._add_to_qubit_observable_set(result_type_to_add) self._result_types.append(result_type_to_add) return self
def add_result_type( self, result_type: ResultType, target: QubitSetInput = None, target_mapping: Dict[QubitInput, QubitInput] = None, ) -> Circuit: """ Add a requested result type to `self`, returns `self` for chaining ability. Args: result_type (ResultType): `ResultType` to add into `self`. target (int, Qubit, or iterable of int / Qubit, optional): Target qubits for the `result_type`. Default = `None`. target_mapping (dictionary[int or Qubit, int or Qubit], optional): A dictionary of qubit mappings to apply to the `result_type.target`. Key is the qubit in `result_type.target` and the value is what the key will be changed to. Default = `None`. Note: target and target_mapping will only be applied to those requested result types with the attribute `target`. The result_type will be appended to the end of the dict keys of `circuit.result_types` only if it does not already exist in `circuit.result_types` Returns: Circuit: self Raises: TypeError: If both `target_mapping` and `target` are supplied. Examples: >>> result_type = ResultType.Probability(target=[0, 1]) >>> circ = Circuit().add_result_type(result_type) >>> print(circ.result_types[0]) Probability(target=QubitSet([Qubit(0), Qubit(1)])) >>> result_type = ResultType.Probability(target=[0, 1]) >>> circ = Circuit().add_result_type(result_type, target_mapping={0: 10, 1: 11}) >>> print(circ.result_types[0]) Probability(target=QubitSet([Qubit(10), Qubit(11)])) >>> result_type = ResultType.Probability(target=[0, 1]) >>> circ = Circuit().add_result_type(result_type, target=[10, 11]) >>> print(circ.result_types[0]) Probability(target=QubitSet([Qubit(10), Qubit(11)])) >>> result_type = ResultType.StateVector() >>> circ = Circuit().add_result_type(result_type) >>> print(circ.result_types[0]) StateVector() """ if target_mapping and target is not None: raise TypeError("Only one of 'target_mapping' or 'target' can be supplied.") if not target_mapping and not target: # Nothing has been supplied, add result_type result_type_to_add = result_type elif target_mapping: # Target mapping has been supplied, copy result_type result_type_to_add = result_type.copy(target_mapping=target_mapping) else: # ResultType with target result_type_to_add = result_type.copy(target=target) if result_type_to_add not in self._result_types: observable = Circuit._extract_observable(result_type_to_add) if observable and self._observables_simultaneously_measurable: # Only check if all observables can be simultaneously measured self._add_to_qubit_observable_mapping(observable, result_type_to_add.target) self._add_to_qubit_observable_set(result_type_to_add) # using dict as an ordered set, value is arbitrary self._result_types[result_type_to_add] = None return self