def _compute_metric_dict( self, metrics: v2.metrics_pb2.MetricsSnapshot ) -> Dict[str, Dict[Tuple['cirq.GridQubit', ...], Any]]: results: Dict[str, Dict[Tuple[devices.GridQubit, ...], Any]] = defaultdict(dict) for metric in metrics: name = metric.name # Flatten the values to a list, removing keys containing type names # (e.g. proto version of each value is {<type>: value}). flat_values = [ getattr(v, v.WhichOneof('val')) for v in metric.values ] if metric.targets: targets = [ t[1:] if t.startswith('q') else t for t in metric.targets ] # TODO: Remove when calibrations don't prepend this. qubits = tuple(v2.grid_qubit_from_proto_id(t) for t in targets) results[name][qubits] = flat_values else: assert len(results[name]) == 0, ( 'Only one metric of a given name can have no targets. ' 'Found multiple for key {}'.format(name)) results[name][()] = flat_values return results
def from_proto(self, proto: v2.program_pb2.Operation) -> 'cirq.GateOperation': """Turns a cirq.api.google.v2.Operation proto into a GateOperation.""" qubits = [api_v2.grid_qubit_from_proto_id(q.id) for q in proto.qubits] args = self._args_from_proto(proto) if self.num_qubits_param is not None: args[self.num_qubits_param] = len(qubits) gate = self.gate_constructor(**args) return gate.on(*qubits)
def test_grid_qubit_from_proto_id_invalid(): with pytest.raises(ValueError, match='3_3_3'): _ = v2.grid_qubit_from_proto_id('3_3_3') with pytest.raises(ValueError, match='a_2'): _ = v2.grid_qubit_from_proto_id('a_2') with pytest.raises(ValueError, match='q1_q2'): v2.grid_qubit_from_proto_id('q1_q2') with pytest.raises(ValueError, match='q-1_q2'): v2.grid_qubit_from_proto_id('q-1_q2') with pytest.raises(ValueError, match='-1_q2'): v2.grid_qubit_from_proto_id('-1_q2')
def str_to_key(self, target: str) -> Union[devices.GridQubit, str]: """Turns a string into a calibration key. Attempts to parse it as a GridQubit. If this fails, returns the string itself. """ try: return v2.grid_qubit_from_proto_id(target) except ValueError: return target
def _qid_from_str(id_str: str) -> 'cirq.Qid': """Translates a qubit id string info cirq.Qid objects. Tries to translate to GridQubit if possible (e.g. '4_3'), otherwise falls back to using NamedQubit. """ try: return v2.grid_qubit_from_proto_id(id_str) except ValueError: return v2.named_qubit_from_proto_id(id_str)
def from_proto(self, proto: v2.program_pb2.Operation, *, arg_function_language: str = '') -> 'cirq.Operation': """Turns a cirq.google.api.v2.Operation proto into a GateOperation.""" qubits = [v2.grid_qubit_from_proto_id(q.id) for q in proto.qubits] args = self._args_from_proto( proto, arg_function_language=arg_function_language) if self.num_qubits_param is not None: args[self.num_qubits_param] = len(qubits) gate = self.gate_constructor(**args) return self.op_wrapper(gate.on(*qubits), proto)
def _trial_sweep_from_proto( msg: result_pb2.SweepResult, measure_map: Dict[str, MeasureInfo] = None, ) -> List[study.TrialResult]: """Converts a SweepResult proto into List of list of trial results. Args: msg: v2 Result message to convert. measure_map: A mapping of measurement keys to a mesurement configuration containing qubit ordering. If no measurement config is provided, then all results will be returned in the order specified within the result. Returns: A list containing a list of trial results for the sweep. """ trial_sweep: List[study.TrialResult] = [] for pr in msg.parameterized_results: m_data: Dict[str, np.ndarray] = {} for mr in pr.measurement_results: qubit_results: OrderedDict[devices.GridQubit, np.ndarray] = OrderedDict() for qmr in mr.qubit_measurement_results: qubit = v2.grid_qubit_from_proto_id(qmr.qubit.id) if qubit in qubit_results: raise ValueError('qubit already exists: {}'.format(qubit)) qubit_results[qubit] = unpack_bits(qmr.results, msg.repetitions) if measure_map: ordered_results = [ qubit_results[qubit] for qubit in measure_map[mr.key].qubits ] else: ordered_results = list(qubit_results.values()) m_data[mr.key] = np.array(ordered_results).transpose() trial_sweep.append( study.TrialResult.from_single_parameter_set( params=study.ParamResolver(dict(pr.params.assignments)), measurements=m_data, )) return trial_sweep
def deserialize_paulisum(proto): """Constructs a `cirq.PauliSum` from pauli_sum proto. Args: proto: A pauli_sum proto object. Returns: A `cirq.PauliSum` object. """ if not isinstance(proto, pauli_sum_pb2.PauliSum): raise TypeError("deserialize requires a pauli_sum_pb2 object." " Given: " + str(type(proto))) res = cirq.PauliSum() for term_proto in proto.terms: coef = term_proto.coefficient_real + 1.0j * term_proto.coefficient_imag term = coef * cirq.PauliString() for pauli_qubit_pair in term_proto.paulis: op = _process_pauli_type(pauli_qubit_pair.pauli_type) term *= op(v2.grid_qubit_from_proto_id(pauli_qubit_pair.qubit_id)) res += term return res
def test_grid_qubit_from_proto_id(): assert v2.grid_qubit_from_proto_id('1_2') == cirq.GridQubit(1, 2) assert v2.grid_qubit_from_proto_id('10_2') == cirq.GridQubit(10, 2) assert v2.grid_qubit_from_proto_id('-1_2') == cirq.GridQubit(-1, 2) assert v2.grid_qubit_from_proto_id('q-1_2') == cirq.GridQubit(-1, 2) assert v2.grid_qubit_from_proto_id('q1_2') == cirq.GridQubit(1, 2)
def _qid_from_str(id_str: str) -> 'cirq.Qid': try: return v2.grid_qubit_from_proto_id(id_str) except ValueError: return v2.named_qubit_from_proto_id(id_str)