# An example Jupyter Notebook¶

This notebook is a demonstration of directly-parsing Jupyter Notebooks into Sphinx using the MyST parser.[^download]

## Markdown¶

### Configuration¶

To build documentation from this notebook, the following options are set:

myst_enable_extensions = [
"amsmath",
"colon_fence",
"deflist",
"dollarmath",
"html_image",
]
myst_url_schemes = ("http", "https", "mailto")


### Syntax¶

As you can see, markdown is parsed as expected. Embedding images should work as expected. For example, here’s the MyST-NB logo:

![myst-nb logo](../img/unitary_fund_logo.png) By adding "html_image" to the myst_enable_extensions list in the sphinx configuration (see here), you can even add HTML img tags with attributes:

<img src="../img/unitary_fund_logo.png" alt="logo" width="200px" class="shadow mb-2"> Because MyST-NB is using the MyST-markdown parser, you can include rich markdown with Sphinx in your notebook. For example, here’s a note admonition block:

Note

Wow, a note! It was generated with this code (as explained here):

:::{note}
**Wow**, a note!
:::


If you wish to use “bare” LaTeX equations, then you should add "amsmath" to the myst_enable_extensions list in the sphinx configuration. This is explained here, and works as such:

\begin{equation}
\frac {\partial u}{\partial x} + \frac{\partial v}{\partial y} = - \, \frac{\partial w}{\partial z}
\end{equation}

\begin{align*}
2x - 5y &=  8 \\
3x + 9y &=  -12
\end{align*}

(1)$\begin{equation} \frac {\partial u}{\partial x} + \frac{\partial v}{\partial y} = - \, \frac{\partial w}{\partial z} \end{equation}$
\begin{align*} 2x - 5y &= 8 \\ 3x + 9y &= -12 \end{align*}

Also you can use features like equation numbering and referencing in the notebooks:

$$e^{i\pi} + 1 = 0$$ (euler)

(2)$e^{i\pi} + 1 = 0$

Euler’s identity, equation (2), was elected one of the most beautiful mathematical formulas.

You can see the syntax used for this example here in the MyST documentation.

## Code cells and outputs¶

You can run cells, and the cell outputs will be captured and inserted into the resulting Sphinx site.

### __repr__ and HTML outputs¶

For example, here’s some simple Python:

import matplotlib.pyplot as plt
import numpy as np
data = np.random.rand(3, 100) * 100
data[:, :10]

array([[15.76551102,  4.1493035 , 25.35873893, 60.58047014, 44.74308891,
46.53700937, 67.97296761, 46.08392462, 99.30668489, 65.6628961 ],
[77.81081818, 36.56472508, 66.6553391 , 66.82866891,  9.96169767,
46.1281158 , 51.68394127, 47.18632496, 21.44839956, 71.86699423],
[28.24272962, 50.7723101 , 64.67703796, 84.85663079, 45.12973011,
63.18740345,  9.81709706, 88.86056304, 15.38285761,  9.68160979]])


This will also work with HTML outputs

import pandas as pd
df = pd.DataFrame(data.T, columns=['a', 'b', 'c'])

a b c
0 15.765511 77.810818 28.242730
1 4.149303 36.564725 50.772310
2 25.358739 66.655339 64.677038
3 60.580470 66.828669 84.856631
4 44.743089 9.961698 45.129730

as well as math outputs

from IPython.display import Math
Math(r"\sum_{i=0}^n i^2 = \frac{(n^2+n)(2n+1)}{6}")

$\displaystyle \sum_{i=0}^n i^2 = \frac{(n^2+n)(2n+1)}{6}$

This works for error messages as well:

print("This will be properly printed...")
print(thiswont)

This will be properly printed...

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/tmp/ipykernel_497/3073679017.py in <module>
1 print("This will be properly printed...")
----> 2 print(thiswont)

NameError: name 'thiswont' is not defined


### Images¶

Images that are generated from your code (e.g., with Matplotlib) will also be embedded.

fig, ax = plt.subplots()
ax.scatter(*data, c=data)

<matplotlib.collections.PathCollection at 0x7f5ff87cec90> ### Testing¶

The following cells setup a test (which won’t be rendered in the notebook), the test code and the test output cell:

SIMULATOR = DensityMatrixSimulator()
# 0.1% depolarizing noise
qbit = LineQubit(0)
circ = Circuit(X(qbit) for _ in range(80))

def simulate_with_noise(circ: Circuit) -> float:
circuit = circ.with_noise(depolarize(p=0.001))
rho = SIMULATOR.simulate(circuit).final_density_matrix
# define the computational basis observable
obs = np.diag([1, 0])
expectation = np.real(np.trace(rho @ obs))
return expectation

unmitigated = simulate_with_noise(circ)
exact = 1
print(f"Error in simulation is {exact - unmitigated:.{3}}")

Error in simulation is 0.0506