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)