Skip to content

Commit

Permalink
Remove the interactive visualizations (Qiskit#4438)
Browse files Browse the repository at this point in the history
* Remove the interactive visualizations

The interactive visualization functions with each of the iplot functions
will stop working in the near future. The hard coded url that these functions rely on (see Qiskit#805) where the static compile js is hosted from is going to
disapear in the near future. This will break these functions from
working on released versions of qiskit, with no ability to fix it. This
commit just deletes the functions because they won't work anymore once
https://qvisualization.mybluemix.net goes away. So we can't even
maintain compatbility with a deprecation window once that happens. Even
if we did rehost the underlying js code somewhere else we can't rely on a
static url like this in the future and the application is too large to
self host in terra itself.

* Add backwards compat shims to call mpl functions

While the interactive visualization functions will not work anymore to
ease the transition of anyone using them this commit adds back the
functions removed in the previous commit and converts them to be shims
that call the matplotlib based visualization functions. The functions
are also deprecated, this should at least give users a method to
transition off of the iplot functions.

* Fix release note section typo

* Return figures from matplotlib funcs

* Fix lint failures

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
  • Loading branch information
mtreinish and mergify[bot] authored Jul 7, 2020
1 parent 899e7fc commit 697758c
Show file tree
Hide file tree
Showing 8 changed files with 108 additions and 651 deletions.
13 changes: 0 additions & 13 deletions qiskit/visualization/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,19 +33,6 @@
plot_state_paulivec
plot_state_qsphere
Interactive Visualizations
==========================
.. autosummary::
:toctree: ../stubs/
iplot_histogram
iplot_bloch_multivector
iplot_state_city
iplot_state_hinton
iplot_state_paulivec
iplot_state_qsphere
Device Visualizations
=====================
Expand Down
104 changes: 15 additions & 89 deletions qiskit/visualization/interactive/iplot_blochsphere.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,115 +15,41 @@
"""
Bloch sphere visualization
"""
from string import Template
import sys
import time
import re
import numpy as np
from qiskit.quantum_info.operators.pauli import Pauli
from qiskit.visualization.utils import _validate_input_state
if ('ipykernel' in sys.modules) and ('spyder' not in sys.modules):
try:
from IPython.core.display import display, HTML
except ImportError:
print("Error importing IPython.core.display. To install, run "
'"pip install ipython".')

import warnings

from qiskit.visualization.state_visualization import plot_bloch_multivector


def iplot_bloch_multivector(rho, figsize=None):
""" Create a bloch sphere representation.
Graphical representation of the input array, using as much bloch
spheres as qubit are required.
Args:
rho (array): State vector or density matrix
figsize (tuple): Figure size in pixels.
Returns:
Figure: A matplotlib figure for the visualization
Example:
.. code-block::
from qiskit import QuantumCircuit, BasicAer, execute
from qiskit.visualization import iplot_bloch_multivector
%matplotlib inline
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
backend = BasicAer.get_backend('statevector_simulator')
job = execute(qc, backend).result()
iplot_bloch_multivector(job.get_statevector(qc))
"""

# HTML
html_template = Template("""
<p>
<div id="content_$divNumber" style="position: absolute; z-index: 1;">
<div id="bloch_$divNumber"></div>
</div>
</p>
""")
# JavaScript
javascript_template = Template("""
<script>
requirejs.config({
paths: {
qVisualization: "https://qvisualization.mybluemix.net/q-visualizations"
}
});
data = $data;
dataValues = [];
for (var i = 0; i < data.length; i++) {
// Coordinates
var x = data[i][0];
var y = data[i][1];
var z = data[i][2];
var point = {'x': x,
'y': y,
'z': z};
dataValues.push(point);
}
require(["qVisualization"], function(qVisualizations) {
// Plot figure
qVisualizations.plotState("bloch_$divNumber",
"bloch",
dataValues,
$options);
});
</script>
""")
rho = _validate_input_state(rho)
if figsize is None:
options = {}
else:
options = {'width': figsize[0], 'height': figsize[1]}

# Process data and execute
num = int(np.log2(len(rho)))

bloch_data = []
for i in range(num):
pauli_singles = [Pauli.pauli_single(num, i, 'X'), Pauli.pauli_single(num, i, 'Y'),
Pauli.pauli_single(num, i, 'Z')]
bloch_state = list(map(lambda x: np.real(np.trace(np.dot(x.to_matrix(), rho))),
pauli_singles))
bloch_data.append(bloch_state)

div_number = str(time.time())
div_number = re.sub('[.]', '', div_number)

html = html_template.substitute({
'divNumber': div_number
})

javascript = javascript_template.substitute({
'data': bloch_data,
'divNumber': div_number,
'options': options
})

display(HTML(html + javascript))
"""
warnings.warn(
"The iplot_bloch_multivector function is deprecated and will be "
"removed in a future release. The hosted code this depended on no "
"longer exists so this is falling back to use the matplotlib "
"visualizations. qiskit.visualization.plot_bloch_multivector should be "
"used directly moving forward.", DeprecationWarning, stacklevel=2)
fig = plot_bloch_multivector(rho, figsize=figsize)
return fig
100 changes: 14 additions & 86 deletions qiskit/visualization/interactive/iplot_cities.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,111 +15,39 @@
"""
Cities visualization
"""
from string import Template
import sys
import time
import re
from qiskit.visualization.utils import _validate_input_state
if ('ipykernel' in sys.modules) and ('spyder' not in sys.modules):
try:
from IPython.core.display import display, HTML
except ImportError:
print("Error importing IPython.core.display. To install, run "
'"pip install ipython".')

import warnings

from qiskit.visualization.state_visualization import plot_state_city


def iplot_state_city(rho, figsize=None):
""" Create a cities representation.
Graphical representation of the input array using a city style graph.
Args:
rho (array): State vector or density matrix.
figsize (tuple): The figure size in pixels.
Returns:
Figure: A matplotlib figure for the visualization
Example:
.. code-block::
from qiskit import QuantumCircuit, BasicAer, execute
from qiskit.visualization import iplot_state_city
%matplotlib inline
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
backend = BasicAer.get_backend('statevector_simulator')
job = execute(qc, backend).result()
iplot_state_city(job.get_statevector(qc))
"""

# HTML
html_template = Template("""
<p>
<div id="content_$divNumber" style="position: absolute; z-index: 1;">
<div id="cities_$divNumber"></div>
</div>
</p>
""")

# JavaScript
javascript_template = Template("""
<script>
requirejs.config({
paths: {
qVisualization: "https://qvisualization.mybluemix.net/q-visualizations"
}
});
require(["qVisualization"], function(qVisualizations) {
data = {
real: $real,
titleReal: "Real.[rho]",
imaginary: $imag,
titleImaginary: "Im.[rho]",
qbits: $qbits
};
qVisualizations.plotState("cities_$divNumber",
"cities",
data,
$options);
});
</script>
""")
rho = _validate_input_state(rho)
if figsize is None:
options = {}
else:
options = {'width': figsize[0], 'height': figsize[1]}
# Process data and execute
real = []
imag = []
for xvalue in rho:
row_real = []
col_imag = []

for value_real in xvalue.real:
row_real.append(float(value_real))
real.append(row_real)

for value_imag in xvalue.imag:
col_imag.append(float(value_imag))
imag.append(col_imag)

div_number = str(time.time())
div_number = re.sub('[.]', '', div_number)

html = html_template.substitute({
'divNumber': div_number
})

javascript = javascript_template.substitute({
'real': real,
'imag': imag,
'qbits': len(real),
'divNumber': div_number,
'options': options
})

display(HTML(html + javascript))
warnings.warn(
"The iplot_state_city function is deprecated and will be "
"removed in a future release. The hosted code this depended on no "
"longer exists so this is falling back to use the matplotlib "
"visualizations. qiskit.visualization.plot_state_city should be "
"used directly moving forward.", DeprecationWarning, stacklevel=2)
fig = plot_state_city(rho, figsize=figsize)
return fig
92 changes: 14 additions & 78 deletions qiskit/visualization/interactive/iplot_hinton.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,104 +15,40 @@
"""
Hinton visualization
"""
from string import Template
import sys
import time
import re
from qiskit.visualization.utils import _validate_input_state
if ('ipykernel' in sys.modules) and ('spyder' not in sys.modules):
try:
from IPython.core.display import display, HTML
except ImportError:
print("Error importing IPython.core.display. To install, run "
'"pip install ipython".')

import warnings

from qiskit.visualization.state_visualization import plot_state_hinton


def iplot_state_hinton(rho, figsize=None):
""" Create a hinton representation.
Graphical representation of the input array using a 2D city style
graph (hinton).
Args:
rho (array): Density matrix
figsize (tuple): Figure size in pixels.
Returns:
Figure: A matplotlib figure for the visualization
Example:
.. code-block::
from qiskit import QuantumCircuit, BasicAer, execute
from qiskit.visualization import iplot_state_hinton
%matplotlib inline
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
backend = BasicAer.get_backend('statevector_simulator')
job = execute(qc, backend).result()
iplot_state_hinton(job.get_statevector(qc))
"""

# HTML
html_template = Template("""
<p>
<div id="hinton_$divNumber"></div>
</p>
""")

# JavaScript
javascript_template = Template("""
<script>
requirejs.config({
paths: {
qVisualization: "https://qvisualization.mybluemix.net/q-visualizations"
}
});
require(["qVisualization"], function(qVisualizations) {
qVisualizations.plotState("hinton_$divNumber",
"hinton",
$executions,
$options);
});
</script>
""")
rho = _validate_input_state(rho)
if figsize is None:
options = {}
else:
options = {'width': figsize[0], 'height': figsize[1]}

# Process data and execute
div_number = str(time.time())
div_number = re.sub('[.]', '', div_number)

# Process data and execute
real = []
imag = []
for xvalue in rho:
row_real = []
col_imag = []

for value_real in xvalue.real:
row_real.append(float(value_real))
real.append(row_real)

for value_imag in xvalue.imag:
col_imag.append(float(value_imag))
imag.append(col_imag)

html = html_template.substitute({
'divNumber': div_number
})

javascript = javascript_template.substitute({
'divNumber': div_number,
'executions': [{'data': real}, {'data': imag}],
'options': options
})

display(HTML(html + javascript))
warnings.warn(
"The iplot_state_hinton function is deprecated and will be "
"removed in a future release. The hosted code this depended on no "
"longer exists so this is falling back to use the matplotlib "
"visualizations. qiskit.visualization.plot_state_hinton should be "
"used directly moving forward.", DeprecationWarning, stacklevel=2)
fig = plot_state_hinton(rho, figsize=figsize)
return fig
Loading

0 comments on commit 697758c

Please sign in to comment.