{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "fbce2fd6-c79e-4e90-9074-6cde8a09b517",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Parâmetros comumente usados para transpilagem\"\n",
        "description: \"Visão geral dos parâmetros comumente usados para controlar a transpilagem de circuitos quânticos no Qiskit.\"\n",
        "---\n",
        "\n",
        "<span id=\"commonly-used-parameters-for-transpilation\" />\n",
        "\n",
        "# Parâmetros comumente usados para transpilagem\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6beea7ff-7407-47be-a0b7-1e7981328df5",
      "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=\"Versões do pacote\">\n",
        "    O código desta página foi desenvolvido usando os seguintes requisitos.\n",
        "    Recomendamos o uso dessas versões ou de versões mais recentes.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.5.0\n",
        "    qiskit-ibm-runtime~=0.47.0\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "05fb8adb-3b36-4449-b669-108d2d749ca5",
      "metadata": {},
      "source": [
        "Esta página descreve alguns dos parâmetros mais comumente usados para transpilação local. Esses parâmetros são configurados usando argumentos para [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) ou [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile).\n",
        "\n",
        "<span id=\"approx-degree\" />\n",
        "\n",
        "<span id=\"approximation-degree\" />\n",
        "\n",
        "## Grau de aproximação\n",
        "\n",
        "Você pode usar o grau de aproximação para especificar a proximidade com que deseja que o circuito resultante corresponda ao circuito desejado (de entrada).  Trata-se de um valor flutuante no intervalo ( 0.0 - 1.0 ), em que 0.0 é a aproximação máxima e 1.0 (padrão) é nenhuma aproximação. Valores menores trocam a precisão da saída pela facilidade de execução (ou seja, menos portas).  O valor padrão é 1.0.\n",
        "\n",
        "Na síntese unitária de dois qubits (usada nos estágios iniciais de todos os níveis e para o estágio de otimização com o nível de otimização 3), esse valor especifica a fidelidade de destino da decomposição de saída. Ou seja, quanto erro é introduzido quando uma representação matricial de um circuito é convertida em portas discretas. Se o grau de aproximação for um valor mais baixo (mais aproximação), o circuito de saída da síntese será mais diferente da matriz de entrada, mas provavelmente também terá menos portas (porque qualquer operação arbitrária de dois qubits pode ser decomposta perfeitamente com no máximo três portas CX) e será mais fácil de executar.\n",
        "\n",
        "Quando o grau de aproximação é menor do que 1.0, os circuitos com uma ou duas portas CX podem ser sintetizados, resultando em menos erros do hardware, mas mais da aproximação. Como a CX é a porta mais cara em termos de erro, pode ser vantajoso diminuir o número delas ao custo da fidelidade na síntese (essa técnica foi usada para aumentar o volume quântico em dispositivos IBM® : [Validating quantum computers using randomized model circuits (Validando computadores quânticos usando modelos de circuitos aleatórios](https://arxiv.org/abs/1811.12926) ).\n",
        "\n",
        "Como exemplo, geramos um `UnitaryGate` de dois qubits aleatório que será sintetizado no estágio inicial. A configuração de `approximation_degree` menor que 1.0 pode gerar um circuito aproximado. Também devemos especificar o endereço `basis_gates` para que o método de síntese saiba quais portas ele pode usar para a síntese aproximada.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "e660bec2-f806-4050-955b-53a50289158e",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "2\n"
          ]
        }
      ],
      "source": [
        "from qiskit import QuantumCircuit, QuantumRegister\n",
        "from qiskit.circuit.library import UnitaryGate\n",
        "from qiskit.quantum_info import random_unitary\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "\n",
        "UU = random_unitary(4, seed=12345)\n",
        "rand_U = UnitaryGate(UU)\n",
        "\n",
        "qubits = QuantumRegister(2, name=\"q\")\n",
        "qc = QuantumCircuit(qubits)\n",
        "qc.append(rand_U, qubits)\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1,\n",
        "    approximation_degree=0.85,\n",
        "    basis_gates=[\"sx\", \"rz\", \"cx\"],\n",
        ")\n",
        "approx_qc = pass_manager.run(qc)\n",
        "print(approx_qc.count_ops()[\"cx\"])"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6f067d6e-0157-43fc-8cb2-c86855b6bdac",
      "metadata": {},
      "source": [
        "Isso gera uma saída de `2` porque a aproximação requer menos portas CX.\n",
        "\n",
        "<span id=\"seed\" />\n",
        "\n",
        "<span id=\"random-number-generator-seed\" />\n",
        "\n",
        "## Semente do gerador de números aleatórios\n",
        "\n",
        "Algumas partes do transpilador são estocásticas, portanto, execuções repetidas de transpilação podem retornar resultados diferentes. Para obter um resultado reproduzível, você pode definir a semente para o gerador de números pseudoaleatórios usando o argumento `seed_transpiler` . Execuções repetidas usando a mesma semente retornarão os mesmos resultados.\n",
        "\n",
        "Exemplo:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "dbc652e8-53a4-47a9-a66e-d9c1e5ef07c9",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/dbc652e8-53a4-47a9-a66e-d9c1e5ef07c9-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1, seed_transpiler=11, basis_gates=[\"sx\", \"rz\", \"cx\"]\n",
        ")\n",
        "optimized_1 = pass_manager.run(qc)\n",
        "optimized_1.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "20b95efa-8aa8-41ac-a037-dac2a3336879",
      "metadata": {},
      "source": [
        "<span id=\"init-layout\" />\n",
        "\n",
        "<span id=\"initial-layout\" />\n",
        "\n",
        "## Layout inicial\n",
        "\n",
        "Antes da transpilação, os qubits contidos em seu circuito são qubits virtuais que não correspondem necessariamente a qubits físicos no backend de destino. Você pode especificar o mapeamento inicial de qubits virtuais para qubits físicos usando o argumento `initial_layout` . Observe que o layout final do qubit pode ser diferente do layout inicial porque o transpilador pode permutar os qubits usando portas de troca ou outros meios.\n",
        "\n",
        "No exemplo abaixo, construímos um layout inicial para o backend [`FakeSherbrooke`](/docs/api/qiskit-ibm-runtime/fake-provider-fake-sherbrooke#fakesherbrooke) backend simulado criando um objeto [`Layout`](/docs/api/qiskit/qiskit.transpiler.Layout) objeto. Nosso layout mapeia o primeiro qubit do nosso circuito para o qubit 5 de Sherbrooke e mapeia o segundo qubit do nosso circuito para o qubit 6 de Sherbrooke. Observe que os qubits físicos são sempre representados por números inteiros.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  Nestes exemplos, é utilizado o backend `FakeSherbrooke``qiskit_ibm_runtime` simulado do, mas você pode testá-lo em qualquer backend real ou simulado compatível com o Qiskit.  Seus resultados podem ser diferentes.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "e18c034c-eb26-4d9d-81d7-37e0eafa17c7",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/e18c034c-eb26-4d9d-81d7-37e0eafa17c7-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit_ibm_runtime.fake_provider import FakeSherbrooke\n",
        "from qiskit.transpiler import Layout\n",
        "\n",
        "backend = FakeSherbrooke()\n",
        "\n",
        "a, b = qubits\n",
        "initial_layout = Layout({a: 5, b: 6})\n",
        "\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1, backend=backend, initial_layout=initial_layout\n",
        ")\n",
        "transpiled_circ = pass_manager.run(qc)\n",
        "\n",
        "transpiled_circ.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "261055f3-cb88-4651-9a98-31891a4db535",
      "metadata": {},
      "source": [
        "Além de especificar um objeto Layout, você também pode passar uma lista de números inteiros, em que o $i$ -ésimo elemento da lista contém o qubit físico para o qual o $i$ -ésimo qubit deve ser mapeado. Por exemplo:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "a7800d8a-7354-48e4-a55f-f902ae28c875",
      "metadata": {
        "scrolled": true
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/a7800d8a-7354-48e4-a55f-f902ae28c875-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "initial_layout = [5, 6]\n",
        "\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1, backend=backend, initial_layout=initial_layout\n",
        ")\n",
        "transpiled_circ = pass_manager.run(qc)\n",
        "\n",
        "transpiled_circ.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d2034dd5-23e5-4473-89b8-aaf4233775c7",
      "metadata": {},
      "source": [
        "Você pode usar a função [`plot_error_map`](/docs/api/qiskit/qiskit.visualization.plot_error_map) para gerar um diagrama do gráfico do dispositivo com informações de erro e com os qubits físicos rotulados. Você também pode visualizar diagramas semelhantes na página [Recursos de computação](/computers).\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "8df57c6a-1ff4-4d58-9b7e-4378452c3025",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/8df57c6a-1ff4-4d58-9b7e-4378452c3025-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.visualization import plot_error_map\n",
        "\n",
        "plot_error_map(backend, figsize=(30, 24))"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "25c05cca-b93b-4ba1-b46c-7280ec4ef8cb",
      "metadata": {},
      "source": [
        "<span id=\"xx-method\" />\n",
        "\n",
        "<span id=\"transpiler-stage-and-plugin-options\" />\n",
        "\n",
        "## Opções do estágio do transpiler e do plug-in\n",
        "\n",
        "Essas opções são sufixadas com `_method`. Eles influenciam o funcionamento do transpilador e são usados para tentar obter um resultado melhor, diferente ou específico do transpilador.\n",
        "\n",
        "* `init_method` (str) - O plug-in a ser usado no estágio de inicialização.\n",
        "\n",
        "* `layout_method` (str) - A passagem de seleção de layout (`trivial`, `dense`, `sabre`). Esse também pode ser o nome do plug-in externo a ser usado para o estágio de layout.\n",
        "\n",
        "* `optimization_method` (str) - O plug-in a ser usado no estágio de otimização.\n",
        "\n",
        "* `routing_method` (str) - Nome da passagem de roteamento (`basic`, `lookahead`, `default`, `sabre`, `none`). Esse também pode ser o nome do plug-in externo a ser usado para o estágio de roteamento.\n",
        "\n",
        "* `scheduling_method` (str) - Nome do passe de agendamento. Esse também pode ser o nome do plug-in externo a ser usado na etapa de agendamento.\n",
        "  * `as_soon_as_possible`: Agende instruções com avidez: o mais cedo possível em um recurso de qubit (alias: `asap`).\n",
        "  * `as_late_as_possible`: Programar instruções com atraso.  Ou seja, mantenha os qubits no estado fundamental sempre que possível (pseudônimo: `alap`).\n",
        "\n",
        "* `translation_method` (str) - Nome da passagem de tradução (`unroller`, `translator`, `synthesis`). Esse também pode ser o nome do plug-in externo a ser usado para o estágio de tradução.\n",
        "\n",
        "* `unitary_synthesis_method` (str) - O nome do método de síntese unitária a ser usado. Por padrão, `default` é usado.\n",
        "\n",
        "<Admonition>\n",
        "  Para ver uma lista de todos os plug-ins instalados em um determinado estágio, execute [`list_stage_plugins(\"stage_name\")`](/docs/api/qiskit/transpiler_plugins). Por exemplo, se você quiser ver uma lista de todos os plug-ins instalados para o estágio de roteamento, execute `list_stage_plugins(routing)`.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Próximas etapas\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recomendação\">\n",
        "  * Consulte o tópico [Opções padrão e definições de configuração](defaults-and-configuration-options).\n",
        "  * Aprenda a [definir o nível de otimização](set-optimization).\n",
        "  * Experimente o guia [Comparar configurações do transpiler](/docs/guides/circuit-transpilation-settings).\n",
        "  * Consulte a [documentação da API do transpiler](/docs/api/qiskit/transpiler).\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": 5
}