Пример #1
0
    def test_line_data_equivalent_with_abstract_coordinate(self):
        """Test for LineData with abstract coordinate."""
        xs = [types.AbstractCoordinate.LEFT, types.AbstractCoordinate.RIGHT]
        ys = [types.AbstractCoordinate.TOP, types.AbstractCoordinate.BOTTOM]

        data1 = drawings.LineData(
            data_type="test",
            xvals=xs,
            yvals=ys,
            channels=self.ch_d0,
            meta=self.meta1,
            ignore_scaling=True,
            styles=self.style1,
        )

        data2 = drawings.LineData(
            data_type="test",
            xvals=xs,
            yvals=ys,
            channels=self.ch_d1,
            meta=self.meta2,
            ignore_scaling=True,
            styles=self.style2,
        )

        self.assertEqual(data1, data2)
Пример #2
0
    def test_line_data_equivalent(self):
        """Test for LineData."""
        xs = [0, 1, 2]
        ys = [3, 4, 5]

        data1 = drawings.LineData(
            data_type="test",
            xvals=xs,
            yvals=ys,
            channels=self.ch_d0,
            meta=self.meta1,
            ignore_scaling=True,
            styles=self.style1,
        )

        data2 = drawings.LineData(
            data_type="test",
            xvals=xs,
            yvals=ys,
            channels=self.ch_d1,
            meta=self.meta2,
            ignore_scaling=True,
            styles=self.style2,
        )

        self.assertEqual(data1, data2)
Пример #3
0
def gen_barrier(
    data: types.BarrierInstruction, formatter: Dict[str, Any], device: device_info.DrawerBackendInfo
) -> List[drawings.LineData]:
    """Generate the barrier from provided relative barrier instruction.

    Stylesheets:
        - The `barrier` style is applied.

    Args:
        data: Barrier instruction data to draw.
        formatter: Dictionary of stylesheet settings.
        device: Backend configuration.
    Returns:
        List of `LineData` drawings.
    """
    style = {
        "alpha": formatter["alpha.barrier"],
        "zorder": formatter["layer.barrier"],
        "linewidth": formatter["line_width.barrier"],
        "linestyle": formatter["line_style.barrier"],
        "color": formatter["color.barrier"],
    }

    line = drawings.LineData(
        data_type=types.LineType.BARRIER,
        channels=data.channels,
        xvals=[data.t0, data.t0],
        yvals=[types.AbstractCoordinate.BOTTOM, types.AbstractCoordinate.TOP],
        styles=style,
    )

    return [line]
Пример #4
0
def gen_baseline(data: types.ChartAxis,
                 formatter: Dict[str, Any],
                 device: device_info.DrawerBackendInfo
                 ) -> List[drawings.LineData]:
    """Generate the baseline associated with the chart.

    Stylesheets:
        - The `baseline` style is applied.

    Args:
        data: Chart axis data to draw.
        formatter: Dictionary of stylesheet settings.
        device: Backend configuration.

    Returns:
        List of `LineData` drawings.
    """
    style = {'alpha': formatter['alpha.baseline'],
             'zorder': formatter['layer.baseline'],
             'linewidth': formatter['line_width.baseline'],
             'linestyle': formatter['line_style.baseline'],
             'color': formatter['color.baseline']}

    baseline = drawings.LineData(data_type=types.LineType.BASELINE,
                                 channels=data.channels,
                                 xvals=[types.AbstractCoordinate.LEFT,
                                        types.AbstractCoordinate.RIGHT],
                                 yvals=[0, 0],
                                 ignore_scaling=True,
                                 styles=style)

    return [baseline]
Пример #5
0
    def setUp(self) -> None:
        super().setUp()

        self.style = stylesheet.QiskitPulseStyle()
        self.device = device_info.OpenPulseBackendInfo(
            name="test",
            dt=1,
            channel_frequency_map={
                pulse.DriveChannel(0): 5.0,
                pulse.MeasureChannel(0): 7.0,
                pulse.ControlChannel(0): 5.0,
            },
            qubit_channel_map={
                0: [
                    pulse.DriveChannel(0),
                    pulse.MeasureChannel(0),
                    pulse.AcquireChannel(0),
                    pulse.ControlChannel(0),
                ]
            },
        )

        # objects
        self.short_pulse = drawings.LineData(
            data_type=types.WaveformType.REAL,
            xvals=[0, 0, 1, 4, 5, 5],
            yvals=[0, 0.5, 0.5, 0.5, 0.5, 0],
            channels=[pulse.DriveChannel(0)],
        )
        self.long_pulse = drawings.LineData(
            data_type=types.WaveformType.REAL,
            xvals=[8, 8, 9, 19, 20, 20],
            yvals=[0, 0.3, 0.3, 0.3, 0.3, 0],
            channels=[pulse.DriveChannel(1)],
        )
        self.abstract_hline = drawings.LineData(
            data_type=types.LineType.BASELINE,
            xvals=[
                types.AbstractCoordinate.LEFT, types.AbstractCoordinate.RIGHT
            ],
            yvals=[0, 0],
            channels=[pulse.DriveChannel(0)],
        )
Пример #6
0
def _draw_shaped_waveform(
    xdata: np.ndarray,
    ydata: np.ndarray,
    meta: Dict[str, Any],
    channel: pulse.channels.PulseChannel,
    formatter: Dict[str, Any],
) -> List[Union[drawings.LineData, drawings.BoxData, drawings.TextData]]:
    """A private function that generates drawings of stepwise pulse lines.

    Args:
        xdata: Array of horizontal coordinate of waveform envelope.
        ydata: Array of vertical coordinate of waveform envelope.
        meta: Metadata dictionary of the waveform.
        channel: Channel associated with the waveform to draw.
        formatter: Dictionary of stylesheet settings.

    Returns:
        List of drawings.

    Raises:
        VisualizationError: When the waveform color for channel is not defined.
    """
    fill_objs = []

    resolution = formatter["general.vertical_resolution"]

    # stepwise interpolation
    xdata = np.concatenate((xdata, [xdata[-1] + 1]))
    ydata = np.repeat(ydata, 2)
    re_y = np.real(ydata)
    im_y = np.imag(ydata)
    time = np.concatenate(([xdata[0]], np.repeat(xdata[1:-1], 2), [xdata[-1]]))

    # setup style options
    style = {
        "alpha": formatter["alpha.fill_waveform"],
        "zorder": formatter["layer.fill_waveform"],
        "linewidth": formatter["line_width.fill_waveform"],
        "linestyle": formatter["line_style.fill_waveform"],
    }

    try:
        color_real, color_imag = formatter["color.waveforms"][
            channel.prefix.upper()]
    except KeyError as ex:
        raise VisualizationError(
            f"Waveform color for channel type {channel.prefix} is not defined"
        ) from ex

    # create real part
    if np.any(re_y):
        # data compression
        re_valid_inds = _find_consecutive_index(re_y, resolution)
        # stylesheet
        re_style = {"color": color_real}
        re_style.update(style)
        # metadata
        re_meta = {"data": "real"}
        re_meta.update(meta)
        # active xy data
        re_xvals = time[re_valid_inds]
        re_yvals = re_y[re_valid_inds]

        # object
        real = drawings.LineData(
            data_type=types.WaveformType.REAL,
            channels=channel,
            xvals=re_xvals,
            yvals=re_yvals,
            fill=True,
            meta=re_meta,
            styles=re_style,
        )
        fill_objs.append(real)

    # create imaginary part
    if np.any(im_y):
        # data compression
        im_valid_inds = _find_consecutive_index(im_y, resolution)
        # stylesheet
        im_style = {"color": color_imag}
        im_style.update(style)
        # metadata
        im_meta = {"data": "imag"}
        im_meta.update(meta)
        # active xy data
        im_xvals = time[im_valid_inds]
        im_yvals = im_y[im_valid_inds]

        # object
        imag = drawings.LineData(
            data_type=types.WaveformType.IMAG,
            channels=channel,
            xvals=im_xvals,
            yvals=im_yvals,
            fill=True,
            meta=im_meta,
            styles=im_style,
        )
        fill_objs.append(imag)

    return fill_objs