Skip to content

Commit

Permalink
Parameterized gates in encoding transform (#21)
Browse files Browse the repository at this point in the history
* refactor: encoding subroutines take EncodedRegister as single parameter rather than method specific regs

* feat: add parameterized delay to equivalence library, in notebook

* feat: notebook with parameterized delay gate
  • Loading branch information
evmckinney9 authored Jan 15, 2024
1 parent 096ddb6 commit a76ac9e
Show file tree
Hide file tree
Showing 6 changed files with 657 additions and 228 deletions.
130 changes: 105 additions & 25 deletions src/notebooks/noisy_simulation/dev_effectiveT1.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
"execution_count": 77,
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
Expand All @@ -29,7 +29,7 @@
},
{
"cell_type": "code",
"execution_count": 78,
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
Expand All @@ -55,7 +55,7 @@
},
{
"cell_type": "code",
"execution_count": 79,
"execution_count": 5,
"metadata": {},
"outputs": [
{
Expand All @@ -77,7 +77,7 @@
" [0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 1.+0.j]]"
]
},
"execution_count": 79,
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
Expand All @@ -95,38 +95,118 @@
},
{
"cell_type": "code",
"execution_count": 80,
"execution_count": 53,
"metadata": {},
"outputs": [
{
"ename": "ExtensionError",
"evalue": "'The size of the density matrix for the set state instruction must be equal to the number of qubits in the circuit (state.num_qubits (None) != QuantumCircuit.num_qubits (2)).'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mExtensionError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[53], line 12\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[38;5;66;03m# qc.delay(Parameter(\"t\"), 0)\u001b[39;00m\n\u001b[1;32m 8\u001b[0m \n\u001b[1;32m 9\u001b[0m \u001b[38;5;66;03m# initial_state is some mixed two-qutrit state\u001b[39;00m\n\u001b[1;32m 10\u001b[0m initial_state \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mkron(np\u001b[38;5;241m.\u001b[39meye(\u001b[38;5;241m3\u001b[39m), np\u001b[38;5;241m.\u001b[39meye(\u001b[38;5;241m3\u001b[39m))\n\u001b[0;32m---> 12\u001b[0m \u001b[43mqc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset_density_matrix\u001b[49m\u001b[43m(\u001b[49m\u001b[43minitial_state\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 13\u001b[0m qc\u001b[38;5;241m.\u001b[39mx(\u001b[38;5;241m0\u001b[39m)\n\u001b[1;32m 14\u001b[0m qc\u001b[38;5;241m.\u001b[39mappend(qutrit_iswap, [\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m1\u001b[39m])\n",
"File \u001b[0;32m~/quantum_logical/.venv/lib/python3.9/site-packages/qiskit_aer/library/set_instructions/set_density_matrix.py:70\u001b[0m, in \u001b[0;36mset_density_matrix\u001b[0;34m(self, state)\u001b[0m\n\u001b[1;32m 68\u001b[0m state \u001b[38;5;241m=\u001b[39m DensityMatrix(state)\n\u001b[1;32m 69\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m state\u001b[38;5;241m.\u001b[39mnum_qubits \u001b[38;5;129;01mor\u001b[39;00m state\u001b[38;5;241m.\u001b[39mnum_qubits \u001b[38;5;241m!=\u001b[39m \u001b[38;5;28mlen\u001b[39m(qubits):\n\u001b[0;32m---> 70\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ExtensionError(\n\u001b[1;32m 71\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThe size of the density matrix for the set state\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 72\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m instruction must be equal to the number of qubits\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 73\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m in the circuit (state.num_qubits (\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mstate\u001b[38;5;241m.\u001b[39mnum_qubits\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m)\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 74\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m != QuantumCircuit.num_qubits (\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mnum_qubits\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m)).\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 75\u001b[0m )\n\u001b[1;32m 76\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mappend(SetDensityMatrix(state), qubits)\n",
"\u001b[0;31mExtensionError\u001b[0m: 'The size of the density matrix for the set state instruction must be equal to the number of qubits in the circuit (state.num_qubits (None) != QuantumCircuit.num_qubits (2)).'"
]
}
],
"source": [
"from qiskit.providers.aer.library import SaveDensityMatrix\n",
"\n",
"num_qubits = 2\n",
"qc = QuantumCircuit(num_qubits)\n",
"qiskit_iswap = Operator(iswap.full(), input_dims=[3, 3], output_dims=[3, 3])\n",
"qutrit_iswap = QutritUnitary(qiskit_iswap, label=\"iswap_ge\")\n",
"# qc.delay(Parameter(\"t\"), 0)\n",
"\n",
"# initial_state is some mixed two-qutrit state\n",
"initial_state = np.kron(np.eye(3), np.eye(3))\n",
"\n",
"qc.set_density_matrix(initial_state)\n",
"qc.x(0)\n",
"qc.append(qutrit_iswap, [0, 1])\n",
"qc.append(SaveDensityMatrix(num_qubits, label=\"final_rho\"), range(num_qubits))\n",
"qc.draw()"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<pre style=\"word-wrap: normal;white-space: pre;background: #fff0;line-height: 1.1;font-family: &quot;Courier New&quot;,Courier,monospace\"> \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n",
"q_0: \u2524 Delay(t[dt]) \u251c\u25240 \u251c\n",
" \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2502 iswap_ge \u2502\n",
"q_1: \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25241 \u251c\n",
" \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518</pre>"
],
"text/plain": [
" \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n",
"q_0: \u2524 Delay(t[dt]) \u251c\u25240 \u251c\n",
" \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2502 iswap_ge \u2502\n",
"q_1: \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25241 \u251c\n",
" \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518"
"{'01|00': -1j}"
]
},
"execution_count": 80,
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"qc = QuantumCircuit(2)\n",
"qiskit_iswap = Operator(iswap.full(), input_dims=[3, 3], output_dims=[3, 3])\n",
"qutrit_iswap = QutritUnitary(qiskit_iswap, label=\"iswap_ge\")\n",
"qc.delay(Parameter(\"t\"), 0)\n",
"qc.append(qutrit_iswap, [0, 1])\n",
"qc.draw()"
"from qiskit import Aer\n",
"\n",
"# Transpile for simulator\n",
"sim_density = Aer.get_backend(\"aer_simulator_density_matrix\")\n",
"circ = transpile(qc, sim_density)\n",
"\n",
"job_density = sim_density.run(circ, shots=1000)\n",
"counts_density = job_density.result()\n",
"counts_density.data()[\"final_rho\"].to_dict()"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<qiskit_aer.jobs.aerjob.AerJob at 0x7fa3eff88ee0>"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from qiskit_aer.backends import QasmSimulator\n",
"from qiskit import Aer\n",
"\n",
"simulator = QasmSimulator(method=\"density_matrix\")\n",
"circ = transpile(qc, simulator)\n",
"result = simulator.run(circ)\n",
"result"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"ename": "QiskitError",
"evalue": "'No counts for experiment \"0\"'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mQiskitError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[25], line 4\u001b[0m\n\u001b[1;32m 2\u001b[0m sim_density \u001b[38;5;241m=\u001b[39m Aer\u001b[38;5;241m.\u001b[39mget_backend(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124maer_simulator_density_matrix\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 3\u001b[0m job_density \u001b[38;5;241m=\u001b[39m sim_density\u001b[38;5;241m.\u001b[39mrun(circ, shots\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1000\u001b[39m)\n\u001b[0;32m----> 4\u001b[0m counts_density \u001b[38;5;241m=\u001b[39m \u001b[43mjob_density\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mresult\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_counts\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m~/quantum_logical/.venv/lib/python3.9/site-packages/qiskit/result/result.py:289\u001b[0m, in \u001b[0;36mResult.get_counts\u001b[0;34m(self, experiment)\u001b[0m\n\u001b[1;32m 287\u001b[0m dict_list\u001b[38;5;241m.\u001b[39mappend(statevector\u001b[38;5;241m.\u001b[39mStatevector(vec)\u001b[38;5;241m.\u001b[39mprobabilities_dict(decimals\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m15\u001b[39m))\n\u001b[1;32m 288\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 289\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m QiskitError(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mNo counts for experiment \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mrepr\u001b[39m(key)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 291\u001b[0m \u001b[38;5;66;03m# Return first item of dict_list if size is 1\u001b[39;00m\n\u001b[1;32m 292\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(dict_list) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m:\n",
"\u001b[0;31mQiskitError\u001b[0m: 'No counts for experiment \"0\"'"
]
}
],
"source": [
"# Run and get counts\n",
"sim_density = Aer.get_backend(\"aer_simulator_density_matrix\")\n",
"job_density = sim_density.run(circ, shots=1000)\n",
"counts_density = job_density.result().get_counts(0)"
]
},
{
Expand Down Expand Up @@ -693,7 +773,7 @@
"source": [
"def projective_measurement(state, outcome):\n",
" \"\"\"\n",
" Perform a projective measurement on the ancilla qubit.\n",
" Perform a projective (can be partial) measurement on the ancilla qubit.\n",
"\n",
" Args:\n",
" state (Qobj): The density matrix of the quantum state.\n",
Expand Down
Loading

0 comments on commit a76ac9e

Please sign in to comment.