diff --git a/algorithms/differential_equations/hhl_lanchester/hhl_lanchester.ipynb b/algorithms/differential_equations/hhl_lanchester/hhl_lanchester.ipynb index 8797d6482..cc97cb906 100644 --- a/algorithms/differential_equations/hhl_lanchester/hhl_lanchester.ipynb +++ b/algorithms/differential_equations/hhl_lanchester/hhl_lanchester.ipynb @@ -615,10 +615,7 @@ "def main(indicator: Output[QBit], test: Output[QBit]) -> None:\n", "\n", " state = QArray()\n", - " # free(state)\n", - "\n", " compared_state = QArray()\n", - " # free(compared_state)\n", " rescaled_eig = QNum()\n", " allocate(QPE_RESOLUTION_SIZE, UNSIGNED, QPE_RESOLUTION_SIZE, rescaled_eig)\n", " prepare_amplitudes(b_list, 0, state)\n", @@ -661,10 +658,7 @@ "outputs": [], "source": [ "MAX_WIDTH_SWAP_TEST = 25\n", - "constraints = Constraints(\n", - " max_width=MAX_WIDTH_SWAP_TEST,\n", - " # optimization_parameter=OptimizationParameter.DEPTH,\n", - ")\n", + "constraints = Constraints(max_width=MAX_WIDTH_SWAP_TEST)\n", "preferences = Preferences(\n", " optimization_level=0, optimization_timeout_seconds=90, transpilation_option=\"none\"\n", ")\n", @@ -692,7 +686,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Quantum program link: https://platform.classiq.io/circuit/35jejQgpemeARnyckevOUff3PsD\n" + "Quantum program link: https://platform.classiq.io/circuit/35tN4TKVCACNL14VMInDJb2alDZ\n" ] } ], @@ -740,7 +734,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Fidelity between basic HHL and classical solutions: 0.9575437746802776\n" + "Fidelity between basic HHL and classical solutions: 0.9526849928765404\n" ] } ], @@ -794,7 +788,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Quantum program link: https://platform.classiq.io/circuit/35jewVJCfz6qFWnj4neZxImOmxh\n" + "Quantum program link: https://platform.classiq.io/circuit/35tNJgp5JBnQjy397u9i5ZqNFvs\n" ] } ], diff --git a/algorithms/differential_equations/hhl_lanchester/hhl_lanchester.synthesis_options.json b/algorithms/differential_equations/hhl_lanchester/hhl_lanchester.synthesis_options.json index 7790dc2a6..2ad26ab77 100644 --- a/algorithms/differential_equations/hhl_lanchester/hhl_lanchester.synthesis_options.json +++ b/algorithms/differential_equations/hhl_lanchester/hhl_lanchester.synthesis_options.json @@ -7,28 +7,28 @@ "preferences": { "custom_hardware_settings": { "basis_gates": [ - "ry", - "id", - "u1", "x", + "rz", + "cx", + "p", "s", + "u1", + "sxdg", "u", - "cz", - "h", + "rx", "tdg", - "rz", - "sdg", - "sxdg", + "r", "sx", - "cx", + "h", "z", - "rx", - "p", - "t", - "cy", + "cz", "u2", "y", - "r" + "sdg", + "id", + "cy", + "ry", + "t" ], "is_symmetric_connectivity": true }, @@ -38,7 +38,7 @@ "optimization_timeout_seconds": 90, "output_format": ["qasm"], "pretty_qasm": true, - "random_seed": 2019804740, + "random_seed": 3201343675, "synthesize_all_separately": false, "timeout_seconds": 300, "transpilation_option": "none" diff --git a/algorithms/hhl/hhl/hhl.ipynb b/algorithms/hhl/hhl/hhl.ipynb index 334f21638..b15d6dad0 100644 --- a/algorithms/hhl/hhl/hhl.ipynb +++ b/algorithms/hhl/hhl/hhl.ipynb @@ -13,36 +13,76 @@ "id": "1", "metadata": {}, "source": [ - "Solving linear equations appears in many research, engineering, and design fields. For example, many physical and financial models, from fluid dynamics to portfolio optimization, are described by partial differential equations, which are typically treated by numerical schemes, most of which are eventually transformed to a set of linear equations.\n", - "\n", - "The HHL algorithm [[1](#HHL)] is a quantum algorithm for solving a set of linear equations:\n", + "> **The HHL algorithm** [\\[1\\]](#HHL), named after Harrow, Hassidim and Lloyd, is a fundamental quantum algorithm designed to solve a set of linear equations:\n", "$$\n", "A\\vec{x} = \\vec{b},\n", "$$\n", - "represented by an $N\\times N$ matrix $A$ and a vector $\\vec{b}$ of size $N = 2^n$. The solution to the problem is designated by variable $\\vec{x}$. The HHL is one of the fundamental quantum algorithms that is expected to give an exponential speedup over its classical counterpart*.\n", + "where $A$ is an $N\\times N$ matrix, and $\\vec{x}$ and $\\vec{b}$ are vectors of size $N = 2^n$.\n", + " The algorithm prepares a quantum state $|x\\rangle$ that encodes the solution vector proportional to $A^{-1}\\vec{b}$, starting from the input state $\\vec{b}$. It achieves this by applying Quantum Phase Estimation (QPE) to extract the eigenvalues of $A$, then performing a controlled rotation that effectively inverts these eigenvalues. The resulting amplitudes represent the solution state, which can be used to estimate properties of $\\vec{x}$ efficiently for certain classes of matrices.\n", + ">\n", + "> The algorithm treats the problem in the following way:\n", + ">\n", + "> - **Input:** A Hermitian matrix $A$ of size $2^n\\times 2^n$, normalized vector $\\vec{b}$, $|\\vec{b}|=1$ and given precision $m$.\n", + "> - **Promise:** $A$ is Hermitian, sparse and well-conditioned. In addition, the eigenvalues of $A$ lie between $1/\\kappa$ and $1$, where $\\kappa$ is the [condition number](https://en.wikipedia.org/wiki/Condition_number) of $A$. The entries of vector $\\vec{b}$ can be loaded efficiently to a quantum state $|b\\rangle$.\n", + "> - **Output:** Solution vector encoded in the state $|x\\rangle = |A^{-1}b\\rangle = \\sum^{2^n-1}_{j=0} \\frac{\\beta_j}{\\tilde{\\lambda}_j} |u_j\\rangle_{\\text{mem}}$, where: $\\lambda_j$ are eigenphases of a unitary $U = e^{2\\pi i A}$, estimated up to $m$ binary digits and $\\beta_j$ are coefficients in expansion of initial state $|b\\rangle$ into linear combination of eigenvectors of $A$, such that $|b\\rangle = \\sum^{2^n-1}_{j=0}\\beta_j|u_j\\rangle_{\\text{mem}}$. The solution vector allows one to efficiently estimate $\\vec{x}^T M \\vec{x}$ for a Hermitian matrix $M$.\n", + ">\n", + "> **Complexity:** HHL can find a quantum representation of the solution in polylogarithmic time, with a runtime of roughly $$O(\\log N \\kappa^2/\\epsilon)~~,$$ where $N=2^n$, and $\\epsilon$ is the desired precision. In comparison, the best classical method requires polynomial time $O(\\kappa N)$ (or $O(\\sqrt{\\kappa} N)$ for positive definite matrices). Therefore, the quantum algorithm apparently represents an exponential speedup in problem size; however, this speedup depends on strong assumptions: $A$ must be sparse, well-conditioned, and efficiently simulatable. Specifically, $\\kappa$ and $1/\\epsilon$ should be $O(\\text{poly} \\log(N))$ (i.e., upper bounded by a polynomial expression with argument $\\log(N)$). Moreover, $|b\\rangle$ should be loaded efficiently, and our goal is either to only estimate observables like quantities of the form $\\vec{x}^T M \\vec{x}$, only sample $\\vec{x}$ or utilize $\\vec{x}$ for further matrix computations [6].\n", + ">\n", + "> ---\n", + ">\n", + "> **Keywords:** Fundamental quantum algorithm, Exponential speedup, Linear equation solver" + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "Solving linear equations appears in many research, engineering, and design fields. For example, many physical and financial models, from fluid dynamics to portfolio optimization, are described by partial differential equations, which are typically treated by numerical schemes, most of which are eventually transformed to a set of linear equations.\n", "\n", - "The algorithm estimates a quantum state $|x\\rangle = |A^{-1}b\\rangle$ from the initial quantum state $|b\\rangle$, corresponding to $N$-dimensional vector $\\vec{b}$. Estimation is done by inverting eigenvalues encoded in phases of eigenstates with use of Quantum Phase Estimation (QPE) and amplitude encoding.\n", + "For simplicity, the demo below treats a use case where the matrix $A$ has eigenvalues in the interval $(0,1)$ and $|\\vec{b}|=1$. Generalizations to other use cases, including the case where $|\\vec{b}|\\neq 1$ and $A$ is not a Hermitian matrix or not of size $2^n \\times 2^n$, are discussed at the end of this notebook. \n", "\n", - "The HHL algorithm treats the problem in the following way:\n", "\n", - "- **Input:** Hermitian matrix $A$ of size $2^n\\times 2^n$, normalized vector $\\vec{b}$, $|\\vec{b}|=1$ and given precision $m$.\n", - "- **Promise:** Solution vector encoded in the state $|x\\rangle = |A^{-1}b\\rangle = \\sum^{2^n-1}_{j=0} \\frac{\\beta_j}{\\tilde{\\lambda}_j} |u_j\\rangle_n$, where:\n", - " - $\\lambda_j$ are eigenphases of a unitary $U = e^{2\\pi i A}$, estimated up to $m$ binary digits and\n", - " - $\\beta_j$ are coefficients in expansion of initial state $|b\\rangle$ into linear combination of eigenvectors of $A$, such that $|b\\rangle = \\sum^{2^n-1}_{j=0}\\beta_j|u_j\\rangle_n$.\n", - "- **Output:** Approximate solution $\\vec{x}$.\n", + "The discussion begins with a concise overview of the algorithm, followed by its definition and implementation using Classiq’s built-in functions. We conclude by comparing the exact implementation of the algorithm with an approximate method, which is often more practical for real-world systems requiring extensive computational resources." + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "## Algorithm Steps" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "The algorithm is composed of five main steps:\n", + "1. Three quantum variables, coined here a \"memory\", \"estimator\" and indicator are initialized with $n$, $m$, and $1$ qubits respectively and the vector $\\vec{b}$ is encoded into the memory variable:\n", + " $$|0\\rangle_{\\text{mem}} |0\\rangle_{\\text{est}}|0\\rangle_{\\text{ind}} \\xrightarrow[]{{\\rm SP}} |b\\rangle_{\\text{mem}} |0\\rangle_{\\text{est}}|0\\rangle_{\\text{ind}}=\\sum_{j=0}^{2^n-1}\\beta_j| u_j \\rangle_{\\text{mem}}|0\\rangle_{\\text{est}}|0\\rangle_{\\text{ind}}~~,$$\n", + "where $\\beta_j$ are the coefficients of $\\vec{b}$ in the eigenbasis of $A$, and $|u_j\\rangle$ eigenstates of $U=\\exp(i 2\\pi A)$.\n", + "\n", + "2. Quantum Phase Estimation is applied to the initial state,\n", + " \n", + " $$\\xrightarrow[]{{\\rm QPE}} \\sum^{2^n-1}_{j=0}\\beta_j |u_j\\rangle_{\\text{mem}}|\\tilde{\\lambda}_j\\rangle_{\\text{est}} |0\\rangle_{\\text{ind}}~~,$$\n", + " where $\\tilde{\\lambda}_j$ are the $m$ bit approximations of the associated phases. This step can be achieved with roughly $O(\\kappa^2 s/\\epsilon)$ queries to $A$, where $s$ is the sparsity of $A$, i.e., each row of $A$ has at most $s$ non-zero entries. \n", "\n", - "More detailed description of the HHL algorithm is available in Technical Notes section, below.\n", + "3. Controlled rotations are applied to indicator bit $|0\\rangle_{\\text{ind}}$ with normalized constant $C = \\frac{1}{2^m}$,\n", "\n", - "For simplicity, the demo below treats a usecase where the matrix A has eigenvalues in the interval (0,1). Generalizations to other usecases, including the case where $|b|\\neq 1$ and A is not an Hermitian matrix of size $2^n \\times 2^n$, are discussed at the end of this demo.\n", + " $$\\xrightarrow[]{{\\rm \\lambda^{-1}}} \\sum^{2^n-1}_{j=0}{\\beta_j |u_j\\rangle_{\\text{mem}}|\\tilde{\\lambda}_j\\rangle_{\\text{est}} \\left(\\sqrt{1-\\frac{C^2}{\\tilde{\\lambda}^2_j}}|0\\rangle_{\\text{ind}} + \\frac{C}{\\tilde{\\lambda}_j}|1\\rangle_{\\text{ind}} \\right)}$$.\n", "\n", - "***\n", + "4. Eigenvalues $|\\tilde{\\lambda}_j\\rangle_{\\text{est}}$ are uncomputed with QPE$^\\dagger$,\n", "\n", - "\\* The exponential speedup is in the sparsity of the Hermitian matrix $A$ and its [condition number](https://en.wikipedia.org/wiki/Condition_number). When $\\kappa$ is the condition number of the Hermitian matrix $A$ and the eigenvalues of $A$ are in the interval $(\\frac{1}{\\kappa}, 1)$, the runtime of the HHL algorithm scales as $\\kappa^2 \\log(n) / \\epsilon$, where $\\epsilon$ is the additive error achieved in the output state $|x\\rangle$. The algorithm achieves exponential speedup when both $\\kappa$ and $1/\\epsilon$ are $\\text{poly} \\log(n)$ (i.e., upper bounded by a polynomial expression with argument $\\log(n)$) and the state $|b\\rangle$ is loaded efficiently.\n" + " $$\\xrightarrow[]{{\\rm QPE^\\dagger}} \\sum^{2^n-1}_{j=0}{\\beta_j |u_j\\rangle_{\\text{mem}}|0\\rangle_{\\text{est}} \\left(\\sqrt{1-\\frac{C^2}{\\tilde{\\lambda}^2_j}}|0\\rangle_{\\text{ind}} + \\frac{C}{\\tilde{\\lambda}_j}|1\\rangle_{\\text{ind}} \\right)}$$ $$=|\\text{garbage}\\rangle|0 \\rangle_{\\text{ind}} + \\sum^{2^n-1}_{j=0}\\frac{C}{\\tilde{\\lambda}_j}|b\\rangle_{\\text{mem}} |0\\rangle_{\\text{est}}|1\\rangle_{\\text{ind}} $$.\n", + "\n", + "5. Auxiliary bit value is measured: if $|1\\rangle_{\\text{ind}}$ is observed we obtain $$CA^{-1}|b\\rangle_{\\text{mem}}\\propto |x\\rangle ~~,$$ or otherwise repeat the algorithm." ] }, { "cell_type": "markdown", - "id": "2", + "id": "5", "metadata": {}, "source": [ "## Preliminaries" @@ -50,7 +90,7 @@ }, { "cell_type": "markdown", - "id": "3", + "id": "6", "metadata": {}, "source": [ "### Defining Matrix of a Specific Problem" @@ -59,7 +99,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "4", + "id": "7", "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -79,10 +119,10 @@ "b = [0.18257419 0.36514837 0.73029674 0.54772256]\n", "\n", "Eigenvalues:\n", - "0.00110001001110101110101000011 =~ 0.19230521285666352\n", - "0.01000000011111000101001111001011 =~ 0.2518970844513993\n", - "0.01111110111101001101011001011011 =~ 0.4959234212146714\n", - "0.10110000100110111001100111010101 =~ 0.6898742814772654\n" + "0.00110001001110101110101000011 =~ 0.19230521285666338\n", + "0.01000000011111000101001111001011 =~ 0.2518970844513992\n", + "0.01111110111101001101011001011011 =~ 0.4959234212146716\n", + "0.10110000100110111001100111010101 =~ 0.6898742814772653\n" ] } ], @@ -133,7 +173,7 @@ }, { "cell_type": "markdown", - "id": "5", + "id": "8", "metadata": {}, "source": [ "### Define Hamiltonian" @@ -141,19 +181,19 @@ }, { "cell_type": "markdown", - "id": "6", + "id": "9", "metadata": {}, "source": [ - "The unitary operator is essential for Quantum Phase Estimation (QPE) function code block and can be constructed directly from the Hamiltonian, representing given problem, defined by matrix $A$. Having the matrix or the Hamiltonian defined, the unitary operator can be created with the [`qpe_flexible`](https://github.com/Classiq/classiq-library/blob/main/functions/qmod_library_reference/classiq_open_library/qpe/qpe.ipynb) function by passing in the `unitary_with_power` argument a callable function that applies a unitary operation raised to a given power.\n", + "We next represent the Hamiltonian into the Pauli operators. This will allow evaluating $U=e^{i 2 \\pi A}$, which is utilized in the Quantum Phase Estimation (QPE) stage and consequently, in the associated classiq function code block. Having the matrix or the Hamiltonian defined, the unitary operator can be created with the [`qpe_flexible`](https://github.com/Classiq/classiq-library/blob/main/functions/qmod_library_reference/classiq_open_library/qpe/qpe.ipynb) function by passing in the `unitary_with_power` argument a callable function that applies a unitary operation raised to a given power.\n", "\n", "\n", - "The built-in function `matrix_to_pauli_operator` encodes the matrix $A$ into a sum of Pauli strings, which then allows to encode the unitary matrix $U=e^{iA}$ with a product formula (Suzuki-Trotter). The number of qubits is stored in the variable `n`. This is a classical pre-processing that can be done with different methods of decomposition, for example you can compare with method described in [[2](#PauliDecomposition)]." + "The built-in function `matrix_to_pauli_operator` encodes the matrix $A$ into a sum of Pauli strings, which then allows to encode the unitary matrix $U$ with a product formula (Suzuki-Trotter). This is a classical pre-processing that can be achieved by various decomposition methods, for example, you can compare with method described in [[2](#PauliDecomposition)]. The number of qubits is stored in the variable `n`." ] }, { "cell_type": "code", "execution_count": 2, - "id": "7", + "id": "10", "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -183,7 +223,7 @@ }, { "cell_type": "markdown", - "id": "8", + "id": "11", "metadata": {}, "source": [ "## How to Build the Algorithm with Classiq" @@ -191,7 +231,7 @@ }, { "cell_type": "markdown", - "id": "9", + "id": "12", "metadata": {}, "source": [ "### The Quantum Part" @@ -199,35 +239,33 @@ }, { "cell_type": "markdown", - "id": "10", + "id": "13", "metadata": {}, "source": [ - "#### Prepare Initial State for the Vector $\\vec{b}$\n", - "\n", - "The first step of the HHL algorithm is to load the elements of normalized RHS vector $\\vec{b}$, into a quantum register:\n", + "The first step of the HHL algorithm involves loading the elements of the normalized RHS vector $\\vec{b}$, into a quantum variable:\n", "$$\n", - "|0\\rangle_n \\xrightarrow[{\\rm SP}]{} \\sum^{2^n-1}_{i=0}b_i|i\\rangle_n,\n", + "|0\\rangle_{\\text{mem}} \\xrightarrow[{\\rm SP}]{} \\sum^{2^n-1}_{i=0}b_i|i\\rangle_{\\text{mem}}~~,\n", "$$\n", - "where $|i\\rangle$ are the states in computational basis.\n", + "where $|i\\rangle$ are the states in the computational basis.\n", "\n", - "Below, we define the quantum function `load_b` using the built-in function [`prepare_amplitudes`](https://github.com/Classiq/classiq-library/blob/main/functions/qmod_library_reference/qmod_core_library/prepare_state_and_amplitudes/prepare_state_and_amplitudes.ipynb). This function loads $2^n$ elements of the vector $\\vec{b}$ into the `amplitudes` parameter. When we use the `load_b` function, the amplitudes of the state in the output register `state` will correspond to the values of the vector $\\vec{b}$.\n" + "Below, we define the quantum function `load_b` using the built-in function [`prepare_amplitudes`](https://github.com/Classiq/classiq-library/blob/main/functions/qmod_library_reference/qmod_core_library/prepare_state_and_amplitudes/prepare_state_and_amplitudes.ipynb). This function loads the $2^n$ elements of `amplitudes`, which correspond to the entries of the vector $\\vec{b}$, into the amplitudes of the state in the output variable `memory`." ] }, { "cell_type": "code", "execution_count": 3, - "id": "11", + "id": "14", "metadata": {}, "outputs": [], "source": [ "@qfunc\n", - "def load_b(amplitudes: CArray[CReal], state: Output[QArray]) -> None:\n", - " prepare_amplitudes(amplitudes, 0.0, state)" + "def load_b(amplitudes: CArray[CReal], memory: Output[QArray]) -> None:\n", + " prepare_amplitudes(amplitudes, 0.0, memory)" ] }, { "cell_type": "markdown", - "id": "12", + "id": "15", "metadata": {}, "source": [ "#### Define HHL Quantum Function" @@ -235,34 +273,26 @@ }, { "cell_type": "markdown", - "id": "13", + "id": "16", "metadata": {}, "source": [ - "The `hhl` function performs matrix eigenvalue inversion using flexible quantum phase estimation [`qpe_flexible`](https://github.com/Classiq/classiq-library/blob/main/functions/qmod_library_reference/classiq_open_library/qpe/qpe.ipynb), with the use of the [`within_apply`](https://docs.classiq.io/latest/qmod-reference/language-reference/statements/within-apply/) construct and the [`assign_amplitude_table`](https://docs.classiq.io/latest/qmod-reference/api-reference/functions/open_library/amplitude_loading/#classiq.open_library.functions.amplitude_loading.assign_amplitude_table) function.\n", + "The `hhl` function performs steps 2-4 of the algorithm. Steps 2 and 4 of the algorithm are achieved by applying the [`within_apply`](https://docs.classiq.io/latest/qmod-reference/language-reference/statements/within-apply/) construct, where the `within` part corresponds to a flexible quantum phase estimation [`qpe_flexible`](https://github.com/Classiq/classiq-library/blob/main/functions/qmod_library_reference/classiq_open_library/qpe/qpe.ipynb). The `apply` involves the controlled rotations of step 3, which are performed with `assign_amplitude_table` function. The built in function `qpe_flexible` is given a function `unitary_with_power` which indicates how the powers $U^{2^k}$ are performed within the phase estimation procedure. In the following implementation, the powers are performed by Hamiltonian evolution, utilizing the `hamiltonian_evolution_with_power` function. \n", "\n", - "The `hhl` function returns normalized solution, by creating a state:\n", - "$$\n", - "\\sum^{2^n-1}_{j=0}{\\beta_j |\\tilde{\\lambda_j}\\rangle_m |u_j\\rangle_n \\left(\\sqrt{1-\\frac{C^2}{\\tilde{\\lambda}^2_j}}|0\\rangle_a + \\frac{C}{\\tilde{\\lambda}_j}|1\\rangle_a \\right)} = \\tilde{C} |{\\rm garbage}\\rangle|0\\rangle + C |A^{-1}b\\rangle|1\\rangle,\n", - "$$\n", - "\n", - "where $\\tilde{C}$ and $|{\\rm garbage}\\rangle$ are irrelevant quantities, as the solution is entangled with the `indicator` output qubit at state $|1\\rangle$. The state entangled with $|1\\rangle$ stores the solution to the specific problem (up to the normalization coefficient):\n", - "$$\n", - "\\sum^{2^n-1}_{j=0} \\frac{C}{\\lambda_j}\\beta_j \\vec{\\psi_j} = C|A^{-1}b\\rangle = C|x\\rangle.\n", - "$$\n", - "\n", - "The normalization coefficient $C = \\frac{1}{\\Vert A^{-1}\\vec{b}\\Vert}$ has to be chosen with $O(1/\\kappa)$, which ensures the amplitudes are normalized. However, here we can use the smallest eigenvalue approximation that the QPE can resolve $C = 1/2^{\\rm precision}$, because it lower bounds the minimum eigenvalue.\n", + "The normalization coefficient $C$ ensures the amplitudes are normalized.\n", + "Since eigenvalues of $A$ are normalized to be between $1/\\kappa$ and $1$, the eigenvalues of the inverse matrix are between $\\kappa =1/\\lambda_\\text{min}$ and $1$. However, the amplitudes cannot surpass unity; we therefore choose $C$ as a lower bound of the minimum eigenvalue $C = 1/2^{m}$. \n", "\n", "**Arguments:**\n", "- `unitary_with_power`: A callable function that applies a unitary operation raised to a power `k`.\n", - "- `precision`: An integer representing the precision of the phase estimation process (number of `phase` qubits).\n", - "- `state`: An array representing the initial quantum state $|b\\rangle$ on which the matrix inversion is to be performed.\n", - "- `indicator`: An auxiliary qubit that stores result of the inversion and indicates if the phase qubits returns normalized solution." + "- `precision`: An integer representing the precision of the phase estimation process, (number of `estimator` qubits $=m$).\n", + "- `memory`: An array representing the initial quantum state $|b\\rangle$ on which the matrix inversion is to be performed.\n", + "- `estimator`: Stores the estimation of the phase.\n", + "- `indicator`: An auxiliary qubit that stores the result of the inversion." ] }, { "cell_type": "code", "execution_count": 4, - "id": "14", + "id": "17", "metadata": {}, "outputs": [], "source": [ @@ -280,27 +310,29 @@ " rhs_vector: CArray[CReal],\n", " precision: int,\n", " hamiltonian_evolution_with_power: QCallable[CInt, QArray],\n", - " state: Output[QArray],\n", - " phase: Output[QNum],\n", + " memory: Output[QArray],\n", + " estimator: Output[QNum],\n", " indicator: Output[QBit],\n", "):\n", " # Allocate a quantum number for the phase with given precision\n", - " allocate(precision, UNSIGNED, precision, phase)\n", + " allocate(precision, UNSIGNED, precision, estimator)\n", "\n", " # Prepare initial state\n", - " load_b(amplitudes=amplitudes, state=state)\n", + " load_b(amplitudes=amplitudes, memory=memory)\n", "\n", " # Allocate indicator\n", " allocate(indicator)\n", " # Perform quantum phase estimation and eigenvalue inversion within a quantum operation\n", " within_apply(\n", " lambda: qpe_flexible(\n", - " unitary_with_power=lambda k: hamiltonian_evolution_with_power(k, state),\n", - " phase=phase,\n", + " unitary_with_power=lambda k: hamiltonian_evolution_with_power(k, memory),\n", + " phase=estimator,\n", " ),\n", " lambda: assign_amplitude_table(\n", - " lookup_table(lambda p: 0 if p == 0 else (1 / 2**phase.size) / p, phase),\n", - " phase,\n", + " lookup_table(\n", + " lambda p: 0 if p == 0 else (1 / 2**estimator.size) / p, estimator\n", + " ),\n", + " estimator,\n", " indicator,\n", " ),\n", " )" @@ -308,7 +340,7 @@ }, { "cell_type": "markdown", - "id": "15", + "id": "18", "metadata": {}, "source": [ "#### Set Execution Preferences\n", @@ -321,7 +353,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "16", + "id": "19", "metadata": {}, "outputs": [], "source": [ @@ -343,7 +375,7 @@ }, { "cell_type": "markdown", - "id": "17", + "id": "20", "metadata": {}, "source": [ "### The Classical Postprocess" @@ -351,44 +383,44 @@ }, { "cell_type": "markdown", - "id": "18", + "id": "21", "metadata": {}, "source": [ - "After running the circuit a given number of times and collecting measurement results from the ancillary and phase qubits we need to postprocess the data in order to find solution. Measurement values from circuit execution are denoted here by `res_hhl`." + "After running the circuit a given number of times and collecting measurement results from the indicator and phase qubits we need to postprocess the data in order to find solution. Measurement values from circuit execution are denoted here by `res_hhl`." ] }, { "cell_type": "markdown", - "id": "19", + "id": "22", "metadata": {}, "source": [ "#### Postselect Results\n", "\n", - "If all eigenvalues are $m$-estimated (are represented by $m$ binary digits), then eigenvalues uncomputation by inverse-QPE create the state:\n", + "If all eigenvalues are $m$-estimated (are represented by $m$ binary digits), then the uncomputation by inverse-QPE creates the state:\n", "\n", "$$\n", - "\\sum^{2^n-1}_{j=0}{\\beta_j |0\\rangle_m |u_j\\rangle_n \\left(\\sqrt{1-\\frac{C^2}{\\tilde{\\lambda}^2_j}}|0\\rangle_a + \\frac{C}{\\tilde{\\lambda}_j}|1\\rangle_a \\right)}\n", + "\\sum^{2^n-1}_{j=0}{\\beta_j |u_j\\rangle_{\\text{mem}} |0\\rangle_{\\text{est}} \\left(\\sqrt{1-\\frac{C^2}{\\tilde{\\lambda}^2_j}}|0\\rangle_\\text{ind} + \\frac{C}{\\tilde{\\lambda}_j}|1\\rangle_\\text{ind} \\right)}\n", "$$\n", "\n", - "If at least one eigenvalue is not $m$-estimated, then after performing QPE$^\\dagger$, the `phase` register is not reseted in $|0\\rangle_m$.\n", + "If there is an error in step 3 and at least one eigenvalue is not $n$-estimated, then after performing QPE$^\\dagger$, the `estimator` variable does not reset to $|0\\rangle_{\\text{est}}$. This will further reduce the success probability of \n", "\n", - "In general case, we postselect only states that return 1 on ancillary qubit in `indicator` register. In this tutorial, we will add another postselection condition on `phase` register, to return $|0\\rangle_m$, in order to increase accuracy of the solution result.\n", + "In the general case, we postselect only states that return $1$ for `indicator` variable. In this tutorial, we will add another postselection condition on `estimator` variable, to return $|0\\rangle_{\\text{est}}$, in order to increase the accuracy of the solution result.\n", "\n", "**Note:** Postselection can improve HHL algorithm results at the cost of more executions. In the future, when two-way quantum computing is utilized, postselection might be replaced by adjoint-state preparation, as envisioned by Jarek Duda [[4](#Duda)]." ] }, { "cell_type": "markdown", - "id": "20", + "id": "23", "metadata": {}, "source": [ - "The `quantum_solution` function defines a run over all the relevant strings holding the solution. The solution vector will be inserted into the variable `qsol`, after normalizing with $C=1/2^m$." + "The `quantum_solution` function defines a run over all the relevant strings holding the solution. The solution vector will be inserted into the variable `qsol`, after normalizing with $C=1/2^m$. After the calculation we divide by $C$ to obtain the elements of $\\vec{x}$." ] }, { "cell_type": "code", "execution_count": 6, - "id": "21", + "id": "24", "metadata": {}, "outputs": [], "source": [ @@ -399,7 +431,7 @@ "\n", " # Filter only the successful states.\n", " filtered_st = df[\n", - " (df.indicator == 1) & (df.phase_var == 0) & (np.abs(df.amplitude) > 1e-12)\n", + " (df.indicator == 1) & (df.estimator_var == 0) & (np.abs(df.amplitude) > 1e-12)\n", " ]\n", "\n", " # Allocate values\n", @@ -410,25 +442,26 @@ }, { "cell_type": "markdown", - "id": "22", + "id": "25", "metadata": {}, "source": [ "#### Compare Classical and Quantum Solutions\n", + "To compare between the quantum and classical solutions we first need to isolate the global phase of the quantum solution. Let the outcome state be $e^{i \\theta}| x \\rangle$, satisfying $A (e^{i \\theta} | x \\rangle) = e^{i\\theta} |b \\rangle$. We can isolate the phase by taking the scalar product of $A e^{i \\theta} | x \\rangle$ with $| b \\rangle $, i.e., $\\langle b| A e^{i\\theta}x\\rangle = e^{i\\theta}$. We then evaluate $\\theta$, rotate by the appropriate angle, and take the real part.\n", "\n", - "Note that the HHL algorithm returns a statevector result that includes an arbitrary global phase. The global phase can arise due to the transpilation process or from the intrinsic properties of the quantum functions themselves. Therefore, to compare with the classical solution, we need to correct the quantum results by the global phase (normalize). However, even after this normalization, there may still be a minus sign difference between the quantum and classical solutions, due to the inherent ambiguity of a global phase factor of $e^{i\\pi}=-1$. The sign difference does not affect the physical validity of the comparison, as both states $|x\\rangle$ and $-|x\\rangle$ are considered equivalent in terms of their measurement probabilities." + "Note that only observables of the form $\\langle x| M | x\\rangle$ (which are independent of the global phase) are accessible by a quantum experiment. The global phase is purely a numerical inconvenience which arises in the comparison the enteries classical solution with the quantum amplitudes and has no physical meaning in the implementation of the algorithm on actual hardware." ] }, { "cell_type": "code", "execution_count": 7, - "id": "23", + "id": "26", "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "\n", "\n", - "def quantum_solution_preprocessed(A, b, res_hhl, precision, disp=True):\n", + "def quantum_solution_normalization(A, b, res_hhl, precision, disp=True):\n", " # Classical solution\n", " sol_classical = np.linalg.solve(A, b)\n", " if disp:\n", @@ -437,26 +470,21 @@ " # Quantum solution with postselection\n", " size = len(b).bit_length() - 1\n", " qsol = quantum_solution(res_hhl, size, precision)\n", + "\n", " if disp:\n", " print(\"Quantum Solution: \", np.abs(qsol) / np.linalg.norm(qsol))\n", "\n", - " # Global phase from one element, e.g. qsol[0]\n", - " global_phase = np.angle(qsol[0])\n", - "\n", - " # Preprocessed quantum solution\n", - " qsol_corrected = np.real(qsol / np.exp(1j * global_phase))\n", - "\n", - " # Correct ambiguity in the sign\n", - " qsol_corrected = (\n", - " np.sign(qsol_corrected[0]) * np.sign(sol_classical[0]) * qsol_corrected\n", - " )\n", + " res = np.dot(A, qsol)\n", + " global_phase = np.angle(np.vdot(res, b))\n", + " # Correct global phase and taking the real part\n", + " qsol_corrected = np.real(np.exp(1j * global_phase) * qsol)\n", "\n", " return sol_classical, qsol_corrected\n", "\n", "\n", "def show_solutions(A, b, res_hhl, precision, check=True, disp=True):\n", " # Classical solution and preprocessed quantum solution\n", - " sol_classical, qsol_corrected = quantum_solution_preprocessed(\n", + " sol_classical, qsol_corrected = quantum_solution_normalization(\n", " A, b, res_hhl, QPE_SIZE, disp=disp\n", " )\n", "\n", @@ -491,7 +519,7 @@ }, { "cell_type": "markdown", - "id": "24", + "id": "27", "metadata": {}, "source": [ "In the upcoming sections, we will present two different examples of implementing Hamiltonian dynamics by defining the unitary operator using two methods: exact and approximated." @@ -499,18 +527,19 @@ }, { "cell_type": "markdown", - "id": "25", + "id": "28", "metadata": {}, "source": [ - "### Example: Exact Hamiltonian Evolution\n", + "### Example: Implementation of $U$ with exact Hamiltonian Simulation\n", "\n", - "While the implementation of exact Hamiltonian simulation provided here is not scalable for large systems due to the exponential growth in computational resources required, it serves as a valuable tool for debugging and studying small quantum systems." + "The phase estimation subroutine in the HHL algorithm involves a consecutive application of controlled powers of $U$ gates, i.e, conditional $C-U^{2^0}, C-U^{2^1},\\dots, C-U^{2^{m-1}}$. In the present section, we implement these gates exactly and later compare the results to an approximate evaluation of these gates.\n", + "While the implementation of exact Hamiltonian simulation provided here is not scalable for large systems due to the exponential growth in computational resources required, it serves as a valuable tool for debugging and studying small quantum systems. For sparse matrices, there is an efficient quantum algorithm for Hamiltonian simulation, see Ref. [7] and the technical notes section below." ] }, { "cell_type": "code", "execution_count": 8, - "id": "26", + "id": "29", "metadata": {}, "outputs": [], "source": [ @@ -531,7 +560,7 @@ "@qfunc\n", "def main(\n", " res: Output[QNum],\n", - " phase_var: Output[QNum],\n", + " estimator_var: Output[QNum],\n", " indicator: Output[QBit],\n", ") -> None:\n", " hhl(\n", @@ -543,8 +572,8 @@ " elements=scipy.linalg.expm(2 * np.pi * 1j * A).tolist(), target=target\n", " ),\n", " ),\n", - " state=res,\n", - " phase=phase_var,\n", + " memory=res,\n", + " estimator=estimator_var,\n", " indicator=indicator,\n", " )" ] @@ -552,7 +581,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "27", + "id": "30", "metadata": {}, "outputs": [], "source": [ @@ -563,7 +592,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "28", + "id": "31", "metadata": {}, "outputs": [], "source": [ @@ -575,7 +604,7 @@ }, { "cell_type": "markdown", - "id": "29", + "id": "32", "metadata": {}, "source": [ "#### Synthesizing the Model (exact)" @@ -584,7 +613,7 @@ { "cell_type": "code", "execution_count": 11, - "id": "30", + "id": "33", "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -596,8 +625,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "Quantum program link: https://platform.classiq.io/circuit/32patiJxeRjI1jvblnWUEspuEH9\n", - "Circuit depth = 464\n", + "Quantum program link: https://platform.classiq.io/circuit/35vSDcRN4RfMNWtbclscmVcfRre\n", + "Circuit depth = 457\n", "Circuit CX count = 286\n" ] } @@ -611,11 +640,16 @@ ] }, { + "attachments": { + "70e1642f-7684-4c35-82e7-81f3fecb9476.png": { + "image/png": "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" + } + }, "cell_type": "markdown", - "id": "31", + "id": "34", "metadata": {}, "source": [ - "![Screenshot 2025-06-20 at 22.34.35.png](attachment:38ce9d4a-b299-40e1-92fb-cb15babc46fc.png)\n", + "![image.png](attachment:70e1642f-7684-4c35-82e7-81f3fecb9476.png)\n", "
\n", "
Synthesized HHL circuit
\n", "
" @@ -623,7 +657,7 @@ }, { "cell_type": "markdown", - "id": "32", + "id": "35", "metadata": {}, "source": [ "#### Statevector Simulation (exact)\n", @@ -634,7 +668,7 @@ { "cell_type": "code", "execution_count": 12, - "id": "33", + "id": "36", "metadata": {}, "outputs": [], "source": [ @@ -645,7 +679,7 @@ }, { "cell_type": "markdown", - "id": "34", + "id": "37", "metadata": {}, "source": [ "#### Results (exact)" @@ -654,7 +688,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "35", + "id": "38", "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -676,7 +710,7 @@ }, { "data": { - "image/png": "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IAAAYDkEIAAAYDkEIAAAYDkEIAAAYDkEIAAAYDkEIAAAYDkEIAAAYDkEIAAAYDkEIAAAYDkEIAAAYDkEIAAAYDkEIAAAYDkEIAAAYDmmB6B169Zp5MiRSkxMlM1m09KlS8/bf8KECbLZbHWW7t27e/s89dRTddZfc801fj4SAAAQKkwPQJWVlerdu7fmzJnTqP6zZ89WWVmZdzl8+LDatm2r3/zmNz79unfv7tNvw4YN/igfAACEoMvMLmD48OEaPnx4o/s7HA45HA7v66VLl+q7777T73//e59+l112meLj4xu1z6qqKlVVVXlfu93uRtcDAABCj+kjQBfrtddeU0ZGhq666iqf9n379ikxMVGdOnXSXXfdpUOHDjW4j9zcXG+wcjgccjqd/i4bAACYKKQD0JdffqkPP/xQ99xzj097//79lZeXp+XLl2vu3LkqLS3V4MGDdeLEiXr3k5OTI5fL5V0OHz4ciPIBAIBJTL8EdjFef/11tWnTRllZWT7t515S69Wrl/r376+rrrpK//rXvzRx4sQ6+7Hb7bLb7f4uFwAABImQHQEyDEPz58/X3XffrYiIiPP2bdOmjbp27ar9+/cHqDoAABDMQjYAFRYWav/+/fWO6PzUyZMndeDAASUkJASgMgAAEOxMD0AnT55UcXGxiouLJUmlpaUqLi723rSck5OjcePG1dnutddeU//+/dWjR4866x555BEVFhbq4MGD2rhxo371q18pPDxcY8eO9euxAACA0GD6PUBbt27VkCFDvK+nTJkiSRo/frzy8vJUVlZW5xdcLpdLixYt0uzZs+vd55EjRzR27FgdO3ZM7du316BBg7Rp0ya1b9/efwcCAABChs0wDMPsIoKN2+2Ww+GQy+VSdHS02eUAAIBGaMr3t+mXwAAAAAKNAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACzH9AC0bt06jRw5UomJibLZbFq6dOl5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", + "image/png": "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", "text/plain": [ "
" ] @@ -692,7 +726,7 @@ }, { "cell_type": "markdown", - "id": "36", + "id": "39", "metadata": {}, "source": [ "### Example: Approximated Hamiltonian Evolution (Suzuki-Trotter)\n", @@ -702,18 +736,16 @@ }, { "cell_type": "markdown", - "id": "37", + "id": "40", "metadata": {}, "source": [ - "We will define the inner quantum call to be used within the flexible QPE: a Suzuki Trotter of order 1 [[3](#Trotter)], whose repetitions parameter grows by some constant factor proportional to the evolution coefficient.\n", - "\n", - "For the QPE we are going to use Classiq's `suzuki-trotter` function of order 1 for Hamiltonian evolution $e^{-i H t}$. This function is an approximated one, where its `repetitions` parameter controls its error. For a QPE algorithm with size $m$ a series of controlled-unitaries $U^{2^s}$ $0 \\leq s \\leq m-1$ are applied, for each of which we would like to pass a different `repetitions` parameter depth (to keep a roughly same error, the repetitions for approximating $U=e^{2\\pi i 2^s A }$ is expected to be $\\sim 2^s$ larger then the repetitions of $U=e^{2\\pi i A }$). In Classiq this can be done by working with a [`qpe_flexible`](https://github.com/Classiq/classiq-library/blob/main/functions/qmod_library_reference/classiq_open_library/qpe/qpe.ipynb), and passing a \"rule\" for how to exponentiate each step within the QPE in `repetitions` parameter." + "For the QPE we are going to use Classiq's `suzuki-trotter` function of order one for Hamiltonian evolution $e^{-i H t}$ [[3](#Trotter)]. This function is an approximated one, where its `repetitions` parameter controls its error. For a QPE algorithm with estimator size $m$ a series of controlled-unitaries $U^{2^k}$ with $0 \\leq k \\leq n-1$ are applied, for each of which we would like to pass a different `repetitions` parameter depth (to keep a roughly same error, the repetitions for approximating $U=e^{2\\pi i 2^k A }$ is expected to be $\\sim 2^k$ times the repetitions of $U=e^{2\\pi i A }$). In Classiq this can be done by working with a [`qpe_flexible`](https://github.com/Classiq/classiq-library/blob/main/functions/qmod_library_reference/classiq_open_library/qpe/qpe.ipynb), and passing a \"rule\" for how to exponentiate each step within the QPE in `repetitions` parameter." ] }, { "cell_type": "code", "execution_count": 14, - "id": "38", + "id": "41", "metadata": {}, "outputs": [], "source": [ @@ -739,16 +771,16 @@ }, { "cell_type": "markdown", - "id": "39", + "id": "42", "metadata": {}, "source": [ - "The values of the parameters `R0` and `REPS_SCALING_FACTOR` below were chosen by trial and error because they are Hamiltonian dependent. For other examples, one would need to use different values for these parameters, please compare with specific example in [Flexible QPE tutorial](https://github.com/Classiq/classiq-library/blob/main/tutorials/advanced_tutorials/high_level_modeling_flexible_qpe/high_level_modeling_flexible_qpe.ipynb). The relevant literature that discusses the errors of product formulas is available in [[5](#trotter-error)]." + "The parameters `R0` and `REPS_SCALING_FACTOR` dictate the number of repititions in the Suzuki-Trotter approximation. The specific number of repititions depend on the Hamiltonian, and therefore, were chosen by trial and error. For other examples, one would need to use different values for these parameters, please compare with specific example in [Flexible QPE tutorial](https://github.com/Classiq/classiq-library/blob/main/tutorials/advanced_tutorials/high_level_modeling_flexible_qpe/high_level_modeling_flexible_qpe.ipynb). The relevant literature that discusses the errors of product formulas is available in Ref. [[5](#trotter-error)]." ] }, { "cell_type": "code", "execution_count": 15, - "id": "40", + "id": "43", "metadata": {}, "outputs": [], "source": [ @@ -767,7 +799,7 @@ "@qfunc\n", "def main(\n", " res: Output[QNum],\n", - " phase_var: Output[QNum],\n", + " estimator_var: Output[QNum],\n", " indicator: Output[QBit],\n", ") -> None:\n", " hhl(\n", @@ -781,8 +813,8 @@ " reps_scaling_factor=REPS_SCALING_FACTOR,\n", " target=target,\n", " ),\n", - " state=res,\n", - " phase=phase_var,\n", + " memory=res,\n", + " estimator=estimator_var,\n", " indicator=indicator,\n", " )\n", "\n", @@ -794,7 +826,7 @@ { "cell_type": "code", "execution_count": 16, - "id": "41", + "id": "44", "metadata": {}, "outputs": [], "source": [ @@ -805,7 +837,7 @@ { "cell_type": "code", "execution_count": 17, - "id": "42", + "id": "45", "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -818,20 +850,20 @@ "name": "stdout", "output_type": "stream", "text": [ - "Quantum program link: https://platform.classiq.io/circuit/32pawCMXzhPwY3E2ZypsAQOjF4t\n", - "Circuit depth = 5066\n", - "Circuit CX count = 2964\n", + "Quantum program link: https://platform.classiq.io/circuit/35vSFlZ3c0Oml7By4DBR4TsgIdU\n", + "Circuit depth = 5069\n", + "Circuit CX count = 2966\n", "\n", "Classical Solution: [1.3814374 2.50585064 3.19890483 2.43147877]\n", "Quantum Solution: [0.28600641 0.5107414 0.64756839 0.48785114]\n", - "Corrected Quantum Solution: [1.4399586 2.54984965 3.2534983 2.43124679]\n", + "Corrected Quantum Solution: [1.43423072 2.56933184 3.25933604 2.45268588]\n", "\n", "Fidelity: 99.99 %\n" ] }, { "data": { - "image/png": "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AABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABsx9IAlJubq+uvv17R0dGKi4tTVlaWtm/f3uQ26enpcjgc9ZY777zT32fChAn11g8fPjzYuwMAANqIC6x88ZKSEmVnZ+v666/X999/r+nTp2vYsGH67LPP1LFjxwa3KSgo0MmTJ/2PDx8+rH79+ulnP/tZQL/hw4dr3rx5/sdOpzM4OwEAANocSwNQYWFhwOP8/HzFxcVp48aNuummmxrcpkuXLgGPFyxYoA4dOtQLQE6nUwkJCc2qo7q6WtXV1f7HXq+3WdsBAIC2KazmAHk8Hkn1Q05TXn/9dY0ZM6beiFFxcbHi4uKUmpqqBx98UIcPH270OXJzc+VyufyL2+0+ux0AAABtgsMYY6wuQpJqamp011136ciRI1qzZk2ztvn44481aNAgrV+/XgMHDvS3140KpaSkaNeuXZo+fbo6deqk0tJSRURE1HuehkaA3G63PB6PYmJizn3nAABA0Hm9XrlcrmZ9f1t6Cux02dnZ2rp1a7PDj1Q7+tOnT5+A8CNJY8aM8f93nz591LdvX1122WUqLi7WrbfeWu95nE4nc4QAALCRsDgFNmnSJC1dulRFRUVKTk5u1jZVVVVasGCBJk6c+IN9e/TooYsvvlg7d+4811IBAMB5wNIRIGOMHn74YS1evFjFxcVKSUlp9rbvvPOOqqur9Ytf/OIH++7bt0+HDx9WYmLiuZQLAADOE5aOAGVnZ+vNN9/U/PnzFR0drcrKSlVWVur48eP+PuPGjdO0adPqbfv6668rKytLF110UUD7sWPH9Oijj2rdunXavXu3VqxYoZEjR6pnz57KzMwM+j4BAIDwZ+kIUF5enqTaixuebt68eZowYYIkac+ePWrXLjCnbd++XWvWrNEHH3xQ7zkjIiK0efNm/dd//ZeOHDmipKQkDRs2TM8++yzzfAAAgKQw+hVYOGnJLHIAABAeWvL9HRaToAEAAEKJAAQAAGyHAAQAAGyHAAQAAGyHAAQAAGyHAAQAAGyHAAQAAGyHAAQAAGyHAAQAAGyH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l1JSUvTEE08oKSlJWVlZluwnAAAIL5YGoLy8PElSenp6QPu8efM0YcIESdKePXvUrt2/BqoGDx6s+fPn6/HHH9f06dPVq1cvLVmyJGDi9GOPPaaqqio98MADOnLkiG688UYVFhYqKioq6PsEAADCX1hdByhccB0gAADanjZ7HSAAAIBQIAABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbIQABAADbsTwArVq1SiNGjFBSUpIcDoeWLFnSZP8JEybI4XDUW3r37u3v8/TTT9dbf8UVVwR5TwAAQFtheQCqqqpSv379NGfOnGb1nz17tioqKvzL3r171aVLF/3sZz8L6Ne7d++AfmvWrAlG+QAAoA26wOoCbr/9dt1+++3N7u9yueRyufyPlyxZom+//Va//OUvA/pdcMEFSkhIaLU6AQDA+cPyEaBz9frrrysjI0PdunULaN+xY4eSkpLUo0cP3XPPPdqzZ0+jz1FdXS2v1xuwAACA81ebDkAHDhzQ+++/r/vuuy+gfdCgQcrPz1dhYaHy8vJUXl6uoUOH6ujRow0+T25urn9kyeVyye12h6J8AABgEYcxxlhdRB2Hw6HFixcrKyurWf1zc3P14osv6sCBA4qMjGy035EjR9StWze99NJLmjhxYr311dXVqq6u9j/2er1yu93yeDyKiYlp8X4AAIDQ83q9crlczfr+tnwO0NkyxuiNN97Qvffe22T4kaTOnTvr8ssv186dOxtc73Q65XQ6g1EmAAAIQ232FFhJSYl27tzZ4IjOmY4dO6Zdu3YpMTExBJUBAIBwZ3kAOnbsmMrKylRWViZJKi8vV1lZmX/S8rRp0zRu3Lh6273++usaNGiQrr766nrrHnnkEZWUlGj37t1au3atfvKTnygiIkJjx44N6r4AAIC2wfJTYBs2bNAtt9zifzxlyhRJ0vjx45Wfn6+Kiop6v+DyeDxatGiRZs+e3eBz7tu3T2PH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", + "image/png": "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", "text/plain": [ "
" ] @@ -857,20 +889,33 @@ }, { "cell_type": "markdown", - "id": "43", + "id": "46", "metadata": {}, "source": [ - "We explored the HHL algorithm for solving linear systems using exact and approximated Hamiltonian simulations. The exact method, with a smaller circuit depth, is computationally less intensive but lacks scalability. In contrast, the approximated method, with a greater circuit depth, offers flexibility and can handle larger, more complex systems. This trade-off highlights the importance of choosing the right method based on problem size and complexity." + "We explored the HHL algorithm for solving linear systems using exact and approximated Hamiltonian simulations. The exact method, with a smaller circuit depth, is computationally less intensive but lacks scalability. In contrast, the approximated method, with a greater circuit depth, offers flexibility and can handle larger, more complex systems. This trade-off underscores the importance of selecting the appropriate method based on the problem's size and complexity." ] }, { "cell_type": "markdown", - "id": "44", + "id": "47", + "metadata": {}, + "source": [ + "## Technical Notes\n", + "\n", + "- The condition on the sparsity of $A$ arises from the following result, Ref. [7]: If $A$ is a $2^n \\times 2^n$ Hermitian $s$-spase matrix then one can implement an Hamiltonian simulation, $e^{-iA t}$ up to error $\\epsilon$ in the spectral norm with $$O\\left( st||A||_{\\infty} + \\frac{1/\\epsilon}{\\log \\log (1/\\epsilon)}\\right) $$ queries to $A$ and a total number of gates which is larger by a factor of $n$. Here, the infinity norm corresponds to the largest entry of $A$.\n", + "- Before measurement we obtain the state $$ C|A^{-1}b\\rangle_{\\text{mem}} |0\\rangle_{\\text{est}}|1\\rangle_{\\text{ind}} +|\\text{garbage}\\rangle|0 \\rangle_{\\text{ind}}~~.$$ Naively, one would require of order $1/C=O(2^n)$ measurements to obtain a sample of the entries of $|x\\rangle$. However, utilizing quantum amplitude amplification one can obtain a quadratic speedup, sampling the state with an order of only $O(2^{n/2})$ measurements.\n", + "- We can replace the sparsity condition on $A$ by any restriction allowing efficient Hamiltonian simulation.\n", + "- The complexity of standard HHL algorithm is $O(\\log n \\kappa^2 s/\\epsilon)$. The factor $1/\\epsilon$ has been improved by Childs et al. in [[8](#Childs)] to $\\log(\\kappa/\\epsilon)$, and Ambainis introduced a generalization of amplitude amplification, which allows reducing the quadratic $\\kappa$ dependence to linear [[9](#Ambainis)].\n" + ] + }, + { + "cell_type": "markdown", + "id": "48", "metadata": {}, "source": [ - "## 4. Generalizations\n", + "### Generalizations\n", "\n", - "The usecase treated above is a canonical one, assuming the following properties:\n", + "The use case treated above is a canonical one, assuming the following properties:\n", "- The RHS vector $\\vec{b}$ is normalized.\n", "- The matrix $A$ is an Hermitian one.\n", "- The matrix $A$ is of size $2^n\\times 2^n $.\n", @@ -896,9 +941,9 @@ "\\vec{x}\n", "\\end{pmatrix}.\n", "$$\n", - "**Note:** This increases the number of qubits by 1.\n", + "**Note:** This requires only a single additional qubit.\n", "\n", - "3) Complete the matrix dimension to the closest $2^n$ with an identity matrix. The vector $\\vec{b}$ will be completed with zeros.\n", + "3) Complete the matrix dimension to the closest $2^n$ with an identity matrix and the vector $\\vec{b}$ will be completed with zeros.\n", "$$\n", "\\begin{pmatrix}\n", "A & 0 \\\\\n", @@ -912,82 +957,44 @@ "\\begin{pmatrix}\n", "\\vec{x} \\\\\n", "0\n", - "\\end{pmatrix}.\n", + "\\end{pmatrix}~~.\n", "$$\n", "\n", "4) If the eigenvalues of $A$ are in the range $[-w_{\\min},w_{\\max}]$ you can employ transformations to the exponentiated matrix that enters into the Hamiltonian simulation, and then undo them for extracting the results:\n", "$$\n", - "\\tilde{A}=(A+w_{\\min}I)\\left(1-\\frac{1}{2^{m}}\\right)\\frac{1}{w_{\\min}+w_{\\max}}.\n", + "\\tilde{A}=\\frac{A+w_{\\min}I}{w_{\\min}+w_{\\max}}~~.\n", "$$\n", "The eigenvalues of this matrix lie in the interval $[0,1)$, and are related to the eigenvalues of the original matrix via\n", "$$\n", - "\\lambda = (w_{\\min}+w_{\\max})\\tilde{\\lambda}\\left[1/\\left(1-\\frac{1}{2^{n_{m}}}\\right)\\right]-w_{\\min},\n", + "\\lambda = (w_{\\min}+w_{\\max})\\tilde{\\lambda}-w_{\\min},\n", "$$\n", - "with $\\tilde{\\lambda}$ being an eigenvalue of $\\tilde{A}$ resulting from the QPE algorithm. This relation between eigenvalues is then used for the expression inserted into the eigenvalue inversion, via the `AmplitudeLoading` function." - ] - }, - { - "cell_type": "markdown", - "id": "45", - "metadata": {}, - "source": [ - "## Technical Notes" + "with $\\tilde{\\lambda}$ being an eigenvalue of $\\tilde{A}$ resulting from the QPE algorithm. This relation between eigenvalues is utilized in the pre and post-processing of the results or directly in the amplitude loading procedure." ] }, { "cell_type": "markdown", - "id": "46", + "id": "49", "metadata": {}, "source": [ - "A brief summary of the the HHL algorithm:\n", - "\n", - "- **Preparation:** Unitary $U = e^{2\\pi i A}$ is constructed out of matrix $A$ for exact or approximated Hamiltonian simulation.\n", - "\n", - "- **Step 1:** Three registers are initialized of $m$, $n$ and 1 qubits respectively and vector $\\vec{b}$ is encoded into initial state:\n", - " $|0\\rangle_m |0\\rangle_n|0\\rangle_a \\xrightarrow[]{{\\rm SP}} |0\\rangle_m |b\\rangle_n|0\\rangle_a$.\n", - "\n", - "- **Step 2:** Quantum Phase Estimation (QPE) with controlled powers of unitary $U$ is applied to the initial state,\n", - " \n", - " $\\xrightarrow[]{{\\rm QPE}} \\sum^{2^n-1}_{j=0}\\beta_j |\\tilde{\\lambda}_j\\rangle_m |u_j\\rangle_n |0\\rangle_a$.\n", - "\n", - "- **Step 3:** Controlled rotations are applied to auxiliary bit $|0\\rangle_a$ with normalized constant $C = \\frac{1}{2^m}$,\n", - "\n", - " $\\xrightarrow[]{{\\rm \\lambda^{-1}}} \\sum^{2^n-1}_{j=0}{\\beta_j |\\tilde{\\lambda_j}\\rangle_m |u_j\\rangle_n \\left(\\sqrt{1-\\frac{C^2}{\\tilde{\\lambda}^2_j}}|0\\rangle_a + \\frac{C}{\\tilde{\\lambda}_j}|1\\rangle_a \\right)}$.\n", - "\n", - "- **Step 4:** Eigenvalues $|\\tilde{\\lambda_j}\\rangle_m$ are uncomputed with QPE$^\\dagger$,\n", - "\n", - " $\\xrightarrow[]{{\\rm QPE^\\dagger}} \\sum^{2^n-1}_{j=0}{\\beta_j |0\\rangle_m |u_j\\rangle_n \\left(\\sqrt{1-\\frac{C^2}{\\tilde{\\lambda}^2_j}}|0\\rangle_a + \\frac{C}{\\tilde{\\lambda}_j}|1\\rangle_a \\right)}$, if eigenvalues are $m$-estimated.\n", - "\n", - "- **Step 5:** Auxiliary bit value is observed and if:\n", + "## References\n", "\n", - " - $|0\\rangle_a$ is measured or\n", - " - $|0\\rangle_m$ is not measured,\n", - " \n", - " then return to step 0, otherwise observe the state $|x\\rangle = \\sum^{2^n-1}_{j=0} \\frac{\\beta_j}{\\tilde{\\lambda}_j} |u_j\\rangle_n = |A^{-1}b\\rangle$ and save measured results.\n", + "[1]: [Harrow, A. W., Hassidim, A., & Lloyd, S. (2009). Quantum algorithm for linear systems of equations. Physical review letters, 103(15), 150502](https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.103.150502).\n", "\n", - "- **Step 6:** Repeat steps 1-5 for a fixed number of times ($s$-shots).\n", + "[2]: [Hantzko, L., Binkowski, L., & Gupta, S. (2024). Tensorized Pauli decomposition algorithm. Physica Scripta, 99(8), 085128.](https://arxiv.org/abs/2310.13421).\n", "\n", - "- **Step 7:** Collect solution from statistical processing $x_s$\n", + "[3]: [Hatano, N., & Suzuki, M. (2005). Finding exponential product formulas of higher orders. In Quantum annealing and other optimization methods (pp. 37-68)](https://arxiv.org/abs/math-ph/0506007).\n", "\n", - "- **Step 8:** Post-process and calculate approximate solution $x = {\\rm Real} \\left(\\frac{x_s}{e^{i \\phi}}\\right)$, where $\\phi$ is global phase of $x_s$." - ] - }, - { - "cell_type": "markdown", - "id": "47", - "metadata": {}, - "source": [ - "## References\n", + "[4]: [Duda, J. (2023). Two-way quantum computers adding CPT analog of state preparation. arXiv preprint arXiv:2308.13522.](https://arxiv.org/abs/2308.13522).\n", "\n", - "[1]: [Harrow, A. W., Hassidim, A., & Lloyd, S., Quantum Algorithm for Linear Systems of Equations. Physical Review Letters 103, 150502 (2009)](https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.103.150502).\n", + "[5]: [Childs, A. M., Su, Y., Tran, M. C., Wiebe, N., & Zhu, S. (2021). Theory of trotter error with commutator scaling. Physical Review X, 11(1), 011020.](https://arxiv.org/abs/2308.13522).\n", "\n", - "[2]: [L. Hantzko, L. Binkowski, S. Gupta, Tensorized Pauli decomposition algorithm (2024)](https://arxiv.org/abs/2310.13421).\n", + "[6]: [Schuld, Maria, and Francesco Petruccione. (2018). Supervised learning with quantum computers. Quantum science and technology 17](https://link.springer.com/book/10.1007/978-3-319-96424-9)\n", "\n", - "[3]: [N. Hatano, M. Suzuki, Finding Exponential Product Formulas of Higher Orders (2005)](https://arxiv.org/abs/math-ph/0506007).\n", + "[7]: [Low, Guang Hao, and Isaac L. Chuang. (2017). Optimal Hamiltonian simulation by quantum signal processing. Physical review letters 118.1 010501.](https://arxiv.org/abs/1606.02685)\n", "\n", - "[4]: [J.Duda, \"Two-way quantum computers adding CPT analog of state preparation\" (2023)](https://arxiv.org/abs/2308.13522).\n", + "[8]: [Childs, A. M., Kothari, R., & Somma, R. D. (2017). Quantum algorithm for systems of linear equations with exponentially improved dependence on precision. SIAM Journal on Computing, 46(6), 1920-1950.](https://arxiv.org/abs/1511.02306)\n", "\n", - "[5]: [A. M. Childs, Y. Su, M. C. Tran, N. Wiebe, S. Zhu, \"Theory of Trotter Error with Commutator Scaling\" (2021)](https://arxiv.org/abs/2308.13522).\n" + "[9]: [Ambainis, A. (2010). Variable time amplitude amplification and a faster quantum algorithm for solving systems of linear equations.](https://arxiv.org/abs/1010.4458)" ] } ], @@ -1011,7 +1018,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.9" + "version": "3.11.7" } }, "nbformat": 4, diff --git a/algorithms/hhl/hhl/hhl_exact.qmod b/algorithms/hhl/hhl/hhl_exact.qmod index 6ace9057c..693c36729 100644 --- a/algorithms/hhl/hhl/hhl_exact.qmod +++ b/algorithms/hhl/hhl/hhl_exact.qmod @@ -1,5 +1,5 @@ -qfunc load_b_expanded___0(amplitudes: real[], output state: qbit[2]) { - prepare_amplitudes(amplitudes, 0.0, state); +qfunc load_b_expanded___0(amplitudes: real[], output memory: qbit[2]) { + prepare_amplitudes(amplitudes, 0.0, memory); } qfunc apply_to_all_expanded___0(target: qbit[4]) { @@ -12,35 +12,35 @@ qfunc hamiltonian_evolution_with_power_0_lambda___0_0_expanded___0(pw: int, targ power (pw) { unitary([ [ - ((-0.09406240950199844) + 0.8149069223122054j), - (0.03521871946675125 - 0.029763534641642615j), - ((-0.018800717000078303) - 0.16142879795007103j), + ((-0.09406240950199857) + 0.8149069223122054j), + (0.03521871946675126 - 0.029763534641642615j), + ((-0.018800717000078293) - 0.16142879795007106j), (0.43769245930764733 + 0.32705554908759304j) ], [ - (0.03521871946675126 - 0.029763534641642626j), - ((-0.15347248298890337) - 0.1727528247294824j), - (0.23117644455908545 + 0.8872069971297386j), - (0.2397182575488357 + 0.21548267921288922j) + (0.03521871946675127 - 0.029763534641642633j), + ((-0.15347248298890326) - 0.17275282472948233j), + (0.23117644455908531 + 0.8872069971297389j), + (0.23971825754883572 + 0.21548267921288933j) ], [ - ((-0.018800717000078272) - 0.16142879795007106j), - (0.23117644455908531 + 0.8872069971297386j), - ((-0.12191317205164587) + 0.1320013812642838j), - (0.2958406910149558 + 0.11488938733473114j) + ((-0.01880071700007826) - 0.16142879795007103j), + (0.23117644455908523 + 0.8872069971297386j), + ((-0.1219131720516462) + 0.13200138126428373j), + (0.29584069101495575 + 0.11488938733473114j) ], [ - (0.43769245930764744 + 0.3270555490875932j), - (0.23971825754883574 + 0.21548267921288933j), - (0.29584069101495586 + 0.11488938733473113j), - ((-0.6563827949579104) + 0.2569098899110467j) + (0.43769245930764744 + 0.32705554908759327j), + (0.2397182575488357 + 0.21548267921288933j), + (0.29584069101495586 + 0.1148893873347311j), + ((-0.6563827949579104) + 0.25690988991104674j) ] ], target); } } -qfunc unitary_with_power_0_lambda___0_0_expanded___0(k: int, state_captured__hhl__1: qbit[2]) { - hamiltonian_evolution_with_power_0_lambda___0_0_expanded___0(k, state_captured__hhl__1); +qfunc unitary_with_power_0_lambda___0_0_expanded___0(k: int, memory_captured__hhl__1: qbit[2]) { + hamiltonian_evolution_with_power_0_lambda___0_0_expanded___0(k, memory_captured__hhl__1); } qfunc qft_no_swap_expanded___0(qbv: qbit[4]) { @@ -59,11 +59,11 @@ qfunc qft_expanded___0(target: qbit[4]) { qft_no_swap_expanded___0(target); } -qfunc qpe_flexible_expanded___0(phase: qbit[4], state_captured__hhl__1: qbit[2]) { +qfunc qpe_flexible_expanded___0(phase: qbit[4], memory_captured__hhl__1: qbit[2]) { apply_to_all_expanded___0(phase); repeat (index: 4) { control (phase[index]) { - unitary_with_power_0_lambda___0_0_expanded___0(2 ** index, state_captured__hhl__1); + unitary_with_power_0_lambda___0_0_expanded___0(2 ** index, memory_captured__hhl__1); } } invert { @@ -138,27 +138,27 @@ qfunc assign_amplitude_table_expanded___0(index: qbit[4], indicator: qbit) { } } -qfunc hhl_expanded___0(rhs_vector: real[], output state: qbit[2], output phase: qnum<4, False, 4>, output indicator: qbit) { - allocate(4, False, 4, phase); +qfunc hhl_expanded___0(rhs_vector: real[], output memory: qbit[2], output estimator: qnum<4, False, 4>, output indicator: qbit) { + allocate(4, False, 4, estimator); load_b_expanded___0([ 0.18257418583505536, 0.3651483716701107, 0.7302967433402214, 0.5477225575051661 - ], state); + ], memory); allocate(1, indicator); within { - qpe_flexible_expanded___0(phase, state); + qpe_flexible_expanded___0(estimator, memory); } apply { - assign_amplitude_table_expanded___0(phase, indicator); + assign_amplitude_table_expanded___0(estimator, indicator); } } -qfunc main(output res: qnum<2, False, 0>, output phase_var: qnum<4, False, 4>, output indicator: qbit) { +qfunc main(output res: qnum<2, False, 0>, output estimator_var: qnum<4, False, 4>, output indicator: qbit) { hhl_expanded___0([ 0.18257418583505536, 0.3651483716701107, 0.7302967433402214, 0.5477225575051661 - ], res, phase_var, indicator); + ], res, estimator_var, indicator); } diff --git a/algorithms/hhl/hhl/hhl_exact.synthesis_options.json b/algorithms/hhl/hhl/hhl_exact.synthesis_options.json index 10c5a35b9..da3cefcf2 100644 --- a/algorithms/hhl/hhl/hhl_exact.synthesis_options.json +++ b/algorithms/hhl/hhl/hhl_exact.synthesis_options.json @@ -7,27 +7,27 @@ "custom_hardware_settings": { "basis_gates": [ "cz", + "t", + "rx", + "rz", "sxdg", + "cx", + "z", "s", + "id", "sdg", - "x", - "tdg", - "y", - "sx", - "cx", + "u", "cy", - "id", - "rx", - "ry", - "r", "p", "u2", - "rz", + "y", + "ry", + "x", + "r", + "sx", "u1", - "h", - "t", - "z", - "u" + "tdg", + "h" ], "is_symmetric_connectivity": true }, @@ -36,7 +36,7 @@ "optimization_level": 1, "output_format": ["qasm"], "pretty_qasm": true, - "random_seed": 514333184, + "random_seed": 979174742, "synthesize_all_separately": false, "timeout_seconds": 300, "transpilation_option": "auto optimize" diff --git a/algorithms/hhl/hhl/hhl_trotter.qmod b/algorithms/hhl/hhl/hhl_trotter.qmod index ddd14cd2a..d478d0bac 100644 --- a/algorithms/hhl/hhl/hhl_trotter.qmod +++ b/algorithms/hhl/hhl/hhl_trotter.qmod @@ -1,5 +1,5 @@ -qfunc load_b_expanded___0(amplitudes: real[], output state: qbit[2]) { - prepare_amplitudes(amplitudes, 0.0, state); +qfunc load_b_expanded___0(amplitudes: real[], output memory: qbit[2]) { + prepare_amplitudes(amplitudes, 0.0, memory); } qfunc apply_to_all_expanded___0(target: qbit[4]) { @@ -86,8 +86,8 @@ qfunc hamiltonian_evolution_with_power_0_lambda___0_0_expanded___0(pw: int, targ }, (-6.2831853072) * pw, 1, 4 * ceiling(1.8 ** log(pw, 2)), target); } -qfunc unitary_with_power_0_lambda___0_0_expanded___0(k: int, state_captured__hhl__1: qbit[2]) { - hamiltonian_evolution_with_power_0_lambda___0_0_expanded___0(k, state_captured__hhl__1); +qfunc unitary_with_power_0_lambda___0_0_expanded___0(k: int, memory_captured__hhl__1: qbit[2]) { + hamiltonian_evolution_with_power_0_lambda___0_0_expanded___0(k, memory_captured__hhl__1); } qfunc qft_no_swap_expanded___0(qbv: qbit[4]) { @@ -106,11 +106,11 @@ qfunc qft_expanded___0(target: qbit[4]) { qft_no_swap_expanded___0(target); } -qfunc qpe_flexible_expanded___0(phase: qbit[4], state_captured__hhl__1: qbit[2]) { +qfunc qpe_flexible_expanded___0(phase: qbit[4], memory_captured__hhl__1: qbit[2]) { apply_to_all_expanded___0(phase); repeat (index: 4) { control (phase[index]) { - unitary_with_power_0_lambda___0_0_expanded___0(2 ** index, state_captured__hhl__1); + unitary_with_power_0_lambda___0_0_expanded___0(2 ** index, memory_captured__hhl__1); } } invert { @@ -185,27 +185,27 @@ qfunc assign_amplitude_table_expanded___0(index: qbit[4], indicator: qbit) { } } -qfunc hhl_expanded___0(rhs_vector: real[], output state: qbit[2], output phase: qnum<4, False, 4>, output indicator: qbit) { - allocate(4, False, 4, phase); +qfunc hhl_expanded___0(rhs_vector: real[], output memory: qbit[2], output estimator: qnum<4, False, 4>, output indicator: qbit) { + allocate(4, False, 4, estimator); load_b_expanded___0([ 0.1825741858, 0.3651483717, 0.7302967433, 0.5477225575 - ], state); + ], memory); allocate(1, indicator); within { - qpe_flexible_expanded___0(phase, state); + qpe_flexible_expanded___0(estimator, memory); } apply { - assign_amplitude_table_expanded___0(phase, indicator); + assign_amplitude_table_expanded___0(estimator, indicator); } } -qfunc main(output res: qnum<2, False, 0>, output phase_var: qnum<4, False, 4>, output indicator: qbit) { +qfunc main(output res: qnum<2, False, 0>, output estimator_var: qnum<4, False, 4>, output indicator: qbit) { hhl_expanded___0([ 0.1825741858, 0.3651483717, 0.7302967433, 0.5477225575 - ], res, phase_var, indicator); + ], res, estimator_var, indicator); } diff --git a/algorithms/hhl/hhl/hhl_trotter.synthesis_options.json b/algorithms/hhl/hhl/hhl_trotter.synthesis_options.json index ebd505667..de3e9c466 100644 --- a/algorithms/hhl/hhl/hhl_trotter.synthesis_options.json +++ b/algorithms/hhl/hhl/hhl_trotter.synthesis_options.json @@ -7,27 +7,27 @@ "custom_hardware_settings": { "basis_gates": [ "cz", + "t", + "rx", + "rz", "sxdg", + "cx", + "z", "s", + "id", "sdg", - "x", - "tdg", - "y", - "sx", - "cx", + "u", "cy", - "id", - "rx", - "ry", - "r", "p", "u2", - "rz", + "y", + "ry", + "x", + "r", + "sx", "u1", - "h", - "t", - "z", - "u" + "tdg", + "h" ], "is_symmetric_connectivity": true }, @@ -36,7 +36,7 @@ "optimization_level": 1, "output_format": ["qasm"], "pretty_qasm": true, - "random_seed": 2764534899, + "random_seed": 351634037, "synthesize_all_separately": false, "timeout_seconds": 300, "transpilation_option": "auto optimize"