{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "0998165a-381f-4561-a79a-bf584aed9687",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Estimador com a API REST\"\n",
        "description: \"Como usar a primitiva Estimator com a API REST.\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore IIZII, XIZZZ, accum */}\n",
        "\n",
        "<span id=\"estimator-with-the-rest-api\" />\n",
        "\n",
        "# Estimador com a API REST\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "da948b6b-2ead-4359-aed4-b824e43ccbfb",
      "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",
        "<details>\n",
        "  <summary><b>Versões do pacote</b></summary>\n",
        "\n",
        "  O código desta página foi desenvolvido com base nos seguintes requisitos.\n",
        "  Recomendamos usar essas versões ou versões mais recentes.\n",
        "\n",
        "  ```\n",
        "  qiskit[all]~=2.3.0\n",
        "  ```\n",
        "</details>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3d9ef591-91fd-4a49-a065-5e2cda4d41be",
      "metadata": {},
      "source": [
        "As etapas descritas neste tópico explicam como executar e configurar cargas de trabalho usando a API REST e mostram como invocá-las em qualquer programa de sua escolha.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  Esta documentação utiliza o `requests` módulo Python para demonstrar a API REST. No entanto, esse fluxo de trabalho pode ser executado usando qualquer linguagem ou framework que ofereça suporte ao trabalho com APIs REST. Consulte a [documentação de referência](/docs/api/qiskit-ibm-runtime/tags/jobs) da API para obter mais detalhes.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"1-initialize-the-account\" />\n",
        "\n",
        "## 1. Inicializar a conta\n",
        "\n",
        "Como o Estimator é um serviço gerenciado, você precisa primeiro inicializar sua conta. Em seguida, você pode selecionar o dispositivo que deseja usar para calcular o valor esperado.\n",
        "\n",
        "Veja neste [tópico](/docs/guides/cloud-setup-rest-api) como inicializar sua conta, visualizar os back-ends disponíveis e invalidar tokens.\n",
        "\n",
        "<span id=\"2-create-a-qasm-circuit\" />\n",
        "\n",
        "## 2. Criar um circuito QASM\n",
        "\n",
        "É necessário pelo menos um circuito como entrada para a primitiva Estimador.\n",
        "\n",
        "Defina um circuito quântico QASM. Por exemplo:\n",
        "\n",
        "```python\n",
        "qasm_string='''\n",
        "OPENQASM 3;\n",
        "include \"stdgates.inc\";\n",
        "qreg q[2];\n",
        "creg c[2];\n",
        "x q[0];\n",
        "cx q[0], q[1];\n",
        "c[0] = measure q[0];\n",
        "c[1] = measure q[1];\n",
        "'''\n",
        "```\n",
        "\n",
        "Os trechos de código a seguir pressupõem que o `qasm_string` tenha sido compilado em uma nova string `resulting_qasm`.\n",
        "\n",
        "<span id=\"3-run-the-quantum-circuit-using-the-estimator-v2-api\" />\n",
        "\n",
        "## 3. Execute o circuito quântico usando a API do Estimador V2\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  Os trabalhos a seguir utilizam as primitivas IBM Quantum V2. Tanto quanto `SamplerV2` `EstimatorV2` recebem um ou mais blocos primitivos unificados (PUBs) como entrada. Cada `PUB` é uma tupla que contém um circuito e os dados transmitidos para esse circuito, que podem ser vários observáveis e parâmetros. Cada chamada de `PUB` retorna um resultado.\n",
        "</Admonition>\n",
        "\n",
        "```python\n",
        "import requests\n",
        "\n",
        "url = 'https://quantum.cloud.ibm.com/api/v1/jobs'\n",
        "auth_id = \"Bearer <YOUR_BEARER_TOKEN>\"\n",
        "crn = \"<SERVICE-CRN>\"\n",
        "backend = \"<BACKEND_NAME>\"\n",
        "\n",
        "headers = {\n",
        "    'Content-Type': 'application/json',\n",
        "    'Authorization':auth_id,\n",
        "    'Service-CRN': crn\n",
        "    }\n",
        "\n",
        "job_input = {\n",
        "    'program_id': 'estimator',\n",
        "    \"backend\": backend,\n",
        "    \"params\": {\n",
        "        \"pubs\": [ #primitive unified blocs (PUBs) containing one circuit each.\n",
        "            [resulting_qasm, # QASM circuit\n",
        "             {\"IIZII\": 1, \"XIZZZ\": 2.3}, # Observable\n",
        "             None # parameter values\n",
        "             ]]\n",
        "}}\n",
        "\n",
        "response = requests.post(url, headers=headers, json=job_input)\n",
        "\n",
        "if response.status_code == 200:\n",
        "    job_id = response.json().get('id')\n",
        "    print(\"Job created:\",response.text)\n",
        "else:\n",
        "    print(f\"Error: {response.status_code}\")\n",
        "```\n",
        "\n",
        "<span id=\"4-check-job-status-and-get-results\" />\n",
        "\n",
        "## 4. Verificar o status do trabalho e obter os resultados\n",
        "\n",
        "Em seguida, passe o `job_id` para a API:\n",
        "\n",
        "```python\n",
        "response_status_singlejob= requests.get(url+'/'+job_id, headers=headers)\n",
        "response_status_singlejob.json().get('state')\n",
        "```\n",
        "\n",
        "Saída\n",
        "\n",
        "```text\n",
        ">>> Job ID: 58223448-5100-4dec-a47a-942fb30edcad\n",
        ">>> Job Status: JobStatus.RUNNING\n",
        "```\n",
        "\n",
        "Veja os resultados da busca:\n",
        "\n",
        "```python\n",
        "response_result= requests.get(url+'/'+job_id+'/results', headers=headers)\n",
        "\n",
        "res_dict=response_result.json()\n",
        "\n",
        "estimator_result=res_dict['results']\n",
        "print(estimator_result)\n",
        "```\n",
        "\n",
        "Saída\n",
        "\n",
        "```text\n",
        "[{'data': {'evs': 0.7428980350102542, 'stds': 0.029884014518789213, 'ensemble_standard_error': 0.03261147170624149}, 'metadata': {'shots': 10016, 'target_precision': 0.01, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}}]\n",
        "```\n",
        "\n",
        "<span id=\"5-work-with-options\" />\n",
        "\n",
        "## 5. Trabalhar com opções\n",
        "\n",
        "As técnicas de mitigação de erros permitem que os usuários minimizem os erros de circuito por meio da modelagem do ruído do dispositivo no momento da execução. Isso geralmente resulta em uma sobrecarga de pré-processamento quântico relacionada ao treinamento do modelo e em uma sobrecarga de pós-processamento clássico para mitigar erros nos resultados brutos por meio do uso do modelo gerado.\n",
        "\n",
        "As técnicas de mitigação de erros integradas às primitivas são opções avançadas de resiliência. Para definir essas opções, use a `resilience_level` opção ao enviar seu trabalho.\n",
        "\n",
        "Os exemplos a seguir demonstram as opções padrão para desacoplamento dinâmico, twirling e TREX + ZNE. Encontre mais opções e detalhes no tópico “[Técnicas de mitigação e supressão de](/docs/guides/error-mitigation-and-suppression-techniques) erros”.\n",
        "\n",
        "<span id=\"trex-+-zne\" />\n",
        "\n",
        "### TREX + ZNE\n",
        "\n",
        "```python\n",
        "import requests\n",
        "\n",
        "url = 'https://quantum.cloud.ibm.com/api/v1/jobs'\n",
        "auth_id = \"Bearer <YOUR_BEARER_TOKEN>\"\n",
        "crn = \"<SERVICE-CRN>\"\n",
        "backend = \"BACKEND_NAME\"\n",
        "\n",
        "headers = {\n",
        "    'Content-Type': 'application/json',\n",
        "    'Authorization':auth_id,\n",
        "    'Service-CRN': crn\n",
        "    }\n",
        "job_input = {\n",
        "    'program_id': 'estimator',\n",
        "    \"backend\": backend,\n",
        "    \"params\": {\n",
        "        \"pubs\": [ #primitive unified blocs (PUBs) containing one circuit each\n",
        "            [resulting_qasm, # QASM circuit\n",
        "             {\"IIZII\": 1, \"XIZZZ\": 2.3}, # Observable\n",
        "             None # parameter values\n",
        "             ]]\n",
        "        \"options\": {\n",
        "            \"resilience\": {\n",
        "              \"measure_mitigation\": True,\n",
        "              \"zne_mitigation\": True,\n",
        "              \"zne\": {\n",
        "                  \"extrapolator\":[\"exponential\", \"linear\"],\n",
        "                  \"noise_factors\":[1, 3, 5],\n",
        "              },\n",
        "          },\n",
        "        },\n",
        "    }\n",
        "}\n",
        "\n",
        "response = requests.post(url, headers=headers, json=job_input)\n",
        "\n",
        "if response.status_code == 200:\n",
        "    job_id = response.json().get('id')\n",
        "    print(\"Job created:\",response.text)\n",
        "else:\n",
        "    print(f\"Error: {response.status_code}\")\n",
        "```\n",
        "\n",
        "<span id=\"dynamical-decoupling\" />\n",
        "\n",
        "### Desacoplamento dinâmico\n",
        "\n",
        "```python\n",
        "import requests\n",
        "\n",
        "url = 'https://quantum.cloud.ibm.com/api/v1/jobs'\n",
        "auth_id = \"Bearer <YOUR_BEARER_TOKEN>\"\n",
        "crn = \"<SERVICE-CRN>\"\n",
        "backend = \"BACKEND_NAME\"\n",
        "\n",
        "headers = {\n",
        "    'Content-Type': 'application/json',\n",
        "    'Authorization':auth_id,\n",
        "    'Service-CRN': crn\n",
        "    }\n",
        "job_input = {\n",
        "    'program_id': 'estimator',\n",
        "    \"backend\": backend,\n",
        "    \"params\": {\n",
        "        \"pubs\": [ #primitive unified blocs (PUBs) containing one circuit each\n",
        "            [resulting_qasm, # QASM circuit\n",
        "             {\"IIZII\": 1, \"XIZZZ\": 2.3}, # Observable\n",
        "             None # parameter values\n",
        "             ]]\n",
        "        \"options\": {\n",
        "            \"dynamical_decoupling\": {\n",
        "                \"enable\": True,\n",
        "                \"sequence_type\": 'XpXm',\n",
        "                \"extra_slack_distribution\": 'middle',\n",
        "                \"scheduling_method\": 'alap',\n",
        "            },\n",
        "        },\n",
        "    }\n",
        "}\n",
        "\n",
        "response = requests.post(url, headers=headers, json=job_input)\n",
        "\n",
        "if response.status_code == 200:\n",
        "    job_id = response.json().get('id')\n",
        "    print(\"Job created:\",response.text)\n",
        "else:\n",
        "    print(f\"Error: {response.status_code}\")\n",
        "```\n",
        "\n",
        "<span id=\"twirling\" />\n",
        "\n",
        "### Girando\n",
        "\n",
        "```python\n",
        "import requests\n",
        "\n",
        "url = 'https://quantum.cloud.ibm.com/api/v1/jobs'\n",
        "auth_id = \"Bearer <YOUR_BEARER_TOKEN>\"\n",
        "crn = \"<SERVICE-CRN>\"\n",
        "backend = \"BACKEND_NAME\"\n",
        "\n",
        "headers = {\n",
        "    'Content-Type': 'application/json',\n",
        "    'Authorization':auth_id,\n",
        "    'Service-CRN': crn\n",
        "    }\n",
        "job_input = {\n",
        "    'program_id': 'estimator',\n",
        "    \"backend\": backend,\n",
        "    \"params\": {\n",
        "        \"pubs\": [ #primitive unified blocs (PUBs) containing one circuit each\n",
        "            [resulting_qasm, # QASM circuit\n",
        "             {\"IIZII\": 1, \"XIZZZ\": 2.3}, # Observable\n",
        "             None # parameter values\n",
        "             ]]\n",
        "        \"options\": {\n",
        "            \"twirling\": {\n",
        "                \"enable_gates\": True,\n",
        "                \"enable_measure\": True,\n",
        "                \"num_randomizations\": \"auto\",\n",
        "                \"shots_per_randomization\": \"auto\",\n",
        "                \"strategy\": \"active-accum\",\n",
        "                },\n",
        "        },\n",
        "    }\n",
        "}\n",
        "\n",
        "response = requests.post(url, headers=headers, json=job_input)\n",
        "\n",
        "if response.status_code == 200:\n",
        "    job_id = response.json().get('id')\n",
        "    print(\"Job created:\",response.text)\n",
        "else:\n",
        "    print(f\"Error: {response.status_code}\")\n",
        "```\n",
        "\n",
        "<span id=\"parameterized-circuits\" />\n",
        "\n",
        "## Circuitos parametrizados\n",
        "\n",
        "<span id=\"1-initialize-the-account-1\" />\n",
        "\n",
        "### 1. Inicializar a conta\n",
        "\n",
        "Primeiro, você precisa inicializar sua conta. Em seguida, você pode selecionar o dispositivo no qual deseja realizar seus cálculos.\n",
        "\n",
        "Veja neste [tópico](/docs/guides/cloud-setup-rest-api) como inicializar sua conta, visualizar os back-ends disponíveis e invalidar tokens.\n",
        "\n",
        "<span id=\"2-define-parameters\" />\n",
        "\n",
        "### 2. Definir parâmetros\n",
        "\n",
        "```python\n",
        "import requests\n",
        "import qiskit_ibm_runtime\n",
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit.qasm3 import dumps\n",
        "from qiskit import QuantumCircuit\n",
        "from qiskit.circuit import Parameter\n",
        "from qiskit import transpile\n",
        "\n",
        "service = QiskitRuntimeService(channel='ibm_quantum')\n",
        "backend = service.backend(\"<SPECIFY BACKEND>\")\n",
        "\n",
        "pm = generate_preset_pass_manager(backend=backend, optimization_level=1)\n",
        "\n",
        "theta = Parameter('theta')\n",
        "phi = Parameter('phi')\n",
        "parameter_values = {'theta': 1.57, 'phi': 3.14}   # In case we want to pass a dictionary\n",
        "```\n",
        "\n",
        "<span id=\"3-create-a-quantum-circuit-and-add-parameterized-gates\" />\n",
        "\n",
        "### 3. Crie um circuito quântico e adicione portas parametrizadas\n",
        "\n",
        "```python\n",
        "qc = QuantumCircuit(2)\n",
        "\n",
        "# Add parameterized gates\n",
        "qc.rx(theta, 0)\n",
        "qc.ry(phi, 1)\n",
        "qc.cx(0, 1)\n",
        "qc.measure_all()\n",
        "\n",
        "# Draw the original circuit\n",
        "qc.draw('mpl')\n",
        "\n",
        "# Get an ISA circuit\n",
        "isa_circuit = pm.run(qc)\n",
        "```\n",
        "\n",
        "<span id=\"4-generate-qasm-3-code\" />\n",
        "\n",
        "### 4. Gerar código QASM 3\n",
        "\n",
        "```python\n",
        "qasm_str = dumps(isa_circuit)\n",
        "print(\"Generated QASM 3 code:\")\n",
        "print(qasm_str)\n",
        "```\n",
        "\n",
        "<span id=\"5-run-the-quantum-circuit-using-estimator-v2-api\" />\n",
        "\n",
        "### 5. Execute o circuito quântico usando a API do Estimator V2\n",
        "\n",
        "```python\n",
        "import requests\n",
        "\n",
        "url = 'https://quantum.cloud.ibm.com/api/v1/jobs'\n",
        "auth_id = \"Bearer <YOUR_BEARER_TOKEN>\"\n",
        "crn = \"<SERVICE-CRN>\"\n",
        "backend = \"<BACKEND_NAME>\"\n",
        "\n",
        "headers = {\n",
        "    'Content-Type': 'application/json',\n",
        "    'Authorization':auth_id,\n",
        "    'Service-CRN': crn\n",
        "    }\n",
        "\n",
        "job_input = {\n",
        "    'program_id': 'estimator',\n",
        "    \"backend\": backend,\n",
        "    \"params\": {\n",
        "        # Choose one option: direct parameter transfer or through a dictionary\n",
        "        #\"pubs\": [[qasm_str,[1,2],500]], # primitive unified blocs (PUBs) containing one circuit each.\n",
        "        \"pubs\": [[qasm_str,parameter_values,500]], # primitive unified blocs (PUBs) containing one circuit each.\n",
        "}}\n",
        "\n",
        "response = requests.post(url, headers=headers, json=job_input)\n",
        "\n",
        "if response.status_code == 200:\n",
        "    job_id = response.json().get('id')\n",
        "    print(f\"Job created: {response.text}\")\n",
        "else:\n",
        "    print(f\"Error: {response.status_code}\")\n",
        "```\n",
        "\n",
        "```python\n",
        "print(response.text)\n",
        "```\n",
        "\n",
        "<span id=\"6-check-job-status-and-get-results\" />\n",
        "\n",
        "### 6. Verificar o status do trabalho e obter os resultados\n",
        "\n",
        "Em seguida, passe o `job_id` para a API:\n",
        "\n",
        "```python\n",
        "response_status_singlejob = requests.get(f\"{url}/{job_id}\", headers=headers)\n",
        "response_status_singlejob.json().get('state')\n",
        "```\n",
        "\n",
        "Saída\n",
        "\n",
        "```text\n",
        "{'status': 'Completed'}\n",
        "```\n",
        "\n",
        "Veja os resultados da busca:\n",
        "\n",
        "```python\n",
        "response_result = requests.get(f\"{url}/{job_id}/results\", headers=headers)\n",
        "\n",
        "res_dict=response_result.json()\n",
        "\n",
        "# Get results for the first PUB\n",
        "counts=res_dict['results'][0]['data']['c']['samples']\n",
        "\n",
        "print(counts[:20])\n",
        "```\n",
        "\n",
        "Saída\n",
        "\n",
        "```text\n",
        "['0x1', '0x2', '0x1', '0x2', '0x1', '0x2', '0x0', '0x2', '0x1', '0x1', '0x2', '0x2', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1']\n",
        "```\n",
        "\n",
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Próximas etapas\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recomendações\">\n",
        "  * Existem várias maneiras de executar cargas de trabalho, dependendo das suas necessidades: modo de tarefa, modo de sessão e modo em lote. Saiba como trabalhar com o modo de sessão e o modo em lote no [tópico](/docs/guides/execution-modes-rest-api) sobre modos de execução. Observe que os usuários do Open Plan não podem enviar tarefas de sessão.\n",
        "  * Saiba como [configurar sua conta](/docs/guides/cloud-setup-rest-api) usando a API REST.\n",
        "  * Pratique com primitivas seguindo a [lição](/learning/courses/variational-algorithm-design/cost-functions) sobre a função `Cost` em IBM Quantum® Learning.\n",
        "  * Saiba como fazer a transpilagem localmente na seção [Transpilagem](/docs/guides/transpile).\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
}