def test_intialize_with_counts(self): # Given counts = { "000": 1, "001": 2, "010": 1, "011": 1, "100": 1, "101": 1, "110": 1, "111": 1, } # When measurements = Measurements.from_counts(counts) # Then assert measurements.bitstrings == [ (0, 0, 0), (0, 0, 1), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1), ]
def aggregregate_measurements( self, jobs: List[IBMQJob], batches: List[List[QuantumCircuit]], multiplicities: List[int], **kwargs, ) -> List[Measurements]: """Combine samples from a circuit set that has been expanded and batched to obtain a set of measurements for each of the original circuits. Also applies readout correction after combining. Args: jobs: The submitted IBMQ jobs. batches: The batches of experiments submitted. multiplicities: The number of copies of each of the original circuits. kwargs: Passed to self.apply_readout_correction. Returns: A list of list of measurements, where each list of measurements corresponds to one of the circuits of the original (unexpanded) circuit set. """ ibmq_circuit_counts_set = [] for job, batch in zip(jobs, batches): for experiment in batch: ibmq_circuit_counts_set.append(job.result().get_counts(experiment)) measurements_set = [] ibmq_circuit_index = 0 for multiplicity in multiplicities: combined_counts = Counts({}) for i in range(multiplicity): for bitstring, counts in ibmq_circuit_counts_set[ ibmq_circuit_index ].items(): combined_counts[bitstring] = ( combined_counts.get(bitstring, 0) + counts ) ibmq_circuit_index += 1 if self.readout_correction: combined_counts = self.apply_readout_correction(combined_counts, kwargs) # qiskit counts object maps bitstrings in reversed order to ints, so we must # flip the bitstrings reversed_counts = {} for bitstring in combined_counts.keys(): reversed_counts[bitstring[::-1]] = int(combined_counts[bitstring]) measurements = Measurements.from_counts(reversed_counts) measurements_set.append(measurements) return measurements_set
def run_circuitset_and_measure(self, circuitset, **kwargs): """Run a set of circuits and measure a certain number of bitstrings. Note: the number of bitstrings measured is derived from self.n_samples Args: circuit (zquantum.core.circuit.Circuit): the circuit to prepare the state Returns: a list of lists of bitstrings (a list of lists of tuples) """ self.num_circuits_run += len(circuitset) self.num_jobs_run += 1 ibmq_circuitset = [] for circuit in circuitset: num_qubits = len(circuit.qubits) ibmq_circuit = circuit.to_qiskit() ibmq_circuit.barrier(range(num_qubits)) ibmq_circuit.measure(range(num_qubits), range(num_qubits)) ibmq_circuitset.append(ibmq_circuit) coupling_map = None if self.device_connectivity is not None: coupling_map = CouplingMap(self.device_connectivity.connectivity) # Run job on device and get counts job = execute( ibmq_circuitset, self.device, shots=self.n_samples, noise_model=self.noise_model, coupling_map=coupling_map, basis_gates=self.basis_gates, optimization_level=self.optimization_level, ) measurements_set = [] for i, ibmq_circuit in enumerate(ibmq_circuitset): circuit_counts = job.result().get_counts(ibmq_circuit) # qiskit counts object maps bitstrings in reversed order to ints, so we must flip the bitstrings reversed_counts = {} for bitstring in circuit_counts.keys(): reversed_counts[bitstring[::-1]] = circuit_counts[bitstring] measurements = Measurements.from_counts(reversed_counts) measurements_set.append(measurements) return measurements_set