Skip to content

Commit

Permalink
HW3 reveiwed submission
Browse files Browse the repository at this point in the history
  • Loading branch information
NoahNzeki authored and Nadav138 committed Jun 13, 2024
1 parent 7fc063f commit 4592469
Showing 1 changed file with 317 additions and 0 deletions.
317 changes: 317 additions & 0 deletions community/QClass_2024/Submissions/HW3/Noah_Nzeki_William_HW3_VQE.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,317 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "fc72d98f-8993-4bd4-a545-23d122f3df71",
"metadata": {},
"source": [
"# H₂ Molecule Homework Assignment\n",
"### Quantum Software Development Journey: From Theory to Application with Classiq - Part 3\n",
"\n",
"- Similarly to what we have done in class, in this exercise we will implement the VQE on H2 molecule.\n",
"- This time instead of using the built-in methods and functions (such as `Molecule` and `MoleculeProblem`) to difne and solve the problem, you will be provided with a two qubits Hamiltonian."
]
},
{
"cell_type": "markdown",
"id": "56eda6d8-76c4-4862-b914-0c4598d67274",
"metadata": {},
"source": [
"## Submission\n",
"- Submit the completed Jupyter notebook and report via GitHub. Ensure all files are correctly named and organized.\n",
"- Use the Typeform link provided in the submission folder to confirm your submission.\n",
"\n",
"## Additional Resources\n",
"- [Classiq Documentation](https://docs.classiq.io/latest/)\n",
"- The notebook from live session #3\n",
"\n",
"## Important Dates\n",
"- **Assignment Release:** 22.5.2024\n",
"- **Submission Deadline:** 3.6.2024 (7 A.M GMT+3)\n",
"\n",
"---\n",
"\n",
"Happy coding and good luck!"
]
},
{
"cell_type": "markdown",
"id": "d41e969d-f6a7-4ff7-9660-19ce6c97ba6b",
"metadata": {},
"source": [
"### Part 1"
]
},
{
"cell_type": "markdown",
"id": "f710d6f4-d40b-42d5-b524-c6acb8059fe2",
"metadata": {},
"source": [
"Given the following Hamiltonian:"
]
},
{
"cell_type": "markdown",
"id": "6ba8a6f1-3259-4492-a1ca-3abde7530cd4",
"metadata": {},
"source": [
"$$\n",
"\\hat{H} = -1.0523 \\cdot (I \\otimes I) + 0.3979 \\cdot (I \\otimes Z) - 0.3979 \\cdot (Z \\otimes I) - 0.0112 \\cdot (Z \\otimes Z) + 0.1809 \\cdot (X \\otimes X)\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "736d275c-9a5a-4c08-b891-3078430dc6c1",
"metadata": {},
"source": [
"Complete the following code"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "19266c11-6acc-4edb-910f-2d0dfe80a6c8",
"metadata": {},
"outputs": [],
"source": [
"from typing import List\n",
"from classiq import *\n",
"\n",
"HAMILTONIAN = QConstant(\"HAMILTONIAN\", List[PauliTerm], #[...]) #TODO: Complete Hamiltonian\n",
" [ \n",
" PauliTerm([Pauli.I, Pauli.I], -1.0523),\n",
" PauliTerm([Pauli.I, Pauli.Z], 0.3979),\n",
" PauliTerm([Pauli.Z, Pauli.I], -0.3979),\n",
" PauliTerm([Pauli.Z, Pauli.Z], -0.0112),\n",
" PauliTerm([Pauli.X, Pauli.X], 0.1809)])\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "0bb68899-2076-45c0-8868-131f38aa3b78",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Opening: https://platform.classiq.io/circuit/53712c40-3bc3-46d5-a5a4-fe4b3a2aa001?version=0.42.0\n"
]
}
],
"source": [
"@qfunc\n",
"def main(q: Output[QArray[QBit]], angles: CArray[CReal, 3]) -> None:\n",
" # TODO: Create an ansatz which allows each qubit to have arbitrary rotation\n",
" \n",
" allocate(2, q) \n",
" U(angles[0], angles[1], angles[2], 0, q[0]) \n",
" U(angles[0], angles[1], angles[2], 0, q[1]) \n",
"\n",
"@cfunc\n",
"def cmain() -> None:\n",
" res = vqe(\n",
" HAMILTONIAN, #.TODO: complete the missing argument\n",
" False,\n",
" [],\n",
" optimizer=Optimizer.COBYLA,\n",
" max_iteration=1000,\n",
" tolerance=0.001,\n",
" step_size=0,\n",
" skip_compute_variance=False,\n",
" alpha_cvar=1.0,\n",
" )\n",
" save({\"result\": res})\n",
"\n",
"qmod = create_model(main, classical_execution_function=cmain) #TODO: complete the line, use classical_execution_function\n",
"qprog = synthesize(qmod)\n",
"show(qprog)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "0563c1a8-7aec-4da9-9105-6b16c5c24382",
"metadata": {},
"outputs": [],
"source": [
"execution = execute(qprog)\n",
"res = execution.result()\n",
"#execution.open_in_ide()\n",
"vqe_result = res[0].value #TODO: complete the line"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "de17cfc0-8e64-4493-b4c2-4a97fc9797a0",
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Optimal energy: -1.06419619140625\n",
"Optimal parameters: {'angles_0': 6.111236674714585, 'angles_1': -0.887265255532695, 'angles_2': 3.112766526311032}\n",
"Eigenstate: {'01': (0.09110862335695782+0j), '10': (0.09110862335695782+0j), '00': (0.9916644782889019+0j)}\n"
]
}
],
"source": [
"print(f\"Optimal energy: {vqe_result.energy}\")\n",
"print(f\"Optimal parameters: {vqe_result.optimal_parameters}\")\n",
"print(f\"Eigenstate: {vqe_result.eigenstate}\")"
]
},
{
"cell_type": "markdown",
"id": "5df11dfc-3e3a-4191-bd47-d522ca3dcbfa",
"metadata": {},
"source": [
"Does it similar to the `optimal energy` we calculated in class? \\\n",
"Does it similar to the `total energy` we calculated in class?"
]
},
{
"cell_type": "markdown",
"id": "4f0e0bea-b12f-43ad-94e8-100fedf2b57f",
"metadata": {},
"source": [
"### Part 2"
]
},
{
"cell_type": "markdown",
"id": "66882248-de08-4a6e-b33c-647f015f7d79",
"metadata": {},
"source": [
"**Now, we want to have a more interesting ansatz in our `main`.** \n",
"Add **one** line of code to the `main` function you created in Part 1 that creates **entanglement** between the two qubits. \n",
"Which gate should you use?"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "bb39be9e-4994-44e5-84d8-c99bc8b77145",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Opening: https://platform.classiq.io/circuit/1d523274-b861-41f3-9ad1-62c8d76927de?version=0.42.0\n"
]
}
],
"source": [
"@qfunc\n",
"def main(q: Output[QArray[QBit]], angles: CArray[CReal, 3]) -> None:\n",
" # TODO: Create an ansatz which allows each qubit to have arbitrary rotation\n",
" \n",
" allocate(2, q) \n",
" U(angles[0], angles[1], angles[2], 0, q[0]) \n",
" U(angles[0], angles[1], angles[2], 0, q[1]) \n",
" CX(q[1],q[0])\n",
"\n",
"@cfunc\n",
"def cmain() -> None:\n",
" res = vqe(\n",
" HAMILTONIAN, # TODO: complete the missing argument\n",
" False,\n",
" [],\n",
" optimizer=Optimizer.COBYLA,\n",
" max_iteration=1000,\n",
" tolerance=0.001,\n",
" step_size=0,\n",
" skip_compute_variance=False,\n",
" alpha_cvar=1.0,\n",
" )\n",
" save({\"result\": res})\n",
"\n",
"qmod = create_model(main, classical_execution_function=cmain) #TODO: complete the line, use classical_execution_function\n",
"qprog = synthesize(qmod)\n",
"show(qprog)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "112a1590-283c-4f79-8035-72936561102d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Opening in existing browser session.\n",
"Opening in existing browser session.\n"
]
}
],
"source": [
"execution = execute(qprog)\n",
"res = execution.result()\n",
"# execution.open_in_ide()\n",
"vqe_result = res[0].value #TODO: complete the line"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "06500e4c-a04b-4cfa-a84d-41f96a0c68eb",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Optimal energy: -1.311106640625\n",
"Optimal parameters: {'angles_0': 5.243383358664046, 'angles_1': -0.362281429584872, 'angles_2': -3.9155584047002607}\n",
"Eigenstate: {'01': (0.4215855488510013+0j), '11': (0.4250459533979826+0j), '10': (0.2548360379734389+0j), '00': (0.7593814300139292+0j)}\n"
]
}
],
"source": [
"print(f\"Optimal energy: {vqe_result.energy}\")\n",
"print(f\"Optimal parameters: {vqe_result.optimal_parameters}\")\n",
"print(f\"Eigenstate: {vqe_result.eigenstate}\")"
]
},
{
"cell_type": "markdown",
"id": "30a635d7-2f15-4c94-a94b-f4270f17aed8",
"metadata": {},
"source": [
"Does it similar to the `optimal energy` we calculated in class? \\\n",
"Does it similar to the `total energy` we calculated in class? \\\n",
"What can we learn about the provided form this result Hamiltonian?"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

0 comments on commit 4592469

Please sign in to comment.