Source code for qlazy.MData

# -*- coding: utf-8 -*-
""" Mesured data """
import ctypes
from collections import Counter

[docs]class MData(ctypes.Structure): """ Measured data Attributes ---------- qubit_num : int number of qubits shot_num : int number of measureings angle : float angle phase : float phase qubit_id : list of int list of qubit ids freq : list of float list of frequencies last_val : int last measurement value """ _fields_ = [ ('qubit_num', ctypes.c_int), ('shot_num', ctypes.c_int), ('angle', ctypes.c_double), ('phase', ctypes.c_double), ('qubit_id', ctypes.POINTER(ctypes.c_int)), ('freq', ctypes.POINTER(ctypes.c_int)), ('last_val', ctypes.c_int), ] def __new__(cls, qubit_num=None, shots=1, angle=0.0, phase=0.0, qid=None, **kwargs): """ Parameters ---------- None Returns ------- md : instance (QCirc) """ obj = mdata_init(qubit_num, shots, angle, phase, qid) md = ctypes.cast(obj.value, ctypes.POINTER(cls)).contents return md def __str__(self): s = "" s += "measured direction (theta, phi): {0:}*PI, {1:}*PI\n".format(self.angle, self.phase) s += "measured qubit id: {}\n".format([self.qubit_id[i] for i in range(self.qubit_num)]) s += "frequency: {}\n".format(self.frequency) s += "last state: {}".format(self.last) return s
[docs] def show(self): """ show the measured data""" # mdata_print(self) if self.angle == 0.0 and self.phase == 0.0: mdir = 'z-axis' elif self.angle == 0.5 and self.phase == 0.0: mdir = 'x-axis' elif self.angle == 0.5 and self.phase == 0.5: mdir = 'y-axis' else: mdir = "theta={:.3f}*PI, phi={:.3f}*PI".format(self.angle, self.phase) print("direction of measurement: {}".format(mdir)) if mdir == 'z-axis': for k, v in self.frequency.items(): print("frq[{}] = {}".format(k, v)) print("last state => {}".format(self.last)) else: for k, v in self.frequency.items(): print("frq[{}] = {}".format(k.replace('0', 'u').replace('1', 'd'), v)) print("last state => {}".format(self.last.replace('0', 'u').replace('1', 'd')))
@property def last(self): """ last measured value (binary string) """ mval = self.last_val digits = self.qubit_num return '{:0{digits}b}'.format(mval, digits=digits) @property def lst(self): """ last measured value (integer) """ return self.last_val @property def frequency(self): """ frequencies of measured value (Counter) """ state_num = 2**self.qubit_num frq = [self.freq[i] for i in range(state_num)] digits = self.qubit_num res = {"{:0{digits}b}".format(k, digits=digits):v for k, v in enumerate(frq) if v > 0} return Counter(res) @property def frq(self): """ frequencies of measured value (list) """ state_num = 2**self.qubit_num freq_list = [0] * state_num for k, v in self.frequency.items(): i = int(k, 2) freq_list[i] = v return freq_list @property def state_num(self): """ number of states """ return 2**self.qubit_num def __del__(self): mdata_free(self)
# c-library for qstate from qlazy.lib.mdata_c import mdata_init, mdata_print, mdata_free