def _generate_json( self, circuit: cirq.AbstractCircuit, param_resolver: cirq.ParamResolverOrSimilarType, ) -> str: """Generates the JSON string from a Circuit. The json format is defined as follows: [[op_string,gate_exponent,qubits]] which is a list of sequential quantum operations, each operation defined by: op_string: str that specifies the operation type: "X","Y","Z","MS" gate_exponent: float that specifies the gate_exponent of the operation qubits: list of qubits where the operation acts on. Args: circuit: Circuit to be run. param_resolver: Param resolver for resolving parameters in circuit. Returns: json formatted string of the sequence. Raises: RuntimeError: If the circuit is empty. """ seq_list: List[ Union[Tuple[str, float, List[int]], Tuple[str, float, float, List[int]]] ] = [] circuit = cirq.resolve_parameters(circuit, param_resolver) for op in circuit.all_operations(): line_qubit = cast(Tuple[cirq.LineQubit], op.qubits) op = cast(cirq.GateOperation, op) qubit_idx = [obj.x for obj in line_qubit] op_str = get_op_string(op) gate: Union[cirq.EigenGate, cirq.PhasedXPowGate] if op_str == 'R': gate = cast(cirq.PhasedXPowGate, op.gate) seq_list.append( (op_str, float(gate.exponent), float(gate.phase_exponent), qubit_idx) ) else: gate = cast(cirq.EigenGate, op.gate) seq_list.append((op_str, float(gate.exponent), qubit_idx)) if len(seq_list) == 0: raise RuntimeError('Cannot send an empty circuit') json_str = json.dumps(seq_list) return json_str
def validate_circuit(self, circuit: cirq.AbstractCircuit): super().validate_circuit(circuit) _verify_unique_measurement_keys(circuit.all_operations())