| { |
| "cells": [ |
| { |
| "cell_type": "markdown", |
| "metadata": {}, |
| "source": [ |
| "<a href=\"https://colab.research.google.com/github/apache/mahout/blob/main/examples/Optimization_Example.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": null, |
| "metadata": { |
| "colab": { |
| "base_uri": "https://localhost:8080/" |
| }, |
| "id": "lNDTZhztd2dp", |
| "outputId": "ea3b9e41-43a8-44e7-9daf-e62e71d93143" |
| }, |
| "outputs": [], |
| "source": [ |
| "# pip install git+https://github.com/apache/mahout.git@main" |
| ] |
| }, |
| { |
| "cell_type": "markdown", |
| "metadata": {}, |
| "source": [ |
| "# Quantum Circuit Parameterization and Optimization\n", |
| "\n", |
| "In this notebook, we'll explore how to create parameterized quantum circuits using the QuMat framework. This feature allows us to bind values to parameters at execution time, paving the way for optimization tasks in quantum computing.\n", |
| "\n", |
| "## Overview\n", |
| "\n", |
| "1. **Parameter Handling**: We will use symbols to represent parameters in quantum gates, allowing these parameters to be updated during optimization.\n", |
| "2. **Circuit Execution with Binding**: We will bind parameter values to a circuit prior to its execution, a critical step in parameter optimization routines.\n", |
| "3. **Simple Optimization Loop**: We'll implement a basic optimization loop that updates parameters based on a cost function.\n" |
| ] |
| }, |
| { |
| "cell_type": "markdown", |
| "metadata": {}, |
| "source": [ |
| "## Step 1: Setting Up\n", |
| "\n", |
| "We start by setting up the backend configuration and initializing the QuMat framework. This framework interfaces with quantum computing libraries like Qiskit or Cirq to manage the underlying quantum computations.\n" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 1, |
| "metadata": {}, |
| "outputs": [], |
| "source": [ |
| "from qumat.qumat import QuMat\n", |
| "\n", |
| "# Configure the backend to use Qiskit with a simulator\n", |
| "backend_config = {\n", |
| " \"backend_name\": \"qiskit\",\n", |
| " \"backend_options\": {\"simulator_type\": \"qasm_simulator\", \"shots\": 1024},\n", |
| "}\n", |
| "\n", |
| "# Create an instance of QuMat\n", |
| "qumat_instance = QuMat(backend_config)" |
| ] |
| }, |
| { |
| "cell_type": "markdown", |
| "metadata": {}, |
| "source": [ |
| "## Step 2: Creating a Parameterized Quantum Circuit\n", |
| "\n", |
| "We create a simple quantum circuit with one qubit and apply parameterized RX, RY, and RZ gates. The parameters will be defined symbolically, allowing them to be replaced with actual values during execution.\n" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 2, |
| "metadata": {}, |
| "outputs": [], |
| "source": [ |
| "# Create a quantum circuit with 1 qubit\n", |
| "qumat_instance.create_empty_circuit(1)\n", |
| "\n", |
| "# Apply parameterized RX, RY, and RZ gates\n", |
| "qumat_instance.apply_rx_gate(0, \"theta\")\n", |
| "qumat_instance.apply_ry_gate(0, \"phi\")\n", |
| "qumat_instance.apply_rz_gate(0, \"lambda\")" |
| ] |
| }, |
| { |
| "cell_type": "markdown", |
| "metadata": {}, |
| "source": [ |
| "## Understanding the Rotation Angles\n", |
| "\n", |
| "In quantum computing, rotation gates are parameterized by angles that determine the amount of rotation applied to a qubit's state. Here's what each angle represents:\n", |
| "\n", |
| "- **`theta`**: The rotation angle for the RX gate (rotation around the X-axis of the Bloch sphere). This angle is measured in radians and determines how much the qubit rotates in the X direction.\n", |
| "\n", |
| "- **`phi`**: The rotation angle for the RY gate (rotation around the Y-axis of the Bloch sphere). Like theta, it's measured in radians and controls rotation in the Y direction.\n", |
| "\n", |
| "- **`lambda`**: The rotation angle for the RZ gate (rotation around the Z-axis of the Bloch sphere). This parameter controls phase rotation along the Z-axis.\n", |
| "\n", |
| "All angles are in radians, where a full rotation corresponds to 2π radians. These parameters will be optimized to find the quantum state that minimizes our cost function." |
| ] |
| }, |
| { |
| "cell_type": "markdown", |
| "metadata": {}, |
| "source": [ |
| "## Step 3: Running the Optimization Loop\n", |
| "\n", |
| "We'll iterate over a simple optimization loop, updating the parameter values for each iteration. This example does not feature a sophisticated cost function, but in practical scenarios, you'd compute and leverage a cost function to guide these updates.\n" |
| ] |
| }, |
| { |
| "cell_type": "code", |
| "execution_count": 3, |
| "metadata": {}, |
| "outputs": [], |
| "source": [ |
| "# Example optimization loop\n", |
| "\n", |
| "# Initial parameter values\n", |
| "current_parameters = {\"theta\": 0, \"phi\": 0, \"lambda\": 0}\n", |
| "\n", |
| "\n", |
| "# Define a simple placeholder cost function\n", |
| "def your_cost_function():\n", |
| " # Placeholder: replace with a real function in actual applications\n", |
| " return 0\n", |
| "\n", |
| "\n", |
| "# Run the optimization loop\n", |
| "for iteration in range(10): # Reduced iteration count for brevity\n", |
| " cost = your_cost_function() # Evaluate the cost function\n", |
| "\n", |
| " # Update parameter(s) based on some optimization logic\n", |
| " # This is a placeholder update mechanism\n", |
| " current_parameters[\"theta\"] += 0.1\n", |
| " current_parameters[\"phi\"] += 0.1\n", |
| " current_parameters[\"lambda\"] += 0.1\n", |
| "\n", |
| " # Execute the circuit with the updated parameters\n", |
| " result = qumat_instance.execute_circuit(parameter_values=current_parameters)\n", |
| "\n", |
| " print(f\"Iteration {iteration}, Result: {result}, Parameters: {current_parameters}\")" |
| ] |
| }, |
| { |
| "cell_type": "markdown", |
| "metadata": {}, |
| "source": [ |
| "## Conclusion\n", |
| "\n", |
| "This notebook demonstrates how to effectively handle parameters within quantum circuits using the QuMat framework. Although the optimization loop here uses a placeholder mechanism, it highlights how parameterized circuits can be used in iterative optimization processes, often encountered in variational quantum algorithms.\n" |
| ] |
| } |
| ], |
| "metadata": { |
| "kernelspec": { |
| "display_name": "Python 3", |
| "language": "python", |
| "name": "python3" |
| } |
| }, |
| "nbformat": 4, |
| "nbformat_minor": 2 |
| } |