{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "35492576-b15e-43e6-8b9b-293631c6b194",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"OpenQASM 2 et l' Qiskit SDK\"\n",
        "description: \"Comment convertir du code entre OpenQASM 2 et Qiskit SDK.\"\n",
        "---\n",
        "\n",
        "<span id=\"openqasm-2-and-the-qiskit-sdk\" />\n",
        "\n",
        "# OpenQASM 2 et 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=\"Versions de package\">\n",
        "    Le code de cette page a été développé en tenant compte des exigences suivantes.\n",
        "    Nous recommandons d'utiliser ces versions ou des versions plus récentes.\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": [
        "Le SDK Qiskit fournit des outils de conversion entre les représentations OpenQASM des programmes quantiques et 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",
        "## Importer un programme OpenQASM 2 dans Qiskit\n",
        "\n",
        "Deux fonctions permettent d'importer les programmes OpenQASM 2 dans Qiskit.\n",
        "Il s'agit de [`qasm2.load()`](../api/qiskit/qasm2#load)qui prend un nom de fichier, et [`qasm2.loads()`](../api/qiskit/qasm2#loads)qui prend le programme OpenQASM 2 sous forme de chaîne de caractères.\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": [
        "Voir [OpenQASM 2 Qiskit API](/docs/api/qiskit/qasm2) pour plus d'informations.\n",
        "\n",
        "<span id=\"import-simple-programs\" />\n",
        "\n",
        "### Importer des programmes simples\n",
        "\n",
        "Pour la plupart des programmes OpenQASM 2, vous pouvez simplement utiliser `qasm2.load` et `qasm2.loads` avec un seul argument.\n",
        "\n",
        "<span id=\"example-import-an-openqasm-2-program-as-a-string\" />\n",
        "\n",
        "#### Exemple : importer un programme OpenQASM 2 sous forme de chaîne\n",
        "\n",
        "Utilisez `qasm2.loads()` pour importer un programme OpenQASM 2 sous la forme d'une chaîne de caractères dans un fichier de données 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",
        "#### Exemple : importer un programme OpenQASM 2 à partir d'un fichier\n",
        "\n",
        "Utilisez `load()` pour importer un programme OpenQASM 2 à partir d'un fichier dans un fichier 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",
        "### Lien OpenQASM 2 portes avec les portes Qiskit\n",
        "\n",
        "Par défaut, l'importateur OpenQASM 2 de Qiskit traite le fichier include `\"qelib1.inc\"` comme une bibliothèque standard de *facto*.\n",
        "L'importateur traite ce fichier comme contenant précisément les portes qu'il est censé contenir dans [le document original définissant OpenQASM 2.](https://arxiv.org/abs/1707.03429)\n",
        "Qiskit utilisera les portes intégrées dans la [bibliothèque de circuits](../api/qiskit/circuit_library) pour représenter les portes dans `\"qelib1.inc\"`.\n",
        "Les portes définies dans le programme par des déclarations manuelles OpenQASM 2 `gate` seront, par défaut, construites comme des portes personnalisées [Qiskit `Gate` sous-classes](../api/qiskit/qiskit.circuit.Gate).\n",
        "\n",
        "Vous pouvez indiquer à l'importateur d'utiliser des classes [`Gate`](../api/qiskit/qiskit.circuit.Gate) pour les instructions `gate` qu'il rencontre.\n",
        "Vous pouvez également utiliser ce mécanisme pour traiter des noms de portes supplémentaires comme \"intégrés\", c'est-à-dire ne nécessitant pas de définition explicite.\n",
        "Si vous spécifiez les classes de portes à utiliser pour les instructions `gate` en dehors de `\"qelib1.inc\"`, le circuit résultant sera généralement plus efficace.\n",
        "\n",
        "<Admonition type=\"warning\">\n",
        "  À partir de Qiskit SDKv1.0, *l'exportateur* OpenQASM 2 de Qiskit (voir [Exporter un circuit Qiskit vers OpenQASM 2](#qasm2-export) ) se comporte toujours comme s'il `\"qelib1.inc\"` avait plus de portes qu'il n'en a réellement.\n",
        "  Cela signifie que les paramètres par défaut de l'importateur pourraient ne pas permettre d'importer un programme exporté par notre importateur.\n",
        "  Consultez [l'exemple spécifique sur l'utilisation de l'exportateur hérité](#qasm2-import-legacy) pour résoudre ce problème.\n",
        "\n",
        "  Cette divergence est un comportement hérité de Qiskit, et [sera résolue dans une version ultérieure de Qiskit](https://github.com/Qiskit/qiskit/issues/10737).\n",
        "</Admonition>\n",
        "\n",
        "Pour transmettre des informations sur une instruction personnalisée à l'importateur OpenQASM 2, utilisez [la classe `qasm2.CustomInstruction` ](../api/qiskit/qasm2#qiskit.qasm2.CustomInstruction).\n",
        "Celui-ci comporte quatre éléments d'information obligatoires, dans l'ordre :\n",
        "\n",
        "* Le **nom de** la porte, utilisé dans le programme OpenQASM 2\n",
        "* **Nombre de paramètres d'angle** pris en compte par la porte\n",
        "* **Nombre de qubits** sur lesquels la porte agit\n",
        "* La classe ou fonction de **construction** Python pour la porte, qui prend les paramètres de la porte (mais pas les qubits) comme arguments individuels\n",
        "\n",
        "Si l'importateur rencontre une définition `gate` qui correspond à une instruction personnalisée donnée, il utilisera ces informations personnalisées pour reconstruire l'objet gate.\n",
        "Si une instruction `gate` correspondant à `name` d'une instruction personnalisée est rencontrée, mais qu'elle ne correspond pas au nombre de paramètres et au nombre de qubits, l'importateur lèvera un [`QASM2ParseError`](../api/qiskit/qasm2#qasm2parseerror)pour indiquer la non-concordance entre les informations fournies et le programme.\n",
        "\n",
        "En outre, un cinquième argument `builtin` peut être optionnellement défini comme `True` pour que la porte soit automatiquement disponible dans le programme OpenQASM 2, même si elle n'est pas explicitement définie.\n",
        "Si l'importateur rencontre une définition explicite de `gate` pour une instruction personnalisée intégrée, il l'acceptera silencieusement.\n",
        "Comme précédemment, si une définition explicite du même nom n'est pas compatible avec l'instruction personnalisée fournie, une erreur de type [`QASM2ParseError`](../api/qiskit/qasm2#qasm2parseerror) sera soulevée.\n",
        "Ceci est utile pour la compatibilité avec les anciens exportateurs OpenQASM 2 et avec certaines autres plateformes quantiques qui traitent les \"portes de base\" de leur matériel comme des instructions intégrées.\n",
        "\n",
        "Qiskit fournit un attribut de données pour travailler avec des programmes OpenQASM 2 produits par des versions antérieures des [capacités d'exportation de Qiskit OpenQASM 2.](#qasm2-export)\n",
        "Il s'agit de [`qasm2.LEGACY_CUSTOM_INSTRUCTIONS`](../api/qiskit/qasm2#legacy-compatibility), qui peut être donné comme argument `custom_instructions` à [`qasm2.load()`](../api/qiskit/qasm2#load) et [`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",
        "#### Exemple : importer un programme créé par l'exportateur hérité de Qiskit\n",
        "\n",
        "Ce programme OpenQASM 2 utilise des portes qui ne sont pas dans la version originale de `\"qelib1.inc\"` sans les déclarer, mais qui sont des portes standard dans la bibliothèque de Qiskit.\n",
        "Vous pouvez utiliser [`qasm2.LEGACY_CUSTOM_INSTRUCTIONS`](../api/qiskit/qasm2#legacy-compatibility) pour indiquer facilement à l'importateur d'utiliser le même ensemble de portes que l'exportateur OpenQASM 2 de Qiskit utilisait auparavant.\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",
        "#### Exemple : utiliser une classe de porte particulière lors de l'importation d'un programme OpenQASM 2\n",
        "\n",
        "En général, Qiskit ne peut pas vérifier si la définition d'une déclaration OpenQASM 2 `gate` correspond exactement à une porte de la bibliothèque standard de Qiskit.\n",
        "Au lieu de cela, Qiskit choisit une porte personnalisée en utilisant la définition précise fournie.\n",
        "Cela peut s'avérer moins efficace que l'utilisation d'une des portes standard intégrées ou d'une porte personnalisée définie par l'utilisateur.\n",
        "Vous pouvez définir manuellement des instructions `gate` avec des classes particulières.\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",
        "#### Exemple : définir une nouvelle porte intégrée dans un programme OpenQASM 2\n",
        "\n",
        "Si l'argument `builtin=True` est défini, une porte personnalisée n'a pas besoin d'être associée à une définition.\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",
        "### Définir des fonctions classiques personnalisées\n",
        "\n",
        "OpenQASM 2 comprend des fonctions classiques intégrées à utiliser dans les arguments des portes.\n",
        "Vous pouvez étendre le langage avec d'autres fonctions en utilisant l'argument `custom_classical` à [`qasm2.load()`](../api/qiskit/qasm2#load) et [`qasm2.loads()`](../api/qiskit/qasm3#loads)avec la classe [`qasm2.CustomClassical`](../api/qiskit/qasm2#qiskit.qasm2.CustomClassical) classe.\n",
        "\n",
        "Pour définir une fonction classique personnalisée, vous devez fournir :\n",
        "\n",
        "* Le *nom de* la fonction tel qu'il apparaît dans le programme OpenQASM 2\n",
        "* Le nombre d'arguments en virgule flottante qu'il accepte\n",
        "* Un objet appelable Python qui évalue la fonction\n",
        "\n",
        "Toutes les fonctions classiques personnalisées définies sont traitées par l'importateur comme étant intégrées au langage OpenQASM 2.\n",
        "Le langage OpenQASM 2 ne permet pas officiellement de définir de nouvelles fonctions; il s'agit d'une extension Qiskit.\n",
        "\n",
        "<span id=\"example-use-custom-classical-instructions\" />\n",
        "\n",
        "#### Exemple : utiliser des instructions classiques personnalisées\n",
        "\n",
        "Nous proposons ici deux fonctions classiques personnalisées.\n",
        "La première est simple et se contente d'ajouter un à son entrée.\n",
        "La seconde est la fonction `math.atan2`, qui représente l'opération mathématique $\\arctan(y/x)$ en tenant compte des quadrants.\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",
        "### Mode strict\n",
        "\n",
        "Par défaut, cet analyseur est plus souple que la spécification officielle.\n",
        "Il autorise les virgules de fin dans les listes de paramètres, les points-virgules inutiles (déclaration vide), l'omission de la déclaration de version `OPENQASM 2.0;` et plusieurs autres améliorations de la qualité de vie sans émettre d'erreurs.\n",
        "Toutefois, vous pouvez utiliser le mode \"lettre de recommandation\" avec `strict=True`.\n",
        "\n",
        "<span id=\"qasm2-export\" />\n",
        "\n",
        "<span id=\"export-a-qiskit-circuit-to-openqasm-2\" />\n",
        "\n",
        "## Exporter un circuit Qiskit vers OpenQASM 2\n",
        "\n",
        "Qiskit peut également exporter un [`QuantumCircuit`](../api/qiskit/qiskit.circuit.QuantumCircuit) vers OpenQASM 2.\n",
        "Vous utilisez la fonction [`qasm2.dump()`](../api/qiskit/qasm2#dump) pour écrire dans un fichier, et [`qasm2.dumps()`](../api/qiskit/qasm2#dumps) pour écrire dans une chaîne de caractères.\n",
        "Ces fonctions ont actuellement une interface très simple : elles acceptent un circuit et, uniquement dans le cas de [`qasm2.dump()`](../api/qiskit/qasm2#dump)un emplacement où écrire la sortie.\n",
        "\n",
        "<Admonition type=\"warning\">\n",
        "  L'exportateur OpenQASM 2 de Qiskit utilise toujours une version ancienne et non standard du fichier include `\"qelib1.inc\"` .\n",
        "  [Ce problème sera résolu dans une version ultérieure de Qiskit](https://github.com/Qiskit/qiskit/issues/10737), mais en attendant, si vous devez réimporter un programme OpenQASM 2 créé avec Qiskit, utilisez l ['exemple ci-dessus pour indiquer à l'importateur les anciennes portes.](#qasm2-import-legacy)\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"example-export-a-circuit-to-openqasm-2\" />\n",
        "\n",
        "### Exemple : exporter un circuit vers 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",
        "## Etapes suivantes\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recommandations\">\n",
        "  * Apprenez à générer le code OpenQASM dans le guide [IBM Quantum Composer](/docs/guides/composer).\n",
        "  * Voir la référence de l ['API Qiskit sur OpenQASM 2.](/docs/api/qiskit/qasm2)\n",
        "  * Consultez la rubrique «[ Vérifier votre programme](/docs/guides/debugging-tools) ».\n",
        "  * Visitez le site [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
}