{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "DkA0Fobtb9dM"
   },
   "source": [
    "##### Copyright 2022 The Cirq Developers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "cellView": "form",
    "execution": {
     "iopub.execute_input": "2025-08-12T09:08:25.529166Z",
     "iopub.status.busy": "2025-08-12T09:08:25.528956Z",
     "iopub.status.idle": "2025-08-12T09:08:25.532227Z",
     "shell.execute_reply": "2025-08-12T09:08:25.531674Z"
    },
    "id": "tUshu7YfcAAW"
   },
   "outputs": [],
   "source": [
    "# @title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
    "# you may not use this file except in compliance with the License.\n",
    "# You may obtain a copy of the License at\n",
    "#\n",
    "# https://www.apache.org/licenses/LICENSE-2.0\n",
    "#\n",
    "# Unless required by applicable law or agreed to in writing, software\n",
    "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
    "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
    "# See the License for the specific language governing permissions and\n",
    "# limitations under the License."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "4ySIERZGZN0d"
   },
   "source": [
    "# QVM Basic Example"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "vGUeqO9jn1vc"
   },
   "source": [
    "<table class=\"tfo-notebook-buttons\" align=\"left\">\n",
    "  <td>\n",
    "    <a target=\"_blank\" href=\"https://quantumai.google/cirq/simulate/qvm_basic_example\"><img src=\"https://quantumai.google/site-assets/images/buttons/quantumai_logo_1x.png\" />View on QuantumAI</a>\n",
    "  </td>\n",
    "  <td>\n",
    "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/quantumlib/Cirq/blob/main/docs/simulate/qvm_basic_example.ipynb\"><img src=\"https://quantumai.google/site-assets/images/buttons/colab_logo_1x.png\" />Run in Google Colab</a>\n",
    "  </td>\n",
    "  <td>\n",
    "    <a target=\"_blank\" href=\"https://github.com/quantumlib/Cirq/blob/main/docs/simulate/qvm_basic_example.ipynb\"><img src=\"https://quantumai.google/site-assets/images/buttons/github_logo_1x.png\" />View source on GitHub</a>\n",
    "  </td>\n",
    "  <td>\n",
    "    <a href=\"https://storage.googleapis.com/tensorflow_docs/Cirq/docs/simulate/qvm_basic_example.ipynb\"><img src=\"https://quantumai.google/site-assets/images/buttons/download_icon_1x.png\" />Download notebook</a>\n",
    "  </td>\n",
    "</table>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "cd6e59ef3edd"
   },
   "source": [
    "This notebook walks through running a simple circuit on the [Quantum Virtual Machine](./quantum_virtual_machine.ipynb), including the necessary constraints on a device-runnable circuit and how to satisfy them. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Lfira0gPf0Gd"
   },
   "source": [
    "## **Install** Cirq and qsim"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "cellView": "form",
    "execution": {
     "iopub.execute_input": "2025-08-12T09:08:25.534636Z",
     "iopub.status.busy": "2025-08-12T09:08:25.534413Z",
     "iopub.status.idle": "2025-08-12T09:08:41.104451Z",
     "shell.execute_reply": "2025-08-12T09:08:41.103569Z"
    },
    "id": "zs5J6wAXqvtW"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "installing cirq...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "installed cirq.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "installing qsimcirq...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "installed qsimcirq.\n"
     ]
    }
   ],
   "source": [
    "# @title Install `cirq_google` and `qsimcirq`\n",
    "\n",
    "try:\n",
    "    import cirq\n",
    "    import cirq_google\n",
    "except ImportError:\n",
    "    print(\"installing cirq...\")\n",
    "    !pip install --quiet cirq-google\n",
    "    print(\"installed cirq.\")\n",
    "    import cirq\n",
    "    import cirq_google\n",
    "\n",
    "try:\n",
    "    import qsimcirq\n",
    "except ImportError:\n",
    "    print(\"installing qsimcirq...\")\n",
    "    !pip install --quiet qsimcirq\n",
    "    print(f\"installed qsimcirq.\")\n",
    "    import qsimcirq\n",
    "\n",
    "# Other modules used in this colab\n",
    "import matplotlib.pyplot as plt\n",
    "import time"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "p2JAfQa8gVSe"
   },
   "source": [
    "## Create a **Quantum Virtual Machine**\n",
    "\n",
    "The following cell builds a Quantum Virtual Machine that mimics a particular Google quantum hardware device (currently Willow-pink, Rainbow or Weber) using the following customizable steps: \n",
    "- Constructing a `cirq.NoiseModel` object from device calibration data saved in Cirq. See [Representing Noise](../noise/representing_noise.ipynb) for more on noise models. \n",
    "- Building a `qsimcirq.QsimSimulator` that uses this noise model. See [Noisy Simulation](./noisy_simulation.ipynb) and [Noise simulation with qsim](/qsim/tutorials/noisy_qsimcirq) for more. \n",
    "- Creating a `cirq.Device` that imposes the same constraints on circuits that the original device would. See [Devices](../hardware/devices.ipynb) for more on these constraint objects. \n",
    "- Packaging the simulator and device into an object that implements the `cirq.Engine` interface that the hardware device would use. \n",
    "\n",
    "If you don't need this level of control, you can also instantiate a QVM with `cirq_google.engine.create_default_noisy_quantum_virtual_machine`, as in [QVM Creation Template](./qvm_builder_code.ipynb). "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "cellView": "form",
    "execution": {
     "iopub.execute_input": "2025-08-12T09:08:41.108140Z",
     "iopub.status.busy": "2025-08-12T09:08:41.107199Z",
     "iopub.status.idle": "2025-08-12T09:08:41.442593Z",
     "shell.execute_reply": "2025-08-12T09:08:41.441947Z"
    },
    "id": "pbHCUPLpq5WE"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Your quantum virtual machine willow_pink is ready, here is the qubit grid: \n",
      "========================\n",
      "\n",
      "                                                        (0, 6)────(0, 7)────(0, 8)\n",
      "                                                        │         │         │\n",
      "                                                        │         │         │\n",
      "                                              (1, 5)────(1, 6)────(1, 7)────(1, 8)\n",
      "                                              │         │         │         │\n",
      "                                              │         │         │         │\n",
      "                                    (2, 4)────(2, 5)────(2, 6)────(2, 7)────(2, 8)────(2, 9)────(2, 10)\n",
      "                                    │         │         │         │         │         │         │\n",
      "                                    │         │         │         │         │         │         │\n",
      "                           (3, 3)───(3, 4)────(3, 5)────(3, 6)────(3, 7)────(3, 8)────(3, 9)────(3, 10)\n",
      "                           │        │         │         │         │         │         │         │\n",
      "                           │        │         │         │         │         │         │         │\n",
      "                  (4, 2)───(4, 3)───(4, 4)────(4, 5)────(4, 6)────(4, 7)────(4, 8)────(4, 9)────(4, 10)────(4, 11)───(4, 12)\n",
      "                  │        │        │         │         │         │         │         │         │          │         │\n",
      "                  │        │        │         │         │         │         │         │         │          │         │\n",
      "         (5, 1)───(5, 2)───(5, 3)───(5, 4)────(5, 5)────(5, 6)────(5, 7)────(5, 8)────(5, 9)────(5, 10)────(5, 11)───(5, 12)\n",
      "         │        │        │        │         │         │         │         │         │         │          │         │\n",
      "         │        │        │        │         │         │         │         │         │         │          │         │\n",
      "(6, 0)───(6, 1)───(6, 2)───(6, 3)───(6, 4)────(6, 5)────(6, 6)────(6, 7)────(6, 8)────(6, 9)────(6, 10)────(6, 11)───(6, 12)───(6, 13)───(6, 14)\n",
      "                  │        │        │         │         │         │         │         │         │          │         │         │\n",
      "                  │        │        │         │         │         │         │         │         │          │         │         │\n",
      "                  (7, 2)───(7, 3)───(7, 4)────(7, 5)────(7, 6)────(7, 7)────(7, 8)────(7, 9)────(7, 10)────(7, 11)───(7, 12)───(7, 13)\n",
      "                  │        │        │         │         │         │         │         │         │          │         │\n",
      "                  │        │        │         │         │         │         │         │         │          │         │\n",
      "                  (8, 2)───(8, 3)───(8, 4)────(8, 5)────(8, 6)────(8, 7)────(8, 8)────(8, 9)────(8, 10)────(8, 11)───(8, 12)\n",
      "                                    │         │         │         │         │         │         │          │\n",
      "                                    │         │         │         │         │         │         │          │\n",
      "                                    (9, 4)────(9, 5)────(9, 6)────(9, 7)────(9, 8)────(9, 9)────(9, 10)────(9, 11)\n",
      "                                    │         │         │         │         │         │         │\n",
      "                                    │         │         │         │         │         │         │\n",
      "                                    (10, 4)───(10, 5)───(10, 6)───(10, 7)───(10, 8)───(10, 9)───(10, 10)\n",
      "                                                        │         │         │         │\n",
      "                                                        │         │         │         │\n",
      "                                                        (11, 6)───(11, 7)───(11, 8)───(11, 9)\n",
      "                                                        │         │         │\n",
      "                                                        │         │         │\n",
      "                                                        (12, 6)───(12, 7)───(12, 8)\n"
     ]
    }
   ],
   "source": [
    "# @title Choose a processor (\"willow_pink\" or \"rainbow\" or \"weber\")\n",
    "# (see cirq_google.engine.list_virtual_processors() for available names)\n",
    "processor_id = \"willow_pink\"  # @param {type:\"string\"}\n",
    "\n",
    "# Construct a simulator with a noise model based on the specified processor.\n",
    "noise_props = cirq_google.engine.load_device_noise_properties(processor_id)\n",
    "noise_model = cirq_google.NoiseModelFromGoogleNoiseProperties(noise_props)\n",
    "sim = qsimcirq.QSimSimulator(noise=noise_model)\n",
    "\n",
    "# Create a device from the public device description\n",
    "device = cirq_google.engine.create_device_from_processor_id(processor_id)\n",
    "cal = cirq_google.engine.load_median_device_calibration(processor_id)\n",
    "# Build the simulated local processor from the simulator and device.\n",
    "sim_processor = cirq_google.engine.SimulatedLocalProcessor(\n",
    "    processor_id=processor_id, sampler=sim, device=device, calibrations={cal.timestamp // 1000: cal}\n",
    ")\n",
    "# Package the processor to use an Engine interface\n",
    "sim_engine = cirq_google.engine.SimulatedLocalEngine([sim_processor])\n",
    "print(\n",
    "    \"Your quantum virtual machine\",\n",
    "    processor_id,\n",
    "    \"is ready, here is the qubit grid:\",\n",
    "    \"\\n========================\\n\",\n",
    ")\n",
    "print(sim_engine.get_processor(processor_id).get_device())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "TJfN17frwo-0"
   },
   "source": [
    "## **Create** a circuit, **transform** it (to make it executable on Google quantum hardware) and **choose qubits** on the processor. \n",
    "\n",
    "The circuit you use needs to be _device ready_, which means it: \n",
    "- Is comprised of operations from the device's gate set. \n",
    "- Is applied to qubits that exist on the device. \n",
    "- Respects the connectivity of qubits on the device.\n",
    "\n",
    "Below is an example of a circuit that has the correct topology to be placed on the Willow-pink device, and how it is prepared to be run on the QVM."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "a_arTtfcwqrz"
   },
   "source": [
    "### Create a GHZ state builder circuit\n",
    "\n",
    "The generalized [Greenberger–Horne–Zeilinger (GHZ) state](https://en.wikipedia.org/wiki/Greenberger%E2%80%93Horne%E2%80%93Zeilinger_state){:.external} has the form $\\frac{|00..0⟩ + |11..1⟩}{\\sqrt{2}}$ and, in this case, will be constructed using 17 qubits, with a Hadamard and a sequence of CNOT gates:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-08-12T09:08:41.445079Z",
     "iopub.status.busy": "2025-08-12T09:08:41.444838Z",
     "iopub.status.idle": "2025-08-12T09:08:41.459897Z",
     "shell.execute_reply": "2025-08-12T09:08:41.459295Z"
    },
    "id": "mZFn6OmwwqaR"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0: ────H───@───────────────────────────────────────────────────────────────M('out')───\n",
      "           │                                                               │\n",
      "1: ────────X───@───────────────────────────────────────────────────────────M──────────\n",
      "               │                                                           │\n",
      "2: ────────────X───@───────────────────────────────────────────────────────M──────────\n",
      "                   │                                                       │\n",
      "3: ────────────────X───@───────────────────────────────────────────────────M──────────\n",
      "                       │                                                   │\n",
      "4: ────────────────────X───@───────────────────────────────────────────────M──────────\n",
      "                           │                                               │\n",
      "5: ────────────────────────X───@───────────────────────────────────────────M──────────\n",
      "                               │                                           │\n",
      "6: ────────────────────────────X───@───────────────────────────────────────M──────────\n",
      "                                   │                                       │\n",
      "7: ────────────────────────────────X───@───────────────────────────────────M──────────\n",
      "                                       │                                   │\n",
      "8: ────────────────────────────────────X───@───────────────────────────────M──────────\n",
      "                                           │                               │\n",
      "9: ────────────────────────────────────────X───@───────────────────────────M──────────\n",
      "                                               │                           │\n",
      "10: ───────────────────────────────────────────X───@───────────────────────M──────────\n",
      "                                                   │                       │\n",
      "11: ───────────────────────────────────────────────X───@───────────────────M──────────\n",
      "                                                       │                   │\n",
      "12: ───────────────────────────────────────────────────X───@───────────────M──────────\n",
      "                                                           │               │\n",
      "13: ───────────────────────────────────────────────────────X───@───────────M──────────\n",
      "                                                               │           │\n",
      "14: ───────────────────────────────────────────────────────────X───@───────M──────────\n",
      "                                                                   │       │\n",
      "15: ───────────────────────────────────────────────────────────────X───@───M──────────\n",
      "                                                                       │   │\n",
      "16: ───────────────────────────────────────────────────────────────────X───M──────────\n"
     ]
    }
   ],
   "source": [
    "# Define an abstract line of 17 qubits\n",
    "number_of_qubits = 17\n",
    "qubits = cirq.LineQubit.range(number_of_qubits)\n",
    "\n",
    "# Create a GHZ circuit on this qubit line\n",
    "ghz_circuit = cirq.Circuit(\n",
    "    cirq.H(qubits[0]),\n",
    "    *[cirq.CNOT(qubits[i - 1], qubits[i]) for i in range(1, number_of_qubits)],\n",
    "    cirq.measure(*qubits, key='out'),\n",
    ")\n",
    "print(ghz_circuit)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "tc5L80jjMknb"
   },
   "source": [
    "Notice that this circuit consists of a sequence of CNOT gates applied consecutively to a single chain of qubits. The connectivity required by the circuit is simple in the sense that it needs a line of qubits which are only connected to their adjacent neighbor in the sequence. As constructed, this consists of 17 `cirq.LineQubit`s indexed `0, 1, 2...16`. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "gmgGLI7eZLQt"
   },
   "source": [
    "### Transform the circuit \n",
    "\n",
    "Before executing a circuit on (virtual) quantum hardware, the operations in the circuit need to be translated to use the types of gates the device supports. The `cirq.optimize_for_target_gateset` function does this for you, transforming the operations to use the `cirq.CZTargetGateset`, which is supported by the Willow-pink processor that this QVM is based on. Learn more about the gate set constraints of Google hardware at the [Hardware](../hardware) page."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-08-12T09:08:41.462221Z",
     "iopub.status.busy": "2025-08-12T09:08:41.461991Z",
     "iopub.status.idle": "2025-08-12T09:08:41.636875Z",
     "shell.execute_reply": "2025-08-12T09:08:41.636263Z"
    },
    "id": "MqdssGOhY9-S"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0: ────PhXZ(a=0.5,x=-0.5,z=1)───@───PhXZ(a=0,x=0,z=1)───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M('out')───\n",
      "                                │                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               │\n",
      "1: ────PhXZ(a=0.5,x=0.5,z=0)────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                     │                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          │\n",
      "2: ─────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                          │                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     │\n",
      "3: ──────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                               │                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                │\n",
      "4: ───────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                                                                    │                                                                                                                                                                                                                                                                                                                                                                                                                                                           │\n",
      "5: ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                                                                                                         │                                                                                                                                                                                                                                                                                                                                                                                                                      │\n",
      "6: ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                                                                                                                                              │                                                                                                                                                                                                                                                                                                                                                                                 │\n",
      "7: ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                                                                                                                                                                                   │                                                                                                                                                                                                                                                                                                                                            │\n",
      "8: ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                                                                                                                                                                                                                        │                                                                                                                                                                                                                                                                                                       │\n",
      "9: ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                                                                                                                                                                                                                                                             │                                                                                                                                                                                                                                                                  │\n",
      "10: ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                                                                                                                                                                                                                                                                                                  │                                                                                                                                                                                                                             │\n",
      "11: ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                                                                                                                                                                                                                                                                                                                                       │                                                                                                                                                                                        │\n",
      "12: ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            │                                                                                                                                                   │\n",
      "13: ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)──────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 │                                                                                                              │\n",
      "14: ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)─────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      │                                                                         │\n",
      "15: ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)────────────────M──────────\n",
      "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           │                                    │\n",
      "16: ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───M──────────\n"
     ]
    }
   ],
   "source": [
    "# Convert the gates in the GHZ circuit to the \"CZ\" gateset, which the device uses.\n",
    "translated_ghz_circuit = cirq.optimize_for_target_gateset(\n",
    "    ghz_circuit, context=cirq.TransformerContext(deep=True), gateset=cirq.CZTargetGateset()\n",
    ")\n",
    "print(translated_ghz_circuit)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "JfFfiNkbDDQy"
   },
   "source": [
    "### Choose qubits on the virtual device\n",
    "\n",
    "Choose qubits on the device to execute your device ready circuit on. Look at the device map (as above) and choose a set of qubits that fit your circuit (eg a line or a block). The Willow-pink, Rainbow and Weber devices have different topologies, some qubit maps may be possible on only one of these devices. As noted, the GHZ example circuit as constructed will fit on a 17 qubit chain of adjacent qubits on the device, so you only need to find this consecutive line of qubits. See [Qubit Picking](../hardware/qubit_picking.ipynb) for more advice and methods for selecting qubits. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-08-12T09:08:41.639167Z",
     "iopub.status.busy": "2025-08-12T09:08:41.638946Z",
     "iopub.status.idle": "2025-08-12T09:08:41.643433Z",
     "shell.execute_reply": "2025-08-12T09:08:41.642877Z"
    },
    "id": "k4PsLLFnDGN-"
   },
   "outputs": [],
   "source": [
    "# Choose qubits on the virtual device\n",
    "device_qubit_chain = [\n",
    "    cirq.GridQubit(5, 6),\n",
    "    cirq.GridQubit(5, 7),\n",
    "    cirq.GridQubit(4, 7),\n",
    "    cirq.GridQubit(4, 6),\n",
    "    cirq.GridQubit(4, 5),\n",
    "    cirq.GridQubit(5, 5),\n",
    "    cirq.GridQubit(6, 5),\n",
    "    cirq.GridQubit(6, 6),\n",
    "    cirq.GridQubit(6, 7),\n",
    "    cirq.GridQubit(6, 8),\n",
    "    cirq.GridQubit(6, 9),\n",
    "    cirq.GridQubit(7, 9),\n",
    "    cirq.GridQubit(8, 9),\n",
    "    cirq.GridQubit(8, 8),\n",
    "    cirq.GridQubit(8, 7),\n",
    "    cirq.GridQubit(7, 7),\n",
    "    cirq.GridQubit(7, 8),\n",
    "]\n",
    "# Layout:\n",
    "#\n",
    "# q(4, 5)───q(4, 6)───q(4, 7)\n",
    "# │                   │\n",
    "# │                   │\n",
    "# q(5, 5)   q(5, 6)───q(5, 7)\n",
    "# │\n",
    "# │\n",
    "# q(6, 5)───q(6, 6)───q(6, 7)───q(6, 8)───q(6, 9)\n",
    "#                                         │\n",
    "#                                         │\n",
    "#                     q(7, 7)───q(7, 8)   q(7, 9)\n",
    "#                     │                   │\n",
    "#                     │                   │\n",
    "#                     q(8, 7)───q(8, 8)───q(8, 9)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "UD28ccnyrezn"
   },
   "source": [
    "### Map the transformed circuit to the qubits you chose on the device\n",
    "\n",
    "The transformed GHZ circuit still needs to be re-mapped to use the selected qubits. The `transform_qubits` function of `cirq.Circuit` does this automatically, returning a new transformed circuit when given a qubit mapping function. \n",
    "\n",
    "Because the connectivity qubit chain in the GHZ circuit example follows the sequence of `cirq.LineQubit`s in `qubits`, it suffices to zip the circuit's qubits together with the chosen device qubits, since both are connected chains of 17 qubits. The dictionary built from these paired qubits can then be turned into a simple lambda function for use with `transform_qubits`, as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-08-12T09:08:41.645432Z",
     "iopub.status.busy": "2025-08-12T09:08:41.645222Z",
     "iopub.status.idle": "2025-08-12T09:08:41.668146Z",
     "shell.execute_reply": "2025-08-12T09:08:41.667553Z"
    },
    "id": "znPgxQ81rjb3"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(4, 5): ──────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                                   │                                    │                                                                                                                                                                                                                                                                                                                                                                                                                                                           │\n",
      "(4, 6): ─────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                              │                                                                         │                                                                                                                                                                                                                                                                                                                                                                                                                                                           │\n",
      "(4, 7): ────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)─────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                         │                                                                                                              │                                                                                                                                                                                                                                                                                                                                                                                                                                                           │\n",
      "(5, 5): ─────────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                         │                                                                                                                                                   │                                                                                                                                                                                                                                                                                                                                                                                                                      │\n",
      "(5, 6): ───PhXZ(a=0.5,x=-0.5,z=1)───@───PhXZ(a=0,x=0,z=1)────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M('out')───\n",
      "                                    │                                    │                                                                                                                                                   │                                                                                                                                                                                                                                                                                                                                                                                                                      │\n",
      "(5, 7): ───PhXZ(a=0.5,x=0.5,z=0)────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                                                                                                             │                                                                                                                                                                                                                                                                                                                                                                                                                      │\n",
      "(6, 5): ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                                                                                                                                                  │                                                                                                                                                                                                                                                                                                                                                                                 │\n",
      "(6, 6): ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                                                                                                                                                                                       │                                                                                                                                                                                                                                                                                                                                            │\n",
      "(6, 7): ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                                                                                                                                                                                                                            │                                                                                                                                                                                                                                                                                                       │\n",
      "(6, 8): ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                                                                                                                                                                                                                                                                 │                                                                                                                                                                                                                                                                  │\n",
      "(6, 9): ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                                                                                                                                                                                                                                                                                                      │                                                                                                                                                                                                                             │\n",
      "(7, 7): ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)────────────────M──────────\n",
      "                                                                                                                                                                                                                                                                                                                                                                                                                      │                                                                                                                                                   │                                    │                                    │\n",
      "(7, 8): ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼───PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───M──────────\n",
      "                                                                                                                                                                                                                                                                                                                                                                                                                      │                                                                                                                                                   │                                                                         │\n",
      "(7, 9): ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)──────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                                                                                                                                                                                                                                                                                                                                           │                                                                                                              │                                                                         │\n",
      "(8, 7): ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)─────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                                                                                                                                                                                                                                                                                                                                           │                                                                         │                                                                                                              │\n",
      "(8, 8): ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼───PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)──────────────────────────────────────────────────────────────────────────────────────────M──────────\n",
      "                                                                                                                                                                                                                                                                                                                                                                                                                                                           │                                    │                                                                                                                                                   │\n",
      "(8, 9): ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────PhXZ(a=0.5,x=0.5,z=0)────────────@───PhXZ(a=-0.5,x=0.5,z=-8.88e-16)───@───PhXZ(a=0,x=0,z=1)───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────M──────────\n"
     ]
    }
   ],
   "source": [
    "# Map the line of circuit qubits to the chosen line of device qubits.\n",
    "qubit_map = dict(zip(qubits, device_qubit_chain))\n",
    "# Then replace qubits in the circuit according to that map.\n",
    "device_ready_ghz_circuit = translated_ghz_circuit.transform_qubits(lambda q: qubit_map[q])\n",
    "print(device_ready_ghz_circuit)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "dWYXJmyWqg3x"
   },
   "source": [
    "### **Running other circuits**\n",
    "\n",
    "In principle, you can run any custom [Circuit](../build/circuits.ipynb) with a quantum virtual machine, but realistically there are some constraints. As mentioned, the circuits need to be mappable to the device. Additionally, the number of qubits that are simulatable depends highly on the hardware available to you and how long you are able to run your simulation. As the QVM is instantiated as above, with a `qsimcirq.QSimSimulator`, it only uses the default, local [qsim](https://quantumai.google/qsim) simulator. However, qsim has plenty of support for being run in a [Google Cloud instance](/qsim/tutorials/gcp_before_you_begin){:.external}, with a variable amount of compute power. In order to get the most capacity possible for qsim, use [Multinode Simulation](/qsim/tutorials/multinode).\n",
    "\n",
    "For an example of building and running a much larger circuit, see the [QVM Stabilizer Example](./qvm_stabilizer_example.ipynb) tutorial. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Zxv0RtJuhaof"
   },
   "source": [
    "## **Execute** Your Circuit on the Quantum Virtual Machine\n",
    "\n",
    "You can run the now device-ready circuit, as you would with any other `cirq.Engine` instance, by getting a sampler from it and using the `run` function on the circuits. Your choice of `repetitions` is intrinsically related to the accuracy of your simulated results. We recommend 3000 repetitions for trial runs, and 10,000 repetitions for accuracy-critical runs, but you can stick to one to ten repetitions when testing a code pipeline. You can read more about this in [this paper](https://arxiv.org/abs/2111.02396){:.external}."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "cellView": "form",
    "execution": {
     "iopub.execute_input": "2025-08-12T09:08:41.670358Z",
     "iopub.status.busy": "2025-08-12T09:08:41.670135Z",
     "iopub.status.idle": "2025-08-12T09:08:54.311253Z",
     "shell.execute_reply": "2025-08-12T09:08:54.310569Z"
    },
    "id": "bFjnNSqRZsFu"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Circuit successfully executed on your quantum virtual machine willow_pink\n",
      "QVM runtime: 12.64s (3000 repetitions)\n",
      "You can now print or plot \"results\"\n"
     ]
    }
   ],
   "source": [
    "# @title Execute your device ready circuit on the Quantum Virtual Machine\n",
    "circuit = device_ready_ghz_circuit\n",
    "\n",
    "repetitions = 3000\n",
    "start = time.time()\n",
    "results = sim_engine.get_sampler(processor_id).run(circuit, repetitions=repetitions)\n",
    "elapsed = time.time() - start\n",
    "\n",
    "print('Circuit successfully executed on your quantum virtual machine', processor_id)\n",
    "print(f'QVM runtime: {elapsed:.04g}s ({repetitions} repetitions)')\n",
    "print('You can now print or plot \"results\"')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "na6nqbvviW7U"
   },
   "source": [
    "## **Visualize** Output\n",
    "\n",
    "Finally, you can use a [state histogram](./state_histograms.ipynb) to plot the measured results."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-08-12T09:08:54.313783Z",
     "iopub.status.busy": "2025-08-12T09:08:54.313535Z",
     "iopub.status.idle": "2025-08-12T09:08:54.686352Z",
     "shell.execute_reply": "2025-08-12T09:08:54.685560Z"
    },
    "id": "O92KP1EwZwV9"
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1sAAAFxCAYAAACFlLJ8AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAOf5JREFUeJzt3Xl8Duf+//H3HVlltSURQmJp0fqilAa1VIhSpTg92rRClVajDlrKTylVTastKcehPd/W0nJODz1Ul6N2WlQjFdSuR+1JbEnEElnm94dH5uuWILfeI4m8no/H/eh9X9c1M5+Zu/R+d2ausRmGYQgAAAAA4FQuxV0AAAAAANyNCFsAAAAAYAHCFgAAAABYgLAFAAAAABYgbAEAAACABQhbAAAAAGABwhYAAAAAWICwBQAAAAAWIGwBAAAAgAUIWwAAS9hsNk2YMKG4yyh1OG4AcPcgbAFAKTR37lzZbDbz5erqqmrVqqlfv346fvx4cZdXqE2bNmnChAlKS0sr8jJff/212rZtq8DAQJUvX161atXSk08+qeXLl5tjTpw4oQkTJigpKem2a/vuu+8sCTgTJkyQzWbT6dOnC+0PCwvTY4899oe3s3DhQsXHx//h9QAAnIuwBQCl2JtvvqnPPvtMs2fP1qOPPqrPP/9cbdu21eXLl4u7tAI2bdqkiRMnFjlsvf/++3r88cdls9k0ZswYTZs2Tb169dKBAwf0z3/+0xx34sQJTZw48Q+HrYkTJ9728s506dIlvf766w4tQ9gCgJLJtbgLAADcvkcffVTNmjWTJD3//POqXLmy3n33XS1btkxPPvlkMVd3+3JycjRp0iR17NhRK1asKNCfmppaDFXdGZ6ensVdgsMuXLggb2/v4i4DAEoczmwBwF3k4YcfliT99ttvdu179+5V7969VbFiRXl6eqpZs2ZatmyZ3Zjs7GxNnDhRdevWlaenpypVqqTWrVtr5cqV5ph27dqpXbt2Bbbbr18/hYWF3bCuCRMmaOTIkZKk8PBw8/LH33//vdDxp0+fVkZGhlq1alVof2BgoCRp3bp1evDBByVJ/fv3N9c7d+5cSdIPP/ygP/3pT6pRo4Y8PDwUGhqq4cOH69KlS3a1z5w5U5LsLs3Ml5eXp/j4eN13333y9PRUUFCQXnjhBZ07d+6G+/tHXH/P1vnz5zVs2DCFhYXJw8NDgYGB6tixo3755RdJV7+Tb7/9VocPHzZrv/a7SE1N1YABAxQUFCRPT081atRI8+bNK7DdM2fO6Nlnn5Wfn58CAgIUExOj7du32x1P6erx8vHx0W+//aYuXbrI19dX0dHRkop2vK9dx5EjR/TYY4/Jx8dH1apVM7+HnTt36pFHHpG3t7dq1qyphQsXOunoAsCdxZktALiL5IeXChUqmG27du1Sq1atVK1aNY0ePVre3t7617/+pR49eujLL7/UE088IelqIIqLi9Pzzz+v5s2bKyMjQ1u3btUvv/yijh07/qG6evbsqf379+sf//iHpk2bpsqVK0uSqlSpUuj4wMBAeXl56euvv9bLL7+sihUrFjqufv36evPNNzV+/HgNGjTIDJstW7aUJC1atEgXL17U4MGDValSJf3888+aMWOGjh07pkWLFkmSXnjhBZ04cUIrV67UZ599VmAbL7zwgubOnav+/ftr6NChOnTokP76179q27Zt2rhxo9zc3G65/2fPni20PS8v75bLvvjii1q8eLGGDBmiBg0a6MyZM/rxxx+1Z88ePfDAAxo7dqzS09N17NgxTZs2TZLk4+Mj6eolie3atdPBgwc1ZMgQhYeHa9GiRerXr5/S0tL0l7/8xayjW7du+vnnnzV48GDVq1dPX331lWJiYgqtKScnR1FRUWrdurXef/99lS9fXlLRjne+3NxcPfroo2rTpo2mTJmiBQsWaMiQIfL29tbYsWMVHR2tnj17avbs2erbt68iIiIUHh5+y+MFACWKAQAodebMmWNIMlatWmWcOnXKOHr0qLF48WKjSpUqhoeHh3H06FFzbIcOHYyGDRsaly9fNtvy8vKMli1bGnXr1jXbGjVqZHTt2vWm223btq3Rtm3bAu0xMTFGzZo17dokGW+88Yb5+b333jMkGYcOHSrSPo4fP96QZHh7exuPPvqoMXnyZCMxMbHAuISEBEOSMWfOnAJ9Fy9eLNAWFxdn2Gw24/Dhw2ZbbGysUdh/En/44QdDkrFgwQK79uXLlxfafr033njDkHTT1/XH/Prj5u/vb8TGxt50O127di1w/A3DMOLj4w1Jxueff262XblyxYiIiDB8fHyMjIwMwzAM48svvzQkGfHx8ea43Nxc45FHHilwbGNiYgxJxujRowtsr6jHO38db7/9ttl27tw5w8vLy7DZbMY///lP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xz/+oZ9//lnS1bNa8fHxev3119W9e3dJ0vz58xUUFKSlS5eqT58+2rNnj5YvX66EhAQ1a9ZMkjRjxgx16dJF77//vkJCQpxWLwAAAADkczhstWvXrkDbtc/acuY9Wy1bttTHH3+s/fv365577tH27dv1448/aurUqZKkQ4cOKTk52byPTJL8/f3VokULbd68WX369NHmzZsVEBBgBi3p6n1nLi4u2rJli5544okC283KylJWVpb5mYk/AAAAADjK4bB17tw5u8/Z2dnatm2bxo0bp8mTJzutMEkaPXq0MjIyVK9ePZUrV065ubmaPHmyoqOjJUnJycmSpKCgILvlgoKCzL7k5GQFBgba9bu6uqpixYrmmOvFxcVp4sSJTt0XAAAAAGWLw2HL39+/QFvHjh3l7u6uESNGKDEx0SmFSdK//vUvLViwQAsXLtR9992npKQkDRs2TCEhIYqJiXHadq43ZswYjRgxwvyckZGh0NBQy7YHAAAA4O7jcNi6kaCgIO3bt89Zq5MkjRw5UqNHj1afPn0kSQ0bNtThw4cVFxenmJgYBQcHS5JSUlJUtWpVc7mUlBQ1btxYkhQcHKzU1FS79ebk5Ojs2bPm8tfz8PCQh4eHU/cFAAAAQNnicNjasWOH3WfDMHTy5Em98847ZsBxlosXL8rFxX52+nLlyikvL0+SFB4eruDgYK1evdrcdkZGhrZs2aLBgwdLkiIiIpSWlqbExEQ1bdpUkrRmzRrl5eWpRYsWTq0XAAAAAPI5HLYaN24sm81m96wrSXrooYf06aefOq0wSerWrZsmT56sGjVq6L777tO2bds0depUPffcc5KuTswxbNgwvfXWW6pbt6459XtISIh69OghSapfv746d+6sgQMHavbs2crOztaQIUPUp08fZiIEAAAAYBmHw9ahQ4fsPru4uKhKlSrmM62cacaMGRo3bpxeeuklpaamKiQkRC+88ILGjx9vjhk1apQuXLigQYMGKS0tTa1bt9by5cvt6lmwYIGGDBmiDh06yMXFRb169dL06dOdXi8AAAAA5LMZ15+iQgEZGRny9/dXenq6/Pz8irscSVLY6G/N97+/07UYKwEAAACc79rfu1LJ+c3rSDZwuWnvDaxfv17dunVTnTp1VKdOHT3++OP64YcfbqtYAAAAALgbORy2Pv/8c0VGRqp8+fIaOnSohg4d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",
      "text/plain": [
       "<Figure size 1000x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ax = cirq.plot_state_histogram(results.histogram(key='out'))\n",
    "ax.get_xaxis().set_ticks([])\n",
    "plt.gcf().set_size_inches(10, 4)\n",
    "plt.show(ax)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "XOTvkKq_Z1UY"
   },
   "source": [
    "The leftmost and rightmost bars correspond to $|00..0\\rangle$ and $|11..1\\rangle$, respectively, which matches expectation for a GHZ state. Natural $|1\\rangle → |0\\rangle$ decay causes $|11..1\\rangle$ to be much less common than $|00..0\\rangle$, and other states also appear due to the various error mechanisms in the hardware that are mimicked by the simulated noise model. Learn more about these errors [here](https://arxiv.org/abs/2111.02396){:.external}.\n"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "collapsed_sections": [
    "Lfira0gPf0Gd"
   ],
   "name": "qvm_basic_example.ipynb",
   "toc_visible": true
  },
  "kernelspec": {
   "display_name": "Python 3",
   "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.11.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
