{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "f560a2bd-78d2-45fd-8f1b-9f0a4c5e178d",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Introdução aos primitivos\"\n",
        "description: \"Introdução às primitivas no Qiskit e uma explicação sobre as primitivas disponíveis\"\n",
        "---\n",
        "\n",
        "<span id=\"introduction-to-primitives\" />\n",
        "\n",
        "# Introdução aos primitivos\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7bfc257f-69c5-4fb1-8042-b62efa8cf64e",
      "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.3.0\n",
        "    qiskit-ibm-runtime~=0.43.1\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3ac7f2c2-1541-49f1-9f8f-4c0a8e3a149a",
      "metadata": {},
      "source": [
        "<span id=\"qpu-access-patterns\" />\n",
        "\n",
        "<span id=\"why-did-qiskit-introduce-primitives\" />\n",
        "\n",
        "## Por que o Qiskit introduziu primitivas?\n",
        "\n",
        "Semelhante aos primeiros dias dos computadores clássicos, quando os desenvolvedores tinham que manipular os registros da CPU diretamente, a interface inicial das QPUs simplesmente retornava os dados brutos dos componentes eletrônicos de controle.\n",
        "Isso não era um grande problema quando as QPUs ficavam nos laboratórios e só permitiam o acesso direto dos pesquisadores.\n",
        "Reconhecendo que a maioria dos desenvolvedores não estaria e não deveria estar familiarizada com a destilação desses dados brutos em 0s e 1s, o Qiskit introduziu `backend.run`, uma primeira abstração para acessar QPUs na nuvem. Isso permitiu que os desenvolvedores operassem em um formato de dados familiar e se concentrassem no panorama geral.\n",
        "\n",
        "À medida que o acesso às QPUs se tornou mais difundido e com mais algoritmos quânticos sendo desenvolvidos, novamente surgiu a necessidade de uma abstração de nível superior. Em resposta, o Qiskit introduziu a interface de primitivos, que é otimizada para duas tarefas principais no desenvolvimento de algoritmos quânticos: estimativa de valor de expectativa (`Estimator`) e amostragem de circuito (`Sampler`). O objetivo é mais uma vez mais uma vez ajudar os desenvolvedores a se concentrarem mais na inovação e menos na conversão de dados. A interface de primitivos substitui a interface `backend.run` , pois a `Sampler` fornece o mesmo acesso direto ao hardware que era oferecido pela `backend.run`.\n",
        "\n",
        "<span id=\"what-is-a-primitive\" />\n",
        "\n",
        "## O que é um primitivo?\n",
        "\n",
        "Os sistemas de computação são construídos em várias camadas de abstração. As abstrações permitem que você se concentre em um nível específico de detalhes relevantes para a tarefa em questão. Quanto mais próximo você estiver do hardware, menor será o nível de abstração necessário (por exemplo, talvez você precise mover ou manipular dados no nível de instrução da CPU). Quanto mais complexa for a tarefa que você deseja executar, maior será o nível das abstrações (por exemplo, você pode estar usando uma biblioteca de programação para realizar cálculos algébricos).\n",
        "\n",
        "Nesse contexto, uma *primitiva* é a menor instrução de processamento, o bloco de construção mais simples a partir do qual se pode criar algo útil para um determinado nível de abstração é possível criar algo útil para um determinado nível de abstração.\n",
        "\n",
        "O recente progresso na computação quântica aumentou a necessidade de trabalhar em níveis mais altos de abstração.\n",
        "À medida que o campo avança em direção a unidades de processamento quântico (QPUs) maiores e fluxos de trabalho mais complexos, o foco muda da interação com sinais de qubit individuais para a visualização de dispositivos quânticos como sistemas que executam as tarefas necessárias sinais de qubit individuais para a visualização de dispositivos quânticos como sistemas que executam as tarefas necessárias.\n",
        "\n",
        "As duas tarefas mais comuns dos computadores quânticos são a amostragem de estados quânticos e o cálculo de valores de expectativa.\n",
        "Essas tarefas motivaram o projeto do Qiskit primitives : **Estimator** and **Sampler**.\n",
        "\n",
        "* O estimador calcula os valores de expectativa dos observáveis com relação aos estados preparados pelos circuitos quânticos.\n",
        "* O amostrador faz a amostragem do registro de saída da execução do circuito quântico.\n",
        "\n",
        "Em resumo, o modelo computacional introduzido pelo site Qiskit primitives aproxima a programação quântica da programação clássica atual, em que o foco está menos nos detalhes do hardware e mais nos resultados que você está tentando alcançar que se está tentando obter.\n",
        "\n",
        "<span id=\"primitive-definition-and-implementations\" />\n",
        "\n",
        "## Definição primitiva e implementações\n",
        "\n",
        "Existem dois tipos de Qiskit primitives: as classes base e suas implementações. As primitivas Estimator e Sampler são definidas por classes-base de primitivas de código aberto que se encontram no pacote Qiskit SDK (no módulo [`qiskit.primitives`](/docs/api/qiskit/primitives)). Os provedores (como Qiskit Runtime ) podem usar essas classes base para derivar suas próprias implementações de Sampler e Estimator.  A maioria dos usuários irá interagir com as implementações dos provedores, e não com as primitivas básicas.\n",
        "\n",
        "<span id=\"base-classes\" />\n",
        "\n",
        "### classes base\n",
        "\n",
        "As `Base` primitivas são classes abstratas que definem uma interface comum para a implementação de primitivas. Todas as outras classes do [`qiskit.primitives`](/docs/api/qiskit/primitives) módulo herdam dessas classes base. Os desenvolvedores devem usar essas funcionalidades caso tenham interesse em criar seu próprio modelo de execução baseado em primitivas para um provedor específico. Essas classes também podem ser úteis para quem deseja realizar processamentos altamente personalizados e considera que as implementações das primitivas existentes são simples demais para suas necessidades. Os usuários em geral não utilizarão diretamente as classes base.\n",
        "\n",
        "[`BaseEstimatorV1`](/docs/api/qiskit/qiskit.primitives.BaseEstimatorV1) e [`BaseSamplerV1`](/docs/api/qiskit/qiskit.primitives.BaseSamplerV1) - Embora as primitivas do V1 ainda possam ser utilizadas, estes guias se concentram nas primitivas do V2, pois são as mais recentes e as mais comumente utilizadas.\n",
        "\n",
        "[`BaseEstimatorV2`](/docs/api/qiskit/qiskit.primitives.BaseEstimatorV2) e [`BaseSamplerV2`](/docs/api/qiskit/qiskit.primitives.BaseSamplerV2) - As primitivas de referência do Qiskit seguem essas especificações de interface.\n",
        "\n",
        "<span id=\"implementations\" />\n",
        "\n",
        "<span id=\"implementations\" />\n",
        "\n",
        "### Implementações\n",
        "\n",
        "Todas as classes primitivas são derivadas das classes base; portanto, elas têm a mesma estrutura geral e o mesmo modo de uso.  Por exemplo, o formato da entrada para todas as primitivas do Estimator é o mesmo.  No entanto, existem diferenças nas implementações que as tornam únicas.\n",
        "\n",
        "Essas são implementações das classes básicas de primitivos:\n",
        "\n",
        "* [As primitivas](/docs/guides/qiskit-runtime-primitives) do Qiskit Runtime, [`EstimatorV2`](/docs/api/qiskit-ibm-runtime/estimator-v2) e [`SamplerV2`](/docs/api/qiskit-ibm-runtime/sampler-v2), oferecem uma implementação mais sofisticada (por exemplo, incluindo mitigação de erros) como um serviço baseado em nuvem. Esta implementação das primitivas básicas é usada para acessar o hardwar IBM Quantum®.\n",
        "\n",
        "* [`StatevectorEstimator`](/docs/api/qiskit/qiskit.primitives.StatevectorEstimator) e [`StatevectorSampler`](/docs/api/qiskit/qiskit.primitives.StatevectorSampler#statevectorsampler) - Implementações de referência das primitivas que utilizam o simulador integrado ao Qiskit. Elas são criadas com o módulo [`quantum_info`](/docs/api/qiskit/quantum_info#quantum-information) Qiskit, gerando resultados com base em simulações de vetores de estado ideais.  Eles são acessados por meio do Qiskit. Consulte [a simulação exata com Qiskit primitives](/docs/guides/simulate-with-qiskit-sdk-primitives) para obter detalhes sobre o uso.\n",
        "\n",
        "* [`BackendEstimatorV2`](/docs/api/qiskit/qiskit.primitives.BackendEstimatorV2) e [`BackendSamplerV2`](/docs/api/qiskit/qiskit.primitives.BackendSamplerV2) - Você pode usar essas classes para “encapsular” qualquer recurso de computação quântica em uma primitiva. Isso permite que você escreva código no estilo primitivo para provedores que ainda não possuem uma interface baseada em primitivas. Essas classes podem ser usadas da mesma forma que o Sampler e o Estimator comuns, exceto que devem ser inicializadas com um argumento `backend` adicional para selecionar em qual computador quântico serão executadas. O acesso a eles é feito por meio do Qiskit. Consulte o guia [de primitivas de backend](/docs/guides/get-started-with-backend-primitives) para obter mais informações.\n",
        "\n",
        "<span id=\"options\" />\n",
        "\n",
        "## Opções\n",
        "\n",
        "Você pode passar opções para os tipos primitivos a fim de personalizá-los de acordo com suas necessidades. Embora a interface do método `run()` das primitivas seja comum a todas as implementações, suas opções não o são. Consulte as referências da API para uma implementação específica de primitiva para saber quais opções ela oferece.\n",
        "\n",
        "Por exemplo, consulte os tópicos [Opções do](/docs/guides/estimator-options) Estimator e [“Opções do Sampler”](/docs/guides/sampler-options) para saber mais sobre as opções das primitivas do Qiskit Runtime, ou consulte [as referências da API do Qiskit Aer](https://qiskit.github.io/qiskit-aer/apidocs/aer_primitives.html) para conhecer as opções das primitivas do Qiskit Aer.\n",
        "\n",
        "<span id=\"benefits-of-qiskit-primitives\" />\n",
        "\n",
        "## Benefícios de Qiskit primitives\n",
        "\n",
        "Com primitivas, os usuários do Qiskit podem escrever código quântico para uma QPU específica sem precisar gerenciar explicitamente\n",
        "cada detalhe. Além disso, devido à camada adicional de abstração, você poderá acessar mais facilmente\n",
        "os recursos avançados de hardware de um determinado provedor. Por exemplo, com primitivas de Qiskit Runtime,\n",
        "você pode aproveitar os avanços mais recentes em mitigação e supressão de erros alternando opções como a primitiva [`resilience_level`](/docs/api/qiskit-ibm-runtime/options-estimator-options#resilience_level), em vez de criar sua própria implementação dessas técnicas.\n",
        "\n",
        "Para os provedores de hardware, a implementação de primitivas nativamente significa que você pode oferecer aos seus usuários uma maneira mais \"pronta para uso\" para acessar os recursos do seu hardware, como técnicas avançadas de pós-processamento. Portanto, é mais fácil para os seus usuários se beneficiarem dos melhores recursos do seu hardware.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "02dbbc7d-76e7-4a89-8739-ba7f3a5a05b8",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Próximas etapas\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recomendações\">\n",
        "  * Compreender as operações [básicas de entrada e saída](/docs/guides/primitive-input-output).\n",
        "  * Analise [exemplos](/docs/guides/simulate-with-qiskit-sdk-primitives) detalhados.\n",
        "  * Pratique com primitivas trabalhando na [lição Função de custo](/learning/courses/variational-algorithm-design/cost-functions) no IBM Quantum Learning.\n",
        "  * Consulte a seção [“Criar um provedor”](/docs/guides/create-a-provider) para saber como implementar suas próprias primitivas Sampler e Estimator.\n",
        "  * Consulte as [referências da API](/docs/api/qiskit/primitives).\n",
        "  * Leia [Migrar para V2 primitives](/docs/guides/v2-primitives).\n",
        "  * Conheça as [primitivas](/docs/guides/qiskit-runtime-primitives) do `Qiskit Runtime`, que são utilizadas para executar circuitos em QPUs d IBM.\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
}