{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "35492576-b15e-43e6-8b9b-293631c6b194",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"OpenQASM 2 e l' Qiskit SDK\"\n",
        "description: \"Come convertire il codice tra OpenQASM 2 e Qiskit SDK.\"\n",
        "---\n",
        "\n",
        "<span id=\"openqasm-2-and-the-qiskit-sdk\" />\n",
        "\n",
        "# OpenQASM 2 e l' Qiskit SDK\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f1330cdd-036e-4a99-b2d1-0348a4d70cb3",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "{/*\n",
        "  DO NOT EDIT THIS CELL!!!\n",
        "  This cell's content is generated automatically by a script. Anything you add\n",
        "  here will be removed next time the notebook is run. To add new content, create\n",
        "  a new cell before or after this one.\n",
        "  */}\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"Versioni del pacchetto\">\n",
        "    Il codice di questa pagina è stato sviluppato in base ai seguenti requisiti.\n",
        "    Si consiglia di utilizzare queste versioni o versioni più recenti.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.5.1\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "328f6a16-5ec4-4d80-8507-f5d97aa02f26",
      "metadata": {},
      "source": [
        "L'SDK di Qiskit fornisce alcuni strumenti per la conversione tra le rappresentazioni OpenQASM dei programmi quantistici e la classe [QuantumCircuit](/docs/api/qiskit/qiskit.circuit.QuantumCircuit) classe.\n",
        "\n",
        "<span id=\"qasm2-import\" />\n",
        "\n",
        "<span id=\"import-an-openqasm-2-program-into-qiskit\" />\n",
        "\n",
        "## Importare un programma OpenQASM 2 in Qiskit\n",
        "\n",
        "Due funzioni importano i programmi di OpenQASM 2 in Qiskit.\n",
        "Questi sono [`qasm2.load()`](../api/qiskit/qasm2#load)che accetta un nome di file e [`qasm2.loads()`](../api/qiskit/qasm2#loads), che accetta il programma OpenQASM 2 come stringa.\n",
        "\n",
        "```python\n",
        "import qiskit.qasm2\n",
        "\n",
        "qiskit.qasm2.load(filename, include_path=('.',), include_input_directory='append', custom_instructions=(), custom_classical=(), strict=False)\n",
        "qiskit.qasm2.loads(program, include_path=('.',), custom_instructions=(), custom_classical=(), strict=False)\n",
        "```\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "52d909cd-6332-46a3-9a1a-330e1c4a66cf",
      "metadata": {},
      "source": [
        "Per ulteriori informazioni, consultare l' [API di OpenQASM 2 Qiskit](/docs/api/qiskit/qasm2).\n",
        "\n",
        "<span id=\"import-simple-programs\" />\n",
        "\n",
        "### Importa programmi semplici\n",
        "\n",
        "Per la maggior parte dei programmi OpenQASM 2, è possibile utilizzare semplicemente `qasm2.load` e `qasm2.loads` con un unico argomento.\n",
        "\n",
        "<span id=\"example-import-an-openqasm-2-program-as-a-string\" />\n",
        "\n",
        "#### Esempio: importare un programma OpenQASM 2 come stringa\n",
        "\n",
        "Usare `qasm2.loads()` per importare un programma OpenQASM 2 come stringa in un file QuantumCircuit:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "f7d62945-1899-4b39-acee-6aaf6b37db09",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "     ┌───┐     ┌─┐   \n",
              "q_0: ┤ H ├──■──┤M├───\n",
              "     └───┘┌─┴─┐└╥┘┌─┐\n",
              "q_1: ─────┤ X ├─╫─┤M├\n",
              "          └───┘ ║ └╥┘\n",
              "c: 2/═══════════╩══╩═\n",
              "                0  1 "
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "import qiskit.qasm2\n",
        "\n",
        "program = \"\"\"\n",
        "    OPENQASM 2.0;\n",
        "    include \"qelib1.inc\";\n",
        "    qreg q[2];\n",
        "    creg c[2];\n",
        "\n",
        "    h q[0];\n",
        "    cx q[0], q[1];\n",
        "\n",
        "    measure q -> c;\n",
        "\"\"\"\n",
        "circuit = qiskit.qasm2.loads(program)\n",
        "circuit.draw()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6556b10e-7d15-4c51-a917-a969a23babff",
      "metadata": {},
      "source": [
        "<span id=\"example-import-an-openqasm-2-program-from-a-file\" />\n",
        "\n",
        "#### Esempio: importare un programma OpenQASM 2 da un file\n",
        "\n",
        "Usare `load()` per importare un programma OpenQASM 2 da un file in un file QuantumCircuit:\n",
        "\n",
        "```python\n",
        "import qiskit.qasm2\n",
        "circuit = qiskit.qasm2.load(\"myfile.qasm\")\n",
        "```\n",
        "\n",
        "<span id=\"custom-instructions\" />\n",
        "\n",
        "<span id=\"link-openqasm-2-gates-with-qiskit-gates\" />\n",
        "\n",
        "### Link OpenQASM 2 porte con porte Qiskit\n",
        "\n",
        "Per impostazione predefinita, l'importatore di Qiskit OpenQASM 2 tratta il file include `\"qelib1.inc\"` come una libreria standard *di fatto*.\n",
        "L'importatore tratta questo file come se contenesse esattamente le porte che sono state descritte nel [documento originale che definisce OpenQASM 2](https://arxiv.org/abs/1707.03429).\n",
        "Qiskit utilizzerà le porte incorporate nella [libreria dei circuiti](../api/qiskit/circuit_library) per rappresentare le porte in `\"qelib1.inc\"`.\n",
        "Le porte definite nel programma dalle istruzioni manuali OpenQASM 2 `gate` saranno costruite, per impostazione predefinita, come [Qiskit `Gate` sottoclassi](../api/qiskit/qiskit.circuit.Gate) personalizzate.\n",
        "\n",
        "Si può dire all'importatore di usare classi specifiche [`Gate`](../api/qiskit/qiskit.circuit.Gate) per le dichiarazioni di `gate` che incontra.\n",
        "È possibile utilizzare questo meccanismo anche per trattare i nomi di gate aggiuntivi come \"incorporati\", cioè che non richiedono una definizione esplicita.\n",
        "Se si specificano le classi di gate da utilizzare per le istruzioni di `gate` al di fuori di `\"qelib1.inc\"`, il circuito risultante sarà in genere più efficiente da lavorare.\n",
        "\n",
        "<Admonition type=\"warning\">\n",
        "  A partire dalla versione Qiskit SDK v1.0, *l'esportatore* OpenQASM 2 di Qiskit (vedere [Esportare un circuito Qiskit in OpenQASM 2](#qasm2-export) ) continua a comportarsi come se `\"qelib1.inc\"` avesse più porte di quante ne abbia in realtà.\n",
        "  Ciò significa che le impostazioni predefinite dell'importatore potrebbero non essere in grado di importare un programma esportato dal nostro importatore.\n",
        "  Vedi [l'esempio specifico sull'utilizzo dell'esportatore legacy](#qasm2-import-legacy) per risolvere questo problema.\n",
        "\n",
        "  Questa discrepanza è un comportamento ereditato da Qiskit e [sarà risolta in una versione successiva di Qiskit](https://github.com/Qiskit/qiskit/issues/10737).\n",
        "</Admonition>\n",
        "\n",
        "Per passare informazioni su un'istruzione personalizzata all'importatore di OpenQASM 2, utilizzare [la classe `qasm2.CustomInstruction` ](../api/qiskit/qasm2#qiskit.qasm2.CustomInstruction).\n",
        "Questo contiene quattro informazioni necessarie, in ordine sparso:\n",
        "\n",
        "* Il **nome** del cancello, utilizzato nel programma OpenQASM 2\n",
        "* Il **numero di parametri angolari** che il gate accetta\n",
        "* Il **numero di qubit** su cui agisce il gate\n",
        "* La classe o la funzione del **costruttore** Python per il gate, che prende i parametri del gate (ma non i qubit) come argomenti individuali\n",
        "\n",
        "Se l'importatore incontra una definizione di `gate` che corrisponde a una determinata istruzione personalizzata, utilizzerà le informazioni personalizzate per ricostruire l'oggetto gate.\n",
        "Se viene incontrata un'istruzione `gate` che corrisponde a `name` di un'istruzione personalizzata, ma non corrisponde sia al numero di parametri che al numero di qubit, l'importatore solleverà un problema [`QASM2ParseError`](../api/qiskit/qasm2#qasm2parseerror)per indicare la mancata corrispondenza tra le informazioni fornite e il programma.\n",
        "\n",
        "Inoltre, un quinto argomento `builtin` può essere facoltativamente impostato su `True` per rendere il gate automaticamente disponibile all'interno del programma OpenQASM 2, anche se non è esplicitamente definito.\n",
        "Se l'importatore incontra una definizione esplicita di `gate` per un'istruzione personalizzata integrata, la accetterà silenziosamente.\n",
        "Come in precedenza, se una definizione esplicita con lo stesso nome non è compatibile con l'istruzione personalizzata fornita, verrà sollevato un problema di tipo [`QASM2ParseError`](../api/qiskit/qasm2#qasm2parseerror) verrà sollevato.\n",
        "Questo è utile per la compatibilità con i vecchi esportatori di OpenQASM 2 e con alcune altre piattaforme quantistiche che trattano le \"porte di base\" del loro hardware come istruzioni incorporate.\n",
        "\n",
        "Qiskit fornisce un attributo di dati per lavorare con i programmi di OpenQASM 2 prodotti da versioni precedenti delle [funzionalità di esportazione di OpenQASM 2 di Qiskit](#qasm2-export).\n",
        "Questo è [`qasm2.LEGACY_CUSTOM_INSTRUCTIONS`](../api/qiskit/qasm2#legacy-compatibility), che può essere dato come argomento `custom_instructions` a [`qasm2.load()`](../api/qiskit/qasm2#load) e [`qasm2.loads()`](../api/qiskit/qasm2#loads).\n",
        "\n",
        "<span id=\"qasm2-import-legacy\" />\n",
        "\n",
        "<span id=\"example-import-a-program-created-by-qiskits-legacy-exporter\" />\n",
        "\n",
        "#### Esempio: importare un programma creato dall'esportatore legacy di Qiskit\n",
        "\n",
        "Questo programma OpenQASM 2 utilizza porte che non sono presenti nella versione originale di `\"qelib1.inc\"` senza dichiararle, ma che sono porte standard nella libreria di Qiskit.\n",
        "È possibile utilizzare [`qasm2.LEGACY_CUSTOM_INSTRUCTIONS`](../api/qiskit/qasm2#legacy-compatibility) per indicare facilmente all'importatore di utilizzare lo stesso set di porte che l'esportatore di Qiskit OpenQASM 2 utilizzava in precedenza.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "a4b52b96-1b2d-48bb-8aa4-bd413aa3acea",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit import qasm2\n",
        "\n",
        "program = \"\"\"\n",
        "    OPENQASM 2.0;\n",
        "    include \"qelib1.inc\";\n",
        "\n",
        "    qreg q[4];\n",
        "    creg c[4];\n",
        "\n",
        "    h q[0];\n",
        "    cx q[0], q[1];\n",
        "\n",
        "    // 'rxx' is not actually in `qelib1.inc`,\n",
        "    // but Qiskit used to behave as if it were.\n",
        "    rxx(0.75) q[2], q[3];\n",
        "\n",
        "    measure q -> c;\n",
        "\"\"\"\n",
        "circuit = qasm2.loads(\n",
        "    program,\n",
        "    custom_instructions=qasm2.LEGACY_CUSTOM_INSTRUCTIONS,\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "0de0c75d-3890-4138-a994-e8dcf728d7f3",
      "metadata": {},
      "source": [
        "<span id=\"example-use-a-particular-gate-class-when-importing-an-openqasm-2-program\" />\n",
        "\n",
        "#### Esempio: utilizzare una classe di gate particolare durante l'importazione di un programma OpenQASM 2\n",
        "\n",
        "In generale, Qiskit non è in grado di verificare se la definizione di una dichiarazione OpenQASM 2 `gate` corrisponde esattamente a una porta della libreria standard di Qiskit.\n",
        "Invece, Qiskit sceglie un cancello personalizzato in base alla definizione precisa fornita.\n",
        "Questo può essere meno efficiente rispetto all'uso di uno dei gate standard integrati o di un gate personalizzato definito dall'utente.\n",
        "È possibile definire manualmente le dichiarazioni di `gate` con classi particolari.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "73432f4a-c5c1-4cec-ba5d-85ad4787ef52",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit import qasm2\n",
        "from qiskit.circuit import Gate\n",
        "from qiskit.circuit.library import RZXGate\n",
        "\n",
        "\n",
        "# Define a custom gate that takes one qubit and two angles.\n",
        "class MyGate(Gate):\n",
        "    def __init__(self, theta, phi):\n",
        "        super().__init__(\"my\", 1, [theta, phi])\n",
        "\n",
        "\n",
        "custom_instructions = [\n",
        "    # Link the OpenQASM 2 name 'my' with our custom gate.\n",
        "    qasm2.CustomInstruction(\"my\", 2, 1, MyGate),\n",
        "    # Link the OpenQASM 2 name 'rzx' with Qiskit's\n",
        "    # built-in RZXGate.\n",
        "    qasm2.CustomInstruction(\"rzx\", 1, 2, RZXGate),\n",
        "]\n",
        "\n",
        "program = \"\"\"\n",
        "    OPENQASM 2.0;\n",
        "\n",
        "    gate my(theta, phi) q {\n",
        "        U(theta / 2, phi, -theta / 2) q;\n",
        "    }\n",
        "    gate rzx(theta) a, b {\n",
        "        // It doesn't matter what definition is\n",
        "        // supplied, if the parameters match;\n",
        "        // Qiskit will still use `RZXGate`.\n",
        "    }\n",
        "\n",
        "    qreg q[2];\n",
        "    my(0.25, 0.125) q[0];\n",
        "    rzx(pi) q[0], q[1];\n",
        "\"\"\"\n",
        "\n",
        "circuit = qasm2.loads(\n",
        "    program,\n",
        "    custom_instructions=custom_instructions,\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "eb78c9cc-e600-4be0-8616-b9bc5ddad511",
      "metadata": {},
      "source": [
        "<span id=\"example-define-a-new-built-in-gate-in-an-openqasm-2-program\" />\n",
        "\n",
        "#### Esempio: definire un nuovo gate integrato in un programma OpenQASM 2\n",
        "\n",
        "Se l'argomento `builtin=True` è impostato, non è necessario che un cancello personalizzato abbia una definizione associata.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "c37eb527-bed0-4c62-8404-f79e49d42318",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit import qasm2\n",
        "from qiskit.circuit import Gate\n",
        "\n",
        "\n",
        "# Define a custom gate that takes one qubit and two angles.\n",
        "class MyGate(Gate):\n",
        "    def __init__(self, theta, phi):\n",
        "        super().__init__(\"my\", 1, [theta, phi])\n",
        "\n",
        "\n",
        "custom_instructions = [\n",
        "    qasm2.CustomInstruction(\"my\", 2, 1, MyGate, builtin=True),\n",
        "]\n",
        "\n",
        "program = \"\"\"\n",
        "    OPENQASM 2.0;\n",
        "    qreg q[1];\n",
        "\n",
        "    my(0.25, 0.125) q[0];\n",
        "\"\"\"\n",
        "\n",
        "circuit = qasm2.loads(\n",
        "    program,\n",
        "    custom_instructions=custom_instructions,\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4145ce48-0001-42e2-be5e-83c2e31f0fd9",
      "metadata": {},
      "source": [
        "<span id=\"custom-classical\" />\n",
        "\n",
        "<span id=\"define-custom-classical-functions\" />\n",
        "\n",
        "### Definire funzioni classiche personalizzate\n",
        "\n",
        "OpenQASM 2 include alcune funzioni classiche integrate da utilizzare negli argomenti dei gate.\n",
        "È possibile estendere il linguaggio con altre funzioni utilizzando l'argomento `custom_classical` a [`qasm2.load()`](../api/qiskit/qasm2#load) e [`qasm2.loads()`](../api/qiskit/qasm3#loads)con la classe [`qasm2.CustomClassical`](../api/qiskit/qasm2#qiskit.qasm2.CustomClassical) classe.\n",
        "\n",
        "Per definire una funzione classica personalizzata, è necessario fornire:\n",
        "\n",
        "* Il *nome* della funzione così come appare nel programma OpenQASM 2\n",
        "* Il numero di argomenti in virgola mobile che accetta\n",
        "* Un oggetto callable Python che valuta la funzione\n",
        "\n",
        "Tutte le funzioni classiche personalizzate definite sono trattate dall'importatore come built-in del linguaggio OpenQASM 2.\n",
        "Non esiste un modo ufficiale all'interno del linguaggio OpenQASM 2 per definire nuove funzioni; si tratta di un'estensione di Qiskit.\n",
        "\n",
        "<span id=\"example-use-custom-classical-instructions\" />\n",
        "\n",
        "#### Esempio: utilizzare istruzioni classiche personalizzate\n",
        "\n",
        "Qui forniamo due funzioni classiche personalizzate.\n",
        "Il primo è semplice e si limita ad aggiungere uno al suo input.\n",
        "La seconda è la funzione `math.atan2`, che rappresenta l'operazione matematica $\\arctan(y/x)$ in modo consapevole dei quadranti.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "b135de19-4b54-4820-8f9d-84a42494debe",
      "metadata": {},
      "outputs": [],
      "source": [
        "import math\n",
        "from qiskit import qasm2\n",
        "\n",
        "program = \"\"\"\n",
        "    include \"qelib1.inc\";\n",
        "    qreg q[2];\n",
        "    rx(arctan(pi, 3 + add_one(0.2))) q[0];\n",
        "    cx q[0], q[1];\n",
        "\"\"\"\n",
        "\n",
        "\n",
        "def add_one(x):\n",
        "    return x + 1\n",
        "\n",
        "\n",
        "customs = [\n",
        "    # Our `add_one` takes only one parameter.\n",
        "    qasm2.CustomClassical(\"add_one\", 1, add_one),\n",
        "    # `arctan` takes two parameters, and `math.atan2` implements it.\n",
        "    qasm2.CustomClassical(\"arctan\", 2, math.atan2),\n",
        "]\n",
        "circuit = qasm2.loads(program, custom_classical=customs)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4373999e-9df1-4078-ab83-d1c88a577aaf",
      "metadata": {},
      "source": [
        "<span id=\"strict\" />\n",
        "\n",
        "<span id=\"strict-mode\" />\n",
        "\n",
        "### Modalità ristretta\n",
        "\n",
        "Per impostazione predefinita, questo parser è più rilassato rispetto alle specifiche ufficiali.\n",
        "Consente l'inserimento di virgole a capo negli elenchi di parametri, di punti e virgole non necessari (dichiarazioni vuote), l'omissione della dichiarazione di versione `OPENQASM 2.0;` e diversi altri miglioramenti della qualità della vita senza emettere alcun errore.\n",
        "Tuttavia, è possibile utilizzare la modalità \"lettera dello specifico\" con `strict=True`.\n",
        "\n",
        "<span id=\"qasm2-export\" />\n",
        "\n",
        "<span id=\"export-a-qiskit-circuit-to-openqasm-2\" />\n",
        "\n",
        "## Esportare un circuito Qiskit in OpenQASM 2\n",
        "\n",
        "Qiskit può anche esportare un file [`QuantumCircuit`](../api/qiskit/qiskit.circuit.QuantumCircuit) in OpenQASM 2.\n",
        "Si utilizza la funzione [`qasm2.dump()`](../api/qiskit/qasm2#dump) per scrivere su un file e [`qasm2.dumps()`](../api/qiskit/qasm2#dumps) per scrivere su una stringa.\n",
        "Queste funzioni hanno attualmente un'interfaccia molto semplice: accettano un circuito e, solo nel caso di [`qasm2.dump()`](../api/qiskit/qasm2#dump)una posizione in cui scrivere l'uscita.\n",
        "\n",
        "<Admonition type=\"warning\">\n",
        "  L'esportatore OpenQASM 2 di Qiskit assume ancora una versione legacy e non standard del file di inclusione `\"qelib1.inc\"` .\n",
        "  [Questo problema sarà risolto in una versione successiva di Qiskit](https://github.com/Qiskit/qiskit/issues/10737), ma nel frattempo, se dovete reimportare un programma OpenQASM 2 creato con Qiskit, utilizzate [l'esempio precedente per indicare all'importatore i gate legacy](#qasm2-import-legacy).\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"example-export-a-circuit-to-openqasm-2\" />\n",
        "\n",
        "### Esempio: esportare un circuito in OpenQASM 2\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "70f4d657-8be3-400d-a793-d36962a855ef",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit import QuantumCircuit, qasm2\n",
        "\n",
        "# Define any circuit.\n",
        "circuit = QuantumCircuit(2, 2)\n",
        "circuit.h(0)\n",
        "circuit.cx(0, 1)\n",
        "circuit.measure([0, 1], [0, 1])\n",
        "\n",
        "# Export to a string.\n",
        "program = qasm2.dumps(circuit)\n",
        "\n",
        "# Export to a file.\n",
        "qasm2.dump(circuit, \"my_file.qasm\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1c0fd601-51ec-4d82-8821-20e0554a3662",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Passi successivi\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Suggerimenti\">\n",
        "  * Per sapere come generare il codice OpenQASM, consultate la guida [IBM Quantum Composer](/docs/guides/composer).\n",
        "  * Vedere il riferimento all' [API di OpenQASM 2 Qiskit](/docs/api/qiskit/qasm2).\n",
        "  * Consulta la sezione \"[Verifica il tuo programma](/docs/guides/debugging-tools) \".\n",
        "  * Visitate il sito [OpenQASM Live Specification](https://openqasm.com/).\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 4
}