Beispiel #1
0
def __calc_result(index:int, agg_info:Dict[Any, Any], result:Result) -> Result:
    """Get one result of the aggregated result

    Args:
        index (int): the index of the result
        agg_info (Dict[Any, Any]): aggregation information as Dict
        result (Result): Result of the aggregated QuantumCircuit

    Raises:
        Exception: Multiple results are stored in one Result objext

    Returns:
        Result: the inital result for the given index
    """
    result_dict = result.to_dict()
    result_dict_copy = copy.deepcopy(result_dict)
    qubits_start = agg_info["circuits"][index]["qubits"]["start"]
    qubits_stop = agg_info["circuits"][index]["qubits"]["stop"]
    n_qubits = qubits_stop - qubits_start
    circ_size = agg_info["total_qubits"]
    reg_mapping = agg_info["circuits"][index]["reg_mapping"]
    data = result.data()["counts"]
    counts = {}
    bit_mask = sum([2**i for i in range(n_qubits)])
    for state in data:
        state_int = int(state, 16)
        state_int = state_int >> qubits_start
        state_int = state_int & bit_mask
        state_hex = hex(state_int)
        count = data[state]
        if state_hex in counts:
            counts[state_hex] += count
        else:
            counts[state_hex] = count

    if len(result_dict["results"]) == 1:
        result_dict_copy["results"][0]["data"]["counts"] = counts
        header = result_dict["results"][0]["header"]
    else:
        raise Exception("Result length not 1")

    clbit_labels = __relabel(reg_mapping, header, "clbit_labels")
    qubit_labels = __relabel(reg_mapping, header, "qubit_labels")

    creg_sizes = __relabel(reg_mapping, header, "creg_sizes")
    qreg_sizes = __relabel(reg_mapping, header, "qreg_sizes")

    result_dict_copy["results"][0]["header"]["clbit_labels"] = clbit_labels
    result_dict_copy["results"][0]["header"]["creg_sizes"] = creg_sizes
    result_dict_copy["results"][0]["header"]["memory_slots"] = n_qubits
    result_dict_copy["results"][0]["header"]["name"] = agg_info["circuits"][index]["name"]

    if len(qubit_labels) > 0:
        result_dict_copy["results"][0]["header"]["qubit_labels"] = qubit_labels
    
    if len(qreg_sizes) > 0:
        result_dict_copy["results"][0]["header"]["qreg_sizes"] = qreg_sizes
        result_dict_copy["results"][0]["header"]["n_qubits"] = n_qubits

    return Result.from_dict(result_dict_copy)
 def test_additional_result_data(self):
     """Test construction of ExperimentResult with additional data"""
     target_probs = {"0x0": 0.5, "0x1": 0.5}
     data = models.ExperimentResultData(probabilities=target_probs)
     exp_result = models.ExperimentResult(shots=1, success=True, data=data)
     result = Result(results=[exp_result], **self.base_result_args)
     result_probs = result.data(0)["probabilities"]
     self.assertEqual(result_probs, target_probs)
Beispiel #3
0
 def _add_result_data(self, result: Result):
     """Add data from qiskit Result object"""
     num_data = len(result.results)
     for i in range(num_data):
         metadata = result.results[i].header.metadata
         if metadata.get("experiment_type") == self._experiment._type:
             data = result.data(i)
             data["metadata"] = metadata
             if "counts" in data:
                 # Format to Counts object rather than hex dict
                 data["counts"] = result.get_counts(i)
             self._add_single_data(data)