|
25 | 25 | "\n",
|
26 | 26 | "from qiskit import BasicAer\n",
|
27 | 27 | "\n",
|
28 |
| - "from qiskit.aqua import Operator, set_qiskit_aqua_logging, QuantumInstance\n", |
| 28 | + "from qiskit.aqua import set_qiskit_aqua_logging, QuantumInstance\n", |
| 29 | + "from qiskit.aqua.operators import Z2Symmetries, WeightedPauliOperator\n", |
29 | 30 | "from qiskit.aqua.algorithms.adaptive import VQE\n",
|
30 | 31 | "from qiskit.aqua.algorithms.classical import ExactEigensolver\n",
|
31 | 32 | "from qiskit.aqua.components.optimizers import COBYLA\n",
|
|
40 | 41 | },
|
41 | 42 | {
|
42 | 43 | "cell_type": "code",
|
43 |
| - "execution_count": 3, |
| 44 | + "execution_count": 2, |
44 | 45 | "metadata": {},
|
45 | 46 | "outputs": [],
|
46 | 47 | "source": [
|
|
52 | 53 | },
|
53 | 54 | {
|
54 | 55 | "cell_type": "code",
|
55 |
| - "execution_count": 4, |
| 56 | + "execution_count": 3, |
56 | 57 | "metadata": {},
|
57 | 58 | "outputs": [
|
58 | 59 | {
|
|
82 | 83 | },
|
83 | 84 | {
|
84 | 85 | "cell_type": "code",
|
85 |
| - "execution_count": 5, |
| 86 | + "execution_count": 4, |
86 | 87 | "metadata": {},
|
87 | 88 | "outputs": [
|
88 | 89 | {
|
|
96 | 97 | "IIIIIIXI\n",
|
97 | 98 | "IIIIIXII\n",
|
98 | 99 | "cliffords found:\n",
|
99 |
| - "ZIZIZIZI\t0.7071067811865475\n", |
100 |
| - "IIIIIIXI\t0.7071067811865475\n", |
| 100 | + "ZIZIZIZI\t(0.7071067811865475+0j)\n", |
| 101 | + "IIIIIIXI\t(0.7071067811865475+0j)\n", |
101 | 102 | "\n",
|
102 |
| - "ZZIIZZII\t0.7071067811865475\n", |
103 |
| - "IIIIIXII\t0.7071067811865475\n", |
| 103 | + "ZZIIZZII\t(0.7071067811865475+0j)\n", |
| 104 | + "IIIIIXII\t(0.7071067811865475+0j)\n", |
104 | 105 | "\n",
|
105 | 106 | "single-qubit list: [1, 2]\n"
|
106 | 107 | ]
|
107 | 108 | }
|
108 | 109 | ],
|
109 | 110 | "source": [
|
110 |
| - "[symmetries, sq_paulis, cliffords, sq_list] = qubit_op.find_Z2_symmetries()\n", |
| 111 | + "z2_symmetries = Z2Symmetries.find_Z2_symmetries(qubit_op)\n", |
111 | 112 | "print('Z2 symmetries found:')\n",
|
112 |
| - "for symm in symmetries:\n", |
| 113 | + "for symm in z2_symmetries.symmetries:\n", |
113 | 114 | " print(symm.to_label())\n",
|
114 | 115 | "print('single qubit operators found:')\n",
|
115 |
| - "for sq in sq_paulis:\n", |
| 116 | + "for sq in z2_symmetries.sq_paulis:\n", |
116 | 117 | " print(sq.to_label())\n",
|
117 | 118 | "print('cliffords found:')\n",
|
118 |
| - "for clifford in cliffords:\n", |
119 |
| - " print(clifford.print_operators())\n", |
120 |
| - "print('single-qubit list: {}'.format(sq_list))" |
| 119 | + "for clifford in z2_symmetries.cliffords:\n", |
| 120 | + " print(clifford.print_details())\n", |
| 121 | + "print('single-qubit list: {}'.format(z2_symmetries.sq_list))" |
121 | 122 | ]
|
122 | 123 | },
|
123 | 124 | {
|
|
129 | 130 | },
|
130 | 131 | {
|
131 | 132 | "cell_type": "code",
|
132 |
| - "execution_count": 6, |
| 133 | + "execution_count": 5, |
133 | 134 | "metadata": {},
|
134 | 135 | "outputs": [
|
135 | 136 | {
|
|
144 | 145 | }
|
145 | 146 | ],
|
146 | 147 | "source": [
|
147 |
| - "tapered_ops = []\n", |
148 |
| - "for coeff in itertools.product([1, -1], repeat=len(sq_list)):\n", |
149 |
| - " tapered_op = Operator.qubit_tapering(qubit_op, cliffords, sq_list, list(coeff))\n", |
150 |
| - " tapered_ops.append((list(coeff), tapered_op))\n", |
| 148 | + "tapered_ops = z2_symmetries.taper(qubit_op)\n", |
| 149 | + "for tapered_op in tapered_ops:\n", |
151 | 150 | " print(\"Number of qubits of tapered qubit operator: {}\".format(tapered_op.num_qubits))"
|
152 | 151 | ]
|
153 | 152 | },
|
|
160 | 159 | },
|
161 | 160 | {
|
162 | 161 | "cell_type": "code",
|
163 |
| - "execution_count": 7, |
| 162 | + "execution_count": 6, |
164 | 163 | "metadata": {
|
165 | 164 | "scrolled": true
|
166 | 165 | },
|
|
196 | 195 | },
|
197 | 196 | {
|
198 | 197 | "cell_type": "code",
|
199 |
| - "execution_count": 8, |
| 198 | + "execution_count": 7, |
200 | 199 | "metadata": {},
|
201 | 200 | "outputs": [
|
202 | 201 | {
|
|
215 | 214 | "smallest_eig_value = 99999999999999\n",
|
216 | 215 | "smallest_idx = -1\n",
|
217 | 216 | "for idx in range(len(tapered_ops)):\n",
|
218 |
| - " ee = ExactEigensolver(tapered_ops[idx][1], k=1)\n", |
| 217 | + " ee = ExactEigensolver(tapered_ops[idx], k=1)\n", |
219 | 218 | " curr_value = ee.run()['energy']\n",
|
220 | 219 | " if curr_value < smallest_eig_value:\n",
|
221 | 220 | " smallest_eig_value = curr_value\n",
|
222 | 221 | " smallest_idx = idx\n",
|
223 | 222 | " print(\"Lowest eigenvalue of the {}-th tapered operator (computed part) is {:.12f}\".format(idx, curr_value))\n",
|
224 | 223 | " \n",
|
225 |
| - "the_tapered_op = tapered_ops[smallest_idx][1]\n", |
226 |
| - "the_coeff = tapered_ops[smallest_idx][0]\n", |
| 224 | + "the_tapered_op = tapered_ops[smallest_idx]\n", |
| 225 | + "the_coeff = tapered_ops[smallest_idx].z2_symmetries.tapering_values\n", |
227 | 226 | "print(\"The {}-th tapered operator matches original ground state energy, with corresponding symmetry sector of {}\".format(smallest_idx, the_coeff))"
|
228 | 227 | ]
|
229 | 228 | },
|
|
237 | 236 | },
|
238 | 237 | {
|
239 | 238 | "cell_type": "code",
|
240 |
| - "execution_count": 9, |
| 239 | + "execution_count": 8, |
241 | 240 | "metadata": {},
|
242 | 241 | "outputs": [],
|
243 | 242 | "source": [
|
244 | 243 | "# setup initial state\n",
|
245 | 244 | "init_state = HartreeFock(num_qubits=the_tapered_op.num_qubits, num_orbitals=core._molecule_info['num_orbitals'],\n",
|
246 | 245 | " qubit_mapping=core._qubit_mapping, two_qubit_reduction=core._two_qubit_reduction,\n",
|
247 |
| - " num_particles=core._molecule_info['num_particles'], sq_list=sq_list)\n", |
| 246 | + " num_particles=core._molecule_info['num_particles'], sq_list=the_tapered_op.z2_symmetries.sq_list)\n", |
248 | 247 | "\n",
|
249 | 248 | "# setup variationl form\n",
|
250 | 249 | "var_form = UCCSD(num_qubits=the_tapered_op.num_qubits, depth=1,\n",
|
251 | 250 | " num_orbitals=core._molecule_info['num_orbitals'], \n",
|
252 | 251 | " num_particles=core._molecule_info['num_particles'],\n",
|
253 | 252 | " active_occupied=None, active_unoccupied=None, initial_state=init_state,\n",
|
254 | 253 | " qubit_mapping=core._qubit_mapping, two_qubit_reduction=core._two_qubit_reduction, \n",
|
255 |
| - " num_time_slices=1,\n", |
256 |
| - " cliffords=cliffords, sq_list=sq_list, tapering_values=the_coeff, symmetries=symmetries)\n", |
| 254 | + " num_time_slices=1, z2_symmetries=the_tapered_op.z2_symmetries)\n", |
257 | 255 | "\n",
|
258 | 256 | "# setup optimizer\n",
|
259 | 257 | "optimizer = COBYLA(maxiter=1000)\n",
|
260 | 258 | "\n",
|
261 | 259 | "# set vqe\n",
|
262 |
| - "algo = VQE(the_tapered_op, var_form, optimizer, 'matrix')\n", |
| 260 | + "algo = VQE(the_tapered_op, var_form, optimizer)\n", |
263 | 261 | "\n",
|
264 | 262 | "# setup backend\n",
|
265 | 263 | "backend = BasicAer.get_backend('statevector_simulator')\n",
|
|
268 | 266 | },
|
269 | 267 | {
|
270 | 268 | "cell_type": "code",
|
271 |
| - "execution_count": 10, |
| 269 | + "execution_count": 9, |
272 | 270 | "metadata": {},
|
273 | 271 | "outputs": [],
|
274 | 272 | "source": [
|
|
277 | 275 | },
|
278 | 276 | {
|
279 | 277 | "cell_type": "code",
|
280 |
| - "execution_count": 11, |
| 278 | + "execution_count": 10, |
281 | 279 | "metadata": {},
|
282 | 280 | "outputs": [
|
283 | 281 | {
|
|
286 | 284 | "text": [
|
287 | 285 | "=== GROUND STATE ENERGY ===\n",
|
288 | 286 | " \n",
|
289 |
| - "* Electronic ground state energy (Hartree): -8.874303856889\n", |
290 |
| - " - computed part: -1.078084288118\n", |
| 287 | + "* Electronic ground state energy (Hartree): -8.874303841496\n", |
| 288 | + " - computed part: -1.078084272725\n", |
291 | 289 | " - frozen energy part: -7.796219568771\n",
|
292 | 290 | " - particle hole part: 0.0\n",
|
293 | 291 | "~ Nuclear repulsion energy (Hartree): 0.992207270475\n",
|
294 |
| - "> Total ground state energy (Hartree): -7.882096586414\n", |
| 292 | + "> Total ground state energy (Hartree): -7.882096571021\n", |
295 | 293 | "The parameters for UCCSD are:\n",
|
296 |
| - "[ 0.03815735 0.00366554 0.03827111 0.00369737 -0.03604811 0.0594364\n", |
297 |
| - " -0.02741369 -0.02735108 0.05956488 -0.11497243]\n" |
| 294 | + "[ 0.03803094 0.00360661 0.0382837 0.00369849 -0.03608325 0.05942172\n", |
| 295 | + " -0.02729715 -0.02732059 0.05965191 -0.11498381]\n" |
298 | 296 | ]
|
299 | 297 | }
|
300 | 298 | ],
|
|
316 | 314 | ],
|
317 | 315 | "metadata": {
|
318 | 316 | "kernelspec": {
|
319 |
| - "display_name": "Python 3", |
| 317 | + "display_name": "Quantum (Dev)", |
320 | 318 | "language": "python",
|
321 |
| - "name": "python3" |
| 319 | + "name": "quantum-dev" |
322 | 320 | },
|
323 | 321 | "language_info": {
|
324 | 322 | "codemirror_mode": {
|
|
330 | 328 | "name": "python",
|
331 | 329 | "nbconvert_exporter": "python",
|
332 | 330 | "pygments_lexer": "ipython3",
|
333 |
| - "version": "3.6.1" |
| 331 | + "version": "3.7.3" |
334 | 332 | }
|
335 | 333 | },
|
336 | 334 | "nbformat": 4,
|
|
0 commit comments