|
76 | 76 | " print(\"installing cirq...\")\n", |
77 | 77 | " !pip install --quiet cirq\n", |
78 | 78 | " print(\"installed cirq.\")\n", |
79 | | - " import cirq" |
| 79 | + " import cirq\n", |
| 80 | + "import cirq_pasqal\n", |
| 81 | + "from cirq_pasqal import ThreeDQubit, TwoDQubit, PasqalVirtualDevice, PasqalNoiseModel" |
80 | 82 | ] |
81 | 83 | }, |
82 | 84 | { |
|
90 | 92 | "In this notebook, we show how to program a quantum circuit for Pasqal using cirq. The first step is to import cirq, and Pasqal custom classes. We use ``PasqalVirtualDevice`` to showcase how Cirq enforces Pasqal's devices' restrictions throughout the process." |
91 | 93 | ] |
92 | 94 | }, |
93 | | - { |
94 | | - "cell_type": "code", |
95 | | - "execution_count": null, |
96 | | - "metadata": { |
97 | | - "id": "a43542246a0b" |
98 | | - }, |
99 | | - "outputs": [], |
100 | | - "source": [ |
101 | | - "from cirq_pasqal import ThreeDQubit, TwoDQubit, PasqalVirtualDevice, PasqalNoiseModel" |
102 | | - ] |
103 | | - }, |
104 | 95 | { |
105 | 96 | "cell_type": "markdown", |
106 | 97 | "metadata": { |
|
177 | 168 | }, |
178 | 169 | "outputs": [], |
179 | 170 | "source": [ |
180 | | - "from cirq_pasqal.pasqal_device import PasqalConverter\n", |
181 | | - "\n", |
182 | 171 | "# Initialize and create a circuit\n", |
183 | 172 | "initial_circuit = cirq.Circuit()\n", |
184 | 173 | "initial_circuit.append(cirq.CZ(p_qubits[0], p_qubits[1]))\n", |
|
202 | 191 | "id": "aa25f2e644ce" |
203 | 192 | }, |
204 | 193 | "source": [ |
205 | | - "Notice that the `CX` gate, also called a `CNOT` gate is not valid on this device. We can use a `PasqalConverter` object to convert it.\n", |
206 | | - "\n", |
207 | | - "This will convert the logical gates into native hardware gates. When inserting into circuits designed for Pasqal devices, be sure to insert each operation into its own `Moment` (for example, using `cirq.InsertStrategy.NEW`)." |
| 194 | + "Notice that the `CX` gate, also called a `CNOT` gate is not valid on this device. We can use a `PasqalGateset` object with the built-in cirq method `cirq.optimize_for_target_gateset` to convert it. This will convert the logical gates into native hardware gates. " |
208 | 195 | ] |
209 | 196 | }, |
210 | 197 | { |
|
215 | 202 | }, |
216 | 203 | "outputs": [], |
217 | 204 | "source": [ |
218 | | - "from cirq.circuits import insert_strategy\n", |
219 | | - "converter = PasqalConverter()\n", |
| 205 | + "pasqal_gateset=cirq_pasqal.PasqalGateset(include_additional_controlled_ops=False)\n", |
| 206 | + "pasqal_circuit = cirq.optimize_for_target_gateset(initial_circuit,\n", |
| 207 | + " gateset=pasqal_gateset)\n", |
| 208 | + "print(pasqal_circuit)\n", |
220 | 209 | "\n", |
221 | | - "pasqal_circuit=cirq.Circuit(*[converter.pasqal_convert(op, keep=p_device.is_pasqal_device_op)\n", |
222 | | - " for op in initial_circuit.all_operations()],\n", |
223 | | - " strategy=cirq.InsertStrategy.NEW)\n", |
| 210 | + "# Now the circuit validates correctly!\n", |
| 211 | + "p_device.validate_circuit(pasqal_circuit)\n" |
| 212 | + ] |
| 213 | + }, |
| 214 | + { |
| 215 | + "cell_type": "markdown", |
| 216 | + "metadata": { |
| 217 | + "id": "DkHu3gfNpe2J" |
| 218 | + }, |
| 219 | + "source": [ |
| 220 | + "When inserting into circuits designed for Pasqal devices, be sure to insert each operation into its own `Moment` (for example, using `cirq.InsertStrategy.NEW`). You may need to do this in a seperate step, as in the below example that converts two simultaneous Hadamard gates." |
| 221 | + ] |
| 222 | + }, |
| 223 | + { |
| 224 | + "cell_type": "code", |
| 225 | + "execution_count": null, |
| 226 | + "metadata": { |
| 227 | + "id": "YtXUHkTfpraF" |
| 228 | + }, |
| 229 | + "outputs": [], |
| 230 | + "source": [ |
| 231 | + "initial_circuit = cirq.Circuit()\n", |
| 232 | + "initial_circuit.append(cirq.H(p_qubits[0]))\n", |
| 233 | + "initial_circuit.append(cirq.H(p_qubits[1]))\n", |
| 234 | + "print('Initial Circuit, does not pass validation:')\n", |
| 235 | + "print(initial_circuit)\n", |
| 236 | + "try:\n", |
| 237 | + " p_device.validate_circuit(initial_circuit)\n", |
| 238 | + "except ValueError as e:\n", |
| 239 | + " # Uh oh! This circuit does not pass validation.\n", |
| 240 | + " print(e)\n", |
224 | 241 | "\n", |
| 242 | + "pasqal_circuit = cirq.Circuit(initial_circuit.all_operations(),\n", |
| 243 | + " strategy=cirq.InsertStrategy.NEW)\n", |
| 244 | + "print('')\n", |
| 245 | + "print('Converted Circuit, passes validation:')\n", |
225 | 246 | "print(pasqal_circuit)\n", |
226 | 247 | "\n", |
227 | 248 | "# Now the circuit validates correctly!\n", |
228 | | - "p_device.validate_circuit(pasqal_circuit)\n" |
| 249 | + "p_device.validate_circuit(pasqal_circuit)" |
229 | 250 | ] |
230 | 251 | }, |
231 | 252 | { |
|
320 | 341 | " yield grover_operator()\n", |
321 | 342 | " \n", |
322 | 343 | "def generate_pasqal_grover():\n", |
323 | | - " return cirq.Circuit(\n", |
324 | | - " *[converter.pasqal_convert(op, keep=p_device.is_pasqal_device_op)\n", |
325 | | - " for op in generate_grover()],\n", |
326 | | - " strategy=cirq.InsertStrategy.NEW)\n", |
| 344 | + " pasqal_gateset=cirq_pasqal.PasqalGateset(include_additional_controlled_ops=False)\n", |
| 345 | + " grover_cicruit = cirq.optimize_for_target_gateset(cirq.Circuit(generate_grover()),\n", |
| 346 | + " gateset=pasqal_gateset)\n", |
| 347 | + " return cirq.Circuit(grover_cicruit.all_operations(),\n", |
| 348 | + " strategy=cirq.InsertStrategy.NEW)\n", |
327 | 349 | " \n", |
328 | 350 | "device = PasqalVirtualDevice(control_radius=1.1, qubits=qs) \n", |
329 | 351 | "grover_circuit = generate_pasqal_grover()\n", |
|
481 | 503 | ], |
482 | 504 | "metadata": { |
483 | 505 | "colab": { |
| 506 | + "collapsed_sections": [], |
484 | 507 | "name": "getting_started.ipynb", |
485 | 508 | "toc_visible": true |
486 | 509 | }, |
|
0 commit comments